[AA LC] Don't create light methods if value class is present in signature
^KT-55788 Test `parameter_jvmInline.kt` is removed because now members with value classes are not included in light classes and don't have PSI representation
This commit is contained in:
committed by
Space Team
parent
16b72d3e54
commit
faa96ec7c0
-6
@@ -106,12 +106,6 @@ public class Fe10IdeNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGene
|
||||
runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/localClass_memberFunction.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("parameter_jvmInline.kt")
|
||||
public void testParameter_jvmInline() throws Exception {
|
||||
runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/parameter_jvmInline.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("suspendFunctionValueParameterNoStdlib.kt")
|
||||
public void testSuspendFunctionValueParameterNoStdlib() throws Exception {
|
||||
|
||||
-6
@@ -106,12 +106,6 @@ public class FirIdeDependentAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGe
|
||||
runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/localClass_memberFunction.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("parameter_jvmInline.kt")
|
||||
public void testParameter_jvmInline() throws Exception {
|
||||
runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/parameter_jvmInline.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("suspendFunctionValueParameterNoStdlib.kt")
|
||||
public void testSuspendFunctionValueParameterNoStdlib() throws Exception {
|
||||
|
||||
-6
@@ -106,12 +106,6 @@ public class FirIdeNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGener
|
||||
runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/localClass_memberFunction.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("parameter_jvmInline.kt")
|
||||
public void testParameter_jvmInline() throws Exception {
|
||||
runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/parameter_jvmInline.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("suspendFunctionValueParameterNoStdlib.kt")
|
||||
public void testSuspendFunctionValueParameterNoStdlib() throws Exception {
|
||||
|
||||
-6
@@ -106,12 +106,6 @@ public class FirStandaloneNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTe
|
||||
runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/localClass_memberFunction.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("parameter_jvmInline.kt")
|
||||
public void testParameter_jvmInline() throws Exception {
|
||||
runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/parameter_jvmInline.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("suspendFunctionValueParameterNoStdlib.kt")
|
||||
public void testSuspendFunctionValueParameterNoStdlib() throws Exception {
|
||||
|
||||
-4
@@ -1,4 +0,0 @@
|
||||
@kotlin.jvm.JvmInline
|
||||
value class MyInt(val value: Int)
|
||||
|
||||
fun box(i<caret> : MyInt) {}
|
||||
-2
@@ -1,2 +0,0 @@
|
||||
KtType: MyInt
|
||||
PsiType: PsiType:int
|
||||
+16
-1
@@ -18,6 +18,11 @@ import com.intellij.psi.scope.PsiScopeProcessor
|
||||
import com.intellij.psi.util.CachedValueProvider
|
||||
import com.intellij.psi.util.PsiUtil
|
||||
import org.jetbrains.annotations.NonNls
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.receiverType
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionLikeSymbol
|
||||
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
||||
import org.jetbrains.kotlin.analysis.providers.createProjectWideOutOfBlockModificationTracker
|
||||
import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment
|
||||
@@ -191,4 +196,14 @@ abstract class SymbolLightClassBase protected constructor(val ktModule: KtModule
|
||||
visitor.visitElement(this)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
context(KtAnalysisSession)
|
||||
protected fun KtCallableSymbol.hasTypeForValueClassInSignature(ignoreReturnType: Boolean = false): Boolean {
|
||||
if (!ignoreReturnType && returnType.typeForValueClass) return true
|
||||
if (receiverType?.typeForValueClass == true) return true
|
||||
if (this is KtFunctionLikeSymbol) {
|
||||
return valueParameters.any { it.returnType.typeForValueClass }
|
||||
}
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
+3
@@ -139,6 +139,9 @@ internal open class SymbolLightClassForClassOrObject : SymbolLightClassForNamedC
|
||||
it is KtKotlinPropertySymbol && it.origin == KtSymbolOrigin.SOURCE_MEMBER_GENERATED && it.name == StandardNames.ENUM_ENTRIES
|
||||
}
|
||||
}
|
||||
.filterNot {
|
||||
it.hasTypeForValueClassInSignature()
|
||||
}
|
||||
|
||||
val suppressStatic = isCompanionObject
|
||||
createMethods(visibleDeclarations, result, suppressStatic = suppressStatic)
|
||||
|
||||
+1
@@ -97,6 +97,7 @@ class SymbolLightClassForFacade(
|
||||
if (callableSymbol !is KtSymbolWithVisibility) continue
|
||||
if ((callableSymbol as? KtAnnotatedSymbol)?.hasInlineOnlyAnnotation() == true) continue
|
||||
if (multiFileClass && callableSymbol.toPsiVisibilityForMember() == PsiModifier.PRIVATE) continue
|
||||
if (callableSymbol.hasTypeForValueClassInSignature(ignoreReturnType = true)) continue
|
||||
yield(callableSymbol)
|
||||
}
|
||||
}
|
||||
|
||||
+1
@@ -57,6 +57,7 @@ internal open class SymbolLightClassForInterface : SymbolLightClassForInterfaceO
|
||||
|
||||
val visibleDeclarations = classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols()
|
||||
.filterNot { it is KtFunctionSymbol && it.visibility.isPrivateOrPrivateToThis() }
|
||||
.filterNot { it.hasTypeForValueClassInSignature() }
|
||||
|
||||
createMethods(visibleDeclarations, result)
|
||||
addMethodsFromCompanionIfNeeded(result, classOrObjectSymbol)
|
||||
|
||||
+27
-1
@@ -290,6 +290,25 @@ internal fun SymbolLightClassBase.createPropertyAccessors(
|
||||
if (declaration.getter?.hasBody != true && declaration.setter?.hasBody != true && declaration.visibility.isPrivateOrPrivateToThis()) return
|
||||
|
||||
if (declaration.hasJvmFieldAnnotation()) return
|
||||
val propertyTypeIsValueClass = declaration.returnType.typeForValueClass
|
||||
/*
|
||||
* For top-level properties with value class in return type compiler mangles only setter
|
||||
*
|
||||
* @JvmInline
|
||||
* value class Some(val value: String)
|
||||
*
|
||||
* var topLevelProp: Some = Some("1")
|
||||
*
|
||||
* Compiles to
|
||||
* public final class FooKt {
|
||||
* public final static getTopLevelProp()Ljava/lang/String;
|
||||
*
|
||||
* public final static setTopLevelProp-5lyY9Q4(Ljava/lang/String;)V
|
||||
*
|
||||
* private static Ljava/lang/String; topLevelProp
|
||||
* }
|
||||
*/
|
||||
if (this !is SymbolLightClassForFacade && propertyTypeIsValueClass) return
|
||||
|
||||
fun KtPropertyAccessorSymbol.needToCreateAccessor(siteTarget: AnnotationUseSiteTarget): Boolean {
|
||||
if (onlyJvmStatic &&
|
||||
@@ -334,7 +353,7 @@ internal fun SymbolLightClassBase.createPropertyAccessors(
|
||||
}
|
||||
|
||||
val setter = declaration.setter?.takeIf {
|
||||
!isAnnotationType && it.needToCreateAccessor(AnnotationUseSiteTarget.PROPERTY_SETTER)
|
||||
!isAnnotationType && it.needToCreateAccessor(AnnotationUseSiteTarget.PROPERTY_SETTER) && !propertyTypeIsValueClass
|
||||
}
|
||||
|
||||
if (isMutable && setter != null) {
|
||||
@@ -602,3 +621,10 @@ internal fun SymbolLightClassBase.addPropertyBackingFields(
|
||||
// Then, regular member properties
|
||||
propertyGroups[false]?.forEach(::addPropertyBackingField)
|
||||
}
|
||||
|
||||
context(KtAnalysisSession)
|
||||
internal val KtType.typeForValueClass: Boolean
|
||||
get() {
|
||||
val symbol = expandedClassSymbol as? KtNamedClassOrObjectSymbol ?: return false
|
||||
return symbol.isInline
|
||||
}
|
||||
|
||||
+12
@@ -282,6 +282,12 @@ public class SymbolLightClassesByPsiForLibraryTestGenerated extends AbstractSymb
|
||||
runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/unresolvedWithAliasedImport.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("valueClassInSignature.kt")
|
||||
public void testValueClassInSignature() throws Exception {
|
||||
runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/valueClassInSignature.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("wildcardOptimization.kt")
|
||||
public void testWildcardOptimization() throws Exception {
|
||||
@@ -369,6 +375,12 @@ public class SymbolLightClassesByPsiForLibraryTestGenerated extends AbstractSymb
|
||||
runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/facades/throwsAnnotation.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("valueClassInSignature.kt")
|
||||
public void testValueClassInSignature() throws Exception {
|
||||
runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/facades/valueClassInSignature.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("wildcardOptimization.kt")
|
||||
public void testWildcardOptimization() throws Exception {
|
||||
|
||||
+12
@@ -282,6 +282,12 @@ public class SymbolLightClassesByPsiForSourceTestGenerated extends AbstractSymbo
|
||||
runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/unresolvedWithAliasedImport.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("valueClassInSignature.kt")
|
||||
public void testValueClassInSignature() throws Exception {
|
||||
runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/valueClassInSignature.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("wildcardOptimization.kt")
|
||||
public void testWildcardOptimization() throws Exception {
|
||||
@@ -369,6 +375,12 @@ public class SymbolLightClassesByPsiForSourceTestGenerated extends AbstractSymbo
|
||||
runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/facades/throwsAnnotation.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("valueClassInSignature.kt")
|
||||
public void testValueClassInSignature() throws Exception {
|
||||
runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/facades/valueClassInSignature.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("wildcardOptimization.kt")
|
||||
public void testWildcardOptimization() throws Exception {
|
||||
|
||||
Reference in New Issue
Block a user