Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting a SemanticModel of a cshtml file?

Tags:

c#

roslyn

vsx

I'd like to use Roslyn to analyze semantic information within the context of a block of C# code inside a Razor View.

Is there any way (within Visual Studio 2015, or even in a unit test) to get the SemanticModel that represents this code?

like image 635
Omer Raviv Avatar asked Feb 08 '15 08:02

Omer Raviv


1 Answers

Razor files contain a C# projection buffer with the generated C# code (including the parts that you don't write yourself). This buffer has full Roslyn services and is exactly what you're looking for.

You need to walk through the TextView's BufferGraph and find the CSharp buffer; you can then get its Document and semantic model.

If you're starting from the cursor location, you need simply need to map that location to a CSharp buffer.

Note that it is perfectly legal for a TextView to contain multiple CSharp buffers. (although the Razor editor will never do that)


If you aren't working in a TextView, you need to do all of this yourself; you need to run the Razor source through the Razor compiler to get the generated C# source, then compile that with Roslyn to get a semantic model.

like image 120
SLaks Avatar answered Oct 18 '22 19:10

SLaks