From 5ed834e251f2a83cadf19ae832268ead3e34de37 Mon Sep 17 00:00:00 2001 From: Luc Bourlier Date: Mon, 2 Dec 2013 15:25:08 +0100 Subject: SI-7995 completion imported vars and vals Imported member vals and vars were always marked inaccessible, even if referencing them at the location of the completion is valid in code. The accessible flag is now set accordingly to the accessibility of the getter. --- test/files/presentation/scope-completion-2.check | 16 ++-- .../scope-completion-2/src/Completions.scala | 16 ++-- test/files/presentation/scope-completion-3.check | 16 ++-- .../presentation/scope-completion-import.check | 104 +++++++++++++++------ .../scope-completion-import/src/Completions.scala | 8 ++ 5 files changed, 107 insertions(+), 53 deletions(-) (limited to 'test') diff --git a/test/files/presentation/scope-completion-2.check b/test/files/presentation/scope-completion-2.check index bd2aa621ff..462671da40 100644 --- a/test/files/presentation/scope-completion-2.check +++ b/test/files/presentation/scope-completion-2.check @@ -1,35 +1,33 @@ reload: Completions.scala -askScopeCompletion at Completions.scala(16,4) +askScopeCompletion at Completions.scala(15,2) ================================================================================ -[response] askScopeCompletion at (16,4) -retrieved 11 members +[response] askScopeCompletion at (15,2) +retrieved 10 members [accessible: true] `class Cc1Completion1.this.Cc1` [accessible: true] `class Co1test.Completion1.Co1` [accessible: true] `class Completion1test.Completion1` [accessible: true] `constructor Completion1()test.Completion1` [accessible: true] `method fc1=> Int` [accessible: true] `method fo1=> Int` -[accessible: true] `method test=> Unit` [accessible: true] `object Completion1test.Completion1.type` [accessible: true] `value ctest.Completion1` [accessible: true] `value vc1Int` [accessible: true] `value vo1Int` ================================================================================ -askScopeCompletion at Completions.scala(32,4) +askScopeCompletion at Completions.scala(29,2) ================================================================================ -[response] askScopeCompletion at (32,4) -retrieved 11 members +[response] askScopeCompletion at (29,2) +retrieved 10 members [accessible: true] `class Cc1test.Completion1.c.Cc1` [accessible: true] `class Co1test.Completion1.Co1` [accessible: true] `class Completion1test.Completion1` [accessible: true] `constructor Completion1()test.Completion1.type` [accessible: true] `method fc1=> Int` [accessible: true] `method fo1=> Int` -[accessible: true] `method test=> Unit` [accessible: true] `object Completion1test.Completion1.type` [accessible: true] `value ctest.Completion1` +[accessible: true] `value vc1Int` [accessible: true] `value vo1Int` -[accessible: false] `value vc1Int` ================================================================================ diff --git a/test/files/presentation/scope-completion-2/src/Completions.scala b/test/files/presentation/scope-completion-2/src/Completions.scala index 96d38f1b85..f8d7cd6ba8 100644 --- a/test/files/presentation/scope-completion-2/src/Completions.scala +++ b/test/files/presentation/scope-completion-2/src/Completions.scala @@ -9,12 +9,10 @@ class Completion1 { private val vc1 = 0 private def fc1 = 0 - private class Cc1 - - def test { - // needs to be done in a method, because of SI-7280 - /*_*/ + private class Cc1 { } + + /*_*/ } object Completion1 { @@ -25,11 +23,9 @@ object Completion1 { private val vo1 = 0 private def fo1 = 0 - private class Co1 - - def test { - // needs to be done in a method, because of SI-7280 - /*_*/ + private class Co1 { } + + /*_*/ } diff --git a/test/files/presentation/scope-completion-3.check b/test/files/presentation/scope-completion-3.check index c48e310355..119fc1de5f 100644 --- a/test/files/presentation/scope-completion-3.check +++ b/test/files/presentation/scope-completion-3.check @@ -29,13 +29,17 @@ retrieved 49 members [accessible: true] `type tc2Completion1.this.tc2` [accessible: true] `type tt1Completion1.this.tt1` [accessible: true] `type tt3Completion1.this.tt3` +[accessible: true] `value vb1Int` [accessible: true] `value vb3Int` [accessible: true] `value vc1Int` [accessible: true] `value vc2Int` +[accessible: true] `value vt1Int` [accessible: true] `value vt3Int` +[accessible: true] `variable rb1Int` [accessible: true] `variable rb3Int` [accessible: true] `variable rc1Int` [accessible: true] `variable rc2Int` +[accessible: true] `variable rt1Int` [accessible: true] `variable rt3Int` [accessible: false] `class Cb2Completion1.this.Cb2` [accessible: false] `class Ct2Completion1.this.Ct2` @@ -45,13 +49,9 @@ retrieved 49 members [accessible: false] `object Ot2Completion1.this.Ot2.type` [accessible: false] `type tb2Completion1.this.tb2` [accessible: false] `type tt2Completion1.this.tt2` -[accessible: false] `value vb1Int` [accessible: false] `value vb2Int` -[accessible: false] `value vt1Int` [accessible: false] `value vt2Int` -[accessible: false] `variable rb1Int` [accessible: false] `variable rb2Int` -[accessible: false] `variable rt1Int` [accessible: false] `variable rt2Int` ================================================================================ @@ -84,13 +84,17 @@ retrieved 49 members [accessible: true] `type to2test.Completion2.to2` [accessible: true] `type tt1test.Completion2.tt1` [accessible: true] `type tt3test.Completion2.tt3` +[accessible: true] `value vb1Int` [accessible: true] `value vb3Int` [accessible: true] `value vo1Int` [accessible: true] `value vo2Int` +[accessible: true] `value vt1Int` [accessible: true] `value vt3Int` +[accessible: true] `variable rb1Int` [accessible: true] `variable rb3Int` [accessible: true] `variable ro1Int` [accessible: true] `variable ro2Int` +[accessible: true] `variable rt1Int` [accessible: true] `variable rt3Int` [accessible: false] `class Cb2test.Completion2.Cb2` [accessible: false] `class Ct2test.Completion2.Ct2` @@ -100,12 +104,8 @@ retrieved 49 members [accessible: false] `object Ot2test.Completion2.Ot2.type` [accessible: false] `type tb2test.Completion2.tb2` [accessible: false] `type tt2test.Completion2.tt2` -[accessible: false] `value vb1Int` [accessible: false] `value vb2Int` -[accessible: false] `value vt1Int` [accessible: false] `value vt2Int` -[accessible: false] `variable rb1Int` [accessible: false] `variable rb2Int` -[accessible: false] `variable rt1Int` [accessible: false] `variable rt2Int` ================================================================================ diff --git a/test/files/presentation/scope-completion-import.check b/test/files/presentation/scope-completion-import.check index 1d84abd617..33b498c1ee 100644 --- a/test/files/presentation/scope-completion-import.check +++ b/test/files/presentation/scope-completion-import.check @@ -1,9 +1,9 @@ reload: Completions.scala -askScopeCompletion at Completions.scala(15,4) +askScopeCompletion at Completions.scala(23,4) ================================================================================ -[response] askScopeCompletion at (15,4) -retrieved 10 members +[response] askScopeCompletion at (23,4) +retrieved 18 members [accessible: true] `class Ctest.C` [accessible: true] `class Foo_1test.Foo_1` [accessible: true] `class Foo_2test.Foo_2` @@ -14,12 +14,20 @@ retrieved 10 members [accessible: true] `method fOOO=> Int` [accessible: true] `object Otest.O.type` [accessible: true] `value otest.O.type` +[accessible: true] `value vCCCInt` +[accessible: true] `value vOOOInt` +[accessible: true] `variable rCCCInt` +[accessible: true] `variable rOOOInt` +[accessible: false] `value pVCCCInt` +[accessible: false] `value pVOOOInt` +[accessible: false] `variable pRCCCInt` +[accessible: false] `variable pROOOInt` ================================================================================ -askScopeCompletion at Completions.scala(19,4) +askScopeCompletion at Completions.scala(27,4) ================================================================================ -[response] askScopeCompletion at (19,4) -retrieved 9 members +[response] askScopeCompletion at (27,4) +retrieved 17 members [accessible: true] `class Ctest.C` [accessible: true] `class Foo_1test.Foo_1` [accessible: true] `class Foo_2test.Foo_2` @@ -29,12 +37,20 @@ retrieved 9 members [accessible: true] `method fCCC=> Int` [accessible: true] `method fOOO=> Int` [accessible: true] `object Otest.O.type` +[accessible: true] `value vCCCInt` +[accessible: true] `value vOOOInt` +[accessible: true] `variable rCCCInt` +[accessible: true] `variable rOOOInt` +[accessible: false] `value pVCCCInt` +[accessible: false] `value pVOOOInt` +[accessible: false] `variable pRCCCInt` +[accessible: false] `variable pROOOInt` ================================================================================ -askScopeCompletion at Completions.scala(24,4) +askScopeCompletion at Completions.scala(32,4) ================================================================================ -[response] askScopeCompletion at (24,4) -retrieved 9 members +[response] askScopeCompletion at (32,4) +retrieved 13 members [accessible: true] `class Ctest.C` [accessible: true] `class Foo_1test.Foo_1` [accessible: true] `class Foo_2test.Foo_2` @@ -44,11 +60,15 @@ retrieved 9 members [accessible: true] `method fCCC=> Int` [accessible: true] `object Otest.O.type` [accessible: true] `value ctest.C` +[accessible: true] `value vCCCInt` +[accessible: true] `variable rCCCInt` +[accessible: false] `value pVCCCInt` +[accessible: false] `variable pRCCCInt` ================================================================================ -askScopeCompletion at Completions.scala(27,5) +askScopeCompletion at Completions.scala(35,5) ================================================================================ -[response] askScopeCompletion at (27,5) +[response] askScopeCompletion at (35,5) retrieved 8 members [accessible: true] `class Ctest.C` [accessible: true] `class Foo_1test.Foo_1` @@ -60,10 +80,10 @@ retrieved 8 members [accessible: true] `value ctest.C` ================================================================================ -askScopeCompletion at Completions.scala(30,5) +askScopeCompletion at Completions.scala(38,5) ================================================================================ -[response] askScopeCompletion at (30,5) -retrieved 9 members +[response] askScopeCompletion at (38,5) +retrieved 13 members [accessible: true] `class Ctest.C` [accessible: true] `class Foo_1test.Foo_1` [accessible: true] `class Foo_2test.Foo_2` @@ -73,12 +93,16 @@ retrieved 9 members [accessible: true] `method fCCC=> Int` [accessible: true] `object Otest.O.type` [accessible: true] `value ctest.C` +[accessible: true] `value vCCCInt` +[accessible: true] `variable rCCCInt` +[accessible: false] `value pVCCCInt` +[accessible: false] `variable pRCCCInt` ================================================================================ -askScopeCompletion at Completions.scala(32,5) +askScopeCompletion at Completions.scala(40,5) ================================================================================ -[response] askScopeCompletion at (32,5) -retrieved 10 members +[response] askScopeCompletion at (40,5) +retrieved 18 members [accessible: true] `class Ctest.C` [accessible: true] `class Foo_1test.Foo_1` [accessible: true] `class Foo_2test.Foo_2` @@ -89,12 +113,20 @@ retrieved 10 members [accessible: true] `method fOOO=> Int` [accessible: true] `object Otest.O.type` [accessible: true] `value ctest.C` +[accessible: true] `value vCCCInt` +[accessible: true] `value vOOOInt` +[accessible: true] `variable rCCCInt` +[accessible: true] `variable rOOOInt` +[accessible: false] `value pVCCCInt` +[accessible: false] `value pVOOOInt` +[accessible: false] `variable pRCCCInt` +[accessible: false] `variable pROOOInt` ================================================================================ -askScopeCompletion at Completions.scala(41,4) +askScopeCompletion at Completions.scala(49,4) ================================================================================ -[response] askScopeCompletion at (41,4) -retrieved 10 members +[response] askScopeCompletion at (49,4) +retrieved 18 members [accessible: true] `class Ctest.C` [accessible: true] `class Foo_1test.Foo_1` [accessible: true] `class Foo_2test.Foo_2` @@ -105,12 +137,20 @@ retrieved 10 members [accessible: true] `method fCCC=> Int` [accessible: true] `method fOOO=> Int` [accessible: true] `object Otest.O.type` +[accessible: true] `value vCCCInt` +[accessible: true] `value vOOOInt` +[accessible: true] `variable rCCCInt` +[accessible: true] `variable rOOOInt` +[accessible: false] `value pVCCCInt` +[accessible: false] `value pVOOOInt` +[accessible: false] `variable pRCCCInt` +[accessible: false] `variable pROOOInt` ================================================================================ -askScopeCompletion at Completions.scala(51,4) +askScopeCompletion at Completions.scala(59,4) ================================================================================ -[response] askScopeCompletion at (51,4) -retrieved 11 members +[response] askScopeCompletion at (59,4) +retrieved 19 members [accessible: true] `class Ctest.C` [accessible: true] `class Foo_1test.Foo_1` [accessible: true] `class Foo_2test.Foo_2` @@ -122,12 +162,20 @@ retrieved 11 members [accessible: true] `method fOOO=> Int` [accessible: true] `object Otest.O.type` [accessible: true] `value otest.O.type` +[accessible: true] `value vCCCInt` +[accessible: true] `value vOOOInt` +[accessible: true] `variable rCCCInt` +[accessible: true] `variable rOOOInt` +[accessible: false] `value pVCCCInt` +[accessible: false] `value pVOOOInt` +[accessible: false] `variable pRCCCInt` +[accessible: false] `variable pROOOInt` ================================================================================ -askScopeCompletion at Completions.scala(61,4) +askScopeCompletion at Completions.scala(69,4) ================================================================================ -[response] askScopeCompletion at (61,4) -retrieved 10 members +[response] askScopeCompletion at (69,4) +retrieved 14 members [accessible: true] `class Ctest.C` [accessible: true] `class Foo_1test.Foo_1` [accessible: true] `class Foo_2test.Foo_2` @@ -138,4 +186,8 @@ retrieved 10 members [accessible: true] `method fCCC=> Int` [accessible: true] `object Otest.O.type` [accessible: true] `value ctest.C` +[accessible: true] `value vCCCInt` +[accessible: true] `variable rCCCInt` +[accessible: false] `value pVCCCInt` +[accessible: false] `variable pRCCCInt` ================================================================================ diff --git a/test/files/presentation/scope-completion-import/src/Completions.scala b/test/files/presentation/scope-completion-import/src/Completions.scala index 6e08321283..d30aa0b4e3 100644 --- a/test/files/presentation/scope-completion-import/src/Completions.scala +++ b/test/files/presentation/scope-completion-import/src/Completions.scala @@ -1,10 +1,18 @@ package test class C { + val vCCC : Int = 0 + var rCCC : Int = 0 + private val pVCCC : Int = 0 + private var pRCCC : Int = 0 def fCCC : Int = 0 } object O extends C { + val vOOO : Int = 0 + var rOOO : Int = 0 + private val pVOOO : Int = 0 + private var pROOO : Int = 0 def fOOO : Int = 0 } -- cgit v1.2.3 From fdcc262070470e0968afcdf0036cc18781c52e33 Mon Sep 17 00:00:00 2001 From: Jason Zaugg Date: Wed, 4 Dec 2013 17:45:10 +0100 Subject: SI-8029 Avoid multi-run cyclic error with companions, package object The bug report suggests this problem only became visible in the IDE *after* 2.10.3, but I tested an IDE with exactly 2.10.3 and saw the same problem. In fact, my test case fails as far back as 2.10.0. I suspect the problem showed up after 816cecf9a9, which checks that pairs of companion symbols are codefined eagerly in Namers. This commit modifies the check of `rawInfo ne NoType` in `isCoDefinedWith` to avoid triggering adaptation of types from the previous run. I'm not sure of the precise intent of that check. I looked at c9861cd198 (genesis of isCoDefinedWith). Before that we get back to 3761cb4b3a1 (the dawn of Subversion.) --- bincompat-forward.whitelist.conf | 4 ++ src/reflect/scala/reflect/internal/Symbols.scala | 9 +++- test/files/run/t8029.scala | 57 ++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 test/files/run/t8029.scala (limited to 'test') diff --git a/bincompat-forward.whitelist.conf b/bincompat-forward.whitelist.conf index 2ece671638..3b61a02bce 100644 --- a/bincompat-forward.whitelist.conf +++ b/bincompat-forward.whitelist.conf @@ -1431,6 +1431,10 @@ filter { { matchName="scala.reflect.internal.Trees#Modifiers.isDeferredNotDefault" problemName=MissingMethodProblem + }, + { + matchName="scala.reflect.internal.Symbols#Symbol.rawInfoIsNoType" + problemName=MissingMethodProblem } ] } diff --git a/src/reflect/scala/reflect/internal/Symbols.scala b/src/reflect/scala/reflect/internal/Symbols.scala index 45c16b7302..a9299cc1bc 100644 --- a/src/reflect/scala/reflect/internal/Symbols.scala +++ b/src/reflect/scala/reflect/internal/Symbols.scala @@ -1282,6 +1282,13 @@ trait Symbols extends api.Symbols { self: SymbolTable => def hasRawInfo: Boolean = infos ne null def hasCompleteInfo = hasRawInfo && rawInfo.isComplete + // does not run adaptToNewRun, which is prone to trigger cycles (SI-8029) + // TODO: give this a better name if you understand the intent of the caller. + // Is it something to do with `reallyExists` or `isStale`? + final def rawInfoIsNoType: Boolean = { + hasRawInfo && (infos.info eq NoType) + } + /** Return info without checking for initialization or completing */ def rawInfo: Type = { var infos = this.infos @@ -1928,7 +1935,7 @@ trait Symbols extends api.Symbols { self: SymbolTable => /** Is this symbol defined in the same scope and compilation unit as `that` symbol? */ def isCoDefinedWith(that: Symbol) = ( - (this.rawInfo ne NoType) + !rawInfoIsNoType && (this.effectiveOwner == that.effectiveOwner) && ( !this.effectiveOwner.isPackageClass || (this.sourceFile eq null) diff --git a/test/files/run/t8029.scala b/test/files/run/t8029.scala new file mode 100644 index 0000000000..dbd5c41387 --- /dev/null +++ b/test/files/run/t8029.scala @@ -0,0 +1,57 @@ +import scala.tools.partest._ +import scala.tools.nsc._ + +object Test extends DirectTest { + + override def extraSettings: String = "-usejavacp -nowarn -Ystop-after:typer" + + override def code = "" // not used + + def code1 = """ +package object p1 { + trait A + object A +} + """ + + def code2 = """ +package object p2 { + class A + object A +} + """ + + def code3 = """ +package object p3 { + object A + trait A +} + """ + + def code4 = """ +package object p4 { + object A + trait A +} + """ + + def show() { + val global = newCompiler() + import global._ + def typecheck(code: String): Unit = { + val r = new Run + val sourceFile = newSources(code).head + global.reporter.reset() + r.compileSources(sourceFile :: Nil) + assert(!global.reporter.hasErrors) + } + + def typecheckTwice(code: String): Unit = { + typecheck(code) + typecheck(code) + } + + // was: illegal cyclic reference involving package ... + Seq(code1, code2, code3, code4) foreach typecheckTwice + } +} -- cgit v1.2.3