From 2179ae496e3b04bd870d7a4cd945e8d8d2cf4e15 Mon Sep 17 00:00:00 2001 From: Dmitry Savvinov Date: Tue, 21 Aug 2018 14:04:05 +0300 Subject: [PATCH] Fix testdata after improvements in contract parsing diagnostics --- .../ContractParsingDiagnosticsCollector.kt | 12 +++++--- .../contracts/dsl/errors/emptyContract.kt | 2 +- .../contracts/dsl/errors/illegalCallSites.kt | 30 +++++++++---------- .../contracts/dsl/errors/illegalCallSites.txt | 13 -------- .../illegalConstructionInContractBlock.kt | 22 +++++++------- .../illegalConstructionInContractBlock.txt | 2 -- .../dsl/errors/illegalEqualsCondition.kt | 2 +- .../dsl/errors/nestedConditionalEffects.kt | 2 +- .../dsl/errors/nonLambdaLiteralAsArgument.kt | 6 ++-- .../contracts/dsl/errors/notFirstStatement.kt | 4 +-- .../dsl/errors/referenceToProperty.kt | 4 +-- .../contracts/dsl/errors/typeReferences.kt | 10 +++---- .../contracts/dsl/errors/typeReferences.txt | 10 ------- .../dsl/errors/unlabeledReceiver.txt | 1 - 14 files changed, 49 insertions(+), 71 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/contracts/parsing/ContractParsingDiagnosticsCollector.kt b/compiler/frontend/src/org/jetbrains/kotlin/contracts/parsing/ContractParsingDiagnosticsCollector.kt index 3f1fb1d5a92..958b1d3179d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/contracts/parsing/ContractParsingDiagnosticsCollector.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/contracts/parsing/ContractParsingDiagnosticsCollector.kt @@ -35,11 +35,12 @@ interface ContractParsingDiagnosticsCollector { } } -class TraceBasedCollector(private val bindingTrace: BindingTrace, private val mainCall: KtExpression) : ContractParsingDiagnosticsCollector { +class TraceBasedCollector(private val bindingTrace: BindingTrace, mainCall: KtExpression) : ContractParsingDiagnosticsCollector { private val diagnostics: MutableList = mutableListOf() + private val mainCallReportTarget = (mainCall as? KtCallExpression)?.calleeExpression ?: mainCall override fun contractNotAllowed(message: String) { - diagnostics += Errors.CONTRACT_NOT_ALLOWED.on((mainCall as? KtCallExpression)?.calleeExpression ?: mainCall, message) + diagnostics += Errors.CONTRACT_NOT_ALLOWED.on(mainCallReportTarget, message) } override fun badDescription(message: String, reportOn: KtElement) { @@ -47,12 +48,15 @@ class TraceBasedCollector(private val bindingTrace: BindingTrace, private val ma } override fun unsupportedFeature(languageVersionSettings: LanguageVersionSettings) { - diagnostics += Errors.UNSUPPORTED_FEATURE.on(mainCall, LanguageFeature.AllowContractsForCustomFunctions to languageVersionSettings) + diagnostics += Errors.UNSUPPORTED_FEATURE.on( + mainCallReportTarget, + LanguageFeature.AllowContractsForCustomFunctions to languageVersionSettings + ) } override fun flushDiagnostics(parsingFailed: Boolean) { if (parsingFailed && diagnostics.isEmpty()) { - diagnostics += Errors.ERROR_IN_CONTRACT_DESCRIPTION.on(mainCall, "Error in contract description") + diagnostics += Errors.ERROR_IN_CONTRACT_DESCRIPTION.on(mainCallReportTarget, "Error in contract description") } diagnostics.forEach { bindingTrace.report(it) } diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/emptyContract.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/emptyContract.kt index eaed628ce7b..55244799a6a 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/emptyContract.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/emptyContract.kt @@ -5,5 +5,5 @@ import kotlin.contracts.* fun emptyContract() { - contract { } + contract { } } \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/illegalCallSites.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/illegalCallSites.kt index b90ac27984b..e72ee56dbbe 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/illegalCallSites.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/illegalCallSites.kt @@ -8,23 +8,23 @@ import kotlin.contracts.* // ============= Class ===================== open class Class { fun member(x: Boolean) { - contract { returns() implies (x) } + contract { returns() implies (x) } } inline fun inlineMember(x: Boolean) { - contract { returns() implies (x) } + contract { returns() implies (x) } } abstract fun abstractMember(x: Boolean) { - contract { returns() implies (x) } + contract { returns() implies (x) } } open fun openMemeber(x: Boolean) { - contract { returns() implies (x) } + contract { returns() implies (x) } } suspend fun suspendMember(x: Boolean) { - contract { returns() implies (x) } + contract { returns() implies (x) } } } @@ -39,48 +39,48 @@ inline fun inlineTopLevel(x: Boolean) { } suspend fun suspendTopLevel(x: Boolean) { - contract { returns() implies (x) } + contract { returns() implies (x) } } // Top-level operator operator fun Boolean.plus(x: Boolean): Boolean { - contract { returns() implies (x) } + contract { returns() implies (x) } return x } val topLevelLambda: (Boolean) -> Unit = { x: Boolean -> - contract { returns() implies (x) } + contract { returns() implies (x) } } val topLevelAnonymousFunction = fun (x: Boolean) { - contract { returns() implies (x) } + contract { returns() implies (x) } } var topLevelPropertyAccessors: Int? = 42 get() { - contract { returns() implies (field != null) } + contract { returns() implies (field != null) } return 42 } set(value) { - contract { returns() implies (field != null) } + contract { returns() implies (field != null) } } // ============= Local ===================== fun test() { fun localDeclaration(x: Boolean) { - contract { returns() implies (x) } + contract { returns() implies (x) } } suspend fun suspendlocalDeclaration(x: Boolean) { - contract { returns() implies (x) } + contract { returns() implies (x) } } val localAnonymousFunction = fun (x: Boolean) { - contract { returns() implies (x) } + contract { returns() implies (x) } } val localLambda: (Boolean) -> Unit = { x: Boolean -> - contract { returns() implies (x) } + contract { returns() implies (x) } } } \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/illegalCallSites.txt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/illegalCallSites.txt index e8105057eca..52c04eaa580 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/illegalCallSites.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/illegalCallSites.txt @@ -7,33 +7,20 @@ public inline fun inlineTopLevel(/*0*/ x: kotlin.Boolean): kotlin.Unit Returns(WILDCARD) -> x public suspend fun suspendTopLevel(/*0*/ x: kotlin.Boolean): kotlin.Unit - Returns(WILDCARD) -> x - public fun test(): kotlin.Unit public fun topLevel(/*0*/ x: kotlin.Boolean): kotlin.Unit Returns(WILDCARD) -> x public operator fun kotlin.Boolean.plus(/*0*/ x: kotlin.Boolean): kotlin.Boolean - Returns(WILDCARD) -> x public open class Class { public constructor Class() public abstract fun abstractMember(/*0*/ x: kotlin.Boolean): kotlin.Unit - Returns(WILDCARD) -> x - public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public final inline fun inlineMember(/*0*/ x: kotlin.Boolean): kotlin.Unit - Returns(WILDCARD) -> x - public final fun member(/*0*/ x: kotlin.Boolean): kotlin.Unit - Returns(WILDCARD) -> x - public open fun openMemeber(/*0*/ x: kotlin.Boolean): kotlin.Unit - Returns(WILDCARD) -> x - public final suspend fun suspendMember(/*0*/ x: kotlin.Boolean): kotlin.Unit - Returns(WILDCARD) -> x - public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/illegalConstructionInContractBlock.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/illegalConstructionInContractBlock.kt index e4745964d0a..6cb191fcd8b 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/illegalConstructionInContractBlock.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/illegalConstructionInContractBlock.kt @@ -6,50 +6,50 @@ import kotlin.contracts.* fun ifInContract(x: Any?, boolean: Boolean) { contract { - if (boolean) { + if (boolean) { returns() implies (x is String) } else { returns() implies (x is Int) - } + } } } fun whenInContract(x: Any?, boolean: Boolean) { contract { - when (boolean) { + when (boolean) { true -> returns() implies (x is String) else -> returns() implies (x is Int) - } + } } } fun forInContract(x: Any?) { contract { - for (i in 0..1) { + for (i in 0..1) { returns() implies (x is String) - } + } } } fun whileInContract(x: Any?) { contract { - while (false) { + while (false) { returns() implies (x is String) - } + } } } fun doWhileInContract(x: Any?) { contract { - do { + do { returns() implies (x is String) - } while (false) + } while (false) } } fun localValInContract(x: Any?) { contract { - val y: Int = 42 + val y: Int = 42 returns() implies (x is String) } } \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/illegalConstructionInContractBlock.txt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/illegalConstructionInContractBlock.txt index 6a0f6a8b645..6f8fc99acf9 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/illegalConstructionInContractBlock.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/illegalConstructionInContractBlock.txt @@ -4,7 +4,5 @@ public fun doWhileInContract(/*0*/ x: kotlin.Any?): kotlin.Unit public fun forInContract(/*0*/ x: kotlin.Any?): kotlin.Unit public fun ifInContract(/*0*/ x: kotlin.Any?, /*1*/ boolean: kotlin.Boolean): kotlin.Unit public fun localValInContract(/*0*/ x: kotlin.Any?): kotlin.Unit - Returns(WILDCARD) -> x is String - public fun whenInContract(/*0*/ x: kotlin.Any?, /*1*/ boolean: kotlin.Boolean): kotlin.Unit public fun whileInContract(/*0*/ x: kotlin.Any?): kotlin.Unit diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/illegalEqualsCondition.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/illegalEqualsCondition.kt index c78dd0232f2..0de7636b761 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/illegalEqualsCondition.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/illegalEqualsCondition.kt @@ -12,7 +12,7 @@ fun equalsWithVariables(x: Any?, y: Any?) { fun identityEqualsWithVariables(x: Any?, y: Any?) { contract { - returns() implies (x === y) + returns() implies (x === y) } } diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/nestedConditionalEffects.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/nestedConditionalEffects.kt index 355fe9efdea..ef981d25777 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/nestedConditionalEffects.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/nestedConditionalEffects.kt @@ -5,7 +5,7 @@ import kotlin.contracts.* fun foo(boolean: Boolean) { - contract { + contract { (returns() implies (boolean)) implies (!boolean) } } \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/nonLambdaLiteralAsArgument.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/nonLambdaLiteralAsArgument.kt index ea05aa00cde..58f1c722e7f 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/nonLambdaLiteralAsArgument.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/nonLambdaLiteralAsArgument.kt @@ -5,11 +5,11 @@ import kotlin.contracts.* fun passLambdaValue(l: ContractBuilder.() -> Unit) { - contract(l) + contract(l) } fun passAnonymousFunction(x: Boolean) { - contract(fun ContractBuilder.() { + contract(fun ContractBuilder.() { returns() implies x - }) + }) } \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/notFirstStatement.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/notFirstStatement.kt index 0a401035204..3010c74eb2d 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/notFirstStatement.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/notFirstStatement.kt @@ -6,7 +6,7 @@ import kotlin.contracts.* fun foo(y: Boolean) { val x: Int = 42 - contract { + contract { returns() implies y - } + } } \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.kt index fd5cc7b817c..c471a2aa1ed 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/referenceToProperty.kt @@ -6,8 +6,8 @@ import kotlin.contracts.* class Foo(val x: Int?) { fun isXNull(): Boolean { - contract { - returns(false) implies (x != null) + contract { + returns(false) implies (x != null) } return x != null } diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.kt index 6371e3e46aa..33de1fc06b2 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.kt @@ -6,20 +6,20 @@ import kotlin.contracts.* inline fun referToReifiedGeneric(x: Any?) { contract { - returns() implies (x is T) + returns() implies (x is T) } } class Generic { fun referToCaptured(x: Any?) { - contract { + contract { returns() implies (x is T) } } } fun referToSubstituted(x: Any?) { - contract { + contract { returns() implies (x is Generic) } } @@ -35,13 +35,13 @@ typealias FunctionalType = () -> Unit typealias SimpleType = Int fun referToAliasedGeneric(x: Any?) { - contract { + contract { returns() implies (x is GenericString) } } fun referToAliasedFunctionType(x: Any?) { - contract { + contract { returns() implies (x is FunctionalType) } } diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.txt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.txt index 474d13b27de..e4735c40c68 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/typeReferences.txt @@ -1,20 +1,12 @@ package public fun referToAliasedFunctionType(/*0*/ x: kotlin.Any?): kotlin.Unit - Returns(WILDCARD) -> x is Function0 - public fun referToAliasedGeneric(/*0*/ x: kotlin.Any?): kotlin.Unit - Returns(WILDCARD) -> x is Generic - public fun referToAliasedSimpleType(/*0*/ x: kotlin.Any?): kotlin.Unit Returns(WILDCARD) -> x is Int public inline fun referToReifiedGeneric(/*0*/ x: kotlin.Any?): kotlin.Unit - Returns(WILDCARD) -> x is T - public fun referToSubstituted(/*0*/ x: kotlin.Any?): kotlin.Unit - Returns(WILDCARD) -> x is Generic - public fun referToSubstitutedWithStar(/*0*/ x: kotlin.Any?): kotlin.Unit Returns(WILDCARD) -> x is Generic<*> @@ -23,8 +15,6 @@ public final class Generic { public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public final fun referToCaptured(/*0*/ x: kotlin.Any?): kotlin.Unit - Returns(WILDCARD) -> x is T - public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } public typealias FunctionalType = () -> kotlin.Unit diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/unlabeledReceiver.txt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/unlabeledReceiver.txt index 8e4bd7ff902..80e341a5804 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/unlabeledReceiver.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/unlabeledReceiver.txt @@ -1,4 +1,3 @@ package public fun kotlin.Any?.foo(): kotlin.Boolean - Returns(TRUE) -> != null