diff --git a/compiler/testData/asJava/lightClasses/Delegation.java b/compiler/testData/asJava/lightClasses/Delegation.java new file mode 100644 index 00000000000..e06d816adf2 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/Delegation.java @@ -0,0 +1,9 @@ +public final class B implements p.I { + private final p.I f; + + public B(@org.jetbrains.annotations.NotNull p.I f) { /* compiled code */ } + + public void f() { /* compiled code */ } + + public void g() { /* compiled code */ } +} \ No newline at end of file diff --git a/compiler/testData/asJava/lightClasses/Delegation.kt b/compiler/testData/asJava/lightClasses/Delegation.kt new file mode 100644 index 00000000000..2c1b3d9af0c --- /dev/null +++ b/compiler/testData/asJava/lightClasses/Delegation.kt @@ -0,0 +1,13 @@ +// p.B +package p + +class B(private val f: I) : I by f { +} + +interface I { + fun g() + + fun f() +} + +// LAZINESS:NoLaziness \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java index 490d2d26cc0..1d7a41cadab 100644 --- a/compiler/tests/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java @@ -42,6 +42,12 @@ public class CompilerLightClassTestGenerated extends AbstractCompilerLightClassT doTest(fileName); } + @TestMetadata("Delegation.kt") + public void testDelegation() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/Delegation.kt"); + doTest(fileName); + } + @TestMetadata("DeprecatedEnumEntry.kt") public void testDeprecatedEnumEntry() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/DeprecatedEnumEntry.kt"); diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt index a20de69d60a..836561bf0df 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt @@ -69,10 +69,12 @@ class IDELightClassGenerationSupport(private val project: Project) : LightClassG ) } else { + val hasDelegatedMembers = classOrObject.superTypeListEntries.any { it is KtDelegatedSuperTypeEntry } + val dummyContextProvider = { IDELightClassContexts.lightContextForClassOrObject(classOrObject) } LazyLightClassDataHolder.ForClass( builder, exactContextProvider = { IDELightClassContexts.contextForNonLocalClassOrObject(classOrObject) }, - dummyContextProvider = { IDELightClassContexts.lightContextForClassOrObject(classOrObject) } + dummyContextProvider = if (!hasDelegatedMembers) dummyContextProvider else null ) } } diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractIdeLightClassTest.kt b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractIdeLightClassTest.kt index 5d1a61de3d4..f5792ec8800 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractIdeLightClassTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractIdeLightClassTest.kt @@ -199,6 +199,9 @@ object LightClassLazinessChecker { // still running code above to catch possible exceptions if (lazinessMode == Mode.NoConsistency) return + assertEquals(lightClass.clsDelegate.methods.names(), lightClass.methods.names()) + assertEquals(lightClass.clsDelegate.fields.names(), lightClass.fields.names()) + // check collected data against delegates which should contain correct data for ((field, lightFieldInfo) in fieldsToInfo) { val delegate = (field as KtLightField).clsDelegate @@ -210,6 +213,8 @@ object LightClassLazinessChecker { } } + private fun Array.names() = mapTo(LinkedHashSet()) { it.name } + private data class FieldInfo( val name: String, val modifiers: List diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeCompiledLightClassTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeCompiledLightClassTestGenerated.java index 2ec633a111d..04db837a6ec 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeCompiledLightClassTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeCompiledLightClassTestGenerated.java @@ -42,6 +42,12 @@ public class IdeCompiledLightClassTestGenerated extends AbstractIdeCompiledLight doTest(fileName); } + @TestMetadata("Delegation.kt") + public void testDelegation() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/Delegation.kt"); + doTest(fileName); + } + @TestMetadata("DeprecatedEnumEntry.kt") public void testDeprecatedEnumEntry() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/DeprecatedEnumEntry.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java index 67c1e7061b8..5fb2109aa02 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java @@ -42,6 +42,12 @@ public class IdeLightClassTestGenerated extends AbstractIdeLightClassTest { doTest(fileName); } + @TestMetadata("Delegation.kt") + public void testDelegation() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/Delegation.kt"); + doTest(fileName); + } + @TestMetadata("DeprecatedEnumEntry.kt") public void testDeprecatedEnumEntry() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/DeprecatedEnumEntry.kt");