Jak pobrać tokeny z kodu?

0

Cześć, tworzę prosty plugin do VS2017 (swój pierwszy) i cały dzień męczę się z pierdołą.

Otóż załóżmy, że mam takiego stringa:

public unsigned int MyProperty { get; set; }

I chciałbym teraz jakoś uzyskać taką mapę tokenów, coś w stylu:

AccessModifier: public
Type: unsigned int
Name: MyProperty

Lub też z czegoś takiego:

string field;

chciałbym uzyskać:
AccessModifier: private
Type: string
Name: field

Może też dałoby się określić, czy w przekazanym stringu znajduje się właściwość, czy pole?
Próbuję to zrobić z poziomu Command w VSIX, przeczytałem już milion stron dokumentacji i nic. Chciałbym skorzystać oczywiście z parsera (lexera?) wbudowanego w Visual Studio. Ale nie mam pojęcia jak się do tego dobrać. A biorąc pod uwagę projekt Roslyn, to na pewno można. Ktoś coś wie?

2

O taką magię chodzi?

string code = "public class T{public uint MyProperty { get; set; }}";

SyntaxTree tree = CSharpSyntaxTree.ParseText(code);
CompilationUnitSyntax root = tree.GetCompilationUnitRoot();

foreach (var token in root.DescendantTokens())
{
    Console.WriteLine(token);
}

Console.WriteLine("Has get/set: " + root.DescendantTokens().Any(x => x.Text == "get" || x.Text == "set"));

Console.WriteLine("Has an int: " + root.DescendantTokens().Any(x => x.Text == "int"));

Console.WriteLine("Has an uint: " + root.DescendantTokens().Any(x => x.Text == "uint"));        

public
class
T
{
public
uint
MyProperty
{
get
;
set
;
}
}

Has get/set: True
Has an int: False
Has an uint: True

0

CompilationUnitSyntax - dokładnie o to chodziło. Dzięki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1