博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Roslyn如何实现简单的代码提示
阅读量:6234 次
发布时间:2019-06-22

本文共 1706 字,大约阅读时间需要 5 分钟。

    假如需要实现一个代码编辑器,其中一个很重要的功能是实现代码提示,类似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 namespace15             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.CanBeReferencedByName32                     || symbol.DeclaredAccessibility != Accessibility.Public33                     || symbol.IsStatic)34                     continue;35 36                 Console.WriteLine(symbol.Name);37             }38             Console.ReadLine();39 }

转载地址:http://wnqna.baihongyu.com/

你可能感兴趣的文章
WPF样式动画Trigger.EnterActions和Trigger.ExitActions(ExitActions其实可以不做任何事情)
查看>>
Linux IPC System V 消息队列
查看>>
史上最全的 UIWebview 的 JS 与 OC 交互
查看>>
RedHat下安装MySQL
查看>>
SQL Server 2016 需要单独安装 SSMS
查看>>
[译]AngularJS $apply, $digest, 和$evalAsync的比较
查看>>
小尝试一下 cocos2d
查看>>
Android 基于Android的手机邮件收发(JavaMail)之四(邮件的发送)
查看>>
BUPT2017 wintertraining(15) #3 题解
查看>>
js-ES6学习笔记-Set和Map数据结构
查看>>
Xamarin.Forms的滚动视图ScrollView
查看>>
【面试题整理】数据库的优化方案有哪些
查看>>
hdu-5015-233 Matrix-矩阵
查看>>
Android中asset文件夹和raw文件夹区别与用法
查看>>
poj3264
查看>>
Eclipse中git插件导入远程库和上传项目源代码到远程库
查看>>
linux内核剖析-IBM
查看>>
关于Snmp的Trap代码开发之坑
查看>>
TCP 函数
查看>>
CentOS添加新硬盘到新的分区(xfs/ext4) 或者添加新分区
查看>>