Introduce TypeCapabilities concept

It encapsulates special features of type like custom substitution.
This commit is contained in:
Denis Zharkov
2015-08-03 10:52:30 +03:00
parent 4563f4b1f9
commit ac7c5a93b0
6 changed files with 47 additions and 1 deletions
@@ -29,7 +29,13 @@ public abstract class AbstractJetType implements JetType {
@Nullable @Nullable
@Override @Override
public <T extends TypeCapability> T getCapability(@NotNull Class<T> capabilityClass) { public <T extends TypeCapability> T getCapability(@NotNull Class<T> capabilityClass) {
return null; return getCapabilities().getCapability(capabilityClass);
}
@NotNull
@Override
public TypeCapabilities getCapabilities() {
return TypeCapabilities.NONE.INSTANCE$;
} }
@Override @Override
@@ -73,6 +73,12 @@ public abstract class DelegatingType implements JetType {
return getDelegate().getCapability(capabilityClass); return getDelegate().getCapability(capabilityClass);
} }
@NotNull
@Override
public TypeCapabilities getCapabilities() {
return getDelegate().getCapabilities();
}
@Override @Override
public int hashCode() { public int hashCode() {
return getDelegate().hashCode(); return getDelegate().hashCode();
@@ -539,6 +539,12 @@ public class ErrorUtils {
return null; return null;
} }
@NotNull
@Override
public TypeCapabilities getCapabilities() {
return TypeCapabilities.NONE.INSTANCE$;
}
@Override @Override
public String toString() { public String toString() {
return constructor.toString() + (arguments.isEmpty() ? "" : joinToString(arguments, ", ", "<", ">", -1, "...", null)); return constructor.toString() + (arguments.isEmpty() ? "" : joinToString(arguments, ", ", "<", ">", -1, "...", null));
@@ -52,4 +52,7 @@ public interface JetType extends Annotated {
@KotlinSignature("fun <T : TypeCapability> getCapability(capabilityClass: Class<T>): T?") @KotlinSignature("fun <T : TypeCapability> getCapability(capabilityClass: Class<T>): T?")
@Nullable @Nullable
<T extends TypeCapability> T getCapability(@NotNull Class<T> capabilityClass); <T extends TypeCapability> T getCapability(@NotNull Class<T> capabilityClass);
@NotNull
TypeCapabilities getCapabilities();
} }
@@ -20,6 +20,13 @@ import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
public interface TypeCapability public interface TypeCapability
public interface TypeCapabilities {
object NONE : TypeCapabilities {
override fun <T : TypeCapability> getCapability(capabilityClass: Class<T>): T? = null
}
fun <T : TypeCapability> getCapability(capabilityClass: Class<T>): T?
}
public interface Specificity : TypeCapability { public interface Specificity : TypeCapability {
public enum class Relation { public enum class Relation {
@@ -99,6 +99,12 @@ public class TypeUtils {
return null; return null;
} }
@NotNull
@Override
public TypeCapabilities getCapabilities() {
return TypeCapabilities.NONE.INSTANCE$;
}
@Override @Override
public String toString() { public String toString() {
return name; return name;
@@ -798,6 +804,18 @@ public class TypeUtils {
public TypeSubstitution getSubstitution() { public TypeSubstitution getSubstitution() {
return delegate.getSubstitution(); return delegate.getSubstitution();
} }
@Nullable
@Override
public <T extends TypeCapability> T getCapability(@NotNull Class<T> capabilityClass) {
return delegate.getCapability(capabilityClass);
}
@NotNull
@Override
public TypeCapabilities getCapabilities() {
return delegate.getCapabilities();
}
} }
private static class NullableType extends AbstractTypeWithKnownNullability { private static class NullableType extends AbstractTypeWithKnownNullability {