如何在项目编译的引用项目中获取任何语法树的GetSemanticModel

时间:2016-05-20 06:11:11

标签: roslyn

当我编译项目时(使用CREATE TABLE x ( id SERIAL PRIMARY KEY, ref_id INT REFERENCES x, purchase_ids INT[], EXCLUDE USING GIST(purchase_ids WITH &&) WHERE(ref_id IS NULL) ); ,我得到一个MSBuildWorkspace.Create().OpenProjectAsync().GetCompilationAsync();返回,其中包含该项目中 x 文件的 x 语法。但是该项目也引用了其他项目。我可以在Compilation的{​​{1}}属性中看到这些项目,但似乎调用References不会查看这些项目。

对于项目中某处的任意Compilation(包括引用的项目),我是否必须手动搜索根项目的每个引用的Compliation.GetSemanticModel或者是否存在是辅助方法还是其他方法呢?

1 个答案:

答案 0 :(得分:3)

您必须为包含该树的编译调用GetSemanticModel。因此,如果项目A依赖于B,并且您已经走到B中的语法树,则必须使用B的编译来询问B.这是因为A实际上并不“知道”B 本身,它是一个不透明的盒子。

您最好的机会可能是更多地使用工作区API。当您调用OpenProjectAsync()时,从.Solution属性中获取Solution对象。从那里你可以更直接地浏览所有项目,如果你有一棵树,你也可以Solution.GetDocument(tree).GetSemanticModelAsync()