public void Empty_String_Returns_Empty_List()
        {
            var lexer = new PhpLexer("");

            LexerAssert.IsEmpty(lexer);
            Assert.IsNullOrEmpty(lexer.Text);
        }
        static void Main(string[] args)
        {
            try
            {
                var excerpt           = @"<?php

$heredocString = <<<TXT
HEREDOC TEXT
TXT;

$heredocString = <<<TXT
HEREDOC TEXT
TXT
;

";
                var inputStream       = new AntlrInputStream(excerpt);
                var lexer             = new PhpLexer(inputStream);
                var commonTokenStream = new CommonTokenStream(lexer);

                var parser = new PhpParser(commonTokenStream);
                parser.htmlDocument();

                var writer = new TokenStreamRewriter(commonTokenStream);

                var text = writer.GetText();
                Console.WriteLine(text);
            }
            catch (Exception Ex)
            {
                Console.Error.WriteLine(Ex.Message);
            }
        }
        public void Default_Constructor_Returns_Empty_List()
        {
            var lexer = new PhpLexer();

            LexerAssert.IsEmpty(lexer);
            Assert.IsNullOrEmpty(lexer.Text);
        }
예제 #4
0
        protected override void ReParseImpl()
        {
            var outputWindow = OutputWindowService.TryGetPane(PredefinedOutputWindowPanes.TvlIntellisense);

            Stopwatch stopwatch = Stopwatch.StartNew();

            string        filename     = "<Unknown File>";
            ITextDocument textDocument = TextDocument;

            if (textDocument != null)
            {
                filename = textDocument.FilePath;
            }

            var snapshot = TextBuffer.CurrentSnapshot;
            var input    = new SnapshotCharStream(snapshot, new Span(0, snapshot.Length));
            var lexer    = new PhpLexer(input);

            lexer.TokenFactory = new SnapshotTokenFactory(snapshot, lexer);
            var tokens = new CommonTokenStream(lexer);
            var parser = new PhpParser(tokens);

            parser.BuildParseTree = true;

            List <ParseErrorEventArgs> errors = new List <ParseErrorEventArgs>();

            parser.AddErrorListener(new ErrorListener(filename, errors, outputWindow));
            var result = parser.compileUnit();

            NavigationTreesListener listener = new NavigationTreesListener();

            ParseTreeWalker.Default.Walk(listener, result);

            OnParseComplete(new PhpEditorNavigationParseResultEventArgs(snapshot, errors, stopwatch.Elapsed, tokens.GetTokens(), result, listener.NavigationTrees));
        }
예제 #5
0
        public void Set(ref string PHP)
        {
            var lexer  = new PhpLexer(PHP);
            var tokens = lexer.GetTokens().ToArray();
            var unk    = tokens.Where(x => x.TokenType == PhpTokenType.Unknown);

#if DEBUG
            if (unk.Any())
            {
                throw new InvalidOperationException();
            }
#endif

            var funcTokens = StartDelimiter == '(' ?
                             PhpParser.GetGlobalFunctionCallIds(tokens) :
                             PhpParser.GetArrayAccesses(tokens);

            for (int i = funcTokens.Length - 1; i >= 0; i--)
            {
                if (funcTokens[i].Lexeme != FunctionName)
                {
                    continue;
                }

                if (StartDelimiter == '(')
                {
                    PHP = PHP.Remove(funcTokens[i].Index, funcTokens[i].Lexeme.Length);
                    PHP = PHP.Insert(funcTokens[i].Index, ReplacementName);
                }
                else
                {
                    var      tokenIndex = Array.IndexOf(tokens, tokens.Single(x => x.Index == funcTokens[i].Index));
                    PhpToken leftBracket = new PhpToken(), rightBracket = new PhpToken();
                    for (int j = tokenIndex + 1; j < tokens.Length; j++)
                    {
                        if (tokens[j].TokenType == PhpTokenType.LeftBracket)
                        {
                            leftBracket = tokens[j];
                        }
                        else if (tokens[j].TokenType == PhpTokenType.RightBracket)
                        {
                            rightBracket = tokens[j];
                            break;
                        }
                    }
                    if (leftBracket.TokenType != PhpTokenType.LeftBracket)
                    {
                        continue;
                    }

                    PHP = PHP.Insert(rightBracket.Index, ")");
                    PHP = PHP.Insert(leftBracket.Index + 1, ReplacementName + "(");
                }
            }
        }
        public void LessThan_QuestionMark_phz_Returns_OpenTag_And_Unknown_Tokens()
        {
            var lexer  = new PhpLexer("<?phz");
            var tokens = lexer.GetTokens();

            CollectionAssert.AreEqual(new List <PhpToken>
            {
                new PhpToken(PhpTokenType.OpenTag, "<?", 0),
                new PhpToken(PhpTokenType.Unknown, "phz", 2)
            }, tokens);
        }
