Анализатор C#, получите тип экземпляра, на котором вызывается операцияC#

Место общения программистов C#
Anonymous
Анализатор C#, получите тип экземпляра, на котором вызывается операция

Сообщение Anonymous »

В настоящее время я хочу написать крошечный анализатор, который проверяет некоторые цепочки вызовов методов.
При использовании context.RegisterOperationAction(AnalyzeOperationAction, OperationKind.Invocacy); я способен подключаться ко всему в форме x = test.doSth() и может получать довольно много информации из семантического контекста, например test, doSth(), doSth() принадлежит классу XY, doSth() возвращает строку и т. д.
Однако я хочу знать тип теста — просто используя информацию doSth() принадлежит классу XY. не будет работать для методов расширения.
полный пример:

Код: Выделить всё

class TestClazz
{
public List test2 { get; set; }
}
static void Main(string[] args)
{
var test = new TestClazz();

var x = test.test2.ToArray();
}
и следующий код анализатора — это то, что я получил на данный момент, но даже спустя несколько часов я не могу совершить «переход» от «test» к типу «TestClazz»
р>

Код: Выделить всё

private static void AnalyzeOperationAction(OperationAnalysisContext context)
{
var wholeExpression = context.Operation.Syntax; // test.test2.ToArray()
var instance = wholeExpression.GetFirstToken(); // test

//Invalid: 'Microsoft.CodeAnalysis.SyntaxToken' to 'Microsoft.CodeAnalysis.SyntaxNode'
var type = context.Operation.SemanticModel.GetSymbolInfo(instance);

var diagnostic = Diagnostic.Create(MissingInitCallDescriptor, context.Operation.Syntax.GetLocation(), type);
context.ReportDiagnostic(diagnostic);
}
Есть идеи, как перейти от «Microsoft.CodeAnalysis.SyntaxToken» к «Microsoft.CodeAnalysis.SyntaxNode»?
Я в основном хочу проверить этот тест является экземпляром TestClazz перед выполнением реальных проверок и созданием диагностики.

Подробнее здесь: https://stackoverflow.com/questions/787 ... invoked-on

Вернуться в «C#»