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); }
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); } }