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
*/
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<SimpleFunctionDescriptor> functions = Sets.newHashSet();
@@ -104,7 +105,10 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite {
public void addPropertyDescriptor(@NotNull PropertyDescriptor propertyDescriptor) {
super.addPropertyDescriptor(propertyDescriptor);
properties.add(propertyDescriptor);
callableMembers.add(propertyDescriptor);
if (propertyDescriptor.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
declaredCallableMembers.add(propertyDescriptor);
}
allCallableMembers.add(propertyDescriptor);
scopeForMemberResolution.addPropertyDescriptor(propertyDescriptor);
}
@@ -112,7 +116,10 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite {
public void addFunctionDescriptor(@NotNull SimpleFunctionDescriptor functionDescriptor) {
super.addFunctionDescriptor(functionDescriptor);
functions.add(functionDescriptor);
callableMembers.add(functionDescriptor);
if (functionDescriptor.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
declaredCallableMembers.add(functionDescriptor);
}
allCallableMembers.add(functionDescriptor);
scopeForMemberResolution.addFunctionDescriptor(functionDescriptor);
}
@@ -127,8 +134,13 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite {
}
@NotNull
public Set<CallableMemberDescriptor> getCallableMembers() {
return callableMembers;
public Set<CallableMemberDescriptor> getDeclaredCallableMembers() {
return declaredCallableMembers;
}
@NotNull
public Set<CallableMemberDescriptor> getAllCallableMembers() {
return allCallableMembers;
}
@Override
@@ -131,12 +131,10 @@ public class DeclarationsChecker {
}
private void checkOpenMembers(MutableClassDescriptor classDescriptor) {
for (CallableMemberDescriptor memberDescriptor : classDescriptor.getCallableMembers()) {
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));
}
for (CallableMemberDescriptor memberDescriptor : classDescriptor.getDeclaredCallableMembers()) {
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));
}
}
}
@@ -163,10 +163,8 @@ public class OverloadResolver {
) {
MultiMap<String, CallableMemberDescriptor> functionsByName = MultiMap.create();
for (CallableMemberDescriptor function : classDescriptor.getCallableMembers()) {
if (function.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
functionsByName.putValue(function.getName(), function);
}
for (CallableMemberDescriptor function : classDescriptor.getDeclaredCallableMembers()) {
functionsByName.putValue(function.getName(), function);
}
for (ConstructorDescriptor nestedClassConstructor : nestedClassConstructors) {
@@ -90,11 +90,9 @@ public class OverrideResolver {
List<MutableClassDescriptor> allClasses = Lists.newArrayList(context.getClasses().values());
allClasses.addAll(context.getObjects().values());
for (MutableClassDescriptor classDescriptor : allClasses) {
Collection<CallableMemberDescriptor> members = classDescriptor.getCallableMembers();
Collection<CallableMemberDescriptor> members = classDescriptor.getAllCallableMembers();
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> functionsFromCurrentByName = groupDescriptorsByName(classDescriptor.getCallableMembers());
MultiMap<String, CallableMemberDescriptor> functionsFromCurrentByName = groupDescriptorsByName(classDescriptor.getDeclaredCallableMembers());
Set<String> functionNames = new LinkedHashSet<String>();
functionNames.addAll(functionsFromSupertypesByName.keySet());
@@ -261,10 +259,8 @@ public class OverrideResolver {
if (topDownAnalysisParameters.isAnalyzingBootstrapLibrary()) return;
// Check overrides for internal consistency
for (CallableMemberDescriptor member : classDescriptor.getCallableMembers()) {
if (member.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
checkOverrideForMember(member, invisibleOverriddenDescriptors);
}
for (CallableMemberDescriptor member : classDescriptor.getDeclaredCallableMembers()) {
checkOverrideForMember(member, invisibleOverriddenDescriptors);
}
// Check if everything that must be overridden, actually is
@@ -30,10 +30,8 @@ public class OverrideMethodsHandler extends OverrideImplementMethodsHandler {
@Override
protected Set<CallableMemberDescriptor> collectMethodsToGenerate(MutableClassDescriptor descriptor) {
final Set<CallableMemberDescriptor> superMethods = OverrideResolver.collectSuperMethods(descriptor).keySet();
for (CallableMemberDescriptor member : descriptor.getCallableMembers()) {
if (member.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
superMethods.removeAll(member.getOverriddenDescriptors());
}
for (CallableMemberDescriptor member : descriptor.getDeclaredCallableMembers()) {
superMethods.removeAll(member.getOverriddenDescriptors());
}
Set<CallableMemberDescriptor> result = new HashSet<CallableMemberDescriptor>();
for (CallableMemberDescriptor superMethod : superMethods) {