diff --git a/compiler/visualizer/testData/rawBuilder/declarations/constructorOfAnonymousObject.kt b/compiler/visualizer/testData/rawBuilder/declarations/constructorOfAnonymousObject.kt new file mode 100644 index 00000000000..410ede1f27a --- /dev/null +++ b/compiler/visualizer/testData/rawBuilder/declarations/constructorOfAnonymousObject.kt @@ -0,0 +1,31 @@ +private fun resolveAccessorCall( +// [ERROR : PropertyDescriptor] +// │ + suspendPropertyDescriptor: PropertyDescriptor, +// [ERROR : TranslationContext] +// │ + context: TranslationContext +// [ERROR : ResolvedCall]<[ERROR : PropertyDescriptor]> +// │ [ERROR : PropertyDescriptor] +// │ │ +): ResolvedCall { +// [ERROR : ResolvedCall]<[ERROR : PropertyDescriptor]> +// │ [ERROR : PropertyDescriptor] +// │ │ + return object : ResolvedCall { +// [ERROR : ] +// │ [ERROR: not resolved] +// │ │ [ERROR: not resolved] +// │ │ │ + override fun getStatus() = ResolutionStatus.SUCCESS + +// [ERROR : PropertyDescriptor] +// │ resolveAccessorCall.suspendPropertyDescriptor: [ERROR : PropertyDescriptor] +// │ │ + override fun getCandidateDescriptor() = suspendPropertyDescriptor +// [ERROR : PropertyDescriptor] +// │ resolveAccessorCall.suspendPropertyDescriptor: [ERROR : PropertyDescriptor] +// │ │ + override fun getResultingDescriptor() = suspendPropertyDescriptor + } +} diff --git a/compiler/visualizer/testData/rawBuilder/declarations/contracts/newSyntax/functionWithBothOldAndNewSyntaxContractDescription.kt b/compiler/visualizer/testData/rawBuilder/declarations/contracts/newSyntax/functionWithBothOldAndNewSyntaxContractDescription.kt new file mode 100644 index 00000000000..e54eb003283 --- /dev/null +++ b/compiler/visualizer/testData/rawBuilder/declarations/contracts/newSyntax/functionWithBothOldAndNewSyntaxContractDescription.kt @@ -0,0 +1,16 @@ +fun test1(s: String?) contract [returnsNotNull()] { +// [ERROR: not resolved] +// │ + contract { +// [ERROR: not resolved] +// │ [ERROR: not resolved] +// │ │ test1.s: String? +// │ │ │ fun (Any).equals(Any?): Boolean +// │ │ │ │ Nothing? +// │ │ │ │ │ + returns() implies (s != null) + } +// fun test1(String?): Unit +// │ + test1() +} diff --git a/compiler/visualizer/testData/rawBuilder/declarations/contracts/newSyntax/propertyAccessorsContractDescription.kt b/compiler/visualizer/testData/rawBuilder/declarations/contracts/newSyntax/propertyAccessorsContractDescription.kt new file mode 100644 index 00000000000..dbba1f57899 --- /dev/null +++ b/compiler/visualizer/testData/rawBuilder/declarations/contracts/newSyntax/propertyAccessorsContractDescription.kt @@ -0,0 +1,59 @@ +// new contracts syntax for property accessors +class MyClass { +// Int Int +// │ │ + var myInt: Int = 0 +// Int +// │ + get() contract [returnsNotNull()] = 1 +// Int +// │ + set(value) { +// var MyClass..field: Int +// │ MyClass..value: Int +// │ │ fun (Int).times(Int): Int +// │ │ │ Int +// │ │ │ │ + field = value * 10 + } +} + +class AnotherClass(multiplier: Int) { +// Int Int +// │ │ + var anotherInt: Int = 0 +// Int +// │ + get() contract [returnsNotNull()] = 1 +// Int +// │ + set(value) contract [returns()] { +// var AnotherClass..field: Int +// │ AnotherClass..value: Int +// │ │ [ERROR: not resolved] +// │ │ │ [ERROR: not resolved] +// │ │ │ │ + field = value * multiplier + } +} + +class SomeClass(multiplier: Int?) { +// Int Int +// │ │ + var someInt: Int = 0 +// Int +// │ + get() contract [returnsNotNull()] = 1 +// Int [ERROR: unknown type] +// │ │ + set(value) contract [returns() implies (value != null)] { +// SomeClass..value: Int +// │ [ERROR: not resolved] +// │ │ + value ?: throw NullArgumentException() +// var SomeClass..field: Int +// │ SomeClass..value: Int +// │ │ + field = value + } +} diff --git a/compiler/visualizer/testData/rawBuilder/declarations/contracts/newSyntax/simpleFunctionsContractDescription.kt b/compiler/visualizer/testData/rawBuilder/declarations/contracts/newSyntax/simpleFunctionsContractDescription.kt new file mode 100644 index 00000000000..1512330e062 --- /dev/null +++ b/compiler/visualizer/testData/rawBuilder/declarations/contracts/newSyntax/simpleFunctionsContractDescription.kt @@ -0,0 +1,14 @@ +// new contracts syntax for simple functions +// [ERROR : MyClass]? [ERROR: unknown type] [ERROR: unknown type] +// │ │ │ +fun test1(s: MyClass?) contract [returns() implies (s != null), returns() implies (s is MySubClass)] { +// [ERROR: not resolved] +// │ + test_1() +} + +fun test2() contract [returnsNotNull()] { +// fun test2(): Unit +// │ + test2() +} diff --git a/compiler/visualizer/testData/rawBuilder/declarations/contracts/oldSyntax/contractDescription.kt b/compiler/visualizer/testData/rawBuilder/declarations/contracts/oldSyntax/contractDescription.kt new file mode 100644 index 00000000000..195513d4bed --- /dev/null +++ b/compiler/visualizer/testData/rawBuilder/declarations/contracts/oldSyntax/contractDescription.kt @@ -0,0 +1,125 @@ +// Should have raw description +fun test_1() { +// [ERROR: not resolved] +// │ + contract { +// [ERROR: not resolved] +// │ + callsInPlace() + } +// fun test_1(): Unit +// │ + test_1() +} + +fun test_2() { +// fun contracts/contract(contracts/ContractBuilder.() -> Unit): Unit +// package kotlin │ contract@0 +// │ │ │ + kotlin.contracts.contract { +// this@0 +// fun (contracts/ContractBuilder).callsInPlace(Function, contracts/InvocationKind = ...): contracts/CallsInPlace +// │ + callsInPlace() +// this@0 +// fun (contracts/ContractBuilder).callsInPlace(Function, contracts/InvocationKind = ...): contracts/CallsInPlace +// │ + callsInPlace() + } +// fun test_2(): Unit +// │ + test_2() +} + +// Int Int +// │ │ +var test_3: Int = 1 + get() { +// [ERROR: not resolved] +// │ + contract { +// [ERROR: not resolved] +// │ + callsInPlace() + } +// Int +// │ + return 1 + } +// Int +// │ + set(value) { +// fun contracts/contract(contracts/ContractBuilder.() -> Unit): Unit +// package kotlin │ contract@0 +// │ │ │ + kotlin.contracts.contract { +// this@0 +// fun (contracts/ContractBuilder).callsInPlace(Function, contracts/InvocationKind = ...): contracts/CallsInPlace +// │ + callsInPlace() +// this@0 +// fun (contracts/ContractBuilder).callsInPlace(Function, contracts/InvocationKind = ...): contracts/CallsInPlace +// │ + callsInPlace() + } + } + +fun test_4() { +// [ERROR: not resolved] +// │ + contract() +// fun test_4(): Unit +// │ + test_4() +} + +// should not have raw description + +fun test_5() { +// fun test_5(): Unit +// │ + test_5() +// [ERROR: not resolved] +// │ + contract() +} + +fun test_6() { +// [ERROR: not resolved] +// │ [ERROR: not resolved] +// │ │ [ERROR: not resolved] +// │ │ │ [ERROR: not resolved] +// │ │ │ │ + aaa.bbb.ccc.contract { + + } +// fun test_6(): Unit +// │ + test_6() +} + +fun test_7() { +// [ERROR: not resolved] +// │ [ERROR: not resolved] +// │ │ + contracts.contract { + + } +// fun test_7(): Unit +// │ + test_7() +} + +fun test_8() { +// [ERROR: not resolved] +// │ [ERROR: not resolved] +// │ │ [ERROR: not resolved] +// │ │ │ [ERROR: not resolved] +// │ │ │ │ + aaa.kotlin.contracts.contract { + + } +// fun test_8(): Unit +// │ + test_8() +} diff --git a/compiler/visualizer/testData/rawBuilder/declarations/delegates.kt b/compiler/visualizer/testData/rawBuilder/declarations/delegates.kt new file mode 100644 index 00000000000..ba49ed45f46 --- /dev/null +++ b/compiler/visualizer/testData/rawBuilder/declarations/delegates.kt @@ -0,0 +1,35 @@ +// package kotlin +// │ +import kotlin.properties.ReadWriteProperty +// package kotlin +// │ +import kotlin.reflect.KProperty + +// fun lazy(() -> Int): Lazy +// │ Int +// │ │ fun (Int).plus(Int): Int +// Int │ │ │ Int +// │ │ │ │ │ +val x: Int by lazy { 1 + 2 } + +// properties/ReadWriteProperty +// │ properties/ReadWriteProperty +// │ │ +val delegate = object: ReadWriteProperty { +// reflect/KProperty<*> +// │ Int +// │ │ Int +// │ │ │ + override fun getValue(thisRef: Any?, property: KProperty<*>): Int = 1 +// reflect/KProperty<*> +// │ + override fun setValue(thisRef: Any?, property: KProperty<*>, value: Int) {} +} + +// Int val delegate: properties/ReadWriteProperty +// │ │ +val value by delegate + +// Int val delegate: properties/ReadWriteProperty +// │ │ +var variable by delegate diff --git a/compiler/visualizer/testData/rawBuilder/declarations/emptyAnonymousObject.kt b/compiler/visualizer/testData/rawBuilder/declarations/emptyAnonymousObject.kt new file mode 100644 index 00000000000..e953dfe949b --- /dev/null +++ b/compiler/visualizer/testData/rawBuilder/declarations/emptyAnonymousObject.kt @@ -0,0 +1,5 @@ +fun test() { +// test. +// │ + val x = object {} +} diff --git a/compiler/visualizer/testData/rawBuilder/declarations/enums.kt b/compiler/visualizer/testData/rawBuilder/declarations/enums.kt index 0a4a4e27d7b..0c682e94744 100644 --- a/compiler/visualizer/testData/rawBuilder/declarations/enums.kt +++ b/compiler/visualizer/testData/rawBuilder/declarations/enums.kt @@ -61,3 +61,22 @@ enum class Planet(val m: Double, internal val r: Double) { const val G = 6.67e-11 } } + +enum class PseudoInsn(val signature: String = "()V") { + FIX_STACK_BEFORE_JUMP, +// constructor PseudoInsn(String = ...) +// │ + FAKE_ALWAYS_TRUE_IFEQ("()I"), +// constructor PseudoInsn(String = ...) +// │ + FAKE_ALWAYS_FALSE_IFEQ("()I"), + SAVE_STACK_BEFORE_TRY, + RESTORE_STACK_IN_TRY_CATCH, + STORE_NOT_NULL, +// constructor PseudoInsn(String = ...) +// │ + AS_NOT_NULL("(Ljava/lang/Object;)Ljava/lang/Object;") + ; + + fun emit() {} +} diff --git a/compiler/visualizer/testData/rawBuilder/declarations/external.kt b/compiler/visualizer/testData/rawBuilder/declarations/external.kt new file mode 100644 index 00000000000..0750ce02f38 --- /dev/null +++ b/compiler/visualizer/testData/rawBuilder/declarations/external.kt @@ -0,0 +1,24 @@ +external class External + +external fun foo(): String + +// Int +// │ +external val x: Int + +class NotExternal { + external fun bar(): String +// Int +// │ + var y: Int + external get +// Int +// │ + set(value) {} +} + +// Int +// │ +var z: Int + external get + external set diff --git a/compiler/visualizer/testData/rawBuilder/declarations/genericFunctions.kt b/compiler/visualizer/testData/rawBuilder/declarations/genericFunctions.kt index 6f073ecabb5..95b9f2f9366 100644 --- a/compiler/visualizer/testData/rawBuilder/declarations/genericFunctions.kt +++ b/compiler/visualizer/testData/rawBuilder/declarations/genericFunctions.kt @@ -1,5 +1,4 @@ // FIR_IGNORE - interface Any // T? diff --git a/compiler/visualizer/testData/rawBuilder/expressions/callableReferences.kt b/compiler/visualizer/testData/rawBuilder/expressions/callableReferences.kt index 5f1a5b94b43..38501462e52 100644 --- a/compiler/visualizer/testData/rawBuilder/expressions/callableReferences.kt +++ b/compiler/visualizer/testData/rawBuilder/expressions/callableReferences.kt @@ -50,3 +50,9 @@ val test6 = A::qux // │ fun baz(): Unit // │ │ val test7 = ::baz + +// reflect/KFunction1 +// │ class A +// │ │ fun (A).foo(): Unit +// │ │ │ +val test8 = A?::foo diff --git a/compiler/visualizer/testData/rawBuilder/expressions/destructuring.kt b/compiler/visualizer/testData/rawBuilder/expressions/destructuring.kt index 72be851fb05..4e9b0e06b9b 100644 --- a/compiler/visualizer/testData/rawBuilder/expressions/destructuring.kt +++ b/compiler/visualizer/testData/rawBuilder/expressions/destructuring.kt @@ -21,3 +21,11 @@ fun foo(some: Some) { // │ z = "" } + +fun bar(some: Some) { +// Int +// │ Double +// │ │ String bar.some: Some +// │ │ │ │ + val (a, _, `_`) = some +} diff --git a/compiler/visualizer/testData/rawBuilder/expressions/for.kt b/compiler/visualizer/testData/rawBuilder/expressions/for.kt index a3c29268217..863942ca407 100644 --- a/compiler/visualizer/testData/rawBuilder/expressions/for.kt +++ b/compiler/visualizer/testData/rawBuilder/expressions/for.kt @@ -12,6 +12,31 @@ fun foo() { } } +fun fooLabeled() { +// fun io/println(Any?): Unit +// │ + println("!!!") +// Int +// │fun (Int).rangeTo(Int): ranges/IntRange +// Int ││ Int +// │ ││ │ + label@ for (i in 1..10) { +// Unit +// │ val fooLabeled.i: Int +// │ │ fun (Any).equals(Any?): Boolean +// │ │ │ Int +// │ │ │ │ + if (i == 5) continue@label +// fun io/println(Int): Unit +// │ val fooLabeled.i: Int +// │ │ + println(i) + } +// fun io/println(Any?): Unit +// │ + println("!!!") +} + // collections/List // │ fun bar(list: List) { @@ -50,3 +75,16 @@ fun baz(set: Set) { println("x = $x y = $y") } } + +// collections/List +// │ +fun withParameter(list: List) { +// Some withParameter.list: collections/List +// │ │ + for (s: Some in list) { +// fun io/println(Any?): Unit +// │ val withParameter.s: Some +// │ │ + println(s) + } +} diff --git a/compiler/visualizer/testData/rawBuilder/expressions/labelForInfix.kt b/compiler/visualizer/testData/rawBuilder/expressions/labelForInfix.kt new file mode 100644 index 00000000000..d88e4ca2edc --- /dev/null +++ b/compiler/visualizer/testData/rawBuilder/expressions/labelForInfix.kt @@ -0,0 +1,7 @@ +fun main() { +// [ERROR: not resolved] +// │ [ERROR: not resolved] +// │ │ [ERROR: not resolved] +// │ │ │ + { length } foo { bar() } +} diff --git a/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/AbstractVisualizer.kt b/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/AbstractVisualizer.kt index ba0d20c2634..9b5234027d7 100644 --- a/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/AbstractVisualizer.kt +++ b/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/AbstractVisualizer.kt @@ -43,26 +43,32 @@ abstract class AbstractVisualizer : AbstractKotlinCompilerTest() { forTestsMatching("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/*") { defaultDirectives { - VisualizerDirectives.EXPECTED_FILE_PATH with "compiler/visualizer/testData/rawBuilder/declarations" + VisualizerDirectives.TEST_FILE_PATH with "fir/raw-fir/psi2fir" + VisualizerDirectives.EXPECTED_FILE_PATH with "visualizer" } } forTestsMatching("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/*") { defaultDirectives { - VisualizerDirectives.EXPECTED_FILE_PATH with "compiler/visualizer/testData/rawBuilder/expressions" + VisualizerDirectives.TEST_FILE_PATH with "fir/raw-fir/psi2fir" + VisualizerDirectives.EXPECTED_FILE_PATH with "visualizer" } } forTestsMatching("compiler/visualizer/testData/uncommonCases/*") { defaultDirectives { - VisualizerDirectives.EXPECTED_FILE_PATH with "compiler/visualizer/testData/uncommonCases/resultFiles" + VisualizerDirectives.TEST_FILE_PATH with "uncommonCases/testFiles" + VisualizerDirectives.EXPECTED_FILE_PATH with "uncommonCases/resultFiles" } } } } internal object VisualizerDirectives : SimpleDirectivesContainer() { + val TEST_FILE_PATH by stringDirective( + description = "Specify that part of test file path must be replaced with EXPECTED_FILE_PATH" + ) val EXPECTED_FILE_PATH by stringDirective( - description = "Specify the path to expected result file" + description = "Specify the path to expected result file that will be inserted instead of TEST_FILE_PATH" ) } \ No newline at end of file diff --git a/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/fir/AbstractFirVisualizer.kt b/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/fir/AbstractFirVisualizer.kt index 71b951b1acb..be4fa40f55c 100644 --- a/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/fir/AbstractFirVisualizer.kt +++ b/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/fir/AbstractFirVisualizer.kt @@ -28,9 +28,10 @@ abstract class AbstractFirVisualizer : AbstractVisualizer() { val renderer = FirVisualizer(info.firFiles.values.first()) val firRenderResult = renderer.render() - val fileName = info.firFiles.keys.first().name - val expectedPath = it.defaultDirectives.get(VisualizerDirectives.EXPECTED_FILE_PATH).first() + "/$fileName" - val expectedText = File(expectedPath).readLines() + val replaceFrom = it.defaultDirectives[VisualizerDirectives.TEST_FILE_PATH].first() + val replaceTo = it.defaultDirectives[VisualizerDirectives.EXPECTED_FILE_PATH].first() + val path = info.firFiles.keys.first().originalFile.absolutePath.replace(replaceFrom, replaceTo) + val expectedText = File(path).readLines() if (expectedText[0].startsWith("// FIR_IGNORE")) { Assert.assertFalse( "Files are identical, please delete ignore directive", @@ -38,7 +39,7 @@ abstract class AbstractFirVisualizer : AbstractVisualizer() { ) return } - KotlinTestUtils.assertEqualsToFile(File(expectedPath), firRenderResult) { + KotlinTestUtils.assertEqualsToFile(File(path), firRenderResult) { return@assertEqualsToFile it.replace("// FIR_IGNORE\n", "") } } diff --git a/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/psi/AbstractPsiVisualizer.kt b/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/psi/AbstractPsiVisualizer.kt index 737acaae70a..08554cde603 100644 --- a/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/psi/AbstractPsiVisualizer.kt +++ b/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/psi/AbstractPsiVisualizer.kt @@ -27,9 +27,10 @@ abstract class AbstractPsiVisualizer : AbstractVisualizer() { val renderer = PsiVisualizer(info.ktFiles.values.first(), info.analysisResult) val psiRenderResult = renderer.render() - val fileName = info.ktFiles.keys.first().name - val expectedPath = it.defaultDirectives.get(VisualizerDirectives.EXPECTED_FILE_PATH).first() + "/$fileName" - KotlinTestUtils.assertEqualsToFile(File(expectedPath), psiRenderResult) { + val replaceFrom = it.defaultDirectives[VisualizerDirectives.TEST_FILE_PATH].first() + val replaceTo = it.defaultDirectives[VisualizerDirectives.EXPECTED_FILE_PATH].first() + val path = info.ktFiles.keys.first().originalFile.absolutePath.replace(replaceFrom, replaceTo) + KotlinTestUtils.assertEqualsToFile(File(path), psiRenderResult) { return@assertEqualsToFile it.replace("// FIR_IGNORE\n", "") } }