Example #1
0
        static bool TryGetDiagnostic(MemberAccessExpressionSyntax memberAccessSyntax, ITypeSymbol containingType, SyntaxNode extensionParameter, out Diagnostic diagnostic)
        {
            diagnostic = default(Diagnostic);

            if (memberAccessSyntax.IsKind(SyntaxKind.ThisKeyword) || memberAccessSyntax.IsKind(SyntaxKind.BaseExpression))
            {
                return(false);
            }

            var rightMostName = memberAccessSyntax.Expression.GetRightmostName();

            if (rightMostName == null || rightMostName == extensionParameter)
            {
                return(false);
            }

            var rightMostType = rightMostName.Identifier.Text;

            if (rightMostType == containingType.Name)
            {
                return(false);
            }

            if (CheckCuriouslyRecurringTemplatePattern(containingType, rightMostType))
            {
                return(false);
            }

            diagnostic = Diagnostic.Create(
                descriptor,
                memberAccessSyntax.GetLocation()
                );
            return(true);
        }
    /// <inheritdoc/>
    public override SyntaxNode VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
    {
        var updatedNode = (MemberAccessExpressionSyntax)base.VisitMemberAccessExpression(node) !;

        if (node.IsKind(SyntaxKind.SimpleMemberAccessExpression) &&
            SemanticModel.For(node).GetOperation(node) is IMemberReferenceOperation operation)
        {
            // Track and replace constants
            if (operation is IFieldReferenceOperation fieldOperation &&
                fieldOperation.Field.IsConst &&
                fieldOperation.Type !.TypeKind != TypeKind.Enum)
            {
                if (HlslKnownFields.TryGetMappedName(fieldOperation.Member.ToDisplayString(), out string?constantLiteral))
                {
                    return(ParseExpression(constantLiteral !));
                }

                ConstantDefinitions[fieldOperation.Field] = ((IFormattable)fieldOperation.Field.ConstantValue !).ToString(null, CultureInfo.InvariantCulture);

                var ownerTypeName = ((INamedTypeSymbol)fieldOperation.Field.ContainingSymbol).ToDisplayString().ToHlslIdentifierName();
                var constantName  = $"__{ownerTypeName}__{fieldOperation.Field.Name}";

                return(IdentifierName(constantName));
            }

            if (HlslKnownProperties.TryGetMappedName(operation.Member.ToDisplayString(), out string?mapping))
            {
                // Rewrite static and instance mapped members
                return(operation.Member.IsStatic switch
                {
                    true => ParseExpression(mapping !),
                    false => updatedNode.WithName(IdentifierName(mapping !))
                });
        private static bool IsRelayReturn(MemberAccessExpressionSyntax memberAccess, SemanticModel semanticModel, CancellationToken cancellationToken)
        {
            if (memberAccess == null ||
                !memberAccess.IsKind(SyntaxKind.SimpleMemberAccessExpression) ||
                memberAccess.Expression is InstanceExpressionSyntax ||
                memberAccess.Expression == null)
            {
                return(false);
            }

            if (semanticModel.TryGetSymbol(memberAccess.Expression, cancellationToken, out ISymbol member) &&
                FieldOrProperty.TryCreate(member, out FieldOrProperty fieldOrProperty) &&
                memberAccess.TryFirstAncestor <TypeDeclarationSyntax>(out var typeDeclaration) &&
                !IsInjected(fieldOrProperty, typeDeclaration, semanticModel, cancellationToken))
            {
                return(false);
            }

            if (memberAccess.Expression is IdentifierNameSyntax &&
                memberAccess.Name is IdentifierNameSyntax)
            {
                return(true);
            }

            if (memberAccess.Expression is MemberAccessExpressionSyntax &&
                memberAccess.Name is IdentifierNameSyntax)
            {
                return(true);
            }

            return(false);
        }
Example #4
0
        private static bool IsCalleePotentiallyCreatedInScope(MemberAccessExpressionSyntax memberAccess, SemanticModel semanticModel, CancellationToken cancellationToken)
        {
            if (memberAccess == null ||
                !memberAccess.IsKind(SyntaxKind.SimpleMemberAccessExpression) ||
                memberAccess.Expression.IsKind(SyntaxKind.ThisExpression))
            {
                return(false);
            }

            if (memberAccess.Expression is IdentifierNameSyntax callee)
            {
                var symbol = semanticModel.GetSymbolSafe(callee, cancellationToken);
                if (symbol.Kind != SymbolKind.Local)
                {
                    return(false);
                }

                if (!symbol.DeclaringSyntaxReferences.TrySingle(out var reference))
                {
                    return(false);
                }

                return(reference.GetSyntax(cancellationToken) is VariableDeclaratorSyntax variableDeclarator &&
                       variableDeclarator.Initializer is EqualsValueClauseSyntax initializer &&
                       initializer.Value is ObjectCreationExpressionSyntax);
            }

            return(false);
        }
Example #5
0
        public static async Task ComputeRefactoringsAsync(RefactoringContext context, MemberAccessExpressionSyntax memberAccess)
        {
            if (context.IsRefactoringEnabled(RefactoringIdentifiers.ReplaceCountWithLengthOrLengthWithCount) &&
                memberAccess.IsKind(SyntaxKind.SimpleMemberAccessExpression))
            {
                memberAccess = GetTopmostMemberAccessExpression(memberAccess);

                if (memberAccess.Name?.Span.Contains(context.Span) == true)
                {
                    string name = memberAccess.Name.Identifier.ValueText;

                    if (string.Equals(name, "Count", StringComparison.Ordinal))
                    {
                        SemanticModel semanticModel = await context.GetSemanticModelAsync().ConfigureAwait(false);

                        if (CanRefactor(memberAccess, "Length", semanticModel, context.CancellationToken))
                        {
                            RegisterRefactoring(context, memberAccess, "Count", "Length");
                        }
                    }
                    else if (string.Equals(name, "Length", StringComparison.Ordinal))
                    {
                        SemanticModel semanticModel = await context.GetSemanticModelAsync().ConfigureAwait(false);

                        if (CanRefactor(memberAccess, "Count", semanticModel, context.CancellationToken))
                        {
                            RegisterRefactoring(context, memberAccess, "Length", "Count");
                        }
                    }
                }
            }
        }
        public static void FormatExpressionChain(CodeRefactoringContext context, MemberAccessExpressionSyntax memberAccessExpression)
        {
            if (!memberAccessExpression.IsKind(SyntaxKind.SimpleMemberAccessExpression))
            {
                return;
            }

            MemberAccessExpressionSyntax[] expressions = GetChain(memberAccessExpression).ToArray();

            if (expressions.Length <= 1)
            {
                return;
            }

            if (expressions[0].IsSingleline(includeExteriorTrivia: false))
            {
                context.RegisterRefactoring(
                    "Format expression chain on multiple lines",
                    cancellationToken => FormatExpressionChainOnMultipleLinesAsync(context.Document, expressions[0], cancellationToken));
            }
            else
            {
                context.RegisterRefactoring(
                    "Format expression chain on a single line",
                    cancellationToken => FormatExpressionChainOnSingleLineAsync(context.Document, expressions[0], cancellationToken));
            }
        }
Example #7
0
        private static bool IsRelayReturn(MemberAccessExpressionSyntax memberAccess, SemanticModel semanticModel, CancellationToken cancellationToken)
        {
            if (memberAccess == null ||
                !memberAccess.IsKind(SyntaxKind.SimpleMemberAccessExpression) ||
                memberAccess.Expression is InstanceExpressionSyntax ||
                memberAccess.Expression == null)
            {
                return(false);
            }

            var member = semanticModel.GetSymbolSafe(memberAccess.Expression, cancellationToken);

            if (member == null ||
                !IsInjected(member, semanticModel, cancellationToken))
            {
                return(false);
            }

            if (memberAccess.Expression is IdentifierNameSyntax &&
                memberAccess.Name is IdentifierNameSyntax)
            {
                return(true);
            }

            if (memberAccess.Expression is MemberAccessExpressionSyntax &&
                memberAccess.Name is IdentifierNameSyntax)
            {
                return(true);
            }

            return(false);
        }
Example #8
0
        private static bool IsCalleePotentiallyCreatedInScope(MemberAccessExpressionSyntax memberAccess, SemanticModel semanticModel, CancellationToken cancellationToken)
        {
            if (memberAccess == null ||
                !memberAccess.IsKind(SyntaxKind.SimpleMemberAccessExpression) ||
                memberAccess.Expression.IsKind(SyntaxKind.ThisExpression))
            {
                return(false);
            }

            if (memberAccess.Expression is IdentifierNameSyntax callee &&
                semanticModel.TryGetSymbol(callee, cancellationToken, out var symbol))
            {
                if (symbol.Kind != SymbolKind.Local)
                {
                    return(false);
                }

                if (symbol.TrySingleDeclaration(cancellationToken, out VariableDeclaratorSyntax? declaration))
                {
                    return(declaration.Initializer is { } initializer&&
                           initializer.Value is ObjectCreationExpressionSyntax);
                }
            }

            return(false);
        }
Example #9
0
        public override void VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
        {
            if (node.IsKind(SyntaxKind.SimpleMemberAccessExpression))
            {
                this.simpleMemberAccesses.Add(node);
            }

            base.VisitMemberAccessExpression(node);
        }
Example #10
0
        public override void VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
        {
            if (node.IsKind(SyntaxKind.SimpleMemberAccessExpression) && TrySimplify(node))
            {
                // found a match. report it and stop processing.
                return;
            }

            // descend further.
            DefaultVisit(node);
        }
Example #11
0
    /// <inheritdoc/>
    public override SyntaxNode VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
    {
        var updatedNode = (MemberAccessExpressionSyntax)base.VisitMemberAccessExpression(node) !;

        if (node.IsKind(SyntaxKind.SimpleMemberAccessExpression) &&
            SemanticModel.For(node).GetOperation(node) is IMemberReferenceOperation operation)
        {
            // Track and replace constants
            if (operation is IFieldReferenceOperation fieldOperation &&
                fieldOperation.Field.IsConst &&
                fieldOperation.Type !.TypeKind != TypeKind.Enum)
            {
                if (HlslKnownFields.TryGetMappedName(fieldOperation.Member.ToDisplayString(), out string?constantLiteral))
                {
                    return(ParseExpression(constantLiteral !));
                }

                ConstantDefinitions[fieldOperation.Field] = ((IFormattable)fieldOperation.Field.ConstantValue !).ToString(null, CultureInfo.InvariantCulture);

                var ownerTypeName = ((INamedTypeSymbol)fieldOperation.Field.ContainingSymbol).ToDisplayString().ToHlslIdentifierName();
                var constantName  = $"__{ownerTypeName}__{fieldOperation.Field.Name}";

                return(IdentifierName(constantName));
            }

            if (HlslKnownProperties.TryGetMappedName(operation.Member.ToDisplayString(), out string?mapping))
            {
                if (operation.Member.IsStatic)
                {
                    string typeName = operation.Member.ContainingType.GetFullMetadataName();

                    // Special dispatch types are not supported from static constants
                    DiagnosticDescriptor?descriptor = typeName switch
                    {
                        _ when typeName == typeof(ThreadIds).FullName || typeName == typeof(ThreadIds.Normalized).FullName => InvalidThreadIdsUsage,
                        _ when typeName == typeof(GroupIds).FullName => InvalidGroupIdsUsage,
                        _ when typeName == typeof(GroupSize).FullName => InvalidGroupSizeUsage,
                        _ when typeName == typeof(GridIds).FullName => InvalidGridIdsUsage,
                        _ when typeName == typeof(DispatchSize).FullName => InvalidDispatchSizeUsage,
                        _ => null
                    };

                    if (descriptor is not null)
                    {
                        Diagnostics.Add(descriptor, node);
                    }
                }

                // Rewrite static and instance mapped members
                return(operation.Member.IsStatic switch
                {
                    true => ParseExpression(mapping !),
                    false => updatedNode.WithName(IdentifierName(mapping !))
                });
Example #12
0
            public override SyntaxNode VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
            {
                node = (MemberAccessExpressionSyntax)base.VisitMemberAccessExpression(node);

                if (node.IsKind(SyntaxKind.SimpleMemberAccessExpression) &&
                    string.Equals((node.Expression as IdentifierNameSyntax)?.Identifier.ValueText, _name, StringComparison.Ordinal) &&
                    string.Equals((node.Name as IdentifierNameSyntax)?.Identifier.ValueText, "Current", StringComparison.Ordinal) &&
                    SymbolEqualityComparer.Default.Equals(_symbol, _semanticModel.GetSymbol(node.Expression, _cancellationToken)))
                {
                    return(_newName.WithTriviaFrom(node));
                }

                return(node);
            }
            public override SyntaxNode VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
            {
                if (!Options.FullyQualifiedNames &&
                    node.IsKind(SyntaxKind.SimpleMemberAccessExpression))
                {
                    ISymbol symbol = SemanticModel.GetSymbol(node, CancellationToken);

                    if (symbol?.Kind == SymbolKind.Field &&
                        symbol.ContainingType?.TypeKind == TypeKind.Enum)
                    {
                        return(node.WithAdditionalAnnotations(_simplifierAnnotationAsArray));
                    }
                }

                return(base.VisitMemberAccessExpression(node));
            }
Example #14
0
 public override void VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
 {
     if (node.IsKind(SyntaxKind.SimpleMemberAccessExpression))
     {
         var baseInfo = model.GetSymbolInfo(node.Expression);
         if (baseInfo.Symbol == info.Symbol)
         {
             var name = node.Name.ToString();
             if (!conflictNames.ContainsKey(name) || conflictNames[name] <= 0)
             {
                 ReplaceNodes.Add(node);
             }
         }
     }
     base.VisitMemberAccessExpression(node);
 }
Example #15
0
        public static async Task ComputeRefactoringsAsync(RefactoringContext context, MemberAccessExpressionSyntax memberAccessExpression)
        {
            if (!context.Span.IsEmpty)
            {
                return;
            }

            if (!memberAccessExpression.Span.Contains(context.Span))
            {
                return;
            }

            if (!memberAccessExpression.IsKind(SyntaxKind.SimpleMemberAccessExpression))
            {
                return;
            }

            SemanticModel semanticModel = await context.GetSemanticModelAsync().ConfigureAwait(false);

            List <MemberAccessExpressionSyntax> expressions = GetChain(memberAccessExpression, semanticModel, context.CancellationToken);

            if (expressions == null)
            {
                return;
            }

            if (expressions.Count <= 1)
            {
                return;
            }

            if (expressions[0].IsSingleLine(includeExteriorTrivia: false))
            {
                context.RegisterRefactoring(
                    "Format expression chain on multiple lines",
                    ct => SyntaxFormatter.ToMultiLineAsync(context.Document, expressions.ToArray(), ct),
                    RefactoringIdentifiers.FormatExpressionChain);
            }
            else if (expressions[0].DescendantTrivia(expressions[0].Span).All(f => f.IsWhitespaceOrEndOfLineTrivia()))
            {
                context.RegisterRefactoring(
                    "Format expression chain on a single line",
                    ct => SyntaxFormatter.ToSingleLineAsync(context.Document, expressions[0], ct),
                    RefactoringIdentifiers.FormatExpressionChain);
            }
        }
Example #16
0
            public override SyntaxNode VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
            {
                if (node.IsKind(SyntaxKind.SimpleMemberAccessExpression) &&
                    node.Expression is IdentifierNameSyntax identifierName &&
                    identifierName.Identifier.ValueText == IdentifierSymbol.Name &&
                    SymbolEqualityComparer.Default.Equals(SemanticModel.GetSymbol(identifierName, CancellationToken), IdentifierSymbol))
                {
                    string name = node.Name.Identifier.ValueText;

                    if (!Names.TryGetValue(name, out string newName))
                    {
                        newName = StringUtility.FirstCharToLower(name);
                    }

                    return(IdentifierName(newName).WithTriviaFrom(identifierName));
                }

                return(base.VisitMemberAccessExpression(node));
            }
        public override SyntaxNode VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
        {
            SyntaxNode r_node = node;

            if (node.IsKind(SyntaxKind.SimpleMemberAccessExpression) && node.ToString() == "ById.OnLeft")
            {
                var p = node.HasParent<ArgumentSyntax, ArgumentListSyntax, InvocationExpressionSyntax, EqualsValueClauseSyntax, VariableDeclaratorSyntax>();
                if (p == null)
                {

                }
                else
                {
                    var byId = SyntaxFactory.ParseExpression("\"#" + p.Identifier.Text + "\"");
                    //var argById = SyntaxFactory.Argument(byId);
                    r_node = byId;
                }
            }

            return r_node;
        }
        private static bool IsCalleePotentiallyCreatedInScope(MemberAccessExpressionSyntax memberAccess, SemanticModel semanticModel, CancellationToken cancellationToken)
        {
            if (memberAccess == null ||
                !memberAccess.IsKind(SyntaxKind.SimpleMemberAccessExpression) ||
                memberAccess.Expression.IsKind(SyntaxKind.ThisExpression))
            {
                return(false);
            }

            var callee = memberAccess.Expression as IdentifierNameSyntax;

            if (callee == null)
            {
                return(false);
            }

            var symbol = semanticModel.GetSymbolInfo(callee, cancellationToken).Symbol;

            if (symbol.Kind != SymbolKind.Local)
            {
                return(false);
            }

            SyntaxReference reference;

            if (!symbol.DeclaringSyntaxReferences.TryGetSingle(out reference))
            {
                return(false);
            }

            var declarator     = reference.GetSyntax(cancellationToken) as VariableDeclaratorSyntax;
            var objectCreation = declarator?.Initializer?.Value as ObjectCreationExpressionSyntax;

            if (objectCreation == null)
            {
                return(false);
            }

            return(true);
        }
        public static async Task ComputeRefactoringsAsync(RefactoringContext context, MemberAccessExpressionSyntax memberAccessExpression)
        {
            if (context.Span.IsEmpty &&
                memberAccessExpression.Span.Contains(context.Span) &&
                memberAccessExpression.IsKind(SyntaxKind.SimpleMemberAccessExpression))
            {
                SemanticModel semanticModel = await context.GetSemanticModelAsync().ConfigureAwait(false);

                List <MemberAccessExpressionSyntax> expressions = GetChain(memberAccessExpression, semanticModel, context.CancellationToken);

                if (expressions.Count > 1)
                {
                    if (expressions[0].IsSingleLine(includeExteriorTrivia: false))
                    {
                        context.RegisterRefactoring(
                            "Format expression chain on multiple lines",
                            cancellationToken =>
                        {
                            return(CSharpFormatter.ToMultiLineAsync(
                                       context.Document,
                                       expressions.ToArray(),
                                       cancellationToken));
                        });
                    }
                    else
                    {
                        context.RegisterRefactoring(
                            "Format expression chain on a single line",
                            cancellationToken =>
                        {
                            return(CSharpFormatter.ToSingleLineAsync(
                                       context.Document,
                                       expressions[0],
                                       cancellationToken));
                        });
                    }
                }
            }
        }
 public override void VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
 {
     if (node.IsKind(SyntaxKind.SimpleMemberAccessExpression))
     {
         var baseInfo = model.GetSymbolInfo(node.Expression);
         if (baseInfo.Symbol == info.Symbol)
         {
             var name = node.Name.ToString();
             if (!conflictNames.ContainsKey(name) || conflictNames[name] <= 0)
                 ReplaceNodes.Add(node);
         }
     }
     base.VisitMemberAccessExpression(node);
 }
 /// <summary>
 /// https://github.com/icsharpcode/CodeConverter/issues/765 Roslyn turns dataReader["foo"] into dataReader.Item
 /// </summary>
 private static bool IsRoslynElementAccessBug(MemberAccessExpressionSyntax maes) => maes.IsKind(SyntaxKind.DictionaryAccessExpression);