diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2017-01-31 10:59:59 -0700 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2017-02-19 11:09:58 +1000 |
commit | 06eee798f581ffa21dc4a69974315a7c2bc7abe1 (patch) | |
tree | 08a63a02edc5998b4c9eabf9e0ee082d4898baee /src/compiler/scala/tools/nsc/typechecker/Contexts.scala | |
parent | db8520e5c45d9ce24912849fad16a5c1b54a09b9 (diff) | |
download | scala-06eee798f581ffa21dc4a69974315a7c2bc7abe1.tar.gz scala-06eee798f581ffa21dc4a69974315a7c2bc7abe1.tar.bz2 scala-06eee798f581ffa21dc4a69974315a7c2bc7abe1.zip |
Refactor implementation of lookupCompanion
- Check for module class up front to use sourceModule
- Consolidate most of the logic in Contexts
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/Contexts.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Contexts.scala | 40 |
1 files changed, 23 insertions, 17 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Contexts.scala b/src/compiler/scala/tools/nsc/typechecker/Contexts.scala index d349597b14..7a71561978 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Contexts.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Contexts.scala @@ -1193,27 +1193,33 @@ trait Contexts { self: Analyzer => res } - final def lookupCompanionOf(original: Symbol): Symbol = { - if (original.isModuleClass) original.sourceModule - else lookupScopeEntry(original) match { - case null => NoSymbol - case entry => entry.owner.lookupCompanion(original) + final def lookupCompanionInIncompleteOwner(original: Symbol): Symbol = { + /* Search scopes in current and enclosing contexts for the definition of `symbol` */ + def lookupScopeEntry(symbol: Symbol): ScopeEntry = { + var res: ScopeEntry = null + var ctx = this + while (res == null && ctx.outer != ctx) { + val s = ctx.scope lookupSymbolEntry symbol + if (s != null) + res = s + else + ctx = ctx.outer + } + res } - } - /** Search scopes in current and enclosing contexts for the definition of `symbol` */ - private def lookupScopeEntry(symbol: Symbol): ScopeEntry = { - var res: ScopeEntry = null - var ctx = this - while (res == null && ctx.outer != ctx) { - val s = ctx.scope lookupSymbolEntry symbol - if (s != null) - res = s - else - ctx = ctx.outer + // 1) Must be owned by the same Scope, to ensure that in + // `{ class C; { ...; object C } }`, the class is not seen as a companion of the object. + // 2) Must be a class and module symbol, so that `{ class C; def C }` or `{ type T; object T }` are not companions. + lookupScopeEntry(original) match { + case null => NoSymbol + case entry => + def isCompanion(sym: Symbol): Boolean = + (original.isModule && sym.isClass || sym.isModule && original.isClass) && sym.isCoDefinedWith(original) + entry.owner.lookupNameInSameScopeAs(original, original.name.companionName).filter(isCompanion) } - res } + } //class Context /** A `Context` focussed on an `Import` tree */ |