diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index bfe930c4279..b50d3995344 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -51,8 +51,12 @@ import org.jetbrains.jet.lang.resolve.calls.model.*; import org.jetbrains.jet.lang.resolve.calls.util.CallMaker; import org.jetbrains.jet.lang.resolve.calls.util.ExpressionAsFunctionDescriptor; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; -import org.jetbrains.jet.lang.resolve.java.*; +import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants; +import org.jetbrains.jet.lang.resolve.java.JvmAbi; +import org.jetbrains.jet.lang.resolve.java.JvmClassName; +import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType; import org.jetbrains.jet.lang.resolve.java.descriptor.ClassDescriptorFromJvmBytecode; +import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptor; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.receivers.*; import org.jetbrains.jet.lang.types.JetType; @@ -1902,11 +1906,9 @@ public class ExpressionCodegen extends JetVisitor implem } if (funDescriptor instanceof SimpleFunctionDescriptor) { - ClassDescriptorFromJvmBytecode samInterface = bindingContext.get( - JavaBindingContext.SAM_CONSTRUCTOR_TO_INTERFACE, ((SimpleFunctionDescriptor) funDescriptor).getOriginal()); - - if (samInterface != null) { - return invokeSamConstructor(expression, resolvedCall, samInterface); + SimpleFunctionDescriptor original = ((SimpleFunctionDescriptor) funDescriptor).getOriginal(); + if (original instanceof SamConstructorDescriptor) { + return invokeSamConstructor(expression, resolvedCall, ((SamConstructorDescriptor) original).getSamInterface()); } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/DescriptorResolverUtils.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/DescriptorResolverUtils.java index 2fa892c8296..d2dd9b2d992 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/DescriptorResolverUtils.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/DescriptorResolverUtils.java @@ -24,6 +24,7 @@ import com.intellij.psi.util.PsiFormatUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; +import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.OverrideResolver; import org.jetbrains.jet.lang.resolve.java.structure.JavaClass; @@ -160,4 +161,12 @@ public final class DescriptorResolverUtils { return result; } + + public static void recordSourceDescriptorForSynthesized( + @NotNull FunctionDescriptor synthesized, + @NotNull DeclarationDescriptor original, + @NotNull BindingTrace trace + ) { + trace.record(BindingContext.SOURCE_DESCRIPTOR_FOR_SYNTHESIZED, synthesized, original); + } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaBindingContext.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaBindingContext.java index cd48f2ff862..5dc42a3d083 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaBindingContext.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaBindingContext.java @@ -18,9 +18,7 @@ package org.jetbrains.jet.lang.resolve.java; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; -import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor; import org.jetbrains.jet.lang.resolve.BindingContext; -import org.jetbrains.jet.lang.resolve.java.descriptor.ClassDescriptorFromJvmBytecode; import org.jetbrains.jet.util.slicedmap.BasicWritableSlice; import org.jetbrains.jet.util.slicedmap.Slices; import org.jetbrains.jet.util.slicedmap.WritableSlice; @@ -41,8 +39,6 @@ public class JavaBindingContext { public static final WritableSlice> LOAD_FROM_JAVA_SIGNATURE_ERRORS = new BasicWritableSlice>(Slices.ONLY_REWRITE_TO_EQUAL, true); - public static final WritableSlice SAM_CONSTRUCTOR_TO_INTERFACE = Slices.createSimpleSlice(); - private JavaBindingContext() { } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/SamConstructorDescriptor.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/SamConstructorDescriptor.java new file mode 100644 index 00000000000..8f0c05eef34 --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/SamConstructorDescriptor.java @@ -0,0 +1,38 @@ +/* + * Copyright 2010-2013 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.lang.resolve.java.descriptor; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.ClassOrNamespaceDescriptor; +import org.jetbrains.jet.lang.descriptors.impl.SimpleFunctionDescriptorImpl; + +public class SamConstructorDescriptor extends SimpleFunctionDescriptorImpl { + private final ClassDescriptorFromJvmBytecode samInterface; + + public SamConstructorDescriptor( + @NotNull ClassOrNamespaceDescriptor containingDeclaration, + @NotNull ClassDescriptorFromJvmBytecode samInterface + ) { + super(containingDeclaration, samInterface.getAnnotations(), samInterface.getName(), Kind.SYNTHESIZED); + this.samInterface = samInterface; + } + + @NotNull + public ClassDescriptorFromJvmBytecode getSamInterface() { + return samInterface; + } +} diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaConstructorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaConstructorResolver.java index 0982676908b..3705b349000 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaConstructorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaConstructorResolver.java @@ -27,8 +27,10 @@ import org.jetbrains.jet.lang.descriptors.impl.ValueParameterDescriptorImpl; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.DescriptorResolver; +import org.jetbrains.jet.lang.resolve.java.DescriptorResolverUtils; import org.jetbrains.jet.lang.resolve.java.JavaBindingContext; import org.jetbrains.jet.lang.resolve.java.JavaVisibilities; +import org.jetbrains.jet.lang.resolve.java.descriptor.SamAdapterDescriptor; import org.jetbrains.jet.lang.resolve.java.kotlinSignature.AlternativeMethodSignatureData; import org.jetbrains.jet.lang.resolve.java.structure.JavaArrayType; import org.jetbrains.jet.lang.resolve.java.structure.JavaClass; @@ -42,7 +44,6 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; -import static org.jetbrains.jet.lang.resolve.java.resolver.JavaFunctionResolver.recordSamAdapter; import static org.jetbrains.jet.lang.resolve.java.sam.SingleAbstractMethodUtils.createSamAdapterConstructor; import static org.jetbrains.jet.lang.resolve.java.sam.SingleAbstractMethodUtils.isSamAdapterNecessary; @@ -225,8 +226,10 @@ public final class JavaConstructorResolver { @Nullable private ConstructorDescriptor resolveSamAdapter(@NotNull ConstructorDescriptor original) { - return isSamAdapterNecessary(original) - ? (ConstructorDescriptor) recordSamAdapter(original, createSamAdapterConstructor(original), trace) - : null; + if (!isSamAdapterNecessary(original)) return null; + + SamAdapterDescriptor adapter = createSamAdapterConstructor(original); + DescriptorResolverUtils.recordSourceDescriptorForSynthesized(adapter, original, trace); + return (ConstructorDescriptor) adapter; } } \ No newline at end of file diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java index e552968902f..d18a90c782c 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java @@ -36,6 +36,7 @@ import org.jetbrains.jet.lang.resolve.java.TypeUsage; import org.jetbrains.jet.lang.resolve.java.descriptor.ClassDescriptorFromJvmBytecode; import org.jetbrains.jet.lang.resolve.java.descriptor.JavaMethodDescriptor; import org.jetbrains.jet.lang.resolve.java.descriptor.SamAdapterDescriptor; +import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptor; import org.jetbrains.jet.lang.resolve.java.kotlinSignature.AlternativeMethodSignatureData; import org.jetbrains.jet.lang.resolve.java.kotlinSignature.SignaturesPropagationData; import org.jetbrains.jet.lang.resolve.java.kotlinSignature.SignaturesUtil; @@ -309,11 +310,13 @@ public final class JavaFunctionResolver { } @Nullable - private SimpleFunctionDescriptor resolveSamConstructor(@NotNull NamespaceDescriptor owner, @NotNull NamedMembers namedMembers) { + private SamConstructorDescriptor resolveSamConstructor(@NotNull NamespaceDescriptor owner, @NotNull NamedMembers namedMembers) { if (namedMembers.getSamInterface() != null) { ClassDescriptorFromJvmBytecode klass = findClassInNamespace(owner, namedMembers.getName()); if (klass != null) { - return recordSamConstructor(klass, createSamConstructorFunction(owner, klass), trace); + SamConstructorDescriptor constructor = createSamConstructorFunction(owner, klass); + DescriptorResolverUtils.recordSourceDescriptorForSynthesized(constructor, klass, trace); + return constructor; } } return null; @@ -321,14 +324,16 @@ public final class JavaFunctionResolver { @Nullable private SimpleFunctionDescriptor resolveSamAdapter(@NotNull SimpleFunctionDescriptor original) { - return isSamAdapterNecessary(original) - ? (SimpleFunctionDescriptor) recordSamAdapter(original, createSamAdapterFunction(original), trace) - : null; + if (!isSamAdapterNecessary(original)) return null; + + SamAdapterDescriptor adapter = createSamAdapterFunction(original); + DescriptorResolverUtils.recordSourceDescriptorForSynthesized(adapter, original, trace); + return (SimpleFunctionDescriptor) adapter; } @NotNull public Set resolveFunctionGroupForPackage(@NotNull NamedMembers members, @NotNull NamespaceDescriptor owner) { - SimpleFunctionDescriptor samConstructor = resolveSamConstructor(owner, members); + SamConstructorDescriptor samConstructor = resolveSamConstructor(owner, members); if (samConstructor != null) { return Collections.singleton(samConstructor); } @@ -378,24 +383,4 @@ public final class JavaFunctionResolver { return false; } - - private static SimpleFunctionDescriptor recordSamConstructor( - ClassDescriptorFromJvmBytecode klass, - SimpleFunctionDescriptor constructorFunction, - BindingTrace trace - ) { - trace.record(JavaBindingContext.SAM_CONSTRUCTOR_TO_INTERFACE, constructorFunction, klass); - trace.record(BindingContext.SOURCE_DESCRIPTOR_FOR_SYNTHESIZED, constructorFunction, klass); - return constructorFunction; - } - - @NotNull - /* package */ static SamAdapterDescriptor recordSamAdapter( - @NotNull F original, - @NotNull SamAdapterDescriptor adapter, - @NotNull BindingTrace trace - ) { - trace.record(BindingContext.SOURCE_DESCRIPTOR_FOR_SYNTHESIZED, adapter, original); - return adapter; - } -} \ No newline at end of file +} diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SingleAbstractMethodUtils.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SingleAbstractMethodUtils.java index d2afe4600fb..3ae0e421388 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SingleAbstractMethodUtils.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SingleAbstractMethodUtils.java @@ -22,12 +22,12 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; -import org.jetbrains.jet.lang.descriptors.impl.SimpleFunctionDescriptorImpl; import org.jetbrains.jet.lang.descriptors.impl.TypeParameterDescriptorImpl; import org.jetbrains.jet.lang.descriptors.impl.ValueParameterDescriptorImpl; import org.jetbrains.jet.lang.resolve.java.DescriptorResolverUtils; import org.jetbrains.jet.lang.resolve.java.descriptor.ClassDescriptorFromJvmBytecode; import org.jetbrains.jet.lang.resolve.java.descriptor.SamAdapterDescriptor; +import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptor; import org.jetbrains.jet.lang.resolve.java.kotlinSignature.SignaturesUtil; import org.jetbrains.jet.lang.resolve.java.resolver.JavaSupertypeResolver; import org.jetbrains.jet.lang.resolve.java.structure.*; @@ -133,18 +133,13 @@ public class SingleAbstractMethodUtils { } @NotNull - public static SimpleFunctionDescriptor createSamConstructorFunction( + public static SamConstructorDescriptor createSamConstructorFunction( @NotNull ClassOrNamespaceDescriptor owner, - @NotNull ClassDescriptor samInterface + @NotNull ClassDescriptorFromJvmBytecode samInterface ) { assert isSamInterface(samInterface) : samInterface; - SimpleFunctionDescriptorImpl result = new SimpleFunctionDescriptorImpl( - owner, - samInterface.getAnnotations(), - samInterface.getName(), - CallableMemberDescriptor.Kind.SYNTHESIZED - ); + SamConstructorDescriptor result = new SamConstructorDescriptor(owner, samInterface); TypeParameters typeParameters = recreateAndInitializeTypeParameters(samInterface.getTypeConstructor().getParameters(), result);