From 911bfcf1500da64eaa9d828c634815a06b4837ae Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Wed, 1 Sep 2021 13:24:38 +0300 Subject: [PATCH] [FIR IDE] Add basic compiler-side Import Optimizer tests These tests are not complete, but it is intentional - it is just a basic setup, so when the need arise, the tests can be added right away --- .../tests/frontend/api/GenerateTests.kt | 9 +++-- .../unusedFunctionImports.imports | 2 + .../importOptimizer/unusedFunctionImports.kt | 14 +++++++ .../usedFunctionImport.imports | 0 .../importOptimizer/usedFunctionImport.kt | 13 +++++++ .../AbstractHLImportOptimizerTest.kt | 32 ++++++++++++++++ .../HLImportOptimizerTestGenerated.java | 38 +++++++++++++++++++ 7 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 idea/idea-frontend-fir/testData/components/importOptimizer/unusedFunctionImports.imports create mode 100644 idea/idea-frontend-fir/testData/components/importOptimizer/unusedFunctionImports.kt create mode 100644 idea/idea-frontend-fir/testData/components/importOptimizer/usedFunctionImport.imports create mode 100644 idea/idea-frontend-fir/testData/components/importOptimizer/usedFunctionImport.kt create mode 100644 idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/frontend/api/components/AbstractHLImportOptimizerTest.kt create mode 100644 idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/frontend/api/components/HLImportOptimizerTestGenerated.java diff --git a/generators/frontend-api-generator/tests/org/jetbrains/kotlin/generators/tests/frontend/api/GenerateTests.kt b/generators/frontend-api-generator/tests/org/jetbrains/kotlin/generators/tests/frontend/api/GenerateTests.kt index d3239a98cd6..9c47bdc7b12 100644 --- a/generators/frontend-api-generator/tests/org/jetbrains/kotlin/generators/tests/frontend/api/GenerateTests.kt +++ b/generators/frontend-api-generator/tests/org/jetbrains/kotlin/generators/tests/frontend/api/GenerateTests.kt @@ -7,10 +7,7 @@ package org.jetbrains.kotlin.generators.tests.frontend.api import org.jetbrains.kotlin.generators.util.TestGeneratorUtil import org.jetbrains.kotlin.idea.fir.frontend.api.AbstractReferenceResolveTest -import org.jetbrains.kotlin.idea.fir.frontend.api.components.AbstractExpectedExpressionTypeTest -import org.jetbrains.kotlin.idea.fir.frontend.api.components.AbstractHLExpressionTypeTest -import org.jetbrains.kotlin.idea.fir.frontend.api.components.AbstractOverriddenDeclarationProviderTest -import org.jetbrains.kotlin.idea.fir.frontend.api.components.AbstractRendererTest +import org.jetbrains.kotlin.idea.fir.frontend.api.components.* import org.jetbrains.kotlin.idea.fir.frontend.api.fir.AbstractResolveCallTest import org.jetbrains.kotlin.idea.fir.frontend.api.scopes.AbstractFileScopeTest import org.jetbrains.kotlin.idea.fir.frontend.api.scopes.AbstractMemberScopeByFqNameTest @@ -81,6 +78,10 @@ fun main(args: Array) { testClass { model("referenceResolve", pattern = TestGeneratorUtil.KT_WITHOUT_DOTS_IN_NAME) } + + testClass { + model("components/importOptimizer", pattern = TestGeneratorUtil.KT_WITHOUT_DOTS_IN_NAME) + } } testGroup("idea/idea-frontend-fir/idea-fir-low-level-api/tests", "compiler/fir/raw-fir/psi2fir/testData") { diff --git a/idea/idea-frontend-fir/testData/components/importOptimizer/unusedFunctionImports.imports b/idea/idea-frontend-fir/testData/components/importOptimizer/unusedFunctionImports.imports new file mode 100644 index 00000000000..81c9c81a7b1 --- /dev/null +++ b/idea/idea-frontend-fir/testData/components/importOptimizer/unusedFunctionImports.imports @@ -0,0 +1,2 @@ +dependency.bar +dependency.foo \ No newline at end of file diff --git a/idea/idea-frontend-fir/testData/components/importOptimizer/unusedFunctionImports.kt b/idea/idea-frontend-fir/testData/components/importOptimizer/unusedFunctionImports.kt new file mode 100644 index 00000000000..46c11d4b348 --- /dev/null +++ b/idea/idea-frontend-fir/testData/components/importOptimizer/unusedFunctionImports.kt @@ -0,0 +1,14 @@ +// FILE: main.kt +package test + +import dependency.foo +import dependency.bar + +fun usage() {} + +// FILE: dependency.kt +package dependency + +fun foo() {} + +fun bar() {} \ No newline at end of file diff --git a/idea/idea-frontend-fir/testData/components/importOptimizer/usedFunctionImport.imports b/idea/idea-frontend-fir/testData/components/importOptimizer/usedFunctionImport.imports new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/idea-frontend-fir/testData/components/importOptimizer/usedFunctionImport.kt b/idea/idea-frontend-fir/testData/components/importOptimizer/usedFunctionImport.kt new file mode 100644 index 00000000000..b3bec49b3dc --- /dev/null +++ b/idea/idea-frontend-fir/testData/components/importOptimizer/usedFunctionImport.kt @@ -0,0 +1,13 @@ +// FILE: main.kt +package test + +import dependency.foo + +fun usage() { + foo() +} + +// FILE: dependency.kt +package dependency + +fun foo() {} \ No newline at end of file diff --git a/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/frontend/api/components/AbstractHLImportOptimizerTest.kt b/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/frontend/api/components/AbstractHLImportOptimizerTest.kt new file mode 100644 index 00000000000..4c38882dd1a --- /dev/null +++ b/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/frontend/api/components/AbstractHLImportOptimizerTest.kt @@ -0,0 +1,32 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.fir.frontend.api.components + +import org.jetbrains.kotlin.idea.fir.frontend.api.test.framework.AbstractHLApiSingleModuleTest +import org.jetbrains.kotlin.idea.frontend.api.analyse +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.test.model.TestModule +import org.jetbrains.kotlin.test.services.TestServices +import org.jetbrains.kotlin.test.services.assertions + +abstract class AbstractHLImportOptimizerTest : AbstractHLApiSingleModuleTest() { + override fun doTestByFileStructure(ktFiles: List, module: TestModule, testServices: TestServices) { + val mainKtFile = ktFiles.singleOrNull() ?: ktFiles.first { it.name == "main.kt" } + val unusedImports = analyse(mainKtFile) { analyseImports(mainKtFile).unusedImports } + + val unusedImportPaths = unusedImports + .map { it.importPath ?: error("Import $it should have an import path, instead was ${it.text}") } + .sortedBy { it.toString() } // for stable results + + val actualUnusedImports = buildString { + unusedImportPaths.forEach(::appendLine) + } + + val expectedUnusedImports = testDataFileSibling(".imports") + + testServices.assertions.assertEqualsToFile(expectedUnusedImports, actualUnusedImports) + } +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/frontend/api/components/HLImportOptimizerTestGenerated.java b/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/frontend/api/components/HLImportOptimizerTestGenerated.java new file mode 100644 index 00000000000..d787b95621a --- /dev/null +++ b/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/frontend/api/components/HLImportOptimizerTestGenerated.java @@ -0,0 +1,38 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.fir.frontend.api.components; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link GenerateNewCompilerTests.kt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("idea/idea-frontend-fir/testData/components/importOptimizer") +@TestDataPath("$PROJECT_ROOT") +public class HLImportOptimizerTestGenerated extends AbstractHLImportOptimizerTest { + @Test + public void testAllFilesPresentInImportOptimizer() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/idea-frontend-fir/testData/components/importOptimizer"), Pattern.compile("^([^.]+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("unusedFunctionImports.kt") + public void testUnusedFunctionImports() throws Exception { + runTest("idea/idea-frontend-fir/testData/components/importOptimizer/unusedFunctionImports.kt"); + } + + @Test + @TestMetadata("usedFunctionImport.kt") + public void testUsedFunctionImport() throws Exception { + runTest("idea/idea-frontend-fir/testData/components/importOptimizer/usedFunctionImport.kt"); + } +}