Диагностический анализатор VS 2022 перестает работать при попытке получить информацию о типе пользовательского классаC#

Место общения программистов C#
Ответить
Anonymous
 Диагностический анализатор VS 2022 перестает работать при попытке получить информацию о типе пользовательского класса

Сообщение Anonymous »

Я пытаюсь научиться создавать диагностический анализатор Roslyn и решил попытаться разработать его на основе недавно созданной библиотеки; в частности, для одного из атрибутов. Атрибут называется ValidateWith и может принимать либо System.Type, либо строку. Когда аргументом атрибута является строка, я пытаюсь подтвердить выполнение следующих условий:
  • Строка — это имя существующего метода. в том же содержащем типе.
  • Метод принимает один параметр, соответствующий типу свойства (атрибут можно применять только к свойствам).
  • Возврат тип метода — bool, Task, CustomValidationResult или Task
Мне удалось реализовать большую часть этого, но я застрял на третьем элемент. Кое-что о проверке типа CustomValidationResult. И класс CustomValidationResult, и атрибут ValidateWith существуют в одной и той же внешней библиотеке.
Для сравнения мне удалось найти вспомогательный метод:

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

static bool TypeSymbolMatchesType(ITypeSymbol typeSymbol, Type type, SemanticModel semanticModel)
{
return GetTypeSymbolForType(type, semanticModel).Equals(typeSymbol);
}

static INamedTypeSymbol GetTypeSymbolForType(Type type, SemanticModel semanticModel)
{

if (!type.IsConstructedGenericType)
{
return semanticModel.Compilation.GetTypeByMetadataName(type.FullName);
}

// get all typeInfo's for the Type arguments
var typeArgumentsTypeInfos = type.GenericTypeArguments.Select(a => GetTypeSymbolForType(a, semanticModel));

var openType = type.GetGenericTypeDefinition();
var typeSymbol = semanticModel.Compilation.GetTypeByMetadataName(openType.FullName);
return typeSymbol.Construct(typeArgumentsTypeInfos.ToArray());
}
(см. https://stackoverflow.com/a/33994426/10590099)
И это работает для bool и Task, но когда я пытаюсь получить информацию о типе CustomValidationResult, анализатор, похоже, даже не запускается. Соответствующий код выглядит следующим образом:

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

        private void AnalyzePropertySyntax(SyntaxNodeAnalysisContext context)
{
var propertyDeclaration = (PropertyDeclarationSyntax)context.Node;

context.ReportDiagnostic(Diagnostic.Create(Feedback, context.Node.GetLocation(), $"Total In List: {propertyDeclaration.AttributeLists.Count}"));

try
{
...
...

context.ReportDiagnostic(Diagnostic.Create(Feedback, context.Node.GetLocation(), "Matching Return..."));

var returnType = methodSymbol.ReturnType;
var matchBool = TypeSymbolMatchesType(returnType, typeof(bool), context.SemanticModel);
var matchBoolTask = TypeSymbolMatchesType(returnType, typeof(Task), context.SemanticModel);

var type = typeof(object);
throw new InvalidOperationException($"Type Info: {type}");
}
catch (Exception ex)
{
context.ReportDiagnostic(Diagnostic.Create(Exception, context.Node.GetLocation(), ex.ToString()));
}
}
В ходе моего тестирования вышеописанное работает, и я вижу «ошибку» с надписью Total In List: 1, чего я и ожидал. Однако если я изменю var type = typeof(object); на var type = typeof(CustomValidationResult);, все по-прежнему собирается/запускается, но я ничего не вижу в списке ошибок. p>
Я ожидал увидеть сообщение «Всего в списке...», поскольку оно всегда должно выводиться. Кроме того, если было исключение (которое должно быть, поскольку я пытаюсь его создать), но об исключении никогда не сообщается.
Это первый случай. Раз я пытаюсь создать диагностический анализатор, поэтому уверен, что упускаю что-то простое, но застрял на этом на несколько часов. Любой помощник/руководство будет принят с благодарностью. ТИА.

Подробнее здесь: https://stackoverflow.com/questions/793 ... rmation-of
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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