From 6792d22c31063e07a9b7c1b275dd0e1b0e64fb02 Mon Sep 17 00:00:00 2001 From: Igor Yakovlev Date: Mon, 9 Dec 2019 20:45:38 +0300 Subject: [PATCH] Fix minor bugs for UL methods and parameters representation Remove INSTANCE field for local object declarations Remove private suspend functions create from UL Add correct extension function parameter name Add support for setparam annotation modifier --- .../kotlin/asJava/classes/ultraLightClass.kt | 3 +-- .../classes/ultraLightMembersCreator.kt | 27 ++++++++++++++----- .../asJava/classes/ultraLightParameters.kt | 26 +++++++++++++++--- ...nnotationWithSetParamPropertyModifier.java | 15 +++++++++++ .../annotationWithSetParamPropertyModifier.kt | 3 +++ .../asJava/ultraLightClasses/coroutines.kt | 4 +++ .../inferringAnonymousObjectTypes.java | 27 ------------------- .../UltraLightClassLoadingTestGenerated.java | 5 ++++ 8 files changed, 72 insertions(+), 38 deletions(-) create mode 100644 compiler/testData/asJava/ultraLightClasses/annotationWithSetParamPropertyModifier.java create mode 100644 compiler/testData/asJava/ultraLightClasses/annotationWithSetParamPropertyModifier.kt diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClass.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClass.kt index 2326de137cf..6e406362b46 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClass.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClass.kt @@ -13,7 +13,6 @@ import com.intellij.psi.impl.light.LightMethodBuilder import com.intellij.psi.util.CachedValue import com.intellij.psi.util.CachedValueProvider import com.intellij.psi.util.CachedValuesManager -import org.jetbrains.kotlin.asJava.UltraLightClassModifierExtension import org.jetbrains.kotlin.asJava.builder.LightClassData import org.jetbrains.kotlin.asJava.elements.KtLightField import org.jetbrains.kotlin.asJava.elements.KtLightMethod @@ -226,7 +225,7 @@ open class KtUltraLightClass(classOrObject: KtClassOrObject, internal val suppor } } - if (isNamedObject()) { + if (isNamedObject() && !this.classOrObject.isLocal) { result.add( KtUltraLightFieldForSourceDeclaration( this.classOrObject, diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightMembersCreator.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightMembersCreator.kt index ec2e2260d40..9040725f20e 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightMembersCreator.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightMembersCreator.kt @@ -18,10 +18,8 @@ import org.jetbrains.kotlin.asJava.elements.convertToLightAnnotationMemberValue import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotated -import org.jetbrains.kotlin.extensions.DeclarationAttributeAltererExtension import org.jetbrains.kotlin.lexer.KtTokens -import org.jetbrains.kotlin.lexer.KtTokens.EXTERNAL_KEYWORD -import org.jetbrains.kotlin.lexer.KtTokens.REIFIED_KEYWORD +import org.jetbrains.kotlin.lexer.KtTokens.* import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.kotlin.TypeMappingMode import org.jetbrains.kotlin.name.FqName @@ -29,7 +27,7 @@ import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier import org.jetbrains.kotlin.psi.psiUtil.hasSuspendModifier -import org.jetbrains.kotlin.psi.psiUtil.isObjectLiteral +import org.jetbrains.kotlin.psi.psiUtil.isPrivate import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.descriptorUtil.isPublishedApi @@ -120,6 +118,11 @@ internal class UltraLightMembersCreator( ktFunction.hasExpectModifier() ) return emptyList() + + if (ktFunction.modifierList?.hasSuspendModifier() == true && ktFunction.isPrivate()) { + return emptyList() + } + val basicMethod = asJavaMethod(ktFunction, forceStatic, forcePrivate) val result = mutableListOf(basicMethod) @@ -465,9 +468,21 @@ internal class UltraLightMembersCreator( val setterParameter = ktSetter?.parameter setterPrototype.addParameter( if (setterParameter != null) - KtUltraLightParameterForSource(propertyName, setterParameter, support, setterWrapper, declaration) + KtUltraLightParameterForSource( + name = setterParameter.name ?: propertyName, + kotlinOrigin = setterParameter, + support = support, + method = setterWrapper, + containingDeclaration = declaration + ) else - KtUltraLightParameterForSetterParameter(propertyName, declaration, support, setterWrapper, declaration) + KtUltraLightParameterForSetterParameter( + name = propertyName, + property = declaration, + support = support, + method = setterWrapper, + containingDeclaration = declaration + ) ) result.add(setterWrapper) } diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightParameters.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightParameters.kt index ea2f28f82f8..cef26fac21d 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightParameters.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightParameters.kt @@ -13,11 +13,17 @@ import org.jetbrains.annotations.NonNls import org.jetbrains.kotlin.asJava.elements.* import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.isSuspendFunctionType +import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.coroutines.SUSPEND_FUNCTION_COMPLETION_PARAMETER_NAME -import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.load.kotlin.TypeMappingMode -import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.KtCallableDeclaration +import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.psi.KtFunction +import org.jetbrains.kotlin.psi.KtParameter +import org.jetbrains.kotlin.types.KotlinType +import org.jetbrains.kotlin.codegen.AsmUtil.LABELED_THIS_PARAMETER +import org.jetbrains.kotlin.codegen.AsmUtil.RECEIVER_PARAMETER_NAME internal class KtUltraLightSuspendContinuationParameter( private val ktFunction: KtFunction, @@ -182,6 +188,13 @@ internal class KtUltraLightParameterForSetterParameter( override fun tryGetKotlinType(): KotlinType? = property.getKotlinType() + override val givenAnnotations: List? + get() = (property.resolve() as? PropertyDescriptor) + ?.setter + ?.valueParameters + ?.firstOrNull() + ?.obtainLightAnnotations(support, this) + override fun isVarArgs(): Boolean = false } @@ -189,7 +202,14 @@ internal class KtUltraLightReceiverParameter( containingDeclaration: KtCallableDeclaration, support: KtUltraLightSupport, method: KtUltraLightMethod -) : KtAbstractUltraLightParameterForDeclaration("\$self", null, support, method, containingDeclaration) { +) : KtAbstractUltraLightParameterForDeclaration( + /** @see org.jetbrains.kotlin.codegen.AsmUtil.getNameForReceiverParameter */ + name = AsmUtil.getLabeledThisName(method.name, LABELED_THIS_PARAMETER, RECEIVER_PARAMETER_NAME), + kotlinOrigin = null, + support = support, + method = method, + containingDeclaration = containingDeclaration +) { override fun isVarArgs(): Boolean = false diff --git a/compiler/testData/asJava/ultraLightClasses/annotationWithSetParamPropertyModifier.java b/compiler/testData/asJava/ultraLightClasses/annotationWithSetParamPropertyModifier.java new file mode 100644 index 00000000000..11f5a760939 --- /dev/null +++ b/compiler/testData/asJava/ultraLightClasses/annotationWithSetParamPropertyModifier.java @@ -0,0 +1,15 @@ +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +public abstract @interface Anno /* Anno*/ { +} + +public final class TestClass /* TestClass*/ { + private int hello; + + @null() + public TestClass(int); + + public final int getHello(); + + public final void setHello(@Anno() int); + +} \ No newline at end of file diff --git a/compiler/testData/asJava/ultraLightClasses/annotationWithSetParamPropertyModifier.kt b/compiler/testData/asJava/ultraLightClasses/annotationWithSetParamPropertyModifier.kt new file mode 100644 index 00000000000..a25e58554ad --- /dev/null +++ b/compiler/testData/asJava/ultraLightClasses/annotationWithSetParamPropertyModifier.kt @@ -0,0 +1,3 @@ +annotation class Anno + +class TestClass(@setparam:Anno var hello: Int) \ No newline at end of file diff --git a/compiler/testData/asJava/ultraLightClasses/coroutines.kt b/compiler/testData/asJava/ultraLightClasses/coroutines.kt index afec85c8808..b3da0b5e423 100644 --- a/compiler/testData/asJava/ultraLightClasses/coroutines.kt +++ b/compiler/testData/asJava/ultraLightClasses/coroutines.kt @@ -3,6 +3,10 @@ class Foo { suspend fun doSomething(foo: Foo): Bar {} } +class Boo { + private suspend fun doSomething(foo: Foo): Bar {} +} + class Bar { fun async(block: suspend () -> T) } diff --git a/compiler/testData/asJava/ultraLightClasses/inferringAnonymousObjectTypes.java b/compiler/testData/asJava/ultraLightClasses/inferringAnonymousObjectTypes.java index 003b00a5162..b06fb250723 100644 --- a/compiler/testData/asJava/ultraLightClasses/inferringAnonymousObjectTypes.java +++ b/compiler/testData/asJava/ultraLightClasses/inferringAnonymousObjectTypes.java @@ -7,9 +7,6 @@ public final class Prop /* Prop*/ { } final class null /* null*/ { - @null() - public static final java.lang.Object INSTANCE; - private (); } @@ -23,9 +20,6 @@ public final class Fun /* Fun*/ { } final class null /* null*/ { - @null() - public static final java.lang.Object INSTANCE; - private (); } @@ -42,9 +36,6 @@ public final class ArrayOfAnonymous /* ArrayOfAnonymous*/ { } final class null /* null*/ { - @null() - public static final java.lang.Object INSTANCE; - private static final java.lang.String fy = "text" /* initializer type: java.lang.String */ /* constant value text */; @org.jetbrains.annotations.NotNull() @@ -70,9 +61,6 @@ final class C /* C*/ { } final class null /* null*/ { - @null() - public static final java.lang.Object INSTANCE; - @org.jetbrains.annotations.NotNull() public java.lang.String toString(); @@ -101,9 +89,6 @@ public final class Sub /* Sub*/ extends Super { } final class null /* null*/ { - @null() - public static final java.lang.Object INSTANCE; - private static final java.lang.String fy = "text" /* initializer type: java.lang.String */ /* constant value text */; @org.jetbrains.annotations.NotNull() @@ -128,9 +113,6 @@ public final class ValidPublicSupertype /* ValidPublicSupertype*/ { } final class null /* null*/ implements java.lang.Runnable { - @null() - public static final java.lang.Runnable INSTANCE; - private (); public void run(); @@ -138,9 +120,6 @@ final class null /* null*/ implements java.lang.Runnable { } final class null /* null*/ implements java.lang.Runnable { - @null() - public static final java.lang.Runnable INSTANCE; - private (); public void run(); @@ -165,9 +144,6 @@ public final class InvalidPublicSupertype /* InvalidPublicSupertype*/ { } final class null /* null*/ implements I, java.lang.Runnable { - @null() - public static final java.lang.Runnable INSTANCE; - private (); public void run(); @@ -175,9 +151,6 @@ final class null /* null*/ implements I, java.lang.Runnable { } final class null /* null*/ implements I, java.lang.Runnable { - @null() - public static final java.lang.Runnable INSTANCE; - private (); public void run(); diff --git a/idea/tests/org/jetbrains/kotlin/asJava/classes/UltraLightClassLoadingTestGenerated.java b/idea/tests/org/jetbrains/kotlin/asJava/classes/UltraLightClassLoadingTestGenerated.java index 8a15f862192..f7c32b56313 100644 --- a/idea/tests/org/jetbrains/kotlin/asJava/classes/UltraLightClassLoadingTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/asJava/classes/UltraLightClassLoadingTestGenerated.java @@ -28,6 +28,11 @@ public class UltraLightClassLoadingTestGenerated extends AbstractUltraLightClass KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/asJava/ultraLightClasses"), Pattern.compile("^(.+)\\.(kt|kts)$"), true); } + @TestMetadata("annotationWithSetParamPropertyModifier.kt") + public void testAnnotationWithSetParamPropertyModifier() throws Exception { + runTest("compiler/testData/asJava/ultraLightClasses/annotationWithSetParamPropertyModifier.kt"); + } + @TestMetadata("annotations.kt") public void testAnnotations() throws Exception { runTest("compiler/testData/asJava/ultraLightClasses/annotations.kt");