Search code examples
c#roslynvsx

Getting a SemanticModel of a cshtml file?


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?


Solution

  • 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.