示例#1
0
        public static TSyntax BuildTypeParameterSyntax <TSyntax>(IHasTypeParameters itemAsT, TSyntax node,
                                                                 WhitespaceKindLookup whitespaceLookup,
                                                                 Func <TSyntax, TypeParameterListSyntax, TSyntax> addTypeParameters,
                                                                 Func <TSyntax, SyntaxList <TypeParameterConstraintClauseSyntax>, TSyntax> addTypeParameterConstraints)
            where TSyntax : SyntaxNode
        {
            // This works oddly because it uncollapses the list
            // This code is largely repeated in interface and class factories, but is very hard to refactor because of shallow Roslyn (Microsoft) architecture
            var typeParamsAndConstraints = itemAsT.TypeParameters
                                           .SelectMany(x => RDom.CSharp.GetSyntaxGroup(x))
                                           .ToList();

            var typeParameterSyntaxList = BuildSyntaxHelpers.GetTypeParameterSyntaxList(
                typeParamsAndConstraints, itemAsT.Whitespace2Set, whitespaceLookup);

            if (typeParameterSyntaxList != null)
            {
                node = addTypeParameters(node, typeParameterSyntaxList);
                var clauses = BuildSyntaxHelpers.GetTypeParameterConstraintList(
                    typeParamsAndConstraints, itemAsT.Whitespace2Set, whitespaceLookup);
                if (clauses.Any())
                {
                    node = addTypeParameterConstraints(node, clauses);
                }
            }
            return(node);
        }
示例#2
0
        private void InitializeTypeParameters(IHasTypeParameters itemAsT, SyntaxNode node, IDom parent, SemanticModel model)
        {
            if (itemAsT == null)
            {
                return;
            }

            //var symbol = ((IRoslynHasSymbol)itemAsT).Symbol as INamedTypeSymbol;
            //var interfaces = symbol.Interfaces;
            var typeParameterList = node.ChildNodes().OfType <TypeParameterListSyntax>().SingleOrDefault();

            if (typeParameterList == null)
            {
                return;
            }

            var typeParameters = typeParameterList.Parameters;

            foreach (var p in typeParameters)
            {
                var newBase = Corporation.Create(p, itemAsT, model).Single()
                              as ITypeParameter;
                itemAsT.TypeParameters.AddOrMove(newBase);
            }
        }