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
@Override
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
@@ -73,6 +73,12 @@ public abstract class DelegatingType implements JetType {
return getDelegate().getCapability(capabilityClass);
}
@NotNull
@Override
public TypeCapabilities getCapabilities() {
return getDelegate().getCapabilities();
}
@Override
public int hashCode() {
return getDelegate().hashCode();
@@ -539,6 +539,12 @@ public class ErrorUtils {
return null;
}
@NotNull
@Override
public TypeCapabilities getCapabilities() {
return TypeCapabilities.NONE.INSTANCE$;
}
@Override
public String toString() {
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?")
@Nullable
<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 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 enum class Relation {
@@ -99,6 +99,12 @@ public class TypeUtils {
return null;
}
@NotNull
@Override
public TypeCapabilities getCapabilities() {
return TypeCapabilities.NONE.INSTANCE$;
}
@Override
public String toString() {
return name;
@@ -798,6 +804,18 @@ public class TypeUtils {
public TypeSubstitution 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 {