public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var reducedFromResolution  = reader.ReadSymbolKey();
                var receiverTypeResolution = reader.ReadSymbolKey();

                var q = from m in reducedFromResolution.GetAllSymbols().OfType <IMethodSymbol>()
                        from t in receiverTypeResolution.GetAllSymbols().OfType <ITypeSymbol>()
                        let r = m.ReduceExtensionMethod(t)
                                select r;

                return(CreateSymbolInfo(q));
            }
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var reducedFromResolution = reader.ReadSymbolKey();
                var receiverTypeResolution = reader.ReadSymbolKey();

                var q = from m in reducedFromResolution.GetAllSymbols().OfType<IMethodSymbol>()
                        from t in receiverTypeResolution.GetAllSymbols().OfType<ITypeSymbol>()
                        let r = m.ReduceExtensionMethod(t)
                        select r;

                return CreateSymbolInfo(q);
            }
Beispiel #3
0
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var pointedAtTypeResolution = reader.ReadSymbolKey();

                return(CreateSymbolInfo(GetAllSymbols <ITypeSymbol>(pointedAtTypeResolution)
                                        .Select(reader.Compilation.CreatePointerTypeSymbol)));
            }
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var pointedAtTypeResolution = reader.ReadSymbolKey();

                return CreateSymbolInfo(GetAllSymbols<ITypeSymbol>(pointedAtTypeResolution)
                    .Select(reader.Compilation.CreatePointerTypeSymbol));
            }
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var metadataName = reader.ReadString();
                var containingSymbolResolution = reader.ReadSymbolKey();
                var isIndexer = reader.ReadBoolean();
                var refKinds = reader.ReadRefKindArray();
                var originalParameterTypes = reader.ReadSymbolKeyArray().Select(
                    r => GetFirstSymbol<ITypeSymbol>(r)).ToArray();

                if (originalParameterTypes.Any(s_typeIsNull))
                {
                    return default(SymbolKeyResolution);
                }

                var properties = containingSymbolResolution.GetAllSymbols().OfType<INamedTypeSymbol>()
                    .SelectMany(t => t.GetMembers())
                    .OfType<IPropertySymbol>()
                    .Where(p => p.Parameters.Length == refKinds.Length &&
                                p.MetadataName == metadataName &&
                                p.IsIndexer == isIndexer);
                var matchingProperties = properties.Where(p =>
                    ParameterRefKindsMatch(p.OriginalDefinition.Parameters, refKinds) &&
                    reader.ParameterTypesMatch(p.OriginalDefinition.Parameters, originalParameterTypes));

                return CreateSymbolInfo(matchingProperties);
            }
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var elementTypeResolution = reader.ReadSymbolKey();

                return(CreateSymbolInfo(GetAllSymbols <ITypeSymbol>(elementTypeResolution)
                                        .Select(s => reader.Compilation.CreateArrayTypeSymbol(s))));
            }
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var elementTypeResolution = reader.ReadSymbolKey();
                var rank = reader.ReadInteger();

                return CreateSymbolInfo(GetAllSymbols<ITypeSymbol>(elementTypeResolution)
                            .Select(s => reader.Compilation.CreateArrayTypeSymbol(s, rank)));
            }
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var metadataName             = reader.ReadString();
                var containingTypeResolution = reader.ReadSymbolKey();

                using var result = GetMembersOfNamedType <IEventSymbol>(containingTypeResolution, metadataName);
                return(CreateResolution(result));
            }
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var metadataName = reader.ReadString();
                var containingTypeResolution = reader.ReadSymbolKey();

                var events = GetAllSymbols<INamedTypeSymbol>(containingTypeResolution)
                    .SelectMany(t => t.GetMembers(metadataName)).OfType<IEventSymbol>();
                return CreateSymbolInfo(events);
            }
            protected sealed override SymbolKeyResolution Resolve(
                SymbolKeyReader reader, IModuleSymbol?contextualSymbol, out string?failureReason)
            {
                var containingSymbolResolution = reader.ReadSymbolKey(contextualSymbol?.ContainingSymbol, out var containingSymbolFailureReason);

                if (containingSymbolFailureReason != null)
                {
                    failureReason = $"({nameof(ModuleSymbolKey)} {nameof(containingSymbolResolution)} failed -> {containingSymbolFailureReason})";
                    return(default);
            protected sealed override SymbolKeyResolution Resolve(
                SymbolKeyReader reader, IPropertySymbol?contextualSymbol, out string?failureReason)
            {
                var metadataName = reader.ReadString();

                var containingTypeResolution = reader.ReadSymbolKey(contextualSymbol?.ContainingSymbol, out var containingTypeFailureReason);

                var isIndexer = reader.ReadBoolean();

                using var refKinds = reader.ReadRefKindArray();

                using var properties = GetMembersOfNamedType <IPropertySymbol>(containingTypeResolution, metadataName: null);
                using var result     = PooledArrayBuilder <IPropertySymbol> .GetInstance();

                // For each property that we look at, we'll have to resolve the parameter list and return type in the
                // context of that method.  This makes sure we can attempt to resolve the parameter list types against
                // error types in the property we're currently looking at.
                //
                // Because of this, we keep track of where we are in the reader.  Before resolving every parameter list,
                // we'll mark which method we're on and we'll rewind to this point.
                var beforeParametersPosition = reader.Position;

                IPropertySymbol?property = null;

                foreach (var candidate in properties)
                {
                    if (candidate.Parameters.Length != refKinds.Count ||
                        candidate.MetadataName != metadataName ||
                        candidate.IsIndexer != isIndexer ||
                        !ParameterRefKindsMatch(candidate.OriginalDefinition.Parameters, refKinds))
                    {
                        continue;
                    }

                    property = Resolve(reader, candidate);
                    if (property != null)
                    {
                        break;
                    }

                    // reset ourselves so we can check the return-type/parameters against the next candidate.
                    reader.Position = beforeParametersPosition;
                }

                if (reader.Position == beforeParametersPosition)
                {
                    // We didn't find a match.  Read through the stream one final time so we're at the correct location
                    // after this PropertySymbolKey.

                    _ = reader.ReadSymbolKeyArray <IPropertySymbol, ITypeSymbol>(
                        contextualSymbol: null, getContextualSymbol: null, failureReason: out _);
                }

                if (containingTypeFailureReason != null)
                {
                    failureReason = $"({nameof(PropertySymbolKey)} {nameof(containingTypeResolution)} failed -> {containingTypeFailureReason})";
                    return(default);
            protected sealed override SymbolKeyResolution Resolve(
                SymbolKeyReader reader, IPointerTypeSymbol?contextualSymbol, out string?failureReason)
            {
                var pointedAtTypeResolution = reader.ReadSymbolKey(contextualSymbol?.PointedAtType, out var pointedAtTypeFailureReason);

                if (pointedAtTypeFailureReason != null)
                {
                    failureReason = $"({nameof(PointerTypeSymbolKey)} {nameof(pointedAtTypeResolution)} failed -> {pointedAtTypeFailureReason})";
                    return(default);
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var metadataName = reader.ReadString();
                var containingSymbolResolution = reader.ReadSymbolKey();

                var parameters = GetAllSymbols(containingSymbolResolution).SelectMany(
                    s => Resolve(reader, s, metadataName));
                return CreateSymbolInfo(parameters);
            }
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var metadataName = reader.ReadString();
                var containingSymbolResolution = reader.ReadSymbolKey();

                var parameters = GetAllSymbols(containingSymbolResolution).SelectMany(
                    s => Resolve(reader, s, metadataName));

                return(CreateSymbolInfo(parameters));
            }
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var metadataName             = reader.ReadString();
                var containingTypeResolution = reader.ReadSymbolKey();

                var events = GetAllSymbols <INamedTypeSymbol>(containingTypeResolution)
                             .SelectMany(t => t.GetMembers(metadataName)).OfType <IEventSymbol>();

                return(CreateSymbolInfo(events));
            }
Beispiel #16
0
            protected sealed override SymbolKeyResolution Resolve(
                SymbolKeyReader reader, IArrayTypeSymbol?contextualSymbol, out string?failureReason)
            {
                var elementTypeResolution = reader.ReadSymbolKey(contextualSymbol?.ElementType, out var elementTypeFailureReason);
                var rank = reader.ReadInteger();

                if (elementTypeFailureReason != null)
                {
                    failureReason = $"({nameof(ArrayTypeSymbolKey)} {nameof(elementTypeResolution)} failed -> {elementTypeFailureReason})";
                    return(default);
            protected sealed override SymbolKeyResolution Resolve(
                SymbolKeyReader reader, IEventSymbol?contextualSymbol, out string?failureReason)
            {
                var metadataName             = reader.ReadString();
                var containingTypeResolution = reader.ReadSymbolKey(contextualSymbol?.ContainingType, out var containingTypeFailureReason);

                if (containingTypeFailureReason != null)
                {
                    failureReason = $"({nameof(EventSymbolKey)} {nameof(containingTypeResolution)} failed -> {containingTypeFailureReason})";
                    return(default);
Beispiel #18
0
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var returnRefKind = reader.ReadRefKind();
                var returnType    = reader.ReadSymbolKey();

                using var paramRefKinds = reader.ReadRefKindArray();
                using var paramTypes    = reader.ReadSymbolKeyArray <ITypeSymbol>();

                if (paramTypes.IsDefault || !(returnType.GetAnySymbol() is ITypeSymbol returnTypeSymbol))
                {
                    return(default);
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var containingSymbolResolution = reader.ReadSymbolKey();

                // Don't check ModuleIds for equality because in practice, no-one uses them,
                // and there is no way to set netmodule name programmatically using Roslyn
                var modules = GetAllSymbols<IAssemblySymbol>(containingSymbolResolution)
                    .SelectMany(a => a.Modules);

                return CreateSymbolInfo(modules);
            }
Beispiel #20
0
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var containingSymbolResolution = reader.ReadSymbolKey();

                // Don't check ModuleIds for equality because in practice, no-one uses them,
                // and there is no way to set netmodule name programmatically using Roslyn
                var modules = GetAllSymbols <IAssemblySymbol>(containingSymbolResolution)
                              .SelectMany(a => a.Modules);

                return(CreateSymbolInfo(modules));
            }
Beispiel #21
0
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var metadataName             = reader.ReadString();
                var containingTypeResolution = reader.ReadSymbolKey();
                var isIndexer = reader.ReadBoolean();

                using var refKinds       = reader.ReadRefKindArray();
                using var parameterTypes = reader.ReadSymbolKeyArray <ITypeSymbol>();

                if (parameterTypes.IsDefault)
                {
                    return(default);
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var constructedFromResolution = reader.ReadSymbolKey();
                var typeArgumentResolutions   = reader.ReadSymbolKeyArray();

                Debug.Assert(!typeArgumentResolutions.IsDefault);
                var typeArguments = typeArgumentResolutions.Select(
                    r => GetFirstSymbol <ITypeSymbol>(r)).ToArray();

                if (typeArguments.Any(s_typeIsNull))
                {
                    return(default);
Beispiel #23
0
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var metadataName = reader.ReadString();
                var containingSymbolResolution = reader.ReadSymbolKey();
                var isIndexer = reader.ReadBoolean();
                var refKinds  = reader.ReadRefKindArray();
                var originalParameterTypes = reader.ReadSymbolKeyArray().Select(
                    r => GetFirstSymbol <ITypeSymbol>(r)).ToArray();

                if (originalParameterTypes.Any(s_typeIsNull))
                {
                    return(default);
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var metadataName = reader.ReadString();
                var containingSymbolResolution = reader.ReadSymbolKey();
                var arity = reader.ReadInteger();
                var typeKind = (TypeKind)reader.ReadInteger();
                var isUnboundGenericType = reader.ReadBoolean();
                var typeArgumentsOpt = reader.ReadSymbolKeyArray();

                var types = GetAllSymbols<INamespaceOrTypeSymbol>(containingSymbolResolution).SelectMany(
                    s => Resolve(reader, s, metadataName, arity, typeKind, isUnboundGenericType, typeArgumentsOpt));
                return CreateSymbolInfo(types);
            }
Beispiel #25
0
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var pointedAtTypeResolution = reader.ReadSymbolKey();

                using var result = PooledArrayBuilder <IPointerTypeSymbol> .GetInstance(pointedAtTypeResolution.SymbolCount);

                foreach (var typeSymbol in pointedAtTypeResolution.OfType <ITypeSymbol>())
                {
                    result.AddIfNotNull(reader.Compilation.CreatePointerTypeSymbol(typeSymbol));
                }

                return(CreateResolution(result));
            }
Beispiel #26
0
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var metadataName = reader.ReadString();
                var containingSymbolResolution = reader.ReadSymbolKey();
                var arity                = reader.ReadInteger();
                var typeKind             = (TypeKind)reader.ReadInteger();
                var isUnboundGenericType = reader.ReadBoolean();
                var typeArgumentsOpt     = reader.ReadSymbolKeyArray();

                var types = GetAllSymbols <INamespaceOrTypeSymbol>(containingSymbolResolution).SelectMany(
                    s => Resolve(reader, s, metadataName, arity, typeKind, isUnboundGenericType, typeArgumentsOpt));

                return(CreateSymbolInfo(types));
            }
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var elementTypeResolution = reader.ReadSymbolKey();
                var rank = reader.ReadInteger();

                using var result = PooledArrayBuilder <IArrayTypeSymbol> .GetInstance(elementTypeResolution.SymbolCount);

                foreach (var typeSymbol in elementTypeResolution.OfType <ITypeSymbol>())
                {
                    result.AddIfNotNull(reader.Compilation.CreateArrayTypeSymbol(typeSymbol, rank));
                }

                return(CreateResolution(result));
            }
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var containingSymbolResolution = reader.ReadSymbolKey();

                using var result = PooledArrayBuilder <IModuleSymbol> .GetInstance();

                foreach (var assembly in containingSymbolResolution.OfType <IAssemblySymbol>())
                {
                    // Don't check ModuleIds for equality because in practice, no-one uses them,
                    // and there is no way to set netmodule name programmatically using Roslyn
                    result.AddValuesIfNotNull(assembly.Modules);
                }

                return(CreateResolution(result));
            }
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var metadataName = reader.ReadString();
                var isCompilationGlobalNamespace = reader.ReadBoolean();
                var containingSymbolResolution = reader.ReadSymbolKey();

                if (isCompilationGlobalNamespace)
                {
                    return new SymbolKeyResolution(reader.Compilation.GlobalNamespace);
                }

                var namespaces = GetAllSymbols(containingSymbolResolution).SelectMany(
                    s => Resolve(s, metadataName));

                return CreateSymbolInfo(namespaces);
            }
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var underlyingTypeResolution = reader.ReadSymbolKey();
                var tupleElementNames = reader.ReadStringArray();

                try
                {
                    var result = GetAllSymbols<INamedTypeSymbol>(underlyingTypeResolution).Select(
                        t => reader.Compilation.CreateTupleTypeSymbol(t, tupleElementNames));
                    return CreateSymbolInfo(result);
                }
                catch (ArgumentException)
                {
                    return new SymbolKeyResolution(reader.Compilation.ObjectType);
                }
            }
Beispiel #31
0
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var metadataName = reader.ReadString();
                var isCompilationGlobalNamespace = reader.ReadBoolean();
                var containingSymbolResolution   = reader.ReadSymbolKey();

                if (isCompilationGlobalNamespace)
                {
                    return(new SymbolKeyResolution(reader.Compilation.GlobalNamespace));
                }

                var namespaces = GetAllSymbols(containingSymbolResolution).SelectMany(
                    s => Resolve(s, metadataName));

                return(CreateSymbolInfo(namespaces));
            }
Beispiel #32
0
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var isError = reader.ReadBoolean();

                if (isError)
                {
                    var elementTypes     = reader.ReadSymbolKeyArray().SelectAsArray(r => r.GetAnySymbol() as ITypeSymbol);
                    var elementNames     = reader.ReadStringArray();
                    var elementLocations = ReadElementLocations(reader);

                    if (!elementTypes.Any(t => t == null))
                    {
                        try
                        {
                            var result = reader.Compilation.CreateTupleTypeSymbol(
                                elementTypes, elementNames, elementLocations);
                            return(new SymbolKeyResolution(result));
                        }
                        catch (ArgumentException)
                        {
                        }
                    }
                }
                else
                {
                    var underlyingTypeResolution = reader.ReadSymbolKey();
                    var elementNames             = reader.ReadStringArray();
                    var elementLocations         = ReadElementLocations(reader);

                    try
                    {
                        var result = GetAllSymbols <INamedTypeSymbol>(underlyingTypeResolution).Select(
                            t => reader.Compilation.CreateTupleTypeSymbol(t, elementNames, elementLocations));
                        return(CreateSymbolInfo(result));
                    }
                    catch (ArgumentException)
                    {
                    }
                }

                return(new SymbolKeyResolution(reader.Compilation.ObjectType));
            }
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var constructedFromResolution = reader.ReadSymbolKey();
                var typeArgumentResolutions = reader.ReadSymbolKeyArray();

                Debug.Assert(!typeArgumentResolutions.IsDefault);
                var typeArguments = typeArgumentResolutions.Select(
                    r => GetFirstSymbol<ITypeSymbol>(r)).ToArray();

                if (typeArguments.Any(s_typeIsNull))
                {
                    return default(SymbolKeyResolution);
                }

                var result = constructedFromResolution.GetAllSymbols()
                       .OfType<IMethodSymbol>()
                       .Select(m => m.Construct(typeArguments));

                return CreateSymbolInfo(result);
            }
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var name = reader.ReadString();
                var containingSymbolResolution = reader.ReadSymbolKey();
                var arity = reader.ReadInteger();
                var typeArgumentResolutions = reader.ReadSymbolKeyArray();

                var errorTypes = ResolveErrorTypes(reader, containingSymbolResolution, name, arity);

                if (typeArgumentResolutions.IsDefault)
                {
                    return(CreateSymbolInfo(errorTypes));
                }

                var typeArguments = typeArgumentResolutions.Select(
                    r => GetFirstSymbol <ITypeSymbol>(r)).ToArray();

                if (typeArguments.Any(s_typeIsNull))
                {
                    return(default);
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var localName = reader.ReadString();
                var containingSymbolResolution = reader.ReadSymbolKey();
                var ordinal = reader.ReadInteger();
                var kind = (SymbolKind)reader.ReadInteger();

                var containingSymbol = containingSymbolResolution.Symbol;
                if (containingSymbol != null)
                {
                    foreach (var symbol in EnumerateSymbols(
                        reader.Compilation, containingSymbol, kind, localName, reader.CancellationToken))
                    {
                        if (symbol.Item2 == ordinal)
                        {
                            return new SymbolKeyResolution(symbol.Item1);
                        }
                    }
                }

                return new SymbolKeyResolution();
            }
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var name = reader.ReadString();
                var containingSymbolResolution = reader.ReadSymbolKey();
                var arity = reader.ReadInteger();
                var typeArgumentResolutions = reader.ReadSymbolKeyArray();

                var errorTypes = ResolveErrorTypes(reader, containingSymbolResolution, name, arity);

                if (typeArgumentResolutions.IsDefault)
                {
                    return CreateSymbolInfo(errorTypes);
                }

                var typeArguments = typeArgumentResolutions.Select(
                    r => GetFirstSymbol<ITypeSymbol>(r)).ToArray();
                if (typeArguments.Any(s_typeIsNull))
                {
                    return default(SymbolKeyResolution);
                }

                return CreateSymbolInfo(errorTypes.Select(t => t.Construct(typeArguments)));
            }
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var name             = reader.ReadString();
                var targetResolution = reader.ReadSymbolKey();
                var filePath         = reader.ReadString();

                var syntaxTree = reader.GetSyntaxTree(filePath);

                if (syntaxTree != null)
                {
                    var target = targetResolution.GetAnySymbol();
                    if (target != null)
                    {
                        var semanticModel = reader.Compilation.GetSemanticModel(syntaxTree);
                        var result        = Resolve(semanticModel, syntaxTree.GetRoot(reader.CancellationToken), name, target, reader.CancellationToken);
                        if (result.HasValue)
                        {
                            return(result.Value);
                        }
                    }
                }

                return(default);
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var name = reader.ReadString();
                var targetResolution = reader.ReadSymbolKey();
                var filePath = reader.ReadString();

                var syntaxTree = reader.GetSyntaxTree(filePath);
                if (syntaxTree != null)
                {
                    var target = targetResolution.GetAnySymbol();
                    if (target != null)
                    {
                        var semanticModel = reader.Compilation.GetSemanticModel(syntaxTree);
                        var result = Resolve(semanticModel, syntaxTree.GetRoot(reader.CancellationToken), name, target, reader.CancellationToken);
                        if (result.HasValue)
                        {
                            return result.Value;
                        }
                    }
                }

                return default(SymbolKeyResolution);
            }
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var metadataName = reader.ReadString();
                var containingSymbolResolution = reader.ReadSymbolKey();

                var result = containingSymbolResolution.GetAllSymbols()
                    .SelectMany(s =>
                    {
                        if (s is INamedTypeSymbol)
                        {
                            return ((INamedTypeSymbol)s).TypeParameters.Where(p => p.MetadataName == metadataName);
                        }
                        else if (s is IMethodSymbol)
                        {
                            return ((IMethodSymbol)s).TypeParameters.Where(p => p.MetadataName == metadataName);
                        }
                        else
                        {
                            return SpecializedCollections.EmptyEnumerable<ITypeParameterSymbol>();
                        }
                    });
                return CreateSymbolInfo(result);
            }
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var localName = reader.ReadString();
                var containingSymbolResolution = reader.ReadSymbolKey();
                var ordinal = reader.ReadInteger();
                var kind    = (SymbolKind)reader.ReadInteger();

                var containingSymbol = containingSymbolResolution.Symbol;

                if (containingSymbol != null)
                {
                    foreach (var symbol in EnumerateSymbols(
                                 reader.Compilation, containingSymbol, kind, localName, reader.CancellationToken))
                    {
                        if (symbol.ordinal == ordinal)
                        {
                            return(new SymbolKeyResolution(symbol.symbol));
                        }
                    }
                }

                return(new SymbolKeyResolution());
            }
