Recommender.GetRecommendedSymbolsAtPositionAsync返回太多符号

时间:2016-05-17 18:58:34

标签: c# intellisense roslyn

以下是我尝试使用Roslyn进行调查的C#代码:

using System;
namespace TEST
{
    public class MyClass
    {
        public static void Print()
        {
            Console.WriteLine("Hello World");
        }
    }
}

我打电话

I call IEnumerable<ISymbol> symbols = Recommender.GetRecommendedSymbolsAtPositionAsync(semanticModel,130, TheWorkspace).Result;

注意 - 字符130是第一个&#39; i&#39;在WriteLine中。

我希望获得类似于VS intellisense的smth:包括Write和WriteLine在内的几个选项的列表。相反,我得到222个符号的列表,包括一些命名空间等。如果我使用SemanticModel.LookupSymbol方法,我会得到类似的结果。

这是我的完整代码:

    public class IntellisenseVM
{ 
    private string _text = 
@"using System;
namespace TEST
{
    public class MyClass
    {
        public static void Print()
        {
            Console.WriteLine(""Hello World"");
        }
    }
}";
    const string DOC_NAME = "MyDoc.cs";

    public AdhocWorkspace TheWorkspace { get; set; }

    public IntellisenseVM()
    {
        TheWorkspace = new AdhocWorkspace();

        string projName = "NewProject";

        ProjectId projId = ProjectId.CreateNewId();

        VersionStamp versionStamp = VersionStamp.Create();

        ProjectInfo projInfo = ProjectInfo.Create(projId, versionStamp, projName, projName, LanguageNames.CSharp);


        SourceText sourceText = SourceText.From(_text);

        projInfo = projInfo.WithMetadataReferences
        (
            new MetadataReference[]
            {
                MetadataReference.CreateFromFile(typeof(object).Assembly.Location)
            }
        );

        TheWorkspace.AddProject(projInfo);


        Document doc = 
            TheWorkspace.AddDocument(this.TheWorkspace.CurrentSolution.ProjectIds[0], "MyDoc.cs", sourceText);

        SemanticModel semanticModel = doc.GetSemanticModelAsync().Result;

        IEnumerable<Diagnostic> diagnostics = semanticModel.GetDiagnostics();
        IEnumerable<ISymbol> symbols = 
            Recommender.GetRecommendedSymbolsAtPositionAsync(semanticModel, 130, TheWorkspace).Result;
    }
}

BTW,我检查了调试器中的诊断信息并且它是空的(因此没有编译错误)。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

事实证明,为了获得正确的结果,您需要在句点之后(而不是句点的位置)将偏移量传递给位置。无论如何,正如我所知,最好使用最终在GitHub或即将发布的Roslyn更新中的Roslyn-master分支中公开的CompletionService。