From c5a4a5de426436ce6e2eabcdf43d9c96da32fe85 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 13 Oct 2021 15:27:38 +0300 Subject: [PATCH] Make FirArrayOfCallTransformer recursive #KT-49076 Fixed --- ...nosisCompilerFirTestdataTestGenerated.java | 6 ++++ .../intellij/arrayOfImports.fir.txt | 33 +++++++++++++++++++ .../intellij/arrayOfImports.kt | 20 +++++++++++ .../runners/FirDiagnosticTestGenerated.java | 6 ++++ ...DiagnosticsWithLightTreeTestGenerated.java | 6 ++++ ...rCallCompletionResultsWriterTransformer.kt | 4 +-- .../body/resolve/FirArrayOfCallTransformer.kt | 17 ++++++++-- .../FirExpressionsResolveTransformer.kt | 4 +-- ...boutChangingExecutionOrderForVararg.fir.kt | 2 +- 9 files changed, 89 insertions(+), 9 deletions(-) create mode 100644 compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/arrayOfImports.fir.txt create mode 100644 compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/arrayOfImports.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java index 334066ede03..95d021138e8 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java @@ -5057,6 +5057,12 @@ public class DiagnosisCompilerFirTestdataTestGenerated extends AbstractDiagnosis KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij"), Pattern.compile("^([^.]+)\\.kt$"), null, true); } + @Test + @TestMetadata("arrayOfImports.kt") + public void testArrayOfImports() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/arrayOfImports.kt"); + } + @Test @TestMetadata("DailyAggregatedDoubleFactor.kt") public void testDailyAggregatedDoubleFactor() throws Exception { diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/arrayOfImports.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/arrayOfImports.fir.txt new file mode 100644 index 00000000000..fa0a0563d89 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/arrayOfImports.fir.txt @@ -0,0 +1,33 @@ +FILE: arrayOfImports.kt + @R|kotlin/Deprecated|(message = String(Use ...), replaceWith = R|kotlin/ReplaceWith.ReplaceWith|(String(bar), vararg(imports = (String(my.package.bar))))) @R|Third|(first = R|/First.First|(((Q|kotlin/String|))), second = R|/Second.Second|((R|/First.First|(((Q|kotlin/Int|))), R|/First.First|(((Q|kotlin/Double|)))))) @R|Second|(value = ((String()), (R|/First.First|(())))) public final fun foo(): R|kotlin/Unit| { + } + public final annotation class First : R|kotlin/Annotation| { + public constructor(value: R|kotlin/Array>|): R|First| { + super() + } + + public final val value: R|kotlin/Array>| = R|/value| + public get(): R|kotlin/Array>| + + } + public final annotation class Second : R|kotlin/Annotation| { + public constructor(value: R|kotlin/Array|): R|Second| { + super() + } + + public final val value: R|kotlin/Array| = R|/value| + public get(): R|kotlin/Array| + + } + public final annotation class Third : R|kotlin/Annotation| { + public constructor(first: R|First|, second: R|Second|): R|Third| { + super() + } + + public final val first: R|First| = R|/first| + public get(): R|First| + + public final val second: R|Second| = R|/second| + public get(): R|Second| + + } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/arrayOfImports.kt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/arrayOfImports.kt new file mode 100644 index 00000000000..35d586bccdd --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/arrayOfImports.kt @@ -0,0 +1,20 @@ +// WITH_REFLECT + +import kotlin.reflect.KClass + +// See KT-49076 + +@Deprecated("Use ...", ReplaceWith("bar", imports = arrayOf("my.package.bar"))) +@Third( + First(arrayOf(String::class)), + Second(arrayOf(First(arrayOf(Int::class)), First(arrayOf(Double::class)))) +) +// Incorrect array inside +@Second(arrayOf(arrayOf(""), arrayOf(First(arrayOf())))) +fun foo() {} + +annotation class First(val value: Array>) + +annotation class Second(val value: Array) + +annotation class Third(val first: First, val second: Second) diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java index 111bd7ac5ad..fa88bda5e06 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java @@ -5057,6 +5057,12 @@ public class FirDiagnosticTestGenerated extends AbstractFirDiagnosticTest { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij"), Pattern.compile("^([^.]+)\\.kt$"), null, true); } + @Test + @TestMetadata("arrayOfImports.kt") + public void testArrayOfImports() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/arrayOfImports.kt"); + } + @Test @TestMetadata("DailyAggregatedDoubleFactor.kt") public void testDailyAggregatedDoubleFactor() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java index 4ce80734897..e93c3971e67 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java @@ -5057,6 +5057,12 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij"), Pattern.compile("^([^.]+)\\.kt$"), null, true); } + @Test + @TestMetadata("arrayOfImports.kt") + public void testArrayOfImports() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/arrayOfImports.kt"); + } + @Test @TestMetadata("DailyAggregatedDoubleFactor.kt") public void testDailyAggregatedDoubleFactor() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt index 5528777d135..2470b7c3add 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt @@ -251,9 +251,7 @@ class FirCallCompletionResultsWriterTransformer( } if (enableArrayOfCallTransformation) { - arrayOfCallTransformer.toArrayOfCall(result)?.let { - return it - } + return arrayOfCallTransformer.transformFunctionCall(result, null) } return result diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirArrayOfCallTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirArrayOfCallTransformer.kt index 987046353d5..5bb9fe57471 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirArrayOfCallTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirArrayOfCallTransformer.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve +import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.expressions.* @@ -14,13 +15,15 @@ import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.resolve.calls.FirNamedReferenceWithCandidate import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.types.isArrayType +import org.jetbrains.kotlin.fir.visitors.FirDefaultTransformer +import org.jetbrains.kotlin.fir.visitors.FirTransformer /** * A transformer that converts resolved arrayOf() call to [FirArrayOfCall]. * * Note that arrayOf() calls only in [FirAnnotation] or the default value of annotation constructor are transformed. */ -internal class FirArrayOfCallTransformer { +internal class FirArrayOfCallTransformer : FirDefaultTransformer() { private val FirFunctionCall.isArrayOfCall: Boolean get() { val function: FirCallableDeclaration = getOriginalFunction() ?: return false @@ -30,7 +33,7 @@ internal class FirArrayOfCallTransformer { function.receiverTypeRef == null } - internal fun toArrayOfCall(functionCall: FirFunctionCall): FirArrayOfCall? { + private fun toArrayOfCall(functionCall: FirFunctionCall): FirArrayOfCall? { if (!functionCall.isArrayOfCall) { return null } @@ -51,6 +54,16 @@ internal class FirArrayOfCallTransformer { } } + override fun transformFunctionCall(functionCall: FirFunctionCall, data: Nothing?): FirStatement { + functionCall.transformChildren(this, data) + return toArrayOfCall(functionCall) ?: functionCall + } + + override fun transformElement(element: E, data: Nothing?): E { + @Suppress("UNCHECKED_CAST") + return (element.transformChildren(this, data) as E) + } + companion object { private val arrayOfNames = hashSetOf("kotlin/arrayOf") + hashSetOf( diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt index daf6d11bc5a..af42d32440b 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt @@ -380,9 +380,7 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform dataFlowAnalyzer.exitFunctionCall(completeInference, callCompleted) if (callCompleted) { if (enableArrayOfCallTransformation) { - arrayOfCallTransformer.toArrayOfCall(completeInference)?.let { - return it - } + return arrayOfCallTransformer.transformFunctionCall(completeInference, null) } } return completeInference diff --git a/compiler/testData/diagnostics/tests/annotations/dontReportWarningAboutChangingExecutionOrderForVararg.fir.kt b/compiler/testData/diagnostics/tests/annotations/dontReportWarningAboutChangingExecutionOrderForVararg.fir.kt index b1f7ae541cf..a8b58fb1cef 100644 --- a/compiler/testData/diagnostics/tests/annotations/dontReportWarningAboutChangingExecutionOrderForVararg.fir.kt +++ b/compiler/testData/diagnostics/tests/annotations/dontReportWarningAboutChangingExecutionOrderForVararg.fir.kt @@ -7,7 +7,7 @@ fun foo1() {} @Anno(x = ["a", "b"], y = "a") fun foo2() {} -@Anno(x = arrayOf(arrayOf("a"), arrayOf("b")), y = "a") +@Anno(x = arrayOf(arrayOf("a"), arrayOf("b")), y = "a") fun foo3() {} @Anno(x = arrayOf("a", "b"), y = "a")