[LC] createField: avoid body resolve in case of psi declaration

This commit is contained in:
Dmitrii Gridin
2023-01-03 15:39:50 +01:00
committed by Space Team
parent 5950820787
commit 461682a797
11 changed files with 362 additions and 24 deletions
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.light.classes.symbol.classes
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiManager
import com.intellij.psi.PsiModifier
import com.intellij.psi.PsiReferenceList
@@ -19,6 +20,7 @@ import org.jetbrains.kotlin.analysis.api.types.KtTypeMappingMode
import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
import org.jetbrains.kotlin.analysis.project.structure.getKtModuleOfTypeSafe
import org.jetbrains.kotlin.analysis.utils.errors.requireIsInstance
import org.jetbrains.kotlin.asJava.builder.LightMemberOriginForDeclaration
import org.jetbrains.kotlin.asJava.classes.*
import org.jetbrains.kotlin.asJava.elements.KtLightField
@@ -349,22 +351,6 @@ internal fun SymbolLightClassBase.createField(
takePropertyVisibility: Boolean,
result: MutableList<KtLightField>
) {
fun hasBackingField(property: KtPropertySymbol): Boolean = when (property) {
is KtSyntheticJavaPropertySymbol -> true
is KtKotlinPropertySymbol -> when {
property.origin == KtSymbolOrigin.SOURCE_MEMBER_GENERATED -> false
property.modality == Modality.ABSTRACT -> false
property.isHiddenOrSynthetic() -> false
property.isLateInit -> true
property.isDelegatedProperty -> true
property.isFromPrimaryConstructor -> true
property.psi.let { it == null || it is KtParameter } -> true
property.hasJvmSyntheticAnnotation(AnnotationUseSiteTarget.FIELD) -> false
else -> property.hasBackingField
}
}
if (!hasBackingField(declaration)) return
val isDelegated = (declaration as? KtKotlinPropertySymbol)?.isDelegatedProperty == true
@@ -386,6 +372,38 @@ internal fun SymbolLightClassBase.createField(
)
}
context(KtAnalysisSession)
private fun hasBackingField(property: KtPropertySymbol): Boolean {
if (property is KtSyntheticJavaPropertySymbol) return true
requireIsInstance<KtKotlinPropertySymbol>(property)
if (property.origin.cannotHasBackingField() || property.isStatic) return false
if (property.isLateInit || property.isDelegatedProperty || property.isFromPrimaryConstructor) return true
val hasBackingFieldByPsi: Boolean? = property.psi?.hasBackingField()
if (hasBackingFieldByPsi == false) {
return hasBackingFieldByPsi
}
if (property.modality == Modality.ABSTRACT ||
property.isHiddenOrSynthetic(AnnotationUseSiteTarget.FIELD, strictUseSite = false)
) return false
return hasBackingFieldByPsi ?: property.hasBackingField
}
private fun KtSymbolOrigin.cannotHasBackingField(): Boolean =
this == KtSymbolOrigin.SOURCE_MEMBER_GENERATED ||
this == KtSymbolOrigin.DELEGATED ||
this == KtSymbolOrigin.INTERSECTION_OVERRIDE ||
this == KtSymbolOrigin.SUBSTITUTION_OVERRIDE
private fun PsiElement.hasBackingField(): Boolean {
if (this is KtParameter) return true
if (this !is KtProperty) return false
return hasInitializer() || getter?.takeIf { it.hasBody() } == null || setter?.takeIf { it.hasBody() } == null && isVar
}
context(KtAnalysisSession)
internal fun SymbolLightClassForClassLike<*>.createInheritanceList(
forExtendsList: Boolean,
@@ -78,6 +78,12 @@ public class SymbolLightClassesByFqNameForLibraryTestGenerated extends AbstractS
runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/AnnotationRepeatable.kt");
}
@Test
@TestMetadata("BackingFields.kt")
public void testBackingFields() throws Exception {
runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/BackingFields.kt");
}
@Test
@TestMetadata("CompanionObject.kt")
public void testCompanionObject() throws Exception {
@@ -78,6 +78,12 @@ public class SymbolLightClassesParentingForLibraryTestGenerated extends Abstract
runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/AnnotationRepeatable.kt");
}
@Test
@TestMetadata("BackingFields.kt")
public void testBackingFields() throws Exception {
runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/BackingFields.kt");
}
@Test
@TestMetadata("CompanionObject.kt")
public void testCompanionObject() throws Exception {
@@ -78,6 +78,12 @@ public class SymbolLightClassesByFqNameForSourceTestGenerated extends AbstractSy
runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/AnnotationRepeatable.kt");
}
@Test
@TestMetadata("BackingFields.kt")
public void testBackingFields() throws Exception {
runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/BackingFields.kt");
}
@Test
@TestMetadata("CompanionObject.kt")
public void testCompanionObject() throws Exception {
@@ -78,6 +78,12 @@ public class SymbolLightClassesParentingForSourceTestGenerated extends AbstractS
runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/AnnotationRepeatable.kt");
}
@Test
@TestMetadata("BackingFields.kt")
public void testBackingFields() throws Exception {
runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/BackingFields.kt");
}
@Test
@TestMetadata("CompanionObject.kt")
public void testCompanionObject() throws Exception {