Fork me on GitHub

Roslyn如何实现简单的代码提示

    假如需要实现一个代码编辑器,其中一个很重要的功能是实现代码提示,类似VS的代码智能提示。下面用Roslyn编译器来实现一个简单的代码提示功能。

代码提示,首先必须需要知道对象的类型信息,然后通过迭代获取成员。

   

 1 static void Main(string[] args)
 2  {
 3 
 4             var code = @"
 5     using System;
 6     public class _RoslynCodeCompletionSample
 7     {
 8         public void MyMethod()
 9         {
10             var datetime = DateTime.Now;
11             datetime.
12         }
13     }";
14             //Microsoft.CodeAnalysis.CSharp namespace
15             var syntaxTree = CSharpSyntaxTree.ParseText(code);
16             //引入 DateTime 需要的程序集
17             var cscompilation =CSharpCompilation.Create("_RoslynCodeCompletionSample")
18                 .AddReferences(MetadataReference.CreateFromAssembly(typeof(DateTime).Assembly))
19                 .AddSyntaxTrees(syntaxTree);
20             var semanticModel = cscompilation.GetSemanticModel(syntaxTree);
21             //获取代码提示 datetime.中.的TextSpan对象
22             string codeIndex = "datetime.";
23             var dotTextSpan = new TextSpan(code.IndexOf(codeIndex) + codeIndex.Length-1, 1);
24             var memberAccessNode = (MemberAccessExpressionSyntax)syntaxTree.GetRoot()
25                 .DescendantNodes(dotTextSpan).Last();
26             //获取类型信息
27             var lhsType = semanticModel.GetTypeInfo(memberAccessNode.Expression).Type;
28             //获取代码提示的内容
29             foreach (var symbol in lhsType.GetMembers())
30             {
31                 if (!symbol.CanBeReferencedByName
32                     || symbol.DeclaredAccessibility != Accessibility.Public
33                     || symbol.IsStatic)
34                     continue;
35 
36                 Console.WriteLine(symbol.Name);
37             }
38             Console.ReadLine();
39 }

posted @ 2017-02-13 09:41  JackWang-CUMT  阅读(1477)  评论(0编辑  收藏  举报