diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 8b973f8b9ba..bfe930c4279 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -2084,8 +2084,7 @@ public class ExpressionCodegen extends JetVisitor implem return typeMapper.mapToFunctionInvokeCallableMethod(createInvoke(fd)); } else { - SimpleFunctionDescriptor originalOfSamAdapter = (SimpleFunctionDescriptor) SamCodegenUtil - .getOriginalIfSamAdapter(bindingContext, fd); + SimpleFunctionDescriptor originalOfSamAdapter = (SimpleFunctionDescriptor) SamCodegenUtil.getOriginalIfSamAdapter(fd); return typeMapper.mapToCallableMethod(originalOfSamAdapter != null ? originalOfSamAdapter : fd, superCall, isCallInsideSameClassAsDeclared(fd, context), isCallInsideSameModuleAsDeclared(fd, context), @@ -3289,8 +3288,7 @@ public class ExpressionCodegen extends JetVisitor implem //See StackValue.receiver for more info pushClosureOnStack(closure, resolvedCall.getThisObject().exists() || resolvedCall.getReceiverArgument().exists()); - ConstructorDescriptor originalOfSamAdapter = (ConstructorDescriptor) SamCodegenUtil - .getOriginalIfSamAdapter(bindingContext, constructorDescriptor); + ConstructorDescriptor originalOfSamAdapter = (ConstructorDescriptor) SamCodegenUtil.getOriginalIfSamAdapter(constructorDescriptor); CallableMethod method = typeMapper.mapToCallableMethod(originalOfSamAdapter == null ? constructorDescriptor : originalOfSamAdapter); invokeMethodWithArguments(method, resolvedCall, null, StackValue.none()); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/SamCodegenUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/SamCodegenUtil.java index 9b967cd5918..331c3c8d4b5 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/SamCodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/SamCodegenUtil.java @@ -18,30 +18,27 @@ package org.jetbrains.jet.codegen; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; -import org.jetbrains.jet.lang.resolve.BindingContext; -import org.jetbrains.jet.lang.resolve.java.JavaBindingContext; +import org.jetbrains.jet.lang.resolve.java.descriptor.SamAdapterDescriptor; public class SamCodegenUtil { @Nullable - public static FunctionDescriptor getOriginalIfSamAdapter(@NotNull BindingContext bindingContext, @NotNull CallableDescriptor fun) { - if (!(fun instanceof FunctionDescriptor)) { - return null; - } - FunctionDescriptor original = ((FunctionDescriptor) fun).getOriginal(); - if (original.getKind() == CallableMemberDescriptor.Kind.SYNTHESIZED) { - return bindingContext.get(JavaBindingContext.SAM_ADAPTER_FUNCTION_TO_ORIGINAL, original); + public static FunctionDescriptor getOriginalIfSamAdapter(@NotNull FunctionDescriptor fun) { + FunctionDescriptor original = fun.getOriginal(); + if (original instanceof SamAdapterDescriptor) { + return ((SamAdapterDescriptor) original).getDeclaration(); } + if (original.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { for (FunctionDescriptor overridden : original.getOverriddenDescriptors()) { - FunctionDescriptor originalIfSamAdapter = getOriginalIfSamAdapter(bindingContext, overridden); + FunctionDescriptor originalIfSamAdapter = getOriginalIfSamAdapter(overridden); if (originalIfSamAdapter != null) { return originalIfSamAdapter; } } } + return null; } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenAnnotatingVisitor.java b/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenAnnotatingVisitor.java index 05c36469dfa..d04c03c59be 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenAnnotatingVisitor.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenAnnotatingVisitor.java @@ -365,7 +365,7 @@ class CodegenAnnotatingVisitor extends JetVisitorVoid { if (!(descriptor instanceof FunctionDescriptor)) { return; } - FunctionDescriptor original = SamCodegenUtil.getOriginalIfSamAdapter(bindingContext, descriptor); + FunctionDescriptor original = SamCodegenUtil.getOriginalIfSamAdapter((FunctionDescriptor) descriptor); if (original == null) { return; @@ -396,7 +396,7 @@ class CodegenAnnotatingVisitor extends JetVisitorVoid { (FunctionDescriptor) bindingContext.get(BindingContext.REFERENCE_TARGET, expression.getOperationReference()); if (operationDescriptor == null) return; - FunctionDescriptor original = SamCodegenUtil.getOriginalIfSamAdapter(bindingContext, operationDescriptor); + FunctionDescriptor original = SamCodegenUtil.getOriginalIfSamAdapter(operationDescriptor); if (original == null) return; ClassDescriptorFromJvmBytecode samInterfaceOfParameter = getInterfaceIfSamType(original.getValueParameters().get(0).getType()); @@ -421,7 +421,7 @@ class CodegenAnnotatingVisitor extends JetVisitorVoid { } boolean isSetter = operationDescriptor.getName().asString().equals("set"); - FunctionDescriptor original = SamCodegenUtil.getOriginalIfSamAdapter(bindingContext, operationDescriptor); + FunctionDescriptor original = SamCodegenUtil.getOriginalIfSamAdapter(operationDescriptor); if (original == null) { return; } 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 05a44f3cf71..cd48f2ff862 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 @@ -17,7 +17,6 @@ package org.jetbrains.jet.lang.resolve.java; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; -import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor; import org.jetbrains.jet.lang.resolve.BindingContext; @@ -43,7 +42,6 @@ public class JavaBindingContext { new BasicWritableSlice>(Slices.ONLY_REWRITE_TO_EQUAL, true); public static final WritableSlice SAM_CONSTRUCTOR_TO_INTERFACE = Slices.createSimpleSlice(); - public static final WritableSlice SAM_ADAPTER_FUNCTION_TO_ORIGINAL = Slices.createSimpleSlice(); private JavaBindingContext() { } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/SamAdapterDescriptor.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/SamAdapterDescriptor.java new file mode 100644 index 00000000000..83f270ef609 --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/SamAdapterDescriptor.java @@ -0,0 +1,25 @@ +/* + * 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.FunctionDescriptor; + +public interface SamAdapterDescriptor extends FunctionDescriptor { + @NotNull + D getDeclaration(); +} 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 7421ce3dbf3..0982676908b 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 @@ -226,7 +226,7 @@ public final class JavaConstructorResolver { @Nullable private ConstructorDescriptor resolveSamAdapter(@NotNull ConstructorDescriptor original) { return isSamAdapterNecessary(original) - ? recordSamAdapter(original, createSamAdapterConstructor(original), trace) + ? (ConstructorDescriptor) recordSamAdapter(original, createSamAdapterConstructor(original), trace) : null; } } \ 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 d0aabd7119d..e552968902f 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 @@ -35,6 +35,7 @@ import org.jetbrains.jet.lang.resolve.java.JavaBindingContext; 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.kotlinSignature.AlternativeMethodSignatureData; import org.jetbrains.jet.lang.resolve.java.kotlinSignature.SignaturesPropagationData; import org.jetbrains.jet.lang.resolve.java.kotlinSignature.SignaturesUtil; @@ -321,7 +322,7 @@ public final class JavaFunctionResolver { @Nullable private SimpleFunctionDescriptor resolveSamAdapter(@NotNull SimpleFunctionDescriptor original) { return isSamAdapterNecessary(original) - ? recordSamAdapter(original, createSamAdapterFunction(original), trace) + ? (SimpleFunctionDescriptor) recordSamAdapter(original, createSamAdapterFunction(original), trace) : null; } @@ -388,9 +389,13 @@ public final class JavaFunctionResolver { return constructorFunction; } - static F recordSamAdapter(F original, F adapterFunction, BindingTrace trace) { - trace.record(JavaBindingContext.SAM_ADAPTER_FUNCTION_TO_ORIGINAL, adapterFunction, original); - trace.record(BindingContext.SOURCE_DESCRIPTOR_FOR_SYNTHESIZED, adapterFunction, original); - return adapterFunction; + @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/SamAdapterConstructorDescriptor.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SamAdapterConstructorDescriptor.java new file mode 100644 index 00000000000..459cc1a1098 --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SamAdapterConstructorDescriptor.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.sam; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor; +import org.jetbrains.jet.lang.descriptors.impl.ConstructorDescriptorImpl; +import org.jetbrains.jet.lang.resolve.java.descriptor.SamAdapterDescriptor; + +/* package */ class SamAdapterConstructorDescriptor extends ConstructorDescriptorImpl + implements SamAdapterDescriptor { + private final ConstructorDescriptor declaration; + + public SamAdapterConstructorDescriptor(@NotNull ConstructorDescriptor declaration) { + super(declaration.getContainingDeclaration(), declaration.getAnnotations(), declaration.isPrimary(), Kind.SYNTHESIZED); + this.declaration = declaration; + } + + @NotNull + @Override + public ConstructorDescriptor getDeclaration() { + return declaration; + } +} diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SamAdapterFunctionDescriptor.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SamAdapterFunctionDescriptor.java new file mode 100644 index 00000000000..2d35b68fb81 --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SamAdapterFunctionDescriptor.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.sam; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor; +import org.jetbrains.jet.lang.descriptors.impl.SimpleFunctionDescriptorImpl; +import org.jetbrains.jet.lang.resolve.java.descriptor.SamAdapterDescriptor; + +/* package */ class SamAdapterFunctionDescriptor extends SimpleFunctionDescriptorImpl + implements SamAdapterDescriptor { + private final SimpleFunctionDescriptor declaration; + + public SamAdapterFunctionDescriptor(@NotNull SimpleFunctionDescriptor declaration) { + super(declaration.getContainingDeclaration(), declaration.getAnnotations(), declaration.getName(), Kind.SYNTHESIZED); + this.declaration = declaration; + } + + @NotNull + @Override + public SimpleFunctionDescriptor getDeclaration() { + return declaration; + } +} diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SamAdapterOverridabilityCondition.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SamAdapterOverridabilityCondition.java index c86cbbd7746..b803356e346 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SamAdapterOverridabilityCondition.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SamAdapterOverridabilityCondition.java @@ -56,18 +56,14 @@ public class SamAdapterOverridabilityCondition implements ExternalOverridability return null; } - SimpleFunctionDescriptor fun = declarationOrSynthesized.first; - if (fun.getKind() != CallableMemberDescriptor.Kind.SYNTHESIZED) { + SimpleFunctionDescriptorImpl fun = (SimpleFunctionDescriptorImpl) declarationOrSynthesized.first.getOriginal(); + if (!(fun instanceof SamAdapterFunctionDescriptor)) { return null; } - SimpleFunctionDescriptor originalOfSynthesized = ((SimpleFunctionDescriptorImpl) fun.getOriginal()) - .getOriginalOfSynthesized(); - if (originalOfSynthesized == null) { - return null; - } + SimpleFunctionDescriptor originalDeclarationOfSam = ((SamAdapterFunctionDescriptor) fun).getDeclaration(); - return ((SimpleFunctionDescriptor) originalOfSynthesized.substitute(TypeSubstitutor.create(declarationOrSynthesized.second))); + return ((SimpleFunctionDescriptor) originalDeclarationOfSam.substitute(TypeSubstitutor.create(declarationOrSynthesized.second))); } @Nullable 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 f496d7aa360..d2afe4600fb 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.ConstructorDescriptorImpl; 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.kotlinSignature.SignaturesUtil; import org.jetbrains.jet.lang.resolve.java.resolver.JavaSupertypeResolver; import org.jetbrains.jet.lang.resolve.java.structure.*; @@ -188,15 +188,9 @@ public class SingleAbstractMethodUtils { } @NotNull - public static SimpleFunctionDescriptor createSamAdapterFunction(@NotNull final SimpleFunctionDescriptor original) { - final SimpleFunctionDescriptorImpl result = new SimpleFunctionDescriptorImpl( - original.getContainingDeclaration(), - original.getAnnotations(), - original.getName(), - CallableMemberDescriptor.Kind.SYNTHESIZED, - original - ); - FunctionInitializer initializer = new FunctionInitializer() { + public static SamAdapterDescriptor createSamAdapterFunction(@NotNull final SimpleFunctionDescriptor original) { + final SamAdapterFunctionDescriptor result = new SamAdapterFunctionDescriptor(original); + return initSamAdapter(original, result, new FunctionInitializer() { @Override public void initialize( @NotNull List typeParameters, @@ -214,19 +208,13 @@ public class SingleAbstractMethodUtils { false ); } - }; - return initSamAdapter(original, result, initializer); + }); } @NotNull - public static ConstructorDescriptor createSamAdapterConstructor(@NotNull final ConstructorDescriptor original) { - final ConstructorDescriptorImpl result = new ConstructorDescriptorImpl( - original.getContainingDeclaration(), - original.getAnnotations(), - original.isPrimary(), - CallableMemberDescriptor.Kind.SYNTHESIZED - ); - FunctionInitializer initializer = new FunctionInitializer() { + public static SamAdapterDescriptor createSamAdapterConstructor(@NotNull final ConstructorDescriptor original) { + final SamAdapterConstructorDescriptor result = new SamAdapterConstructorDescriptor(original); + return initSamAdapter(original, result, new FunctionInitializer() { @Override public void initialize( @NotNull List typeParameters, @@ -240,13 +228,13 @@ public class SingleAbstractMethodUtils { original.getExpectedThisObject() == ReceiverParameterDescriptor.NO_RECEIVER_PARAMETER ); } - }; - return initSamAdapter(original, result, initializer); + }); } - private static F initSamAdapter( + @NotNull + private static SamAdapterDescriptor initSamAdapter( @NotNull F original, - @NotNull F adapter, + @NotNull SamAdapterDescriptor adapter, @NotNull FunctionInitializer initializer ) { TypeParameters typeParameters = recreateAndInitializeTypeParameters(original.getTypeParameters(), adapter); @@ -276,6 +264,7 @@ public class SingleAbstractMethodUtils { } initializer.initialize(typeParameters.descriptors, valueParameters, returnType); + return adapter; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/impl/SimpleFunctionDescriptorImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/impl/SimpleFunctionDescriptorImpl.java index eac3c82898e..0061646f302 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/impl/SimpleFunctionDescriptorImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/impl/SimpleFunctionDescriptorImpl.java @@ -30,29 +30,13 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme private boolean isInline = false; - private final SimpleFunctionDescriptor originalOfSynthesized; // TODO replace with user data - public SimpleFunctionDescriptorImpl( @NotNull DeclarationDescriptor containingDeclaration, @NotNull List annotations, @NotNull Name name, @NotNull Kind kind - ) { - this(containingDeclaration, annotations, name, kind, null); - } - - public SimpleFunctionDescriptorImpl( - @NotNull DeclarationDescriptor containingDeclaration, - @NotNull List annotations, - @NotNull Name name, - @NotNull Kind kind, - @Nullable SimpleFunctionDescriptor originalOfSynthesized ) { super(containingDeclaration, annotations, name, kind); - this.originalOfSynthesized = originalOfSynthesized; - if (originalOfSynthesized != null) { - assert kind == Kind.SYNTHESIZED; - } } private SimpleFunctionDescriptorImpl( @@ -62,7 +46,6 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme @NotNull Name name, @NotNull Kind kind) { super(containingDeclaration, original, annotations, name, kind); - originalOfSynthesized = null; } public SimpleFunctionDescriptorImpl initialize( @@ -118,10 +101,4 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme public boolean isInline() { return isInline; } - - // TODO replace with user data - @Nullable - public SimpleFunctionDescriptor getOriginalOfSynthesized() { - return originalOfSynthesized; - } }