diff --git a/plugins/kotlin/analysis/src/org/jetbrains/kotlin/idea/modules/IdeJavaModuleResolver.kt b/plugins/kotlin/analysis/src/org/jetbrains/kotlin/idea/modules/IdeJavaModuleResolver.kt new file mode 100644 index 000000000000..3a1658ed5744 --- /dev/null +++ b/plugins/kotlin/analysis/src/org/jetbrains/kotlin/idea/modules/IdeJavaModuleResolver.kt @@ -0,0 +1,56 @@ +/* + * Copyright 2010-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.idea.modules + +import com.intellij.codeInsight.daemon.impl.analysis.JavaModuleGraphUtil +import com.intellij.openapi.project.Project +import com.intellij.openapi.vfs.VirtualFile +import com.intellij.psi.PsiCompiledElement +import com.intellij.psi.PsiJavaModule +import com.intellij.psi.PsiManager +import com.intellij.psi.impl.file.impl.JavaFileManager +import com.intellij.psi.impl.light.LightJavaModule +import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.kotlin.resolve.jvm.modules.* + +class IdeJavaModuleResolver(project: Project) : JavaModuleResolver { + private val psiManager = PsiManager.getInstance(project) + private val fileManager = JavaFileManager.SERVICE.getInstance(project) + private val allScope = GlobalSearchScope.allScope(project) + + override val moduleGraph: JavaModuleGraph = JavaModuleGraph( + object : JavaModuleFinder { + override fun findModule(name: String): JavaModule? { + return fileManager.findModules(name, allScope).singleOrNull()?.toJavaModule() + } + } + ) + + override fun findJavaModule(file: VirtualFile): JavaModule? { + val psiFile = psiManager.findFile(file) ?: return null + return JavaModuleGraphUtil.findDescriptorByElement(psiFile)?.toJavaModule() + } + + private fun PsiJavaModule.toJavaModule(): JavaModule { + if (this is LightJavaModule) { + return JavaModule.Automatic(name, rootVirtualFile) + } + + val virtualFile = containingFile?.virtualFile ?: error("No VirtualFile found for module $this ($javaClass)") + return JavaModule.Explicit(JavaModuleInfo.create(this), virtualFile.parent, virtualFile, this is PsiCompiledElement) + } +} diff --git a/plugins/kotlin/idea/src/META-INF/plugin.xml b/plugins/kotlin/idea/src/META-INF/plugin.xml index de07c6e4151a..0e0e36ff850a 100644 --- a/plugins/kotlin/idea/src/META-INF/plugin.xml +++ b/plugins/kotlin/idea/src/META-INF/plugin.xml @@ -245,6 +245,9 @@ + + diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/caches/resolve/AbstractMultiModuleHighlightingTest.kt b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/caches/resolve/AbstractMultiModuleHighlightingTest.kt index f75e2a6e3a44..1cdd28e1fa4e 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/caches/resolve/AbstractMultiModuleHighlightingTest.kt +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/caches/resolve/AbstractMultiModuleHighlightingTest.kt @@ -20,10 +20,11 @@ import com.intellij.openapi.module.Module import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime import org.jetbrains.kotlin.config.TargetPlatformKind import org.jetbrains.kotlin.idea.stubs.AbstractMultiHighlightingTest +import org.jetbrains.kotlin.test.TestJdkKind abstract class AbstractMultiModuleHighlightingTest : AbstractMultiHighlightingTest() { - protected fun checkHighlightingInAllFiles( + protected open fun checkHighlightingInAllFiles( shouldCheckFile: () -> Boolean = { !file.text.contains("// !CHECK_HIGHLIGHTING") } ) { checkFiles(shouldCheckFile) { @@ -35,9 +36,9 @@ abstract class AbstractMultiModuleHighlightingTest : AbstractMultiHighlightingTe vararg platforms: TargetPlatformKind<*>, withStdlibCommon: Boolean = false, configureModule: (Module, TargetPlatformKind<*>) -> Unit = { _, _ -> }, - useFullJdk: Boolean = false + jdk: TestJdkKind = TestJdkKind.MOCK_JDK ) { - val commonModule = module("common", useFullJdk = useFullJdk) + val commonModule = module("common", jdk) commonModule.createFacet(TargetPlatformKind.Common) if (withStdlibCommon) { commonModule.addLibrary(ForTestCompileRuntime.stdlibCommonForTests()) @@ -49,7 +50,7 @@ abstract class AbstractMultiModuleHighlightingTest : AbstractMultiHighlightingTe is TargetPlatformKind.JavaScript -> "js" else -> error("Unsupported platform: $platform") } - val platformModule = module(path, useFullJdk = useFullJdk) + val platformModule = module(path, jdk) platformModule.createFacet(platform) platformModule.enableMultiPlatform() platformModule.addDependency(commonModule) diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/caches/resolve/Java8MultiModuleHighlightingTest.kt b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/caches/resolve/Java8MultiModuleHighlightingTest.kt index 11b77d36ea6d..b0cc34728f77 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/caches/resolve/Java8MultiModuleHighlightingTest.kt +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/caches/resolve/Java8MultiModuleHighlightingTest.kt @@ -17,12 +17,13 @@ package org.jetbrains.kotlin.idea.caches.resolve import org.jetbrains.kotlin.idea.test.PluginTestCaseBase +import org.jetbrains.kotlin.test.TestJdkKind class Java8MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() { override fun getTestDataPath() = PluginTestCaseBase.getTestDataPathBase() + "/multiModuleHighlighting/" fun testDifferentJdk() { - val module1 = module("jdk8", useFullJdk = true) + val module1 = module("jdk8", TestJdkKind.FULL_JDK) val module2 = module("mockJdk") module1.addDependency(module2) diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/caches/resolve/Java9MultiModuleHighlightingTest.kt b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/caches/resolve/Java9MultiModuleHighlightingTest.kt new file mode 100644 index 000000000000..5df92a156575 --- /dev/null +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/caches/resolve/Java9MultiModuleHighlightingTest.kt @@ -0,0 +1,76 @@ +/* + * Copyright 2010-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.idea.caches.resolve + +import com.intellij.openapi.module.Module +import org.jetbrains.kotlin.idea.test.PluginTestCaseBase +import org.jetbrains.kotlin.test.KotlinTestUtils +import org.jetbrains.kotlin.test.MockLibraryUtil +import org.jetbrains.kotlin.test.TestJdkKind.FULL_JDK_9 + +class Java9MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() { + override fun getTestDataPath(): String = PluginTestCaseBase.getTestDataPathBase() + "/multiModuleHighlighting/java9/" + + private inline fun doTest(test: () -> Unit) { + // Skip this test if no Java 9 is found + if (KotlinTestUtils.getJdk9HomeIfPossible() != null) { + test() + } + } + + private fun module(name: String): Module = super.module(name, FULL_JDK_9, false) + + fun testSimpleModuleExportsPackage() = doTest { + module("main").addDependency(module("dependency")) + checkHighlightingInAllFiles() + } + + fun testSimpleLibraryExportsPackage() = doTest { + val jdk9Home = KotlinTestUtils.getJdk9HomeIfPossible() ?: return + val library = MockLibraryUtil.compileJvmLibraryToJar( + testDataPath + "${getTestName(true)}/library", "library", + extraOptions = listOf("-jdk-home", jdk9Home.path), + useJava9 = true + ) + + module("main").addLibrary(library, "library") + checkHighlightingInAllFiles() + } + + fun testNamedDependsOnUnnamed() = doTest { + module("main").addDependency(module("dependency")) + checkHighlightingInAllFiles() + } + + fun testUnnamedDependsOnNamed() = doTest { + module("main").addDependency(module("dependency")) + checkHighlightingInAllFiles() + } + + fun testDeclarationKinds() = doTest { + module("main").addDependency(module("dependency")) + checkHighlightingInAllFiles() + } + + fun testExportsTo() = doTest { + val d = module("dependency") + module("first").addDependency(d) + module("second").addDependency(d) + module("unnamed").addDependency(d) + checkHighlightingInAllFiles() + } +} diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/caches/resolve/MultiModuleHighlightingTest.kt b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/caches/resolve/MultiModuleHighlightingTest.kt index 093e9141d459..927098d8532b 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/caches/resolve/MultiModuleHighlightingTest.kt +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/caches/resolve/MultiModuleHighlightingTest.kt @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.idea.facet.KotlinFacetConfiguration import org.jetbrains.kotlin.idea.facet.KotlinFacetType import org.jetbrains.kotlin.idea.test.PluginTestCaseBase import org.jetbrains.kotlin.idea.util.application.runWriteAction +import org.jetbrains.kotlin.test.TestJdkKind.FULL_JDK open class MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() { override fun getTestDataPath() = PluginTestCaseBase.getTestDataPathBase() + "/multiModuleHighlighting/" @@ -110,10 +111,10 @@ open class MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() { } fun testLanguageVersionsViaFacets() { - val m1 = module("m1", useFullJdk = true).setupKotlinFacet { + val m1 = module("m1", FULL_JDK).setupKotlinFacet { settings.languageLevel = LanguageVersion.KOTLIN_1_1 } - val m2 = module("m2", useFullJdk = true).setupKotlinFacet { + val m2 = module("m2", FULL_JDK).setupKotlinFacet { settings.languageLevel = LanguageVersion.KOTLIN_1_0 } @@ -174,7 +175,7 @@ open class MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() { fun testUseCorrectBuiltInsForCommonModule() { doMultiPlatformTest(TargetPlatformKind.Jvm[JvmTarget.JVM_1_8], TargetPlatformKind.JavaScript, - withStdlibCommon = true, useFullJdk = true, configureModule = { module, platform -> + withStdlibCommon = true, jdk = FULL_JDK, configureModule = { module, platform -> if (platform == TargetPlatformKind.JavaScript) { module.addLibrary(ForTestCompileRuntime.stdlibJsForTests()) module.addLibrary(ForTestCompileRuntime.stdlibCommonForTests()) diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/stubs/AbstractMultiModuleTest.kt b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/stubs/AbstractMultiModuleTest.kt index 647cb9d54c02..e4e62d596f1f 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/stubs/AbstractMultiModuleTest.kt +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/stubs/AbstractMultiModuleTest.kt @@ -41,6 +41,7 @@ import org.jetbrains.kotlin.idea.test.ConfigLibraryUtil import org.jetbrains.kotlin.idea.test.KotlinJdkAndLibraryProjectDescriptor import org.jetbrains.kotlin.idea.test.PluginTestCaseBase import org.jetbrains.kotlin.test.KotlinTestUtils +import org.jetbrains.kotlin.test.TestJdkKind import org.junit.Assert import java.io.File @@ -53,15 +54,14 @@ abstract class AbstractMultiModuleTest : DaemonAnalyzerTestCase() { VfsRootAccess.allowRootAccess(KotlinTestUtils.getHomeDirectory()) } - protected fun module(name: String, hasTestRoot: Boolean = false, useFullJdk: Boolean = false): Module { + protected fun module(name: String, jdk: TestJdkKind = TestJdkKind.MOCK_JDK, hasTestRoot: Boolean = false): Module { val srcDir = testDataPath + "${getTestName(true)}/$name" val moduleWithSrcRootSet = createModuleFromTestData(srcDir, name, StdModuleTypes.JAVA, true)!! if (hasTestRoot) { setTestRoot(moduleWithSrcRootSet, name) } - val jdkToUse = if (useFullJdk) PluginTestCaseBase.fullJdk() else PluginTestCaseBase.mockJdk() - ConfigLibraryUtil.configureSdk(moduleWithSrcRootSet, jdkToUse) + ConfigLibraryUtil.configureSdk(moduleWithSrcRootSet, PluginTestCaseBase.jdk(jdk)) return moduleWithSrcRootSet } @@ -86,9 +86,9 @@ abstract class AbstractMultiModuleTest : DaemonAnalyzerTestCase() { exported: Boolean = false ) = ModuleRootModificationUtil.addDependency(this, other, dependencyScope, exported) - protected fun Module.addLibrary(jar: File) { + protected fun Module.addLibrary(jar: File, name: String = KotlinJdkAndLibraryProjectDescriptor.LIBRARY_NAME) { ConfigLibraryUtil.addLibrary(NewLibraryEditor().apply { - name = KotlinJdkAndLibraryProjectDescriptor.LIBRARY_NAME + this.name = name addRoot(VfsUtil.getUrlForLibraryRoot(jar), OrderRootType.CLASSES) }, this) } diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/declarationKinds/dependency/module-info.java b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/declarationKinds/dependency/module-info.java new file mode 100644 index 000000000000..1bf49a29559e --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/declarationKinds/dependency/module-info.java @@ -0,0 +1,2 @@ +module dependency { +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/declarationKinds/dependency/unexported/declarationKinds.kt b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/declarationKinds/dependency/unexported/declarationKinds.kt new file mode 100644 index 000000000000..3818da9474e7 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/declarationKinds/dependency/unexported/declarationKinds.kt @@ -0,0 +1,12 @@ +package unexported + +class Klass +interface Interface + +typealias TypeAliasToPublic = String +typealias TypeAliasToUnexported = Klass + +fun function() {} + +val valProperty = "" +var varProperty = "" diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/declarationKinds/main/module-info.java b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/declarationKinds/main/module-info.java new file mode 100644 index 000000000000..d069dfb8d7aa --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/declarationKinds/main/module-info.java @@ -0,0 +1,3 @@ +module main { + requires dependency; +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/declarationKinds/main/usage.kt b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/declarationKinds/main/usage.kt new file mode 100644 index 000000000000..ad6d5883cb10 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/declarationKinds/main/usage.kt @@ -0,0 +1,17 @@ +import unexported.* + +fun usage(): String { + val k: Klass = Klass() + val i: Interface? = null + + val ta1: TypeAliasToPublic = TypeAliasToPublic() + val ta2: TypeAliasToUnexported = TypeAliasToUnexported() + + function() + + valProperty + varProperty + varProperty = "" + + return "$k$i$ta1$ta2" +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/exportsTo/dependency/dependency/Foo.java b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/exportsTo/dependency/dependency/Foo.java new file mode 100644 index 000000000000..cb91cdb96377 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/exportsTo/dependency/dependency/Foo.java @@ -0,0 +1,3 @@ +package dependency; + +public class Foo {} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/exportsTo/dependency/module-info.java b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/exportsTo/dependency/module-info.java new file mode 100644 index 000000000000..aa45063f48eb --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/exportsTo/dependency/module-info.java @@ -0,0 +1,3 @@ +module dependency { + exports dependency to first; +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/exportsTo/first/firstUsage.kt b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/exportsTo/first/firstUsage.kt new file mode 100644 index 000000000000..7ee2415b9f2c --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/exportsTo/first/firstUsage.kt @@ -0,0 +1,6 @@ +import dependency.Foo + +fun firstUsage(): String { + val foo: Foo = Foo() + return foo.toString() +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/exportsTo/first/module-info.java b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/exportsTo/first/module-info.java new file mode 100644 index 000000000000..f217d8c488bc --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/exportsTo/first/module-info.java @@ -0,0 +1,3 @@ +module first { + requires dependency; +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/exportsTo/second/module-info.java b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/exportsTo/second/module-info.java new file mode 100644 index 000000000000..3a5db6643008 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/exportsTo/second/module-info.java @@ -0,0 +1,3 @@ +module second { + requires dependency; +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/exportsTo/second/secondUsage.kt b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/exportsTo/second/secondUsage.kt new file mode 100644 index 000000000000..d239e64fd382 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/exportsTo/second/secondUsage.kt @@ -0,0 +1,6 @@ +import dependency.Foo + +fun secondUsage(): String { + val foo: Foo = Foo() + return foo.toString() +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/exportsTo/unnamed/unnamedUsage.kt b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/exportsTo/unnamed/unnamedUsage.kt new file mode 100644 index 000000000000..a6b343c3ada7 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/exportsTo/unnamed/unnamedUsage.kt @@ -0,0 +1,6 @@ +import dependency.Foo + +fun unnamedUsage(): String { + val foo: Foo = Foo() + return foo.toString() +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/namedDependsOnUnnamed/dependency/dependency/J.java b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/namedDependsOnUnnamed/dependency/dependency/J.java new file mode 100644 index 000000000000..dfd02f230b19 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/namedDependsOnUnnamed/dependency/dependency/J.java @@ -0,0 +1,4 @@ +package dependency; + +public class J { +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/namedDependsOnUnnamed/main/module-info.java b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/namedDependsOnUnnamed/main/module-info.java new file mode 100644 index 000000000000..d069dfb8d7aa --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/namedDependsOnUnnamed/main/module-info.java @@ -0,0 +1,3 @@ +module main { + requires dependency; +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/namedDependsOnUnnamed/main/usage.kt b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/namedDependsOnUnnamed/main/usage.kt new file mode 100644 index 000000000000..a03370a901c5 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/namedDependsOnUnnamed/main/usage.kt @@ -0,0 +1,6 @@ +import dependency.J + +fun usage(): String { + val j: J = J() + return j.toString() +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleLibraryExportsPackage/library/dependency/J.java b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleLibraryExportsPackage/library/dependency/J.java new file mode 100644 index 000000000000..fbbbdfa60372 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleLibraryExportsPackage/library/dependency/J.java @@ -0,0 +1,7 @@ +package dependency; + +import dependency.impl.JImpl; + +public class J { + public static JImpl getInstance() { return new JImpl(); } +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleLibraryExportsPackage/library/dependency/K.kt b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleLibraryExportsPackage/library/dependency/K.kt new file mode 100644 index 000000000000..c9e701dd7c53 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleLibraryExportsPackage/library/dependency/K.kt @@ -0,0 +1,9 @@ +package dependency + +import dependency.impl.KImpl + +open class K { + companion object { + fun getInstance(): KImpl = KImpl() + } +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleLibraryExportsPackage/library/dependency/impl/JImpl.java b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleLibraryExportsPackage/library/dependency/impl/JImpl.java new file mode 100644 index 000000000000..24efaacbfe09 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleLibraryExportsPackage/library/dependency/impl/JImpl.java @@ -0,0 +1,6 @@ +package dependency.impl; + +import dependency.J; + +public class JImpl extends J { +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleLibraryExportsPackage/library/dependency/impl/KImpl.kt b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleLibraryExportsPackage/library/dependency/impl/KImpl.kt new file mode 100644 index 000000000000..389e1b0cc6f4 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleLibraryExportsPackage/library/dependency/impl/KImpl.kt @@ -0,0 +1,5 @@ +package dependency.impl + +import dependency.K + +class KImpl : K() diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleLibraryExportsPackage/library/module-info.java b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleLibraryExportsPackage/library/module-info.java new file mode 100644 index 000000000000..4f71cf3e2230 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleLibraryExportsPackage/library/module-info.java @@ -0,0 +1,3 @@ +module library { + exports dependency; +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleLibraryExportsPackage/main/module-info.java b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleLibraryExportsPackage/main/module-info.java new file mode 100644 index 000000000000..e236e735339d --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleLibraryExportsPackage/main/module-info.java @@ -0,0 +1,3 @@ +module main { + requires library; +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleLibraryExportsPackage/main/usage.kt b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleLibraryExportsPackage/main/usage.kt new file mode 100644 index 000000000000..d90a85f266f5 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleLibraryExportsPackage/main/usage.kt @@ -0,0 +1,16 @@ +import dependency.* +import dependency.J +import dependency.K +import dependency.impl.* +import dependency.impl.JImpl +import dependency.impl.KImpl + +fun usage(): String { + val j: J = J.getInstance() + val k: K = K.getInstance() + + val jImpl: JImpl = J.getInstance() + val kImpl: KImpl = K.getInstance() + + return "$j$k$jImpl$kImpl" +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleModuleExportsPackage/dependency/dependency/J.java b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleModuleExportsPackage/dependency/dependency/J.java new file mode 100644 index 000000000000..fbbbdfa60372 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleModuleExportsPackage/dependency/dependency/J.java @@ -0,0 +1,7 @@ +package dependency; + +import dependency.impl.JImpl; + +public class J { + public static JImpl getInstance() { return new JImpl(); } +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleModuleExportsPackage/dependency/dependency/K.kt b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleModuleExportsPackage/dependency/dependency/K.kt new file mode 100644 index 000000000000..c9e701dd7c53 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleModuleExportsPackage/dependency/dependency/K.kt @@ -0,0 +1,9 @@ +package dependency + +import dependency.impl.KImpl + +open class K { + companion object { + fun getInstance(): KImpl = KImpl() + } +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleModuleExportsPackage/dependency/dependency/impl/JImpl.java b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleModuleExportsPackage/dependency/dependency/impl/JImpl.java new file mode 100644 index 000000000000..24efaacbfe09 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleModuleExportsPackage/dependency/dependency/impl/JImpl.java @@ -0,0 +1,6 @@ +package dependency.impl; + +import dependency.J; + +public class JImpl extends J { +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleModuleExportsPackage/dependency/dependency/impl/KImpl.kt b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleModuleExportsPackage/dependency/dependency/impl/KImpl.kt new file mode 100644 index 000000000000..389e1b0cc6f4 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleModuleExportsPackage/dependency/dependency/impl/KImpl.kt @@ -0,0 +1,5 @@ +package dependency.impl + +import dependency.K + +class KImpl : K() diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleModuleExportsPackage/dependency/module-info.java b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleModuleExportsPackage/dependency/module-info.java new file mode 100644 index 000000000000..577768d30c49 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleModuleExportsPackage/dependency/module-info.java @@ -0,0 +1,3 @@ +module dependency { + exports dependency; +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleModuleExportsPackage/main/module-info.java b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleModuleExportsPackage/main/module-info.java new file mode 100644 index 000000000000..d069dfb8d7aa --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleModuleExportsPackage/main/module-info.java @@ -0,0 +1,3 @@ +module main { + requires dependency; +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleModuleExportsPackage/main/usage.kt b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleModuleExportsPackage/main/usage.kt new file mode 100644 index 000000000000..d90a85f266f5 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/simpleModuleExportsPackage/main/usage.kt @@ -0,0 +1,16 @@ +import dependency.* +import dependency.J +import dependency.K +import dependency.impl.* +import dependency.impl.JImpl +import dependency.impl.KImpl + +fun usage(): String { + val j: J = J.getInstance() + val k: K = K.getInstance() + + val jImpl: JImpl = J.getInstance() + val kImpl: KImpl = K.getInstance() + + return "$j$k$jImpl$kImpl" +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/unnamedDependsOnNamed/dependency/dependency/J.java b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/unnamedDependsOnNamed/dependency/dependency/J.java new file mode 100644 index 000000000000..fbbbdfa60372 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/unnamedDependsOnNamed/dependency/dependency/J.java @@ -0,0 +1,7 @@ +package dependency; + +import dependency.impl.JImpl; + +public class J { + public static JImpl getInstance() { return new JImpl(); } +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/unnamedDependsOnNamed/dependency/dependency/K.kt b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/unnamedDependsOnNamed/dependency/dependency/K.kt new file mode 100644 index 000000000000..c9e701dd7c53 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/unnamedDependsOnNamed/dependency/dependency/K.kt @@ -0,0 +1,9 @@ +package dependency + +import dependency.impl.KImpl + +open class K { + companion object { + fun getInstance(): KImpl = KImpl() + } +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/unnamedDependsOnNamed/dependency/dependency/impl/JImpl.java b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/unnamedDependsOnNamed/dependency/dependency/impl/JImpl.java new file mode 100644 index 000000000000..24efaacbfe09 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/unnamedDependsOnNamed/dependency/dependency/impl/JImpl.java @@ -0,0 +1,6 @@ +package dependency.impl; + +import dependency.J; + +public class JImpl extends J { +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/unnamedDependsOnNamed/dependency/dependency/impl/KImpl.kt b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/unnamedDependsOnNamed/dependency/dependency/impl/KImpl.kt new file mode 100644 index 000000000000..389e1b0cc6f4 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/unnamedDependsOnNamed/dependency/dependency/impl/KImpl.kt @@ -0,0 +1,5 @@ +package dependency.impl + +import dependency.K + +class KImpl : K() diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/unnamedDependsOnNamed/dependency/module-info.java b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/unnamedDependsOnNamed/dependency/module-info.java new file mode 100644 index 000000000000..577768d30c49 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/unnamedDependsOnNamed/dependency/module-info.java @@ -0,0 +1,3 @@ +module dependency { + exports dependency; +} diff --git a/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/unnamedDependsOnNamed/main/usage.kt b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/unnamedDependsOnNamed/main/usage.kt new file mode 100644 index 000000000000..d90a85f266f5 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleHighlighting/java9/unnamedDependsOnNamed/main/usage.kt @@ -0,0 +1,16 @@ +import dependency.* +import dependency.J +import dependency.K +import dependency.impl.* +import dependency.impl.JImpl +import dependency.impl.KImpl + +fun usage(): String { + val j: J = J.getInstance() + val k: K = K.getInstance() + + val jImpl: JImpl = J.getInstance() + val kImpl: KImpl = K.getInstance() + + return "$j$k$jImpl$kImpl" +} diff --git a/plugins/kotlin/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt b/plugins/kotlin/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt index 2706d875e560..7a484fa415f4 100644 --- a/plugins/kotlin/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt +++ b/plugins/kotlin/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt @@ -939,7 +939,7 @@ class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() { } fun testJre9() { - val path = KotlinTestUtils.getJre9HomeIfPossible()?.absolutePath ?: return + val path = KotlinTestUtils.getJdk9HomeIfPossible()?.absolutePath ?: return val jdk = myModel.global.addSdk(JDK_NAME, path, "9", JpsJavaSdkType.INSTANCE) jdk.addRoot(StandardFileSystems.JRT_PROTOCOL_PREFIX + path + URLUtil.JAR_SEPARATOR + "java.base", JpsOrderRootType.COMPILED) diff --git a/plugins/kotlin/test-framework/src/org/jetbrains/kotlin/idea/test/PluginTestCaseBase.java b/plugins/kotlin/test-framework/src/org/jetbrains/kotlin/idea/test/PluginTestCaseBase.java index 0e561b44d2bc..f91c1e84f368 100644 --- a/plugins/kotlin/test-framework/src/org/jetbrains/kotlin/idea/test/PluginTestCaseBase.java +++ b/plugins/kotlin/test-framework/src/org/jetbrains/kotlin/idea/test/PluginTestCaseBase.java @@ -19,8 +19,10 @@ package org.jetbrains.kotlin.idea.test; import com.intellij.openapi.projectRoots.JavaSdk; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.test.KotlinTestUtils; +import org.jetbrains.kotlin.test.TestJdkKind; import java.io.File; @@ -38,19 +40,36 @@ public class PluginTestCaseBase { @NotNull private static Sdk getSdk(String sdkHome, String name) { - return JavaSdk.getInstance().createJdk(name + " JDK", sdkHome, true); + return JavaSdk.getInstance().createJdk(name, sdkHome, true); } @NotNull public static Sdk mockJdk() { - return getSdk("compiler/testData/mockJDK/jre", "Mock"); + return getSdk("compiler/testData/mockJDK/jre", "Mock JDK"); } @NotNull public static Sdk fullJdk() { String javaHome = System.getProperty("java.home"); assert new File(javaHome).isDirectory(); - return getSdk(javaHome, "Full"); + return getSdk(javaHome, "Full JDK"); + } + + @NotNull + public static Sdk jdk(@NotNull TestJdkKind kind) { + switch (kind) { + case MOCK_JDK: + return mockJdk(); + case FULL_JDK_9: + File jre9 = KotlinTestUtils.getJdk9HomeIfPossible(); + assert jre9 != null : "JDK_19 environment variable is not set"; + VfsRootAccess.allowRootAccess(jre9.getPath()); + return getSdk(jre9.getPath(), "Full JDK 9"); + case FULL_JDK: + return fullJdk(); + default: + throw new UnsupportedOperationException(kind.toString()); + } } public static boolean isAllFilesPresentTest(@NotNull String testName) { diff --git a/plugins/kotlin/tests-common/org/jetbrains/kotlin/test/KotlinTestUtils.java b/plugins/kotlin/tests-common/org/jetbrains/kotlin/test/KotlinTestUtils.java index 37bd31ea8da0..a6e485b8c2d0 100644 --- a/plugins/kotlin/tests-common/org/jetbrains/kotlin/test/KotlinTestUtils.java +++ b/plugins/kotlin/tests-common/org/jetbrains/kotlin/test/KotlinTestUtils.java @@ -501,7 +501,7 @@ public class KotlinTestUtils { JvmContentRootsKt.addJvmClasspathRoots(configuration, PathUtil.getJdkClassesRootsFromJre(getJreHome(jdk6))); } else if (jdkKind == TestJdkKind.FULL_JDK_9) { - File home = getJre9HomeIfPossible(); + File home = getJdk9HomeIfPossible(); if (home != null) { configuration.put(JVMConfigurationKeys.JDK_HOME, home); } @@ -529,8 +529,11 @@ public class KotlinTestUtils { } @Nullable - public static File getJre9HomeIfPossible() { + public static File getJdk9HomeIfPossible() { String jdk9 = System.getenv("JDK_19"); + if (jdk9 == null) { + jdk9 = System.getenv("JDK_9"); + } if (jdk9 == null) { // TODO: replace this with a failure as soon as Java 9 is installed on all TeamCity agents System.err.println("Environment variable JDK_19 is not set, the test will be skipped"); diff --git a/plugins/kotlin/tests-common/org/jetbrains/kotlin/test/MockLibraryUtil.kt b/plugins/kotlin/tests-common/org/jetbrains/kotlin/test/MockLibraryUtil.kt index 78522bf267fc..d97d9e5f1a88 100644 --- a/plugins/kotlin/tests-common/org/jetbrains/kotlin/test/MockLibraryUtil.kt +++ b/plugins/kotlin/tests-common/org/jetbrains/kotlin/test/MockLibraryUtil.kt @@ -46,11 +46,11 @@ object MockLibraryUtil { jarName: String, addSources: Boolean = false, extraOptions: List = emptyList(), - extraClasspath: List = emptyList() + extraClasspath: List = emptyList(), + useJava9: Boolean = false ): File { - return compileLibraryToJar( - sourcesPath, KotlinTestUtils.tmpDir("testLibrary-" + jarName), jarName, addSources, extraOptions, extraClasspath - ) + return compileLibraryToJar(sourcesPath, KotlinTestUtils.tmpDir("testLibrary-" + jarName), jarName, addSources, + extraOptions, extraClasspath, useJava9) } @JvmStatic @@ -61,7 +61,8 @@ object MockLibraryUtil { jarName: String, addSources: Boolean = false, extraOptions: List = emptyList(), - extraClasspath: List = emptyList() + extraClasspath: List = emptyList(), + useJava9: Boolean = false ): File { val classesDir = File(contentDir, "classes") @@ -91,7 +92,14 @@ object MockLibraryUtil { "-d", classesDir.path ) - KotlinTestUtils.compileJavaFiles(javaFiles, options) + val compile = + if (useJava9) KotlinTestUtils::compileJavaFilesExternallyWithJava9 + else KotlinTestUtils::compileJavaFiles + + val success = compile(javaFiles, options) + if (!success) { + throw AssertionError("Java files are not compiled successfully") + } } return createJarFile(contentDir, classesDir, jarName, sourcesPath.takeIf { addSources })