Wie bekomme ich Methodenargumente, um mit Roslyn eine Vervollständigung zu erreichen?
Posted: 12 Jan 2025, 16:47
Ich versuche, den Code mit Roslyn und AvalonEdit zu vervollständigen.
Zum Beispiel hat der Benutzer Code:
Und er tippt:
Ich möchte also Argumente der Methode () und vervollständige den Code.
Ich schreibe einfachen Code, der mit „.“ funktioniert. und möglicherweise funktioniert dieser Code für den Buchstaben „(“?
Das Problem ist, dass ich ITypeSymbol lhsType nicht bekommen kann. Es ist null.
Wie bekomme ich lhsType?
Oder sollte ich vielleicht einen anderen Weg verwenden?
Zum Beispiel hat der Benutzer Code:
Code: Select all
public void Completion(int i,int j) { }
Code: Select all
Completion(
Code: Select all
int i, int j
Ich schreibe einfachen Code, der mit „.“ funktioniert. und möglicherweise funktioniert dieser Code für den Buchstaben „(“?
Code: Select all
public List 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();
List completionDataColl = new List();
// and here I make completion data
foreach (var symbol in lhsType.GetMembers())
{
if (!symbol.CanBeReferencedByName
|| symbol.DeclaredAccessibility != Accessibility.Public
|| symbol.IsStatic)
continue;
}
}
Wie bekomme ich lhsType?
Oder sollte ich vielleicht einen anderen Weg verwenden?