Skip to content

Named type error messages to new format #3419

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 8 commits into from
Nov 2, 2017
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
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,9 @@ public enum ErrorMessageID {
TailrecNotApplicableID,
FailureToEliminateExistentialID,
OnlyFunctionsCanBeFollowedByUnderscoreID,
MissingEmptyArgumentListID
MissingEmptyArgumentListID,
DuplicateNamedTypeParameterID,
UndefinedNamedTypeParameterID
;

public int errorNumber() {
Expand Down
14 changes: 14 additions & 0 deletions compiler/src/dotty/tools/dotc/reporting/diagnostic/messages.scala
Original file line number Diff line number Diff line change
Expand Up @@ -1865,4 +1865,18 @@ object messages {
|Excluded from this rule are methods that are defined in Java or that override methods defined in Java."""
}
}

case class DuplicateNamedTypeParameter(name: Name)(implicit ctx: Context)
extends Message(DuplicateNamedTypeParameterID) {
val kind = "Syntax"
val msg = hl"Type parameter $name was defined multiple times."
val explanation = ""
}

case class UndefinedNamedTypeParameter(undefinedName: Name, definedNames: List[Name])(implicit ctx: Context)
extends Message(UndefinedNamedTypeParameterID) {
val kind = "Syntax"
val msg = hl"Type parameter $undefinedName is undefined. Expected one of ${definedNames.map(_.show).mkString(", ")}."
val explanation = ""
}
}
4 changes: 2 additions & 2 deletions compiler/src/dotty/tools/dotc/typer/TypeAssigner.scala
Original file line number Diff line number Diff line change
Expand Up @@ -371,9 +371,9 @@ trait TypeAssigner {
val namedArgMap = new mutable.HashMap[Name, Type]
for (NamedArg(name, arg) <- args)
if (namedArgMap.contains(name))
ctx.error("duplicate name", arg.pos)
ctx.error(DuplicateNamedTypeParameter(name), arg.pos)
else if (!paramNames.contains(name))
ctx.error(s"undefined parameter name, required: ${paramNames.mkString(" or ")}", arg.pos)
ctx.error(UndefinedNamedTypeParameter(name, paramNames), arg.pos)
else
namedArgMap(name) = preCheckKind(arg, paramBoundsByName(name.asTypeName)).tpe

Expand Down
44 changes: 44 additions & 0 deletions compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTests.scala
Original file line number Diff line number Diff line change
Expand Up @@ -1088,4 +1088,48 @@ class ErrorMessagesTests extends ErrorMessagesTest {
val MissingEmptyArgumentList(method) :: Nil = messages
assertEquals("method greet", method.show)
}

@Test def duplicateNamedTypeParameter =
checkMessagesAfter("frontend") {
"""
|object Test {
| def f[A, B]() = ???
| f[A=Any, A=Any]()
| f[B=Any, B=Any]()
|}
|
""".stripMargin
}
.expect { (ictx, messages) =>
implicit val ctx: Context = ictx

assertMessageCount(2, messages)
val DuplicateNamedTypeParameter(n2) :: DuplicateNamedTypeParameter(n1) :: Nil = messages
assertEquals("A", n1.show)
assertEquals("B", n2.show)
}

@Test def undefinedNamedTypeParameter =
checkMessagesAfter("frontend") {
"""
|object Test {
| def f[A, B]() = ???
| f[A=Any, C=Any]()
| f[C=Any, B=Any]()
|}
|
""".stripMargin
}
.expect { (ictx, messages) =>
implicit val ctx: Context = ictx

assertMessageCount(2, messages)
val UndefinedNamedTypeParameter(n2, l2) :: UndefinedNamedTypeParameter(n1, l1) :: Nil = messages
val tpParams = List("A", "B")
assertEquals("C", n1.show)
assertEquals(tpParams, l1.map(_.show))
assertEquals("C", n2.show)
assertEquals(tpParams, l2.map(_.show))

}
}