diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/index/JvmDependenciesIndexImpl.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/index/JvmDependenciesIndexImpl.kt index 9fe484a670a..71d657a0003 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/index/JvmDependenciesIndexImpl.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/index/JvmDependenciesIndexImpl.kt @@ -220,7 +220,7 @@ class JvmDependenciesIndexImpl(_roots: List): JvmDependenciesIndex { } } else { - currentFile = currentFile.findChild(subPackageName) ?: return null + currentFile = currentFile.findChildPackage(subPackageName, pathRoot.type) ?: return null } val correspondingCacheIndex = pathIndex + 1 @@ -233,6 +233,21 @@ class JvmDependenciesIndexImpl(_roots: List): JvmDependenciesIndex { return currentFile } + private fun VirtualFile.findChildPackage(subPackageName: String, rootType: JavaRoot.RootType): VirtualFile? { + val childDirectory = findChild(subPackageName) ?: return null + + // Resolve conflicts between files and packages with the same qualified name in favor of files + val fileExtension = when (rootType) { + JavaRoot.RootType.BINARY -> ".class" + JavaRoot.RootType.SOURCE -> ".java" + } + + if (findChild(subPackageName + fileExtension)?.isDirectory == false) { + return null + } + return childDirectory + } + private fun cachesPath(path: List): List { val caches = ArrayList(path.size + 1) caches.add(rootCache) diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/innerClassPackageConflict/library/test/Foo.java b/compiler/testData/compileKotlinAgainstCustomBinaries/innerClassPackageConflict/library/test/Foo.java new file mode 100644 index 00000000000..93fc3998747 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/innerClassPackageConflict/library/test/Foo.java @@ -0,0 +1,7 @@ +package test; + +public class Foo { + public interface Bar { + + } +} diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/innerClassPackageConflict/library/test/Foo/x.txt b/compiler/testData/compileKotlinAgainstCustomBinaries/innerClassPackageConflict/library/test/Foo/x.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/innerClassPackageConflict/output.txt b/compiler/testData/compileKotlinAgainstCustomBinaries/innerClassPackageConflict/output.txt new file mode 100644 index 00000000000..a0aba9318ad --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/innerClassPackageConflict/output.txt @@ -0,0 +1 @@ +OK \ No newline at end of file diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/innerClassPackageConflict/source.kt b/compiler/testData/compileKotlinAgainstCustomBinaries/innerClassPackageConflict/source.kt new file mode 100644 index 00000000000..bc8bfdcee8d --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/innerClassPackageConflict/source.kt @@ -0,0 +1,3 @@ +import test.Foo.Bar + +val f: Bar? = null diff --git a/compiler/tests-common/org/jetbrains/kotlin/test/MockLibraryUtil.java b/compiler/tests-common/org/jetbrains/kotlin/test/MockLibraryUtil.java index 733f8ae9e5a..8b24db3f51d 100644 --- a/compiler/tests-common/org/jetbrains/kotlin/test/MockLibraryUtil.java +++ b/compiler/tests-common/org/jetbrains/kotlin/test/MockLibraryUtil.java @@ -155,7 +155,7 @@ public class MockLibraryUtil { } } - private static File createJarFile(File contentDir, File dirToAdd, String sourcesPath, String jarName, boolean addSources) throws IOException { + public static File createJarFile(File contentDir, File dirToAdd, String sourcesPath, String jarName, boolean addSources) throws IOException { File jarFile = new File(contentDir, jarName + ".jar"); ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(jarFile)); diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.java index cfc2ce74a83..8fd3537c36f 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.java @@ -40,10 +40,7 @@ import org.jetbrains.kotlin.load.kotlin.JvmMetadataVersion; import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.DescriptorUtils; import org.jetbrains.kotlin.resolve.lazy.JvmResolveUtil; -import org.jetbrains.kotlin.test.ConfigurationKind; -import org.jetbrains.kotlin.test.KotlinTestUtils; -import org.jetbrains.kotlin.test.TestCaseWithTmpdir; -import org.jetbrains.kotlin.test.TestJdkKind; +import org.jetbrains.kotlin.test.*; import org.jetbrains.kotlin.test.util.DescriptorValidator; import org.jetbrains.kotlin.test.util.RecursiveDescriptorComparator; import org.jetbrains.kotlin.utils.ExceptionUtilsKt; @@ -440,4 +437,14 @@ public class CompileKotlinAgainstCustomBinariesTest extends TestCaseWithTmpdir { new File(getTestDataDirectory(), "output.txt"), normalizeOutput(outputMain) ); } + + public void testInnerClassPackageConflict() throws Exception { + compileJava("library"); + FileUtil.copy(new File(getTestDataDirectory(), "library/test/Foo/x.txt"), + new File(tmpdir, "library/test/Foo/x.txt")); + MockLibraryUtil.createJarFile(tmpdir, new File(tmpdir, "library"), null, "library", false); + File jarPath = new File(tmpdir, "library.jar"); + Pair output = compileKotlin("source.kt", tmpdir, jarPath); + KotlinTestUtils.assertEqualsToFile(new File(getTestDataDirectory(), "output.txt"), normalizeOutput(output)); + } }