假如需要实现一个代码编辑器,其中一个很重要的功能是实现代码提示,类似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 }