Ejemplo n.º 1
0
        private static bool HasMissingTypes(ReflectedMember member, Types types, SyntaxNodeAnalysisContext context, out string typesArrayText)
        {
            if ((member.Symbol as IMethodSymbol)?.AssociatedSymbol != null)
            {
                typesArrayText = null;
                return false;
            }

            if (member.Match == FilterMatch.Single &&
                types.Argument == null &&
                member.GetX == KnownSymbol.Type.GetMethod &&
                member.Symbol is IMethodSymbol method &&
                !method.IsGenericMethod)
            {
                return Types.TryGetTypesArrayText(method.Parameters, context.SemanticModel, context.Node.SpanStart, out typesArrayText);
            }

            typesArrayText = null;
            return false;
        }
Ejemplo n.º 2
0
        protected override async Task RegisterCodeFixesAsync(DocumentEditorCodeFixContext context)
        {
            var syntaxRoot = await context.Document.GetSyntaxRootAsync(context.CancellationToken)
                             .ConfigureAwait(false);

            var semanticModel = await context.Document.GetSemanticModelAsync(context.CancellationToken)
                                .ConfigureAwait(false);

            foreach (var diagnostic in context.Diagnostics)
            {
                if (syntaxRoot.TryFindNode(diagnostic, out ArgumentListSyntax argumentList) &&
                    argumentList.Arguments.TrySingle(out var arg) &&
                    arg.TryGetStringValue(semanticModel, context.CancellationToken, out var memberName) &&
                    argumentList.Parent is InvocationExpressionSyntax invocation &&
                    diagnostic.Properties.TryGetValue(nameof(INamedTypeSymbol), out var typeName) &&
                    semanticModel.Compilation.GetTypeByMetadataName(typeName) is INamedTypeSymbol type)
                {
                    if (invocation.TryGetTarget(KnownSymbol.Type.GetMethod, semanticModel, context.CancellationToken, out _))
                    {
                        foreach (var member in type.GetMembers())
                        {
                            if (member is IMethodSymbol method &&
                                method.MetadataName == memberName &&
                                Flags.TryGetExpectedBindingFlags(type, method, out var flags) &&
                                flags.ToDisplayString(invocation) is string flagsText &&
                                Types.TryGetTypesArrayText(method.Parameters, semanticModel, invocation.SpanStart, out var typesArrayText))
                            {
                                context.RegisterCodeFix(
                                    $"Use: {typesArrayText}.",
                                    (editor, _) => editor.AddUsing(SystemReflection)
                                    .ReplaceNode(
                                        argumentList,
                                        x => x.WithArguments(x.Arguments.AddRange(new[] { ParseArgument(flagsText), NullArgument, ParseArgument(typesArrayText), NullArgument }))
                                        .WithTriviaFrom(x)),
                                    nameof(DisambiguateFix),
                                    diagnostic);
                            }
                        }
                    }

                    if (invocation.TryGetTarget(KnownSymbol.Type.GetProperty, semanticModel, context.CancellationToken, out _))
                    {
                        foreach (var member in type.GetMembers())
                        {
                            if (member is IPropertySymbol property &&
                                property.MetadataName == memberName &&
                                Flags.TryGetExpectedBindingFlags(type, property, out var flags) &&
                                flags.ToDisplayString(invocation) is string flagsText &&
                                Types.TryGetTypesArrayText(property.Parameters, semanticModel, invocation.SpanStart, out var typesArrayText))
                            {
                                context.RegisterCodeFix(
                                    $"Use: {typesArrayText}.",
                                    (editor, _) => editor.AddUsing(SystemReflection)
                                    .ReplaceNode(
                                        argumentList,
                                        x => x.WithArguments(x.Arguments.AddRange(new[]
                                {
                                    ParseArgument(flagsText),
                                    NullArgument,
                                    ParseArgument($"typeof({property.Type.ToString(semanticModel, invocation.SpanStart)})"),
                                    ParseArgument(typesArrayText),
                                    NullArgument,
                                }))
                                        .WithTriviaFrom(x)),
                                    nameof(DisambiguateFix),
                                    diagnostic);
                            }
                        }
                    }
                }
            }
        }