/** * An operation expression is a cond or a mapunion */ private boolean validOperationExpression(Node expr) { String name = getCallName(expr); Keywords keyword = nameToKeyword(name); switch (keyword) { case COND: return validConditionalExpression(expr); case MAPUNION: return validMapunionExpression(expr); case MAPRECORD: return validMaprecordExpression(expr); case TYPEOFVAR: return validTypeOfVarExpression(expr); case INSTANCEOF: return validInstanceOfExpression(expr); case PRINTTYPE: return validPrintTypeExpression(expr); case PROPTYPE: return validPropTypeExpression(expr); default: throw new IllegalStateException("Invalid type transformation operation"); } }
/** * An operation expression is a cond or a mapunion */ private boolean validOperationExpression(Node expr) { String name = getCallName(expr); Keywords keyword = nameToKeyword(name); switch (keyword) { case COND: return validConditionalExpression(expr); case MAPUNION: return validMapunionExpression(expr); case MAPRECORD: return validMaprecordExpression(expr); case TYPEOFVAR: return validTypeOfVarExpression(expr); case INSTANCEOF: return validInstanceOfExpression(expr); case PRINTTYPE: return validPrintTypeExpression(expr); case PROPTYPE: return validPropTypeExpression(expr); default: throw new IllegalStateException("Invalid type transformation operation"); } }
return false; if (!isValidPredicate(getCallName(expr))) { warnInvalid("boolean predicate", expr); return false; Keywords keyword = nameToKeyword(getCallName(expr)); if (!checkParameterCount(expr, keyword)) { return false;
return false; if (!isValidPredicate(getCallName(expr))) { warnInvalid("boolean predicate", expr); return false; Keywords keyword = nameToKeyword(getCallName(expr)); if (!checkParameterCount(expr, keyword)) { return false;
/** * 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 TTL type expression must be a union type, a template type, a record type * or any of the type predicates (none, rawTypeOf, templateTypeOf). */ private boolean validTypeExpression(Node expr) { String name = getCallName(expr); Keywords keyword = nameToKeyword(name); switch (keyword) { case TYPE: return validTemplateTypeExpression(expr); case UNION: return validUnionTypeExpression(expr); case NONE: return validNoneTypeExpression(expr); case ALL: return validAllTypeExpression(expr); case UNKNOWN: return validUnknownTypeExpression(expr); case RAWTYPEOF: return validRawTypeOfTypeExpression(expr); case TEMPLATETYPEOF: return validTemplateTypeOfExpression(expr); case RECORD: return validRecordTypeExpression(expr); case TYPEEXPR: return validNativeTypeExpr(expr); default: throw new IllegalStateException("Invalid type expression"); } }
/** * A TTL type expression must be a union type, a template type, a record type * or any of the type predicates (none, rawTypeOf, templateTypeOf). */ private boolean validTypeExpression(Node expr) { String name = getCallName(expr); Keywords keyword = nameToKeyword(name); switch (keyword) { case TYPE: return validTemplateTypeExpression(expr); case UNION: return validUnionTypeExpression(expr); case NONE: return validNoneTypeExpression(expr); case ALL: return validAllTypeExpression(expr); case UNKNOWN: return validUnknownTypeExpression(expr); case RAWTYPEOF: return validRawTypeOfTypeExpression(expr); case TEMPLATETYPEOF: return validTemplateTypeOfExpression(expr); case RECORD: return validRecordTypeExpression(expr); case TYPEEXPR: return validNativeTypeExpr(expr); default: throw new IllegalStateException("Invalid type expression"); } }