我尝试使用Roslyn
和AvalonEdit
完成代码验证。
例如,用户有代码:
public void Completion(int i,int j) { }
他输入:
Completion(
所以,我想得到方法(int i, int j
)的参数并使代码完成。
我编写简单的代码,与#39;一起使用。'并且这段代码可能适用于'('字母?
public List<ICompletionData> GetCompletionData(String code,int offset,CompletionType completionType)
{
var syntaxTree = SyntaxFactory.ParseSyntaxTree(code);
var compilation = CSharpCompilation.Create("foo")
.AddReferences(Mscorlib)
.AddSyntaxTrees(syntaxTree);
var semanticModel = compilation.GetSemanticModel(syntaxTree);
var textSpan = GetTextSpan(offset,1);// '.' or '(' coordinates
ITypeSymbol lhsType = null;
if (completionType == CompletionType.DotCompletion)
{
var memberAccessNode = (MemberAccessExpressionSyntax)syntaxTree.GetRoot()
.DescendantNodes(textSpan).Last();
lhsType = semanticModel.GetTypeInfo(memberAccessNode.Expression).Type;
}
else if(completionType==CompletionType.ArgumentListCompletion)
{
var arr = syntaxTree.GetRoot().DescendantNodes(textSpan).Last();
var argumentListMode = (ArgumentListSyntax)syntaxTree.GetRoot().DescendantNodes(textSpan).Last();
var directive = argumentListMode.GetFirstDirective();
var arrgs=argumentListMode.Arguments;
//lhsType = semanticModel.GetTypeInfo(directive).Type;
//how to get lhsType?
}
if (lhsType == null)
return new List<ICompletionData>();
List<ICompletionData> completionDataColl = new List<ICompletionData>();
// and here i make completion data
foreach (var symbol in lhsType.GetMembers())
{
if (!symbol.CanBeReferencedByName
|| symbol.DeclaredAccessibility != Accessibility.Public
|| symbol.IsStatic)
continue;
}
}
问题是,我无法获得ITypeSymbol lhsType
。它是null。
如何获得lhsType
?
或者,也许我应该用另一种方式?
答案 0 :(得分:1)
我不知道代码完成(我找不到这个名为 CompletionType 的类)本身,但这里只是一种基于Roslyn的方法:语义模型和方法调用,我相信你有空(使方法调用字符串为 InvocationExpressionSyntax )
要获取方法的参数,可以从语义模型中获取其SymbolInfo。然后你得到它的符号。符号包含参数列表(参数)。
您可以拨打SemanticModel.GetSymbolInfo()
结果将为您提供symbol或候选符号(如果它是重载方法)。
方法符号将提供参数列表,该参数列表是该方法的参数。