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)));
     }
 }