diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForFacade.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForFacade.kt index 081fa3f7f8b..df736dafef1 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForFacade.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForFacade.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.idea.frontend.api.analyze import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtKotlinPropertySymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPropertySymbol +import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolVisibility import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind import org.jetbrains.kotlin.name.FqName @@ -117,8 +118,18 @@ class FirLightClassForFacade( } for (propertySymbol in propertySymbols) { - val forceStaticAndPropertyVisibility = propertySymbol is KtKotlinPropertySymbol && propertySymbol.isConst - || propertySymbol.hasJvmFieldAnnotation() + val isLateInitWithPublicAccessors = if (propertySymbol is KtKotlinPropertySymbol && propertySymbol.isLateInit) { + val getterIsPublic = propertySymbol.getter?.toPsiVisibilityForMember(isTopLevel = true) + ?.let { it == PsiModifier.PUBLIC } ?: true + val setterIsPublic = propertySymbol.setter?.toPsiVisibilityForMember(isTopLevel = true) + ?.let { it == PsiModifier.PUBLIC } ?: true + getterIsPublic && setterIsPublic + } else false + + val forceStaticAndPropertyVisibility = isLateInitWithPublicAccessors || + (propertySymbol is KtKotlinPropertySymbol && propertySymbol.isConst) || + propertySymbol.hasJvmFieldAnnotation() + createField( propertySymbol, nameGenerator, diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForSymbol.kt index ec7b25a4f6d..e6a752f217f 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForSymbol.kt @@ -23,7 +23,7 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolVisibility import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithVisibility import org.jetbrains.kotlin.load.java.JvmAbi -internal open class FirLightClassForSymbol( +internal class FirLightClassForSymbol( private val classOrObjectSymbol: KtClassOrObjectSymbol, manager: PsiManager ) : FirLightClassForClassOrObjectSymbol(classOrObjectSymbol, manager) { @@ -54,7 +54,7 @@ internal open class FirLightClassForSymbol( private val _modifierList: PsiModifierList? by lazyPub { - val modifiers = mutableSetOf(classOrObjectSymbol.computeVisibility(isTopLevel)) + val modifiers = mutableSetOf(classOrObjectSymbol.toPsiVisibilityForClass(isTopLevel)) classOrObjectSymbol.computeSimpleModality()?.run { modifiers.add(this) } @@ -185,8 +185,9 @@ internal open class FirLightClassForSymbol( for (propertySymbol in propertySymbols) { val isJvmField = propertySymbol.hasJvmFieldAnnotation() val isJvmStatic = propertySymbol.hasJvmStaticAnnotation() + val forceStatic = isObject && (propertySymbol is KtKotlinPropertySymbol && propertySymbol.isConst || isJvmStatic || isJvmField) - val takePropertyVisibility = !isCompanionObject && (isJvmField || (isObject && isJvmStatic)) + val takePropertyVisibility = !isCompanionObject && (isJvmField || forceStatic) createField( declaration = propertySymbol, diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightInterfaceOrAnnotationClassSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightInterfaceOrAnnotationClassSymbol.kt index 400f73b6dc1..71b174a480c 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightInterfaceOrAnnotationClassSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightInterfaceOrAnnotationClassSymbol.kt @@ -29,7 +29,7 @@ internal abstract class FirLightInterfaceOrAnnotationClassSymbol( val isTopLevel: Boolean = classOrObjectSymbol.symbolKind == KtSymbolKind.TOP_LEVEL - val modifiers = mutableSetOf(classOrObjectSymbol.computeVisibility(isTopLevel), PsiModifier.ABSTRACT) + val modifiers = mutableSetOf(classOrObjectSymbol.toPsiVisibilityForClass(isTopLevel), PsiModifier.ABSTRACT) val annotations = classOrObjectSymbol.computeAnnotations( parent = this@FirLightInterfaceOrAnnotationClassSymbol, diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt index 55328f2947a..9b70a5e70a8 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt @@ -22,7 +22,6 @@ import org.jetbrains.kotlin.idea.asJava.* import org.jetbrains.kotlin.idea.frontend.api.analyze import org.jetbrains.kotlin.idea.frontend.api.fir.analyzeWithSymbolAsContext import org.jetbrains.kotlin.idea.frontend.api.symbols.* -import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotatedSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtCommonSymbolModality import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolVisibility import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithDeclarations @@ -155,8 +154,14 @@ internal fun FirLightClassBase.createMethods( } is KtPropertySymbol -> { + if (declaration is KtKotlinPropertySymbol && declaration.isConst) continue + + if (declaration.visibility == KtSymbolVisibility.PRIVATE && + declaration.getter?.hasBody == false && + declaration.setter?.hasBody == false + ) continue + if (declaration.hasJvmFieldAnnotation()) continue - if (declaration.visibility == KtSymbolVisibility.PRIVATE) continue fun KtPropertyAccessorSymbol.needToCreateAccessor(siteTarget: AnnotationUseSiteTarget): Boolean { if (isInline) return false @@ -217,8 +222,8 @@ internal fun FirLightClassBase.createField( property.modality == KtCommonSymbolModality.ABSTRACT -> false property.isHiddenOrSynthetic() -> false property.isLateInit -> true - //IS PARAMETER -> true - property.getter == null && property.setter == null -> true + //TODO Fix it when KtFirConstructorValueParameterSymbol be ready + property.psi.let { it == null || it is KtParameter } -> true property.hasJvmSyntheticAnnotation(AnnotationUseSiteTarget.FIELD) -> false else -> property.hasBackingField } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/fields/FirLightFieldForObjectSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/fields/FirLightFieldForObjectSymbol.kt index 579ed610fef..c34f14f1fbe 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/fields/FirLightFieldForObjectSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/fields/FirLightFieldForObjectSymbol.kt @@ -25,7 +25,7 @@ internal class FirLightFieldForObjectSymbol( override fun getName(): String = name private val _modifierList: PsiModifierList by lazyPub { - val modifiers = setOf(objectSymbol.computeVisibility(isTopLevel = false), PsiModifier.STATIC, PsiModifier.FINAL) + val modifiers = setOf(objectSymbol.toPsiVisibilityForMember(isTopLevel = false), PsiModifier.STATIC, PsiModifier.FINAL) val notNullAnnotation = FirLightSimpleAnnotation("org.jetbrains.annotations.NotNull", this) FirLightClassModifierList(this, modifiers, listOf(notNullAnnotation)) } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/fields/FirLightFieldForPropertySymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/fields/FirLightFieldForPropertySymbol.kt index e883a8701a0..f6b67561033 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/fields/FirLightFieldForPropertySymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/fields/FirLightFieldForPropertySymbol.kt @@ -69,7 +69,7 @@ internal class FirLightFieldForPropertySymbol( } val visibility = - if (takePropertyVisibility) propertySymbol.computeVisibility(isTopLevel = false) else PsiModifier.PRIVATE + if (takePropertyVisibility) propertySymbol.toPsiVisibilityForMember(isTopLevel = false) else PsiModifier.PRIVATE modifiers.add(visibility) if (!suppressFinal) { @@ -82,7 +82,7 @@ internal class FirLightFieldForPropertySymbol( modifiers.add(PsiModifier.VOLATILE) } - val nullability = if (visibility != PsiModifier.PRIVATE) + val nullability = if (visibility != PsiModifier.PRIVATE && !(propertySymbol is KtKotlinPropertySymbol && propertySymbol.isLateInit)) propertySymbol.type.getTypeNullability(propertySymbol, FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) else NullabilityType.Unknown diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/firLightUtils.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/firLightUtils.kt index 18f4a28617e..1a91c52d042 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/firLightUtils.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/firLightUtils.kt @@ -38,6 +38,7 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.* import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.* import org.jetbrains.kotlin.idea.frontend.api.types.* import org.jetbrains.kotlin.load.kotlin.TypeMappingMode +import org.jetbrains.kotlin.load.kotlin.TypeMappingModeInternals import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.types.model.SimpleTypeMarker import java.text.StringCharacterIterator @@ -120,6 +121,7 @@ private fun ConeKotlinType.asPsiType( val correctedType = AnonymousTypesSubstitutor(session, state).substituteOrSelf(this) val signatureWriter = BothSignatureWriter(BothSignatureWriter.Mode.SKIP_CHECKS) + //TODO Check thread safety session.jvmTypeMapper.mapType(correctedType, mode, signatureWriter) @@ -225,23 +227,20 @@ internal fun KtSymbolWithModality.computeModalityForMeth } } -internal fun FirMemberDeclaration.computeVisibility(isTopLevel: Boolean): String { - return when (this.visibility) { - // Top-level private class has PACKAGE_LOCAL visibility in Java - // Nested private class has PRIVATE visibility - Visibilities.Private -> if (isTopLevel) PsiModifier.PACKAGE_LOCAL else PsiModifier.PRIVATE - Visibilities.Protected -> PsiModifier.PROTECTED - else -> PsiModifier.PUBLIC - } -} -internal fun KtSymbolWithVisibility.computeVisibility(isTopLevel: Boolean): String = - visibility.toPsiVisibility(isTopLevel) +internal fun KtSymbolWithVisibility.toPsiVisibilityForMember(isTopLevel: Boolean): String = + visibility.toPsiVisibility(isTopLevel, forClass = false) -internal fun KtSymbolVisibility.toPsiVisibility(isTopLevel: Boolean): String = when (this) { +internal fun KtSymbolWithVisibility.toPsiVisibilityForClass(isTopLevel: Boolean): String = + visibility.toPsiVisibility(isTopLevel, forClass = true) + +internal fun KtSymbolVisibility.toPsiVisibilityForMember(isTopLevel: Boolean): String = + toPsiVisibility(isTopLevel, forClass = false) + +private fun KtSymbolVisibility.toPsiVisibility(isTopLevel: Boolean, forClass: Boolean): String = when (this) { // Top-level private class has PACKAGE_LOCAL visibility in Java // Nested private class has PRIVATE visibility - KtSymbolVisibility.PRIVATE -> if (isTopLevel) PsiModifier.PACKAGE_LOCAL else PsiModifier.PRIVATE + KtSymbolVisibility.PRIVATE -> if (forClass && isTopLevel) PsiModifier.PACKAGE_LOCAL else PsiModifier.PRIVATE KtSymbolVisibility.PROTECTED -> PsiModifier.PROTECTED else -> PsiModifier.PUBLIC } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightAccessorMethodForSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightAccessorMethodForSymbol.kt index 9282450897e..6c1a2023e1a 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightAccessorMethodForSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightAccessorMethodForSymbol.kt @@ -14,21 +14,19 @@ import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.elements.FirLightIdentifier import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.fir.declarations.FirResolvePhase -import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPropertyAccessorSymbol -import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPropertyGetterSymbol -import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPropertySetterSymbol -import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPropertySymbol +import org.jetbrains.kotlin.idea.frontend.api.symbols.* import org.jetbrains.kotlin.idea.util.ifTrue import org.jetbrains.kotlin.load.java.JvmAbi.getterName import org.jetbrains.kotlin.load.java.JvmAbi.setterName import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.psi.KtParameter internal class FirLightAccessorMethodForSymbol( private val propertyAccessorSymbol: KtPropertyAccessorSymbol, - containingPropertySymbol: KtPropertySymbol, + private val containingPropertySymbol: KtPropertySymbol, lightMemberOrigin: LightMemberOrigin?, containingClass: FirLightClassBase, - isTopLevel: Boolean, + private val isTopLevel: Boolean, ) : FirLightMethod( lightMemberOrigin, containingClass, @@ -40,10 +38,12 @@ internal class FirLightAccessorMethodForSymbol( if (isGetter) getterName(this) else setterName(this) private val _name: String by lazyPub { - val defaultName = containingPropertySymbol.name.identifier.let { - if (containingClass.isAnnotationType) it else it.abiName() + propertyAccessorSymbol.getJvmNameFromAnnotation() ?: run { + val defaultName = containingPropertySymbol.name.identifier.let { + if (containingClass.isAnnotationType) it else it.abiName() + } + containingPropertySymbol.computeJvmMethodName(defaultName, containingClass, accessorSite) } - containingPropertySymbol.computeJvmMethodName(defaultName, containingClass, accessorSite) } override fun getName(): String = _name @@ -62,20 +62,34 @@ internal class FirLightAccessorMethodForSymbol( if (propertyAccessorSymbol is KtPropertyGetterSymbol) AnnotationUseSiteTarget.PROPERTY_GETTER else AnnotationUseSiteTarget.PROPERTY_SETTER - private val _annotations: List by lazyPub { + //TODO Fix it when KtFirConstructorValueParameterSymbol be ready + private val isParameter: Boolean get() = containingPropertySymbol.psi.let { it == null || it is KtParameter } - val nullabilityType = if (isGetter) containingPropertySymbol.type + private fun computeAnnotations(isPrivate: Boolean): List { + val nullabilityApplicable = isGetter && + !isPrivate && + !(isParameter && (containingClass.isAnnotationType || containingClass.isEnum)) + + val nullabilityType = if (nullabilityApplicable) containingPropertySymbol.type .getTypeNullability(containingPropertySymbol, FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) else NullabilityType.Unknown - containingPropertySymbol.computeAnnotations( + val annotationsFromProperty = containingPropertySymbol.computeAnnotations( parent = this, nullability = nullabilityType, annotationUseSiteTarget = accessorSite, ) + + val annotationsFromAccessor = propertyAccessorSymbol.computeAnnotations( + parent = this, + nullability = NullabilityType.Unknown, + annotationUseSiteTarget = null, + ) + + return annotationsFromProperty + annotationsFromAccessor } - private val _modifiers: Set by lazyPub { + private fun computeModifiers(): Set { val isOverrideMethod = propertyAccessorSymbol.isOverride || containingPropertySymbol.isOverride val isInterfaceMethod = containingClass.isInterface @@ -90,8 +104,8 @@ internal class FirLightAccessorMethodForSymbol( val visibility = isOverrideMethod.ifTrue { (containingClass as? FirLightClassForSymbol) ?.tryGetEffectiveVisibility(containingPropertySymbol) - ?.toPsiVisibility(isTopLevel) - } ?: propertyAccessorSymbol.computeVisibility(isTopLevel) + ?.toPsiVisibilityForMember(isTopLevel) + } ?: propertyAccessorSymbol.toPsiVisibilityForMember(isTopLevel) modifiers.add(visibility) if (containingPropertySymbol.hasJvmStaticAnnotation(accessorSite)) { @@ -102,11 +116,13 @@ internal class FirLightAccessorMethodForSymbol( modifiers.add(PsiModifier.ABSTRACT) } - modifiers + return modifiers } private val _modifierList: PsiModifierList by lazyPub { - FirLightClassModifierList(this, _modifiers, _annotations) + val modifiers = computeModifiers() + val annotations = computeAnnotations(modifiers.contains(PsiModifier.PRIVATE)) + FirLightClassModifierList(this, modifiers, annotations) } override fun getModifierList(): PsiModifierList = _modifierList diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightConstructorForSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightConstructorForSymbol.kt index ccc75eb7f6f..ec4c7c6abb0 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightConstructorForSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightConstructorForSymbol.kt @@ -42,7 +42,7 @@ internal class FirLightConstructorForSymbol( override fun isDeprecated(): Boolean = _isDeprecated private val _modifiers: Set by lazyPub { - setOf(constructorSymbol.computeVisibility(isTopLevel = false)) + setOf(constructorSymbol.toPsiVisibilityForMember(isTopLevel = false)) } private val _modifierList: PsiModifierList by lazyPub { diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightSimpleMethodForSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightSimpleMethodForSymbol.kt index f511a5089f4..2f65a0c48f1 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightSimpleMethodForSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightSimpleMethodForSymbol.kt @@ -21,9 +21,9 @@ internal class FirLightSimpleMethodForSymbol( lightMemberOrigin: LightMemberOrigin?, containingClass: FirLightClassBase, methodIndex: Int, - isTopLevel: Boolean, + private val isTopLevel: Boolean, argumentsSkipMask: BitSet? = null, - suppressStatic: Boolean = false + private val suppressStatic: Boolean = false ) : FirLightMethodForSymbol( functionSymbol = functionSymbol, lightMemberOrigin = lightMemberOrigin, @@ -55,35 +55,24 @@ internal class FirLightSimpleMethodForSymbol( override fun getTypeParameters(): Array = _typeParameterList?.typeParameters ?: PsiTypeParameter.EMPTY_ARRAY - private val _annotations: List by lazyPub { - val needUnknownNullability = - isVoidReturnType || (_visibility == PsiModifier.PRIVATE) - - val nullability = if (needUnknownNullability) + private fun computeAnnotations(isPrivate: Boolean): List { + val nullability = if (isVoidReturnType || isPrivate) NullabilityType.Unknown else functionSymbol.type.getTypeNullability( context = functionSymbol, phase = FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE ) - functionSymbol.computeAnnotations( + return functionSymbol.computeAnnotations( parent = this, nullability = nullability, annotationUseSiteTarget = null, ) } - private val _visibility: String by lazyPub { - functionSymbol.isOverride.ifTrue { - (containingClass as? FirLightClassForSymbol) - ?.tryGetEffectiveVisibility(functionSymbol) - ?.toPsiVisibility(isTopLevel) - } ?: functionSymbol.computeVisibility(isTopLevel = isTopLevel) - } + private fun computeModifiers(): Set { - private val _modifiers: Set by lazyPub { - - if (functionSymbol.hasInlineOnlyAnnotation()) return@lazyPub setOf(PsiModifier.FINAL, PsiModifier.PRIVATE) + if (functionSymbol.hasInlineOnlyAnnotation()) return setOf(PsiModifier.FINAL, PsiModifier.PRIVATE) val finalModifier = kotlinOrigin?.hasModifier(KtTokens.FINAL_KEYWORD) == true @@ -95,7 +84,13 @@ internal class FirLightSimpleMethodForSymbol( result = modifiers ) - modifiers.add(_visibility) + val visibility: String = functionSymbol.isOverride.ifTrue { + (containingClass as? FirLightClassForSymbol) + ?.tryGetEffectiveVisibility(functionSymbol) + ?.toPsiVisibilityForMember(isTopLevel) + } ?: functionSymbol.toPsiVisibilityForMember(isTopLevel = isTopLevel) + + modifiers.add(visibility) if (!suppressStatic && functionSymbol.hasJvmStaticAnnotation()) { modifiers.add(PsiModifier.STATIC) @@ -107,7 +102,7 @@ internal class FirLightSimpleMethodForSymbol( modifiers.add(PsiModifier.SYNCHRONIZED) } - modifiers + return modifiers } private val _isDeprecated: Boolean by lazyPub { @@ -117,7 +112,9 @@ internal class FirLightSimpleMethodForSymbol( override fun isDeprecated(): Boolean = _isDeprecated private val _modifierList: PsiModifierList by lazyPub { - FirLightClassModifierList(this, _modifiers, _annotations) + val modifiers = computeModifiers() + val annotations = computeAnnotations(modifiers.contains(PsiModifier.PRIVATE)) + FirLightClassModifierList(this, modifiers, annotations) } override fun getModifierList(): PsiModifierList = _modifierList diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/parameters/FirLightParameterForReceiver.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/parameters/FirLightParameterForReceiver.kt index 3c4b006df35..80fdfacfee3 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/parameters/FirLightParameterForReceiver.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/parameters/FirLightParameterForReceiver.kt @@ -59,7 +59,7 @@ internal class FirLightParameterForReceiver private constructor( override fun getName(): String = _name override fun isVarArgs() = false - override fun hasModifierProperty(name: String): Boolean = false //TODO() + override fun hasModifierProperty(name: String): Boolean = false override val kotlinOrigin: KtParameter? = null diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/parameters/FirLightParameterForSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/parameters/FirLightParameterForSymbol.kt index 16fef101818..3af7b62caca 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/parameters/FirLightParameterForSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/parameters/FirLightParameterForSymbol.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.elements.FirLightIdentifier import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.idea.frontend.api.symbols.KtFunctionLikeSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtParameterSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.idea.util.ifTrue @@ -34,11 +35,18 @@ internal class FirLightParameterForSymbol( AnnotationUseSiteTarget.CONSTRUCTOR_PARAMETER } + val nullabilityApplicable = !containingMethod.containingClass.let { it.isAnnotationType || it.isEnum } && + !containingMethod.hasModifierProperty(PsiModifier.PRIVATE) + + val nullabilityType = if (nullabilityApplicable) + parameterSymbol.type.getTypeNullability(parameterSymbol, FirResolvePhase.TYPES) + else NullabilityType.Unknown + parameterSymbol.computeAnnotations( parent = this, - nullability = parameterSymbol.type.getTypeNullability(parameterSymbol, FirResolvePhase.TYPES), + nullability = nullabilityType, annotationUseSiteTarget = annotationSite, - includeAnnotationsWithoutSite = false + includeAnnotationsWithoutSite = true ) }