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