private static DeclerationNode ParseClassDecleration(RuleContext classPart, ProtectionLevel protectionLevel, Interval interval) { //The second last child. And one for the zero-indexing. int genericParametersIndex = classPart.ChildCount - 2 - 1; ITerminalNode tn1 = (ITerminalNode)classPart.GetChild(0); ITerminalNode tn2 = (ITerminalNode)classPart.GetChild(1); CrawlParser.InheritancesContext baseTypes = classPart.GetChild(2) as CrawlParser.InheritancesContext; IEnumerable <IdentifierNode> inheritances = baseTypes == null ? new List <IdentifierNode>() : ParseInheritances(baseTypes); CrawlParser.Generic_parametersContext genericParametersContext = classPart.GetChild(genericParametersIndex) as CrawlParser.Generic_parametersContext; RuleContext body = (RuleContext)classPart.LastChild(); List <GenericParameterNode> genericParameters = new List <GenericParameterNode>(); if (genericParametersContext != null) { genericParameters.AddRange(ParseGenericParameters(genericParametersContext)); } if (tn1.Symbol.Type != CrawlLexer.CLASS) { throw new CrawlImpossibleStateException("Trying to parse a class that is not a class", interval); } BlockNode bodyBlock = ParseBlockNode(body); return(CrawlSyntaxNode.ClassTypeDecleration(interval, protectionLevel, null, ParseIdentifier(tn2), inheritances, genericParameters, bodyBlock)); }
private static IEnumerable <IdentifierNode> ParseInheritances(CrawlParser.InheritancesContext inheritances) { for (int i = 1; i < inheritances.ChildCount; i += 2) { yield return(ParseIdentifier((ITerminalNode)inheritances.GetChild(i))); } }