diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java index e673cc084e5..bfce680022a 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java @@ -378,4 +378,13 @@ public class CodegenUtil { } return member; } + + public static void checkMustGenerateCode(CallableMemberDescriptor descriptor) { + if (descriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { + throw new IllegalStateException("must not generate code for fake overrides"); + } + if (descriptor.getKind() == CallableMemberDescriptor.Kind.SYNTHESIZED) { + throw new IllegalStateException("code generation for synthesized members should be handled separately"); + } + } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java index 9da8cca4c38..e58ed8242a6 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java @@ -97,9 +97,7 @@ public class FunctionCodegen extends GenerationStateAware { FunctionDescriptor functionDescriptor, JetDeclarationWithBody fun ) { - if (functionDescriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { - throw new IllegalStateException("must not generate code for fake overrides"); - } + checkMustGenerateCode(functionDescriptor); List paramDescrs = functionDescriptor.getValueParameters(); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java index 82665cfe086..1a57f984628 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java @@ -171,9 +171,7 @@ public class PropertyCodegen extends GenerationStateAware { } public void generateDefaultGetter(PropertyDescriptor propertyDescriptor, int flags, PsiElement origin) { - if (propertyDescriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { - throw new IllegalStateException("must not generate code for fake overrides"); - } + checkMustGenerateCode(propertyDescriptor); if (kind == OwnerKind.TRAIT_IMPL) { return; @@ -277,9 +275,7 @@ public class PropertyCodegen extends GenerationStateAware { } public void generateDefaultSetter(PropertyDescriptor propertyDescriptor, int flags, PsiElement origin) { - if (propertyDescriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { - throw new IllegalStateException("must not generate code for fake overrides"); - } + checkMustGenerateCode(propertyDescriptor); if (kind == OwnerKind.TRAIT_IMPL) { return; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/CallableMemberDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/CallableMemberDescriptor.java index ce4b59b4d9a..bd952a8445b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/CallableMemberDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/CallableMemberDescriptor.java @@ -38,10 +38,11 @@ public interface CallableMemberDescriptor extends CallableDescriptor, MemberDesc DECLARATION, FAKE_OVERRIDE, DELEGATION, + SYNTHESIZED ; public boolean isReal() { - return this == DECLARATION || this == DELEGATION; + return this == DECLARATION || this == DELEGATION || this == SYNTHESIZED; } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java index 70d0ace556c..ae5676f264e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java @@ -222,7 +222,7 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite implement public void addFunctionDescriptor(@NotNull SimpleFunctionDescriptor functionDescriptor) { superBuilder.addFunctionDescriptor(functionDescriptor); functions.add(functionDescriptor); - if (functionDescriptor.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { + if (functionDescriptor.getKind().isReal()) { declaredCallableMembers.add(functionDescriptor); } allCallableMembers.add(functionDescriptor); @@ -260,7 +260,7 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite implement public void addPropertyDescriptor(@NotNull PropertyDescriptor propertyDescriptor) { superBuilder.addPropertyDescriptor(propertyDescriptor); properties.add(propertyDescriptor); - if (propertyDescriptor.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { + if (propertyDescriptor.getKind().isReal()) { declaredCallableMembers.add(propertyDescriptor); } allCallableMembers.add(propertyDescriptor); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContextUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContextUtils.java index e363cef7ebb..f044c21436b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContextUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContextUtils.java @@ -26,6 +26,7 @@ import org.jetbrains.jet.util.slicedmap.ReadOnlySlice; import org.jetbrains.jet.util.slicedmap.Slices; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Set; @@ -152,32 +153,40 @@ public class BindingContextUtils { @Nullable public static PsiElement callableDescriptorToDeclaration(@NotNull BindingContext context, @NotNull CallableMemberDescriptor callable) { - if (callable.getKind() != CallableMemberDescriptor.Kind.DECLARATION) { - Set overriddenDescriptors = callable.getOverriddenDescriptors(); - if (overriddenDescriptors.size() != 1) { - // TODO evil code - throw new IllegalStateException( - "cannot find declaration: fake descriptor" + - " has more then one overridden descriptor: " + callable); - } - - return callableDescriptorToDeclaration(context, overriddenDescriptors.iterator().next()); + if (callable.getKind() == CallableMemberDescriptor.Kind.SYNTHESIZED) { + return null; } - return doGetDescriptorToDeclaration(context, callable.getOriginal()); + if (callable.getKind() == CallableMemberDescriptor.Kind.DECLARATION) { + return doGetDescriptorToDeclaration(context, callable.getOriginal()); + } + + Set overriddenDescriptors = callable.getOverriddenDescriptors(); + if (overriddenDescriptors.size() != 1) { + throw new IllegalStateException( + "cannot find declaration: fake descriptor has more than one overridden descriptor: " + callable); + } + + return callableDescriptorToDeclaration(context, overriddenDescriptors.iterator().next()); } + @NotNull private static List callableDescriptorToDeclarations(@NotNull BindingContext context, @NotNull CallableMemberDescriptor callable) { - if (callable.getKind() != CallableMemberDescriptor.Kind.DECLARATION) { - List r = new ArrayList(); - Set overriddenDescriptors = callable.getOverriddenDescriptors(); - for (CallableMemberDescriptor overridden : overriddenDescriptors) { - r.addAll(callableDescriptorToDeclarations(context, overridden)); - } - return r; + if (callable.getKind() == CallableMemberDescriptor.Kind.SYNTHESIZED) { + return Collections.emptyList(); } - PsiElement psiElement = doGetDescriptorToDeclaration(context, callable); - return psiElement != null ? Lists.newArrayList(psiElement) : Lists.newArrayList(); + + if (callable.getKind() == CallableMemberDescriptor.Kind.DECLARATION) { + PsiElement psiElement = doGetDescriptorToDeclaration(context, callable); + return psiElement != null ? Lists.newArrayList(psiElement) : Lists.newArrayList(); + } + + List r = new ArrayList(); + Set overriddenDescriptors = callable.getOverriddenDescriptors(); + for (CallableMemberDescriptor overridden : overriddenDescriptors) { + r.addAll(callableDescriptorToDeclarations(context, overridden)); + } + return r; } @Nullable