Ejemplo n.º 1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="symbolType">Can be a <see cref="INamedTypeSymbol"></see> or <see cref="IMethodSymbol"/>/></param>
        /// <param name="declarationSyntax">Can be a <see cref="ClassDeclarationSyntax"/>
        /// or <see cref="MethodDeclarationSyntax"/> or <see cref="DelegateDeclarationSyntax"/></param>
        public static dynamic CopyGenericConstraints(dynamic symbolType, dynamic declarationSyntax)
        {
            if (!IsGenericType(symbolType))
            {
                return(declarationSyntax);
            }
            foreach (ITypeParameterSymbol typeParameter in GetTypeParameters(symbolType))
            {
                if (!HasConstraints(typeParameter))
                {
                    continue;
                }

                TypeParameterConstraintClauseSyntax constraintSyntax = SF.TypeParameterConstraintClause(typeParameter.Name);
                if (typeParameter.HasReferenceTypeConstraint)
                {
                    constraintSyntax = constraintSyntax.AddConstraints(SF.ClassOrStructConstraint(SyntaxKind.ClassConstraint));
                }
                if (typeParameter.HasValueTypeConstraint)
                {
                    constraintSyntax = constraintSyntax.AddConstraints(SF.ClassOrStructConstraint(SyntaxKind.StructConstraint));
                }
                IEnumerable <TypeParameterConstraintSyntax> typeConstraints =
                    typeParameter.ConstraintTypes.Select(symbol => SF.TypeConstraint(SF.IdentifierName(symbol.GetFullyQualifiedName())));
                constraintSyntax = constraintSyntax.AddConstraints(typeConstraints.ToArray());

                if (typeParameter.HasConstructorConstraint)
                {
                    constraintSyntax = constraintSyntax.AddConstraints(SF.ConstructorConstraint());
                }

                declarationSyntax =
                    declarationSyntax.AddConstraintClauses(constraintSyntax);
            }
            return(declarationSyntax);
        }