в проекте Roslyn Analyzer я хочу пометить все символы, отмеченные определенным атрибутом. Например, если символ является методом, то мне нужен этот метод (точнее, его определение, хотя это различие не столь актуально, поскольку GetAttributes
в любом случае дает мне то, что мне нужно) для проверки этого атрибута везде, где он вызывается или даже просто используется без какого-либо прямого вызова (например, как в группе методов). Точно так же я хотел бы, чтобы любые ссылки (объявление переменной, приведение, параметр типа, тип возвращаемого значения и т. д.) на определенный (именованный) тип проверялись, чтобы увидеть, украшен ли тип соответствующим атрибутом.
Теперь я подумал, что могу просто зарегистрировать действие символа, используя RegisterSymbolAction
на AnalysisContext
, но дело в том, что, хотя у меня есть возможность разбивать символы напрямую (без каких-либо синтаксических манипуляций), у меня нет SemanticModel
для интерпретации найденных символов, поскольку его нет на SymbolAnalysisContext
тип. Это означает, что я не могу даже проверить, имеет ли атрибут правильный тип, не говоря уже о любой другой связанной операции сравнения.
Теперь, из того, что я собрал из исходного кода, семантическая модель не гарантируется, что она будет действительной, когда вызов метода-обработчика, предоставленного RegisterSymbolAction
, вызывается для определенного символа (поскольку он может быть еще даже не завершен) . При этом существует ли способ одновременно получить символ (или, по крайней мере, набор встречающихся символов) и соответствующую действительную семантическую модель? Чего я пытаюсь избежать, если я могу, так это того, чтобы быть вынужденным пройти через все синтаксическое дерево (скорее всего, полученное из SemanticModelAnalysisContext
) и интерпретировать каждый узел в его потенциальном эквиваленте символа.
Я не говорю, что это неправильное решение, я просто ищу потенциальную альтернативу, о которой я не знаю. Возможно, я думал о чем-то вроде CompilationAnalysisContext
или CodeBlockAnalysisContext
, но пока мне не везло.