3

Need to find TypeSyntax or essentially Type of a specific filed in class by using Roslyn.
Something like this:

rootSyntaxNode
.DescendantNodes()
.OfType<FieldDeclarationSyntax>()
.First(x => x.Identifier="fieldName")
.GivemeTypeSyntax()

But could not get any hint about how to reach Identifier and SyntaxType in FieldDeclarationSyntax node. Any idea please?

WSK
  • 5,949
  • 8
  • 49
  • 74

1 Answers1

7

Part of the issue is that fields can contain multiple variables. You'll look at Declaration for type and Variables for identifiers. I think this is what you're looking for:

var tree = CSharpSyntaxTree.ParseText(@"
class MyClass
{
    int firstVariable, secondVariable;
    string thirdVariable;
}");

var mscorlib = MetadataReference.CreateFromFile(typeof(object).Assembly.Location);
var compilation = CSharpCompilation.Create("MyCompilation",
    syntaxTrees: new[] { tree }, references: new[] { mscorlib });

var fields = tree.GetRoot().DescendantNodes().OfType<FieldDeclarationSyntax>();

//Get a particular variable in a field
var second = fields.SelectMany(n => n.Declaration.Variables).Where(n => n.Identifier.ValueText == "secondVariable").Single();
//Get the type of both of the first two fields.
var type = fields.First().Declaration.Type;
//Get the third variable
var third = fields.SelectMany(n => n.Declaration.Variables).Where(n => n.Identifier.ValueText == "thirdVariable").Single();
JoshVarty
  • 9,066
  • 4
  • 52
  • 80
  • 1
    Maybe I'm confused by what a "field" is, but wouldn't that be 3 fields and 3 variables? Is mean isn't `int first, second;` just a short-hand synonym for `int first; int second;` or am I missing something? – Adam Plocher Aug 16 '17 at 21:38