Skip to content

Ref #1589: Add error message for bad symbolic reference. #3605

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
Show file tree
Hide file tree
Changes from 1 commit
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
14 changes: 6 additions & 8 deletions compiler/src/dotty/tools/dotc/core/SymDenotations.scala
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ import util.Stats
import java.util.WeakHashMap
import config.Config
import config.Printers.{incremental, noPrinter}
import reporting.diagnostic.Message
import reporting.diagnostic.messages._
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Only import what you need

import reporting.trace

trait SymDenotations { this: Context =>
Expand Down Expand Up @@ -1943,7 +1945,7 @@ object SymDenotations {
/** A completer for missing references */
class StubInfo() extends LazyType {

def initializeToDefaults(denot: SymDenotation, errMsg: => String)(implicit ctx: Context) = {
def initializeToDefaults(denot: SymDenotation, errMsg: => Message)(implicit ctx: Context): Unit = {
denot.info = denot match {
case denot: ClassDenotation =>
ClassInfo(denot.owner.thisType, denot.classSymbol, Nil, EmptyScope)
Expand All @@ -1960,13 +1962,9 @@ object SymDenotations {
if (file != null) (s" in $file", file.toString)
else ("", "the signature")
val name = ctx.fresh.setSetting(ctx.settings.YdebugNames, true).nameString(denot.name)
def errMsg =
i"""bad symbolic reference. A signature$location
|refers to $name in ${denot.owner.showKind} ${denot.owner.showFullName} which is not available.
|It may be completely missing from the current classpath, or the version on
|the classpath might be incompatible with the version used when compiling $src."""
ctx.error(errMsg)
if (ctx.debug) throw new Error()
val errMsg = BadSymbolicReference(location, name, denot.owner, src)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should be a def

ctx.error(errMsg, sym.pos)
if (ctx.debug) throw new scala.Error()
initializeToDefaults(denot, errMsg)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ public enum ErrorMessageID {
UnapplyInvalidNumberOfArgumentsID,
StaticFieldsOnlyAllowedInObjectsID,
CyclicInheritanceID,
BadSymbolicReferenceID,
UnableToExtendSealedClassID,
SymbolHasUnparsableVersionNumberID,
SymbolChangedSemanticsInVersionID,
Expand Down
18 changes: 18 additions & 0 deletions compiler/src/dotty/tools/dotc/reporting/diagnostic/messages.scala
Original file line number Diff line number Diff line change
Expand Up @@ -1968,6 +1968,24 @@ object messages {
}
}

case class BadSymbolicReference(
location: String,
name: String,
denotationOwner: Symbol,
src: String
)(implicit ctx: Context) extends Message(BadSymbolicReferenceID) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would change BadSymbolicReference so that it only has denot: SymDenotation. You can derive location, name, owner and src from denot.

val kind = "Reference"
val msg =
hl"""Bad symbolic reference. A signature$location
|refers to $name in ${denotationOwner.showKind} ${denotationOwner.showFullName} which is not available.
|It may be completely missing from the current classpath, or the version on
|the classpath might be incompatible with the version used when compiling $src."""
val explanation =
hl"""A missing or invalid dependency was detected while loading class file '$name'.
|Check your build definition for missing or conflicting dependencies.
|Re-run with ${"-Ylog-classpath"} to obtain the information about what classpath is being applied."""
}

case class UnableToExtendSealedClass(pclazz: Symbol)(implicit ctx: Context) extends Message(UnableToExtendSealedClassID) {
val kind = "Syntax"
val msg = hl"Cannot extend ${"sealed"} $pclazz in a different source file"
Expand Down