[FIR] Add type parameters to FirQualifierExpression

It is needed for resolving qualifiers with type arguments
  like `Array<String>::class`
This commit is contained in:
Dmitriy Novozhilov
2019-11-21 12:55:11 +03:00
parent 9330547f87
commit 43e621530f
37 changed files with 346 additions and 196 deletions
@@ -434,30 +434,43 @@ class ExpressionsConverter(
val firTypeArguments = mutableListOf<FirTypeProjection>()
val valueArguments = mutableListOf<LighterASTNode>()
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()
}
}
@@ -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<FirTypeProjection>()
}
context.firFunctionCalls.removeLast()
}
}
@@ -0,0 +1,3 @@
fun test() {
Array<String>::class
}
@@ -0,0 +1,4 @@
FILE: qualifierWithTypeArguments.kt
public? final? fun test(): R|kotlin/Unit| {
<getClass>(Array#<String>)
}
@@ -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");
+120 -122
View File
@@ -29,7 +29,7 @@ digraph complex_kt {
15 [label="Access variable R|<local>/url|"];
16 [label="Function call: <Unresolved name: HttpRequests>#.<Unresolved name: request>#(R|<local>/url|)"];
17 [label="Function call: <Unresolved name: HttpRequests>#.<Unresolved name: request>#(R|<local>/url|).<Unresolved name: connect>#(<L> = connect@fun <anonymous>(): <ERROR TYPE REF: Unresolved name: fromJson> {
<Unresolved name: GsonBuilder>#().<Unresolved name: create>#().<Unresolved name: fromJson>#(<Unresolved name: it>#.<Unresolved name: inputStream>#.<Ambiguity: reader, [kotlin/io/reader, kotlin/io/reader, kotlin/io/reader]>#(), <getClass>(<Inapplicable(PARAMETER_MAPPING_ERROR): [kotlin/Array.Array]>#<R|class error: Symbol not found, for `PluginDTO`|>()).<Inapplicable(WRONG_RECEIVER): [kotlin/jvm/java]>#)
<Unresolved name: GsonBuilder>#().<Unresolved name: create>#().<Unresolved name: fromJson>#(<Unresolved name: it>#.<Unresolved name: inputStream>#.<Ambiguity: reader, [kotlin/io/reader, kotlin/io/reader, kotlin/io/reader]>#(), <getClass>(Q|kotlin/Array|).R|kotlin/jvm/java|)
}
)"];
18 [label="Exit block"];
@@ -144,12 +144,11 @@ digraph complex_kt {
53 [label="Access variable <Unresolved name: it>#"];
54 [label="Access variable <Unresolved name: inputStream>#"];
55 [label="Function call: <Unresolved name: it>#.<Unresolved name: inputStream>#.<Ambiguity: reader, [kotlin/io/reader, kotlin/io/reader, kotlin/io/reader]>#()"];
56 [label="Function call: <Inapplicable(PARAMETER_MAPPING_ERROR): [kotlin/Array.Array]>#<R|class error: Symbol not found, for `PluginDTO`|>()"];
57 [label="Access variable <Inapplicable(WRONG_RECEIVER): [kotlin/jvm/java]>#"];
58 [label="Access variable <Inapplicable(WRONG_RECEIVER): [kotlin/jvm/java]>#"];
59 [label="Access variable <Inapplicable(WRONG_RECEIVER): [kotlin/jvm/java]>#"];
60 [label="Function call: <Unresolved name: GsonBuilder>#().<Unresolved name: create>#().<Unresolved name: fromJson>#(<Unresolved name: it>#.<Unresolved name: inputStream>#.<Ambiguity: reader, [kotlin/io/reader, kotlin/io/reader, kotlin/io/reader]>#(), <getClass>(<Inapplicable(PARAMETER_MAPPING_ERROR): [kotlin/Array.Array]>#<R|class error: Symbol not found, for `PluginDTO`|>()).<Inapplicable(WRONG_RECEIVER): [kotlin/jvm/java]>#)"];
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: <Unresolved name: GsonBuilder>#().<Unresolved name: create>#().<Unresolved name: fromJson>#(<Unresolved name: it>#.<Unresolved name: inputStream>#.<Ambiguity: reader, [kotlin/io/reader, kotlin/io/reader, kotlin/io/reader]>#(), <getClass>(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|<local>/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|<local>/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|<local>/cause|"];
89 [label="Access variable R|<local>/closeException|"];
90 [label="Function call: R|<local>/cause|.R|kotlin/addSuppressed|(R|<local>/closeException|)"];
91 [label="Exit block"];
86 [label="Enter block"];
87 [label="Access variable R|<local>/cause|"];
88 [label="Access variable R|<local>/closeException|"];
89 [label="Function call: R|<local>/cause|.R|kotlin/addSuppressed|(R|<local>/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|<local>/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 <range>: R|kotlin/sequences/Sequence<*>|"];
112 [label="Access variable R|<local>/<range>|"];
113 [label="Function call: R|<local>/<range>|.R|FakeOverride<kotlin/sequences/Sequence.iterator: R|kotlin/collections/Iterator<kotlin/Any?>|>|()"];
114 [label="Variable declaration: lval <iterator>: R|kotlin/collections/Iterator<kotlin/Any?>|"];
108 [label="Enter function firstIsInstanceOrNull" style="filled" fillcolor=red];
109 [label="Access variable this@R|/firstIsInstanceOrNull|"];
110 [label="Variable declaration: lval <range>: R|kotlin/sequences/Sequence<*>|"];
111 [label="Access variable R|<local>/<range>|"];
112 [label="Function call: R|<local>/<range>|.R|FakeOverride<kotlin/sequences/Sequence.iterator: R|kotlin/collections/Iterator<kotlin/Any?>|>|()"];
113 [label="Variable declaration: lval <iterator>: R|kotlin/collections/Iterator<kotlin/Any?>|"];
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|<local>/<iterator>|"];
118 [label="Function call: R|<local>/<iterator>|.R|kotlin/collections/Iterator.hasNext|()"];
119 [label="Exit loop condition"];
115 [label="Enter loop condition"];
116 [label="Access variable R|<local>/<iterator>|"];
117 [label="Function call: R|<local>/<iterator>|.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|<local>/<iterator>|"];
123 [label="Function call: R|<local>/<iterator>|.R|FakeOverride<kotlin/collections/Iterator.next: R|kotlin/Any?|>|()"];
124 [label="Variable declaration: lval element: R|kotlin/Any?|"];
120 [label="Enter block"];
121 [label="Access variable R|<local>/<iterator>|"];
122 [label="Function call: R|<local>/<iterator>|.R|FakeOverride<kotlin/collections/Iterator.next: R|kotlin/Any?|>|()"];
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|<local>/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|<local>/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|<local>/element|"];
134 [label="Jump: ^firstIsInstanceOrNull R|<local>/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|<local>/element|"];
133 [label="Jump: ^firstIsInstanceOrNull R|<local>/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];
}
+1 -1
View File
@@ -4,7 +4,7 @@ fun fetchPluginReleaseDate(pluginId: PluginId, version: String, channel: String?
val pluginDTOs: Array<PluginDTO> = try {
<!UNRESOLVED_REFERENCE!>HttpRequests<!>.<!UNRESOLVED_REFERENCE!>request<!>(url).<!UNRESOLVED_REFERENCE!>connect<!> {
<!UNRESOLVED_REFERENCE!>GsonBuilder<!>().<!UNRESOLVED_REFERENCE!>create<!>().<!UNRESOLVED_REFERENCE!>fromJson<!>(<!UNRESOLVED_REFERENCE!>it<!>.<!UNRESOLVED_REFERENCE!>inputStream<!>.<!AMBIGUITY!>reader<!>(), <!INAPPLICABLE_CANDIDATE!>Array<!><PluginDTO>::class.<!INAPPLICABLE_CANDIDATE!>java<!>)
<!UNRESOLVED_REFERENCE!>GsonBuilder<!>().<!UNRESOLVED_REFERENCE!>create<!>().<!UNRESOLVED_REFERENCE!>fromJson<!>(<!UNRESOLVED_REFERENCE!>it<!>.<!UNRESOLVED_REFERENCE!>inputStream<!>.<!AMBIGUITY!>reader<!>(), Array<PluginDTO>::class.java)
}
} catch (ioException: JsonIOException) {
throw <!UNRESOLVED_REFERENCE!>IOException<!>(ioException)
+1 -1
View File
@@ -3,7 +3,7 @@ FILE: complex.kt
lval url: R|kotlin/String| = <strcat>(String(https://plugins.jetbrains.com/api/plugins/), R|<local>/pluginId|.<Unresolved name: idString>#.R|kotlin/toString|(), String(/updates?version=), R|<local>/version|.R|kotlin/Any.toString|())
lval pluginDTOs: R|kotlin/Array<class error: Symbol not found, for `PluginDTO`>| = try {
<Unresolved name: HttpRequests>#.<Unresolved name: request>#(R|<local>/url|).<Unresolved name: connect>#(<L> = connect@fun <anonymous>(): <ERROR TYPE REF: Unresolved name: fromJson> {
<Unresolved name: GsonBuilder>#().<Unresolved name: create>#().<Unresolved name: fromJson>#(<Unresolved name: it>#.<Unresolved name: inputStream>#.<Ambiguity: reader, [kotlin/io/reader, kotlin/io/reader, kotlin/io/reader]>#(), <getClass>(<Inapplicable(PARAMETER_MAPPING_ERROR): [kotlin/Array.Array]>#<R|class error: Symbol not found, for `PluginDTO`|>()).<Inapplicable(WRONG_RECEIVER): [kotlin/jvm/java]>#)
<Unresolved name: GsonBuilder>#().<Unresolved name: create>#().<Unresolved name: fromJson>#(<Unresolved name: it>#.<Unresolved name: inputStream>#.<Ambiguity: reader, [kotlin/io/reader, kotlin/io/reader, kotlin/io/reader]>#(), <getClass>(Q|kotlin/Array|).R|kotlin/jvm/java|)
}
)
}
@@ -5,6 +5,6 @@ val kotlinClass: KClass<String> = String::class
fun foo() {
val stringClass = String::class.java
val arrayStringClass = <!INAPPLICABLE_CANDIDATE!>Array<!><String>::class.<!INAPPLICABLE_CANDIDATE!>java<!>
val arrayStringClass = Array<String>::class.java
}
@@ -5,5 +5,5 @@ FILE: reflectionClass.kt
public get(): R|kotlin/reflect/KClass<kotlin/String>|
public final fun foo(): R|kotlin/Unit| {
lval stringClass: R|java/lang/Class<kotlin/String>| = <getClass>(Q|kotlin/String|).R|kotlin/jvm/java|
lval arrayStringClass: <ERROR TYPE REF: Inapplicable(WRONG_RECEIVER): [kotlin/jvm/java]> = <getClass>(<Inapplicable(PARAMETER_MAPPING_ERROR): [kotlin/Array.Array]>#<R|kotlin/String|>()).<Inapplicable(WRONG_RECEIVER): [kotlin/jvm/java]>#
lval arrayStringClass: R|java/lang/Class<kotlin/Array<*>>| = <getClass>(Q|kotlin/Array|).R|kotlin/jvm/java|
}
@@ -170,6 +170,14 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
}
}
private fun List<FirTypeProjection>.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)
}
@@ -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<FirAnnotationCall>
abstract override val safe: Boolean
abstract override val typeArguments: List<FirTypeProjection>
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 <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitArraySetCall(this, data)
abstract override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirArraySetCall
abstract override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirArraySetCall
abstract override fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirArraySetCall
@@ -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<FirAnnotationCall>
abstract override val safe: Boolean
abstract override val typeArguments: List<FirTypeProjection>
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 <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitCallableReferenceAccess(this, data)
abstract override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirCallableReferenceAccess
abstract override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirCallableReferenceAccess
abstract override fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirCallableReferenceAccess
@@ -21,24 +21,24 @@ abstract class FirComponentCall : FirFunctionCall() {
abstract override val typeRef: FirTypeRef
abstract override val annotations: List<FirAnnotationCall>
abstract override val safe: Boolean
abstract override val typeArguments: List<FirTypeProjection>
abstract override val dispatchReceiver: FirExpression
abstract override val extensionReceiver: FirExpression
abstract override val arguments: List<FirExpression>
abstract override val typeArguments: List<FirTypeProjection>
abstract override val calleeReference: FirNamedReference
abstract override val explicitReceiver: FirExpression
abstract val componentIndex: Int
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitComponentCall(this, data)
abstract override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirComponentCall
abstract override fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirComponentCall
abstract override fun <D> transformExtensionReceiver(transformer: FirTransformer<D>, data: D): FirComponentCall
abstract override fun <D> transformArguments(transformer: FirTransformer<D>, data: D): FirComponentCall
abstract override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirComponentCall
abstract override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirComponentCall
abstract override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirComponentCall
@@ -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<FirAnnotationCall>
abstract override val safe: Boolean
abstract override val typeArguments: List<FirTypeProjection>
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 <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitExpressionWithSmartcast(this, data)
abstract override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirExpressionWithSmartcast
abstract override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirExpressionWithSmartcast
abstract override fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirExpressionWithSmartcast
@@ -21,15 +21,17 @@ abstract class FirFunctionCall : FirQualifiedAccessExpression(), FirCall {
abstract override val typeRef: FirTypeRef
abstract override val annotations: List<FirAnnotationCall>
abstract override val safe: Boolean
abstract override val typeArguments: List<FirTypeProjection>
abstract override val explicitReceiver: FirExpression?
abstract override val dispatchReceiver: FirExpression
abstract override val extensionReceiver: FirExpression
abstract override val arguments: List<FirExpression>
abstract val typeArguments: List<FirTypeProjection>
abstract override val calleeReference: FirNamedReference
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitFunctionCall(this, data)
abstract override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirFunctionCall
abstract override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirFunctionCall
abstract override fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirFunctionCall
@@ -38,7 +40,5 @@ abstract class FirFunctionCall : FirQualifiedAccessExpression(), FirCall {
abstract override fun <D> transformArguments(transformer: FirTransformer<D>, data: D): FirFunctionCall
abstract fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirFunctionCall
abstract override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirFunctionCall
}
@@ -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<FirAnnotationCall>
override val safe: Boolean
override val typeArguments: List<FirTypeProjection>
override val explicitReceiver: FirExpression?
override val dispatchReceiver: FirExpression
override val extensionReceiver: FirExpression
@@ -25,6 +27,8 @@ interface FirQualifiedAccess : FirQualifiedAccessWithoutCallee, FirResolvable {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitQualifiedAccess(this, data)
override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirQualifiedAccess
override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccess
override fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccess
@@ -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<FirAnnotationCall>
abstract override val safe: Boolean
abstract override val typeArguments: List<FirTypeProjection>
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 <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitQualifiedAccessExpression(this, data)
abstract override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirQualifiedAccessExpression
abstract override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccessExpression
abstract override fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccessExpression
@@ -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<FirAnnotationCall>
val safe: Boolean
val typeArguments: List<FirTypeProjection>
val explicitReceiver: FirExpression?
val dispatchReceiver: FirExpression
val extensionReceiver: FirExpression
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitQualifiedAccessWithoutCallee(this, data)
fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirQualifiedAccessWithoutCallee
fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccessWithoutCallee
fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccessWithoutCallee
@@ -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<FirTypeProjection>
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitResolvedQualifier(this, data)
abstract fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirResolvedQualifier
}
@@ -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<FirAnnotationCall>
abstract override val safe: Boolean
abstract override val typeArguments: List<FirTypeProjection>
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 <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitThisReceiverExpression(this, data)
abstract override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirThisReceiverExpression
abstract override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirThisReceiverExpression
abstract override fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirThisReceiverExpression
@@ -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<FirAnnotationCall>
abstract override val safe: Boolean
abstract override val typeArguments: List<FirTypeProjection>
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 <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitVariableAssignment(this, data)
abstract override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirVariableAssignment
abstract override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirVariableAssignment
abstract override fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirVariableAssignment
@@ -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<FirAnnotationCall> = mutableListOf()
override var safe: Boolean = false
override val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
override var explicitReceiver: FirExpression? = null
override var dispatchReceiver: FirExpression = FirNoReceiverExpression
override var extensionReceiver: FirExpression = FirNoReceiverExpression
@@ -40,6 +42,7 @@ class FirArraySetCallImpl(
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, 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 <D> transformChildren(transformer: FirTransformer<D>, 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 <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirArraySetCallImpl {
typeArguments.transformInplace(transformer, data)
return this
}
override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirArraySetCallImpl {
explicitReceiver = explicitReceiver?.transformSingle(transformer, data)
return this
@@ -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<FirAnnotationCall> = mutableListOf()
override var safe: Boolean = false
override val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
override var explicitReceiver: FirExpression? = null
override var dispatchReceiver: FirExpression = FirNoReceiverExpression
override var extensionReceiver: FirExpression = FirNoReceiverExpression
@@ -34,6 +36,7 @@ class FirCallableReferenceAccessImpl(
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, 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 <D> transformChildren(transformer: FirTransformer<D>, 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 <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirCallableReferenceAccessImpl {
typeArguments.transformInplace(transformer, data)
return this
}
override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirCallableReferenceAccessImpl {
explicitReceiver = explicitReceiver?.transformSingle(transformer, data)
return this
@@ -31,17 +31,17 @@ class FirComponentCallImpl(
override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null)
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
override val safe: Boolean get() = false
override val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
override val dispatchReceiver: FirExpression get() = FirNoReceiverExpression
override val extensionReceiver: FirExpression get() = FirNoReceiverExpression
override val arguments: MutableList<FirExpression> = mutableListOf()
override val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
override var calleeReference: FirNamedReference = FirSimpleNamedReference(source, Name.identifier("component$componentIndex"), null)
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, 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 <D> transformChildren(transformer: FirTransformer<D>, 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 <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirComponentCallImpl {
typeArguments.transformInplace(transformer, data)
return this
}
override fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirComponentCallImpl {
return this
}
@@ -75,11 +80,6 @@ class FirComponentCallImpl(
return this
}
override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirComponentCallImpl {
typeArguments.transformInplace(transformer, data)
return this
}
override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirComponentCallImpl {
calleeReference = calleeReference.transformSingle(transformer, data)
return this
@@ -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<FirAnnotationCall> get() = originalExpression.annotations
override val safe: Boolean get() = originalExpression.safe
override val typeArguments: List<FirTypeProjection> 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 <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirExpressionWithSmartcast {
throw IllegalStateException()
}
override fun replaceTypeRef(newTypeRef: FirTypeRef) {}
}
@@ -27,16 +27,17 @@ class FirFunctionCallImpl(
override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null)
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
override var safe: Boolean = false
override val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
override var explicitReceiver: FirExpression? = null
override var dispatchReceiver: FirExpression = FirNoReceiverExpression
override var extensionReceiver: FirExpression = FirNoReceiverExpression
override val arguments: MutableList<FirExpression> = mutableListOf()
override val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
override lateinit var calleeReference: FirNamedReference
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, 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 <D> transformChildren(transformer: FirTransformer<D>, 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 <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirFunctionCallImpl {
typeArguments.transformInplace(transformer, data)
return this
}
override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirFunctionCallImpl {
explicitReceiver = explicitReceiver?.transformSingle(transformer, data)
return this
@@ -85,11 +90,6 @@ class FirFunctionCallImpl(
return this
}
override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirFunctionCallImpl {
typeArguments.transformInplace(transformer, data)
return this
}
override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirFunctionCallImpl {
calleeReference = calleeReference.transformSingle(transformer, data)
return this
@@ -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<FirAnnotationCall>
override var safe: Boolean
override val typeArguments: MutableList<FirTypeProjection>
override var explicitReceiver: FirExpression?
override var dispatchReceiver: FirExpression
override var extensionReceiver: FirExpression
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirModifiableQualifiedAccess
override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirModifiableQualifiedAccess
override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirModifiableQualifiedAccess
override fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirModifiableQualifiedAccess
@@ -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<FirAnnotationCall> = mutableListOf()
override var safe: Boolean = false
override val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
override var explicitReceiver: FirExpression? = null
override var dispatchReceiver: FirExpression = FirNoReceiverExpression
override var extensionReceiver: FirExpression = FirNoReceiverExpression
@@ -34,6 +36,7 @@ class FirQualifiedAccessExpressionImpl(
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, 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 <D> transformChildren(transformer: FirTransformer<D>, 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 <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirQualifiedAccessExpressionImpl {
typeArguments.transformInplace(transformer, data)
return this
}
override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccessExpressionImpl {
explicitReceiver = explicitReceiver?.transformSingle(transformer, data)
return this
@@ -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<FirTypeProjection> = mutableListOf()
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
typeRef.accept(visitor, data)
annotations.forEach { it.accept(visitor, data) }
typeArguments.forEach { it.accept(visitor, data) }
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirResolvedQualifierImpl {
typeRef = typeRef.transformSingle(transformer, data)
annotations.transformInplace(transformer, data)
transformTypeArguments(transformer, data)
return this
}
override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirResolvedQualifierImpl {
typeArguments.transformInplace(transformer, data)
return this
}
@@ -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<FirAnnotationCall> = mutableListOf()
override var safe: Boolean = false
override val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
override var explicitReceiver: FirExpression? = null
override var dispatchReceiver: FirExpression = FirNoReceiverExpression
override var extensionReceiver: FirExpression = FirNoReceiverExpression
@@ -34,6 +36,7 @@ class FirThisReceiverExpressionImpl(
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, 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 <D> transformChildren(transformer: FirTransformer<D>, 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 <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirThisReceiverExpressionImpl {
typeArguments.transformInplace(transformer, data)
return this
}
override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirThisReceiverExpressionImpl {
explicitReceiver = explicitReceiver?.transformSingle(transformer, data)
return this
@@ -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<FirAnnotationCall> = mutableListOf()
override val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
override var explicitReceiver: FirExpression? = null
override var dispatchReceiver: FirExpression = FirNoReceiverExpression
override var extensionReceiver: FirExpression = FirNoReceiverExpression
@@ -36,6 +38,7 @@ class FirVariableAssignmentImpl(
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, 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 <D> transformChildren(transformer: FirTransformer<D>, 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 <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirVariableAssignmentImpl {
typeArguments.transformInplace(transformer, data)
return this
}
override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirVariableAssignmentImpl {
explicitReceiver = explicitReceiver?.transformSingle(transformer, data)
return this
@@ -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 {
@@ -34,20 +34,20 @@ FILE fqName:<root> fileName:/callableRefToGenericMember.kt
public open fun toString (): kotlin.String declared in kotlin.Any
$this: VALUE_PARAMETER name:<this> type:kotlin.Any
PROPERTY name:test1 visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:test1 type:kotlin.reflect.KFunction0<kotlin.Unit> visibility:private [final,static]
FIELD PROPERTY_BACKING_FIELD name:test1 type:kotlin.reflect.KFunction1<<root>.A<*>, kotlin.Unit> visibility:private [final,static]
EXPRESSION_BODY
FUNCTION_REFERENCE 'public final fun foo (): kotlin.Unit declared in <root>.A' type=kotlin.reflect.KFunction0<kotlin.Unit> origin=null
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test1> visibility:public modality:FINAL <> () returnType:kotlin.reflect.KFunction0<kotlin.Unit>
FUNCTION_REFERENCE 'public final fun foo (): kotlin.Unit declared in <root>.A' type=kotlin.reflect.KFunction1<<root>.A<*>, kotlin.Unit> origin=null
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test1> visibility:public modality:FINAL <> () returnType:kotlin.reflect.KFunction1<<root>.A<*>, kotlin.Unit>
correspondingProperty: PROPERTY name:test1 visibility:public modality:FINAL [val]
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun <get-test1> (): kotlin.reflect.KFunction0<kotlin.Unit> declared in <root>'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test1 type:kotlin.reflect.KFunction0<kotlin.Unit> visibility:private [final,static]' type=kotlin.reflect.KFunction0<kotlin.Unit> origin=null
RETURN type=kotlin.Nothing from='public final fun <get-test1> (): kotlin.reflect.KFunction1<<root>.A<*>, kotlin.Unit> declared in <root>'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test1 type:kotlin.reflect.KFunction1<<root>.A<*>, kotlin.Unit> visibility:private [final,static]' type=kotlin.reflect.KFunction1<<root>.A<*>, kotlin.Unit> origin=null
PROPERTY name:test2 visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:test2 type:kotlin.reflect.KProperty0<kotlin.Int> visibility:private [final,static]
FIELD PROPERTY_BACKING_FIELD name:test2 type:kotlin.reflect.KProperty1<<root>.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 <get-bar> (): kotlin.Int declared in <root>.A' setter=null type=kotlin.reflect.KProperty0<kotlin.Int> origin=null
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test2> visibility:public modality:FINAL <> () returnType:kotlin.reflect.KProperty0<kotlin.Int>
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 <get-bar> (): kotlin.Int declared in <root>.A' setter=null type=kotlin.reflect.KProperty1<<root>.A<*>, kotlin.Int> origin=null
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test2> visibility:public modality:FINAL <> () returnType:kotlin.reflect.KProperty1<<root>.A<*>, kotlin.Int>
correspondingProperty: PROPERTY name:test2 visibility:public modality:FINAL [val]
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun <get-test2> (): kotlin.reflect.KProperty0<kotlin.Int> declared in <root>'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test2 type:kotlin.reflect.KProperty0<kotlin.Int> visibility:private [final,static]' type=kotlin.reflect.KProperty0<kotlin.Int> origin=null
RETURN type=kotlin.Nothing from='public final fun <get-test2> (): kotlin.reflect.KProperty1<<root>.A<*>, kotlin.Int> declared in <root>'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test2 type:kotlin.reflect.KProperty1<<root>.A<*>, kotlin.Int> visibility:private [final,static]' type=kotlin.reflect.KProperty1<<root>.A<*>, kotlin.Int> origin=null
@@ -68,7 +68,7 @@ FILE fqName:<root> fileName:/genericPropertyRef.kt
FIELD DELEGATE name:additionalText$delegate type:<root>.DVal visibility:private [final,static]
EXPRESSION_BODY
CONSTRUCTOR_CALL 'public constructor <init> (kmember: kotlin.Any) [primary] declared in <root>.DVal' type=<root>.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 <get-text> (): kotlin.String? declared in <root>.Value' setter='public final fun <set-text> (<set-?>: kotlin.String?): kotlin.Unit declared in <root>.Value' type=kotlin.reflect.KMutableProperty0<kotlin.String?> 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 <get-text> (): kotlin.String? declared in <root>.Value' setter='public final fun <set-text> (<set-?>: kotlin.String?): kotlin.Unit declared in <root>.Value' type=kotlin.reflect.KMutableProperty1<<root>.Value<*>, kotlin.String?> origin=null
FUN DELEGATED_PROPERTY_ACCESSOR name:<get-additionalText> 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:<root> fileName:/genericPropertyRef.kt
FIELD DELEGATE name:additionalValue$delegate type:<root>.DVal visibility:private [final,static]
EXPRESSION_BODY
CONSTRUCTOR_CALL 'public constructor <init> (kmember: kotlin.Any) [primary] declared in <root>.DVal' type=<root>.DVal origin=null
kmember: PROPERTY_REFERENCE 'public final value: T of <uninitialized parent> [var]' field=null getter='public final fun <get-value> (): T of <uninitialized parent> declared in <root>.Value' setter='public final fun <set-value> (<set-?>: T of <uninitialized parent>): kotlin.Unit declared in <root>.Value' type=kotlin.reflect.KMutableProperty0<T of <uninitialized parent>> origin=null
kmember: PROPERTY_REFERENCE 'public final value: kotlin.Any? [var]' field=null getter='public final fun <get-value> (): kotlin.Any? declared in <root>.Value' setter='public final fun <set-value> (<set-?>: kotlin.Any?): kotlin.Unit declared in <root>.Value' type=kotlin.reflect.KMutableProperty1<<root>.Value<*>, kotlin.Any?> origin=null
FUN DELEGATED_PROPERTY_ACCESSOR name:<get-additionalValue> visibility:public modality:FINAL <> () returnType:kotlin.Int
correspondingProperty: PROPERTY name:additionalValue visibility:public modality:FINAL [delegated,val]
BLOCK_BODY
@@ -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");
@@ -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");