private static Task <Document> ExecuteAsync(CodeFixExecutionContext <TypeParameterSyntax> context, ITypeSymbol targetType, INamedTypeSymbol attribute) { INamespaceSymbol? @namespace = (context.SemanticModel.GetDeclaredSymbol(context.Node)?.ContainingNamespace) ?? context.Compilation.GlobalNamespace; NameSyntax attributeName = context.SemanticModel.GetNameSyntaxForAttribute(context.Root.Usings, @namespace, attribute, context.CancellationToken); TypeParameterSyntax parameter = context.Node.AddAttributeLists(SyntaxFactory.AttributeList(SyntaxFactory.SingletonSeparatedList(SyntaxFactory.Attribute(attributeName)))); context.RegisterChange(parameter); AttributeSyntax attr = context.Node.AttributeLists.Last().Attributes[0]; return(Task.FromResult(MakeValueOfOverridenAttributeEquivalentCodeFix.Execute(context.WithNode(attr), targetType))); }
/// <inheritdoc/> public override async Task RegisterCodeFixesAsync(CodeFixContext context) { CodeFixData <TypeParameterSyntax> data = await CodeFixData <TypeParameterSyntax> .FromAsync(context, true).ConfigureAwait(false); if (!data.Success || !data.HasNode || !data.HasSemanticModel) { return; } if (data.SemanticModel.GetDeclaredSymbol(data.Node, data.CancellationToken) is not ITypeParameterSymbol typeParameter || MakeValueOfOverridenAttributeEquivalentCodeFix.GetTargetType(data.Node, data.SemanticModel, typeParameter.Ordinal, data.CancellationToken) is not ITypeSymbol targetType) { return; } CodeAction?action = GetCodeAction(in data, targetType); if (action is null) { return; } context.RegisterCodeFix(action, data.Diagnostic); }