TypeConstraint.ceylon
import ceylon.ast.core {
CaseTypes,
SatisfiedTypes,
TypeConstraint
}
import com.redhat.ceylon.compiler.typechecker.tree {
Tree {
JTypeConstraint=TypeConstraint
}
}
"Converts a RedHat AST [[TypeConstraint|JTypeConstraint]] to a `ceylon.ast` [[TypeConstraint]]."
shared TypeConstraint typeConstraintToCeylon(JTypeConstraint typeConstraint) {
"Type parameters with possible instantiation not supported"
assert (!typeConstraint.parameterList exists);
"Lower bound type constraint not supported"
assert (!typeConstraint.abstractedType exists);
CaseTypes? caseTypes;
if (exists jCaseTypes = typeConstraint.caseTypes) {
caseTypes = caseTypesToCeylon(jCaseTypes);
} else {
caseTypes = null;
}
SatisfiedTypes? satisfiedTypes;
if (exists jSatisfiedTypes = typeConstraint.satisfiedTypes) {
satisfiedTypes = satisfiedTypesToCeylon(jSatisfiedTypes);
} else {
satisfiedTypes = null;
}
return TypeConstraint {
parameterName = uIdentifierToCeylon(typeConstraint.identifier);
caseTypes = caseTypes;
satisfiedTypes = satisfiedTypes;
};
}
"Compiles the given [[code]] for a Type Constraint
into a [[TypeConstraint]] using the Ceylon compiler
(more specifically, the rule for a `typeConstraint`)."
shared TypeConstraint? compileTypeConstraint(String code) {
if (exists jTypeConstraint = createParser(code).typeConstraint(),
!jTypeConstraint.parameterList exists,
!jTypeConstraint.abstractedType exists) {
return typeConstraintToCeylon(jTypeConstraint);
} else {
return null;
}
}