private void InitializeNonDelegatedConstructor(CancellationToken cancellationToken)
            {
                var typeParametersNames = TypeToGenerateIn.GetAllTypeParameters().Select(t => t.Name).ToImmutableArray();
                var parameterNames      = GetParameterNames(_arguments, typeParametersNames, cancellationToken);

                GetParameters(_arguments, ParameterTypes, parameterNames, cancellationToken);
            }
            internal ImmutableArray <ITypeSymbol> GetParameterTypes(CancellationToken cancellationToken)
            {
                var allTypeParameters = TypeToGenerateIn.GetAllTypeParameters();
                var semanticModel     = _document.SemanticModel;
                var allTypes          = _arguments.Select(a => _service.GetArgumentType(_document.SemanticModel, a, cancellationToken));

                return(allTypes.Select(t => FixType(t, semanticModel, allTypeParameters)).ToImmutableArray());
            }
Пример #3
0
            private void DetermineFieldType(
                SemanticDocument semanticDocument,
                CancellationToken cancellationToken)
            {
                var typeInference = semanticDocument.Document.GetLanguageService <ITypeInferenceService>();
                var inferredType  = typeInference.InferType(
                    semanticDocument.SemanticModel, SimpleNameOrMemberAccessExpressionOpt, objectAsDefault: true,
                    name: IdentifierToken.ValueText, cancellationToken: cancellationToken);

                var compilation = semanticDocument.SemanticModel.Compilation;

                inferredType = inferredType.SpecialType == SpecialType.System_Void
                    ? compilation.ObjectType
                    : inferredType;

                if (IsInConditionalAccessExpression)
                {
                    inferredType = inferredType.RemoveNullableIfPresent();
                }

                if (inferredType.IsDelegateType() && !inferredType.CanBeReferencedByName)
                {
                    var namedDelegateType = inferredType.GetDelegateType(compilation)?.DelegateInvokeMethod?.ConvertToType(compilation);
                    if (namedDelegateType != null)
                    {
                        inferredType = namedDelegateType;
                    }
                }

                // Substitute 'object' for all captured method type parameters.  Note: we may need to
                // do this for things like anonymous types, as well as captured type parameters that
                // aren't in scope in the destination type.
                var capturedMethodTypeParameters = inferredType.GetReferencedMethodTypeParameters();
                var mapping = capturedMethodTypeParameters.ToDictionary(tp => tp,
                                                                        tp => compilation.ObjectType);

                TypeMemberType = inferredType.SubstituteTypes(mapping, compilation);
                var availableTypeParameters = TypeToGenerateIn.GetAllTypeParameters();

                TypeMemberType = TypeMemberType.RemoveUnavailableTypeParameters(
                    compilation, availableTypeParameters);

                var enclosingMethodSymbol = semanticDocument.SemanticModel.GetEnclosingSymbol <IMethodSymbol>(SimpleNameOrMemberAccessExpressionOpt.SpanStart, cancellationToken);

                if (enclosingMethodSymbol != null && enclosingMethodSymbol.TypeParameters != null && enclosingMethodSymbol.TypeParameters.Length != 0)
                {
                    var combinedTypeParameters = new List <ITypeParameterSymbol>();
                    combinedTypeParameters.AddRange(availableTypeParameters);
                    combinedTypeParameters.AddRange(enclosingMethodSymbol.TypeParameters);
                    LocalType = inferredType.RemoveUnavailableTypeParameters(
                        compilation, combinedTypeParameters);
                }
                else
                {
                    LocalType = TypeMemberType;
                }
            }
            internal ImmutableArray <ITypeSymbol> GetParameterTypes(
                TService service,
                SemanticDocument document,
                CancellationToken cancellationToken)
            {
                var allTypeParameters = TypeToGenerateIn.GetAllTypeParameters();
                var semanticModel     = document.SemanticModel;
                var allTypes          = AttributeArguments != null
                    ? AttributeArguments.Select(a => service.GetAttributeArgumentType(semanticModel, a, cancellationToken))
                    : Arguments.Select(a => service.GetArgumentType(semanticModel, a, cancellationToken));

                return(allTypes.Select(t => FixType(t, semanticModel, allTypeParameters)).ToImmutableArray());
            }