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