d--b
d--b

Reputation: 5779

How to get unresolved symbols in Roslyn?

I am building a scripting engine in C# using Roslyn, and I would like to compile a piece of code from the user. In the scripting UI, the user can add references to other C# dlls that I don't know about.

In the user's code, I would like to find the symbols that are resolved looking into the known references, and the symbols that are not resolved.

For instance, I have a a dll that contains this class:

public class A {
    public static double Stuff { get; }
}

And the users adds this dll as a reference for his script. Then in his script, the user writes:

var x = A.Stuff * MyVariable;
return x;

I want to use Roslyn to compile this, and tell me that x and A.Stuff are known symbols and that MyVariable is not, so that I can infer from the code that MyVariable is a user input.

Right now I am doing this:

var syntaxTree = CSharpSyntaxTree.ParseText(usercode,
    new CSharpParseOptions(LanguageVersion.Default, DocumentationMode.None, SourceCodeKind.Script));
var mscorlib = MetadataReference.CreateFromFile(typeof(object).Assembly.Location);
var userlib = MetadataReference.CreateFromFile(userlibPath);

var compilation = CSharpCompilation.Create("MyCompilation",
            syntaxTrees: new[] { syntaxTree }, references: new[] { mscorlib, userlib });

var model = compilation.GetSemanticModel(syntaxTree);

But I don't know how to use the information from the semantic model. This is not very well documented anywhere...

Upvotes: 1

Views: 288

Answers (1)

Sergey Vasiliev
Sergey Vasiliev

Reputation: 823

You can try get variable declaration and check it:

var decl = model.GetSymbolInfo(identifier)
                .Symbol
               ?.DeclaringSyntaxReferences
                .FirstOrDefault();

Upvotes: 1

Related Questions