Beispiel #1
0
        private IEnumerable <DiagnosticRecord> FindOperatorViolations(TokenOperations tokenOperations)
        {
            foreach (var tokenNode in tokenOperations.GetTokenNodes(IsOperator))
            {
                if (tokenNode.Previous == null ||
                    tokenNode.Next == null ||
                    tokenNode.Value.Kind == TokenKind.DotDot)
                {
                    continue;
                }

                // exclude unary operator for cases like $foo.bar(-$Var)
                if (TokenTraits.HasTrait(tokenNode.Value.Kind, TokenFlags.UnaryOperator) &&
                    tokenNode.Previous.Value.Kind == TokenKind.LParen &&
                    tokenNode.Next.Value.Kind == TokenKind.Variable)
                {
                    continue;
                }

                // exclude assignment operator inside of multi-line hash tables if requested
                if (IgnoreAssignmentOperatorInsideHashTable && tokenNode.Value.Kind == TokenKind.Equals)
                {
                    Ast containingAst = tokenOperations.GetAstPosition(tokenNode.Value);
                    if (containingAst is HashtableAst && containingAst.Extent.EndLineNumber != containingAst.Extent.StartLineNumber)
                    {
                        continue;
                    }
                }

                var hasWhitespaceBefore = IsPreviousTokenOnSameLineAndApartByWhitespace(tokenNode);
                var hasWhitespaceAfter  = tokenNode.Next.Value.Kind == TokenKind.NewLine ||
                                          IsPreviousTokenOnSameLineAndApartByWhitespace(tokenNode.Next);

                if (!hasWhitespaceAfter || !hasWhitespaceBefore)
                {
                    yield return(new DiagnosticRecord(
                                     GetError(ErrorKind.Operator),
                                     tokenNode.Value.Extent,
                                     GetName(),
                                     GetDiagnosticSeverity(),
                                     tokenOperations.Ast.Extent.File,
                                     null,
                                     GetCorrections(
                                         tokenNode.Previous.Value,
                                         tokenNode.Value,
                                         tokenNode.Next.Value,
                                         hasWhitespaceBefore,
                                         hasWhitespaceAfter)));
                }
            }
        }