From 8b4e8a2c0ce12c2c7b900af3efb5a67d7895ddaf Mon Sep 17 00:00:00 2001 From: Arsen Nagdalian Date: Sun, 16 Aug 2020 00:08:50 +0300 Subject: [PATCH] Diagnostics: add diagnostic for reporting contract description blocks in old frontend --- ...endDiagnosticsTestWithStdlibGenerated.java | 33 +++++++++++++++++++ .../resolve/PlatformConfiguratorBase.kt | 3 +- .../ContractDescriptionBlockChecker.kt | 25 ++++++++++++++ .../complexContractDescription.fir.kt | 24 ++++++++++++++ .../newSyntax/complexContractDescription.kt | 24 ++++++++++++++ .../newSyntax/complexContractDescription.txt | 4 +++ ...onelineFunctionsContractDescription.fir.kt | 10 ++++++ .../onelineFunctionsContractDescription.kt | 10 ++++++ .../onelineFunctionsContractDescription.txt | 4 +++ ...ropertyAccessorsContractDescription.fir.kt | 18 ++++++++++ .../propertyAccessorsContractDescription.kt | 18 ++++++++++ .../propertyAccessorsContractDescription.txt | 12 +++++++ .../simpleFunctionsContractDescription.fir.kt | 22 +++++++++++++ .../simpleFunctionsContractDescription.kt | 22 +++++++++++++ .../simpleFunctionsContractDescription.txt | 5 +++ .../DiagnosticsTestWithStdLibGenerated.java | 33 +++++++++++++++++++ ...ticsTestWithStdLibUsingJavacGenerated.java | 33 +++++++++++++++++++ 17 files changed, 299 insertions(+), 1 deletion(-) create mode 100644 compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ContractDescriptionBlockChecker.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/complexContractDescription.fir.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/complexContractDescription.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/complexContractDescription.txt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/onelineFunctionsContractDescription.fir.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/onelineFunctionsContractDescription.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/onelineFunctionsContractDescription.txt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/propertyAccessorsContractDescription.fir.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/propertyAccessorsContractDescription.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/propertyAccessorsContractDescription.txt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/simpleFunctionsContractDescription.fir.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/simpleFunctionsContractDescription.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/simpleFunctionsContractDescription.txt diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestWithStdlibGenerated.java b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestWithStdlibGenerated.java index a2115cf703d..f4bcfdb6bc4 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestWithStdlibGenerated.java +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestWithStdlibGenerated.java @@ -1370,6 +1370,39 @@ public class FirOldFrontendDiagnosticsTestWithStdlibGenerated extends AbstractFi } } + @TestMetadata("compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class NewSyntax extends AbstractFirOldFrontendDiagnosticsTestWithStdlib { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + public void testAllFilesPresentInNewSyntax() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); + } + + @TestMetadata("complexContractDescription.kt") + public void testComplexContractDescription() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/complexContractDescription.kt"); + } + + @TestMetadata("onelineFunctionsContractDescription.kt") + public void testOnelineFunctionsContractDescription() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/onelineFunctionsContractDescription.kt"); + } + + @TestMetadata("propertyAccessorsContractDescription.kt") + public void testPropertyAccessorsContractDescription() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/propertyAccessorsContractDescription.kt"); + } + + @TestMetadata("simpleFunctionsContractDescription.kt") + public void testSimpleFunctionsContractDescription() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/simpleFunctionsContractDescription.kt"); + } + } + @TestMetadata("compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/PlatformConfiguratorBase.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/PlatformConfiguratorBase.kt index a5ce145381d..2c816bc48ca 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/PlatformConfiguratorBase.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/PlatformConfiguratorBase.kt @@ -37,7 +37,8 @@ private val DEFAULT_DECLARATION_CHECKERS = listOf( TrailingCommaDeclarationChecker, MissingDependencySupertypeChecker.ForDeclarations, FunInterfaceDeclarationChecker(), - DeprecatedSinceKotlinAnnotationChecker + DeprecatedSinceKotlinAnnotationChecker, + ContractDescriptionBlockChecker ) private val DEFAULT_CALL_CHECKERS = listOf( diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ContractDescriptionBlockChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ContractDescriptionBlockChecker.kt new file mode 100644 index 00000000000..d5aa05d6d2f --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ContractDescriptionBlockChecker.kt @@ -0,0 +1,25 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.resolve.checkers + +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.psi.KtNamedFunction +import org.jetbrains.kotlin.psi.KtPropertyAccessor + +object ContractDescriptionBlockChecker: DeclarationChecker { + override fun check(declaration: KtDeclaration, descriptor: DeclarationDescriptor, context: DeclarationCheckerContext) { + val contractDescription = when (declaration) { + is KtNamedFunction -> declaration.contractDescription + is KtPropertyAccessor -> declaration.contractDescription + else -> null + } + if (contractDescription != null) { + context.trace.report(Errors.UNSUPPORTED.on(contractDescription, "Contract description blocks are not supported")) + } + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/complexContractDescription.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/complexContractDescription.fir.kt new file mode 100644 index 00000000000..a246f26be9c --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/complexContractDescription.fir.kt @@ -0,0 +1,24 @@ +// !DIAGNOSTICS: -UNUSED_VARIABLE + +import kotlin.contracts.* + +fun foo(arg: Any?, num: Int?, block: () -> Unit) contract [ + returns() implies (arg is String), + returns() implies (num != null), + callsInPlace(block, InvocationKind.EXACTLY_ONCE) +] { + require(arg is String) + require(num != null) + block() +} + +fun bar(arg: Any?, block: () -> Int): Boolean contract [ + returns(true) implies (arg != null), + callsInPlace(block, InvocationKind.EXACTLY_ONCE) +] { + val num = block() + if (arg != null) { + return true + } + return false +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/complexContractDescription.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/complexContractDescription.kt new file mode 100644 index 00000000000..e00f1b81189 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/complexContractDescription.kt @@ -0,0 +1,24 @@ +// !DIAGNOSTICS: -UNUSED_VARIABLE + +import kotlin.contracts.* + +fun foo(arg: Any?, num: Int?, block: () -> Unit) contract [ + returns() implies (arg is String), + returns() implies (num != null), + callsInPlace(block, InvocationKind.EXACTLY_ONCE) +] { + require(arg is String) + require(num != null) + block() +} + +fun bar(arg: Any?, block: () -> Int): Boolean contract [ + returns(true) implies (arg != null), + callsInPlace(block, InvocationKind.EXACTLY_ONCE) +] { + val num = block() + if (arg != null) { + return true + } + return false +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/complexContractDescription.txt b/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/complexContractDescription.txt new file mode 100644 index 00000000000..145584996be --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/complexContractDescription.txt @@ -0,0 +1,4 @@ +package + +public fun bar(/*0*/ arg: kotlin.Any?, /*1*/ block: () -> kotlin.Int): kotlin.Boolean +public fun foo(/*0*/ arg: kotlin.Any?, /*1*/ num: kotlin.Int?, /*2*/ block: () -> kotlin.Unit): kotlin.Unit diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/onelineFunctionsContractDescription.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/onelineFunctionsContractDescription.fir.kt new file mode 100644 index 00000000000..54f63ba0994 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/onelineFunctionsContractDescription.fir.kt @@ -0,0 +1,10 @@ +import kotlin.contracts.* + +fun calculateNumber(block: () -> Int): Int contract [ + callsInPlace(block, InvocationKind.EXACTLY_ONCE) +] = block() + +fun calculateResult(num: Int?, calculate: (Int?) -> R): R contract [ + callsInPlace(calculate, InvocationKind.EXACTLY_ONCE), + returns() implies (num != null) +] = calculate(num) \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/onelineFunctionsContractDescription.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/onelineFunctionsContractDescription.kt new file mode 100644 index 00000000000..17454298331 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/onelineFunctionsContractDescription.kt @@ -0,0 +1,10 @@ +import kotlin.contracts.* + +fun calculateNumber(block: () -> Int): Int contract [ + callsInPlace(block, InvocationKind.EXACTLY_ONCE) +] = block() + +fun calculateResult(num: Int?, calculate: (Int?) -> R): R contract [ + callsInPlace(calculate, InvocationKind.EXACTLY_ONCE), + returns() implies (num != null) +] = calculate(num) \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/onelineFunctionsContractDescription.txt b/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/onelineFunctionsContractDescription.txt new file mode 100644 index 00000000000..b65e152f501 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/onelineFunctionsContractDescription.txt @@ -0,0 +1,4 @@ +package + +public fun calculateNumber(/*0*/ block: () -> kotlin.Int): kotlin.Int +public fun calculateResult(/*0*/ num: kotlin.Int?, /*1*/ calculate: (kotlin.Int?) -> R): R diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/propertyAccessorsContractDescription.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/propertyAccessorsContractDescription.fir.kt new file mode 100644 index 00000000000..a6146426367 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/propertyAccessorsContractDescription.fir.kt @@ -0,0 +1,18 @@ +import kotlin.contracts.* + +class A { + var x: Int = 0 + get() = f(x) + set(value) contract [returns() implies (value != null)] { + field = value + 1 + } + + var y: Double = 0.0 + get() = g(y) + set(value) contract [returns() implies (value != null)] { + field = value * 2 + } + + fun f(arg: Int) = arg * arg + fun g(arg: Double) = arg / 2 +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/propertyAccessorsContractDescription.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/propertyAccessorsContractDescription.kt new file mode 100644 index 00000000000..dde7ca59955 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/propertyAccessorsContractDescription.kt @@ -0,0 +1,18 @@ +import kotlin.contracts.* + +class A { + var x: Int = 0 + get() = f(x) + set(value) contract [returns() implies (value != null)] { + field = value + 1 + } + + var y: Double = 0.0 + get() = g(y) + set(value) contract [returns() implies (value != null)] { + field = value * 2 + } + + fun f(arg: Int) = arg * arg + fun g(arg: Double) = arg / 2 +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/propertyAccessorsContractDescription.txt b/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/propertyAccessorsContractDescription.txt new file mode 100644 index 00000000000..f6cd9163a68 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/propertyAccessorsContractDescription.txt @@ -0,0 +1,12 @@ +package + +public final class A { + public constructor A() + public final var x: kotlin.Int + public final var y: kotlin.Double + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final fun f(/*0*/ arg: kotlin.Int): kotlin.Int + public final fun g(/*0*/ arg: kotlin.Double): kotlin.Double + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/simpleFunctionsContractDescription.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/simpleFunctionsContractDescription.fir.kt new file mode 100644 index 00000000000..a98423998b9 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/simpleFunctionsContractDescription.fir.kt @@ -0,0 +1,22 @@ +import kotlin.contracts.* + +fun printStr(str: String?) contract [ + returns() implies (str != null) +] { + require(str != null) + println(str) +} + +fun callExactlyOnce(block: () -> Int) contract [ + callsInPlace(block, InvocationKind.EXACTLY_ONCE) +] { + val num = block() + println(num) +} + +fun calculateNumber(block: () -> Int): Int contract [ + callsInPlace(block, InvocationKind.EXACTLY_ONCE) +] { + val num = block() + return num +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/simpleFunctionsContractDescription.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/simpleFunctionsContractDescription.kt new file mode 100644 index 00000000000..0859f8ca8a0 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/simpleFunctionsContractDescription.kt @@ -0,0 +1,22 @@ +import kotlin.contracts.* + +fun printStr(str: String?) contract [ + returns() implies (str != null) +] { + require(str != null) + println(str) +} + +fun callExactlyOnce(block: () -> Int) contract [ + callsInPlace(block, InvocationKind.EXACTLY_ONCE) +] { + val num = block() + println(num) +} + +fun calculateNumber(block: () -> Int): Int contract [ + callsInPlace(block, InvocationKind.EXACTLY_ONCE) +] { + val num = block() + return num +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/simpleFunctionsContractDescription.txt b/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/simpleFunctionsContractDescription.txt new file mode 100644 index 00000000000..893f6d00f34 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/simpleFunctionsContractDescription.txt @@ -0,0 +1,5 @@ +package + +public fun calculateNumber(/*0*/ block: () -> kotlin.Int): kotlin.Int +public fun callExactlyOnce(/*0*/ block: () -> kotlin.Int): kotlin.Unit +public fun printStr(/*0*/ str: kotlin.String?): kotlin.Unit diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java index 5b90d4d9219..9e643ad5a76 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java @@ -1370,6 +1370,39 @@ public class DiagnosticsTestWithStdLibGenerated extends AbstractDiagnosticsTestW } } + @TestMetadata("compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class NewSyntax extends AbstractDiagnosticsTestWithStdLib { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + public void testAllFilesPresentInNewSyntax() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); + } + + @TestMetadata("complexContractDescription.kt") + public void testComplexContractDescription() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/complexContractDescription.kt"); + } + + @TestMetadata("onelineFunctionsContractDescription.kt") + public void testOnelineFunctionsContractDescription() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/onelineFunctionsContractDescription.kt"); + } + + @TestMetadata("propertyAccessorsContractDescription.kt") + public void testPropertyAccessorsContractDescription() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/propertyAccessorsContractDescription.kt"); + } + + @TestMetadata("simpleFunctionsContractDescription.kt") + public void testSimpleFunctionsContractDescription() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/simpleFunctionsContractDescription.kt"); + } + } + @TestMetadata("compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java index d8ebbe3c84c..c73448769a2 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java @@ -1370,6 +1370,39 @@ public class DiagnosticsTestWithStdLibUsingJavacGenerated extends AbstractDiagno } } + @TestMetadata("compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class NewSyntax extends AbstractDiagnosticsTestWithStdLibUsingJavac { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + public void testAllFilesPresentInNewSyntax() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); + } + + @TestMetadata("complexContractDescription.kt") + public void testComplexContractDescription() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/complexContractDescription.kt"); + } + + @TestMetadata("onelineFunctionsContractDescription.kt") + public void testOnelineFunctionsContractDescription() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/onelineFunctionsContractDescription.kt"); + } + + @TestMetadata("propertyAccessorsContractDescription.kt") + public void testPropertyAccessorsContractDescription() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/propertyAccessorsContractDescription.kt"); + } + + @TestMetadata("simpleFunctionsContractDescription.kt") + public void testSimpleFunctionsContractDescription() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/newSyntax/simpleFunctionsContractDescription.kt"); + } + } + @TestMetadata("compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)