diff options
author | Hubert Plociniczak <hubert.plociniczak@epfl.ch> | 2010-11-04 13:42:22 +0000 |
---|---|---|
committer | Hubert Plociniczak <hubert.plociniczak@epfl.ch> | 2010-11-04 13:42:22 +0000 |
commit | 29be721e25c761a4d58211d1bd698ee3e722fcb3 (patch) | |
tree | 897b1df77676edc50152e7e16ebc5b7aa70b7254 | |
parent | 379af580e2c8cf0ce5309fc0b31702f79e415abe (diff) | |
download | scala-29be721e25c761a4d58211d1bd698ee3e722fcb3.tar.gz scala-29be721e25c761a4d58211d1bd698ee3e722fcb3.tar.bz2 scala-29be721e25c761a4d58211d1bd698ee3e722fcb3.zip |
Some further changes related to r23434.
-rw-r--r-- | src/compiler/scala/tools/nsc/symtab/Symbols.scala | 6 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Namers.scala | 20 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Typers.scala | 9 |
3 files changed, 17 insertions, 18 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/Symbols.scala b/src/compiler/scala/tools/nsc/symtab/Symbols.scala index 9bf59d0bfc..f8320595e9 100644 --- a/src/compiler/scala/tools/nsc/symtab/Symbols.scala +++ b/src/compiler/scala/tools/nsc/symtab/Symbols.scala @@ -1245,7 +1245,7 @@ trait Symbols extends reflect.generic.Symbols { self: SymbolTable => /** For a module its linked class, for a class its linked module or case * factory otherwise. * Note: does not work for modules owned by methods, see - * Namers.companionModuleOf / Namers.companionClassOf + * Namers.companionSymbolOf */ final def companionSymbol: Symbol = if (isTerm) companionClass @@ -2048,7 +2048,9 @@ trait Symbols extends reflect.generic.Symbols { self: SymbolTable => } case class InvalidCompanions(sym1: Symbol, sym2: Symbol) - extends Throwable("Companions '" + sym1 + "' and '" + sym2 + "' must be defined in same file") + extends Throwable("Companions '" + sym1 + "' and '" + sym2 + "' must be defined in same file") { + override def toString = getMessage + } /** A class for type histories */ private sealed case class TypeHistory(var validFrom: Period, info: Type, prev: TypeHistory) { diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala index e2098ee7d5..f8e69cf902 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala @@ -88,11 +88,12 @@ trait Namers { self: Analyzer => sym.flags = flags | lockedFlag if (sym.isModule && sym.moduleClass != NoSymbol) updatePosFlags(sym.moduleClass, pos, moduleClassFlags(flags)) - if (sym.owner.isPackageClass && - (sym.companionSymbol.rawInfo.isInstanceOf[loaders.SymbolLoader] || - sym.companionSymbol.rawInfo.isComplete && runId(sym.validTo) != currentRunId)) + var companion: Symbol = NoSymbol + if (sym.owner.isPackageClass && {companion = companionSymbolOf(sym, context); true} && + (companion.rawInfo.isInstanceOf[loaders.SymbolLoader] || + companion.rawInfo.isComplete && runId(sym.validTo) != currentRunId)) // pre-set linked symbol to NoType, in case it is not loaded together with this symbol. - sym.companionSymbol.setInfo(NoType) + companion.setInfo(NoType) sym } @@ -1362,7 +1363,7 @@ trait Namers { self: Analyzer => * Finds the companion module of a class symbol. Calling .companionModule * does not work for classes defined inside methods. */ - def companionModuleOf(clazz: Symbol, context: Context) = { + def companionModuleOf(clazz: Symbol, context: Context) = try { var res = clazz.companionModule if (res == NoSymbol) @@ -1374,9 +1375,8 @@ trait Namers { self: Analyzer => context.error(clazz.pos, e.getMessage) NoSymbol } - } - def companionClassOf(module: Symbol, context: Context) = { + def companionClassOf(module: Symbol, context: Context) = try { var res = module.companionClass if (res == NoSymbol) @@ -1387,7 +1387,11 @@ trait Namers { self: Analyzer => context.error(module.pos, e.getMessage) NoSymbol } - } + + def companionSymbolOf(sym: Symbol, context: Context) = + if (sym.isTerm) companionClassOf(sym, context) + else if (sym.isClass) companionModuleOf(sym, context) + else NoSymbol /** An explanatory note to be added to error messages * when there's a problem with abstract var defs */ diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index 4b64feb99f..6911d226bf 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -1330,14 +1330,7 @@ trait Typers { self: Analyzer => // attributes(mdef) // initialize all constructors of the linked class: the type completer (Namer.methodSig) // might add default getters to this object. example: "object T; class T(x: Int = 1)" - val linkedClass = - try { - mdef.symbol.companionClass - } catch { - case e: InvalidCompanions => - context.error(mdef.symbol.pos, e.getMessage) - NoSymbol - } + val linkedClass = companionClassOf(mdef.symbol, context) if (linkedClass != NoSymbol) for (c <- linkedClass.info.decl(nme.CONSTRUCTOR).alternatives) c.initialize |