Я новичок в Roslyn, и мне нужно написать анализатор, который поможет улучшить аннотации, допускающие значение NULL, при использовании Linq. Цель состоит в том, чтобы заставить любое использование .XYZOrDefault () сохраняться в переменной / свойстве / методу, допускающем значение NULL. Например: если мы используем «var x = SomeKindOfList.FirstOrDefault ()», «x» необходимо пометить как допускающее значение NULL. Мы будем использовать C # 8, поэтому я имею в виду NRT. Идея достижения этого заключается в следующем:
- Определение того, используются ли универсальные типы в объявлении переменной или метода
- Используйте семантическую модель, чтобы определить, является ли левая часть типа выражения типом, допускающим значение NULL.
- Если левая часть выражения не является типом, допускающим значение NULL, произведите диагностику
Я зашел так далеко со своим кодированием:
private static void AnalyzeNode(SyntaxNodeAnalysisContext context)
{
Compilation compilation = context.Compilation;
var localDeclarations = context.Node.DescendantNodes().OfType<VariableDeclarationSyntax>();
foreach (var declaration in localDeclarations)
{
// Find implicitly typed variable declarations.
if (declaration.Type.IsVar)
{
foreach (var variable in declaration.Variables)
{
var variableSymbol = ((ILocalSymbol)context.SemanticModel.GetDeclaredSymbol(variable)).Type;
var invocationSymbol = context.SemanticModel.GetOperation(variable.Initializer.Value).Type;
if (!((INamedTypeSymbol)variableSymbol).IsGenericType || declaration.Type.IsVar)
{
// For all such symbols, produce a diagnostic.
var diagnostic = Diagnostic.Create(Rule, variableSymbol.Locations[0], variableSymbol.Name);
context.ReportDiagnostic(diagnostic);
}
}
}
}
Я так много читал о том, что вы можете сделать, что на данном этапе это информационная перегрузка. Мы будем очень признательны за любые статьи, фрагменты кода или советы, которые могут дать мне еще какое-то направление!
FirstOrDefault()
возвращает ненулевое значение для таких типов значений, какbool
илиint
. Если я не ошибаюсь, он возвращает только null для ссылочных типов. Вы имеете в виду ссылочные типы, допускающие значение NULL? - person Zer0   schedule 07.04.2020FirstOrDefault
будет правильно аннотирован. Вы можете использовать ReferenceAssemblyAnnotator до тех пор, чтобы получить новейшие аннотации для BCL. - person canton7   schedule 07.04.2020Nullable<T>
- person canton7   schedule 07.04.2020System.Nullable
1`, что не имеет ничего общего с NRT. Вот что меня смутило. - person canton7   schedule 07.04.2020FirstOrDefault
аннотирован правильно: если вы используете что-то до .NET 5, используйте ReferenceAssemblyAnnotator, о котором я упоминал ранее. - person canton7   schedule 07.04.2020