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 }
水平有限,望各位园友不吝赐教!如果觉得不错,请点击推荐和关注!
出处:http://www.cnblogs.com/isaboy/
声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/isaboy/
声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。