Get rid of SAM_CONSTRUCTOR_TO_INTERFACE

use SamConstructorDescriptor instead
This commit is contained in:
Alexander Udalov
2013-08-05 20:29:51 +04:00
parent 4a620dfcbb
commit 517567fd24
7 changed files with 78 additions and 50 deletions
@@ -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.CallMaker;
import org.jetbrains.jet.lang.resolve.calls.util.ExpressionAsFunctionDescriptor; import org.jetbrains.jet.lang.resolve.calls.util.ExpressionAsFunctionDescriptor;
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; 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.ClassDescriptorFromJvmBytecode;
import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptor;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.receivers.*; import org.jetbrains.jet.lang.resolve.scopes.receivers.*;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
@@ -1902,11 +1906,9 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
} }
if (funDescriptor instanceof SimpleFunctionDescriptor) { if (funDescriptor instanceof SimpleFunctionDescriptor) {
ClassDescriptorFromJvmBytecode samInterface = bindingContext.get( SimpleFunctionDescriptor original = ((SimpleFunctionDescriptor) funDescriptor).getOriginal();
JavaBindingContext.SAM_CONSTRUCTOR_TO_INTERFACE, ((SimpleFunctionDescriptor) funDescriptor).getOriginal()); if (original instanceof SamConstructorDescriptor) {
return invokeSamConstructor(expression, resolvedCall, ((SamConstructorDescriptor) original).getSamInterface());
if (samInterface != null) {
return invokeSamConstructor(expression, resolvedCall, samInterface);
} }
} }
@@ -24,6 +24,7 @@ import com.intellij.psi.util.PsiFormatUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*; 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.BindingTrace;
import org.jetbrains.jet.lang.resolve.OverrideResolver; import org.jetbrains.jet.lang.resolve.OverrideResolver;
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass; import org.jetbrains.jet.lang.resolve.java.structure.JavaClass;
@@ -160,4 +161,12 @@ public final class DescriptorResolverUtils {
return result; return result;
} }
public static void recordSourceDescriptorForSynthesized(
@NotNull FunctionDescriptor synthesized,
@NotNull DeclarationDescriptor original,
@NotNull BindingTrace trace
) {
trace.record(BindingContext.SOURCE_DESCRIPTOR_FOR_SYNTHESIZED, synthesized, original);
}
} }
@@ -18,9 +18,7 @@ package org.jetbrains.jet.lang.resolve.java;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; 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.BindingContext;
import org.jetbrains.jet.lang.resolve.java.descriptor.ClassDescriptorFromJvmBytecode;
import org.jetbrains.jet.util.slicedmap.BasicWritableSlice; import org.jetbrains.jet.util.slicedmap.BasicWritableSlice;
import org.jetbrains.jet.util.slicedmap.Slices; import org.jetbrains.jet.util.slicedmap.Slices;
import org.jetbrains.jet.util.slicedmap.WritableSlice; import org.jetbrains.jet.util.slicedmap.WritableSlice;
@@ -41,8 +39,6 @@ public class JavaBindingContext {
public static final WritableSlice<DeclarationDescriptor, List<String>> LOAD_FROM_JAVA_SIGNATURE_ERRORS = public static final WritableSlice<DeclarationDescriptor, List<String>> LOAD_FROM_JAVA_SIGNATURE_ERRORS =
new BasicWritableSlice<DeclarationDescriptor, List<String>>(Slices.ONLY_REWRITE_TO_EQUAL, true); new BasicWritableSlice<DeclarationDescriptor, List<String>>(Slices.ONLY_REWRITE_TO_EQUAL, true);
public static final WritableSlice<SimpleFunctionDescriptor, ClassDescriptorFromJvmBytecode> SAM_CONSTRUCTOR_TO_INTERFACE = Slices.createSimpleSlice();
private JavaBindingContext() { private JavaBindingContext() {
} }
} }
@@ -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;
}
}
@@ -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.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.DescriptorResolver; 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.JavaBindingContext;
import org.jetbrains.jet.lang.resolve.java.JavaVisibilities; 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.kotlinSignature.AlternativeMethodSignatureData;
import org.jetbrains.jet.lang.resolve.java.structure.JavaArrayType; import org.jetbrains.jet.lang.resolve.java.structure.JavaArrayType;
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass; import org.jetbrains.jet.lang.resolve.java.structure.JavaClass;
@@ -42,7 +44,6 @@ import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; 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.createSamAdapterConstructor;
import static org.jetbrains.jet.lang.resolve.java.sam.SingleAbstractMethodUtils.isSamAdapterNecessary; import static org.jetbrains.jet.lang.resolve.java.sam.SingleAbstractMethodUtils.isSamAdapterNecessary;
@@ -225,8 +226,10 @@ public final class JavaConstructorResolver {
@Nullable @Nullable
private ConstructorDescriptor resolveSamAdapter(@NotNull ConstructorDescriptor original) { private ConstructorDescriptor resolveSamAdapter(@NotNull ConstructorDescriptor original) {
return isSamAdapterNecessary(original) if (!isSamAdapterNecessary(original)) return null;
? (ConstructorDescriptor) recordSamAdapter(original, createSamAdapterConstructor(original), trace)
: null; SamAdapterDescriptor<ConstructorDescriptor> adapter = createSamAdapterConstructor(original);
DescriptorResolverUtils.recordSourceDescriptorForSynthesized(adapter, original, trace);
return (ConstructorDescriptor) adapter;
} }
} }
@@ -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.ClassDescriptorFromJvmBytecode;
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaMethodDescriptor; 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.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.AlternativeMethodSignatureData;
import org.jetbrains.jet.lang.resolve.java.kotlinSignature.SignaturesPropagationData; import org.jetbrains.jet.lang.resolve.java.kotlinSignature.SignaturesPropagationData;
import org.jetbrains.jet.lang.resolve.java.kotlinSignature.SignaturesUtil; import org.jetbrains.jet.lang.resolve.java.kotlinSignature.SignaturesUtil;
@@ -309,11 +310,13 @@ public final class JavaFunctionResolver {
} }
@Nullable @Nullable
private SimpleFunctionDescriptor resolveSamConstructor(@NotNull NamespaceDescriptor owner, @NotNull NamedMembers namedMembers) { private SamConstructorDescriptor resolveSamConstructor(@NotNull NamespaceDescriptor owner, @NotNull NamedMembers namedMembers) {
if (namedMembers.getSamInterface() != null) { if (namedMembers.getSamInterface() != null) {
ClassDescriptorFromJvmBytecode klass = findClassInNamespace(owner, namedMembers.getName()); ClassDescriptorFromJvmBytecode klass = findClassInNamespace(owner, namedMembers.getName());
if (klass != null) { if (klass != null) {
return recordSamConstructor(klass, createSamConstructorFunction(owner, klass), trace); SamConstructorDescriptor constructor = createSamConstructorFunction(owner, klass);
DescriptorResolverUtils.recordSourceDescriptorForSynthesized(constructor, klass, trace);
return constructor;
} }
} }
return null; return null;
@@ -321,14 +324,16 @@ public final class JavaFunctionResolver {
@Nullable @Nullable
private SimpleFunctionDescriptor resolveSamAdapter(@NotNull SimpleFunctionDescriptor original) { private SimpleFunctionDescriptor resolveSamAdapter(@NotNull SimpleFunctionDescriptor original) {
return isSamAdapterNecessary(original) if (!isSamAdapterNecessary(original)) return null;
? (SimpleFunctionDescriptor) recordSamAdapter(original, createSamAdapterFunction(original), trace)
: null; SamAdapterDescriptor<SimpleFunctionDescriptor> adapter = createSamAdapterFunction(original);
DescriptorResolverUtils.recordSourceDescriptorForSynthesized(adapter, original, trace);
return (SimpleFunctionDescriptor) adapter;
} }
@NotNull @NotNull
public Set<FunctionDescriptor> resolveFunctionGroupForPackage(@NotNull NamedMembers members, @NotNull NamespaceDescriptor owner) { public Set<FunctionDescriptor> resolveFunctionGroupForPackage(@NotNull NamedMembers members, @NotNull NamespaceDescriptor owner) {
SimpleFunctionDescriptor samConstructor = resolveSamConstructor(owner, members); SamConstructorDescriptor samConstructor = resolveSamConstructor(owner, members);
if (samConstructor != null) { if (samConstructor != null) {
return Collections.<FunctionDescriptor>singleton(samConstructor); return Collections.<FunctionDescriptor>singleton(samConstructor);
} }
@@ -378,24 +383,4 @@ public final class JavaFunctionResolver {
return false; 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 <F extends FunctionDescriptor> SamAdapterDescriptor<F> recordSamAdapter(
@NotNull F original,
@NotNull SamAdapterDescriptor<F> adapter,
@NotNull BindingTrace trace
) {
trace.record(BindingContext.SOURCE_DESCRIPTOR_FOR_SYNTHESIZED, adapter, original);
return adapter;
}
} }
@@ -22,12 +22,12 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; 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.TypeParameterDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.impl.ValueParameterDescriptorImpl; import org.jetbrains.jet.lang.descriptors.impl.ValueParameterDescriptorImpl;
import org.jetbrains.jet.lang.resolve.java.DescriptorResolverUtils; 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.ClassDescriptorFromJvmBytecode;
import org.jetbrains.jet.lang.resolve.java.descriptor.SamAdapterDescriptor; 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.kotlinSignature.SignaturesUtil;
import org.jetbrains.jet.lang.resolve.java.resolver.JavaSupertypeResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaSupertypeResolver;
import org.jetbrains.jet.lang.resolve.java.structure.*; import org.jetbrains.jet.lang.resolve.java.structure.*;
@@ -133,18 +133,13 @@ public class SingleAbstractMethodUtils {
} }
@NotNull @NotNull
public static SimpleFunctionDescriptor createSamConstructorFunction( public static SamConstructorDescriptor createSamConstructorFunction(
@NotNull ClassOrNamespaceDescriptor owner, @NotNull ClassOrNamespaceDescriptor owner,
@NotNull ClassDescriptor samInterface @NotNull ClassDescriptorFromJvmBytecode samInterface
) { ) {
assert isSamInterface(samInterface) : samInterface; assert isSamInterface(samInterface) : samInterface;
SimpleFunctionDescriptorImpl result = new SimpleFunctionDescriptorImpl( SamConstructorDescriptor result = new SamConstructorDescriptor(owner, samInterface);
owner,
samInterface.getAnnotations(),
samInterface.getName(),
CallableMemberDescriptor.Kind.SYNTHESIZED
);
TypeParameters typeParameters = recreateAndInitializeTypeParameters(samInterface.getTypeConstructor().getParameters(), result); TypeParameters typeParameters = recreateAndInitializeTypeParameters(samInterface.getTypeConstructor().getParameters(), result);