예제 #7
0
        public void Two_Slashes_No_Close_Tag_Returns_Comment_Token()
        {
            var lexer  = new PhpLexer("<?//");
            var tokens = lexer.GetTokens();

            CollectionAssert.AreEqual(new List <PhpToken>
            {
                new PhpToken(PhpTokenType.OpenTag, "<?", 0),
                new PhpToken(PhpTokenType.Comment, "//", 2)
            }, tokens);
        }
예제 #8
0
        public void Two_Slashes_Newline_Returns_Comment_Token()
        {
            var lexer  = new PhpLexer("<?//\nfunct");
            var tokens = lexer.GetTokens();

            CollectionAssert.AreEqual(new List <PhpToken>
            {
                new PhpToken(PhpTokenType.OpenTag, "<?", 0),
                new PhpToken(PhpTokenType.Comment, "//", 2),
                new PhpToken(PhpTokenType.WhiteSpace, "\n", 4),
                new PhpToken(PhpTokenType.Unknown, "funct", 5)
            }, tokens);
        }
        public void Simple_Open_Tag_And_Echo_Returns_OpenTag_And_Echo_Tokens()
        {
            var lexer  = new PhpLexer("<?echo(\"test\")");
            var tokens = lexer.GetTokens();

            CollectionAssert.AreEqual(new List <PhpToken>
            {
                new PhpToken(PhpTokenType.OpenTag, "<?", 0),
                new PhpToken(PhpTokenType.Identifier, "echo", 2),
                new PhpToken(PhpTokenType.LeftParenthesis, "(", 6),
                new PhpToken(PhpTokenType.String, "\"test\"", 7),
                new PhpToken(PhpTokenType.RightParenthesis, ")", 13)
            }, tokens);
        }
        public static void IsValid(TokenPairs pairs)
        {
            var text     = string.Join("", pairs.Select(pair => pair.Value).ToArray());
            var lexer    = new PhpLexer(text);
            int index    = 0;
            var expected = pairs.Select(pair =>
            {
                var token = new PhpToken(pair.Key, pair.Value, index);
                index    += pair.Value.Length;
                return(token);
            });
            List <PhpToken> actual = lexer.GetTokens();

            CollectionAssert.AreEqual(expected, actual);
        }
예제 #11
0
        public void One_Line_Html_Php_Mixed_With_Comment_Returns_Tokens()
        {
            var lexer  = new PhpLexer("<h1>This is an <?php # echo 'simple';?> example</h1>");
            var tokens = lexer.GetTokens();

            CollectionAssert.AreEqual(new List <PhpToken>
            {
                new PhpToken(PhpTokenType.Html, "<h1>This is an ", 0),
                new PhpToken(PhpTokenType.OpenTag, "<?php", 15),
                new PhpToken(PhpTokenType.WhiteSpace, " ", 20),
                new PhpToken(PhpTokenType.Comment, "# echo 'simple';", 21),
                new PhpToken(PhpTokenType.CloseTag, "?>", 37),
                new PhpToken(PhpTokenType.Html, " example</h1>", 39)
            }, tokens);
        }
예제 #12
0
 public static void IsEmpty(PhpLexer lexer)
 {
     CollectionAssert.AreEqual(new List <PhpToken>(), lexer.GetTokens());
 }
예제 #13
0
        private static PhpToken[] GetTokens(string text)
        {
            var lexer = new PhpLexer(text);

            return(lexer.GetTokens().ToArray());
        }