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/
声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步