当我编译项目时(使用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
或者是否存在是辅助方法还是其他方法呢?
答案 0 :(得分:3)
您必须为包含该树的编译调用GetSemanticModel。因此,如果项目A依赖于B,并且您已经走到B中的语法树,则必须使用B的编译来询问B.这是因为A实际上并不“知道”B 本身,它是一个不透明的盒子。
您最好的机会可能是更多地使用工作区API。当您调用OpenProjectAsync()时,从.Solution属性中获取Solution
对象。从那里你可以更直接地浏览所有项目,如果你有一棵树,你也可以Solution.GetDocument(tree).GetSemanticModelAsync()
。