From 0ffa0b2bd77e746309b16a2faa4efde357ce076c Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 1 Jun 2020 15:11:18 +0300 Subject: [PATCH] [FIR] Fix effective visibility handling for local members In future 'Local' effective visibility could be used as a flag of local declaration --- .../testData/resolve/cfg/localClassesWithImplicit.txt | 2 +- compiler/fir/analysis-tests/testData/resolve/enum.txt | 10 +++++----- .../expresssions/CallBasedInExpressionGenerator.txt | 4 ++-- .../testData/resolve/expresssions/enumEntryUse.txt | 2 +- .../resolve/expresssions/localImplicitBodies.txt | 2 +- .../testData/resolve/expresssions/localInnerClass.txt | 2 +- .../testData/resolve/expresssions/localObjects.txt | 4 ++-- .../testData/resolve/expresssions/localScopes.txt | 2 +- .../resolve/expresssions/localWithBooleanNot.txt | 4 ++-- .../resolve/expresssions/outerMemberAccesses.txt | 10 +++++----- .../resolve/expresssions/privateObjectLiteral.txt | 4 ++-- .../resolve/expresssions/privateVisibility.txt | 2 +- .../testData/resolve/fromBuilder/enums.txt | 6 +++--- .../resolve/localClasses/implicitInAnonymous.txt | 2 +- .../analysis-tests/testData/resolve/localObject.txt | 8 ++++---- .../testData/resolve/objectInnerClass.txt | 6 +++--- .../resolve/problems/objectDerivedFromInnerClass.txt | 2 +- .../resolve/visibility/singletonConstructors.txt | 2 +- .../delegates/anonymousInDelegate.txt | 2 +- .../delegates/delegateWithAnonymousObject.txt | 2 +- .../testData/resolveWithStdlib/problems.txt | 2 +- .../kotlin/fir/FirEffectiveVisibilityImpl.kt | 11 +++++++---- 22 files changed, 47 insertions(+), 44 deletions(-) diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/localClassesWithImplicit.txt b/compiler/fir/analysis-tests/testData/resolve/cfg/localClassesWithImplicit.txt index 8fb0c6997b3..fb570522aba 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/localClassesWithImplicit.txt +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/localClassesWithImplicit.txt @@ -47,7 +47,7 @@ FILE: localClassesWithImplicit.kt } lval x: R|anonymous| = object : R|kotlin/Any| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/enum.txt b/compiler/fir/analysis-tests/testData/resolve/enum.txt index 33bc845d8b1..f3b54c518e5 100644 --- a/compiler/fir/analysis-tests/testData/resolve/enum.txt +++ b/compiler/fir/analysis-tests/testData/resolve/enum.txt @@ -22,7 +22,7 @@ FILE: enum.kt public get(): R|Some| public final static enum entry FIRST: R|SomeEnum| = object : R|SomeEnum| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super(Q|O1|) } @@ -33,7 +33,7 @@ FILE: enum.kt } public final static enum entry SECOND: R|SomeEnum| = object : R|SomeEnum| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super(Q|O2|) } @@ -71,7 +71,7 @@ FILE: enum.kt } public final static enum entry E1: R|EnumClass| = object : R|EnumClass| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super() } @@ -85,14 +85,14 @@ FILE: enum.kt } public final static enum entry E2: R|EnumClass| = object : R|EnumClass| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super() } } public final static enum entry E3: R|EnumClass| = object : R|EnumClass| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/CallBasedInExpressionGenerator.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/CallBasedInExpressionGenerator.txt index b7b48f3db29..60a813d799c 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/CallBasedInExpressionGenerator.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/CallBasedInExpressionGenerator.txt @@ -30,7 +30,7 @@ FILE: CallBasedInExpressionGenerator.kt private final fun gen(argument: R|ERROR CLASS: Symbol not found, for `StackValue`|): R|ERROR CLASS: Symbol not found, for `BranchedValue`| { ^gen object : R|ERROR CLASS: Symbol not found, for `BranchedValue`| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super(R|/argument|, Null(null), R|/argument|.#, #.#) } @@ -52,7 +52,7 @@ FILE: CallBasedInExpressionGenerator.kt , R|/jumpLabel|) } - private final fun invokeFunction(v: R|ERROR CLASS: Symbol not found, for `InstructionAdapter`|): R|kotlin/Unit| { + private[local] final fun invokeFunction(v: R|ERROR CLASS: Symbol not found, for `InstructionAdapter`|): R|kotlin/Unit| { lval result: = this@R|org/jetbrains/kotlin/codegen/range/inExpression/CallBasedInExpressionGenerator|.R|org/jetbrains/kotlin/codegen/range/inExpression/CallBasedInExpressionGenerator.codegen|.#(this@R|org/jetbrains/kotlin/codegen/range/inExpression/CallBasedInExpressionGenerator|.R|org/jetbrains/kotlin/codegen/range/inExpression/CallBasedInExpressionGenerator.resolvedCall|.#, this@R|org/jetbrains/kotlin/codegen/range/inExpression/CallBasedInExpressionGenerator|.R|org/jetbrains/kotlin/codegen/range/inExpression/CallBasedInExpressionGenerator.resolvedCall|, #()) R|/result|.#(R|/result|.#, R|/result|.#, R|/v|) } diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/enumEntryUse.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/enumEntryUse.txt index 943f38a167c..cd03048ea96 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/enumEntryUse.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/enumEntryUse.txt @@ -7,7 +7,7 @@ FILE: enumEntryUse.kt public final static enum entry FIRST: R|TestEnum| public final static enum entry SECOND: R|TestEnum| public final static enum entry THIRD: R|TestEnum| = object : R|TestEnum| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/localImplicitBodies.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/localImplicitBodies.txt index 95ffc549c3e..a9d8ff6a44e 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/localImplicitBodies.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/localImplicitBodies.txt @@ -1,7 +1,7 @@ FILE: localImplicitBodies.kt public final fun foo(): R|kotlin/Unit| { lval x: R|anonymous| = object : R|kotlin/Any| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/localInnerClass.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/localInnerClass.txt index f6f918e01bf..7d0106776f6 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/localInnerClass.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/localInnerClass.txt @@ -3,7 +3,7 @@ FILE: localInnerClass.kt } public final fun bar(): R|kotlin/Unit| { object : R|Foo| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/localObjects.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/localObjects.txt index bbc003a9218..b5967df8dba 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/localObjects.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/localObjects.txt @@ -21,7 +21,7 @@ FILE: localObjects.kt public final fun test(): R|kotlin/Unit| { Q|A|.R|/A.x| lval b: R|anonymous| = object : R|Foo| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super() } @@ -29,7 +29,7 @@ FILE: localObjects.kt R|/b|.R|/Foo.foo|() local final object B : R|kotlin/Any| { - private constructor(): R|B| { + private[local] constructor(): R|B| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/localScopes.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/localScopes.txt index 779600d31ea..cd9d3f195cb 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/localScopes.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/localScopes.txt @@ -23,7 +23,7 @@ FILE: localScopes.kt R|/base|.R|/BaseLocal.baz|() R|/base|.R|/Bar.foo|() lval anonymous: R|anonymous| = object : R|Bar| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/localWithBooleanNot.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/localWithBooleanNot.txt index 44d94294d47..8edb4faf6e4 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/localWithBooleanNot.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/localWithBooleanNot.txt @@ -1,11 +1,11 @@ FILE: foo.kt public final fun foo(): R|kotlin/Boolean| { object : R|Node| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super() } - private final var result: R|kotlin/Boolean| = Boolean(false) + private[local] final var result: R|kotlin/Boolean| = Boolean(false) private get(): R|kotlin/Boolean| private set(value: R|kotlin/Boolean|): R|kotlin/Unit| diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/outerMemberAccesses.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/outerMemberAccesses.txt index 90809515f91..6035641b94c 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/outerMemberAccesses.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/outerMemberAccesses.txt @@ -32,7 +32,7 @@ FILE: O.kt public[private] final fun test(): R|kotlin/Unit| { lval x: R|kotlin/Int| = this@R|/O.Derived|.R|/O.Derived.bar| lval o: R|anonymous| = object : R|Wrapper| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super(this@R|/O.Derived.Some|.R|/O.Derived.Some.z|) } @@ -41,7 +41,7 @@ FILE: O.kt } public[local] final val oo: R|anonymous| = object : R|kotlin/Any| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super() } @@ -61,7 +61,7 @@ FILE: O.kt public[private] final fun test(): R|kotlin/Unit| { lval x: R|kotlin/Int| = this@R|/O.Derived|.R|/O.Derived.bar| lval o: R|anonymous| = object : R|kotlin/Any| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super() } @@ -86,11 +86,11 @@ FILE: O.kt private final fun gen(): R|kotlin/Any| { ^gen object : R|Wrapper| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super(Boolean(true)) } - private final fun invokeFunction(): R|kotlin/Unit| { + private[local] final fun invokeFunction(): R|kotlin/Unit| { lval c: R|kotlin/Any| = this@R|/Generator|.R|/Generator.codegen| lval cc: R|kotlin/Int| = this@R|/Generator|.R|/Generator.codegen|.R|kotlin/Any.hashCode|() } diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/privateObjectLiteral.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/privateObjectLiteral.txt index 857d1deb645..71aa1293cbe 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/privateObjectLiteral.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/privateObjectLiteral.txt @@ -5,7 +5,7 @@ FILE: privateObjectLiteral.kt } private final val x: R|anonymous| = object : R|kotlin/Any| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super() } @@ -21,7 +21,7 @@ FILE: privateObjectLiteral.kt public get(): R|kotlin/Int| internal final val z: R|anonymous| = object : R|kotlin/Any| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/privateVisibility.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/privateVisibility.txt index 02fbc39596a..ec883538a90 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/privateVisibility.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/privateVisibility.txt @@ -68,7 +68,7 @@ FILE: first.kt super() } - private final fun bar(): R|kotlin/Unit| + private[local] final fun bar(): R|kotlin/Unit| public[local] final fun baz(): R|kotlin/Unit| { this@R|/Local|.R|/Local.bar|() diff --git a/compiler/fir/analysis-tests/testData/resolve/fromBuilder/enums.txt b/compiler/fir/analysis-tests/testData/resolve/fromBuilder/enums.txt index 87e5d8d11e9..b46597da1fc 100644 --- a/compiler/fir/analysis-tests/testData/resolve/fromBuilder/enums.txt +++ b/compiler/fir/analysis-tests/testData/resolve/fromBuilder/enums.txt @@ -26,7 +26,7 @@ FILE: enums.kt internal get(): R|kotlin/Double| public final static enum entry MERCURY: R|Planet| = object : R|Planet| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super(Double(1.0), Double(2.0)) } @@ -37,7 +37,7 @@ FILE: enums.kt } public final static enum entry VENERA: R|Planet| = object : R|Planet| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super(Double(3.0), Double(4.0)) } @@ -48,7 +48,7 @@ FILE: enums.kt } public final static enum entry EARTH: R|Planet| = object : R|Planet| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super(Double(5.0), Double(6.0)) } diff --git a/compiler/fir/analysis-tests/testData/resolve/localClasses/implicitInAnonymous.txt b/compiler/fir/analysis-tests/testData/resolve/localClasses/implicitInAnonymous.txt index c9133118628..b1f27a077d1 100644 --- a/compiler/fir/analysis-tests/testData/resolve/localClasses/implicitInAnonymous.txt +++ b/compiler/fir/analysis-tests/testData/resolve/localClasses/implicitInAnonymous.txt @@ -1,6 +1,6 @@ FILE: implicitInAnonymous.kt private final val x: R|anonymous| = object : R|kotlin/Any| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/localObject.txt b/compiler/fir/analysis-tests/testData/resolve/localObject.txt index 79a845a75f4..09bb6419147 100644 --- a/compiler/fir/analysis-tests/testData/resolve/localObject.txt +++ b/compiler/fir/analysis-tests/testData/resolve/localObject.txt @@ -9,7 +9,7 @@ FILE: localObject.kt public final fun tesLambda(x: R|kotlin/Int|): R|kotlin/Int| { ^tesLambda R|/run|( = run@fun (): R|kotlin/Int| { lval obj: R|anonymous| = object : R|Foo| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super() } @@ -35,7 +35,7 @@ FILE: localObject.kt public get(): R|kotlin/Int| public set(value: R|kotlin/Int|): R|kotlin/Unit| { lval obj: R|anonymous| = object : R|Foo| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super() } @@ -51,7 +51,7 @@ FILE: localObject.kt public final val y: R|kotlin/Int| public get(): R|kotlin/Int| { lval obj: R|anonymous| = object : R|Foo| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super() } @@ -66,7 +66,7 @@ FILE: localObject.kt public final val z: R|kotlin/Int| = this@R|/TestProperty|.R|kotlin/run|( = run@fun R|TestProperty|.(): R|kotlin/Int| { lval obj: R|anonymous| = object : R|Foo| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/objectInnerClass.txt b/compiler/fir/analysis-tests/testData/resolve/objectInnerClass.txt index 960ad741b7b..637a1c92c5e 100644 --- a/compiler/fir/analysis-tests/testData/resolve/objectInnerClass.txt +++ b/compiler/fir/analysis-tests/testData/resolve/objectInnerClass.txt @@ -1,6 +1,6 @@ FILE: objectInnerClass.kt public final val case1: R|anonymous| = object : R|A| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super() } @@ -68,7 +68,7 @@ FILE: objectInnerClass.kt } public final val x: R|anonymous| = object : R|Case2.Base| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { this@R|/Case2|.super(R|/B.B|()) } @@ -125,7 +125,7 @@ FILE: objectInnerClass.kt } public final val x: R|anonymous| = object : R|A| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/problems/objectDerivedFromInnerClass.txt b/compiler/fir/analysis-tests/testData/resolve/problems/objectDerivedFromInnerClass.txt index e3213380d90..6ac3a76e932 100644 --- a/compiler/fir/analysis-tests/testData/resolve/problems/objectDerivedFromInnerClass.txt +++ b/compiler/fir/analysis-tests/testData/resolve/problems/objectDerivedFromInnerClass.txt @@ -14,7 +14,7 @@ FILE: objectDerivedFromInnerClass.kt } public final fun test(): R|kotlin/Unit| { lval x: R|anonymous| = object : R|Outer.Inner| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/visibility/singletonConstructors.txt b/compiler/fir/analysis-tests/testData/resolve/visibility/singletonConstructors.txt index 6058cc99938..daee35cb753 100644 --- a/compiler/fir/analysis-tests/testData/resolve/visibility/singletonConstructors.txt +++ b/compiler/fir/analysis-tests/testData/resolve/visibility/singletonConstructors.txt @@ -51,7 +51,7 @@ FILE: singletonConstructors.kt } public final static enum entry X: R|E| = object : R|E| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/anonymousInDelegate.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/anonymousInDelegate.txt index f7f59c59f76..c570c010aae 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/anonymousInDelegate.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/anonymousInDelegate.txt @@ -5,7 +5,7 @@ FILE: anonymousInDelegate.kt } public final val x: R|kotlin/Int|by R|kotlin/lazy|( = lazy@fun (): R|kotlin/Int| { lval foo: R|anonymous| = object : R|Foo| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.txt index 2f1be575953..927d2dcfd25 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.txt @@ -24,7 +24,7 @@ FILE: delegateWithAnonymousObject.kt public final var issueListView: R|IssueListView|by this@R|/IssuesListUserProfile|.R|/delegate|( = delegate@fun (): R|kotlin/properties/ReadWriteProperty| { ^ object : R|kotlin/properties/ReadWriteProperty| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems.txt index 51823ab8ce4..373e1a00973 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems.txt @@ -2,7 +2,7 @@ FILE: problems.kt public final val sb: R|java/lang/StringBuilder| = R|java/lang/StringBuilder.StringBuilder|() public get(): R|java/lang/StringBuilder| public final val o: R|anonymous| = object : R|kotlin/Any| { - private constructor(): R|anonymous| { + private[local] constructor(): R|anonymous| { super() } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirEffectiveVisibilityImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirEffectiveVisibilityImpl.kt index 15c6152fea4..6fcc9604b20 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirEffectiveVisibilityImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirEffectiveVisibilityImpl.kt @@ -183,10 +183,13 @@ sealed class FirEffectiveVisibilityImpl( override fun toVisibility() = Visibilities.PRIVATE } - override fun lowerBound(other: FirEffectiveVisibility) = when (relation(other)) { - Permissiveness.SAME, Permissiveness.LESS -> this - Permissiveness.MORE -> other - Permissiveness.UNKNOWN -> Private + override fun lowerBound(other: FirEffectiveVisibility): FirEffectiveVisibility { + if (this == Local || other == Local) return Local + return when (relation(other)) { + Permissiveness.SAME, Permissiveness.LESS -> this + Permissiveness.MORE -> other + Permissiveness.UNKNOWN -> Private + } } companion object {