diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirReferenceShortener.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirReferenceShortener.kt
index 02f2372c70f..079620d02b4 100644
--- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirReferenceShortener.kt
+++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirReferenceShortener.kt
@@ -39,6 +39,7 @@ import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.builder.buildFunctionCall
import org.jetbrains.kotlin.fir.expressions.builder.buildPropertyAccessExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
+import org.jetbrains.kotlin.fir.java.scopes.JavaClassMembersEnhancementScope
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
import org.jetbrains.kotlin.fir.references.FirNamedReference
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
@@ -694,10 +695,18 @@ private class ElementsToShortenCollector(
/**
* Class use-site member scopes may contain classifiers which are not actually available without explicit import.
- *
- * See KTIJ-24684 and KTIJ-24662 for examples.
+ * And if the class is declared in Java, it can be represented with JavaClassMembersEnhancementScope.
*/
- val scopes = positionScopes.filterNot { it is FirClassUseSiteMemberScope }
+ val scopes = positionScopes.filter {
+ when (it) {
+ // KTIJ-24684, KTIJ-24662
+ is FirClassUseSiteMemberScope -> false
+ // KTIJ-26785
+ is JavaClassMembersEnhancementScope -> false
+
+ else -> true
+ }
+ }
val name = classId.shortClassName
val availableClassifiers = shorteningContext.findClassifiersInScopesByName(scopes, name)
diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceShortenerTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceShortenerTestGenerated.java
index 09c2d55962e..d4b44eb370f 100644
--- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceShortenerTestGenerated.java
+++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceShortenerTestGenerated.java
@@ -518,9 +518,15 @@ public class FirIdeNormalAnalysisSourceModuleReferenceShortenerTestGenerated ext
}
@Test
- @TestMetadata("nestedClassFromSupertypes.kt")
- public void testNestedClassFromSupertypes() throws Exception {
- runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes.kt");
+ @TestMetadata("nestedClassFromSupertypes1.kt")
+ public void testNestedClassFromSupertypes1() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes1.kt");
+ }
+
+ @Test
+ @TestMetadata("nestedClassFromSupertypes1_java.kt")
+ public void testNestedClassFromSupertypes1_java() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes1_java.kt");
}
@Test
@@ -529,12 +535,24 @@ public class FirIdeNormalAnalysisSourceModuleReferenceShortenerTestGenerated ext
runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes2.kt");
}
+ @Test
+ @TestMetadata("nestedClassFromSupertypes2_java.kt")
+ public void testNestedClassFromSupertypes2_java() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes2_java.kt");
+ }
+
@Test
@TestMetadata("nestedClassFromSupertypes3.kt")
public void testNestedClassFromSupertypes3() throws Exception {
runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes3.kt");
}
+ @Test
+ @TestMetadata("nestedClassFromSupertypes3_java.kt")
+ public void testNestedClassFromSupertypes3_java() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes3_java.kt");
+ }
+
@Test
@TestMetadata("nestedClassFromSupertypes4.kt")
public void testNestedClassFromSupertypes4() throws Exception {
@@ -547,12 +565,24 @@ public class FirIdeNormalAnalysisSourceModuleReferenceShortenerTestGenerated ext
runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes5.kt");
}
+ @Test
+ @TestMetadata("nestedClassFromSupertypes5_java.kt")
+ public void testNestedClassFromSupertypes5_java() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes5_java.kt");
+ }
+
@Test
@TestMetadata("nestedClassFromSupertypes6.kt")
public void testNestedClassFromSupertypes6() throws Exception {
runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes6.kt");
}
+ @Test
+ @TestMetadata("nestedClassFromSupertypes6_java.kt")
+ public void testNestedClassFromSupertypes6_java() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes6_java.kt");
+ }
+
@Nested
@TestMetadata("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/classHeaderPositions")
@TestDataPath("$PROJECT_ROOT")
diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceShortenerTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceShortenerTestGenerated.java
index e07f0e1dc21..482e0222cff 100644
--- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceShortenerTestGenerated.java
+++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceShortenerTestGenerated.java
@@ -518,9 +518,15 @@ public class FirStandaloneNormalAnalysisSourceModuleReferenceShortenerTestGenera
}
@Test
- @TestMetadata("nestedClassFromSupertypes.kt")
- public void testNestedClassFromSupertypes() throws Exception {
- runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes.kt");
+ @TestMetadata("nestedClassFromSupertypes1.kt")
+ public void testNestedClassFromSupertypes1() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes1.kt");
+ }
+
+ @Test
+ @TestMetadata("nestedClassFromSupertypes1_java.kt")
+ public void testNestedClassFromSupertypes1_java() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes1_java.kt");
}
@Test
@@ -529,12 +535,24 @@ public class FirStandaloneNormalAnalysisSourceModuleReferenceShortenerTestGenera
runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes2.kt");
}
+ @Test
+ @TestMetadata("nestedClassFromSupertypes2_java.kt")
+ public void testNestedClassFromSupertypes2_java() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes2_java.kt");
+ }
+
@Test
@TestMetadata("nestedClassFromSupertypes3.kt")
public void testNestedClassFromSupertypes3() throws Exception {
runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes3.kt");
}
+ @Test
+ @TestMetadata("nestedClassFromSupertypes3_java.kt")
+ public void testNestedClassFromSupertypes3_java() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes3_java.kt");
+ }
+
@Test
@TestMetadata("nestedClassFromSupertypes4.kt")
public void testNestedClassFromSupertypes4() throws Exception {
@@ -547,12 +565,24 @@ public class FirStandaloneNormalAnalysisSourceModuleReferenceShortenerTestGenera
runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes5.kt");
}
+ @Test
+ @TestMetadata("nestedClassFromSupertypes5_java.kt")
+ public void testNestedClassFromSupertypes5_java() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes5_java.kt");
+ }
+
@Test
@TestMetadata("nestedClassFromSupertypes6.kt")
public void testNestedClassFromSupertypes6() throws Exception {
runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes6.kt");
}
+ @Test
+ @TestMetadata("nestedClassFromSupertypes6_java.kt")
+ public void testNestedClassFromSupertypes6_java() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes6_java.kt");
+ }
+
@Nested
@TestMetadata("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/classHeaderPositions")
@TestDataPath("$PROJECT_ROOT")
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes1.kt
similarity index 100%
rename from analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes.kt
rename to analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes1.kt
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes1.txt
similarity index 100%
rename from analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes.txt
rename to analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes1.txt
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes1_java.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes1_java.kt
new file mode 100644
index 00000000000..30445b76fdb
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes1_java.kt
@@ -0,0 +1,15 @@
+// FILE: main.kt
+package test
+
+import dependency.JavaInterface
+
+class Foo : JavaInterface {
+ val prop: JavaInterface.Nested = JavaInterface.Nested()
+}
+
+// FILE: dependency/JavaInterface.java
+package dependency;
+
+public interface JavaInterface {
+ public class Nested {}
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes1_java.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes1_java.txt
new file mode 100644
index 00000000000..6f24c15fb43
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes1_java.txt
@@ -0,0 +1,9 @@
+Before shortening: val prop: JavaInterface.Nested = JavaInterface.Nested()
+with DO_NOT_SHORTEN:
+with SHORTEN_IF_ALREADY_IMPORTED:
+with SHORTEN_AND_IMPORT:
+[type] JavaInterface.Nested
+[qualifier] JavaInterface.Nested()
+with SHORTEN_AND_STAR_IMPORT:
+[type] JavaInterface.Nested
+[qualifier] JavaInterface.Nested()
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes2_java.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes2_java.kt
new file mode 100644
index 00000000000..14d1a1a344c
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes2_java.kt
@@ -0,0 +1,16 @@
+// FILE: main.kt
+package test
+
+import dependency.JavaInterface
+import dependency.JavaInterface.Nested
+
+class Foo : JavaInterface {
+ val prop: JavaInterface.Nested = JavaInterface.Nested()
+}
+
+// FILE: dependency/JavaInterface.java
+package dependency;
+
+public interface JavaInterface {
+ public class Nested {}
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes2_java.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes2_java.txt
new file mode 100644
index 00000000000..58949e56f10
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes2_java.txt
@@ -0,0 +1,11 @@
+Before shortening: val prop: JavaInterface.Nested = JavaInterface.Nested()
+with DO_NOT_SHORTEN:
+with SHORTEN_IF_ALREADY_IMPORTED:
+[type] JavaInterface.Nested
+[qualifier] JavaInterface.Nested()
+with SHORTEN_AND_IMPORT:
+[type] JavaInterface.Nested
+[qualifier] JavaInterface.Nested()
+with SHORTEN_AND_STAR_IMPORT:
+[type] JavaInterface.Nested
+[qualifier] JavaInterface.Nested()
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes3_java.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes3_java.kt
new file mode 100644
index 00000000000..34080173467
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes3_java.kt
@@ -0,0 +1,15 @@
+// FILE: main.kt
+package test
+
+import dependency.JavaBaseClass
+
+class Foo : JavaBaseClass() {
+ val prop: JavaBaseClass.Nested = JavaBaseClass.Nested()
+}
+
+// FILE: dependency/JavaBaseClass.java
+package dependency;
+
+public class JavaBaseClass {
+ public static class Nested {}
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes3_java.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes3_java.txt
new file mode 100644
index 00000000000..8068781e282
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes3_java.txt
@@ -0,0 +1,11 @@
+Before shortening: val prop: JavaBaseClass.Nested = JavaBaseClass.Nested()
+with DO_NOT_SHORTEN:
+with SHORTEN_IF_ALREADY_IMPORTED:
+[type] JavaBaseClass.Nested
+[qualifier] JavaBaseClass.Nested()
+with SHORTEN_AND_IMPORT:
+[type] JavaBaseClass.Nested
+[qualifier] JavaBaseClass.Nested()
+with SHORTEN_AND_STAR_IMPORT:
+[type] JavaBaseClass.Nested
+[qualifier] JavaBaseClass.Nested()
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes5_java.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes5_java.kt
new file mode 100644
index 00000000000..2af04e10197
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes5_java.kt
@@ -0,0 +1,15 @@
+// FILE: main.kt
+package test
+
+import dependency.JavaInterface
+
+fun JavaInterface.foo() {
+ val prop: JavaInterface.Nested = JavaInterface.Nested()
+}
+
+// FILE: dependency/JavaInterface.java
+package dependency;
+
+public interface JavaInterface {
+ public class Nested {}
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes5_java.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes5_java.txt
new file mode 100644
index 00000000000..6f24c15fb43
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes5_java.txt
@@ -0,0 +1,9 @@
+Before shortening: val prop: JavaInterface.Nested = JavaInterface.Nested()
+with DO_NOT_SHORTEN:
+with SHORTEN_IF_ALREADY_IMPORTED:
+with SHORTEN_AND_IMPORT:
+[type] JavaInterface.Nested
+[qualifier] JavaInterface.Nested()
+with SHORTEN_AND_STAR_IMPORT:
+[type] JavaInterface.Nested
+[qualifier] JavaInterface.Nested()
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes6_java.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes6_java.kt
new file mode 100644
index 00000000000..707833db675
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes6_java.kt
@@ -0,0 +1,15 @@
+// FILE: main.kt
+package test
+
+import dependency.JavaBaseClass
+
+fun JavaBaseClass.foo() {
+ val prop: JavaBaseClass.Nested = JavaBaseClass.Nested()
+}
+
+// FILE: dependency/JavaBaseClass.java
+package dependency;
+
+public class JavaBaseClass {
+ public static class Nested {}
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes6_java.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes6_java.txt
new file mode 100644
index 00000000000..68f90191280
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses/nestedClassFromSupertypes6_java.txt
@@ -0,0 +1,9 @@
+Before shortening: val prop: JavaBaseClass.Nested = JavaBaseClass.Nested()
+with DO_NOT_SHORTEN:
+with SHORTEN_IF_ALREADY_IMPORTED:
+with SHORTEN_AND_IMPORT:
+[type] JavaBaseClass.Nested
+[qualifier] JavaBaseClass.Nested()
+with SHORTEN_AND_STAR_IMPORT:
+[type] JavaBaseClass.Nested
+[qualifier] JavaBaseClass.Nested()