public static PhpToken[] GetBlock(PhpToken[] tokens, int index) { var start = index; if (tokens[index].TokenType != PhpTokenType.LeftBrace) { throw new InvalidOperationException("Block must begin with a left brace."); } int depth = 1; while (depth != 0) { var t = tokens[++index]; if (t.TokenType == PhpTokenType.LeftBrace) { depth++; } else if (t.TokenType == PhpTokenType.RightBrace) { depth--; } } var tokenCount = index - start + 1; var blockTokens = new PhpToken[tokenCount]; Array.Copy(tokens, start, blockTokens, 0, tokenCount); return(blockTokens); }
protected string GetSurroundingCode(string code, PhpToken token) { var line = code.GetLineNumber(token.Index); var code2 = code.InsertLineNumbers(); var index = code2.GetLineIndex(line); return(code2.GetSurroundingLines(index, 9, 9)); }
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 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); }
protected override void AnalyzeCore(PhpToken token) { if (token.TokenType == PhpTokenType.WhiteSpace || token.TokenType == PhpTokenType.Comment) { return; } else if (State == 0 && token.TokenType == PhpTokenType.Variable && PhpName.Superglobals.Contains(token.Lexeme)) { AddExpressionToken(); } else if (State == 1 && token.TokenType == PhpTokenType.LeftBracket) { State++; } else if (State == 2 && token.TokenType == PhpTokenType.String) { AddExpressionToken(); } else if (State == 3 && token.TokenType == PhpTokenType.RightBracket) { State++; } else if (State == 4 && _operators.Contains(token.TokenType)) { AddExpressionToken(); } else if (State == 5 && token.TokenType == PhpTokenType.String) { AddExpressionToken(); AddExpression(); } else { NewExpression(); } }
protected override void AnalyzeCore(PhpToken token) { if (token.TokenType == PhpTokenType.WhiteSpace || token.TokenType == PhpTokenType.Comment) { return; } else if (State == 0 && token.TokenType == PhpTokenType.switchKeyword) { State++; } else if (State == 1 && token.TokenType == PhpTokenType.LeftParenthesis) { State++; } else if (State == 2 && token.TokenType == PhpTokenType.Variable && PhpName.Superglobals.Contains(token.Lexeme)) { AddExpressionToken(); } else if (State == 3 && token.TokenType == PhpTokenType.LeftBracket) { State++; } else if (State == 4 && token.TokenType == PhpTokenType.String) { AddExpressionToken(); } else if (State == 5 && token.TokenType == PhpTokenType.RightBracket) { State++; } else if (State == 6 && token.TokenType == PhpTokenType.RightParenthesis) { State++; } else if (State == 7) { if (token.TokenType == PhpTokenType.RightBrace) { AddExpression(); } else if (token.TokenType == PhpTokenType.caseKeyword) { State++; } } else if (State == 8) { if (token.TokenType == PhpTokenType.String) { AddExpressionToken(); } State = 7; } else { NewExpression(); } }
protected abstract void AnalyzeCore(PhpToken token);
public void Analyze(PhpToken token) { _currentToken = token; AnalyzeCore(token); }
public FunctionCall(PhpToken id, PhpToken[] parameters) { Id = id; ParamTokens = parameters; }
public void Token_ToString() { var token = new PhpToken(PhpTokenType.OpenTag, "<?", 0); Assert.AreEqual("[0] OpenTag: <?", token.ToString()); }
protected StaticAnalysisAlert CreateAlert(string code, PhpToken token) { return(new StaticAnalysisAlert(Name, code.GetLineNumber(token.Index) + 1, GetSurroundingCode(code, token))); }