KT-316 Members of traits must be open by default

This commit is contained in:
Andrey Breslav
2011-09-22 16:20:00 +04:00
parent 4a7c211abe
commit e0548d54db
3 changed files with 19 additions and 4 deletions
@@ -190,9 +190,12 @@ public class ClassDescriptorResolver {
} }
Modality defaultModality; Modality defaultModality;
if (containingDescriptor instanceof ClassDescriptor) { if (containingDescriptor instanceof ClassDescriptor) {
boolean isDefinitelyAbstract = ((ClassDescriptor) containingDescriptor).getKind() == ClassKind.TRAIT && function.getBodyExpression() == null; boolean isTrait = ((ClassDescriptor) containingDescriptor).getKind() == ClassKind.TRAIT;
defaultModality = isDefinitelyAbstract ? Modality.ABSTRACT : Modality.FINAL; boolean isDefinitelyAbstract = isTrait && function.getBodyExpression() == null;
} else { Modality basicModality = isTrait ? Modality.OPEN : Modality.FINAL;
defaultModality = isDefinitelyAbstract ? Modality.ABSTRACT : basicModality;
}
else {
defaultModality = Modality.FINAL; defaultModality = Modality.FINAL;
} }
Modality modality = resolveModalityFromModifiers(function.getModifierList(), defaultModality); Modality modality = resolveModalityFromModifiers(function.getModifierList(), defaultModality);
@@ -28,7 +28,9 @@ public class OverridingUtil {
public static <D extends CallableDescriptor> Set<D> filterOverrides(Set<D> candidateSet) { public static <D extends CallableDescriptor> Set<D> filterOverrides(Set<D> candidateSet) {
Set<D> candidates = Sets.newLinkedHashSet(candidateSet); Set<D> candidates = Sets.newLinkedHashSet(candidateSet);
for (D descriptor : candidateSet) { for (D descriptor : candidateSet) {
candidates.removeAll(descriptor.getOverriddenDescriptors()); Set<CallableDescriptor> overriddenDescriptors = Sets.newHashSet();
getAllOverriddenDescriptors(descriptor.getOriginal(), overriddenDescriptors);
candidates.removeAll(overriddenDescriptors);
} }
return candidates; return candidates;
} }
@@ -0,0 +1,10 @@
// KT-316 Members of traits must be open by default
trait B {
fun bar() {}
fun foo() {}
}
open class A() : B{
override fun foo() {}
}