public override async Task <IMethodSymbol?> TryGetBestMatchAsync( Project project, INamedTypeSymbol type, StackFrameSimpleNameNode methodNode, StackFrameParameterList methodArguments, StackFrameTypeArgumentList?methodTypeArguments, CancellationToken cancellationToken) { if (methodNode is not StackFrameLocalMethodNameNode localMethodNameNode) { return(null); } var compilation = await project.GetCompilationAsync(cancellationToken).ConfigureAwait(false); if (compilation is null) { return(null); } var containingMethodName = localMethodNameNode.EncapsulatingMethod.Identifier.ToString(); var semanticFacts = project.GetRequiredLanguageService <ISemanticFactsService>(); var candidateFunctions = type.GetMembers() .Where(member => member.Name == containingMethodName) .SelectMany(member => semanticFacts.GetLocalFunctionSymbols(compilation, member, cancellationToken)) .ToImmutableArray(); return(TryGetBestMatch(candidateFunctions, methodTypeArguments, methodArguments)); }
public abstract Task <IMethodSymbol?> TryGetBestMatchAsync( Project project, INamedTypeSymbol type, StackFrameSimpleNameNode methodNode, StackFrameParameterList methodArguments, StackFrameTypeArgumentList?methodTypeArguments, CancellationToken cancellationToken);
public StackFrameMethodDeclarationNode( StackFrameQualifiedNameNode memberAccessExpression, StackFrameTypeArgumentList?typeArguments, StackFrameParameterList argumentList) : base(StackFrameKind.MethodDeclaration) { MemberAccessExpression = memberAccessExpression; TypeArguments = typeArguments; ArgumentList = argumentList; }
public override Task <IMethodSymbol?> TryGetBestMatchAsync(Project project, INamedTypeSymbol type, StackFrameSimpleNameNode methodNode, StackFrameParameterList methodArguments, StackFrameTypeArgumentList?methodTypeArguments, CancellationToken cancellationToken) { var methodName = methodNode.ToString(); var candidateMethods = type .GetMembers() .OfType <IMethodSymbol>() .Where(m => m.Name == methodName) .ToImmutableArray(); var match = TryGetBestMatch(candidateMethods, methodTypeArguments, methodArguments); return(Task.FromResult(match)); }
protected static bool MatchParameters(ImmutableArray <IParameterSymbol> parameters, StackFrameParameterList stackFrameParameters) { if (parameters.Length != stackFrameParameters.Parameters.Length) { return(false); } for (var i = 0; i < stackFrameParameters.Parameters.Length; i++) { var stackFrameParameter = stackFrameParameters.Parameters[i]; var paramSymbol = parameters[i]; if (paramSymbol.Name != stackFrameParameter.Identifier.ToString()) { return(false); } if (!MatchType(paramSymbol.Type, stackFrameParameter.Type)) { return(false); } } return(true); }
protected static IMethodSymbol?TryGetBestMatch(ImmutableArray <IMethodSymbol> candidateFunctions, StackFrameTypeArgumentList?methodTypeArguments, StackFrameParameterList methodArguments) => candidateFunctions .Where(m => MatchTypeArguments(m.TypeArguments, methodTypeArguments)) .FirstOrDefault(m => MatchParameters(m.Parameters, methodArguments));
private static async Task <IMethodSymbol?> TryGetBestMatchAsync(Project project, string fullyQualifiedTypeName, StackFrameSimpleNameNode methodNode, StackFrameParameterList methodArguments, StackFrameTypeArgumentList?methodTypeArguments, CancellationToken cancellationToken) { var compilation = await project.GetRequiredCompilationAsync(cancellationToken).ConfigureAwait(false); var type = compilation.GetTypeByMetadataName(fullyQualifiedTypeName); if (type is null) { return(null); } foreach (var resolver in _resolvers) { var matchingMethod = await resolver.TryGetBestMatchAsync(project, type, methodNode, methodArguments, methodTypeArguments, cancellationToken).ConfigureAwait(false); if (matchingMethod is not null) { return(matchingMethod); } } return(null); }