Introduce TypeCapabilities concept
It encapsulates special features of type like custom substitution.
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user