From b5661ccabd8199f6b67cff17fd27cac156b6d9ba Mon Sep 17 00:00:00 2001 From: Victor Petukhov Date: Tue, 28 Sep 2021 14:11:33 +0300 Subject: [PATCH] Don't run contract-specific checks in propery scopes ^KT-45118 Fixed --- .../codegen/FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../contracts/parsing/ContractParsingServices.kt | 11 ++++------- .../types/expressions/ExpressionTypingServices.java | 8 ++++++-- compiler/testData/codegen/box/inference/kt45118.kt | 11 +++++++++++ .../runners/codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/LightAnalysisModeTestGenerated.java | 5 +++++ .../es6/semantics/IrJsCodegenBoxES6TestGenerated.java | 5 +++++ .../ir/semantics/IrJsCodegenBoxTestGenerated.java | 5 +++++ .../js/test/semantics/JsCodegenBoxTestGenerated.java | 5 +++++ .../wasm/semantics/IrCodegenBoxWasmTestGenerated.java | 5 +++++ 11 files changed, 64 insertions(+), 9 deletions(-) create mode 100644 compiler/testData/codegen/box/inference/kt45118.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 869dc98e66e..92a9be65e47 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -18068,6 +18068,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/inference/kt42130.kt"); } + @Test + @TestMetadata("kt45118.kt") + public void testKt45118() throws Exception { + runTest("compiler/testData/codegen/box/inference/kt45118.kt"); + } + @Test @TestMetadata("kt47316.kt") public void testKt47316() throws Exception { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/contracts/parsing/ContractParsingServices.kt b/compiler/frontend/src/org/jetbrains/kotlin/contracts/parsing/ContractParsingServices.kt index 6dad1e1d99c..591c45aee3e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/contracts/parsing/ContractParsingServices.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/contracts/parsing/ContractParsingServices.kt @@ -41,14 +41,13 @@ class ContractParsingServices(val languageVersionSettings: LanguageVersionSettin * * Otherwise, it may lead to inconsistent resolve state and failed assertions */ - fun checkContractAndRecordIfPresent(expression: KtExpression, trace: BindingTrace, scope: LexicalScope) { + fun checkContractAndRecordIfPresent(expression: KtExpression, trace: BindingTrace, ownerDescriptor: FunctionDescriptor) { // Fastpath. Note that it doesn't violates invariant described in KDoc, because 'isContractDescriptionCallPsiCheck' // is a *necessary* (but not sufficient, actually) condition for presence of 'LazyContractProvider' if (!expression.isContractDescriptionCallPsiCheck()) return - val callContext = ContractCallContext(expression, scope, trace, languageVersionSettings) - val contractProviderIfAny = - (scope.ownerDescriptor as? FunctionDescriptor)?.getUserData(ContractProviderKey) as? LazyContractProvider? + val callContext = ContractCallContext(expression, ownerDescriptor, trace, languageVersionSettings) + val contractProviderIfAny = ownerDescriptor.getUserData(ContractProviderKey) as? LazyContractProvider? var resultingContractDescription: ContractDescription? = null try { @@ -103,11 +102,9 @@ class ContractParsingServices(val languageVersionSettings: LanguageVersionSettin class ContractCallContext( val contractCallExpression: KtExpression, - val scope: LexicalScope, + val functionDescriptor: FunctionDescriptor, val trace: BindingTrace, val languageVersionSettings: LanguageVersionSettings ) { - val ownerDescriptor: DeclarationDescriptor = scope.ownerDescriptor - val functionDescriptor: FunctionDescriptor = ownerDescriptor as FunctionDescriptor val bindingContext: BindingContext = trace.bindingContext } \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingServices.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingServices.java index b752480d738..f6cb69a43aa 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingServices.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingServices.java @@ -353,8 +353,12 @@ public class ExpressionTypingServices { } blockLevelVisitor = new ExpressionTypingVisitorDispatcher.ForBlock(expressionTypingComponents, annotationChecker, scope); - if (isFirstStatement) { - expressionTypingComponents.contractParsingServices.checkContractAndRecordIfPresent(statementExpression, context.trace, scope); + DeclarationDescriptor ownerDescriptor = scope.getOwnerDescriptor(); + + if (isFirstStatement && ownerDescriptor instanceof FunctionDescriptor) { + expressionTypingComponents.contractParsingServices.checkContractAndRecordIfPresent( + statementExpression, context.trace, (FunctionDescriptor) ownerDescriptor + ); isFirstStatement = false; } } diff --git a/compiler/testData/codegen/box/inference/kt45118.kt b/compiler/testData/codegen/box/inference/kt45118.kt new file mode 100644 index 00000000000..90ea5d62b3d --- /dev/null +++ b/compiler/testData/codegen/box/inference/kt45118.kt @@ -0,0 +1,11 @@ +open class Foo(open val x: Boolean) + +class Bar: Foo(false) { + val y = "OK" +} + +fun contract(x: Foo) = x + +val temp = if (true) contract(Bar()) else Bar() + +fun box(): String = (temp as Bar).y diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index 15131da142b..d31a14d9ade 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -17948,6 +17948,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/inference/kt42130.kt"); } + @Test + @TestMetadata("kt45118.kt") + public void testKt45118() throws Exception { + runTest("compiler/testData/codegen/box/inference/kt45118.kt"); + } + @Test @TestMetadata("kt47316.kt") public void testKt47316() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index c022d596c36..7502213d721 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -18068,6 +18068,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inference/kt42130.kt"); } + @Test + @TestMetadata("kt45118.kt") + public void testKt45118() throws Exception { + runTest("compiler/testData/codegen/box/inference/kt45118.kt"); + } + @Test @TestMetadata("kt47316.kt") public void testKt47316() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 4e75f64a3ba..330487dc50f 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -14871,6 +14871,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inference/kt42130.kt"); } + @TestMetadata("kt45118.kt") + public void testKt45118() throws Exception { + runTest("compiler/testData/codegen/box/inference/kt45118.kt"); + } + @TestMetadata("kt47316.kt") public void testKt47316() throws Exception { runTest("compiler/testData/codegen/box/inference/kt47316.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index 974271a2076..ee1aa50b42a 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -13050,6 +13050,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/inference/kt42130.kt"); } + @TestMetadata("kt45118.kt") + public void testKt45118() throws Exception { + runTest("compiler/testData/codegen/box/inference/kt45118.kt"); + } + @TestMetadata("lambdaWithStarReturn.kt") public void testLambdaWithStarReturn() throws Exception { runTest("compiler/testData/codegen/box/inference/lambdaWithStarReturn.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 5157c791cc3..bcbe812f5f3 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -12456,6 +12456,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inference/kt42130.kt"); } + @TestMetadata("kt45118.kt") + public void testKt45118() throws Exception { + runTest("compiler/testData/codegen/box/inference/kt45118.kt"); + } + @TestMetadata("lambdaWithStarReturn.kt") public void testLambdaWithStarReturn() throws Exception { runTest("compiler/testData/codegen/box/inference/lambdaWithStarReturn.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 5d45d3ea5ec..fe49ec50c80 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -12486,6 +12486,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inference/kt42130.kt"); } + @TestMetadata("kt45118.kt") + public void testKt45118() throws Exception { + runTest("compiler/testData/codegen/box/inference/kt45118.kt"); + } + @TestMetadata("lambdaWithStarReturn.kt") public void testLambdaWithStarReturn() throws Exception { runTest("compiler/testData/codegen/box/inference/lambdaWithStarReturn.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java index 53b4aedbb50..a7e4d53b79d 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java @@ -7600,6 +7600,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest runTest("compiler/testData/codegen/box/inference/kt42130.kt"); } + @TestMetadata("kt45118.kt") + public void testKt45118() throws Exception { + runTest("compiler/testData/codegen/box/inference/kt45118.kt"); + } + @TestMetadata("lambdaWithStarReturn.kt") public void testLambdaWithStarReturn() throws Exception { runTest("compiler/testData/codegen/box/inference/lambdaWithStarReturn.kt");