From 881b15a6772a7622b73eecbb2f5916e1347fdfe2 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 31 Aug 2021 11:55:12 +0300 Subject: [PATCH] FIR: use typeWithStarProjections for protected visibility check --- ...irOldFrontendDiagnosticsTestGenerated.java | 6 ++++ ...DiagnosticsWithLightTreeTestGenerated.java | 6 ++++ .../kotlin/fir/FirVisibilityChecker.kt | 2 +- .../kotlin/fir/resolve/ScopeUtils.kt | 32 +++++-------------- .../scopes/protectedVisibility/generic.kt | 10 ++++++ .../scopes/protectedVisibility/generic.txt | 18 +++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++++ ...CompilerTestFE10TestdataTestGenerated.java | 6 ++++ 8 files changed, 61 insertions(+), 25 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/scopes/protectedVisibility/generic.kt create mode 100644 compiler/testData/diagnostics/tests/scopes/protectedVisibility/generic.txt diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index 3494a9e64b1..1b827793d64 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -25706,6 +25706,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/scopes/protectedVisibility/constructorsInner.kt"); } + @Test + @TestMetadata("generic.kt") + public void testGeneric() throws Exception { + runTest("compiler/testData/diagnostics/tests/scopes/protectedVisibility/generic.kt"); + } + @Test @TestMetadata("innerClassInJava.kt") public void testInnerClassInJava() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index 166c20c1a47..d3d04479588 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -25706,6 +25706,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/scopes/protectedVisibility/constructorsInner.kt"); } + @Test + @TestMetadata("generic.kt") + public void testGeneric() throws Exception { + runTest("compiler/testData/diagnostics/tests/scopes/protectedVisibility/generic.kt"); + } + @Test @TestMetadata("innerClassInJava.kt") public void testInnerClassInJava() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt index 6e89d2c5307..500a2a67953 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt @@ -214,7 +214,7 @@ abstract class FirVisibilityChecker : FirSessionComponent { stubTypesEqualToAnything = false ) return AbstractTypeChecker.isSubtypeOf( - typeCheckerState, dispatchReceiverType.fullyExpandedType(session), containingUseSiteClass.defaultType() + typeCheckerState, dispatchReceiverType.fullyExpandedType(session), containingUseSiteClass.typeWithStarProjections() ) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt index 3a922612402..7b6114f1876 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt @@ -6,9 +6,7 @@ package org.jetbrains.kotlin.fir.resolve import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject import org.jetbrains.kotlin.fir.declarations.FirClass -import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.expressions.FirExpressionWithSmartcast import org.jetbrains.kotlin.fir.expressions.FirExpressionWithSmartcastToNull @@ -101,14 +99,7 @@ private fun ConeKotlinType.scope(useSiteSession: FirSession, scopeSession: Scope fun FirClassSymbol<*>.defaultType(): ConeClassLikeType = fir.defaultType() fun FirClass.defaultType(): ConeClassLikeType = - when (this) { - is FirRegularClass -> defaultType() - is FirAnonymousObject -> defaultType() - else -> error("Unknown class ${this::class}") - } - -fun FirRegularClass.defaultType(): ConeClassLikeTypeImpl { - return ConeClassLikeTypeImpl( + ConeClassLikeTypeImpl( symbol.toLookupTag(), typeParameters.map { ConeTypeParameterTypeImpl( @@ -118,20 +109,6 @@ fun FirRegularClass.defaultType(): ConeClassLikeTypeImpl { }.toTypedArray(), isNullable = false ) -} - -fun FirAnonymousObject.defaultType(): ConeClassLikeType { - return ConeClassLikeTypeImpl( - symbol.toLookupTag(), - typeParameters.map { - ConeTypeParameterTypeImpl( - it.symbol.toLookupTag(), - isNullable = false - ) - }.toTypedArray(), - isNullable = false - ) -} fun ClassId.defaultType(parameters: List): ConeClassLikeType = ConeClassLikeTypeImpl( @@ -145,4 +122,11 @@ fun ClassId.defaultType(parameters: List): ConeClassLike isNullable = false, ) +fun FirClass.typeWithStarProjections(): ConeClassLikeType = + ConeClassLikeTypeImpl( + symbol.toLookupTag(), + typeParameters.map { ConeStarProjection }.toTypedArray(), + isNullable = false + ) + val TYPE_PARAMETER_SCOPE_KEY = scopeSessionKey() diff --git a/compiler/testData/diagnostics/tests/scopes/protectedVisibility/generic.kt b/compiler/testData/diagnostics/tests/scopes/protectedVisibility/generic.kt new file mode 100644 index 00000000000..942f8f2781d --- /dev/null +++ b/compiler/testData/diagnostics/tests/scopes/protectedVisibility/generic.kt @@ -0,0 +1,10 @@ +// FIR_IDENTICAL +abstract class Parent { + protected fun foo() {} +} + +class Derived : Parent() { + fun bar(x: Derived) { + x.foo() + } +} diff --git a/compiler/testData/diagnostics/tests/scopes/protectedVisibility/generic.txt b/compiler/testData/diagnostics/tests/scopes/protectedVisibility/generic.txt new file mode 100644 index 00000000000..aec19e5c610 --- /dev/null +++ b/compiler/testData/diagnostics/tests/scopes/protectedVisibility/generic.txt @@ -0,0 +1,18 @@ +package + +public final class Derived : Parent { + public constructor Derived() + public final fun bar(/*0*/ x: Derived): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + protected final override /*1*/ /*fake_override*/ fun foo(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public abstract class Parent { + public constructor Parent() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + protected final fun foo(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 14d877c1f51..9e37bce1055 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -25718,6 +25718,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/scopes/protectedVisibility/constructorsInner.kt"); } + @Test + @TestMetadata("generic.kt") + public void testGeneric() throws Exception { + runTest("compiler/testData/diagnostics/tests/scopes/protectedVisibility/generic.kt"); + } + @Test @TestMetadata("innerClassInJava.kt") public void testInnerClassInJava() throws Exception { diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index 17c3b30857f..d23d08dd538 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -25706,6 +25706,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/scopes/protectedVisibility/constructorsInner.kt"); } + @Test + @TestMetadata("generic.kt") + public void testGeneric() throws Exception { + runTest("compiler/testData/diagnostics/tests/scopes/protectedVisibility/generic.kt"); + } + @Test @TestMetadata("innerClassInJava.kt") public void testInnerClassInJava() throws Exception {