Extract DescriptorUtils.unwrapFakeOverride()

This commit is contained in:
Alexander Udalov
2014-03-03 21:59:16 +04:00
parent e017cf76f2
commit c74b8e72c7
7 changed files with 32 additions and 41 deletions
@@ -38,7 +38,9 @@ import org.jetbrains.jet.lang.descriptors.impl.SimpleFunctionDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.impl.TypeParameterDescriptorImpl;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.calls.CallResolverUtil;
import org.jetbrains.jet.lang.resolve.constants.*;
import org.jetbrains.jet.lang.resolve.constants.ArrayValue;
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
import org.jetbrains.jet.lang.resolve.constants.JavaClassValue;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.JetType;
@@ -107,15 +109,6 @@ public class CodegenUtil {
return KotlinBuiltIns.getInstance().getAnyType();
}
@NotNull
public static <T extends CallableMemberDescriptor> T unwrapFakeOverride(T member) {
while (member.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
//noinspection unchecked
member = (T) member.getOverriddenDescriptors().iterator().next();
}
return member;
}
@Nullable
public static FunctionDescriptor getDeclaredFunctionByRawSignature(
@NotNull ClassDescriptor owner,
@@ -32,12 +32,12 @@ import org.jetbrains.asm4.MethodVisitor;
import org.jetbrains.asm4.Type;
import org.jetbrains.asm4.commons.InstructionAdapter;
import org.jetbrains.asm4.commons.Method;
import org.jetbrains.jet.codegen.inline.InlineCodegen;
import org.jetbrains.jet.codegen.inline.NameGenerator;
import org.jetbrains.jet.codegen.binding.CalculatedClosure;
import org.jetbrains.jet.codegen.binding.CodegenBinding;
import org.jetbrains.jet.codegen.binding.MutableClosure;
import org.jetbrains.jet.codegen.context.*;
import org.jetbrains.jet.codegen.inline.InlineCodegen;
import org.jetbrains.jet.codegen.inline.NameGenerator;
import org.jetbrains.jet.codegen.intrinsics.IntrinsicMethod;
import org.jetbrains.jet.codegen.signature.JvmMethodSignature;
import org.jetbrains.jet.codegen.state.GenerationState;
@@ -1641,7 +1641,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
descriptor = descriptor.getOriginal();
if (descriptor instanceof CallableMemberDescriptor) {
CallableMemberDescriptor memberDescriptor = unwrapFakeOverride((CallableMemberDescriptor) descriptor);
CallableMemberDescriptor memberDescriptor = DescriptorUtils.unwrapFakeOverride((CallableMemberDescriptor) descriptor);
IntrinsicMethod intrinsic = state.getIntrinsics().getIntrinsic(memberDescriptor);
if (intrinsic != null) {
@@ -1859,7 +1859,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
Type owner;
CallableMethod callableMethod = callableGetter != null ? callableGetter : callableSetter;
propertyDescriptor = unwrapFakeOverride(propertyDescriptor);
propertyDescriptor = DescriptorUtils.unwrapFakeOverride(propertyDescriptor);
if (callableMethod == null) {
owner = typeMapper.getOwner(isBackingFieldInAnotherClass ? propertyDescriptor.getContainingDeclaration() : propertyDescriptor,
context.getContextKind(), isCallInsideSameModuleAsDeclared(propertyDescriptor, context));
@@ -2117,7 +2117,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
((SimpleFunctionDescriptor) descriptor).getInlineStrategy().isInline();
CallGenerator callGenerator = !isInline ? defaulCallGenerator :
new InlineCodegen(this, state, (SimpleFunctionDescriptor) unwrapFakeOverride(
new InlineCodegen(this, state, (SimpleFunctionDescriptor) DescriptorUtils.unwrapFakeOverride(
(CallableMemberDescriptor) descriptor.getOriginal()), call);
if (resolvedCall instanceof VariableAsFunctionResolvedCall) {
@@ -55,8 +55,7 @@ import static org.jetbrains.jet.codegen.AsmUtil.getTraitImplThisParameterType;
import static org.jetbrains.jet.codegen.CodegenUtil.*;
import static org.jetbrains.jet.codegen.FunctionTypesUtil.getFunctionTraitClassName;
import static org.jetbrains.jet.codegen.binding.CodegenBinding.*;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isAnnotationClass;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isAnonymousObject;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.*;
import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.OBJECT_TYPE;
public class JetTypeMapper extends BindingTraceAware {
@@ -469,4 +469,19 @@ public class DescriptorUtils {
return isTopLevelDeclaration(descriptor) ||
containing instanceof ClassDescriptor && isTopLevelOrInnerClass((ClassDescriptor) containing);
}
// This method works correctly because every fake override has a declaration among its ancestors, and no fake override is allowed
// to have two different declarations among its ancestors, none of which is an ancestor of the other
@NotNull
public static <D extends CallableMemberDescriptor> D unwrapFakeOverride(@NotNull D descriptor) {
while (descriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
Set<? extends CallableMemberDescriptor> overridden = descriptor.getOverriddenDescriptors();
if (overridden.isEmpty()) {
throw new IllegalStateException("Fake override should have at least one overridden descriptor: " + descriptor);
}
//noinspection unchecked
descriptor = (D) overridden.iterator().next();
}
return descriptor;
}
}
@@ -162,12 +162,7 @@ public final class DescriptorLookupConverter {
@NotNull BindingContext bindingContext,
@NotNull DeclarationDescriptor descriptor) {
if (descriptor instanceof CallableMemberDescriptor) {
CallableMemberDescriptor callableMemberDescriptor = (CallableMemberDescriptor) descriptor;
while (callableMemberDescriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
// TODO: need to know all of them
callableMemberDescriptor = callableMemberDescriptor.getOverriddenDescriptors().iterator().next();
}
descriptor = callableMemberDescriptor;
descriptor = DescriptorUtils.unwrapFakeOverride((CallableMemberDescriptor) descriptor);
}
return createLookupElement(analyzer, descriptor, BindingContextUtils.descriptorToDeclaration(bindingContext, descriptor));
}
@@ -28,8 +28,6 @@ import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinder;
import org.jetbrains.jet.lang.resolve.name.FqName;
import java.util.Set;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getFqName;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getFqNameSafe;
@@ -72,18 +70,11 @@ public final class DecompiledNavigationUtils {
//TODO: should be done via some generic mechanism
@NotNull
private static DeclarationDescriptor getEffectiveReferencedDescriptor(@NotNull DeclarationDescriptor referencedDescriptor) {
if (referencedDescriptor instanceof CallableMemberDescriptor) {
CallableMemberDescriptor callableMemberDescriptor = (CallableMemberDescriptor) referencedDescriptor;
CallableMemberDescriptor.Kind kind = callableMemberDescriptor.getKind();
if (kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
Set<? extends CallableMemberDescriptor> overriddenDescriptors =
callableMemberDescriptor.getOverriddenDescriptors();
//TODO: several descriptors
return getEffectiveReferencedDescriptor(overriddenDescriptors.iterator().next());
}
private static DeclarationDescriptor getEffectiveReferencedDescriptor(@NotNull DeclarationDescriptor descriptor) {
if (descriptor instanceof CallableMemberDescriptor) {
return DescriptorUtils.unwrapFakeOverride((CallableMemberDescriptor) descriptor);
}
return referencedDescriptor;
return descriptor;
}
@@ -56,6 +56,8 @@ import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.unwrapFakeOverride;
public class BuiltInsReferenceResolver extends AbstractProjectComponent {
private static final File BUILT_INS_COMPILABLE_SRC_DIR = new File("core/builtins/src", KotlinBuiltIns.BUILT_INS_PACKAGE_NAME_STRING);
@@ -178,11 +180,7 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent {
private DeclarationDescriptor findCurrentDescriptorForMember(@NotNull MemberDescriptor originalDescriptor) {
if (originalDescriptor instanceof CallableMemberDescriptor &&
((CallableMemberDescriptor) originalDescriptor).getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
CallableMemberDescriptor descriptor = (CallableMemberDescriptor) originalDescriptor;
while (descriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
descriptor = descriptor.getOverriddenDescriptors().iterator().next();
}
return findCurrentDescriptorForMember(descriptor.getOriginal());
return findCurrentDescriptorForMember(unwrapFakeOverride((CallableMemberDescriptor) originalDescriptor).getOriginal());
}
DeclarationDescriptor containingDeclaration = findCurrentDescriptor(originalDescriptor.getContainingDeclaration());