/// <summary> /// Вызывается для каждого синтаксического узла в compilation, мы можем /// проверить узлы и сохранить информацию, полезную для генерации /// </summary> public void OnVisitSyntaxNode(SyntaxNode syntaxNode) { // любое поле с атрибутом -- кандидат на рассмотрение if (syntaxNode is FieldDeclarationSyntax fieldDeclarationSyntax && fieldDeclarationSyntax.AttributeLists.Count > 0) { CandidateFields.Add(fieldDeclarationSyntax); } }
public void OnVisitSyntaxNode(SyntaxNode syntaxNode) { // Business logic to decide what we're interested in goes here if (syntaxNode is FieldDeclarationSyntax fds && fds.AttributeLists.Count > 0) { CandidateFields.Add(fds); } // TODO: probably you will be interested in storing information about PrintAllFields method here }
/// <summary> /// Called for every syntax node in the compilation, we can inspect the nodes and save any information useful for generation /// </summary> public void OnVisitSyntaxNode(GeneratorSyntaxContext context) { // any field with at least one attribute is a candidate for property generation if ( context.Node is FieldDeclarationSyntax fieldDeclarationSyntax && fieldDeclarationSyntax.AttributeLists.Count > 0 ) { CandidateFields.Add(fieldDeclarationSyntax); foreach (VariableDeclaratorSyntax variable in fieldDeclarationSyntax.Declaration.Variables) { // Get the symbol being declared by the field, and keep it if its annotated var fieldSymbol = context.SemanticModel.GetDeclaredSymbol(variable) as IFieldSymbol; if (fieldSymbol.GetAttributes().Any(ad => ad.AttributeClass.ToDisplayString() == "TimeWarp.DelegateAttribute")) { Fields.Add(fieldSymbol); } } } }