以下是我尝试使用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,我检查了调试器中的诊断信息并且它是空的(因此没有编译错误)。
我做错了什么?
答案 0 :(得分:2)
事实证明,为了获得正确的结果,您需要在句点之后(而不是句点的位置)将偏移量传递给位置。无论如何,正如我所知,最好使用最终在GitHub或即将发布的Roslyn更新中的Roslyn-master分支中公开的CompletionService。