diff options
author | Martin Odersky <odersky@gmail.com> | 2012-07-31 16:09:06 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2012-07-31 16:09:06 +0200 |
commit | 848756d47b980472996cd83409bda11f8fb5cac0 (patch) | |
tree | ba3835a0496c5e60b7a049b2a706026fc18e9aca | |
parent | f4693871f4aad1fdbdbb743feaed8a848a9e2dca (diff) | |
download | scala-848756d47b980472996cd83409bda11f8fb5cac0.tar.gz scala-848756d47b980472996cd83409bda11f8fb5cac0.tar.bz2 scala-848756d47b980472996cd83409bda11f8fb5cac0.zip |
Added more variants to achieve getLinkPos
getLinkPos is known to be flakey. This commit tries some variants and logs what failed.
-rw-r--r-- | src/compiler/scala/tools/nsc/interactive/Global.scala | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/src/compiler/scala/tools/nsc/interactive/Global.scala b/src/compiler/scala/tools/nsc/interactive/Global.scala index 27b6cae2a6..77bc77e966 100644 --- a/src/compiler/scala/tools/nsc/interactive/Global.scala +++ b/src/compiler/scala/tools/nsc/interactive/Global.scala @@ -749,12 +749,20 @@ class Global(settings: Settings, _reporter: Reporter, projectName: String = "") val originalTypeParams = sym.owner.typeParams parseAndEnter(unit) val pre = adaptToNewRunMap(ThisType(sym.owner)) - val newsym = pre.typeSymbol.info.decl(sym.name) filter { alt => + val rawsym = pre.typeSymbol.info.decl(sym.name) + val newsym = rawsym filter { alt => sym.isType || { try { val tp1 = pre.memberType(alt) onTypeError NoType val tp2 = adaptToNewRunMap(sym.tpe) substSym (originalTypeParams, sym.owner.typeParams) - matchesType(tp1, tp2, false) + matchesType(tp1, tp2, false) || { + debugLog(s"getLinkPos matchesType($tp1, $tp2) failed") + val tp3 = adaptToNewRunMap(sym.tpe) substSym (originalTypeParams, alt.owner.typeParams) + matchesType(tp1, tp3, false) || { + debugLog(s"getLinkPos fallback matchesType($tp1, $tp3) failed") + false + } + } } catch { case ex: ControlThrowable => throw ex @@ -766,8 +774,11 @@ class Global(settings: Settings, _reporter: Reporter, projectName: String = "") } } if (newsym == NoSymbol) { - debugLog("link not found " + sym + " " + source + " " + pre) - NoPosition + if (rawsym.exists && !rawsym.isOverloaded) rawsym.pos + else { + debugLog("link not found " + sym + " " + source + " " + pre) + NoPosition + } } else if (newsym.isOverloaded) { settings.uniqid.value = true debugLog("link ambiguous " + sym + " " + source + " " + pre + " " + newsym.alternatives) |