Don't consider a directory to be a package if there's a .java or .class file with the same name in its parent directory
#KT-12664 Fixed
This commit is contained in:
@@ -220,7 +220,7 @@ class JvmDependenciesIndexImpl(_roots: List<JavaRoot>): 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<JavaRoot>): 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<String>): List<Cache> {
|
||||
val caches = ArrayList<Cache>(path.size + 1)
|
||||
caches.add(rootCache)
|
||||
|
||||
compiler/testData/compileKotlinAgainstCustomBinaries/innerClassPackageConflict/library/test/Foo.java
Vendored
+7
@@ -0,0 +1,7 @@
|
||||
package test;
|
||||
|
||||
public class Foo {
|
||||
public interface Bar {
|
||||
|
||||
}
|
||||
}
|
||||
+1
@@ -0,0 +1 @@
|
||||
OK
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
import test.Foo.Bar
|
||||
|
||||
val f: Bar? = null
|
||||
@@ -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));
|
||||
|
||||
+11
-4
@@ -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<String, ExitCode> output = compileKotlin("source.kt", tmpdir, jarPath);
|
||||
KotlinTestUtils.assertEqualsToFile(new File(getTestDataDirectory(), "output.txt"), normalizeOutput(output));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user