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));
        }
Exemplo n.º 2
0
 public abstract Task <IMethodSymbol?> TryGetBestMatchAsync(
     Project project,
     INamedTypeSymbol type,
     StackFrameSimpleNameNode methodNode,
     StackFrameParameterList methodArguments,
     StackFrameTypeArgumentList?methodTypeArguments,
     CancellationToken cancellationToken);
Exemplo n.º 3
0
 public StackFrameMethodDeclarationNode(
     StackFrameQualifiedNameNode memberAccessExpression,
     StackFrameTypeArgumentList?typeArguments,
     StackFrameParameterList argumentList)
     : base(StackFrameKind.MethodDeclaration)
 {
     MemberAccessExpression = memberAccessExpression;
     TypeArguments          = typeArguments;
     ArgumentList           = argumentList;
 }
Exemplo n.º 4
0
        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));
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
 protected static IMethodSymbol?TryGetBestMatch(ImmutableArray <IMethodSymbol> candidateFunctions,
                                                StackFrameTypeArgumentList?methodTypeArguments,
                                                StackFrameParameterList methodArguments)
 => candidateFunctions
 .Where(m => MatchTypeArguments(m.TypeArguments, methodTypeArguments))
 .FirstOrDefault(m => MatchParameters(m.Parameters, methodArguments));
Exemplo n.º 7
0
        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);
        }