私はので、私は、私は(選択RoslynのInvocationExpressionSyntaxに基づいてMethodDeclarationSyntaxを取得する方法はありますか? InvocationExpressionSyntaxとして
class Program
{
[Obsolete()]
public static void A() { }
static void Main(string[] args)
{
A(); // I moved the mouse here and captured as InvocationExpressionSyntax
Console.WriteLine("Hello World!");
}
}
のようなコードを書いたロスリンによってコードリファクタリングを書きたい)ので、私は知りたいのは、私がMethodDeclarationSyntaxまたは選択方法の優れた属性を取得することができます。
はそれが可能です
public static void A() { }
または
[Obsolete()]
を意味しますか?
リファクタリング目的のメソッドのすべての属性を検索したいと考えています。
EDIT
public sealed override async Task ComputeRefactoringsAsync(CodeRefactoringContext context)
{
// TODO: Replace the following code with your own analysis, generating a CodeAction for each refactoring to offer
var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false);
// Find the node at the selection.
var node = root.FindNode(context.Span);
// Only offer a refactoring if the selected node is a type declaration node.
var typeDecl = node.Parent as InvocationExpressionSyntax;
if (typeDecl == null)
{
return;
}
// For any type declaration node, create a code action to reverse the identifier text.
var action = CodeAction.Create("Reverse type name", c => ReverseTypeNameAsync(context.Document, typeDecl, c));
// Register this code action.
context.RegisterRefactoring(action);
}
EDIT 2
ClassLibrary1の:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = false)]
public class CustomAttribute : Attribute
{}
ClassLibrary2
public static class Class1
{
[CustomAttribute] // Comes from ClassLibrary1
public static string SayHelloTo(string name)
{
return $"Hello {name}";
}
コードのリファクタリングプロジェクト:
class Program
{
[Obsolete()]
public static void A() { }
static void Main(string[] args)
{
A(); // I moved the mouse here and captured as InvocationExpressionSyntax
var t = ClassLibrary2.Class1.SayHelloTo("Test"); // ????? Symbol is NULL ?????
}
}
ここにあなたの状況は?基本的に 'SemanticModel'を取得し、' model.GetSymbolInfo(invocation) 'を呼びたいと思っています。それがシンボルを解決すると、シンボル上で 'GetAttributes()'を呼び出すことができます。しかし、あなたは意味モデルが必要です... –
@JonSkeet、私は自分の投稿を編集しました。サンプルはコードリファクタリングVSテンプレートから来ました。 'var typeDecl = node.Parent from InvocationExpressionSyntax;'私はSemanticModelが必要だと言っています。どうすればいいですか?上記の情報源に基づいてもっと説明できますか? –
よく 'Document'を与えられれば、あなたは' Document.GetSemanticModelAsync'を呼び出すことができます... –