Provide separate access to declared callable members as opposed to all callable members

All callable members contain "fake overrides", declared don't
This commit is contained in:
Andrey Breslav
2012-04-27 00:05:31 +04:00
parent 5f75be6253
commit b1627e3897
5 changed files with 30 additions and 28 deletions
@@ -33,7 +33,8 @@ import java.util.Set;
* @author abreslav * @author abreslav
*/ */
public class MutableClassDescriptor extends MutableClassDescriptorLite { public class MutableClassDescriptor extends MutableClassDescriptorLite {
private final Set<CallableMemberDescriptor> callableMembers = Sets.newHashSet(); private final Set<CallableMemberDescriptor> declaredCallableMembers = Sets.newHashSet();
private final Set<CallableMemberDescriptor> allCallableMembers = Sets.newHashSet(); // includes fake overrides
private final Set<PropertyDescriptor> properties = Sets.newHashSet(); private final Set<PropertyDescriptor> properties = Sets.newHashSet();
private final Set<SimpleFunctionDescriptor> functions = Sets.newHashSet(); private final Set<SimpleFunctionDescriptor> functions = Sets.newHashSet();
@@ -104,7 +105,10 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite {
public void addPropertyDescriptor(@NotNull PropertyDescriptor propertyDescriptor) { public void addPropertyDescriptor(@NotNull PropertyDescriptor propertyDescriptor) {
super.addPropertyDescriptor(propertyDescriptor); super.addPropertyDescriptor(propertyDescriptor);
properties.add(propertyDescriptor); properties.add(propertyDescriptor);
callableMembers.add(propertyDescriptor); if (propertyDescriptor.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
declaredCallableMembers.add(propertyDescriptor);
}
allCallableMembers.add(propertyDescriptor);
scopeForMemberResolution.addPropertyDescriptor(propertyDescriptor); scopeForMemberResolution.addPropertyDescriptor(propertyDescriptor);
} }
@@ -112,7 +116,10 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite {
public void addFunctionDescriptor(@NotNull SimpleFunctionDescriptor functionDescriptor) { public void addFunctionDescriptor(@NotNull SimpleFunctionDescriptor functionDescriptor) {
super.addFunctionDescriptor(functionDescriptor); super.addFunctionDescriptor(functionDescriptor);
functions.add(functionDescriptor); functions.add(functionDescriptor);
callableMembers.add(functionDescriptor); if (functionDescriptor.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
declaredCallableMembers.add(functionDescriptor);
}
allCallableMembers.add(functionDescriptor);
scopeForMemberResolution.addFunctionDescriptor(functionDescriptor); scopeForMemberResolution.addFunctionDescriptor(functionDescriptor);
} }
@@ -127,8 +134,13 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite {
} }
@NotNull @NotNull
public Set<CallableMemberDescriptor> getCallableMembers() { public Set<CallableMemberDescriptor> getDeclaredCallableMembers() {
return callableMembers; return declaredCallableMembers;
}
@NotNull
public Set<CallableMemberDescriptor> getAllCallableMembers() {
return allCallableMembers;
} }
@Override @Override
@@ -131,12 +131,10 @@ public class DeclarationsChecker {
} }
private void checkOpenMembers(MutableClassDescriptor classDescriptor) { private void checkOpenMembers(MutableClassDescriptor classDescriptor) {
for (CallableMemberDescriptor memberDescriptor : classDescriptor.getCallableMembers()) { for (CallableMemberDescriptor memberDescriptor : classDescriptor.getDeclaredCallableMembers()) {
if (memberDescriptor.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { JetNamedDeclaration member = (JetNamedDeclaration) BindingContextUtils.descriptorToDeclaration(trace.getBindingContext(), memberDescriptor);
JetNamedDeclaration member = (JetNamedDeclaration) BindingContextUtils.descriptorToDeclaration(trace.getBindingContext(), memberDescriptor); if (member != null && classDescriptor.getModality() == Modality.FINAL && member.hasModifier(JetTokens.OPEN_KEYWORD)) {
if (member != null && classDescriptor.getModality() == Modality.FINAL && member.hasModifier(JetTokens.OPEN_KEYWORD)) { trace.report(NON_FINAL_MEMBER_IN_FINAL_CLASS.on(member));
trace.report(NON_FINAL_MEMBER_IN_FINAL_CLASS.on(member));
}
} }
} }
} }
@@ -163,10 +163,8 @@ public class OverloadResolver {
) { ) {
MultiMap<String, CallableMemberDescriptor> functionsByName = MultiMap.create(); MultiMap<String, CallableMemberDescriptor> functionsByName = MultiMap.create();
for (CallableMemberDescriptor function : classDescriptor.getCallableMembers()) { for (CallableMemberDescriptor function : classDescriptor.getDeclaredCallableMembers()) {
if (function.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { functionsByName.putValue(function.getName(), function);
functionsByName.putValue(function.getName(), function);
}
} }
for (ConstructorDescriptor nestedClassConstructor : nestedClassConstructors) { for (ConstructorDescriptor nestedClassConstructor : nestedClassConstructors) {
@@ -90,11 +90,9 @@ public class OverrideResolver {
List<MutableClassDescriptor> allClasses = Lists.newArrayList(context.getClasses().values()); List<MutableClassDescriptor> allClasses = Lists.newArrayList(context.getClasses().values());
allClasses.addAll(context.getObjects().values()); allClasses.addAll(context.getObjects().values());
for (MutableClassDescriptor classDescriptor : allClasses) { for (MutableClassDescriptor classDescriptor : allClasses) {
Collection<CallableMemberDescriptor> members = classDescriptor.getCallableMembers(); Collection<CallableMemberDescriptor> members = classDescriptor.getAllCallableMembers();
for (CallableMemberDescriptor member : members) { for (CallableMemberDescriptor member : members) {
//if (member.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { checkOverridesForParameters(member);
checkOverridesForParameters(member);
//}
} }
} }
} }
@@ -136,7 +134,7 @@ public class OverrideResolver {
MultiMap<String, CallableMemberDescriptor> functionsFromSupertypesByName = groupDescriptorsByName(functionsFromSupertypes); MultiMap<String, CallableMemberDescriptor> functionsFromSupertypesByName = groupDescriptorsByName(functionsFromSupertypes);
MultiMap<String, CallableMemberDescriptor> functionsFromCurrentByName = groupDescriptorsByName(classDescriptor.getCallableMembers()); MultiMap<String, CallableMemberDescriptor> functionsFromCurrentByName = groupDescriptorsByName(classDescriptor.getDeclaredCallableMembers());
Set<String> functionNames = new LinkedHashSet<String>(); Set<String> functionNames = new LinkedHashSet<String>();
functionNames.addAll(functionsFromSupertypesByName.keySet()); functionNames.addAll(functionsFromSupertypesByName.keySet());
@@ -261,10 +259,8 @@ public class OverrideResolver {
if (topDownAnalysisParameters.isAnalyzingBootstrapLibrary()) return; if (topDownAnalysisParameters.isAnalyzingBootstrapLibrary()) return;
// Check overrides for internal consistency // Check overrides for internal consistency
for (CallableMemberDescriptor member : classDescriptor.getCallableMembers()) { for (CallableMemberDescriptor member : classDescriptor.getDeclaredCallableMembers()) {
if (member.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { checkOverrideForMember(member, invisibleOverriddenDescriptors);
checkOverrideForMember(member, invisibleOverriddenDescriptors);
}
} }
// Check if everything that must be overridden, actually is // Check if everything that must be overridden, actually is
@@ -30,10 +30,8 @@ public class OverrideMethodsHandler extends OverrideImplementMethodsHandler {
@Override @Override
protected Set<CallableMemberDescriptor> collectMethodsToGenerate(MutableClassDescriptor descriptor) { protected Set<CallableMemberDescriptor> collectMethodsToGenerate(MutableClassDescriptor descriptor) {
final Set<CallableMemberDescriptor> superMethods = OverrideResolver.collectSuperMethods(descriptor).keySet(); final Set<CallableMemberDescriptor> superMethods = OverrideResolver.collectSuperMethods(descriptor).keySet();
for (CallableMemberDescriptor member : descriptor.getCallableMembers()) { for (CallableMemberDescriptor member : descriptor.getDeclaredCallableMembers()) {
if (member.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { superMethods.removeAll(member.getOverriddenDescriptors());
superMethods.removeAll(member.getOverriddenDescriptors());
}
} }
Set<CallableMemberDescriptor> result = new HashSet<CallableMemberDescriptor>(); Set<CallableMemberDescriptor> result = new HashSet<CallableMemberDescriptor>();
for (CallableMemberDescriptor superMethod : superMethods) { for (CallableMemberDescriptor superMethod : superMethods) {