Exemple #1
0
        private static void AnalyzeSimpleMemberAccessExpression(SyntaxNodeAnalysisContext context)
        {
            var memberAccess = (MemberAccessExpressionSyntax)context.Node;

            if (memberAccess.IsParentKind(SyntaxKind.SimpleMemberAccessExpression))
            {
                return;
            }

            if (memberAccess.Expression == null)
            {
                return;
            }

            if (memberAccess.Name?.Identifier.ValueText != "Empty")
            {
                return;
            }

            var fieldSymbol = context.SemanticModel.GetSymbol(memberAccess.Name, context.CancellationToken) as IFieldSymbol;

            if (!SymbolUtility.IsPublicStaticReadOnly(fieldSymbol))
            {
                return;
            }

            if (fieldSymbol.ContainingType?.SpecialType != SpecialType.System_String)
            {
                return;
            }

            DiagnosticHelpers.ReportDiagnostic(context, DiagnosticRules.UseEmptyStringLiteralInsteadOfStringEmptyOrViceVersa, memberAccess, AnalyzerOptions.UseStringEmptyInsteadOfEmptyStringLiteral);
        }
        public static bool IsFixable(
            MemberAccessExpressionSyntax memberAccess,
            SemanticModel semanticModel,
            CancellationToken cancellationToken = default)
        {
            if (memberAccess.IsParentKind(SyntaxKind.SimpleMemberAccessExpression))
            {
                return(false);
            }

            if (memberAccess.Expression == null)
            {
                return(false);
            }

            if (memberAccess.Name?.Identifier.ValueText != "Empty")
            {
                return(false);
            }

            var fieldSymbol = semanticModel.GetSymbol(memberAccess.Name, cancellationToken) as IFieldSymbol;

            return(SymbolUtility.IsPublicStaticReadOnly(fieldSymbol) &&
                   fieldSymbol.ContainingType?.SpecialType == SpecialType.System_String);
        }
        public static bool IsEmptyStringExpression(
            ExpressionSyntax expression,
            SemanticModel semanticModel,
            CancellationToken cancellationToken = default(CancellationToken))
        {
            if (expression == null)
            {
                throw new ArgumentNullException(nameof(expression));
            }

            if (semanticModel == null)
            {
                throw new ArgumentNullException(nameof(semanticModel));
            }

            SyntaxKind kind = expression.Kind();

            if (kind == SyntaxKind.StringLiteralExpression)
            {
                return(((LiteralExpressionSyntax)expression).Token.ValueText.Length == 0);
            }
            else if (kind == SyntaxKind.InterpolatedStringExpression)
            {
                return(!((InterpolatedStringExpressionSyntax)expression).Contents.Any());
            }
            else if (kind == SyntaxKind.SimpleMemberAccessExpression)
            {
                var memberAccess = (MemberAccessExpressionSyntax)expression;

                if (memberAccess.Name?.Identifier.ValueText == "Empty")
                {
                    ISymbol symbol = semanticModel.GetSymbol(memberAccess, cancellationToken);

                    if (symbol?.Kind == SymbolKind.Field)
                    {
                        var fieldSymbol = (IFieldSymbol)symbol;

                        if (SymbolUtility.IsPublicStaticReadOnly(fieldSymbol, "Empty") &&
                            fieldSymbol.ContainingType?.SpecialType == SpecialType.System_String &&
                            fieldSymbol.Type.IsString())
                        {
                            return(true);
                        }
                    }
                }
            }

            Optional <object> optional = semanticModel.GetConstantValue(expression, cancellationToken);

            if (optional.HasValue)
            {
                var value = optional.Value as string;

                return(value?.Length == 0);
            }

            return(false);
        }