public TranslationUnitPorter(CXCursor translationUnit, string ns, IBindingLocator bindingLocator) { if (translationUnit.kind != CXCursorKind.CXCursor_TranslationUnit) throw new ArgumentException (); if (string.IsNullOrWhiteSpace (ns)) throw new ArgumentException (); if (bindingLocator == null) throw new ArgumentNullException (); this.translationUnit = translationUnit; this.bindingLocator = bindingLocator; cu = SyntaxFactory.CompilationUnit (); IEnumerable<UsingDirectiveSyntax> usings = CreateUsings (); foreach (var u in usings) cu = cu.AddUsings (u); var nsDecl = CreateNamespace (ns); foreach (var c in PortClasses ()) nsDecl = nsDecl.AddMembers (c); cu = cu.AddMembers (nsDecl); }
/// <summary> /// Causes the structure if the SAT to change. It can cause leftovers (empty structures) to be present. /// </summary> private void ProcessOverridenNamespaceNames() { CompilationUnitSyntax newNode = this.node; CSharpSyntaxTree newTree = this.tree; // Removing classes var removableNodes = new List<BaseTypeDeclarationSyntax>(); foreach (var info in this.transformationInfos) { removableNodes.Add(info.OriginalNode); } // Removing the classes in the array // These classes will have another namespace assigned, this will work in case the program defines a namespace or not newNode = newNode.RemoveNodes(removableNodes, SyntaxRemoveOptions.KeepNoTrivia); // Adding classes in new namespaces foreach (var info in this.transformationInfos) { var namespaceSyntax = SyntaxFactory.NamespaceDeclaration(SyntaxFactory.IdentifierName(info.OverridenNamespace)); namespaceSyntax = namespaceSyntax.AddMembers(info.TransformedNode); // TODO: Use the cache here to feed values, the new node should be provided newNode = newNode.AddMembers(namespaceSyntax); } this.newNode = newNode; }