diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt index 3c3f304e392..f700e8fbe82 100644 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt @@ -434,30 +434,43 @@ class ExpressionsConverter( val firTypeArguments = mutableListOf() val valueArguments = mutableListOf() var additionalArgument: FirExpression? = null + var hasArguments = false callSuffix.forEachChildren { when (it.tokenType) { REFERENCE_EXPRESSION -> name = it.asText TYPE_ARGUMENT_LIST -> firTypeArguments += declarationsConverter.convertTypeArguments(it) - VALUE_ARGUMENT_LIST, LAMBDA_ARGUMENT -> valueArguments += it + VALUE_ARGUMENT_LIST, LAMBDA_ARGUMENT -> { + hasArguments = true + valueArguments += it + } else -> if (it.tokenType != TokenType.ERROR_ELEMENT) additionalArgument = getAsFirExpression(it, "Incorrect invoke receiver") } } - return FirFunctionCallImpl(null).apply { - this.calleeReference = when { - name != null -> FirSimpleNamedReference(null, name.nameAsSafeName(), null) - additionalArgument != null -> { - explicitReceiver = additionalArgument!! - FirSimpleNamedReference(null, OperatorNameConventions.INVOKE, null) - } - else -> FirErrorNamedReferenceImpl(null, FirSimpleDiagnostic("Call has no callee", DiagnosticKind.Syntax)) + val (calleeReference, explicitReceiver) = when { + name != null -> FirSimpleNamedReference(null, name.nameAsSafeName(), null) to null + additionalArgument != null -> { + FirSimpleNamedReference(null, OperatorNameConventions.INVOKE, null) to additionalArgument!! } + else -> FirErrorNamedReferenceImpl(null, FirSimpleDiagnostic("Call has no callee", DiagnosticKind.Syntax)) to null + } - context.firFunctionCalls += this - this.extractArgumentsFrom(valueArguments.flatMap { convertValueArguments(it) }, stubMode) + return if (hasArguments) { + FirFunctionCallImpl(null).apply { + this.calleeReference = calleeReference + + context.firFunctionCalls += this + this.extractArgumentsFrom(valueArguments.flatMap { convertValueArguments(it) }, stubMode) + context.firFunctionCalls.removeLast() + } + } else { + FirQualifiedAccessExpressionImpl(null).apply { + this.calleeReference = calleeReference + } + }.apply { + this.explicitReceiver = explicitReceiver typeArguments += firTypeArguments - context.firFunctionCalls.removeLast() } } diff --git a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 788128ba73d..9357274a631 100644 --- a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -1234,28 +1234,39 @@ class RawFirBuilder(session: FirSession, val stubMode: Boolean) : BaseFirBuilder override fun visitCallExpression(expression: KtCallExpression, data: Unit): FirElement { val calleeExpression = expression.calleeExpression val source = expression.toFirSourceElement() - return FirFunctionCallImpl(source).apply { - val calleeReference = when (calleeExpression) { - is KtSimpleNameExpression -> FirSimpleNamedReference( - calleeExpression.toFirSourceElement(), calleeExpression.getReferencedNameAsName(), null - ) - null -> FirErrorNamedReferenceImpl( - null, FirSimpleDiagnostic("Call has no callee", DiagnosticKind.Syntax) - ) - else -> { - explicitReceiver = calleeExpression.toFirExpression("Incorrect invoke receiver") - FirSimpleNamedReference( - source, OperatorNameConventions.INVOKE, null - ) - } + + val (calleeReference, explicitReceiver) = when (calleeExpression) { + is KtSimpleNameExpression -> FirSimpleNamedReference( + calleeExpression.toFirSourceElement(), calleeExpression.getReferencedNameAsName(), null + ) to null + null -> FirErrorNamedReferenceImpl( + null, FirSimpleDiagnostic("Call has no callee", DiagnosticKind.Syntax) + ) to null + else -> { + FirSimpleNamedReference( + source, OperatorNameConventions.INVOKE, null + ) to calleeExpression.toFirExpression("Incorrect invoke receiver") } - this.calleeReference = calleeReference - context.firFunctionCalls += this - expression.extractArgumentsTo(this) + } + + val result = if (expression.valueArgumentList == null && expression.lambdaArguments.isEmpty()) { + FirQualifiedAccessExpressionImpl(source).apply { + this.calleeReference = calleeReference + } + } else { + FirFunctionCallImpl(source).apply { + this.calleeReference = calleeReference + context.firFunctionCalls += this + expression.extractArgumentsTo(this) + context.firFunctionCalls.removeLast() + } + } + + return result.apply { + this.explicitReceiver = explicitReceiver for (typeArgument in expression.typeArguments) { typeArguments += typeArgument.convert() } - context.firFunctionCalls.removeLast() } } diff --git a/compiler/fir/psi2fir/testData/rawBuilder/expressions/qualifierWithTypeArguments.kt b/compiler/fir/psi2fir/testData/rawBuilder/expressions/qualifierWithTypeArguments.kt new file mode 100644 index 00000000000..91a86a0f8d6 --- /dev/null +++ b/compiler/fir/psi2fir/testData/rawBuilder/expressions/qualifierWithTypeArguments.kt @@ -0,0 +1,3 @@ +fun test() { + Array::class +} \ No newline at end of file diff --git a/compiler/fir/psi2fir/testData/rawBuilder/expressions/qualifierWithTypeArguments.txt b/compiler/fir/psi2fir/testData/rawBuilder/expressions/qualifierWithTypeArguments.txt new file mode 100644 index 00000000000..8c7ed301572 --- /dev/null +++ b/compiler/fir/psi2fir/testData/rawBuilder/expressions/qualifierWithTypeArguments.txt @@ -0,0 +1,4 @@ +FILE: qualifierWithTypeArguments.kt + public? final? fun test(): R|kotlin/Unit| { + (Array#) + } diff --git a/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/RawFirBuilderTestCaseGenerated.java b/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/RawFirBuilderTestCaseGenerated.java index a5f1c040141..d8e41e04007 100644 --- a/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/RawFirBuilderTestCaseGenerated.java +++ b/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/RawFirBuilderTestCaseGenerated.java @@ -248,6 +248,11 @@ public class RawFirBuilderTestCaseGenerated extends AbstractRawFirBuilderTestCas runTest("compiler/fir/psi2fir/testData/rawBuilder/expressions/nullability.kt"); } + @TestMetadata("qualifierWithTypeArguments.kt") + public void testQualifierWithTypeArguments() throws Exception { + runTest("compiler/fir/psi2fir/testData/rawBuilder/expressions/qualifierWithTypeArguments.kt"); + } + @TestMetadata("simpleReturns.kt") public void testSimpleReturns() throws Exception { runTest("compiler/fir/psi2fir/testData/rawBuilder/expressions/simpleReturns.kt"); diff --git a/compiler/fir/resolve/testData/resolve/cfg/complex.dot b/compiler/fir/resolve/testData/resolve/cfg/complex.dot index c9aa69b9756..31f9a629d59 100644 --- a/compiler/fir/resolve/testData/resolve/cfg/complex.dot +++ b/compiler/fir/resolve/testData/resolve/cfg/complex.dot @@ -29,7 +29,7 @@ digraph complex_kt { 15 [label="Access variable R|/url|"]; 16 [label="Function call: #.#(R|/url|)"]; 17 [label="Function call: #.#(R|/url|).#( = connect@fun (): { - #().#().#(#.#.#(), (#()).#) + #().#().#(#.#.#(), (Q|kotlin/Array|).R|kotlin/jvm/java|) } )"]; 18 [label="Exit block"]; @@ -144,12 +144,11 @@ digraph complex_kt { 53 [label="Access variable #"]; 54 [label="Access variable #"]; 55 [label="Function call: #.#.#()"]; - 56 [label="Function call: #()"]; - 57 [label="Access variable #"]; - 58 [label="Access variable #"]; - 59 [label="Access variable #"]; - 60 [label="Function call: #().#().#(#.#.#(), (#()).#)"]; - 61 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 56 [label="Access variable R|kotlin/jvm/java|"]; + 57 [label="Access variable R|kotlin/jvm/java|"]; + 58 [label="Access variable R|kotlin/jvm/java|"]; + 59 [label="Function call: #().#().#(#.#.#(), (Q|kotlin/Array|).R|kotlin/jvm/java|)"]; + 60 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; } 50 -> {51}; @@ -162,97 +161,96 @@ digraph complex_kt { 57 -> {58}; 58 -> {59}; 59 -> {60}; - 60 -> {61}; subgraph cluster_10 { color=red - 62 [label="Enter function close" style="filled" fillcolor=red]; - 63 [label="Exit function close" style="filled" fillcolor=red]; + 61 [label="Enter function close" style="filled" fillcolor=red]; + 62 [label="Exit function close" style="filled" fillcolor=red]; } - 62 -> {63}; + 61 -> {62}; subgraph cluster_11 { color=red - 64 [label="Enter function closeFinally" style="filled" fillcolor=red]; + 63 [label="Enter function closeFinally" style="filled" fillcolor=red]; subgraph cluster_12 { color=blue - 65 [label="Enter when"]; + 64 [label="Enter when"]; subgraph cluster_13 { color=blue - 66 [label="Enter when branch condition "]; - 67 [label="Access variable this@R|/closeFinally|"]; - 68 [label="Const: Null(null)"]; - 69 [label="Operator =="]; - 70 [label="Exit when branch condition"]; + 65 [label="Enter when branch condition "]; + 66 [label="Access variable this@R|/closeFinally|"]; + 67 [label="Const: Null(null)"]; + 68 [label="Operator =="]; + 69 [label="Exit when branch condition"]; } subgraph cluster_14 { color=blue - 71 [label="Enter when branch condition "]; - 72 [label="Access variable R|/cause|"]; - 73 [label="Const: Null(null)"]; - 74 [label="Operator =="]; - 75 [label="Exit when branch condition"]; + 70 [label="Enter when branch condition "]; + 71 [label="Access variable R|/cause|"]; + 72 [label="Const: Null(null)"]; + 73 [label="Operator =="]; + 74 [label="Exit when branch condition"]; } subgraph cluster_15 { color=blue - 76 [label="Enter when branch condition else"]; - 77 [label="Exit when branch condition"]; + 75 [label="Enter when branch condition else"]; + 76 [label="Exit when branch condition"]; } - 78 [label="Enter when branch result"]; + 77 [label="Enter when branch result"]; subgraph cluster_16 { color=blue - 79 [label="Enter block"]; + 78 [label="Enter block"]; subgraph cluster_17 { color=blue - 80 [label="Try expression enter"]; + 79 [label="Try expression enter"]; subgraph cluster_18 { color=blue - 81 [label="Try main block enter"]; + 80 [label="Try main block enter"]; subgraph cluster_19 { color=blue - 82 [label="Enter block"]; - 83 [label="Function call: this@R|/AutoCloseable|.R|/AutoCloseable.close|()"]; - 84 [label="Exit block"]; + 81 [label="Enter block"]; + 82 [label="Function call: this@R|/AutoCloseable|.R|/AutoCloseable.close|()"]; + 83 [label="Exit block"]; } - 85 [label="Try main block exit"]; + 84 [label="Try main block exit"]; } subgraph cluster_20 { color=blue - 86 [label="Catch enter"]; + 85 [label="Catch enter"]; subgraph cluster_21 { color=blue - 87 [label="Enter block"]; - 88 [label="Access variable R|/cause|"]; - 89 [label="Access variable R|/closeException|"]; - 90 [label="Function call: R|/cause|.R|kotlin/addSuppressed|(R|/closeException|)"]; - 91 [label="Exit block"]; + 86 [label="Enter block"]; + 87 [label="Access variable R|/cause|"]; + 88 [label="Access variable R|/closeException|"]; + 89 [label="Function call: R|/cause|.R|kotlin/addSuppressed|(R|/closeException|)"]; + 90 [label="Exit block"]; } - 92 [label="Catch exit"]; + 91 [label="Catch exit"]; } - 93 [label="Try expression exit"]; + 92 [label="Try expression exit"]; } - 94 [label="Exit block"]; + 93 [label="Exit block"]; } - 95 [label="Exit when branch result"]; - 96 [label="Enter when branch result"]; + 94 [label="Exit when branch result"]; + 95 [label="Enter when branch result"]; subgraph cluster_22 { color=blue - 97 [label="Enter block"]; - 98 [label="Function call: this@R|/AutoCloseable|.R|/AutoCloseable.close|()"]; - 99 [label="Exit block"]; + 96 [label="Enter block"]; + 97 [label="Function call: this@R|/AutoCloseable|.R|/AutoCloseable.close|()"]; + 98 [label="Exit block"]; } - 100 [label="Exit when branch result"]; - 101 [label="Enter when branch result"]; + 99 [label="Exit when branch result"]; + 100 [label="Enter when branch result"]; subgraph cluster_23 { color=blue - 102 [label="Enter block"]; - 103 [label="Exit block"]; + 101 [label="Enter block"]; + 102 [label="Exit block"]; } - 104 [label="Exit when branch result"]; - 105 [label="Exit when"]; + 103 [label="Exit when branch result"]; + 104 [label="Exit when"]; } - 106 [label="Jump: ^closeFinally when () { + 105 [label="Jump: ^closeFinally when () { ==(this@R|/closeFinally|, Null(null)) -> { } ==(R|/cause|, Null(null)) -> { @@ -269,33 +267,34 @@ digraph complex_kt { } } "]; - 107 [label="Stub" style="filled" fillcolor=gray]; - 108 [label="Exit function closeFinally" style="filled" fillcolor=red]; + 106 [label="Stub" style="filled" fillcolor=gray]; + 107 [label="Exit function closeFinally" style="filled" fillcolor=red]; } + 63 -> {64}; 64 -> {65}; 65 -> {66}; 66 -> {67}; 67 -> {68}; 68 -> {69}; - 69 -> {70}; - 70 -> {101 71}; + 69 -> {100 70}; + 70 -> {71}; 71 -> {72}; 72 -> {73}; 73 -> {74}; - 74 -> {75}; - 75 -> {96 76}; + 74 -> {95 75}; + 75 -> {76}; 76 -> {77}; 77 -> {78}; 78 -> {79}; 79 -> {80}; - 80 -> {81}; - 81 -> {108 86 82}; + 80 -> {107 85 81}; + 81 -> {82}; 82 -> {83}; 83 -> {84}; - 84 -> {85}; - 85 -> {93}; - 86 -> {108 87}; + 84 -> {92}; + 85 -> {107 86}; + 86 -> {87}; 87 -> {88}; 88 -> {89}; 89 -> {90}; @@ -303,84 +302,84 @@ digraph complex_kt { 91 -> {92}; 92 -> {93}; 93 -> {94}; - 94 -> {95}; - 95 -> {105}; + 94 -> {104}; + 95 -> {96}; 96 -> {97}; 97 -> {98}; 98 -> {99}; - 99 -> {100}; - 100 -> {105}; + 99 -> {104}; + 100 -> {101}; 101 -> {102}; 102 -> {103}; 103 -> {104}; 104 -> {105}; - 105 -> {106}; - 106 -> {108}; + 105 -> {107}; + 105 -> {106} [style=dotted]; 106 -> {107} [style=dotted]; - 107 -> {108} [style=dotted]; subgraph cluster_24 { color=red - 109 [label="Enter function firstIsInstanceOrNull" style="filled" fillcolor=red]; - 110 [label="Access variable this@R|/firstIsInstanceOrNull|"]; - 111 [label="Variable declaration: lval : R|kotlin/sequences/Sequence<*>|"]; - 112 [label="Access variable R|/|"]; - 113 [label="Function call: R|/|.R|FakeOverride|>|()"]; - 114 [label="Variable declaration: lval : R|kotlin/collections/Iterator|"]; + 108 [label="Enter function firstIsInstanceOrNull" style="filled" fillcolor=red]; + 109 [label="Access variable this@R|/firstIsInstanceOrNull|"]; + 110 [label="Variable declaration: lval : R|kotlin/sequences/Sequence<*>|"]; + 111 [label="Access variable R|/|"]; + 112 [label="Function call: R|/|.R|FakeOverride|>|()"]; + 113 [label="Variable declaration: lval : R|kotlin/collections/Iterator|"]; subgraph cluster_25 { color=blue - 115 [label="Enter while loop"]; + 114 [label="Enter while loop"]; subgraph cluster_26 { color=blue - 116 [label="Enter loop condition"]; - 117 [label="Access variable R|/|"]; - 118 [label="Function call: R|/|.R|kotlin/collections/Iterator.hasNext|()"]; - 119 [label="Exit loop condition"]; + 115 [label="Enter loop condition"]; + 116 [label="Access variable R|/|"]; + 117 [label="Function call: R|/|.R|kotlin/collections/Iterator.hasNext|()"]; + 118 [label="Exit loop condition"]; } subgraph cluster_27 { color=blue - 120 [label="Enter loop block"]; + 119 [label="Enter loop block"]; subgraph cluster_28 { color=blue - 121 [label="Enter block"]; - 122 [label="Access variable R|/|"]; - 123 [label="Function call: R|/|.R|FakeOverride|()"]; - 124 [label="Variable declaration: lval element: R|kotlin/Any?|"]; + 120 [label="Enter block"]; + 121 [label="Access variable R|/|"]; + 122 [label="Function call: R|/|.R|FakeOverride|()"]; + 123 [label="Variable declaration: lval element: R|kotlin/Any?|"]; subgraph cluster_29 { color=blue - 125 [label="Enter when"]; + 124 [label="Enter when"]; subgraph cluster_30 { color=blue - 126 [label="Enter when branch condition "]; - 127 [label="Access variable R|/element|"]; - 128 [label="Type operator: element is T"]; - 129 [label="Exit when branch condition"]; + 125 [label="Enter when branch condition "]; + 126 [label="Access variable R|/element|"]; + 127 [label="Type operator: element is T"]; + 128 [label="Exit when branch condition"]; } - 130 [label="Synthetic else branch"]; - 131 [label="Enter when branch result"]; + 129 [label="Synthetic else branch"]; + 130 [label="Enter when branch result"]; subgraph cluster_31 { color=blue - 132 [label="Enter block"]; - 133 [label="Access variable R|/element|"]; - 134 [label="Jump: ^firstIsInstanceOrNull R|/element|"]; - 135 [label="Stub" style="filled" fillcolor=gray]; - 136 [label="Exit block" style="filled" fillcolor=gray]; + 131 [label="Enter block"]; + 132 [label="Access variable R|/element|"]; + 133 [label="Jump: ^firstIsInstanceOrNull R|/element|"]; + 134 [label="Stub" style="filled" fillcolor=gray]; + 135 [label="Exit block" style="filled" fillcolor=gray]; } - 137 [label="Exit when branch result" style="filled" fillcolor=gray]; - 138 [label="Exit when"]; + 136 [label="Exit when branch result" style="filled" fillcolor=gray]; + 137 [label="Exit when"]; } - 139 [label="Exit block"]; + 138 [label="Exit block"]; } - 140 [label="Exit loop block"]; + 139 [label="Exit loop block"]; } - 141 [label="Exit whileloop"]; + 140 [label="Exit whileloop"]; } - 142 [label="Const: Null(null)"]; - 143 [label="Jump: ^firstIsInstanceOrNull Null(null)"]; - 144 [label="Stub" style="filled" fillcolor=gray]; - 145 [label="Exit function firstIsInstanceOrNull" style="filled" fillcolor=red]; + 141 [label="Const: Null(null)"]; + 142 [label="Jump: ^firstIsInstanceOrNull Null(null)"]; + 143 [label="Stub" style="filled" fillcolor=gray]; + 144 [label="Exit function firstIsInstanceOrNull" style="filled" fillcolor=red]; } + 108 -> {109}; 109 -> {110}; 110 -> {111}; 111 -> {112}; @@ -390,8 +389,8 @@ digraph complex_kt { 115 -> {116}; 116 -> {117}; 117 -> {118}; - 118 -> {119}; - 119 -> {141 120}; + 118 -> {140 119}; + 119 -> {120}; 120 -> {121}; 121 -> {122}; 122 -> {123}; @@ -400,24 +399,23 @@ digraph complex_kt { 125 -> {126}; 126 -> {127}; 127 -> {128}; - 128 -> {129}; - 129 -> {131 130}; - 130 -> {138}; + 128 -> {130 129}; + 129 -> {137}; + 130 -> {131}; 131 -> {132}; 132 -> {133}; - 133 -> {134}; - 134 -> {145}; + 133 -> {144}; + 133 -> {134} [style=dotted]; 134 -> {135} [style=dotted]; 135 -> {136} [style=dotted]; 136 -> {137} [style=dotted]; - 137 -> {138} [style=dotted]; + 137 -> {138}; 138 -> {139}; - 139 -> {140}; - 140 -> {116}; + 139 -> {115}; + 140 -> {141}; 141 -> {142}; - 142 -> {143}; - 143 -> {145}; + 142 -> {144}; + 142 -> {143} [style=dotted]; 143 -> {144} [style=dotted]; - 144 -> {145} [style=dotted]; } diff --git a/compiler/fir/resolve/testData/resolve/cfg/complex.kt b/compiler/fir/resolve/testData/resolve/cfg/complex.kt index b55b221a89c..405889df126 100644 --- a/compiler/fir/resolve/testData/resolve/cfg/complex.kt +++ b/compiler/fir/resolve/testData/resolve/cfg/complex.kt @@ -4,7 +4,7 @@ fun fetchPluginReleaseDate(pluginId: PluginId, version: String, channel: String? val pluginDTOs: Array = try { HttpRequests.request(url).connect { - GsonBuilder().create().fromJson(it.inputStream.reader(), Array::class.java) + GsonBuilder().create().fromJson(it.inputStream.reader(), Array::class.java) } } catch (ioException: JsonIOException) { throw IOException(ioException) diff --git a/compiler/fir/resolve/testData/resolve/cfg/complex.txt b/compiler/fir/resolve/testData/resolve/cfg/complex.txt index a000a45367b..f64d4c4366f 100644 --- a/compiler/fir/resolve/testData/resolve/cfg/complex.txt +++ b/compiler/fir/resolve/testData/resolve/cfg/complex.txt @@ -3,7 +3,7 @@ FILE: complex.kt lval url: R|kotlin/String| = (String(https://plugins.jetbrains.com/api/plugins/), R|/pluginId|.#.R|kotlin/toString|(), String(/updates?version=), R|/version|.R|kotlin/Any.toString|()) lval pluginDTOs: R|kotlin/Array| = try { #.#(R|/url|).#( = connect@fun (): { - #().#().#(#.#.#(), (#()).#) + #().#().#(#.#.#(), (Q|kotlin/Array|).R|kotlin/jvm/java|) } ) } diff --git a/compiler/fir/resolve/testData/resolve/stdlib/reflectionClass.kt b/compiler/fir/resolve/testData/resolve/stdlib/reflectionClass.kt index 4d206d88a46..4c933afb14d 100644 --- a/compiler/fir/resolve/testData/resolve/stdlib/reflectionClass.kt +++ b/compiler/fir/resolve/testData/resolve/stdlib/reflectionClass.kt @@ -5,6 +5,6 @@ val kotlinClass: KClass = String::class fun foo() { val stringClass = String::class.java - val arrayStringClass = Array::class.java + val arrayStringClass = Array::class.java } diff --git a/compiler/fir/resolve/testData/resolve/stdlib/reflectionClass.txt b/compiler/fir/resolve/testData/resolve/stdlib/reflectionClass.txt index d59b8e9dbfa..d126742e61b 100644 --- a/compiler/fir/resolve/testData/resolve/stdlib/reflectionClass.txt +++ b/compiler/fir/resolve/testData/resolve/stdlib/reflectionClass.txt @@ -5,5 +5,5 @@ FILE: reflectionClass.kt public get(): R|kotlin/reflect/KClass| public final fun foo(): R|kotlin/Unit| { lval stringClass: R|java/lang/Class| = (Q|kotlin/String|).R|kotlin/jvm/java| - lval arrayStringClass: = (#()).# + lval arrayStringClass: R|java/lang/Class>| = (Q|kotlin/Array|).R|kotlin/jvm/java| } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt index b35ed8685be..9c0a094815f 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt @@ -170,6 +170,14 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() { } } + private fun List.renderTypeArguments() { + if (isNotEmpty()) { + print("<") + renderSeparated() + print(">") + } + } + override fun visitMemberDeclaration(memberDeclaration: FirMemberDeclaration) { memberDeclaration.annotations.renderAnnotations() if (memberDeclaration !is FirProperty || !memberDeclaration.isLocal) { @@ -926,6 +934,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() { qualifiedAccessExpression.annotations.renderAnnotations() visitQualifiedAccess(qualifiedAccessExpression) qualifiedAccessExpression.calleeReference.accept(this) + qualifiedAccessExpression.typeArguments.renderTypeArguments() } override fun visitThisReceiverExpression(thisReceiverExpression: FirThisReceiverExpression) { @@ -964,11 +973,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() { functionCall.annotations.renderAnnotations() visitQualifiedAccess(functionCall) functionCall.calleeReference.accept(this) - if (functionCall.typeArguments.isNotEmpty()) { - print("<") - functionCall.typeArguments.renderSeparated() - print(">") - } + functionCall.typeArguments.renderTypeArguments() visitCall(functionCall) } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirArraySetCall.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirArraySetCall.kt index 3e51018db07..693daef16f8 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirArraySetCall.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirArraySetCall.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.expressions import org.jetbrains.kotlin.fir.FirPureAbstractElement import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.references.FirReference +import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.visitors.* /* @@ -19,6 +20,7 @@ abstract class FirArraySetCall : FirPureAbstractElement(), FirQualifiedAccess, F abstract override val source: FirSourceElement? abstract override val annotations: List abstract override val safe: Boolean + abstract override val typeArguments: List abstract override val explicitReceiver: FirExpression? abstract override val dispatchReceiver: FirExpression abstract override val extensionReceiver: FirExpression @@ -31,6 +33,8 @@ abstract class FirArraySetCall : FirPureAbstractElement(), FirQualifiedAccess, F override fun accept(visitor: FirVisitor, data: D): R = visitor.visitArraySetCall(this, data) + abstract override fun transformTypeArguments(transformer: FirTransformer, data: D): FirArraySetCall + abstract override fun transformExplicitReceiver(transformer: FirTransformer, data: D): FirArraySetCall abstract override fun transformDispatchReceiver(transformer: FirTransformer, data: D): FirArraySetCall diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirCallableReferenceAccess.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirCallableReferenceAccess.kt index 20202525cd9..51c4bdea948 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirCallableReferenceAccess.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirCallableReferenceAccess.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.expressions import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.references.FirNamedReference +import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.visitors.* @@ -20,6 +21,7 @@ abstract class FirCallableReferenceAccess : FirQualifiedAccessExpression() { abstract override val typeRef: FirTypeRef abstract override val annotations: List abstract override val safe: Boolean + abstract override val typeArguments: List abstract override val explicitReceiver: FirExpression? abstract override val dispatchReceiver: FirExpression abstract override val extensionReceiver: FirExpression @@ -27,6 +29,8 @@ abstract class FirCallableReferenceAccess : FirQualifiedAccessExpression() { override fun accept(visitor: FirVisitor, data: D): R = visitor.visitCallableReferenceAccess(this, data) + abstract override fun transformTypeArguments(transformer: FirTransformer, data: D): FirCallableReferenceAccess + abstract override fun transformExplicitReceiver(transformer: FirTransformer, data: D): FirCallableReferenceAccess abstract override fun transformDispatchReceiver(transformer: FirTransformer, data: D): FirCallableReferenceAccess diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirComponentCall.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirComponentCall.kt index 1143113e1e9..5f4d1aca4e2 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirComponentCall.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirComponentCall.kt @@ -21,24 +21,24 @@ abstract class FirComponentCall : FirFunctionCall() { abstract override val typeRef: FirTypeRef abstract override val annotations: List abstract override val safe: Boolean + abstract override val typeArguments: List abstract override val dispatchReceiver: FirExpression abstract override val extensionReceiver: FirExpression abstract override val arguments: List - abstract override val typeArguments: List abstract override val calleeReference: FirNamedReference abstract override val explicitReceiver: FirExpression abstract val componentIndex: Int override fun accept(visitor: FirVisitor, data: D): R = visitor.visitComponentCall(this, data) + abstract override fun transformTypeArguments(transformer: FirTransformer, data: D): FirComponentCall + abstract override fun transformDispatchReceiver(transformer: FirTransformer, data: D): FirComponentCall abstract override fun transformExtensionReceiver(transformer: FirTransformer, data: D): FirComponentCall abstract override fun transformArguments(transformer: FirTransformer, data: D): FirComponentCall - abstract override fun transformTypeArguments(transformer: FirTransformer, data: D): FirComponentCall - abstract override fun transformCalleeReference(transformer: FirTransformer, data: D): FirComponentCall abstract override fun transformExplicitReceiver(transformer: FirTransformer, data: D): FirComponentCall diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionWithSmartcast.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionWithSmartcast.kt index bfe96c1091c..cddd5147aa4 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionWithSmartcast.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionWithSmartcast.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.expressions import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.types.ConeKotlinType +import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.visitors.* @@ -21,6 +22,7 @@ abstract class FirExpressionWithSmartcast : FirQualifiedAccessExpression() { abstract override val typeRef: FirTypeRef abstract override val annotations: List abstract override val safe: Boolean + abstract override val typeArguments: List abstract override val explicitReceiver: FirExpression? abstract override val dispatchReceiver: FirExpression abstract override val extensionReceiver: FirExpression @@ -31,6 +33,8 @@ abstract class FirExpressionWithSmartcast : FirQualifiedAccessExpression() { override fun accept(visitor: FirVisitor, data: D): R = visitor.visitExpressionWithSmartcast(this, data) + abstract override fun transformTypeArguments(transformer: FirTransformer, data: D): FirExpressionWithSmartcast + abstract override fun transformExplicitReceiver(transformer: FirTransformer, data: D): FirExpressionWithSmartcast abstract override fun transformDispatchReceiver(transformer: FirTransformer, data: D): FirExpressionWithSmartcast diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirFunctionCall.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirFunctionCall.kt index d9687eec0b6..3a23a1db364 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirFunctionCall.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirFunctionCall.kt @@ -21,15 +21,17 @@ abstract class FirFunctionCall : FirQualifiedAccessExpression(), FirCall { abstract override val typeRef: FirTypeRef abstract override val annotations: List abstract override val safe: Boolean + abstract override val typeArguments: List abstract override val explicitReceiver: FirExpression? abstract override val dispatchReceiver: FirExpression abstract override val extensionReceiver: FirExpression abstract override val arguments: List - abstract val typeArguments: List abstract override val calleeReference: FirNamedReference override fun accept(visitor: FirVisitor, data: D): R = visitor.visitFunctionCall(this, data) + abstract override fun transformTypeArguments(transformer: FirTransformer, data: D): FirFunctionCall + abstract override fun transformExplicitReceiver(transformer: FirTransformer, data: D): FirFunctionCall abstract override fun transformDispatchReceiver(transformer: FirTransformer, data: D): FirFunctionCall @@ -38,7 +40,5 @@ abstract class FirFunctionCall : FirQualifiedAccessExpression(), FirCall { abstract override fun transformArguments(transformer: FirTransformer, data: D): FirFunctionCall - abstract fun transformTypeArguments(transformer: FirTransformer, data: D): FirFunctionCall - abstract override fun transformCalleeReference(transformer: FirTransformer, data: D): FirFunctionCall } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirQualifiedAccess.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirQualifiedAccess.kt index 38c0c2d83b2..ada4b396227 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirQualifiedAccess.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirQualifiedAccess.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.expressions import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.references.FirReference +import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.visitors.* /* @@ -18,6 +19,7 @@ interface FirQualifiedAccess : FirQualifiedAccessWithoutCallee, FirResolvable { override val source: FirSourceElement? override val annotations: List override val safe: Boolean + override val typeArguments: List override val explicitReceiver: FirExpression? override val dispatchReceiver: FirExpression override val extensionReceiver: FirExpression @@ -25,6 +27,8 @@ interface FirQualifiedAccess : FirQualifiedAccessWithoutCallee, FirResolvable { override fun accept(visitor: FirVisitor, data: D): R = visitor.visitQualifiedAccess(this, data) + override fun transformTypeArguments(transformer: FirTransformer, data: D): FirQualifiedAccess + override fun transformExplicitReceiver(transformer: FirTransformer, data: D): FirQualifiedAccess override fun transformDispatchReceiver(transformer: FirTransformer, data: D): FirQualifiedAccess diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirQualifiedAccessExpression.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirQualifiedAccessExpression.kt index 120f91c4192..112589f44a8 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirQualifiedAccessExpression.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirQualifiedAccessExpression.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.expressions import org.jetbrains.kotlin.fir.FirPureAbstractElement import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.references.FirReference +import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.visitors.* @@ -21,6 +22,7 @@ abstract class FirQualifiedAccessExpression : FirPureAbstractElement(), FirExpre abstract override val typeRef: FirTypeRef abstract override val annotations: List abstract override val safe: Boolean + abstract override val typeArguments: List abstract override val explicitReceiver: FirExpression? abstract override val dispatchReceiver: FirExpression abstract override val extensionReceiver: FirExpression @@ -28,6 +30,8 @@ abstract class FirQualifiedAccessExpression : FirPureAbstractElement(), FirExpre override fun accept(visitor: FirVisitor, data: D): R = visitor.visitQualifiedAccessExpression(this, data) + abstract override fun transformTypeArguments(transformer: FirTransformer, data: D): FirQualifiedAccessExpression + abstract override fun transformExplicitReceiver(transformer: FirTransformer, data: D): FirQualifiedAccessExpression abstract override fun transformDispatchReceiver(transformer: FirTransformer, data: D): FirQualifiedAccessExpression diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirQualifiedAccessWithoutCallee.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirQualifiedAccessWithoutCallee.kt index 8ed332cd277..6f01e2b326f 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirQualifiedAccessWithoutCallee.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirQualifiedAccessWithoutCallee.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.expressions import org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.visitors.* /* @@ -17,12 +18,15 @@ interface FirQualifiedAccessWithoutCallee : FirStatement { override val source: FirSourceElement? override val annotations: List val safe: Boolean + val typeArguments: List val explicitReceiver: FirExpression? val dispatchReceiver: FirExpression val extensionReceiver: FirExpression override fun accept(visitor: FirVisitor, data: D): R = visitor.visitQualifiedAccessWithoutCallee(this, data) + fun transformTypeArguments(transformer: FirTransformer, data: D): FirQualifiedAccessWithoutCallee + fun transformExplicitReceiver(transformer: FirTransformer, data: D): FirQualifiedAccessWithoutCallee fun transformDispatchReceiver(transformer: FirTransformer, data: D): FirQualifiedAccessWithoutCallee diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirResolvedQualifier.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirResolvedQualifier.kt index d37fd76bbe1..2f3c0c7f54a 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirResolvedQualifier.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirResolvedQualifier.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.expressions import org.jetbrains.kotlin.fir.FirPureAbstractElement import org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName @@ -24,6 +25,9 @@ abstract class FirResolvedQualifier : FirPureAbstractElement(), FirExpression { abstract val packageFqName: FqName abstract val relativeClassFqName: FqName? abstract val classId: ClassId? + abstract val typeArguments: List override fun accept(visitor: FirVisitor, data: D): R = visitor.visitResolvedQualifier(this, data) + + abstract fun transformTypeArguments(transformer: FirTransformer, data: D): FirResolvedQualifier } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirThisReceiverExpression.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirThisReceiverExpression.kt index a0212b23de4..74b925c4adf 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirThisReceiverExpression.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirThisReceiverExpression.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.expressions import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.references.FirThisReference +import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.visitors.* @@ -20,6 +21,7 @@ abstract class FirThisReceiverExpression : FirQualifiedAccessExpression() { abstract override val typeRef: FirTypeRef abstract override val annotations: List abstract override val safe: Boolean + abstract override val typeArguments: List abstract override val explicitReceiver: FirExpression? abstract override val dispatchReceiver: FirExpression abstract override val extensionReceiver: FirExpression @@ -27,6 +29,8 @@ abstract class FirThisReceiverExpression : FirQualifiedAccessExpression() { override fun accept(visitor: FirVisitor, data: D): R = visitor.visitThisReceiverExpression(this, data) + abstract override fun transformTypeArguments(transformer: FirTransformer, data: D): FirThisReceiverExpression + abstract override fun transformExplicitReceiver(transformer: FirTransformer, data: D): FirThisReceiverExpression abstract override fun transformDispatchReceiver(transformer: FirTransformer, data: D): FirThisReceiverExpression diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirVariableAssignment.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirVariableAssignment.kt index 03be491f112..f6ff343fcce 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirVariableAssignment.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirVariableAssignment.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.expressions import org.jetbrains.kotlin.fir.FirPureAbstractElement import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.references.FirReference +import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.visitors.* /* @@ -19,6 +20,7 @@ abstract class FirVariableAssignment : FirPureAbstractElement(), FirQualifiedAcc abstract override val source: FirSourceElement? abstract override val annotations: List abstract override val safe: Boolean + abstract override val typeArguments: List abstract override val explicitReceiver: FirExpression? abstract override val dispatchReceiver: FirExpression abstract override val extensionReceiver: FirExpression @@ -28,6 +30,8 @@ abstract class FirVariableAssignment : FirPureAbstractElement(), FirQualifiedAcc override fun accept(visitor: FirVisitor, data: D): R = visitor.visitVariableAssignment(this, data) + abstract override fun transformTypeArguments(transformer: FirTransformer, data: D): FirVariableAssignment + abstract override fun transformExplicitReceiver(transformer: FirTransformer, data: D): FirVariableAssignment abstract override fun transformDispatchReceiver(transformer: FirTransformer, data: D): FirVariableAssignment diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirArraySetCallImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirArraySetCallImpl.kt index b9d10d6a15a..7161322e049 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirArraySetCallImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirArraySetCallImpl.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirOperation import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement import org.jetbrains.kotlin.fir.references.FirReference +import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.visitors.* /* @@ -26,6 +27,7 @@ class FirArraySetCallImpl( ) : FirArraySetCall(), FirModifiableQualifiedAccess, FirAbstractAnnotatedElement { override val annotations: MutableList = mutableListOf() override var safe: Boolean = false + override val typeArguments: MutableList = mutableListOf() override var explicitReceiver: FirExpression? = null override var dispatchReceiver: FirExpression = FirNoReceiverExpression override var extensionReceiver: FirExpression = FirNoReceiverExpression @@ -40,6 +42,7 @@ class FirArraySetCallImpl( override fun acceptChildren(visitor: FirVisitor, data: D) { annotations.forEach { it.accept(visitor, data) } + typeArguments.forEach { it.accept(visitor, data) } explicitReceiver?.accept(visitor, data) if (dispatchReceiver !== explicitReceiver) { dispatchReceiver.accept(visitor, data) @@ -54,6 +57,7 @@ class FirArraySetCallImpl( override fun transformChildren(transformer: FirTransformer, data: D): FirArraySetCallImpl { annotations.transformInplace(transformer, data) + transformTypeArguments(transformer, data) explicitReceiver = explicitReceiver?.transformSingle(transformer, data) if (dispatchReceiver !== explicitReceiver) { dispatchReceiver = dispatchReceiver.transformSingle(transformer, data) @@ -67,6 +71,11 @@ class FirArraySetCallImpl( return this } + override fun transformTypeArguments(transformer: FirTransformer, data: D): FirArraySetCallImpl { + typeArguments.transformInplace(transformer, data) + return this + } + override fun transformExplicitReceiver(transformer: FirTransformer, data: D): FirArraySetCallImpl { explicitReceiver = explicitReceiver?.transformSingle(transformer, data) return this diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirCallableReferenceAccessImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirCallableReferenceAccessImpl.kt index 4a0fd1d2e78..cb173daec5f 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirCallableReferenceAccessImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirCallableReferenceAccessImpl.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement import org.jetbrains.kotlin.fir.references.FirNamedReference +import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl import org.jetbrains.kotlin.fir.visitors.* @@ -26,6 +27,7 @@ class FirCallableReferenceAccessImpl( override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null) override val annotations: MutableList = mutableListOf() override var safe: Boolean = false + override val typeArguments: MutableList = mutableListOf() override var explicitReceiver: FirExpression? = null override var dispatchReceiver: FirExpression = FirNoReceiverExpression override var extensionReceiver: FirExpression = FirNoReceiverExpression @@ -34,6 +36,7 @@ class FirCallableReferenceAccessImpl( override fun acceptChildren(visitor: FirVisitor, data: D) { typeRef.accept(visitor, data) annotations.forEach { it.accept(visitor, data) } + typeArguments.forEach { it.accept(visitor, data) } explicitReceiver?.accept(visitor, data) if (dispatchReceiver !== explicitReceiver) { dispatchReceiver.accept(visitor, data) @@ -47,6 +50,7 @@ class FirCallableReferenceAccessImpl( override fun transformChildren(transformer: FirTransformer, data: D): FirCallableReferenceAccessImpl { typeRef = typeRef.transformSingle(transformer, data) annotations.transformInplace(transformer, data) + transformTypeArguments(transformer, data) explicitReceiver = explicitReceiver?.transformSingle(transformer, data) if (dispatchReceiver !== explicitReceiver) { dispatchReceiver = dispatchReceiver.transformSingle(transformer, data) @@ -58,6 +62,11 @@ class FirCallableReferenceAccessImpl( return this } + override fun transformTypeArguments(transformer: FirTransformer, data: D): FirCallableReferenceAccessImpl { + typeArguments.transformInplace(transformer, data) + return this + } + override fun transformExplicitReceiver(transformer: FirTransformer, data: D): FirCallableReferenceAccessImpl { explicitReceiver = explicitReceiver?.transformSingle(transformer, data) return this diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirComponentCallImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirComponentCallImpl.kt index f08af71883c..1955cf12db8 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirComponentCallImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirComponentCallImpl.kt @@ -31,17 +31,17 @@ class FirComponentCallImpl( override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null) override val annotations: MutableList = mutableListOf() override val safe: Boolean get() = false + override val typeArguments: MutableList = mutableListOf() override val dispatchReceiver: FirExpression get() = FirNoReceiverExpression override val extensionReceiver: FirExpression get() = FirNoReceiverExpression override val arguments: MutableList = mutableListOf() - override val typeArguments: MutableList = mutableListOf() override var calleeReference: FirNamedReference = FirSimpleNamedReference(source, Name.identifier("component$componentIndex"), null) override fun acceptChildren(visitor: FirVisitor, data: D) { typeRef.accept(visitor, data) annotations.forEach { it.accept(visitor, data) } - arguments.forEach { it.accept(visitor, data) } typeArguments.forEach { it.accept(visitor, data) } + arguments.forEach { it.accept(visitor, data) } calleeReference.accept(visitor, data) explicitReceiver.accept(visitor, data) if (dispatchReceiver !== explicitReceiver) { @@ -55,13 +55,18 @@ class FirComponentCallImpl( override fun transformChildren(transformer: FirTransformer, data: D): FirComponentCallImpl { typeRef = typeRef.transformSingle(transformer, data) annotations.transformInplace(transformer, data) - transformArguments(transformer, data) transformTypeArguments(transformer, data) + transformArguments(transformer, data) transformCalleeReference(transformer, data) explicitReceiver = explicitReceiver.transformSingle(transformer, data) return this } + override fun transformTypeArguments(transformer: FirTransformer, data: D): FirComponentCallImpl { + typeArguments.transformInplace(transformer, data) + return this + } + override fun transformDispatchReceiver(transformer: FirTransformer, data: D): FirComponentCallImpl { return this } @@ -75,11 +80,6 @@ class FirComponentCallImpl( return this } - override fun transformTypeArguments(transformer: FirTransformer, data: D): FirComponentCallImpl { - typeArguments.transformInplace(transformer, data) - return this - } - override fun transformCalleeReference(transformer: FirTransformer, data: D): FirComponentCallImpl { calleeReference = calleeReference.transformSingle(transformer, data) return this diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirExpressionWithSmartcastImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirExpressionWithSmartcastImpl.kt index 72cba50d512..ba05854359d 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirExpressionWithSmartcastImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirExpressionWithSmartcastImpl.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef +import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirVisitor @@ -30,6 +31,7 @@ class FirExpressionWithSmartcastImpl( override val source: FirSourceElement? get() = originalExpression.source override val annotations: List get() = originalExpression.annotations override val safe: Boolean get() = originalExpression.safe + override val typeArguments: List get() = originalExpression.typeArguments override val explicitReceiver: FirExpression? get() = originalExpression.explicitReceiver override val dispatchReceiver: FirExpression get() = originalExpression.dispatchReceiver override val extensionReceiver: FirExpression get() = originalExpression.extensionReceiver @@ -61,5 +63,9 @@ class FirExpressionWithSmartcastImpl( throw IllegalStateException() } + override fun transformTypeArguments(transformer: FirTransformer, data: D): FirExpressionWithSmartcast { + throw IllegalStateException() + } + override fun replaceTypeRef(newTypeRef: FirTypeRef) {} } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirFunctionCallImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirFunctionCallImpl.kt index a8a01aff6e6..6a7891a4e02 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirFunctionCallImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirFunctionCallImpl.kt @@ -27,16 +27,17 @@ class FirFunctionCallImpl( override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null) override val annotations: MutableList = mutableListOf() override var safe: Boolean = false + override val typeArguments: MutableList = mutableListOf() override var explicitReceiver: FirExpression? = null override var dispatchReceiver: FirExpression = FirNoReceiverExpression override var extensionReceiver: FirExpression = FirNoReceiverExpression override val arguments: MutableList = mutableListOf() - override val typeArguments: MutableList = mutableListOf() override lateinit var calleeReference: FirNamedReference override fun acceptChildren(visitor: FirVisitor, data: D) { typeRef.accept(visitor, data) annotations.forEach { it.accept(visitor, data) } + typeArguments.forEach { it.accept(visitor, data) } explicitReceiver?.accept(visitor, data) if (dispatchReceiver !== explicitReceiver) { dispatchReceiver.accept(visitor, data) @@ -45,13 +46,13 @@ class FirFunctionCallImpl( extensionReceiver.accept(visitor, data) } arguments.forEach { it.accept(visitor, data) } - typeArguments.forEach { it.accept(visitor, data) } calleeReference.accept(visitor, data) } override fun transformChildren(transformer: FirTransformer, data: D): FirFunctionCallImpl { typeRef = typeRef.transformSingle(transformer, data) annotations.transformInplace(transformer, data) + transformTypeArguments(transformer, data) explicitReceiver = explicitReceiver?.transformSingle(transformer, data) if (dispatchReceiver !== explicitReceiver) { dispatchReceiver = dispatchReceiver.transformSingle(transformer, data) @@ -60,11 +61,15 @@ class FirFunctionCallImpl( extensionReceiver = extensionReceiver.transformSingle(transformer, data) } transformArguments(transformer, data) - transformTypeArguments(transformer, data) transformCalleeReference(transformer, data) return this } + override fun transformTypeArguments(transformer: FirTransformer, data: D): FirFunctionCallImpl { + typeArguments.transformInplace(transformer, data) + return this + } + override fun transformExplicitReceiver(transformer: FirTransformer, data: D): FirFunctionCallImpl { explicitReceiver = explicitReceiver?.transformSingle(transformer, data) return this @@ -85,11 +90,6 @@ class FirFunctionCallImpl( return this } - override fun transformTypeArguments(transformer: FirTransformer, data: D): FirFunctionCallImpl { - typeArguments.transformInplace(transformer, data) - return this - } - override fun transformCalleeReference(transformer: FirTransformer, data: D): FirFunctionCallImpl { calleeReference = calleeReference.transformSingle(transformer, data) return this diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirModifiableQualifiedAccess.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirModifiableQualifiedAccess.kt index c94916977a4..4172aab7f06 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirModifiableQualifiedAccess.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirModifiableQualifiedAccess.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessWithoutCallee import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement +import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.visitors.* /* @@ -21,11 +22,14 @@ interface FirModifiableQualifiedAccess : FirQualifiedAccessWithoutCallee, FirAbs override val source: FirSourceElement? override val annotations: MutableList override var safe: Boolean + override val typeArguments: MutableList override var explicitReceiver: FirExpression? override var dispatchReceiver: FirExpression override var extensionReceiver: FirExpression override fun transformChildren(transformer: FirTransformer, data: D): FirModifiableQualifiedAccess + override fun transformTypeArguments(transformer: FirTransformer, data: D): FirModifiableQualifiedAccess + override fun transformExplicitReceiver(transformer: FirTransformer, data: D): FirModifiableQualifiedAccess override fun transformDispatchReceiver(transformer: FirTransformer, data: D): FirModifiableQualifiedAccess diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirQualifiedAccessExpressionImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirQualifiedAccessExpressionImpl.kt index 50f446adb89..8875b1c9b4c 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirQualifiedAccessExpressionImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirQualifiedAccessExpressionImpl.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement import org.jetbrains.kotlin.fir.references.FirReference +import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl import org.jetbrains.kotlin.fir.visitors.* @@ -26,6 +27,7 @@ class FirQualifiedAccessExpressionImpl( override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null) override val annotations: MutableList = mutableListOf() override var safe: Boolean = false + override val typeArguments: MutableList = mutableListOf() override var explicitReceiver: FirExpression? = null override var dispatchReceiver: FirExpression = FirNoReceiverExpression override var extensionReceiver: FirExpression = FirNoReceiverExpression @@ -34,6 +36,7 @@ class FirQualifiedAccessExpressionImpl( override fun acceptChildren(visitor: FirVisitor, data: D) { typeRef.accept(visitor, data) annotations.forEach { it.accept(visitor, data) } + typeArguments.forEach { it.accept(visitor, data) } explicitReceiver?.accept(visitor, data) if (dispatchReceiver !== explicitReceiver) { dispatchReceiver.accept(visitor, data) @@ -47,6 +50,7 @@ class FirQualifiedAccessExpressionImpl( override fun transformChildren(transformer: FirTransformer, data: D): FirQualifiedAccessExpressionImpl { typeRef = typeRef.transformSingle(transformer, data) annotations.transformInplace(transformer, data) + transformTypeArguments(transformer, data) explicitReceiver = explicitReceiver?.transformSingle(transformer, data) if (dispatchReceiver !== explicitReceiver) { dispatchReceiver = dispatchReceiver.transformSingle(transformer, data) @@ -58,6 +62,11 @@ class FirQualifiedAccessExpressionImpl( return this } + override fun transformTypeArguments(transformer: FirTransformer, data: D): FirQualifiedAccessExpressionImpl { + typeArguments.transformInplace(transformer, data) + return this + } + override fun transformExplicitReceiver(transformer: FirTransformer, data: D): FirQualifiedAccessExpressionImpl { explicitReceiver = explicitReceiver?.transformSingle(transformer, data) return this diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirResolvedQualifierImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirResolvedQualifierImpl.kt index d46a2725e13..68a6336b3c0 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirResolvedQualifierImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirResolvedQualifierImpl.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement +import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl import org.jetbrains.kotlin.name.ClassId @@ -30,15 +31,23 @@ class FirResolvedQualifierImpl( override val classId: ClassId? get() = relativeClassFqName?.let { ClassId(packageFqName, it, false) } + override val typeArguments: MutableList = mutableListOf() override fun acceptChildren(visitor: FirVisitor, data: D) { typeRef.accept(visitor, data) annotations.forEach { it.accept(visitor, data) } + typeArguments.forEach { it.accept(visitor, data) } } override fun transformChildren(transformer: FirTransformer, data: D): FirResolvedQualifierImpl { typeRef = typeRef.transformSingle(transformer, data) annotations.transformInplace(transformer, data) + transformTypeArguments(transformer, data) + return this + } + + override fun transformTypeArguments(transformer: FirTransformer, data: D): FirResolvedQualifierImpl { + typeArguments.transformInplace(transformer, data) return this } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirThisReceiverExpressionImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirThisReceiverExpressionImpl.kt index 2688b2a145f..2cfcce36e22 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirThisReceiverExpressionImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirThisReceiverExpressionImpl.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement import org.jetbrains.kotlin.fir.references.FirThisReference +import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl import org.jetbrains.kotlin.fir.visitors.* @@ -27,6 +28,7 @@ class FirThisReceiverExpressionImpl( override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null) override val annotations: MutableList = mutableListOf() override var safe: Boolean = false + override val typeArguments: MutableList = mutableListOf() override var explicitReceiver: FirExpression? = null override var dispatchReceiver: FirExpression = FirNoReceiverExpression override var extensionReceiver: FirExpression = FirNoReceiverExpression @@ -34,6 +36,7 @@ class FirThisReceiverExpressionImpl( override fun acceptChildren(visitor: FirVisitor, data: D) { typeRef.accept(visitor, data) annotations.forEach { it.accept(visitor, data) } + typeArguments.forEach { it.accept(visitor, data) } explicitReceiver?.accept(visitor, data) if (dispatchReceiver !== explicitReceiver) { dispatchReceiver.accept(visitor, data) @@ -47,6 +50,7 @@ class FirThisReceiverExpressionImpl( override fun transformChildren(transformer: FirTransformer, data: D): FirThisReceiverExpressionImpl { typeRef = typeRef.transformSingle(transformer, data) annotations.transformInplace(transformer, data) + transformTypeArguments(transformer, data) explicitReceiver = explicitReceiver?.transformSingle(transformer, data) if (dispatchReceiver !== explicitReceiver) { dispatchReceiver = dispatchReceiver.transformSingle(transformer, data) @@ -58,6 +62,11 @@ class FirThisReceiverExpressionImpl( return this } + override fun transformTypeArguments(transformer: FirTransformer, data: D): FirThisReceiverExpressionImpl { + typeArguments.transformInplace(transformer, data) + return this + } + override fun transformExplicitReceiver(transformer: FirTransformer, data: D): FirThisReceiverExpressionImpl { explicitReceiver = explicitReceiver?.transformSingle(transformer, data) return this diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirVariableAssignmentImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirVariableAssignmentImpl.kt index 2cb55bc9b34..3589399b06b 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirVariableAssignmentImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirVariableAssignmentImpl.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement import org.jetbrains.kotlin.fir.references.FirReference +import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.visitors.* /* @@ -24,6 +25,7 @@ class FirVariableAssignmentImpl( override var rValue: FirExpression ) : FirVariableAssignment(), FirModifiableQualifiedAccess, FirAbstractAnnotatedElement { override val annotations: MutableList = mutableListOf() + override val typeArguments: MutableList = mutableListOf() override var explicitReceiver: FirExpression? = null override var dispatchReceiver: FirExpression = FirNoReceiverExpression override var extensionReceiver: FirExpression = FirNoReceiverExpression @@ -36,6 +38,7 @@ class FirVariableAssignmentImpl( override fun acceptChildren(visitor: FirVisitor, data: D) { annotations.forEach { it.accept(visitor, data) } + typeArguments.forEach { it.accept(visitor, data) } explicitReceiver?.accept(visitor, data) if (dispatchReceiver !== explicitReceiver) { dispatchReceiver.accept(visitor, data) @@ -49,6 +52,7 @@ class FirVariableAssignmentImpl( override fun transformChildren(transformer: FirTransformer, data: D): FirVariableAssignmentImpl { annotations.transformInplace(transformer, data) + transformTypeArguments(transformer, data) explicitReceiver = explicitReceiver?.transformSingle(transformer, data) if (dispatchReceiver !== explicitReceiver) { dispatchReceiver = dispatchReceiver.transformSingle(transformer, data) @@ -61,6 +65,11 @@ class FirVariableAssignmentImpl( return this } + override fun transformTypeArguments(transformer: FirTransformer, data: D): FirVariableAssignmentImpl { + typeArguments.transformInplace(transformer, data) + return this + } + override fun transformExplicitReceiver(transformer: FirTransformer, data: D): FirVariableAssignmentImpl { explicitReceiver = explicitReceiver?.transformSingle(transformer, data) return this diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt index 5eb03bede60..b0e819e8929 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt @@ -173,6 +173,7 @@ object NodeConfigurator : AbstractFieldConfigurator() { qualifiedAccessWithoutCallee.configure { +booleanField("safe") + +typeArguments.withTransform() +receivers } @@ -183,7 +184,6 @@ object NodeConfigurator : AbstractFieldConfigurator() { } functionCall.configure { - +typeArguments.withTransform() +field("calleeReference", namedReference) } @@ -428,6 +428,7 @@ object NodeConfigurator : AbstractFieldConfigurator() { +field("packageFqName", fqNameType) +field("relativeClassFqName", fqNameType, nullable = true) +field("classId", classIdType, nullable = true) + +typeArguments.withTransform() } stringConcatenationCall.configure { diff --git a/compiler/testData/ir/irText/expressions/callableRefToGenericMember.fir.txt b/compiler/testData/ir/irText/expressions/callableRefToGenericMember.fir.txt index 8259c4dcc0f..a4d475507cc 100644 --- a/compiler/testData/ir/irText/expressions/callableRefToGenericMember.fir.txt +++ b/compiler/testData/ir/irText/expressions/callableRefToGenericMember.fir.txt @@ -34,20 +34,20 @@ FILE fqName: fileName:/callableRefToGenericMember.kt public open fun toString (): kotlin.String declared in kotlin.Any $this: VALUE_PARAMETER name: type:kotlin.Any PROPERTY name:test1 visibility:public modality:FINAL [val] - FIELD PROPERTY_BACKING_FIELD name:test1 type:kotlin.reflect.KFunction0 visibility:private [final,static] + FIELD PROPERTY_BACKING_FIELD name:test1 type:kotlin.reflect.KFunction1<.A<*>, kotlin.Unit> visibility:private [final,static] EXPRESSION_BODY - FUNCTION_REFERENCE 'public final fun foo (): kotlin.Unit declared in .A' type=kotlin.reflect.KFunction0 origin=null - FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.reflect.KFunction0 + FUNCTION_REFERENCE 'public final fun foo (): kotlin.Unit declared in .A' type=kotlin.reflect.KFunction1<.A<*>, kotlin.Unit> origin=null + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.reflect.KFunction1<.A<*>, kotlin.Unit> correspondingProperty: PROPERTY name:test1 visibility:public modality:FINAL [val] BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun (): kotlin.reflect.KFunction0 declared in ' - GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test1 type:kotlin.reflect.KFunction0 visibility:private [final,static]' type=kotlin.reflect.KFunction0 origin=null + RETURN type=kotlin.Nothing from='public final fun (): kotlin.reflect.KFunction1<.A<*>, kotlin.Unit> declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test1 type:kotlin.reflect.KFunction1<.A<*>, kotlin.Unit> visibility:private [final,static]' type=kotlin.reflect.KFunction1<.A<*>, kotlin.Unit> origin=null PROPERTY name:test2 visibility:public modality:FINAL [val] - FIELD PROPERTY_BACKING_FIELD name:test2 type:kotlin.reflect.KProperty0 visibility:private [final,static] + FIELD PROPERTY_BACKING_FIELD name:test2 type:kotlin.reflect.KProperty1<.A<*>, kotlin.Int> visibility:private [final,static] EXPRESSION_BODY - PROPERTY_REFERENCE 'public final bar: kotlin.Int [val]' field='FIELD PROPERTY_BACKING_FIELD name:bar type:kotlin.Int visibility:private [final]' getter='public final fun (): kotlin.Int declared in .A' setter=null type=kotlin.reflect.KProperty0 origin=null - FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.reflect.KProperty0 + PROPERTY_REFERENCE 'public final bar: kotlin.Int [val]' field='FIELD PROPERTY_BACKING_FIELD name:bar type:kotlin.Int visibility:private [final]' getter='public final fun (): kotlin.Int declared in .A' setter=null type=kotlin.reflect.KProperty1<.A<*>, kotlin.Int> origin=null + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.reflect.KProperty1<.A<*>, kotlin.Int> correspondingProperty: PROPERTY name:test2 visibility:public modality:FINAL [val] BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun (): kotlin.reflect.KProperty0 declared in ' - GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test2 type:kotlin.reflect.KProperty0 visibility:private [final,static]' type=kotlin.reflect.KProperty0 origin=null + RETURN type=kotlin.Nothing from='public final fun (): kotlin.reflect.KProperty1<.A<*>, kotlin.Int> declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test2 type:kotlin.reflect.KProperty1<.A<*>, kotlin.Int> visibility:private [final,static]' type=kotlin.reflect.KProperty1<.A<*>, kotlin.Int> origin=null diff --git a/compiler/testData/ir/irText/expressions/genericPropertyRef.fir.txt b/compiler/testData/ir/irText/expressions/genericPropertyRef.fir.txt index dff0faaca17..546ffe72108 100644 --- a/compiler/testData/ir/irText/expressions/genericPropertyRef.fir.txt +++ b/compiler/testData/ir/irText/expressions/genericPropertyRef.fir.txt @@ -68,7 +68,7 @@ FILE fqName: fileName:/genericPropertyRef.kt FIELD DELEGATE name:additionalText$delegate type:.DVal visibility:private [final,static] EXPRESSION_BODY CONSTRUCTOR_CALL 'public constructor (kmember: kotlin.Any) [primary] declared in .DVal' type=.DVal origin=null - kmember: PROPERTY_REFERENCE 'public final text: kotlin.String? [var]' field='FIELD PROPERTY_BACKING_FIELD name:text type:kotlin.String? visibility:private' getter='public final fun (): kotlin.String? declared in .Value' setter='public final fun (: kotlin.String?): kotlin.Unit declared in .Value' type=kotlin.reflect.KMutableProperty0 origin=null + kmember: PROPERTY_REFERENCE 'public final text: kotlin.String? [var]' field='FIELD PROPERTY_BACKING_FIELD name:text type:kotlin.String? visibility:private' getter='public final fun (): kotlin.String? declared in .Value' setter='public final fun (: kotlin.String?): kotlin.Unit declared in .Value' type=kotlin.reflect.KMutableProperty1<.Value<*>, kotlin.String?> origin=null FUN DELEGATED_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.Int correspondingProperty: PROPERTY name:additionalText visibility:public modality:FINAL [delegated,val] BLOCK_BODY @@ -81,7 +81,7 @@ FILE fqName: fileName:/genericPropertyRef.kt FIELD DELEGATE name:additionalValue$delegate type:.DVal visibility:private [final,static] EXPRESSION_BODY CONSTRUCTOR_CALL 'public constructor (kmember: kotlin.Any) [primary] declared in .DVal' type=.DVal origin=null - kmember: PROPERTY_REFERENCE 'public final value: T of [var]' field=null getter='public final fun (): T of declared in .Value' setter='public final fun (: T of ): kotlin.Unit declared in .Value' type=kotlin.reflect.KMutableProperty0> origin=null + kmember: PROPERTY_REFERENCE 'public final value: kotlin.Any? [var]' field=null getter='public final fun (): kotlin.Any? declared in .Value' setter='public final fun (: kotlin.Any?): kotlin.Unit declared in .Value' type=kotlin.reflect.KMutableProperty1<.Value<*>, kotlin.Any?> origin=null FUN DELEGATED_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.Int correspondingProperty: PROPERTY name:additionalValue visibility:public modality:FINAL [delegated,val] BLOCK_BODY diff --git a/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/fir/FirVisualizerForRawFirDataGenerated.java b/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/fir/FirVisualizerForRawFirDataGenerated.java index 5bf1a0a75a6..4394a10972c 100644 --- a/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/fir/FirVisualizerForRawFirDataGenerated.java +++ b/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/fir/FirVisualizerForRawFirDataGenerated.java @@ -248,6 +248,11 @@ public class FirVisualizerForRawFirDataGenerated extends AbstractFirVisualizer { runTest("compiler/fir/psi2fir/testData/rawBuilder/expressions/nullability.kt"); } + @TestMetadata("qualifierWithTypeArguments.kt") + public void testQualifierWithTypeArguments() throws Exception { + runTest("compiler/fir/psi2fir/testData/rawBuilder/expressions/qualifierWithTypeArguments.kt"); + } + @TestMetadata("simpleReturns.kt") public void testSimpleReturns() throws Exception { runTest("compiler/fir/psi2fir/testData/rawBuilder/expressions/simpleReturns.kt"); diff --git a/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/psi/PsiVisualizerForRawFirDataGenerated.java b/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/psi/PsiVisualizerForRawFirDataGenerated.java index ec13a3b7c52..938a2b6414a 100644 --- a/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/psi/PsiVisualizerForRawFirDataGenerated.java +++ b/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/psi/PsiVisualizerForRawFirDataGenerated.java @@ -248,6 +248,11 @@ public class PsiVisualizerForRawFirDataGenerated extends AbstractPsiVisualizer { runTest("compiler/fir/psi2fir/testData/rawBuilder/expressions/nullability.kt"); } + @TestMetadata("qualifierWithTypeArguments.kt") + public void testQualifierWithTypeArguments() throws Exception { + runTest("compiler/fir/psi2fir/testData/rawBuilder/expressions/qualifierWithTypeArguments.kt"); + } + @TestMetadata("simpleReturns.kt") public void testSimpleReturns() throws Exception { runTest("compiler/fir/psi2fir/testData/rawBuilder/expressions/simpleReturns.kt");