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
@@ -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);
}
}
@@ -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<DeclarationDescriptor, List<String>> LOAD_FROM_JAVA_SIGNATURE_ERRORS =
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() {
}
}
@@ -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.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<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.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<SimpleFunctionDescriptor> adapter = createSamAdapterFunction(original);
DescriptorResolverUtils.recordSourceDescriptorForSynthesized(adapter, original, trace);
return (SimpleFunctionDescriptor) adapter;
}
@NotNull
public Set<FunctionDescriptor> resolveFunctionGroupForPackage(@NotNull NamedMembers members, @NotNull NamespaceDescriptor owner) {
SimpleFunctionDescriptor samConstructor = resolveSamConstructor(owner, members);
SamConstructorDescriptor samConstructor = resolveSamConstructor(owner, members);
if (samConstructor != null) {
return Collections.<FunctionDescriptor>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 <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.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);