summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHubert Plociniczak <hubert.plociniczak@epfl.ch>2010-11-04 13:42:22 +0000
committerHubert Plociniczak <hubert.plociniczak@epfl.ch>2010-11-04 13:42:22 +0000
commit29be721e25c761a4d58211d1bd698ee3e722fcb3 (patch)
tree897b1df77676edc50152e7e16ebc5b7aa70b7254
parent379af580e2c8cf0ce5309fc0b31702f79e415abe (diff)
downloadscala-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.scala6
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Namers.scala20
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala9
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