@@ -39,30 +39,32 @@ protected override async Task RegisterCodeFixesAsync(DocumentEditorCodeFixContex
3939 {
4040 switch ( method )
4141 {
42- case { Identifier : { ValueText : "DisposeAsync" } } :
43- // Not sure how we want the code gen.
44- ////context.RegisterCodeFix(
45- //// $"{symbol.Name}.DisposeAsync() in {method}",
46- //// (editor, cancellationToken) => editor.ReplaceNode(
47- //// method,
48- //// x => DisposeAsync(x, editor, cancellationToken)),
49- //// "DisposeAsync",
50- //// diagnostic);
51-
52- ////MethodDeclarationSyntax DisposeAsync(MethodDeclarationSyntax old, DocumentEditor editor, CancellationToken cancellationToken)
53- ////{
54- //// return old switch
55- //// {
56- //// { ExpressionBody: { Expression: { } expression } }
57- //// => old.AsBlockBody(
58- //// SyntaxFactory.ExpressionStatement(expression),
59- //// IDisposableFactory.DisposeAsyncStatement(disposable, editor.SemanticModel, cancellationToken)),
60- //// { Body: { } body }
61- //// => old.WithBody(
62- //// body.AddStatements(IDisposableFactory.DisposeAsyncStatement(disposable, editor.SemanticModel, cancellationToken))),
63- //// _ => throw new InvalidOperationException("Error generating DisposeAsync"),
64- //// };
65- ////}
42+ case { Identifier : { ValueText : "DisposeAsync" } }
43+ when IDisposableFactory . MemberAccessContext . Create ( disposable , method , semanticModel , context . CancellationToken ) is { NotNull : { } } :
44+ context . RegisterCodeFix (
45+ $ "{ symbol . Name } .DisposeAsync() in { method } ",
46+ ( editor , cancellationToken ) => editor . ReplaceNode (
47+ method ,
48+ x => DisposeAsync ( x , editor , cancellationToken ) ) ,
49+ "DisposeAsync" ,
50+ diagnostic ) ;
51+
52+ MethodDeclarationSyntax DisposeAsync ( MethodDeclarationSyntax old , DocumentEditor editor , CancellationToken cancellationToken )
53+ {
54+ return old switch
55+ {
56+ { ExpressionBody : { Expression : { } expression } }
57+ => old . AsBlockBody (
58+ SyntaxFactory . ExpressionStatement ( expression ) ,
59+ IDisposableFactory . DisposeAsyncStatement ( disposable , method ! , editor . SemanticModel , cancellationToken ) )
60+ . WithAsync ( ) ,
61+ { Body : { } body }
62+ => old . WithBody (
63+ body . AddStatements ( IDisposableFactory . DisposeAsyncStatement ( disposable , method ! , editor . SemanticModel , cancellationToken ) ) )
64+ . WithAsync ( ) ,
65+ _ => throw new InvalidOperationException ( "Error generating DisposeAsync" ) ,
66+ } ;
67+ }
6668
6769 break ;
6870 case { Identifier : { ValueText : "Dispose" } , ParameterList : { Parameters : { Count : 1 } parameters } , Body : { } body } :
@@ -79,21 +81,21 @@ void DisposeInVirtual(DocumentEditor editor, CancellationToken cancellationToken
7981 {
8082 editor . InsertAfter (
8183 ifNotDisposingReturn ,
82- IDisposableFactory . DisposeStatement ( disposable , editor . SemanticModel , cancellationToken ) ) ;
84+ IDisposableFactory . DisposeStatement ( disposable , method ! , editor . SemanticModel , cancellationToken ) ) ;
8385 }
8486 else if ( TryFindIfDisposing ( method ! , out var ifDisposing ) )
8587 {
8688 _ = editor . ReplaceNode (
8789 ifDisposing . Statement ,
8890 x => x is BlockSyntax ifBlock
89- ? ifBlock . AddStatements ( IDisposableFactory . DisposeStatement ( disposable , editor . SemanticModel , cancellationToken ) )
90- : SyntaxFactory . Block ( x , IDisposableFactory . DisposeStatement ( disposable , editor . SemanticModel , cancellationToken ) ) ) ;
91+ ? ifBlock . AddStatements ( IDisposableFactory . DisposeStatement ( disposable , method ! , editor . SemanticModel , cancellationToken ) )
92+ : SyntaxFactory . Block ( x , IDisposableFactory . DisposeStatement ( disposable , method ! , editor . SemanticModel , cancellationToken ) ) ) ;
9193 }
9294 else
9395 {
9496 ifDisposing = SyntaxFactory . IfStatement (
9597 SyntaxFactory . IdentifierName ( parameters [ 0 ] . Identifier ) ,
96- SyntaxFactory . Block ( IDisposableFactory . DisposeStatement ( disposable , editor . SemanticModel , cancellationToken ) ) ) ;
98+ SyntaxFactory . Block ( IDisposableFactory . DisposeStatement ( disposable , method ! , editor . SemanticModel , cancellationToken ) ) ) ;
9799 if ( DisposeMethod . TryFindBaseCall ( method ! , editor . SemanticModel , cancellationToken , out var baseCall ) )
98100 {
99101 editor . InsertBefore ( baseCall . Parent , ifDisposing ) ;
@@ -119,13 +121,13 @@ void DisposeWhenNoParameter(DocumentEditor editor, CancellationToken cancellatio
119121 {
120122 editor . InsertBefore (
121123 baseCall . Parent ,
122- IDisposableFactory . DisposeStatement ( disposable , editor . SemanticModel , cancellationToken ) ) ;
124+ IDisposableFactory . DisposeStatement ( disposable , method ! , editor . SemanticModel , cancellationToken ) ) ;
123125 }
124126 else
125127 {
126128 _ = editor . ReplaceNode (
127129 body ,
128- x => x . AddStatements ( IDisposableFactory . DisposeStatement ( disposable , editor . SemanticModel , cancellationToken ) ) ) ;
130+ x => x . AddStatements ( IDisposableFactory . DisposeStatement ( disposable , method ! , editor . SemanticModel , cancellationToken ) ) ) ;
129131 }
130132 }
131133
@@ -138,11 +140,12 @@ void DisposeWhenNoParameter(DocumentEditor editor, CancellationToken cancellatio
138140 method ,
139141 x => x . AsBlockBody (
140142 SyntaxFactory . ExpressionStatement ( expression ) ,
141- IDisposableFactory . DisposeStatement ( disposable , editor . SemanticModel , cancellationToken ) ) ) ,
143+ IDisposableFactory . DisposeStatement ( disposable , method ! , editor . SemanticModel , cancellationToken ) ) ) ,
142144 "Dispose member." ,
143145 diagnostic ) ;
144146 break ;
145147 case { Identifier : { ValueText : "Dispose" } } :
148+ case { Identifier : { ValueText : "DisposeAsync" } } :
146149 break ;
147150 default :
148151 context . RegisterCodeFix (
@@ -160,10 +163,10 @@ MethodDeclarationSyntax Dispose(MethodDeclarationSyntax old, DocumentEditor edit
160163 { ExpressionBody : { Expression : { } expression } }
161164 => old . AsBlockBody (
162165 SyntaxFactory . ExpressionStatement ( expression ) ,
163- IDisposableFactory . DisposeStatement ( disposable , editor . SemanticModel , cancellationToken ) ) ,
166+ IDisposableFactory . DisposeStatement ( disposable , method ! , editor . SemanticModel , cancellationToken ) ) ,
164167 { Body : { } body }
165168 => old . WithBody ( body . AddStatements (
166- IDisposableFactory . DisposeStatement ( disposable , editor . SemanticModel , cancellationToken ) ) ) ,
169+ IDisposableFactory . DisposeStatement ( disposable , method ! , editor . SemanticModel , cancellationToken ) ) ) ,
167170 _ => throw new InvalidOperationException ( "Error generating Dispose" ) ,
168171 } ;
169172 }
0 commit comments