Get rid of SAM_CONSTRUCTOR_TO_INTERFACE
use SamConstructorDescriptor instead
This commit is contained in:
@@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+9
@@ -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() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+38
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
+7
-4
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+11
-26
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
+4
-9
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user