OverridingUtil turned into a singleton

This commit is contained in:
Andrey Breslav
2014-05-29 21:17:21 +04:00
parent 67b8d3a875
commit f54e2bc498
7 changed files with 16 additions and 16 deletions
@@ -40,8 +40,6 @@ import javax.inject.Inject;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import static org.jetbrains.jet.lang.resolve.OverridingUtil.isOverridableBy;
public class PsiBasedMethodSignatureChecker implements MethodSignatureChecker { public class PsiBasedMethodSignatureChecker implements MethodSignatureChecker {
private static final Logger LOG = Logger.getInstance(PsiBasedMethodSignatureChecker.class); private static final Logger LOG = Logger.getInstance(PsiBasedMethodSignatureChecker.class);
@@ -77,7 +75,7 @@ public class PsiBasedMethodSignatureChecker implements MethodSignatureChecker {
assert superFunctionSubstituted != null : "Couldn't substitute super function: " + superFunction + ", substitutor = " + substitutor; assert superFunctionSubstituted != null : "Couldn't substitute super function: " + superFunction + ", substitutor = " + substitutor;
OverridingUtil.OverrideCompatibilityInfo.Result overridableResult = isOverridableBy(superFunctionSubstituted, function).getResult(); OverridingUtil.OverrideCompatibilityInfo.Result overridableResult = OverridingUtil.DEFAULT.isOverridableBy(superFunctionSubstituted, function).getResult();
boolean paramsOk = overridableResult == OverridingUtil.OverrideCompatibilityInfo.Result.OVERRIDABLE; boolean paramsOk = overridableResult == OverridingUtil.OverrideCompatibilityInfo.Result.OVERRIDABLE;
boolean returnTypeOk = OverrideResolver.isReturnTypeOkForOverride(superFunctionSubstituted, function); boolean returnTypeOk = OverrideResolver.isReturnTypeOkForOverride(superFunctionSubstituted, function);
if (!paramsOk || !returnTypeOk) { if (!paramsOk || !returnTypeOk) {
@@ -214,7 +214,7 @@ public final class DelegationResolver<T extends CallableMemberDescriptor> {
private static boolean haveSameSignatures(@NotNull CallableDescriptor memberOne, @NotNull CallableDescriptor memberTwo) { private static boolean haveSameSignatures(@NotNull CallableDescriptor memberOne, @NotNull CallableDescriptor memberTwo) {
//isOverridableBy ignores return types //isOverridableBy ignores return types
return OverridingUtil.isOverridableBy(memberOne, memberTwo).getResult() == OVERRIDABLE; return OverridingUtil.DEFAULT.isOverridableBy(memberOne, memberTwo).getResult() == OVERRIDABLE;
} }
@NotNull @NotNull
@@ -34,7 +34,7 @@ public class OverloadUtil {
return OverloadCompatibilityInfo.success(); return OverloadCompatibilityInfo.success();
} }
OverridingUtil.OverrideCompatibilityInfo overrideCompatibilityInfo = OverridingUtil.isOverridableByImpl(a, b, false); OverridingUtil.OverrideCompatibilityInfo overrideCompatibilityInfo = OverridingUtil.DEFAULT.isOverridableByImpl(a, b, false);
switch (overrideCompatibilityInfo.getResult()) { switch (overrideCompatibilityInfo.getResult()) {
case OVERRIDABLE: case OVERRIDABLE:
case CONFLICT: case CONFLICT:
@@ -277,8 +277,8 @@ public class OverrideResolver {
for (D otherD : candidates) { for (D otherD : candidates) {
CallableDescriptor other = transform.fun(otherD); CallableDescriptor other = transform.fun(otherD);
if (me.getOriginal() == other.getOriginal() if (me.getOriginal() == other.getOriginal()
&& OverridingUtil.isOverridableBy(other, me).getResult() == OverridingUtil.OverrideCompatibilityInfo.Result.OVERRIDABLE && OverridingUtil.DEFAULT.isOverridableBy(other, me).getResult() == OVERRIDABLE
&& OverridingUtil.isOverridableBy(me, other).getResult() == OverridingUtil.OverrideCompatibilityInfo.Result.OVERRIDABLE) { && OverridingUtil.DEFAULT.isOverridableBy(me, other).getResult() == OVERRIDABLE) {
continue outerLoop; continue outerLoop;
} }
} }
@@ -838,7 +838,7 @@ public class OverrideResolver {
//noinspection unchecked //noinspection unchecked
all.addAll((Collection) supertype.getMemberScope().getProperties(declared.getName())); all.addAll((Collection) supertype.getMemberScope().getProperties(declared.getName()));
for (CallableMemberDescriptor fromSuper : all) { for (CallableMemberDescriptor fromSuper : all) {
if (OverridingUtil.isOverridableBy(fromSuper, declared).getResult() == OVERRIDABLE) { if (OverridingUtil.DEFAULT.isOverridableBy(fromSuper, declared).getResult() == OVERRIDABLE) {
if (Visibilities.isVisible(fromSuper, declared)) { if (Visibilities.isVisible(fromSuper, declared)) {
throw new IllegalStateException("Descriptor " + fromSuper + " is overridable by " + declared + throw new IllegalStateException("Descriptor " + fromSuper + " is overridable by " + declared +
" and visible but does not appear in its getOverriddenDescriptors()"); " and visible but does not appear in its getOverriddenDescriptors()");
@@ -163,7 +163,7 @@ public class JetOverridingTest extends JetLiteFixture {
private void assertOverridabilityRelation(String superFun, String subFun, boolean expectedIsError) { private void assertOverridabilityRelation(String superFun, String subFun, boolean expectedIsError) {
FunctionDescriptor a = makeFunction(superFun); FunctionDescriptor a = makeFunction(superFun);
FunctionDescriptor b = makeFunction(subFun); FunctionDescriptor b = makeFunction(subFun);
OverridingUtil.OverrideCompatibilityInfo overridableWith = OverridingUtil.isOverridableBy(a, b); OverridingUtil.OverrideCompatibilityInfo overridableWith = OverridingUtil.DEFAULT.isOverridableBy(a, b);
assertEquals(overridableWith.getMessage(), expectedIsError, overridableWith.getResult() != OverridingUtil.OverrideCompatibilityInfo.Result.OVERRIDABLE); assertEquals(overridableWith.getMessage(), expectedIsError, overridableWith.getResult() != OverridingUtil.OverrideCompatibilityInfo.Result.OVERRIDABLE);
} }
@@ -45,11 +45,13 @@ public class OverridingUtil {
ExternalOverridabilityCondition.class.getClassLoader()).iterator() ExternalOverridabilityCondition.class.getClassLoader()).iterator()
); );
public static final OverridingUtil DEFAULT = new OverridingUtil();
private OverridingUtil() { private OverridingUtil() {
} }
@NotNull @NotNull
public static OverrideCompatibilityInfo isOverridableBy(@NotNull CallableDescriptor superDescriptor, @NotNull CallableDescriptor subDescriptor) { public OverrideCompatibilityInfo isOverridableBy(@NotNull CallableDescriptor superDescriptor, @NotNull CallableDescriptor subDescriptor) {
if (superDescriptor instanceof FunctionDescriptor) { if (superDescriptor instanceof FunctionDescriptor) {
if (!(subDescriptor instanceof FunctionDescriptor)) return OverrideCompatibilityInfo.memberKindMismatch(); if (!(subDescriptor instanceof FunctionDescriptor)) return OverrideCompatibilityInfo.memberKindMismatch();
} }
@@ -71,7 +73,7 @@ public class OverridingUtil {
/** /**
* @param forOverride true for override, false for overload * @param forOverride true for override, false for overload
*/ */
static OverrideCompatibilityInfo isOverridableByImpl(@NotNull CallableDescriptor superDescriptor, @NotNull CallableDescriptor subDescriptor, boolean forOverride) { OverrideCompatibilityInfo isOverridableByImpl(@NotNull CallableDescriptor superDescriptor, @NotNull CallableDescriptor subDescriptor, boolean forOverride) {
// TODO : Visibility // TODO : Visibility
@@ -229,7 +231,7 @@ public class OverridingUtil {
) { ) {
Collection<CallableMemberDescriptor> bound = Lists.newArrayList(); Collection<CallableMemberDescriptor> bound = Lists.newArrayList();
for (CallableMemberDescriptor fromSupertype : descriptorsFromSuper) { for (CallableMemberDescriptor fromSupertype : descriptorsFromSuper) {
OverrideCompatibilityInfo.Result result = isOverridableBy(fromSupertype, fromCurrent).getResult(); OverrideCompatibilityInfo.Result result = DEFAULT.isOverridableBy(fromSupertype, fromCurrent).getResult();
boolean isVisible = Visibilities.isVisible(fromSupertype, current); boolean isVisible = Visibilities.isVisible(fromSupertype, current);
switch (result) { switch (result) {
@@ -361,8 +363,8 @@ public class OverridingUtil {
continue; continue;
} }
OverrideCompatibilityInfo.Result result1 = isOverridableBy(candidate, overrider).getResult(); OverrideCompatibilityInfo.Result result1 = DEFAULT.isOverridableBy(candidate, overrider).getResult();
OverrideCompatibilityInfo.Result result2 = isOverridableBy(overrider, candidate).getResult(); OverrideCompatibilityInfo.Result result2 = DEFAULT.isOverridableBy(overrider, candidate).getResult();
if (result1 == OVERRIDABLE && result2 == OVERRIDABLE) { if (result1 == OVERRIDABLE && result2 == OVERRIDABLE) {
overridable.add(candidate); overridable.add(candidate);
iterator.remove(); iterator.remove();
@@ -77,8 +77,8 @@ public class OverrideMethodsHandler extends OverrideImplementMethodsHandler {
for (CallableMemberDescriptor another : filteredMembers) { for (CallableMemberDescriptor another : filteredMembers) {
// if (one == another) continue; // if (one == another) continue;
factoredMembers.put(one, one); factoredMembers.put(one, one);
if (OverridingUtil.isOverridableBy(one, another).getResult() == OVERRIDABLE if (OverridingUtil.DEFAULT.isOverridableBy(one, another).getResult() == OVERRIDABLE
|| OverridingUtil.isOverridableBy(another, one).getResult() == OVERRIDABLE) { || OverridingUtil.DEFAULT.isOverridableBy(another, one).getResult() == OVERRIDABLE) {
factoredMembers.put(one, another); factoredMembers.put(one, another);
} }
} }