/** * A valid expression is either: * - NAME for a type variable * - STRING for a type name * - CALL for the other expressions */ private boolean isValidExpression(Node e) { return isTypeVar(e) || isTypeName(e) || isOperation(e); }
/** * A valid expression is either: * - NAME for a type variable * - STRING for a type name * - CALL for the other expressions */ private boolean isValidExpression(Node e) { return isTypeVar(e) || isTypeName(e) || isOperation(e); }
/** * Checks the structure of the AST of a type transformation expression * in @template T := TTLExp =: */ private boolean validTypeTransformationExpression(Node expr) { if (!isValidExpression(expr)) { warnInvalidExpression("type transformation", expr); return false; } if (isTypeVar(expr) || isTypeName(expr)) { return true; } // Check for valid keyword String name = getCallName(expr); if (!isValidKeyword(name)) { warnInvalidExpression("type transformation", expr); return false; } Keywords keyword = nameToKeyword(name); // Check the rest of the expression depending on the kind switch (keyword.kind) { case TYPE_CONSTRUCTOR: return validTypeExpression(expr); case OPERATION: return validOperationExpression(expr); default: throw new IllegalStateException("Invalid type transformation expression"); } } }
/** * Checks the structure of the AST of a type transformation expression * in @template T := TTLExp =: */ private boolean validTypeTransformationExpression(Node expr) { if (!isValidExpression(expr)) { warnInvalidExpression("type transformation", expr); return false; } if (isTypeVar(expr) || isTypeName(expr)) { return true; } // Check for valid keyword String name = getCallName(expr); if (!isValidKeyword(name)) { warnInvalidExpression("type transformation", expr); return false; } Keywords keyword = nameToKeyword(name); // Check the rest of the expression depending on the kind switch (keyword.kind) { case TYPE_CONSTRUCTOR: return validTypeExpression(expr); case OPERATION: return validOperationExpression(expr); default: throw new IllegalStateException("Invalid type transformation expression"); } } }
/** * A template type expression must be of the form type(typename, TTLExp,...) * or type(typevar, TTLExp...) */ private boolean validTemplateTypeExpression(Node expr) { // The expression must have at least three children the type keyword, // a type name (or type variable) and a type expression if (!checkParameterCount(expr, Keywords.TYPE)) { return false; } int paramCount = getCallParamCount(expr); // The first parameter must be a type variable or a type name Node firstParam = getCallArgument(expr, 0); if (!isTypeVar(firstParam) && !isTypeName(firstParam)) { warnInvalid("type name or type variable", expr); warnInvalidInside("template type operation", expr); return false; } // The rest of the parameters must be valid type expressions for (int i = 1; i < paramCount; i++) { if (!validTypeTransformationExpression(getCallArgument(expr, i))) { warnInvalidInside("template type operation", expr); return false; } } return true; }
/** * A template type expression must be of the form type(typename, TTLExp,...) * or type(typevar, TTLExp...) */ private boolean validTemplateTypeExpression(Node expr) { // The expression must have at least three children the type keyword, // a type name (or type variable) and a type expression if (!checkParameterCount(expr, Keywords.TYPE)) { return false; } int paramCount = getCallParamCount(expr); // The first parameter must be a type variable or a type name Node firstParam = getCallArgument(expr, 0); if (!isTypeVar(firstParam) && !isTypeName(firstParam)) { warnInvalid("type name or type variable", expr); warnInvalidInside("template type operation", expr); return false; } // The rest of the parameters must be valid type expressions for (int i = 1; i < paramCount; i++) { if (!validTypeTransformationExpression(getCallArgument(expr, i))) { warnInvalidInside("template type operation", expr); return false; } } return true; }