From ed0c41d2e4d89f18a64cc18752b404c30e315825 Mon Sep 17 00:00:00 2001 From: Antonio Cunei Date: Wed, 16 Nov 2011 17:50:30 +0000 Subject: Backport of 26012,26013. --- .../scala/tools/nsc/symtab/classfile/UnPickler.scala | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/UnPickler.scala b/src/compiler/scala/tools/nsc/symtab/classfile/UnPickler.scala index 05ffc6c7b7..815b4705bd 100644 --- a/src/compiler/scala/tools/nsc/symtab/classfile/UnPickler.scala +++ b/src/compiler/scala/tools/nsc/symtab/classfile/UnPickler.scala @@ -50,15 +50,25 @@ abstract class UnPickler extends reflect.generic.UnPickler { def newLazyTypeRef(i: Int): LazyType = new LazyTypeRef(i) def newLazyTypeRefAndAlias(i: Int, j: Int): LazyType = new LazyTypeRefAndAlias(i, j) + /** Convert to a type error, that is printed gracefully instead of crashing. + * + * Similar in intent to what SymbolLoader does (but here we don't have access to + * error reporting, so we rely on the typechecker to report the error). + */ + def toTypeError(e: MissingRequirementError) = + new TypeError(e.msg) + /** A lazy type which when completed returns type at index `i`. */ private class LazyTypeRef(i: Int) extends LazyType { private val definedAtRunId = currentRunId private val p = phase - override def complete(sym: Symbol) : Unit = { + override def complete(sym: Symbol) : Unit = try { val tp = at(i, readType) if (p != phase) atPhase(p) (sym setInfo tp) else sym setInfo tp if (currentRunId != definedAtRunId) sym.setInfo(adaptToNewRunMap(tp)) + } catch { + case e: MissingRequirementError => throw toTypeError(e) } override def load(sym: Symbol) { complete(sym) } } @@ -67,7 +77,7 @@ abstract class UnPickler extends reflect.generic.UnPickler { * of completed symbol to symbol at index `j`. */ private class LazyTypeRefAndAlias(i: Int, j: Int) extends LazyTypeRef(i) { - override def complete(sym: Symbol) { + override def complete(sym: Symbol) = try { super.complete(sym) var alias = at(j, readSymbol) if (alias hasFlag OVERLOADED) { @@ -76,6 +86,8 @@ abstract class UnPickler extends reflect.generic.UnPickler { } } sym.asInstanceOf[TermSymbol].setAlias(alias) + } catch { + case e: MissingRequirementError => throw toTypeError(e) } } } -- cgit v1.2.3