From 07c5f8e12a99e6770214c546002768404c0678b1 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 26 Apr 2012 16:42:11 +0400 Subject: [PATCH] MutableClassDescriptor.getCallableDescriptors() now includes "fake overrides" Otherwise, it was necessary to call getAllDescriptors() on the member scope, which seems like a bad idea. Adjustments have been made to the client code, to exclude "fake overrides" from irrelevant checks. --- .../jet/lang/resolve/DeclarationsChecker.java | 12 ++++++------ .../jetbrains/jet/lang/resolve/OverloadResolver.java | 4 +++- .../jetbrains/jet/lang/resolve/OverrideResolver.java | 8 +++++--- .../plugin/codeInsight/OverrideMethodsHandler.java | 4 +++- 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java index c3108cb8bcc..de8604bd38a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java @@ -21,10 +21,8 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.intellij.lang.ASTNode; import com.intellij.openapi.util.Pair; -import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import javax.inject.Inject; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.diagnostics.Errors; import org.jetbrains.jet.lang.psi.*; @@ -34,6 +32,7 @@ import org.jetbrains.jet.lexer.JetKeywordToken; import org.jetbrains.jet.lexer.JetToken; import org.jetbrains.jet.lexer.JetTokens; +import javax.inject.Inject; import java.util.Collection; import java.util.List; import java.util.Map; @@ -133,10 +132,11 @@ public class DeclarationsChecker { private void checkOpenMembers(MutableClassDescriptor classDescriptor) { for (CallableMemberDescriptor memberDescriptor : classDescriptor.getCallableMembers()) { - - JetNamedDeclaration member = (JetNamedDeclaration) BindingContextUtils.descriptorToDeclaration(trace.getBindingContext(), memberDescriptor); - if (member != null && classDescriptor.getModality() == Modality.FINAL && member.hasModifier(JetTokens.OPEN_KEYWORD)) { - trace.report(NON_FINAL_MEMBER_IN_FINAL_CLASS.on(member)); + if (memberDescriptor.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { + JetNamedDeclaration member = (JetNamedDeclaration) BindingContextUtils.descriptorToDeclaration(trace.getBindingContext(), memberDescriptor); + if (member != null && classDescriptor.getModality() == Modality.FINAL && member.hasModifier(JetTokens.OPEN_KEYWORD)) { + trace.report(NON_FINAL_MEMBER_IN_FINAL_CLASS.on(member)); + } } } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java index 3368e4d784e..66c540c63c3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java @@ -164,7 +164,9 @@ public class OverloadResolver { MultiMap functionsByName = MultiMap.create(); for (CallableMemberDescriptor function : classDescriptor.getCallableMembers()) { - functionsByName.putValue(function.getName(), function); + if (function.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { + functionsByName.putValue(function.getName(), function); + } } for (ConstructorDescriptor nestedClassConstructor : nestedClassConstructors) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java index 75601602ebf..cf9631b08cb 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java @@ -134,10 +134,10 @@ public class OverrideResolver { @Override public void addToScope(@NotNull CallableMemberDescriptor fakeOverride) { if (fakeOverride instanceof PropertyDescriptor) { - classDescriptor.getScopeForMemberLookupAsWritableScope().addPropertyDescriptor((PropertyDescriptor) fakeOverride); + classDescriptor.addPropertyDescriptor((PropertyDescriptor) fakeOverride); } else if (fakeOverride instanceof SimpleFunctionDescriptor) { - classDescriptor.getScopeForMemberLookupAsWritableScope().addFunctionDescriptor((SimpleFunctionDescriptor) fakeOverride); + classDescriptor.addFunctionDescriptor((SimpleFunctionDescriptor) fakeOverride); } else { throw new IllegalStateException(fakeOverride.getClass().getName()); @@ -245,7 +245,9 @@ public class OverrideResolver { // Check overrides for internal consistency for (CallableMemberDescriptor member : classDescriptor.getCallableMembers()) { - checkOverrideForMember(member, invisibleOverriddenDescriptors); + if (member.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { + checkOverrideForMember(member, invisibleOverriddenDescriptors); + } } // Check if everything that must be overridden, actually is diff --git a/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideMethodsHandler.java b/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideMethodsHandler.java index 72f1bebcd98..6cbbcece3ba 100644 --- a/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideMethodsHandler.java +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideMethodsHandler.java @@ -31,7 +31,9 @@ public class OverrideMethodsHandler extends OverrideImplementMethodsHandler { protected Set collectMethodsToGenerate(MutableClassDescriptor descriptor) { final Set superMethods = OverrideResolver.collectSuperMethods(descriptor).keySet(); for (CallableMemberDescriptor member : descriptor.getCallableMembers()) { - superMethods.removeAll(member.getOverriddenDescriptors()); + if (member.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { + superMethods.removeAll(member.getOverriddenDescriptors()); + } } Set result = new HashSet(); for (CallableMemberDescriptor superMethod : superMethods) {