From 694af022c87a4afee91b453abb6d88fde4571213 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 5 May 2015 18:51:35 +0300 Subject: [PATCH] Type Enhancement for Java fields and constructors supported as well --- .../java/components/signatureEnhancement.kt | 6 ++- .../compiledJava/notNull/NotNullField.txt | 2 +- .../adapters/ConstructorWithAnnotations.java | 10 +++++ .../adapters/ConstructorWithAnnotations.txt | 6 +++ .../jvm/compiler/LoadJavaTestGenerated.java | 6 +++ .../JavaCallableMemberDescriptor.java | 12 ++++++ .../JavaConstructorDescriptor.java | 30 ++++++++++++-- .../descriptors/JavaMethodDescriptor.java | 3 ++ .../descriptors/JavaPropertyDescriptor.java | 40 +++++++++++++++++-- .../descriptors/LazyJavaClassMemberScope.kt | 5 ++- .../lazy/descriptors/LazyJavaMemberScope.kt | 5 ++- .../impl/VariableDescriptorImpl.java | 2 +- 12 files changed, 113 insertions(+), 14 deletions(-) create mode 100644 compiler/testData/loadJava/compiledJava/sam/adapters/ConstructorWithAnnotations.java create mode 100644 compiler/testData/loadJava/compiledJava/sam/adapters/ConstructorWithAnnotations.txt diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/components/signatureEnhancement.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/components/signatureEnhancement.kt index 6272f43a9b5..037b4a9a262 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/components/signatureEnhancement.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/components/signatureEnhancement.kt @@ -21,7 +21,9 @@ import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl -import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor +import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor +import org.jetbrains.kotlin.load.java.descriptors.JavaConstructorDescriptor +import org.jetbrains.kotlin.load.java.descriptors.JavaPropertyDescriptor import org.jetbrains.kotlin.types.JetType fun enhanceSignatures(platformSignatures: Collection): Collection { @@ -46,7 +48,7 @@ fun D.enhance(): D { val enhancedReturnType = parts { it.getReturnType()!!.toReturnTypePart() }.enhance() - if (this is JavaMethodDescriptor) { + if (this is JavaCallableMemberDescriptor) { @suppress("UNCHECKED_CAST") return this.enhance(enhancedReceiverType, enhancedValueParameters, enhancedReturnType) as D } diff --git a/compiler/testData/loadJava/compiledJava/notNull/NotNullField.txt b/compiler/testData/loadJava/compiledJava/notNull/NotNullField.txt index 18c748212c0..7c3c4d0f703 100644 --- a/compiler/testData/loadJava/compiledJava/notNull/NotNullField.txt +++ b/compiler/testData/loadJava/compiledJava/notNull/NotNullField.txt @@ -2,5 +2,5 @@ package test public open class NotNullField { public constructor NotNullField() - org.jetbrains.annotations.NotNull() public final var hi: kotlin.String! + org.jetbrains.annotations.NotNull() public final var hi: kotlin.String } diff --git a/compiler/testData/loadJava/compiledJava/sam/adapters/ConstructorWithAnnotations.java b/compiler/testData/loadJava/compiledJava/sam/adapters/ConstructorWithAnnotations.java new file mode 100644 index 00000000000..6c83ef8687b --- /dev/null +++ b/compiler/testData/loadJava/compiledJava/sam/adapters/ConstructorWithAnnotations.java @@ -0,0 +1,10 @@ +package test; + +import org.jetbrains.annotations.NotNull; + +import java.lang.String; + +public class ConstructorWithAnnotations { + public ConstructorWithAnnotations(Runnable r, @NotNull String s) { + } +} diff --git a/compiler/testData/loadJava/compiledJava/sam/adapters/ConstructorWithAnnotations.txt b/compiler/testData/loadJava/compiledJava/sam/adapters/ConstructorWithAnnotations.txt new file mode 100644 index 00000000000..913ac28d907 --- /dev/null +++ b/compiler/testData/loadJava/compiledJava/sam/adapters/ConstructorWithAnnotations.txt @@ -0,0 +1,6 @@ +package test + +public open class ConstructorWithAnnotations { + public /*synthesized*/ constructor ConstructorWithAnnotations(/*0*/ p0: (() -> kotlin.Unit)!, /*1*/ org.jetbrains.annotations.NotNull() p1: kotlin.String) + public constructor ConstructorWithAnnotations(/*0*/ p0: java.lang.Runnable!, /*1*/ org.jetbrains.annotations.NotNull() p1: kotlin.String) +} diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java index 89d0b94765f..dece7cfbdba 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java @@ -1568,6 +1568,12 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest { doTestCompiledJava(fileName); } + @TestMetadata("ConstructorWithAnnotations.java") + public void testConstructorWithAnnotations() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledJava/sam/adapters/ConstructorWithAnnotations.java"); + doTestCompiledJava(fileName); + } + @TestMetadata("DeepSamLoop.java") public void testDeepSamLoop() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledJava/sam/adapters/DeepSamLoop.java"); diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaCallableMemberDescriptor.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaCallableMemberDescriptor.java index 83381073306..5970da42013 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaCallableMemberDescriptor.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaCallableMemberDescriptor.java @@ -16,7 +16,19 @@ package org.jetbrains.kotlin.load.java.descriptors; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor; +import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor; +import org.jetbrains.kotlin.types.JetType; + +import java.util.List; public interface JavaCallableMemberDescriptor extends CallableMemberDescriptor { + @NotNull + JavaCallableMemberDescriptor enhance( + @Nullable JetType enhancedReceiverType, + @NotNull List enhancedValueParameters, + @NotNull JetType enhancedReturnType + ); } diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaConstructorDescriptor.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaConstructorDescriptor.java index 562e767dff2..6afd38862bb 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaConstructorDescriptor.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaConstructorDescriptor.java @@ -18,12 +18,12 @@ package org.jetbrains.kotlin.load.java.descriptors; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.descriptors.ClassDescriptor; -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; -import org.jetbrains.kotlin.descriptors.FunctionDescriptor; -import org.jetbrains.kotlin.descriptors.SourceElement; +import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.annotations.Annotations; import org.jetbrains.kotlin.descriptors.impl.ConstructorDescriptorImpl; +import org.jetbrains.kotlin.types.JetType; + +import java.util.List; public class JavaConstructorDescriptor extends ConstructorDescriptorImpl implements JavaCallableMemberDescriptor { private Boolean hasStableParameterNames = null; @@ -92,4 +92,26 @@ public class JavaConstructorDescriptor extends ConstructorDescriptorImpl impleme result.setHasSynthesizedParameterNames(hasSynthesizedParameterNames()); return result; } + + @Override + @NotNull + public JavaConstructorDescriptor enhance( + @Nullable JetType enhancedReceiverType, + @NotNull List enhancedValueParameters, + @NotNull JetType enhancedReturnType + ) { + JavaConstructorDescriptor enhanced = createSubstitutedCopy(getContainingDeclaration(), getOriginal(), getKind()); + enhanced.initialize( + enhancedReceiverType, + getDispatchReceiverParameter(), + getTypeParameters(), + enhancedValueParameters, + enhancedReturnType, + getModality(), + getVisibility() + ); + + return enhanced; + } + } diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor.java index 99cff0089bc..22435b63b09 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor.java @@ -91,6 +91,9 @@ public class JavaMethodDescriptor extends SimpleFunctionDescriptorImpl implement return result; } + + + @Override @NotNull public JavaMethodDescriptor enhance( @Nullable JetType enhancedReceiverType, diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaPropertyDescriptor.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaPropertyDescriptor.java index 0fff0babcb1..9ad24f14cdc 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaPropertyDescriptor.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaPropertyDescriptor.java @@ -17,13 +17,14 @@ package org.jetbrains.kotlin.load.java.descriptors; import org.jetbrains.annotations.NotNull; -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; -import org.jetbrains.kotlin.descriptors.Modality; -import org.jetbrains.kotlin.descriptors.SourceElement; -import org.jetbrains.kotlin.descriptors.Visibility; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.annotations.Annotations; import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl; import org.jetbrains.kotlin.name.Name; +import org.jetbrains.kotlin.types.JetType; + +import java.util.List; public class JavaPropertyDescriptor extends PropertyDescriptorImpl implements JavaCallableMemberDescriptor { public JavaPropertyDescriptor( @@ -41,4 +42,35 @@ public class JavaPropertyDescriptor extends PropertyDescriptorImpl implements Ja public boolean hasSynthesizedParameterNames() { return false; } + + @NotNull + @Override + public JavaCallableMemberDescriptor enhance( + @Nullable JetType enhancedReceiverType, + @NotNull List enhancedValueParameters, + @NotNull JetType enhancedReturnType + ) { + JavaPropertyDescriptor enhanced = new JavaPropertyDescriptor( + getContainingDeclaration(), + getAnnotations(), + getVisibility(), + isVar(), + getName(), + getSource() + ); + assert getGetter() == null : "Field must not have a getter: " + this; + assert getSetter() == null : "Field must not have a setter: " + this; + enhanced.initialize(null, null); + enhanced.setSetterProjectedOut(isSetterProjectedOut()); + if (compileTimeInitializer != null) { + enhanced.setCompileTimeInitializer(compileTimeInitializer); + } + enhanced.setType( + enhancedReturnType, + getTypeParameters(), // TODO + getDispatchReceiverParameter(), + enhancedReceiverType + ); + return enhanced; + } } diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt index 0d915a9c960..394c49b59af 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt @@ -71,7 +71,10 @@ public class LazyJavaClassMemberScope( result.add(descriptor) result.addIfNotNull(c.samConversionResolver.resolveSamAdapter(descriptor)) } - result ifEmpty { emptyOrSingletonList(createDefaultConstructor()) } + + c.externalSignatureResolver.enhanceSignatures( + result ifEmpty { emptyOrSingletonList(createDefaultConstructor()) } + ).toReadOnlyList() } override fun computeNonDeclaredFunctions(result: MutableCollection, name: Name) { diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaMemberScope.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaMemberScope.kt index ee88fb2de79..6426e9a8fc3 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaMemberScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaMemberScope.kt @@ -236,7 +236,10 @@ public abstract class LazyJavaMemberScope( computeNonDeclaredProperties(name, properties) - properties.toReadOnlyList() + if (DescriptorUtils.isAnnotationClass(containingDeclaration)) + properties.toReadOnlyList() + else + c.externalSignatureResolver.enhanceSignatures(properties).toReadOnlyList() } private fun resolveProperty(field: JavaField): PropertyDescriptor { diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/VariableDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/VariableDescriptorImpl.java index 74b418f1f80..b5ff6c55c58 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/VariableDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/VariableDescriptorImpl.java @@ -32,7 +32,7 @@ import java.util.Set; public abstract class VariableDescriptorImpl extends DeclarationDescriptorNonRootImpl implements VariableDescriptor { private JetType outType; - private NullableLazyValue> compileTimeInitializer; + protected NullableLazyValue> compileTimeInitializer; public VariableDescriptorImpl( @NotNull DeclarationDescriptor containingDeclaration,