2017-06-24 36 views
0

我搜索了很长时间,但没有发现任何具体的事情。运行时访问/在EnvDTE文档中查找所有变量(Visual Studio/C#/ Extension)

我为Visual Studio编写了扩展,并希望在打开的项目中查找ActiveDocument/Code文档中的所有变量/属性。有没有一种“简单”的方式来获取它们,或者我需要自己搜索它们吗?

编辑: 我想收集有关打开的文档中的变量的信息。首先,我想创建一个列表,我将其绑定到一个ListBox,用户可以在其中看到所有使用的变量(和方法参数 - 只需使用以下语法“Type VarName”)。稍后,我将给出翻译这些变量并编辑文档以改变为新语言的功能。

我希望我对自己的话题有足够的了解。

EDIT2: 标记科尔武 - MSFT的答案,解决方案和张贴了我对科尔武碱溶液 - MSFT的答案。

public void FindVariablesInDoc(EnvDTE.TextDocument haystackDoc) {  
    var objEditPt = haystackDoc.StartPoint.CreateEditPoint(); 
    var tree = CSharpSyntaxTree.ParseText(objEditPt.GetText(haystackDoc.EndPoint)); 
    var Mscorlib = MetadataReference.CreateFromFile(typeof(object).Assembly.Location); 
    var compilation = CSharpCompilation.Create("MyCompilation", syntaxTrees: new[] { tree }, references: new[] { Mscorlib }); 
    var model = compilation.GetSemanticModel(tree); 
    var variables = tree.GetRoot().DescendantNodes().Where(v => v is FieldDeclarationSyntax || v is LocalDeclarationStatementSyntax || v is PropertyDeclarationSyntax || v is ParameterSyntax); 
} 

回答

0

是否有一个“简单”的方式让他们还是需要通过自己寻找他们呢?

可以使用罗斯林找到一个EnvDTE文件的所有变量在运行时,请参考下面的示例代码(请通过安装的NuGet Microsoft.CodeAnalysis)。

DTE2 dte = this.ServiceProvider.GetService(typeof(DTE)) as DTE2; 
EnvDTE.Document doc = dte.ActiveDocument; 
EnvDTE.TextDocument tdoc = (EnvDTE.TextDocument)doc.Object("TextDocument"); 
EnvDTE.EditPoint objEditPt = tdoc.StartPoint.CreateEditPoint(); 
string text = objEditPt.GetText(tdoc.EndPoint); 
SyntaxTree tree = CSharpSyntaxTree.ParseText(text); 

IEnumerable<SyntaxNode> nodes = ((CompilationUnitSyntax)tree.GetRoot()).DescendantNodes(); 

List<LocalDeclarationStatementSyntax> variableDeclarationList = nodes 
       .OfType<LocalDeclarationStatementSyntax>().ToList(); 
+0

我需要重新安装VS15并将一些程序集放到GAC中以实现roslyn。它似乎做我想要的,但我不知道如何从你共享的代码中获取关于变量的信息。 (顺便说一下,谢谢!)我会将我的问题更改为更具体。 –

+0

我与Nuget Packages打了很长时间,因为我的项目没有使用最新版本的Microsoft.CodeAnalysis(目前2.2.0)。 –

相关问题