diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBodyCodegen.java index 6bdca2dfe34..7872cb03582 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBodyCodegen.java @@ -77,9 +77,13 @@ public abstract class ClassBodyCodegen extends MemberCodegen( @@ -177,21 +176,13 @@ class LightClassDataProviderForClassOrObject(private val classOrObject: KtClassO javaFileStub: PsiJavaFileStub, bindingContext: BindingContext, extraDiagnostics: Diagnostics): WithFileStubAndExtraDiagnostics { - val classDescriptor = bindingContext.get(BindingContext.CLASS, classOrObject) ?: return InvalidLightClassData + bindingContext.get(BindingContext.CLASS, classOrObject) ?: return InvalidLightClassData - val allInnerClasses = CodegenBinding.getAllInnerClasses(bindingContext, classDescriptor) - - val innerClassesMap = ContainerUtil.newHashMap() - for (innerClassDescriptor in allInnerClasses) { - val declaration = descriptorToDeclaration(innerClassDescriptor) as? KtClassOrObject ?: continue - innerClassesMap.put(declaration, InnerKotlinClassLightClassData(declaration)) - } return OutermostKotlinClassLightClassData( javaFileStub, extraDiagnostics, - classOrObject, - innerClassesMap) + classOrObject) } override val files: Collection @@ -211,15 +202,11 @@ class LightClassDataProviderForClassOrObject(private val classOrObject: KtClassO return shouldGenerateClass(processingClassOrObject) } - override fun shouldGenerateClass(processingClassOrObject: KtClassOrObject): Boolean { - // Trivial: generate and analyze class we are interested in. + override fun shouldGenerateClassMembers(processingClassOrObject: KtClassOrObject): Boolean { if (classOrObject === processingClassOrObject) return true - // Process all parent classes as they are context for current class - // Process child classes because they probably affect members (heuristic) - - if (PsiTreeUtil.isAncestor(classOrObject, processingClassOrObject, true) || - PsiTreeUtil.isAncestor(processingClassOrObject, classOrObject, true)) { + // process all children + if (classOrObject.isAncestor(processingClassOrObject, true)) { return true } @@ -245,6 +232,11 @@ class LightClassDataProviderForClassOrObject(private val classOrObject: KtClassO return false } + override fun shouldGenerateClass(processingClassOrObject: KtClassOrObject): Boolean { + // generate outer classes but not their members + return shouldGenerateClassMembers(processingClassOrObject) || processingClassOrObject.isAncestor(classOrObject, true) + } + override fun shouldGenerateScript(script: KtScript): Boolean { return PsiTreeUtil.isAncestor(script, classOrObject, false) } @@ -255,7 +247,7 @@ class LightClassDataProviderForClassOrObject(private val classOrObject: KtClassO val file = classOrObject.containingKtFile val packagePartType = state.fileClassesProvider.getFileClassType(file) val context = state.rootContext.intoPackagePart(packageCodegen.packageFragment, packagePartType, file) - packageCodegen.generateClassOrObject(classOrObject, context) + packageCodegen.generateClassOrObject(getOutermostClassOrObject(classOrObject), context) state.factory.asList() } diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/builder/LightClassStubWithData.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/builder/LightClassStubWithData.kt index e76751d65e7..7d61cadffa0 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/builder/LightClassStubWithData.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/builder/LightClassStubWithData.kt @@ -55,11 +55,5 @@ data class InnerKotlinClassLightClassData( data class OutermostKotlinClassLightClassData( override val javaFileStub: PsiJavaFileStub, override val extraDiagnostics: Diagnostics, - override val classOrObject: KtClassOrObject, - val allInnerClasses: Map -): LightClassDataForKotlinClass, WithFileStubAndExtraDiagnostics { - - fun dataForClass(cls: KtClassOrObject): LightClassDataForKotlinClass? = - if (cls == classOrObject) this else allInnerClasses[cls] - -} + override val classOrObject: KtClassOrObject +): LightClassDataForKotlinClass, WithFileStubAndExtraDiagnostics diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt index 1142d032e58..89d7c823479 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt @@ -388,23 +388,17 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC } fun getLightClassCachedValue(classOrObject: KtClassOrObject): CachedValue { - val outermostClassOrObject = getOutermostClassOrObject(classOrObject) - var value = outermostClassOrObject.getUserData(JAVA_API_STUB) + var value = + getOutermostClassOrObject(classOrObject).getUserData(JAVA_API_STUB) // stub computed for outer class can be used for inner/nested + ?: classOrObject.getUserData (JAVA_API_STUB) if (value == null) { value = CachedValuesManager.getManager(classOrObject.project).createCachedValue( - LightClassDataProviderForClassOrObject(outermostClassOrObject), false) - value = outermostClassOrObject.putUserDataIfAbsent(JAVA_API_STUB, value) + LightClassDataProviderForClassOrObject(classOrObject), false) + value = classOrObject.putUserDataIfAbsent(JAVA_API_STUB, value) } return value } - private fun getOutermostClassOrObject(classOrObject: KtClassOrObject): KtClassOrObject { - val outermostClass = KtPsiUtil.getOutermostClassOrObject(classOrObject) ?: - throw IllegalStateException("Attempt to build a light class for a local class: " + classOrObject.text) - - return outermostClass - } - private fun checkSuperTypeByFQName(classDescriptor: ClassDescriptor, qualifiedName: String, deep: Boolean): Boolean { if (CommonClassNames.JAVA_LANG_OBJECT == qualifiedName) return true @@ -441,3 +435,11 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC override val originKind: LightClassOriginKind get() = LightClassOriginKind.SOURCE } + +fun getOutermostClassOrObject(classOrObject: KtClassOrObject): KtClassOrObject { + val outermostClass = KtPsiUtil.getOutermostClassOrObject(classOrObject) ?: + throw IllegalStateException("Attempt to build a light class for a local class: " + classOrObject.text) + + return outermostClass +} +