Beispiel #41
0
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var metadataName = reader.ReadString();
                var containingSymbolResolution = reader.ReadSymbolKey();

                var result = containingSymbolResolution.GetAllSymbols()
                             .SelectMany(s =>
                {
                    if (s is INamedTypeSymbol namedType)
                    {
                        return(namedType.TypeParameters.Where(p => p.MetadataName == metadataName));
                    }
                    else if (s is IMethodSymbol method)
                    {
                        return(method.TypeParameters.Where(p => p.MetadataName == metadataName));
                    }
                    else
                    {
                        return(SpecializedCollections.EmptyEnumerable <ITypeParameterSymbol>());
                    }
                });

                return(CreateSymbolInfo(result));
            }
            private static IMethodSymbol Resolve(
                SymbolKeyReader reader, bool isPartialMethodImplementationPart,
                IMethodSymbol method)
            {
                var originalParameterTypeResolutions = reader.ReadSymbolKeyArray();
                var returnType = GetFirstSymbol<ITypeSymbol>(reader.ReadSymbolKey());

                var originalParameterTypes = originalParameterTypeResolutions.Select(
                    r => GetFirstSymbol<ITypeSymbol>(r)).ToArray();

                if (!originalParameterTypes.Any(s_typeIsNull))
                {
                    if (reader.ParameterTypesMatch(method.OriginalDefinition.Parameters, originalParameterTypes))
                    {
                        if (returnType == null ||
                            reader.Comparer.Equals(returnType, method.ReturnType))
                        {
                            if (isPartialMethodImplementationPart)
                            {
                                method = method.PartialImplementationPart ?? method;
                            }

                            Debug.Assert(method != null);
                            return method;
                        }
                    }
                }

                return null;
            }
            public static SymbolKeyResolution Resolve(SymbolKeyReader reader)
            {
                var metadataName = reader.ReadString();
                var containingSymbolResolution = reader.ReadSymbolKey();
                var arity = reader.ReadInteger();
                var isPartialMethodImplementationPart = reader.ReadBoolean();
                var parameterRefKinds = reader.ReadRefKindArray();

                // For each method that we look at, we'll have to resolve the parameter list and
                // return type in the context of that method.  i.e. if we have Foo<T>(IList<T> list)
                // then we'll need to have marked that we're on the Foo<T> method so that we know 
                // 'T' in IList<T> resolves to.
                //
                // Because of this, we keep track of where we are in the reader.  Before resolving
                // every parameter list, we'll mark which method we're on and we'll rewind to this
                // point.
                var beforeParametersPosition = reader.Position;

                var result = new List<IMethodSymbol>();

                var namedTypes = containingSymbolResolution.GetAllSymbols().OfType<INamedTypeSymbol>();
                foreach (var namedType in namedTypes)
                {
                    var method = Resolve(reader, metadataName, arity, isPartialMethodImplementationPart,
                        parameterRefKinds, beforeParametersPosition, namedType);

                    // Note: after finding the first method that matches we stop.  That's necessary
                    // as we cache results while searching.  We don't want to override these positive
                    // matches with a negative ones if we were to continue searching.
                    if (method != null)
                    {
                        result.Add(method);
                        break;
                    }
                }

                if (reader.Position == beforeParametersPosition)
                {
                    // We didn't find any candidates.  We still need to stream through this
                    // method signature so the reader is in a proper position.
                    var parameterTypeResolutions = reader.ReadSymbolKeyArray();
                    var returnType = GetFirstSymbol<ITypeSymbol>(reader.ReadSymbolKey());
                }

                return CreateSymbolInfo(result);
            }