From 5d7ac1877899bbdb0e8089a772a9ccf68109103b Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Tue, 20 Jun 2023 22:04:54 -0700 Subject: [PATCH] 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 --- .../symbol/classes/SymbolLightClassBase.kt | 4 +--- ...stractSymbolLightClassesParentingTestBase.kt | 15 ++++++++++++--- ...ightClassesByPsiForLibraryTestGenerated.java | 6 ++++++ ...sesEqualityByPsiForLibraryTestGenerated.java | 6 ++++++ ...esParentingByPsiForLibraryTestGenerated.java | 6 ++++++ ...LightClassesByPsiForSourceTestGenerated.java | 6 ++++++ ...ssesEqualityByPsiForSourceTestGenerated.java | 6 ++++++ ...sesParentingByPsiForSourceTestGenerated.java | 6 ++++++ .../facades/reifiedInlineReturnsObject.fir.java | 17 +++++++++++++++++ .../facades/reifiedInlineReturnsObject.java | 16 ++++++++++++++++ .../facades/reifiedInlineReturnsObject.kt | 9 +++++++++ .../facades/reifiedInlineReturnsObject.lib.java | 9 +++++++++ 12 files changed, 100 insertions(+), 6 deletions(-) create mode 100644 compiler/testData/asJava/lightClasses/lightClassByPsi/facades/reifiedInlineReturnsObject.fir.java create mode 100644 compiler/testData/asJava/lightClasses/lightClassByPsi/facades/reifiedInlineReturnsObject.java create mode 100644 compiler/testData/asJava/lightClasses/lightClassByPsi/facades/reifiedInlineReturnsObject.kt create mode 100644 compiler/testData/asJava/lightClasses/lightClassByPsi/facades/reifiedInlineReturnsObject.lib.java 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 d4e00ad5a85..ec795e30202 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 class SymbolLightClassBase protected constructor(val ktModule: KtModule 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 83b59bb12df..c22b74c0a3a 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 @@ package org.jetbrains.kotlin.light.classes.symbol.base 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.directives.model.SimpleDirectivesContainer 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 @@ open class AbstractSymbolLightClassesParentingTestBase( } 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 5c7b9b89e08..6bf3b43d75d 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 @@ -429,6 +429,12 @@ public class SymbolLightClassesByPsiForLibraryTestGenerated extends AbstractSymb runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/facades/properties.kt"); } + @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 { 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 d7f4dbcec7f..4cad3d0d5dc 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 @@ -429,6 +429,12 @@ public class SymbolLightClassesEqualityByPsiForLibraryTestGenerated extends Abst runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/facades/properties.kt"); } + @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 { 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 8916c787169..ea3a2bdd945 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 @@ -429,6 +429,12 @@ public class SymbolLightClassesParentingByPsiForLibraryTestGenerated extends Abs runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/facades/properties.kt"); } + @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 { 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 0d620de0319..13ac52965c2 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 @@ -429,6 +429,12 @@ public class SymbolLightClassesByPsiForSourceTestGenerated extends AbstractSymbo runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/facades/properties.kt"); } + @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 { 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 4d7ec17e946..7784759c6f1 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 @@ -429,6 +429,12 @@ public class SymbolLightClassesEqualityByPsiForSourceTestGenerated extends Abstr runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/facades/properties.kt"); } + @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 { 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 2703525a0ac..be37a78087b 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 @@ -429,6 +429,12 @@ public class SymbolLightClassesParentingByPsiForSourceTestGenerated extends Abst runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/facades/properties.kt"); } + @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 { 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 00000000000..c183cacf3e7 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/reifiedInlineReturnsObject.fir.java @@ -0,0 +1,17 @@ +final class null /* null*/ extends PaginatedTableModel { + @java.lang.Override() + @org.jetbrains.annotations.NotNull() + public java.util.List getRows();// getRows() + + private ();// .ctor() +} + +public abstract class PaginatedTableModel /* PaginatedTableModel*/ { + @org.jetbrains.annotations.NotNull() + public abstract java.util.List 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 00000000000..e6264bed580 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/reifiedInlineReturnsObject.java @@ -0,0 +1,16 @@ +final class null /* null*/ extends PaginatedTableModel { + @org.jetbrains.annotations.NotNull() + public java.util.List getRows();// getRows() + + private ();// .ctor() +} + +public abstract class PaginatedTableModel /* PaginatedTableModel*/ { + @org.jetbrains.annotations.NotNull() + public abstract java.util.List 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 00000000000..81e69b65e85 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/reifiedInlineReturnsObject.kt @@ -0,0 +1,9 @@ +abstract class PaginatedTableModel(initialPageSize: Int) { + abstract val rows: List +} + +inline fun MutableList.asTableModel(pageSize : Int = 42) = + object : PaginatedTableModel(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 00000000000..042a246d6f1 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/reifiedInlineReturnsObject.lib.java @@ -0,0 +1,9 @@ +public abstract class PaginatedTableModel /* PaginatedTableModel*/ { + @org.jetbrains.annotations.NotNull() + public abstract java.util.List getRows();// getRows() + + public PaginatedTableModel(int);// .ctor(int) +} + +public final class ReifiedInlineReturnsObjectKt /* ReifiedInlineReturnsObjectKt*/ { +}