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.
This commit is contained in:
Andrey Breslav
2012-04-26 16:42:11 +04:00
parent 3a56b7905d
commit 07c5f8e12a
4 changed files with 17 additions and 11 deletions
@@ -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));
}
}
}
}
@@ -164,7 +164,9 @@ public class OverloadResolver {
MultiMap<String, CallableMemberDescriptor> 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) {
@@ -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
@@ -31,7 +31,9 @@ public class OverrideMethodsHandler extends OverrideImplementMethodsHandler {
protected Set<CallableMemberDescriptor> collectMethodsToGenerate(MutableClassDescriptor descriptor) {
final Set<CallableMemberDescriptor> 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<CallableMemberDescriptor> result = new HashSet<CallableMemberDescriptor>();
for (CallableMemberDescriptor superMethod : superMethods) {