diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraKtLightClassForFacade.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraKtLightClassForFacade.kt index c2f43a3e776..33fb5924704 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraKtLightClassForFacade.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraKtLightClassForFacade.kt @@ -7,15 +7,16 @@ package org.jetbrains.kotlin.asJava.classes import com.intellij.psi.* import com.intellij.psi.impl.java.stubs.PsiJavaFileStub +import com.intellij.psi.impl.light.LightModifierList import com.intellij.psi.util.CachedValue import org.jetbrains.kotlin.asJava.builder.LightClassData import org.jetbrains.kotlin.asJava.builder.LightClassDataHolder import org.jetbrains.kotlin.asJava.elements.* -import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil -import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil.JVM_MULTIFILE_CLASS_SHORT +import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil.findAnnotationEntryOnFileNoResolve +import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.name.SpecialNames.NO_NAME_PROVIDED import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtProperty @@ -39,25 +40,32 @@ class KtUltraLightClassForFacade( override val javaFileStub: PsiJavaFileStub? = null - private val _modifierList: PsiModifierList = - KtUltraLightSimpleModifierList(owner = this, modifiers = setOf(PsiModifier.PUBLIC, PsiModifier.FINAL)) + private val _modifierList: PsiModifierList by lazyPub { + if (isMultiFileClass) + LightModifierList(manager, KotlinLanguage.INSTANCE, PsiModifier.PUBLIC, PsiModifier.FINAL) + else + KtUltraLightSimpleModifierList(owner = this, modifiers = setOf(PsiModifier.PUBLIC, PsiModifier.FINAL)) + } + + private val isMultiFileClass: Boolean by lazyPub { + files.size > 1 || files.any { findAnnotationEntryOnFileNoResolve(it, JVM_MULTIFILE_CLASS_SHORT) != null } + } private val _givenAnnotations: List? by lazyPub { files.flatMap { file -> - file.annotationEntries.mapNotNull { entry -> - entry.analyzeAnnotation()?.fqName?.let { fqName -> - KtLightAnnotationForSourceEntry( - qualifiedName = fqName.asString(), - kotlinOrigin = entry, - parent = _modifierList, - lazyClsDelegate = null - ) - } + file.annotationEntries.map { entry -> + KtLightAnnotationForSourceEntry( + lazyQualifiedName = { entry.analyzeAnnotation()?.fqName?.asString() }, + kotlinOrigin = entry, + parent = _modifierList, + lazyClsDelegate = null + ) } } } - override val givenAnnotations: List? get() = _givenAnnotations + override val givenAnnotations: List? + get() = if (isMultiFileClass) emptyList() else _givenAnnotations override fun getModifierList(): PsiModifierList = _modifierList diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightAnnotations.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightAnnotations.kt index 2745bf06579..f4b6970c8ea 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightAnnotations.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightAnnotations.kt @@ -5,12 +5,11 @@ package org.jetbrains.kotlin.asJava.classes -import com.intellij.lang.jvm.JvmModifier import com.intellij.psi.* import com.intellij.psi.impl.PsiImplUtil import com.intellij.psi.impl.light.LightIdentifier -import com.intellij.psi.meta.PsiMetaData import org.jetbrains.kotlin.asJava.elements.KtLightAbstractAnnotation +import org.jetbrains.kotlin.asJava.elements.KtLightAnnotationForSourceEntry import org.jetbrains.kotlin.asJava.elements.KtLightElementBase import org.jetbrains.kotlin.asJava.elements.KtLightNullabilityAnnotation import org.jetbrains.kotlin.descriptors.DeclarationDescriptor @@ -50,8 +49,6 @@ class KtUltraLightSimpleAnnotation( ) : KtLightAbstractAnnotation(parent, computeDelegate = null) { override fun getNameReferenceElement(): PsiJavaCodeReferenceElement? = null - override fun getMetaData(): PsiMetaData? = null - private val parameterList = ParameterListImpl() override fun getParameterList(): PsiAnnotationParameterList = parameterList @@ -134,11 +131,4 @@ private class KtUltraLightPsiArrayInitializerMemberValue( override fun isPhysical(): Boolean = false override fun getText(): String = "{" + initializers.joinToString { it.text } + "}" -} - -fun PsiModifierListOwner.isPrivateOrParameterInPrivateMethod(): Boolean { - if (hasModifier(JvmModifier.PRIVATE)) return true - if (this !is PsiParameter) return false - val parentMethod = declarationScope as? PsiMethod ?: return false - return parentMethod.hasModifier(JvmModifier.PRIVATE) -} +} \ No newline at end of file diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightModifierList.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightModifierList.kt index 6e1c3e02792..5bccdbc5f57 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightModifierList.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightModifierList.kt @@ -181,7 +181,7 @@ private fun lightAnnotationsForEntries(lightModifierList: KtLightModifierList<*> } } else null - KtLightAnnotationForSourceEntry(fqName, entry, lightModifierList, lazyClsDelegate) + KtLightAnnotationForSourceEntry({ fqName }, entry, lightModifierList, lazyClsDelegate) } } } diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt index dd882824f6a..bc182e58204 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt @@ -233,7 +233,9 @@ fun fastCheckIsNullabilityApplied(lightElement: KtLightElement<*, PsiModifierLis // all data-class generated members are not-null if (annotatedElement is KtClass && annotatedElement.isData()) return true - if (annotatedElement is KtParameter && lightElement !is PsiField) { //KtParameter but not it's backing field + if (lightElement is PsiField && lightElement.hasModifierProperty(PsiModifier.PRIVATE)) return false + + if (annotatedElement is KtParameter) { val containingClassOrObject = annotatedElement.containingClassOrObject if (containingClassOrObject?.isAnnotation() == true) return false if ((containingClassOrObject as? KtClass)?.isEnum() == true) {