In all examples when using Roslyn, you have something like this:
SyntaxTree tree = CSharpSyntaxTree.ParseText(
@"using System;
using System.Collections.Generic;
using System.Text;
namespace HelloWorld
{
// A whole program here...
}");
var root = (CompilationUnitSyntax)tree.GetRoot();
// Getting the semantic model (for MSCORELIB)
var compilation = CSharpCompilation.Create("HelloWorld")
.AddReferences(
MetadataReference.CreateFromFile(
typeof(object).Assembly.Location))
.AddSyntaxTrees(tree);
var model = compilation.GetSemanticModel(tree);
The last piece of code retrieves the semantic model for mscorelib types: MetadataReference.CreateFromFile(typeof(object).Assembly.Location) so that I can inspect usings or other parts of the source and get symbol information.
But if I define types in HelloWorld and wanted to retrieve symbol info from those, I would the semantic model. But since I just loaded mscorelib I would not get this info.
How to load the semantic model for the source I just defined?
static void Main(string[] args)
{
SyntaxTree tree = CSharpSyntaxTree.ParseText(
@"using System;
namespace HelloWorld
{
public class MyType{public void MyMethod(){}}
}"
);
var root = (CompilationUnitSyntax)tree.GetRoot();
var compilation = CSharpCompilation.Create("HelloWorld")
.AddReferences(
MetadataReference.CreateFromFile(
typeof(object).Assembly.Location))
.AddSyntaxTrees(tree);
var model = compilation.GetSemanticModel(tree);
var myTypeSyntax = root.DescendantNodes().OfType<TypeDeclarationSyntax>().First();
var myTypeInfo = model.GetDeclaredSymbol(myTypeSyntax);
Console.WriteLine(myTypeInfo);
}
Is this what you need? myTypeInfo is a type I defined in HelloWorld and I can get is info.
Just to explain, semantic model is something you can get from compilation. Once you have a compilation, you can get all the info from this compilation. Not just from the added reference (mscorlib in your case).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With