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 })