private async Task <Document> FixAttributeArgumentsAsync(Document document, SyntaxNode attributeDeclaration, INamedTypeSymbol charSetType, INamedTypeSymbol dllImportType, INamedTypeSymbol marshalAsType, INamedTypeSymbol unmanagedType, CancellationToken cancellationToken) { DocumentEditor editor = await DocumentEditor.CreateAsync(document, cancellationToken).ConfigureAwait(false); SyntaxGenerator generator = editor.Generator; SemanticModel model = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false); // could be either a [DllImport] or [MarshalAs] attribute ISymbol attributeType = model.GetSymbolInfo(attributeDeclaration, cancellationToken).Symbol; IReadOnlyList <SyntaxNode> arguments = generator.GetAttributeArguments(attributeDeclaration); if (dllImportType.Equals(attributeType.ContainingType)) { // [DllImport] attribute, add or replace CharSet named parameter SyntaxNode argumentValue = generator.MemberAccessExpression( generator.TypeExpression(charSetType), generator.IdentifierName(UnicodeText)); SyntaxNode newCharSetArgument = generator.AttributeArgument(CharSetText, argumentValue); SyntaxNode charSetArgument = FindNamedArgument(arguments, CharSetText); if (charSetArgument == null) { // add the parameter editor.AddAttributeArgument(attributeDeclaration, newCharSetArgument); } else { // replace the parameter editor.ReplaceNode(charSetArgument, newCharSetArgument); } } else if (marshalAsType.Equals(attributeType.ContainingType) && arguments.Count == 1) { // [MarshalAs] attribute, replace the only argument SyntaxNode newArgument = generator.AttributeArgument( generator.MemberAccessExpression( generator.TypeExpression(unmanagedType), generator.IdentifierName(LPWStrText))); editor.ReplaceNode(arguments[0], newArgument); } return(editor.GetChangedDocument()); }