我正在尝试在解决方案中找到类型的所有引用。我的起点是文件(当前光标位置)内的跨度,如110:116。看看Roslyn的样本我发现我需要SymbolFinder.FindReferencesAsync(theType, solution)
。我为测试解决方案创建了File-> NewProject,然后尝试了:
Document
//我在这里失败,返回null ISymbol
(theType)//如何?我无法格式化代码belo,因此可以在此处找到更易于阅读的屏幕截图:
string fileContent =
@"using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace APISampleUnitTestsCS
{
class Class1
{
}
}";
// it doesn;t matter if I supply or not the 2 and 3 parameters
var tree = SyntaxFactory.ParseSyntaxTree(fileContent, "thePathTo_fileContent", new CSharpParseOptions());
MSBuildWorkspace workspace = MSBuildWorkspace.Create();
// Open the solution within the workspace.
Microsoft.CodeAnalysis.Solution originalSolution = workspace.OpenSolutionAsync(dte.Solution.FileName).Result;
// document is null
var document = originalSolution.GetDocument(tree);
//var textSpan = new Microsoft.CodeAnalysis.Text.TextSpan(textExtent.Span.Span.Start, asd.Span.Span.Length);
var textSpan = new Microsoft.CodeAnalysis.Text.TextSpan(110, 116); //these values are for stackoverlow question
// at least I can get TypeDeclarationSyntax. But how to extraxt the ISymbol???
var tt = tree.GetRoot().FindNode(textSpan) as Microsoft.CodeAnalysis.CSharp.Syntax.TypeDeclarationSyntax;
答案 0 :(得分:4)
solution.GetDocument(syntaxTree)
为您提供了在调用GetSyntaxTreeAsync
时为您提供语法树的文档。你无法将它传递给任意语法树 - 只有你从某个文档中获得的语法树。这只是一个方便的帮助,可以“返回”来自文件的文件。
我不确定你要从代码片段做什么,所以我要做三个猜测:
如果您正在尝试分析该解决方案中已有的文件,您应该使用originalSolution
中的解决方案对象并在那里找到文件文档。
如果您想进行分析,就像将其他树也添加到您的文档中一样,您可以调用Solution.AddDocument()
将其添加为文档,然后您可以从那里进行分析。请记住Roslyn是不可变的,当你致电Solution.AddDocument
时,你会得到一个新的分析解决方案,所以坚持它给你的东西!
如果你要做的就是找到一个你已经知道的符号,请考虑在解决方案中找到包含该类型的项目,调用GetCompilationAsync
,然后调用{{ 1}}或遍历名称空间以获取您的类型符号。