获得所有可能的完成项目(AKA 智能感知 </跨度> 在caretIndex?或CTRL +空间完成)?
static void Main(string [] args){ var code = @“ 运用 系统 </跨度> ; 公共课测试 { public void TestMethod() { var now = DateTime.Now; 现在。 } }“; Console.WriteLine(代码);
var st = SyntaxTree.ParseText(code); var caretIndex = code.IndexOf(“now。”)+ 4;
//如何在插入符索引处获得可能的代码完成? ( 智能感知 </跨度> )}
如果你有一个 Workspace 例如,您可以使用公共推荐API Microsoft.CodeAnalysys.Workspaces 包:
Workspace
Microsoft.CodeAnalysys.Workspaces
public static class Recommender { public static IEnumerable<ISymbol> GetRecommendedSymbolsAtPosition(SemanticModel semanticModel, int position, Workspace workspace, OptionSet options = null, CancellationToken cancellationToken = default(CancellationToken)); }
它返回给定偏移处的完成符号。它没有返回关键字,但截至2016年3月,Roslyn家伙正致力于更好的公共api完成: https://github.com/dotnet/roslyn/issues/3538
Roslyn确实通过提供代码完成服务 ICompletionService 和 ICompletionProvider 接口,但它们似乎主要是内部的,并且意味着在Visual Studio中托管时可以访问。但是,可以使用几个反射黑客来获取C#代码完成类型,如图所示 ScriptCS Pad 项目。如果你可以让它工作,我希望你应该得到VS级代码完成。
ICompletionService
ICompletionProvider
或者,您可以使用Roslyn提供的公共API“手动”执行此操作。我并不熟悉它们,但以下内容应该让您开始列出成员访问点左侧的表达式成员。请注意,它忽略了扩展方法和可见性规则,没有错误处理,并且可能在许多其他方面存在缺陷。但是,可靠地执行此操作可能不符合“简单”代码完成的要求。
var code = @" using System; public class Test { public void TestMethod() { var now = DateTime.Now; now. } }"; Console.WriteLine(code); var syntaxTree = CSharpSyntaxTree.ParseText(code); var compilation = CSharpCompilation.Create("foo") .AddReferences(MetadataReference.CreateAssemblyReference(typeof(DateTime).Assembly.FullName)) .AddSyntaxTrees(syntaxTree); var semanticModel = compilation.GetSemanticModel(syntaxTree); var dotTextSpan = new TextSpan(code.IndexOf("now.") + 3, 1); var memberAccessNode = (MemberAccessExpressionSyntax)syntaxTree.GetRoot().DescendantNodes(dotTextSpan).Last(); var lhsType = semanticModel.GetTypeInfo(memberAccessNode.Expression).Type; foreach (var symbol in lhsType.GetMembers()) { if (!symbol.CanBeReferencedByName || symbol.DeclaredAccessibility != Accessibility.Public || symbol.IsStatic) continue; Console.WriteLine(symbol.Name); }
的 编辑 强> :请注意,这个答案很可能被新的Roslyn位淘汰了。