Skip to content

Fix: Add tests for extensions's signatures #17133

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Apr 3, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 19 additions & 9 deletions scaladoc-testcases/src/tests/extensionParams.scala
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,19 @@ extension [A](a: A)(using Int)
def f1[B](b: B): (A, B)
= ???

extension [A](a: A)(using Int)
extension [A](a: A)(using String)
def f2(b: A): (A, A)
= ???

extension [A](a: A)(using Int)
extension [A](a: A)(using Number)
def f3(using String)(b: A): (A, A)
= ???

extension (a: Char)(using Int)
def f4(using String)(b: Int): Unit
= ???

extension (a: Char)(using Int)
extension (a: String)(using Int)
def f5[B](using String)(b: B): Unit
= ???

Expand All @@ -34,15 +34,15 @@ extension [A <: List[Char]](using String)(using Unit)(a: A)(using Int)(using Num
def f7[B, C](b: B)(c: C): (A, B)
= ???

extension [A <: List[Char]](using String)(using Unit)(a: A)(using Int)(using Number)
extension [A <: List[Char]](using String)(using Number)(a: A)(using Int)(using Unit)
def f8(b: Any)(c: Any): Any
= ???

extension [A <: List[Char]](using String)(using Unit)(a: A)(using Int)(using Number)
extension [A <: List[Char]](using Unit)(using String)(a: A)(using Int)(using Number)
def f9[B, C](using Int)(b: B)(c: C): (A, B)
= ???

extension [A <: List[Char]](using String)(using Unit)(a: A)(using Int)(using Number)
extension [A <: List[Char]](using Number)(using Unit)(a: A)(using Int)(using String)
def f10(using Int)(b: Any)(c: Any): Any
= ???

Expand All @@ -53,11 +53,21 @@ extension (using String)(using Unit)(a: Animal)(using Int)(using Number)
def f11(b: Any)(c: Any): Any
= ???

extension (a: Int)
def f13(): Any
= ???

extension (using Unit)(a: Int)
def f14(): Any
= ???

import scala.language.experimental.clauseInterleaving

extension (using String)(using Unit)(a: Animal)(using Int)(using Number)
def f13(b: Any)[T](c: T): T
extension (using String)(using Int)(a: Animal)(using Unit)(using Number)
def f16(b: Any)[T](c: T): T
= ???
def f14[D](b: D)[T](c: T): T
def f17[D](b: D)[T](c: T): T
= ???



18 changes: 11 additions & 7 deletions scaladoc/test/dotty/tools/scaladoc/signatures/SignatureTest.scala
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ abstract class SignatureTest(

val unexpected = unexpectedFromSources.flatMap(actualSignatures.get).flatten
val expectedButNotFound = expectedFromSources.flatMap {
case (k, v) => findMissingSingatures(v, actualSignatures.getOrElse(k, Nil))
case (k, v) => findMissingSignatures(v, actualSignatures.getOrElse(k, Nil))
}

val missingReport = Option.when(!ignoreMissingSignatures && !expectedButNotFound.isEmpty)
Expand Down Expand Up @@ -75,7 +75,7 @@ abstract class SignatureTest(
private val unexpectedRegex = raw"(.+)//unexpected".r
private val identifierRegex = raw"^\s*(`.*`|(?:\w+)(?:_[^\[\(\s]+)|\w+|[^\[\(\s]+)".r

private def findMissingSingatures(expected: Seq[String], actual: Seq[String]): Set[String] =
private def findMissingSignatures(expected: Seq[String], actual: Seq[String]): Set[String] =
expected.toSet &~ actual.toSet

extension (s: String)
Expand All @@ -84,10 +84,12 @@ abstract class SignatureTest(

private def findName(signature: String, kinds: Seq[String]): Option[String] =
for
kindMatch <- kinds.flatMap(k => s"\\b$k\\b".r.findFirstMatchIn(signature)).headOption
kindMatch <- kinds.flatMap(k =>s"\\b$k\\b".r.findFirstMatchIn(signature)).headOption
kind <- Option(kindMatch.group(0)) // to filter out nulls
afterKind <- Option(kindMatch.after(0)) // to filter out nulls
nameMatch <- identifierRegex.findFirstMatchIn(afterKind)
yield nameMatch.group(1)
name <- if kind.contains("extension") then Some(signature) // The name of an extension will always be the signature itself
else identifierRegex.findFirstMatchIn(afterKind).map(_.group(1))
yield name

private def signaturesFromSources(source: Source, kinds: Seq[String]): Seq[SignatureRes] =
source.getLines.map(_.trim)
Expand All @@ -110,6 +112,9 @@ abstract class SignatureTest(

def processFile(path: Path): Unit = if filterFunc(path) then
val document = Jsoup.parse(IO.read(path))
val documentable = document.select(".groupHeader").forEach { element =>
signatures += element.text
}
val content = document.select(".documentableElement").forEach { elem =>
val annotations = elem.select(".annotations").eachText.asScala.mkString("")
val other = elem.select(".header .other-modifiers").eachText.asScala.mkString("")
Expand All @@ -123,12 +128,11 @@ abstract class SignatureTest(
signatures += all
}


IO.foreachFileIn(output, processFile)
signatures.result

object SignatureTest {
val classlikeKinds = Seq("class", "object", "trait", "enum") // TODO add docs for packages
val members = Seq("type", "def", "val", "var", "given")
val members = Seq("type", "def", "val", "var", "given", "extension")
val all = classlikeKinds ++ members
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ class PackageObjectSymbolSignatures extends SignatureTest("packageObjectSymbolSi
class MergedPackageSignatures extends SignatureTest("mergedPackage", SignatureTest.all.filterNot(_ == "object"),
sourceFiles = List("mergedPackage1", "mergedPackage2", "mergedPackage3"))

class ExtensionMethodSignature extends SignatureTest("extensionMethodSignatures", SignatureTest.all)
class ExtensionMethodSignature extends SignatureTest("extensionMethodSignatures", SignatureTest.all.filterNot(_ == "extension"))

class ExtensionMethodParamsSignature extends SignatureTest("extensionParams", SignatureTest.all)

Expand Down