private static IEnumerable<Error> ResolveRefType(RefType type, Node var) { var errors = new List<Error>(); var actual = var.GetNearestParent<Program>().GetSubChildren<Record>().Where(x => x.Name.Text == type.Name.Text).ToList(); if (actual.Count == 0) errors.Add(new Error(var.GetSourceIdentifier(), type.Name, string.Format(ErrorMessages.TypeNotFound, type.Name.Text))); if (actual.Count == 1) return errors; if (actual.Count > 1) errors.Add(new Error(var.GetSourceIdentifier(), type.Name, string.Format(ErrorMessages.MultipleTypeMatch, string.Join(";", actual)))); return errors; }
private static IEnumerable<Error> ResolveIdType(Node root, IToken token, out Node newRoot, out IType type) { var errors = new List<Error>(); newRoot = null; type = null; if ((!root.GetSubChildren<Variable>().Select(x => x.Name.Text).Contains(token.Text)) && (root.Name.Text != token.Text)) errors.Add(new Error(root.GetSourceIdentifier(), token, string.Format(ErrorMessages.VariableNotFound, token.Text))); else { if ((root.Name.Text == token.Text) && (root is Function)) { type = ((Function) root).ReturnType; return errors; } var var = new Variable(); try { var = root.GetSpecifiedChildren<Variable>().First(x => x.Name.Text == token.Text); } catch { errors.Add(new Error(root.GetSourceIdentifier(), token, string.Format(ErrorMessages.VariableNotFound, token.Text))); return errors; } type = var.Type; if (var.Type.GetTypeInfo() == TypeInfo.Ref) { newRoot = root.GetNearestParent<Program>() .GetSpecifiedChildren<Record>().First(x => x.Name.Text == var.Type.ToString()); } } return errors; }
public static List<Error> ResloveExpression(Node root, Expression expr, out IType type) { var errors = new List<Error>(); var list = ExpressionBuilder.Build(expr); foreach (var exprNode in list.Where(exprNode => exprNode.ExprType == ExprType.Var)) { errors.AddRange(IdentifierResolver.ResloveIdentifierType(root, exprNode.Tokens, out type)); exprNode.Type = type; } type = list.First().Type; foreach (var node in list) { if ((node.Type != null) && (node.Type.ToString() != type.ToString())) { errors.Add(new Error(root.GetSourceIdentifier(), node.Tokens.First(), string.Format(ErrorMessages.TypeMismatch, node.Type.ToString(), type.ToString()))); } } return errors; }