diff options
Diffstat (limited to 'src/compiler')
6 files changed, 25 insertions, 12 deletions
diff --git a/src/compiler/scala/tools/nsc/Global.scala b/src/compiler/scala/tools/nsc/Global.scala index 978bbf1da0..12c99ba127 100644 --- a/src/compiler/scala/tools/nsc/Global.scala +++ b/src/compiler/scala/tools/nsc/Global.scala @@ -87,6 +87,7 @@ class Global(val settings: Settings, val reporter: Reporter) extends SymbolTable def error(msg: String) = reporter.error(null, msg); def warning(msg: String) = reporter.warning(null, msg); def inform(msg: String) = System.err.println(msg); + def inform[T](msg: String, value: T): T = { inform(msg+value); value } //reporter.info(null, msg, true); def informProgress(msg: String) = diff --git a/src/compiler/scala/tools/nsc/symtab/Symbols.scala b/src/compiler/scala/tools/nsc/symtab/Symbols.scala index a327a0e053..111ef5f6e5 100644 --- a/src/compiler/scala/tools/nsc/symtab/Symbols.scala +++ b/src/compiler/scala/tools/nsc/symtab/Symbols.scala @@ -751,9 +751,11 @@ trait Symbols requires SymbolTable { * Never translates expansions of operators back to operator symbol. * Never adds id. */ - final def fullNameString(separator: char): String = + final def fullNameString(separator: char): String = { + assert(owner != NoSymbol, this) if (owner.isRoot || owner.isEmptyPackageClass) simpleName.toString() else owner.fullNameString(separator) + separator + simpleName; + } final def fullNameString: String = fullNameString('.'); diff --git a/src/compiler/scala/tools/nsc/symtab/Types.scala b/src/compiler/scala/tools/nsc/symtab/Types.scala index 2ddb95018c..6ab9822d15 100644 --- a/src/compiler/scala/tools/nsc/symtab/Types.scala +++ b/src/compiler/scala/tools/nsc/symtab/Types.scala @@ -513,6 +513,10 @@ trait Types requires SymbolTable { else if (sym.isAnonymousClass || sym.isRefinementClass) "this." else if (sym.isPackageClass) sym.fullNameString + "." else sym.nameString + ".this."; + override def toString(): String = + if (sym.isRoot) "<root>" + else if (sym.isEmptyPackageClass) "<empty>" + else super.toString() override def narrow: Type = this; } diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala index 4b7fe373c2..d306d9a8ea 100644 --- a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala +++ b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala @@ -56,7 +56,7 @@ abstract class ClassfileParser { def parse(file: AbstractFile, root: Symbol): unit = { def handleError(e: Exception) = { if (settings.debug.value) e.printStackTrace();//debug - throw new IOException("class file '" + in.file + "' is broken") + throw new IOException("class file '" + in.file + "' is broken\n(" + e.getMessage() + ")") } assert(!busy); busy = true; diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/UnPickler.scala b/src/compiler/scala/tools/nsc/symtab/classfile/UnPickler.scala index 6746e165ec..7db3154d77 100644 --- a/src/compiler/scala/tools/nsc/symtab/classfile/UnPickler.scala +++ b/src/compiler/scala/tools/nsc/symtab/classfile/UnPickler.scala @@ -12,6 +12,7 @@ import java.lang.{Float, Double}; import Flags._; import PickleFormat._; import collection.mutable.HashMap; +import java.io.IOException; abstract class UnPickler { val global: Global; @@ -20,9 +21,10 @@ abstract class UnPickler { def unpickle(bytes: Array[byte], offset: int, classRoot: Symbol, moduleRoot: Symbol): unit = try { new UnPickle(bytes, offset, classRoot, moduleRoot); } catch { + case ex: IOException => + throw ex case ex: Throwable => - ex.printStackTrace();//debug - + if (settings.debug.value) ex.printStackTrace(); throw new RuntimeException("error reading Scala signature of " + classRoot.nameString + ": " + ex.getMessage()); } @@ -43,10 +45,10 @@ abstract class UnPickler { val major = readNat(); val minor = readNat(); if (major != MajorVersion || minor > MinorVersion) - throw new TypeError("Scala signature " + classRoot.name + - " has wrong version\n expected: " + - MajorVersion + "." + MinorVersion + - "\n found: " + major + "." + minor) + throw new IOException("Scala signature " + classRoot.name + + " has wrong version\n expected: " + + MajorVersion + "." + MinorVersion + + "\n found: " + major + "." + minor) } /** The scope associated with given symbol */ diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index 4482480496..7d1b5a9c78 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -273,7 +273,8 @@ trait Typers requires Analyzer { if (tree.symbol.hasFlag(OVERLOADED) && (mode & FUNmode) == 0) inferExprAlternative(tree, pt) val sym = tree.symbol - if ((mode & (PATTERNmode | FUNmode)) == PATTERNmode && tree.isTerm) { // (1) + if (tree.tpe.isError) tree + else if ((mode & (PATTERNmode | FUNmode)) == PATTERNmode && tree.isTerm) { // (1) checkStable(tree) } else if ((mode & (EXPRmode | QUALmode)) == EXPRmode && !sym.isValue) { // (2) errorTree(tree, ""+sym+" is not a value") @@ -407,6 +408,8 @@ trait Typers requires Analyzer { case NoType => errorTree(tree, "expected pattern type "+pt + " does not conform to sequence "+clazz) + case ErrorType => + setError(tree) } } else { if (!tree.tpe.isError) @@ -552,7 +555,7 @@ trait Typers requires Analyzer { */ def validateParentClasses(parents: List[Tree], selfType: Type): unit = { - def validateParentClass(parent: Tree, superclazz: Symbol): unit = + def validateParentClass(parent: Tree, superclazz: Symbol): unit = { if (!parent.tpe.isError) { val psym = parent.tpe.symbol.initialize if (!psym.isClass) @@ -585,8 +588,10 @@ trait Typers requires Analyzer { if (parents exists (p => p != parent && p.tpe.symbol == psym && !psym.isError)) error(parent.pos, ""+psym+" is inherited twice") } + } - for (val p <- parents) validateParentClass(p, parents.head.tpe.symbol) + if (!parents.head.tpe.isError) + for (val p <- parents) validateParentClass(p, parents.head.tpe.symbol) } def typedClassDef(cdef: ClassDef): Tree = { @@ -1172,7 +1177,6 @@ trait Typers requires Analyzer { val tree1 = if (qual == EmptyTree) tree else atPos(tree.pos)(Select(qual, name)); // atPos necessary because qualifier might come from startContext - //System.out.println("check acc: "+defSym+" "+pre);//DEBUG stabilize(checkAccessible(tree1, defSym, pre, qual), pre, mode, pt) } |