2017-07-14 1 views
0

J'essaie d'utiliser Roslyn pour déterminer les informations sur les objets ajoutés à une collection. Le modèle général du code est qu'un IList est passé à une méthode (que je suis en mesure d'obtenir le MethodDeclarationSytax pour), puis un certain nombre d'objets sont ajoutés à cette collection. Je dois être capable de dire où la méthode Add est appelée sur la collection transmise, qui est toujours le seul paramètre passé à la méthode.Est-ce que Roslyn peut reconnaître tous les jetons qui correspondent à une variable donnée?

J'ai seulement été capable de comprendre comment faire ceci sur la chaîne correspondant aux jetons plutôt que d'être capable de reconnaître directement qu'un jeton donné est la même variable basée sur la portée.

Comment puis-je obtenir des informations de Roslyn qui indiqueront que les jetons sont en fait des références à la même variable basée sur la portée? Y a-t-il une option pour cela dans la vue sémantique? Est-ce que la comparaison de chaînes et la vérification manuelle de la portée sont la seule option qui s'offre à moi?

public void AddColumns(IList<Column> columns) 
{ 
    Column newColumn = new Column("something"); 
    columns.Add(newColumn); 

    newColumn = new Column("somethingElse"); 
    columns.Add(newColumn); 

    Column anotherNewColumn = new Column("something else"); 
    anotherNewColumn.MakeSomeChanges("123"); 
    columns.Add(anotherNewColumn); 
} 

Dans ce code, par exemple, j'ai l'MethodDeclarationSyntax pour addColumns. Je dois être capable d'identifier les lignes 4, 7 et 11 comme étant des endroits où l'ajout est en train de se produire et, de préférence, je devrai également déterminer d'où proviennent newColumn et anotherNewColumn (lignes 3, 6 et 9).

Je peux revenir à la vérification par chaîne si je le dois, mais je m'inquiète des cas manquants qui ne correspondent pas à ce que je m'attendais car il y a aussi des exemples où les méthodes sont utilisées pour ajouter des colonnes. vraiment compliqué vraiment vite.

+0

Juste une suggestion: vous trouverez plus facile de rechercher ce genre de chose à chercher avec le bon nom - Roslyn pas Rosalyn. Je comprends qu'il est vraiment facile de faire des fautes de frappe pour des noms de produits comme celui-ci; Je n'essaie pas de critiquer. (Le nombre de fois que j'ai regardé "lambda" et j'ai réfléchi à savoir si le "b" appartient à ce domaine.) –

+0

Quant à la question réelle - je ne suis pas * sûr * si c'est ce genre d'analyse de flux de données. Cela pourrait aider les autres à répondre à votre question si vous donnez un exemple concret du type de code que vous analysez. –

+0

@JonSkeet - merci pour l'édition. Je savais même que je l'avais mal orthographié mais je ne l'ai toujours pas compris et j'ai raté le fait que je me suis trompé d'orthographe. Merci pour la capture. Je vais essayer de simuler un échantillon pour le rendre plus clair. Je suis un peu inquiet, il ne peut pas le faire aussi bien, mais il semble étrange que ce ne serait pas le cas, car il fonctionne à partir d'un arbre similaire à ce que le compilateur utilise si ma compréhension est correcte. –

Répondre

1

Vous devez utiliser l'API SemanticModel que vous pouvez obtenir à partir d'un objet Compilation pour un objet SyntaxTree spécifique faisant partie de la compilation. Avec SemanticModel vous pouvez obtenir les symboles référencés à des points spécifiques de la source, en appelant GetSymbolInfo pour l'expression du nom du paramètre (probablement un IdentifierNameSyntax).