Exemplo n.º 1
0
        public void CheckCommentFunctionInClass(ParserRuleContext context, out ErrorInformation error)
        {
            error = null;
            var classMemberContext = (Class_member_declarationContext)context;

            if (IsMethod(classMemberContext.common_member_declaration()) &&
                tokenStream.GetHiddenTokensToLeft(context.Start.TokenIndex, CSharpLexer.COMMENTS_CHANNEL) == null)
            {
                var functionContext = GetFunctionIdentifierContext(classMemberContext.common_member_declaration());
                error = CreateError(functionContext);
            }
        }
Exemplo n.º 2
0
        private List <String> ExtractDocumentation(ParserRuleContext context)
        {
            IList <IToken> tokens = _tokens.GetHiddenTokensToLeft(context.Start.TokenIndex);

            if (tokens == null)
            {
                return(null);
            }

            List <String> comments = null;

            foreach (IToken token in tokens)
            {
                if (token.Text.StartsWith("///"))
                {
                    if (comments == null)
                    {
                        comments = new List <String>();
                    }
                    comments.Add(token.Text.Substring(3).Trim());
                }
            }

            return(comments);
        }
Exemplo n.º 3
0
 public static void Reconstruct(IParseTree tree, CommonTokenStream stream)
 {
     if (tree as TerminalNodeImpl != null)
     {
         TerminalNodeImpl tok      = tree as TerminalNodeImpl;
         Interval         interval = tok.SourceInterval;
         var inter = stream.GetHiddenTokensToLeft(tok.Symbol.TokenIndex);
         if (inter != null)
         {
             foreach (var t in inter)
             {
                 System.Console.Write(t.Text);
             }
         }
         var s = stream.GetText(interval);
         System.Console.Write(s);
     }
     else
     {
         for (int i = 0; i < tree.ChildCount; ++i)
         {
             var c = tree.GetChild(i);
             Reconstruct(c, stream);
         }
     }
 }
Exemplo n.º 4
0
 private static void ParenthesizedAST(IParseTree tree, StringBuilder sb, Lexer lexer, Parser parser, CommonTokenStream stream, int level = 0)
 {
     // Antlr always names a non-terminal with first letter lowercase,
     // but renames it when creating the type in C#. So, remove the prefix,
     // lowercase the first letter, and remove the trailing "Context" part of
     // the name. Saves big time on output!
     if (tree as TerminalNodeImpl != null)
     {
         TerminalNodeImpl tok      = tree as TerminalNodeImpl;
         Interval         interval = tok.SourceInterval;
         IList <IToken>   inter    = null;
         if (tok.Symbol.TokenIndex >= 0)
         {
             inter = stream?.GetHiddenTokensToLeft(tok.Symbol.TokenIndex);
         }
         if (inter != null)
         {
             foreach (var t in inter)
             {
                 var ty   = tok.Symbol.Type;
                 var name = lexer.Vocabulary.GetSymbolicName(ty);
                 StartLine(sb, level);
                 sb.AppendLine("( " + name + " text=" + PerformEscapes(t.Text) + " " + lexer.ChannelNames[t.Channel]);
             }
         }
         {
             var ty   = tok.Symbol.Type;
             var name = lexer.Vocabulary.GetSymbolicName(ty);
             StartLine(sb, level);
             sb.AppendLine("( " + name + " i=" + tree.SourceInterval.a
                           + " txt=" + PerformEscapes(tree.GetText())
                           + " tt=" + tok.Symbol.Type
                           + " " + lexer.ChannelNames[tok.Symbol.Channel]);
         }
     }
     else
     {
         var x    = tree as RuleContext;
         var ri   = x.RuleIndex;
         var name = parser.RuleNames[ri];
         StartLine(sb, level);
         sb.Append("( " + name);
         sb.AppendLine();
     }
     for (int i = 0; i < tree.ChildCount; ++i)
     {
         var c = tree.GetChild(i);
         ParenthesizedAST(c, sb, lexer, parser, stream, level + 1);
     }
     if (level == 0)
     {
         for (int k = 0; k < 1 + changed - level; ++k)
         {
             sb.Append(") ");
         }
         sb.AppendLine();
         changed = 0;
     }
 }
