SLC: drop the assertion that class context shouldn't be null
...because it can be null if an anonymous object is returned as a value
of reified inline function, which isn't materialized as LC element.
^KT-59537 Fixed
diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassBase.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassBase.kt
index d4e00ad..ec795e3 100644
--- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassBase.kt
+++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassBase.kt
@@ -125,9 +125,7 @@
abstract override fun hashCode(): Int
- override fun getContext(): PsiElement = parent ?: buildErrorWithAttachment("parent must not be null") {
- withClassEntry("class", this@SymbolLightClassBase)
- }
+ override fun getContext(): PsiElement? = parent
override fun isEquivalentTo(another: PsiElement?): Boolean = PsiClassImplUtil.isClassEquivalentTo(this, another)
diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesParentingTestBase.kt b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesParentingTestBase.kt
index 83b59bb..c22b74c 100644
--- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesParentingTestBase.kt
+++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesParentingTestBase.kt
@@ -7,6 +7,7 @@
import com.intellij.openapi.project.Project
import com.intellij.psi.*
+import java.nio.file.Path
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator
import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightClassModifierList
import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightMemberModifierList
@@ -17,7 +18,6 @@
import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.services.AssertionsService
import org.junit.Assume
-import java.nio.file.Path
open class AbstractSymbolLightClassesParentingTestBase(
configurator: AnalysisApiTestConfigurator,
@@ -190,9 +190,18 @@
}
private fun checkDeclarationParent(declaration: PsiElement) {
- val expectedParent = declarationStack.lastOrNull() ?: return
+ // NB: we deliberately put these retrievals before the bail-out below so that we can catch any potential exceptions.
+ val context = declaration.context
val parent = declaration.parent
- assertions.assertNotNull(parent) { "Parent should not be null for ${declaration::class} with text ${declaration.text}" }
+ // NB: for a legitimate `null` parent case, e.g., an anonymous object as a return value of reified inline function,
+ // it will not have an expected parent from the stack, and we can bail out early here.
+ val expectedParent = declarationStack.lastOrNull() ?: return
+ assertions.assertNotNull(context) {
+ "context should not be null for ${declaration::class} with text ${declaration.text}"
+ }
+ assertions.assertNotNull(parent) {
+ "Parent should not be null for ${declaration::class} with text ${declaration.text}"
+ }
assertions.assertEquals(expectedParent, parent) {
"Unexpected parent for ${declaration::class} with text ${declaration.text}"
}
diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesByPsiForLibraryTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesByPsiForLibraryTestGenerated.java
index 5c7b9b8..6bf3b43 100644
--- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesByPsiForLibraryTestGenerated.java
+++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesByPsiForLibraryTestGenerated.java
@@ -430,6 +430,12 @@
}
@Test
+ @TestMetadata("reifiedInlineReturnsObject.kt")
+ public void testReifiedInlineReturnsObject() throws Exception {
+ runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/facades/reifiedInlineReturnsObject.kt");
+ }
+
+ @Test
@TestMetadata("simpleFunctions.kt")
public void testSimpleFunctions() throws Exception {
runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/facades/simpleFunctions.kt");
diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesEqualityByPsiForLibraryTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesEqualityByPsiForLibraryTestGenerated.java
index d7f4dbc..4cad3d0 100644
--- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesEqualityByPsiForLibraryTestGenerated.java
+++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesEqualityByPsiForLibraryTestGenerated.java
@@ -430,6 +430,12 @@
}
@Test
+ @TestMetadata("reifiedInlineReturnsObject.kt")
+ public void testReifiedInlineReturnsObject() throws Exception {
+ runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/facades/reifiedInlineReturnsObject.kt");
+ }
+
+ @Test
@TestMetadata("simpleFunctions.kt")
public void testSimpleFunctions() throws Exception {
runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/facades/simpleFunctions.kt");
diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingByPsiForLibraryTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingByPsiForLibraryTestGenerated.java
index 8916c78..ea3a2bd 100644
--- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingByPsiForLibraryTestGenerated.java
+++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingByPsiForLibraryTestGenerated.java
@@ -430,6 +430,12 @@
}
@Test
+ @TestMetadata("reifiedInlineReturnsObject.kt")
+ public void testReifiedInlineReturnsObject() throws Exception {
+ runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/facades/reifiedInlineReturnsObject.kt");
+ }
+
+ @Test
@TestMetadata("simpleFunctions.kt")
public void testSimpleFunctions() throws Exception {
runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/facades/simpleFunctions.kt");
diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesByPsiForSourceTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesByPsiForSourceTestGenerated.java
index 0d620de..13ac529 100644
--- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesByPsiForSourceTestGenerated.java
+++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesByPsiForSourceTestGenerated.java
@@ -430,6 +430,12 @@
}
@Test
+ @TestMetadata("reifiedInlineReturnsObject.kt")
+ public void testReifiedInlineReturnsObject() throws Exception {
+ runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/facades/reifiedInlineReturnsObject.kt");
+ }
+
+ @Test
@TestMetadata("simpleFunctions.kt")
public void testSimpleFunctions() throws Exception {
runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/facades/simpleFunctions.kt");
diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesEqualityByPsiForSourceTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesEqualityByPsiForSourceTestGenerated.java
index 4d7ec17..7784759 100644
--- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesEqualityByPsiForSourceTestGenerated.java
+++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesEqualityByPsiForSourceTestGenerated.java
@@ -430,6 +430,12 @@
}
@Test
+ @TestMetadata("reifiedInlineReturnsObject.kt")
+ public void testReifiedInlineReturnsObject() throws Exception {
+ runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/facades/reifiedInlineReturnsObject.kt");
+ }
+
+ @Test
@TestMetadata("simpleFunctions.kt")
public void testSimpleFunctions() throws Exception {
runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/facades/simpleFunctions.kt");
diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingByPsiForSourceTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingByPsiForSourceTestGenerated.java
index 2703525..be37a78 100644
--- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingByPsiForSourceTestGenerated.java
+++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingByPsiForSourceTestGenerated.java
@@ -430,6 +430,12 @@
}
@Test
+ @TestMetadata("reifiedInlineReturnsObject.kt")
+ public void testReifiedInlineReturnsObject() throws Exception {
+ runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/facades/reifiedInlineReturnsObject.kt");
+ }
+
+ @Test
@TestMetadata("simpleFunctions.kt")
public void testSimpleFunctions() throws Exception {
runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/facades/simpleFunctions.kt");
diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/reifiedInlineReturnsObject.fir.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/reifiedInlineReturnsObject.fir.java
new file mode 100644
index 0000000..c183cac
--- /dev/null
+++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/reifiedInlineReturnsObject.fir.java
@@ -0,0 +1,17 @@
+final class null /* null*/ extends PaginatedTableModel<R> {
+ @java.lang.Override()
+ @org.jetbrains.annotations.NotNull()
+ public java.util.List<R> getRows();// getRows()
+
+ private ();// .ctor()
+}
+
+public abstract class PaginatedTableModel /* PaginatedTableModel*/<R> {
+ @org.jetbrains.annotations.NotNull()
+ public abstract java.util.List<R> getRows();// getRows()
+
+ public PaginatedTableModel(int);// .ctor(int)
+}
+
+public final class ReifiedInlineReturnsObjectKt /* ReifiedInlineReturnsObjectKt*/ {
+}
diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/reifiedInlineReturnsObject.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/reifiedInlineReturnsObject.java
new file mode 100644
index 0000000..e6264be
--- /dev/null
+++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/reifiedInlineReturnsObject.java
@@ -0,0 +1,16 @@
+final class null /* null*/ extends PaginatedTableModel<R> {
+ @org.jetbrains.annotations.NotNull()
+ public java.util.List<R> getRows();// getRows()
+
+ private ();// .ctor()
+}
+
+public abstract class PaginatedTableModel /* PaginatedTableModel*/<R> {
+ @org.jetbrains.annotations.NotNull()
+ public abstract java.util.List<R> getRows();// getRows()
+
+ public PaginatedTableModel(int);// .ctor(int)
+}
+
+public final class ReifiedInlineReturnsObjectKt /* ReifiedInlineReturnsObjectKt*/ {
+}
diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/reifiedInlineReturnsObject.kt b/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/reifiedInlineReturnsObject.kt
new file mode 100644
index 0000000..81e69b6
--- /dev/null
+++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/reifiedInlineReturnsObject.kt
@@ -0,0 +1,9 @@
+abstract class PaginatedTableModel<R>(initialPageSize: Int) {
+ abstract val rows: List<R>
+}
+
+inline fun <reified R> MutableList<R>.asTableModel(pageSize : Int = 42) =
+ object : PaginatedTableModel<R>(pageSize) {
+ override val rows
+ get() = this@asTableModel
+ }
\ No newline at end of file
diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/reifiedInlineReturnsObject.lib.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/reifiedInlineReturnsObject.lib.java
new file mode 100644
index 0000000..042a246
--- /dev/null
+++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/reifiedInlineReturnsObject.lib.java
@@ -0,0 +1,9 @@
+public abstract class PaginatedTableModel /* PaginatedTableModel*/<R> {
+ @org.jetbrains.annotations.NotNull()
+ public abstract java.util.List<R> getRows();// getRows()
+
+ public PaginatedTableModel(int);// .ctor(int)
+}
+
+public final class ReifiedInlineReturnsObjectKt /* ReifiedInlineReturnsObjectKt*/ {
+}