@@ -2364,7 +2364,7 @@ class SymbolIsNotAValue(symbol: Symbol)(using Context) extends TypeMsg(SymbolIsN
23642364}
23652365
23662366class DoubleDefinition (decl : Symbol , previousDecl : Symbol , base : Symbol )(using Context )
2367- extends NamingMsg (DoubleDefinitionID ) {
2367+ extends NamingMsg (DoubleDefinitionID ):
23682368 import Signature .MatchDegree .*
23692369
23702370 private def erasedType : Type =
@@ -2426,6 +2426,25 @@ extends NamingMsg(DoubleDefinitionID) {
24262426 } + details
24272427 }
24282428 def explain (using Context ) =
2429+ def givenAddendum =
2430+ def isGivenName (sym : Symbol ) = sym.name.startsWith(" given_" ) // Desugar.inventGivenName
2431+ def print (tpe : Type ): String =
2432+ def addParams (tpe : Type ): List [String ] = tpe match
2433+ case tpe : MethodType =>
2434+ val s = if tpe.isContextualMethod then i " ( ${tpe.paramInfos}%, %) => " else " "
2435+ s :: addParams(tpe.resType)
2436+ case tpe : PolyType =>
2437+ i " [ ${tpe.paramNames}%, %] => " :: addParams(tpe.resType)
2438+ case tpe =>
2439+ i " $tpe" :: Nil
2440+ addParams(tpe).mkString(" " )
2441+ if decl.is(Given ) && previousDecl.is(Given ) && isGivenName(decl) && isGivenName(previousDecl) then
2442+ i """ | Provide an explicit, unique name to given definitions,
2443+ | since the names assigned to anonymous givens may clash. For example:
2444+ |
2445+ | given myGiven: ${print(atPhase(typerPhase)(decl.info))}
2446+ | """
2447+ else " "
24292448 decl.signature.matchDegree(previousDecl.signature) match
24302449 case FullMatch =>
24312450 i """
@@ -2439,30 +2458,29 @@ extends NamingMsg(DoubleDefinitionID) {
24392458 |
24402459 |In your code the two declarations
24412460 |
2442- | ${previousDecl.showDcl}
2443- | ${decl.showDcl}
2461+ | ${atPhase(typerPhase)( previousDecl.showDcl) }
2462+ | ${atPhase(typerPhase)( decl.showDcl) }
24442463 |
24452464 |erase to the identical signature
24462465 |
24472466 | ${erasedType}
24482467 |
24492468 |so the compiler cannot keep both: the generated bytecode symbols would collide.
24502469 |
2451- |To fix this error, you need to disambiguate the two definitions. You can either :
2470+ |To fix this error, you must disambiguate the two definitions by doing one of the following :
24522471 |
2453- |1. Rename one of the definitions, or
2472+ |1. Rename one of the definitions. $givenAddendum
24542473 |2. Keep the same names in source but give one definition a distinct
2455- | bytecode-level name via `@targetName` for example:
2474+ | bytecode-level name via `@targetName`; for example:
24562475 |
24572476 | @targetName(" ${decl.name.show}_2")
2458- | ${decl.showDcl}
2477+ | ${atPhase(typerPhase)( decl.showDcl) }
24592478 |
24602479 |Choose the `@targetName` argument carefully: it is the name that will be used
24612480 |when calling the method externally, so it should be unique and descriptive.
2462- """
2481+ | """
24632482 case _ => " "
2464-
2465- }
2483+ end DoubleDefinition
24662484
24672485class ImportedTwice (sel : Name )(using Context ) extends SyntaxMsg (ImportedTwiceID ) {
24682486 def msg (using Context ) = s " ${sel.show} is imported twice on the same import line. "
0 commit comments