Exemplo n.º 5
0
        private static void ParenthesizedAST(this IParseTree tree, StringBuilder sb, CommonTokenStream stream, int level = 0)
        {
            // Antlr always names a non-terminal with first letter lowercase,
            // but renames it when creating the type in C#. So, remove the prefix,
            // lowercase the first letter, and remove the trailing "Context" part of
            // the name. Saves big time on output!
            if (tree as TerminalNodeImpl != null)
            {
                TerminalNodeImpl tok      = tree as TerminalNodeImpl;
                Interval         interval = tok.SourceInterval;
                IList <IToken>   inter    = null;
                if (tok.Symbol.TokenIndex >= 0)
                {
                    inter = stream.GetHiddenTokensToLeft(tok.Symbol.TokenIndex);
                }

                if (inter != null)
                {
                    foreach (IToken t in inter)
                    {
                        StartLine(sb, tree, stream, level);
                        sb.AppendLine("( " + ((Lexer)stream.TokenSource).ChannelNames[t.Channel] + " text=" + t.Text.PerformEscapes());
                    }
                }

                StartLine(sb, tree, stream, level);
                sb.AppendLine("( " + ((Lexer)stream.TokenSource).ChannelNames[tok.Symbol.Channel] + " i=" + tree.SourceInterval.a
                              + " txt=" + tree.GetText().PerformEscapes()
                              + " tt=" + tok.Symbol.Type);
            }
            else
            {
                string fixed_name = tree.GetType().ToString()
                                    .Replace("Antlr4.Runtime.Tree.", "");
                fixed_name = Regex.Replace(fixed_name, "^.*[+]", "");
                fixed_name = fixed_name.Substring(0, fixed_name.Length - "Context".Length);
                fixed_name = fixed_name[0].ToString().ToLower()
                             + fixed_name.Substring(1);
                StartLine(sb, tree, stream, level);
                sb.Append("( " + fixed_name);
                sb.AppendLine();
            }
            for (int i = 0; i < tree.ChildCount; ++i)
            {
                IParseTree c = tree.GetChild(i);
                c.ParenthesizedAST(sb, stream, level + 1);
            }
            if (level == 0)
            {
                for (int k = 0; k < 1 + changed - level; ++k)
                {
                    sb.Append(") ");
                }

                sb.AppendLine();
                changed = 0;
            }
        }
Exemplo n.º 6
0
 public void ParenthesizedAST(StringBuilder sb, string file_name, IParseTree tree, CommonTokenStream stream, int level = 0)
 {
     // Antlr always names a non-terminal with first letter lowercase,
     // but renames it when creating the type in C#. So, remove the prefix,
     // lowercase the first letter, and remove the trailing "Context" part of
     // the name. Saves big time on output!
     if (tree as TerminalNodeImpl != null)
     {
         TerminalNodeImpl tok      = tree as TerminalNodeImpl;
         Interval         interval = tok.SourceInterval;
         var inter = stream.GetHiddenTokensToLeft(tok.Symbol.TokenIndex);
         if (inter != null)
         {
             foreach (var t in inter)
             {
                 StartLine(sb, file_name, tree, stream, level);
                 sb.AppendLine("( HIDDEN text=" + t.Text.provide_escapes());
             }
         }
         StartLine(sb, file_name, tree, stream, level);
         sb.AppendLine("( TOKEN i=" + tree.SourceInterval.a
                       + " t=" + tree.GetText().provide_escapes());
     }
     else
     {
         var fixed_name = tree.GetType().ToString()
                          .Replace("Antlr4.Runtime.Tree.", "");
         fixed_name = Regex.Replace(fixed_name, "^.*[+]", "");
         fixed_name = fixed_name.Substring(0, fixed_name.Length - "Context".Length);
         fixed_name = fixed_name[0].ToString().ToLower()
                      + fixed_name.Substring(1);
         StartLine(sb, file_name, tree, stream, level);
         sb.Append("( " + fixed_name);
         if (level == 0)
         {
             sb.Append(" File=\""
                       + file_name
                       + "\"");
         }
         sb.AppendLine();
     }
     for (int i = 0; i < tree.ChildCount; ++i)
     {
         var c = tree.GetChild(i);
         ParenthesizedAST(sb, file_name, c, stream, level + 1);
     }
     if (level == 0)
     {
         for (int k = 0; k < 1 + changed - level; ++k)
         {
             sb.Append(") ");
         }
         sb.AppendLine();
         changed = 0;
     }
 }
Exemplo n.º 7
0
        public static string GetLeftOfToken(int index)
        {
            StringBuilder sb    = new StringBuilder();
            var           inter = tokens.GetHiddenTokensToLeft(index);

            if (inter != null)
            {
                foreach (var t in inter)
                {
                    sb.Append(t.Text);
                }
            }
            return(sb.ToString());
        }
        public override void Walk(IParseTreeListener listener, IParseTree t)
        {
            string docText = null;

            // check for documentation
            var token = t as ITerminalNode;

            if (token != null)
            {
                var docTokens = _tokens.GetHiddenTokensToLeft(token.Symbol.TokenIndex);
                if (docTokens != null)
                {
                    docText = string.Join("\n", docTokens.Select(x => x.Text));
                }
            }

            // update the current line
            var node = t as IRuleNode;

            if (node != null)
            {
                var ctx = (ParserRuleContext)node.RuleContext;
                Line = ctx.Start.Line;
            }

            try
            {
                base.Walk(listener, t);

                // pass documentation if there was any
                var kryptonListener = listener as KryptonParserListener;
                if (kryptonListener != null && docText != null)
                {
                    kryptonListener.EnterDocumentation(docText);
                }
            }
            // Rethrow any parser exceptions thrown while walking (avoids stack trace)
            catch (KryptonParserException e)
            {
                throw e;
            }
        }