use of org.eclipse.ceylon.model.typechecker.model.Type in project ceylon by eclipse.
the class ExpressionVisitor method checkDelegatedConstructor.
protected void checkDelegatedConstructor(Tree.DelegatedConstructor dc, Constructor c, Node node) {
if (dc == null) {
if (c.isClassMember()) {
Class clazz = (Class) c.getContainer();
Type et = clazz.getExtendedType();
if (et != null && !et.isBasic()) {
TypeDeclaration superclass = et.getDeclaration();
if (superclass != null) {
node.addError("constructor must explicitly delegate to some superclass constructor: '" + clazz.getName() + "' extends '" + superclass.getName() + "'");
}
}
}
}
}
use of org.eclipse.ceylon.model.typechecker.model.Type in project ceylon by eclipse.
the class ExpressionVisitor method checkSpreadArgument.
private void checkSpreadArgument(Reference pr, Parameter p, Tree.PositionalArgument a, Tree.SpreadArgument arg, List<Parameter> params) {
if (pr.getDeclaration().isCoercionPoint() && isCallableVariadic(p)) {
arg.addUnsupportedError("lambda conversions with spread arguments not supported");
}
a.setParameter(p);
Type rat = arg.getTypeModel();
if (!isTypeUnknown(rat) && // iterable in visit(SpreadArgument)
unit.isContainerType(rat)) {
Type at = spreadType(rat, unit, true);
Type ptt = unit.getParameterTypesAsTupleType(params, pr);
if (!isTypeUnknown(at) && !isTypeUnknown(ptt)) {
checkAssignable(at, ptt, arg, "spread argument not assignable to parameter types");
}
}
}
use of org.eclipse.ceylon.model.typechecker.model.Type in project ceylon by eclipse.
the class ExpressionVisitor method visit.
@Override
public void visit(Tree.Expression that) {
// i.e. this is a parenthesized expression
super.visit(that);
Tree.Term term = that.getTerm();
if (term == null) {
that.addError("expression not well formed");
} else {
Type t = term.getTypeModel();
if (t != null) {
that.setTypeModel(t);
}
}
}
use of org.eclipse.ceylon.model.typechecker.model.Type in project ceylon by eclipse.
the class ExpressionVisitor method visit.
@Override
public void visit(Tree.ClassDeclaration that) {
super.visit(that);
Class alias = that.getDeclarationModel();
Type et = alias.getExtendedType();
Tree.ClassSpecifier cs = that.getClassSpecifier();
if (cs != null && et != null) {
TypeDeclaration etd = et.getDeclaration();
if (etd instanceof Constructor) {
etd = etd.getExtendedType().getDeclaration();
}
if (etd instanceof Class) {
// TODO: some of this belongs in InheritanceVisitor!
Class c = (Class) etd;
if (c.isAbstract()) {
if (!alias.isFormal() && !alias.isAbstract()) {
that.addError("alias of abstract class must be annotated abstract", 310);
}
}
if (c.isAbstraction()) {
that.addError("class alias may not alias overloaded class");
} else {
Tree.InvocationExpression ie = cs.getInvocationExpression();
if (ie != null) {
checkClassAliasParameters(alias, that, ie);
}
}
}
}
}
use of org.eclipse.ceylon.model.typechecker.model.Type in project ceylon by eclipse.
the class ExpressionVisitor method checkNamedArgument.
private void checkNamedArgument(Tree.NamedArgument arg, Reference reference, Parameter param) {
arg.setParameter(param);
Type argType = null;
if (arg instanceof Tree.SpecifiedArgument) {
Tree.SpecifiedArgument sa = (Tree.SpecifiedArgument) arg;
Tree.Expression e = sa.getSpecifierExpression().getExpression();
if (e != null) {
argType = e.getTypeModel();
}
} else if (arg instanceof Tree.TypedArgument) {
Tree.TypedArgument typedArg = (Tree.TypedArgument) arg;
TypedDeclaration argDec = typedArg.getDeclarationModel();
argType = argumentType(arg.getScope(), argDec);
checkArgumentToVoidParameter(param, typedArg);
if (!dynamic && isTypeUnknown(argType) && !hasError(arg)) {
arg.addError("could not determine type of named argument: the type of '" + param.getName() + "' is not known");
}
}
FunctionOrValue paramModel = param.getModel();
if (paramModel != null) {
TypedReference paramRef = reference.getTypedParameter(param);
Type paramType = paramType(arg.getScope(), paramRef, paramModel);
if (!isTypeUnknown(argType) && !isTypeUnknown(paramType)) {
Node node;
if (arg instanceof Tree.SpecifiedArgument) {
Tree.SpecifiedArgument specifiedArg = (Tree.SpecifiedArgument) arg;
node = specifiedArg.getSpecifierExpression();
} else {
node = arg;
}
checkAssignable(argType, paramType, node, "named argument must be assignable to parameter " + argdesc(param, reference), 2100);
}
}
}
Aggregations