Don't run contract-specific checks in propery scopes

^KT-45118 Fixed
This commit is contained in:
Victor Petukhov
2021-09-28 14:11:33 +03:00
parent b957831683
commit b5661ccabd
11 changed files with 64 additions and 9 deletions
@@ -18068,6 +18068,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/inference/kt42130.kt"); 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 @Test
@TestMetadata("kt47316.kt") @TestMetadata("kt47316.kt")
public void testKt47316() throws Exception { public void testKt47316() throws Exception {
@@ -41,14 +41,13 @@ class ContractParsingServices(val languageVersionSettings: LanguageVersionSettin
* *
* Otherwise, it may lead to inconsistent resolve state and failed assertions * 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' // 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' // is a *necessary* (but not sufficient, actually) condition for presence of 'LazyContractProvider'
if (!expression.isContractDescriptionCallPsiCheck()) return if (!expression.isContractDescriptionCallPsiCheck()) return
val callContext = ContractCallContext(expression, scope, trace, languageVersionSettings) val callContext = ContractCallContext(expression, ownerDescriptor, trace, languageVersionSettings)
val contractProviderIfAny = val contractProviderIfAny = ownerDescriptor.getUserData(ContractProviderKey) as? LazyContractProvider?
(scope.ownerDescriptor as? FunctionDescriptor)?.getUserData(ContractProviderKey) as? LazyContractProvider?
var resultingContractDescription: ContractDescription? = null var resultingContractDescription: ContractDescription? = null
try { try {
@@ -103,11 +102,9 @@ class ContractParsingServices(val languageVersionSettings: LanguageVersionSettin
class ContractCallContext( class ContractCallContext(
val contractCallExpression: KtExpression, val contractCallExpression: KtExpression,
val scope: LexicalScope, val functionDescriptor: FunctionDescriptor,
val trace: BindingTrace, val trace: BindingTrace,
val languageVersionSettings: LanguageVersionSettings val languageVersionSettings: LanguageVersionSettings
) { ) {
val ownerDescriptor: DeclarationDescriptor = scope.ownerDescriptor
val functionDescriptor: FunctionDescriptor = ownerDescriptor as FunctionDescriptor
val bindingContext: BindingContext = trace.bindingContext val bindingContext: BindingContext = trace.bindingContext
} }
@@ -353,8 +353,12 @@ public class ExpressionTypingServices {
} }
blockLevelVisitor = new ExpressionTypingVisitorDispatcher.ForBlock(expressionTypingComponents, annotationChecker, scope); blockLevelVisitor = new ExpressionTypingVisitorDispatcher.ForBlock(expressionTypingComponents, annotationChecker, scope);
if (isFirstStatement) { DeclarationDescriptor ownerDescriptor = scope.getOwnerDescriptor();
expressionTypingComponents.contractParsingServices.checkContractAndRecordIfPresent(statementExpression, context.trace, scope);
if (isFirstStatement && ownerDescriptor instanceof FunctionDescriptor) {
expressionTypingComponents.contractParsingServices.checkContractAndRecordIfPresent(
statementExpression, context.trace, (FunctionDescriptor) ownerDescriptor
);
isFirstStatement = false; isFirstStatement = false;
} }
} }
+11
View File
@@ -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
@@ -17948,6 +17948,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/inference/kt42130.kt"); 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 @Test
@TestMetadata("kt47316.kt") @TestMetadata("kt47316.kt")
public void testKt47316() throws Exception { public void testKt47316() throws Exception {
@@ -18068,6 +18068,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/inference/kt42130.kt"); 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 @Test
@TestMetadata("kt47316.kt") @TestMetadata("kt47316.kt")
public void testKt47316() throws Exception { public void testKt47316() throws Exception {
@@ -14871,6 +14871,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/inference/kt42130.kt"); 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") @TestMetadata("kt47316.kt")
public void testKt47316() throws Exception { public void testKt47316() throws Exception {
runTest("compiler/testData/codegen/box/inference/kt47316.kt"); runTest("compiler/testData/codegen/box/inference/kt47316.kt");
@@ -13050,6 +13050,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes
runTest("compiler/testData/codegen/box/inference/kt42130.kt"); 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") @TestMetadata("lambdaWithStarReturn.kt")
public void testLambdaWithStarReturn() throws Exception { public void testLambdaWithStarReturn() throws Exception {
runTest("compiler/testData/codegen/box/inference/lambdaWithStarReturn.kt"); runTest("compiler/testData/codegen/box/inference/lambdaWithStarReturn.kt");
@@ -12456,6 +12456,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/inference/kt42130.kt"); 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") @TestMetadata("lambdaWithStarReturn.kt")
public void testLambdaWithStarReturn() throws Exception { public void testLambdaWithStarReturn() throws Exception {
runTest("compiler/testData/codegen/box/inference/lambdaWithStarReturn.kt"); runTest("compiler/testData/codegen/box/inference/lambdaWithStarReturn.kt");
@@ -12486,6 +12486,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/inference/kt42130.kt"); 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") @TestMetadata("lambdaWithStarReturn.kt")
public void testLambdaWithStarReturn() throws Exception { public void testLambdaWithStarReturn() throws Exception {
runTest("compiler/testData/codegen/box/inference/lambdaWithStarReturn.kt"); runTest("compiler/testData/codegen/box/inference/lambdaWithStarReturn.kt");
@@ -7600,6 +7600,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest
runTest("compiler/testData/codegen/box/inference/kt42130.kt"); 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") @TestMetadata("lambdaWithStarReturn.kt")
public void testLambdaWithStarReturn() throws Exception { public void testLambdaWithStarReturn() throws Exception {
runTest("compiler/testData/codegen/box/inference/lambdaWithStarReturn.kt"); runTest("compiler/testData/codegen/box/inference/lambdaWithStarReturn.kt");