static void EvaluateDeclaration(ParseNode node, Dictionary<string, TypeData> variableTypes) { var states = node.Parent.States; var typeIndex = states.MappedNodes.IndexOf(node); if (typeIndex != 0) return; var variableNameIndex = states.GeNextTokenKind(TokenKind.Identifier); if (variableNameIndex == 0) return; var variableNode = states[variableNameIndex]; var variableContent = variableNode.Content; var typeData = new TypeData(); for (var index = typeIndex; index < variableNameIndex; index++) { var mappedNode = states[index]; TypeData.ValidateToken(mappedNode); typeData.AddTypeNode(mappedNode); } variableTypes[variableContent] = typeData; do { var assignIndex = states.GeNextTokenKind(TokenKind.Assign, variableNameIndex); var commaIndex = states.GeNextTokenKind(TokenKind.Comma, variableNameIndex); var semiColonIndex = states.GeNextTokenKind(TokenKind.Comma, variableNameIndex); var separatorIndex = Math.Max(commaIndex, semiColonIndex); variableNameIndex = states.GeNextTokenKind(TokenKind.Identifier, variableNameIndex + 1); if (assignIndex < variableNameIndex) continue; if (variableNameIndex == 0) return; variableNode = states[variableNameIndex]; variableContent = variableNode.Content; variableTypes[variableContent] = typeData; } while (true); }
static void ExtractParameterData(ParseNode parent, Dictionary<string, TypeData> variableTypes) { var states = parent.States; var openParam = 1; if (states.Count == 2) return; if (states.Count == 3) { states.RemoveAt(1); return; } var pos = openParam; do { var typeData = new TypeData(); var i = pos; for (; states[i].Token != TokenKind.Identifier; i++) { typeData.AddTypeNode(states[i]); } variableTypes[states[i].Content] = typeData; pos = states.GeNextTokenKind(TokenKind.Comma, pos); if (pos == 0) return; pos++; } while (true); }
static void AddNodeType(TypeData typeData, string content) { typeData.AddTypeNode(TokenKind.TypeName.BuildTokenFromId(content)); }