Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Roslyn : How to get the Namespace of a DeclarationSyntax with Roslyn C#

I have a c# solution that contains some class files. With Roslyn I am able to parse a solution to obtain a list of projects within the solution. From there, I can get the documents in each project. Then, I can get a list of every ClassDeclarationSyntax. This is the starting point.

        foreach (var v in _solution.Projects)
        {
            //Console.WriteLine(v.Name.ToString());
            foreach (var document in v.Documents)
            {
                SemanticModel model = document.GetSemanticModelAsync().Result;
                var classes = document.GetSyntaxRootAsync().Result.DescendantNodes().OfType<ClassDeclarationSyntax>();
                foreach(var cl in classes)
                {
// Starting around this point...
                    ClassDiagramClass cls = new ClassDiagramClass(cl, model);
                    diagramClasses.Add(cls);
                }
            }
        }

From these objects I want to be able to get the Namespace of the variables used within each class. See file 1 has a method "getBar()" that returns an object of type B.Bar. The namespace is important because it tells you which type of Bar is really being returned.

File1.cs

using B;
namespace A {
    public class foo(){
        public Bar getBar(){ return new Bar();}
    }
}

File2.cs

namespace B {
    public class Bar(){
    }
}

File3.cs

namespace C {
    public class Bar(){
    }
}

The issue is that I am not sure how to get to the Namespace value from where I am in the code right now. Any ideas?

like image 844
Pangamma Avatar asked Apr 06 '15 20:04

Pangamma


1 Answers

The namespace is semantic information, so you need to get it from the semantic model:

model.GetTypeInfo(cl).Type.ContainingNamespace
like image 67
SLaks Avatar answered Nov 03 '22 00:11

SLaks