提交 7a5229f1 编写于 作者: G Gen Lu

Support triggering after dot of qualified name

上级 b0615aef
......@@ -3,7 +3,6 @@
#nullable enable
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Threading;
......@@ -45,16 +44,41 @@ protected override bool ShouldProvideCompletion(Document document, SyntaxContext
private static bool TryGetReceiverTypeSymbol(SyntaxContext syntaxContext, ISyntaxFactsService syntaxFacts, [NotNullWhen(true)] out ITypeSymbol? receiverTypeSymbol)
{
var parentNode = syntaxContext.TargetToken.Parent;
var expressionNode = syntaxFacts.GetExpressionOfMemberAccessExpression(parentNode, allowImplicitTarget: true);
var expressionNode = syntaxFacts.GetLeftSideOfDot(parentNode, allowImplicitTarget: true);
if (expressionNode != null)
if (expressionNode == null)
{
receiverTypeSymbol = syntaxContext.SemanticModel.GetTypeInfo(expressionNode).Type;
return receiverTypeSymbol != null;
receiverTypeSymbol = null;
return false;
}
receiverTypeSymbol = null;
return false;
receiverTypeSymbol = syntaxContext.SemanticModel.GetTypeInfo(expressionNode).Type;
if (receiverTypeSymbol is IErrorTypeSymbol errorTypeSymbol)
{
receiverTypeSymbol = errorTypeSymbol.CandidateSymbols.Select(s => GetSymbolType(s)).FirstOrDefault(s => s != null);
}
return receiverTypeSymbol != null;
}
private static ITypeSymbol? GetSymbolType(ISymbol symbol)
{
switch (symbol)
{
case ILocalSymbol localSymbol:
return localSymbol.Type;
case IFieldSymbol fieldSymbol:
return fieldSymbol.Type;
case IPropertySymbol propertySymbol:
return propertySymbol.Type;
case IParameterSymbol parameterSymbol:
return parameterSymbol.Type;
case IAliasSymbol aliasSymbol:
return aliasSymbol.Target as ITypeSymbol;
}
return symbol as ITypeSymbol;
}
private CompletionItem Convert(SerializableImportCompletionItem serializableItem)
......
......@@ -1267,6 +1267,12 @@ public SyntaxNode GetRightSideOfDot(SyntaxNode node)
(node as MemberAccessExpressionSyntax)?.Name;
}
public SyntaxNode GetLeftSideOfDot(SyntaxNode node, bool allowImplicitTarget)
{
return (node as QualifiedNameSyntax)?.Left ??
(node as MemberAccessExpressionSyntax)?.Expression;
}
public bool IsLeftSideOfExplicitInterfaceSpecifier(SyntaxNode node)
=> (node as NameSyntax).IsLeftSideOfExplicitInterfaceSpecifier();
......
......@@ -174,6 +174,7 @@ internal interface ISyntaxFactsService : ILanguageService
bool IsLeftSideOfDot(SyntaxNode node);
SyntaxNode GetRightSideOfDot(SyntaxNode node);
SyntaxNode GetLeftSideOfDot(SyntaxNode node, bool allowImplicitTarget = false);
bool IsRightSideOfQualifiedName(SyntaxNode node);
bool IsLeftSideOfExplicitInterfaceSpecifier(SyntaxNode node);
......
......@@ -1312,6 +1312,11 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
TryCast(node, MemberAccessExpressionSyntax)?.Name)
End Function
Public Function GetLeftSideOfDot(node As SyntaxNode, Optional allowImplicitTarget As Boolean = False) As SyntaxNode Implements ISyntaxFactsService.GetLeftSideOfDot
Return If(TryCast(node, QualifiedNameSyntax)?.Left,
TryCast(node, MemberAccessExpressionSyntax)?.GetExpressionOfMemberAccessExpression(allowImplicitTarget))
End Function
Public Function IsLeftSideOfExplicitInterfaceSpecifier(node As SyntaxNode) As Boolean Implements ISyntaxFactsService.IsLeftSideOfExplicitInterfaceSpecifier
Return IsLeftSideOfDot(node) AndAlso TryCast(node.Parent.Parent, ImplementsClauseSyntax) IsNot Nothing
End Function
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册