From 98abe080562619c179f91bdf2d373cc0bf0f415a Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 5 Apr 2018 13:14:13 +0300 Subject: [PATCH] Add Java symbol resolve in default star importing scope Related to KT-24098 --- .../kotlin/fir/java/JavaSymbolProvider.kt | 3 ++ .../kotlin/fir/resolve/FirSymbolProvider.kt | 2 + .../impl/FirCompositeSymbolProvider.kt | 4 ++ .../impl/FirLibrarySymbolProviderImpl.kt | 3 ++ .../fir/resolve/impl/FirProviderImpl.kt | 4 ++ .../impl/FirAbstractStarImportingScope.kt | 5 +-- .../testData/fir/resolve/stdlib/concurrent.kt | 5 +++ .../fir/resolve/stdlib/concurrent.txt | 6 +++ .../fir/resolve/stdlib/reflectionClass.kt | 5 +++ .../fir/resolve/stdlib/reflectionClass.txt | 5 +++ .../AbstractFirResolveTestCaseWithStdlib.kt | 16 ++++++++ .../fir/FirResolveTestCaseGenerated.java | 8 ++-- ...FirResolveTestCaseWithStdlibGenerated.java | 41 +++++++++++++++++++ .../generators/tests/GenerateCompilerTests.kt | 7 +++- 14 files changed, 104 insertions(+), 10 deletions(-) create mode 100644 compiler/testData/fir/resolve/stdlib/concurrent.kt create mode 100644 compiler/testData/fir/resolve/stdlib/concurrent.txt create mode 100644 compiler/testData/fir/resolve/stdlib/reflectionClass.kt create mode 100644 compiler/testData/fir/resolve/stdlib/reflectionClass.txt create mode 100644 compiler/tests/org/jetbrains/kotlin/fir/AbstractFirResolveTestCaseWithStdlib.kt create mode 100644 compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseWithStdlibGenerated.java diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt index c2404016dab..26d78bcba9b 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt @@ -16,6 +16,9 @@ import org.jetbrains.kotlin.resolve.jvm.KotlinJavaPsiFacade class JavaSymbolProvider(val project: Project) : FirSymbolProvider { + override val doesLookupInFir: Boolean + get() = false + // TODO: Concrete scope here private val allScope = GlobalSearchScope.allScope(project) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirSymbolProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirSymbolProvider.kt index 7c3984d06f4..5884c0e28bb 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirSymbolProvider.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirSymbolProvider.kt @@ -13,6 +13,8 @@ import org.jetbrains.kotlin.name.FqName interface FirSymbolProvider { + val doesLookupInFir: Boolean + fun getSymbolByFqName(classId: ClassId): ConeSymbol? fun getPackage(fqName: FqName): FqName? // TODO: Replace to symbol sometime diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirCompositeSymbolProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirCompositeSymbolProvider.kt index 31334a34352..c5cc52466f4 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirCompositeSymbolProvider.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirCompositeSymbolProvider.kt @@ -12,6 +12,10 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult class FirCompositeSymbolProvider(val providers: List) : FirSymbolProvider { + + override val doesLookupInFir: Boolean + get() = providers.any(FirSymbolProvider::doesLookupInFir) + override fun getPackage(fqName: FqName): FqName? { return providers.firstNotNullResult { it.getPackage(fqName) } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirLibrarySymbolProviderImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirLibrarySymbolProviderImpl.kt index ae078ec5ca9..0d74f9e0b69 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirLibrarySymbolProviderImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirLibrarySymbolProviderImpl.kt @@ -25,6 +25,9 @@ import java.io.InputStream class FirLibrarySymbolProviderImpl(val session: FirSession) : FirSymbolProvider { + override val doesLookupInFir: Boolean + get() = false + private class BuiltInsPackageFragment(stream: InputStream, val fqName: FqName) { lateinit var version: BuiltInsBinaryVersion diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirProviderImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirProviderImpl.kt index 8e20d0953b3..41ff4db2682 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirProviderImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirProviderImpl.kt @@ -18,6 +18,10 @@ import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName class FirProviderImpl(val session: FirSession) : FirProvider { + + override val doesLookupInFir: Boolean + get() = true + override fun getFirClassifierBySymbol(symbol: ConeSymbol): FirNamedDeclaration? { return when (symbol) { is FirBasedSymbol<*> -> symbol.fir as? FirNamedDeclaration diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractStarImportingScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractStarImportingScope.kt index 812b6dcf350..7a00eb227a5 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractStarImportingScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractStarImportingScope.kt @@ -9,7 +9,6 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirResolvedImport import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.impl.FirCompositeSymbolProvider -import org.jetbrains.kotlin.fir.resolve.impl.FirLibrarySymbolProviderImpl import org.jetbrains.kotlin.fir.scopes.FirPosition import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.symbols.ConeSymbol @@ -20,11 +19,9 @@ abstract class FirAbstractStarImportingScope(val session: FirSession, lookupInFi protected abstract val starImports: List - - // TODO: Abstractify this optimization val provider = FirSymbolProvider.getInstance(session).let { when { - it is FirCompositeSymbolProvider && !lookupInFir -> it.providers.first { it is FirLibrarySymbolProviderImpl } + it is FirCompositeSymbolProvider && !lookupInFir -> FirCompositeSymbolProvider(it.providers.filter { !it.doesLookupInFir }) else -> it } } diff --git a/compiler/testData/fir/resolve/stdlib/concurrent.kt b/compiler/testData/fir/resolve/stdlib/concurrent.kt new file mode 100644 index 00000000000..61e16a120e5 --- /dev/null +++ b/compiler/testData/fir/resolve/stdlib/concurrent.kt @@ -0,0 +1,5 @@ +@Volatile +var xx: Int = 2 + +@Synchronized +fun foo() {} \ No newline at end of file diff --git a/compiler/testData/fir/resolve/stdlib/concurrent.txt b/compiler/testData/fir/resolve/stdlib/concurrent.txt new file mode 100644 index 00000000000..e7d16bf38f5 --- /dev/null +++ b/compiler/testData/fir/resolve/stdlib/concurrent.txt @@ -0,0 +1,6 @@ +FILE: concurrent.kt + @R|kotlin/jvm/Volatile|() public? final? property xx(var): R|kotlin/Int| = STUB + public? get(): R|kotlin/Int| + public? set(value: R|kotlin/Int|): R|kotlin/Unit| + @R|kotlin/jvm/Synchronized|() public? final? function foo(): R|error: Not supported: FirImplicitTypeImpl| { + } diff --git a/compiler/testData/fir/resolve/stdlib/reflectionClass.kt b/compiler/testData/fir/resolve/stdlib/reflectionClass.kt new file mode 100644 index 00000000000..eda72a409cc --- /dev/null +++ b/compiler/testData/fir/resolve/stdlib/reflectionClass.kt @@ -0,0 +1,5 @@ +import kotlin.reflect.KClass + +val javaClass: Class = String::class.java +val kotlinClass: KClass = String::class + diff --git a/compiler/testData/fir/resolve/stdlib/reflectionClass.txt b/compiler/testData/fir/resolve/stdlib/reflectionClass.txt new file mode 100644 index 00000000000..986ce9f93e3 --- /dev/null +++ b/compiler/testData/fir/resolve/stdlib/reflectionClass.txt @@ -0,0 +1,5 @@ +FILE: reflectionClass.kt + public? final? property javaClass(val): R|java/lang/Class| = STUB + public? get(): R|java/lang/Class| + public? final? property kotlinClass(val): R|kotlin/reflect/KClass| = STUB + public? get(): R|kotlin/reflect/KClass| diff --git a/compiler/tests/org/jetbrains/kotlin/fir/AbstractFirResolveTestCaseWithStdlib.kt b/compiler/tests/org/jetbrains/kotlin/fir/AbstractFirResolveTestCaseWithStdlib.kt new file mode 100644 index 00000000000..f7230b7093d --- /dev/null +++ b/compiler/tests/org/jetbrains/kotlin/fir/AbstractFirResolveTestCaseWithStdlib.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. 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.fir + +import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment +import org.jetbrains.kotlin.test.ConfigurationKind +import org.jetbrains.kotlin.test.TestJdkKind + +abstract class AbstractFirResolveTestCaseWithStdlib : AbstractFirResolveTestCase() { + override fun createEnvironment(): KotlinCoreEnvironment { + return createEnvironmentWithJdk(ConfigurationKind.ALL, TestJdkKind.FULL_JDK) + } +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java b/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java index b13b9518296..ebce5cfe089 100644 --- a/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java @@ -26,13 +26,12 @@ public class FirResolveTestCaseGenerated extends AbstractFirResolveTestCase { } public void testAllFilesPresentInResolve() throws Exception { - KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/fir/resolve"), Pattern.compile("^([^.]+)\\.kt$"), TargetBackend.ANY, true); + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/fir/resolve"), Pattern.compile("^([^.]+)\\.kt$"), TargetBackend.ANY, true, "stdlib"); } @TestMetadata("derivedClass.kt") public void testDerivedClass() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/fir/resolve/derivedClass.kt"); - doTest(fileName); + runTest("compiler/testData/fir/resolve/derivedClass.kt"); } @TestMetadata("enum.kt") @@ -62,8 +61,7 @@ public class FirResolveTestCaseGenerated extends AbstractFirResolveTestCase { @TestMetadata("nestedClass.kt") public void testNestedClass() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/fir/resolve/nestedClass.kt"); - doTest(fileName); + runTest("compiler/testData/fir/resolve/nestedClass.kt"); } @TestMetadata("NestedOfAliasedType.kt") diff --git a/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseWithStdlibGenerated.java b/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseWithStdlibGenerated.java new file mode 100644 index 00000000000..6b37f939e9c --- /dev/null +++ b/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseWithStdlibGenerated.java @@ -0,0 +1,41 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. 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.fir; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; +import org.jetbrains.kotlin.test.KotlinTestUtils; +import org.jetbrains.kotlin.test.TargetBackend; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.runner.RunWith; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("compiler/testData/fir/resolve/stdlib") +@TestDataPath("$PROJECT_ROOT") +@RunWith(JUnit3RunnerWithInners.class) +public class FirResolveTestCaseWithStdlibGenerated extends AbstractFirResolveTestCaseWithStdlib { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, TargetBackend.ANY, testDataFilePath); + } + + public void testAllFilesPresentInStdlib() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/fir/resolve/stdlib"), Pattern.compile("^([^.]+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("concurrent.kt") + public void testConcurrent() throws Exception { + runTest("compiler/testData/fir/resolve/stdlib/concurrent.kt"); + } + + @TestMetadata("reflectionClass.kt") + public void testReflectionClass() throws Exception { + runTest("compiler/testData/fir/resolve/stdlib/reflectionClass.kt"); + } +} diff --git a/compiler/tests/org/jetbrains/kotlin/generators/tests/GenerateCompilerTests.kt b/compiler/tests/org/jetbrains/kotlin/generators/tests/GenerateCompilerTests.kt index d9e2ffb7f86..fec60bc2bd6 100644 --- a/compiler/tests/org/jetbrains/kotlin/generators/tests/GenerateCompilerTests.kt +++ b/compiler/tests/org/jetbrains/kotlin/generators/tests/GenerateCompilerTests.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.codegen.defaultConstructor.AbstractDefaultArgumentsR import org.jetbrains.kotlin.codegen.flags.AbstractWriteFlagsTest import org.jetbrains.kotlin.codegen.ir.* import org.jetbrains.kotlin.fir.AbstractFirResolveTestCase +import org.jetbrains.kotlin.fir.AbstractFirResolveTestCaseWithStdlib import org.jetbrains.kotlin.fir.builder.AbstractRawFirBuilderTestCase import org.jetbrains.kotlin.generators.tests.generator.testGroup import org.jetbrains.kotlin.generators.util.KT_OR_KTS_WITHOUT_DOTS_IN_NAME @@ -206,7 +207,11 @@ fun main(args: Array) { } testClass { - model("fir/resolve", pattern = KT_WITHOUT_DOTS_IN_NAME) + model("fir/resolve", pattern = KT_WITHOUT_DOTS_IN_NAME, excludeDirs = listOf("stdlib")) + } + + testClass { + model("fir/resolve/stdlib", pattern = KT_WITHOUT_DOTS_IN_NAME) } testClass {