[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:
Dmitriy Novozhilov
2022-09-14 16:29:43 +03:00
committed by Space Team
parent 16b72d3e54
commit faa96ec7c0
21 changed files with 466 additions and 32 deletions
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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 {
@@ -1,4 +0,0 @@
@kotlin.jvm.JvmInline
value class MyInt(val value: Int)
fun box(i<caret> : MyInt) {}
@@ -1,2 +0,0 @@
KtType: MyInt
PsiType: PsiType:int
@@ -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
}
}
@@ -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)
@@ -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)
}
}
@@ -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)
@@ -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
}
@@ -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 {
@@ -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 {