刚刚在VS2015社区(以及VS2017 RC)中看到了
[
public class Class1
{
public static void Bar() { }
public static void Foo(int n)
{
Bar.
}
}
后,建议使用以下自动完成功能。
我认为后4种方法(来自Bar.
)是有道理的,因为我可以稍后添加名为object
的变量/字段,但我看不到Bar
和{{1任何意义。顺便说一句,Rider在这里有正确的行为。为了确保它不是IDE特定的问题,我尝试通过
(parameter) int n
我的第一次尝试
MemberwiseClone
但我只得到一个名为namespace Microsoft.CodeAnalysis.Recommendations
{
public static class Recommender
{
public static Task<IEnumerable<ISymbol>> GetRecommendedSymbolsAtPositionAsync(
SemanticModel semanticModel,
int position,
Workspace workspace,
OptionSet options = null,
CancellationToken cancellationToken = default(CancellationToken));
}
}
的推荐完成。
然后我在硬盘上创建了一个真实的解决方案/项目,上面有 var code = @"
namespace IntellisenseTest
{
public class Class1
{
public static void Bar() { }
public static void Foo(int n)
{
Bar.
}
}
}";
var intellisense = "Bar.";
var sourceText = SourceText.From(code);
var syntaxTree = CSharpSyntaxTree.ParseText(sourceText);
var compilation = CSharpCompilation.Create("IntellisenseTest").AddSyntaxTrees(syntaxTree);
var semanticModel = compilation.GetSemanticModel(syntaxTree);
var position = code.IndexOf(intellisense) + intellisense.Length + 1;
var workspace = MSBuildWorkspace.Create();
var symbols = await Recommender.GetRecommendedSymbolsAtPositionAsync(
semanticModel,
position,
workspace);
//print symbols
。
第二次尝试
n
Q1:上述两种实现之间有什么区别? IMO我应该得到相同的结果。
Q2:为什么罗斯林推荐这些完成? IMO string code
和var solutionPath = @"C:\workspace\IntellisenseTest\IntellisenseTest.sln";
var fileName = "Class1.cs";
var intellisense = "Bar.";
var workspace = MSBuildWorkspace.Create();
var solution = await workspace.OpenSolutionAsync(solutionPath);
var project = solution.Projects.First();
var document = project.Documents.Single(d => d.Name == fileName);
var text = await document.GetTextAsync();
var position = text.ToString().IndexOf(intellisense) + intellisense.Length + 1;
var syntaxTree = await document.GetSyntaxTreeAsync();
var compilation = await project.GetCompilationAsync();
var semanticModel = compilation.GetSemanticModel(syntaxTree);
var symbols = await Recommender.GetRecommendedSymbolsAtPositionAsync(
semanticModel,
position,
workspace);
//print symbols I got
n
ToString
Equals
GetHashCode
GetType
MemberwiseClone
没有任何意义。
答案 0 :(得分:0)
A2 :所有建议的完成都是System.Object
methods,C#中的所有类型都来源于此。
A1 :您没有对手动构建的msbuild工作区中定义System.Object
的程序集的引用。带有.sln的那个可能有它。
首次尝试时,将其添加到项目中
project = project.AddMetadataReference(
MetadataReference.CreateFromFile(typeof(System.Object).Assembly.Location));
或汇编
compilation = compilation.AddReferences(
MetadataReference.CreateFromFile(typeof(System.Object).Assembly.Location));
你应该得到相同的结果。