private RootFolderDefinition ReadRootFolder(XmlReader reader)
        {
            RootFolderDefinition rootFolder = null;

            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element)
                {
                    var name       = reader.GetAttribute("Name");
                    var isExcluded = "true".Equals(reader.GetAttribute("IsExcluded"));

                    if (reader.Name.Equals("RootFolder"))
                    {
                        var uri = new Uri(Path.GetDirectoryName(new Uri(reader.BaseURI).LocalPath) + '\\' + name);
                        rootFolder = new RootFolderDefinition(uri.AbsolutePath)
                        {
                            IsExcluded = isExcluded
                        };

                        ReadSourceItems(reader, rootFolder);
                    }
                }
            }
            return(rootFolder);
        }
Example #2
0
        public void ReplaceRootNode()
        {
            string path = Assembly.GetExecutingAssembly().Location;

            path = Path.GetDirectoryName(path);

            var root   = new RootFolderDefinition(Path.Combine(path, "CppTestProject"));
            var header = new HeaderDefinition("header1.h");

            root.AddChild(header);
            var @class = new ClassDefinition("CppClass");

            header.AddNode(@class);

            var replacement = new RootFolderDefinition(Path.Combine(path, "CppTestProject2"));

            StructureNodeReplacer.Replace(root, replacement);

            Assert.IsNull(root.Parent);
            Assert.AreEqual(0, root.Children.Count);

            Assert.IsNull(replacement.Parent);
            Assert.AreEqual(1, replacement.Children.Count);

            Assert.AreEqual(replacement, header.Parent);
        }
Example #3
0
        public void TransformAsync()
        {
            WorkAsync((s, e) =>
            {
                SetStatus(WrapperStatus.TransformingCpp);
                try
                {
                    var cloner = new StructureCloner();
                    cloner.Clone(GlobalNamespaceCpp);
                    GlobalNamespaceCSharp = cloner.RootNamespaceClone;

                    var csharpRootFolderPath = RootFolder.FullPath + "/CS-Wrapper";
                    RootFolderCSharp         = new RootFolderDefinition(csharpRootFolderPath);
                    StructureNodeReplacer.Replace(cloner.RootFolderClone, RootFolderCSharp);

                    new DotNetTransformer().Transform(GlobalNamespaceCSharp, RootFolderCSharp);
                    new BulletTransformer().Transform(GlobalNamespaceCSharp, RootFolderCSharp);
                }
                catch (Exception ex)
                {
                    //WrapperEvent.Invoke(this, new WrapperProjectEventArgs(WrapperProjectEvent.LogMessage, ex.ToString()));
                }
                SetStatus(WrapperStatus.TransformingCppDone);
            });
        }
Example #4
0
        public void Clone()
        {
            string path = Assembly.GetExecutingAssembly().Location;

            path = Path.GetDirectoryName(path);

            var root       = new RootFolderDefinition(Path.Combine(path, "CppTestProject"));
            var header     = new HeaderDefinition("header1.h");
            var @namespace = new NamespaceDefinition();
            var @class     = new ClassDefinition("CppClass");
            var @enum      = new EnumDefinition("CppEnum");

            root.AddChild(header);

            @namespace.AddChild(@class);
            header.AddNode(@class);

            @namespace.AddChild(@enum);
            header.AddNode(@enum);

            var cloner = new StructureCloner();

            cloner.Clone(@namespace);
            var rootClone          = cloner.RootFolderClone;
            var rootNamespaceClone = cloner.RootNamespaceClone;


            Assert.AreNotSame(root, rootClone);
            Assert.AreEqual(root.FullPath, rootClone.FullPath);
            Assert.AreEqual(root.Children.Count, rootClone.Children.Count);

            var headerClone = (HeaderDefinition)rootClone.Children.First();

            Assert.AreNotSame(header, headerClone);
            Assert.AreSame(rootClone, headerClone.Parent);
            Assert.AreEqual(2, headerClone.Nodes.Count);

            var classClone = (ClassDefinition)headerClone.Nodes[0];

            Assert.AreNotSame(@class, classClone);
            Assert.AreSame(headerClone, classClone.Header);
            Assert.AreEqual(@class.Name, classClone.Name);
            Assert.AreEqual(@class.Children.Count, classClone.Children.Count);
            Assert.AreSame(rootNamespaceClone, classClone.Parent);

            var enumClone = (EnumDefinition)headerClone.Nodes[1];

            Assert.AreNotSame(@enum, enumClone);
            Assert.AreSame(headerClone, enumClone.Header);
            Assert.AreEqual(@enum.Name, enumClone.Name);
            Assert.AreEqual(@enum.Children.Count, enumClone.Children.Count);
            Assert.AreSame(rootNamespaceClone, enumClone.Parent);

            Assert.AreNotSame(@namespace, rootNamespaceClone);
            Assert.AreEqual(@namespace.Children.Count, rootNamespaceClone.Children.Count);
        }
Example #5
0
 public void Transform(NamespaceDefinition globalNamespace, RootFolderDefinition rootFolder)
 {
     new PropertyGenerator().Transform(globalNamespace);
     new NativeMethodImporter().Transform(globalNamespace, rootFolder);
     RenameCodeFiles(rootFolder);
     MoveGlobalSymbolsToClasses(globalNamespace);
     new OperatorTransformer().Transform(globalNamespace, rootFolder);
     new EnumTransformer().Transform(globalNamespace, rootFolder);
     new NodeOrderer().Transform(globalNamespace, rootFolder);
 }
Example #6
0
        public void Transform(NamespaceDefinition globalNamespace, RootFolderDefinition rootFolder)
        {
            var methodsHeader = new HeaderDefinition("UnsafeNativeMethods.cs");
            var methodsClass  = new ClassDefinition("UnsafeNativeMethods");

            CreateExternMethods(globalNamespace, methodsClass);

            methodsHeader.AddNode(methodsClass);
            globalNamespace.AddChild(methodsClass);
            rootFolder.AddChild(methodsHeader);
        }
Example #7
0
        public void CodeStructureParse()
        {
            string path = Assembly.GetExecutingAssembly().Location;

            path = Path.GetDirectoryName(path);
            path = Path.Combine(path, "CppTestProject");

            RootFolderDefinition rootFolder = CodeStructureParser.Parse(path);

            Assert.AreEqual(1, rootFolder.Children.Count);
            Assert.AreEqual("header1.h", rootFolder.Children[0].Name);
        }
Example #8
0
 public void SetData(RootFolderDefinition rootFolder)
 {
     _rootFolder = rootFolder;
     if (rootFolder != null)
     {
         RefreshItemNodes(new[] { rootFolder }, fileTree.Nodes);
         fileTree.Nodes[0].Expand();
     }
     else
     {
         fileTree.Nodes.Clear();
     }
 }
Example #9
0
        public NamespaceDefinition ParseRootFolder(RootFolderDefinition rootFolder)
        {
            InitializeContext(rootFolder);

            using (_context.Index = new Index())
            {
                foreach (var sourceItem in rootFolder.Children)
                {
                    ParseSourceItem(sourceItem);
                }
                _context.Index = null;
            }

            return(_context.Namespace);
        }
        public RootFolderDefinition Load(string inputPath)
        {
            RootFolderDefinition rootFolder = null;

            using (var reader = XmlReader.Create(inputPath))
            {
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element && reader.Name.Equals("WrapperProject"))
                    {
                        rootFolder = ReadProject(reader);
                    }
                }
            }
            return(rootFolder);
        }
        private RootFolderDefinition ReadProject(XmlReader reader)
        {
            RootFolderDefinition rootFolder = null;

            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element)
                {
                    if (reader.Name.Equals("CppCodeModel"))
                    {
                        rootFolder = ReadRootFolder(reader);
                    }
                }
            }
            return(rootFolder);
        }
        public void CodeModelParse()
        {
            string path = Assembly.GetExecutingAssembly().Location;

            path = Path.GetDirectoryName(path);
            path = Path.Combine(path, "CppTestProject");

            var rootFolder = new RootFolderDefinition(path);

            var header = new HeaderDefinition("header1.h");

            rootFolder.AddChild(header);

            NamespaceDefinition globalNamespace = new CppParser().ParseRootFolder(rootFolder);

            Assert.AreEqual(1, globalNamespace.Children.Count);
        }
        private SourceItemDefinition CloneSourceItem(SourceItemDefinition item)
        {
            if (item == null)
            {
                return(null);
            }

            if (_oldToNewMapping.TryGetValue(item, out SourceItemDefinition clone))
            {
                return(clone);
            }

            if (item is HeaderDefinition)
            {
                clone = new HeaderDefinition(item.Name);
            }
            else if (item is FolderDefinition)
            {
                clone = new FolderDefinition(item.Name);
            }
            else if (item is RootFolderDefinition)
            {
                clone           = new RootFolderDefinition(item.Name);
                RootFolderClone = RootFolderClone ?? clone as RootFolderDefinition;
            }
            else
            {
                throw new NotSupportedException();
            }

            _oldToNewMapping[item] = clone;

            clone.Parent = CloneSourceItem(item.Parent);
            foreach (SourceItemDefinition child in item.Children.Where(c => !c.IsExcluded))
            {
                var childClone = CloneSourceItem(child);
                clone.Children.Add(childClone);
            }

            return(clone);
        }
        public void CreatesNativeMethodImports()
        {
            var @namespace = new NamespaceDefinition();
            var @class     = new ClassDefinition("CppClass");
            var method     = new MethodDefinition("method");

            @namespace.AddChild(@class);
            @class.AddChild(method);

            var rootFolder = new RootFolderDefinition("root");
            var header     = new HeaderDefinition("header.h");

            rootFolder.AddChild(header);

            header.AddNode(@class);

            new DotNetTransformer().Transform(@namespace, rootFolder);

            var methodsHeader = rootFolder.Children.FirstOrDefault(c => c.Name == "UnsafeNativeMethods.cs");

            Assert.IsNotNull(methodsHeader);

            var methodsClass = @namespace.Children.FirstOrDefault(c => c.Name == "UnsafeNativeMethods") as ClassDefinition;

            Assert.IsNotNull(methodsClass);

            Assert.That(methodsClass.Children, Has.Count.EqualTo(1));
            var nativeMethod = methodsClass.Methods.First();

            Assert.AreEqual("CppClass_method", nativeMethod.Name);
            Assert.IsTrue(nativeMethod.IsStatic);
            Assert.IsTrue(nativeMethod.IsExtern);

            Assert.That(nativeMethod.Parameters, Has.Length.EqualTo(1));
            var objParameter = nativeMethod.Parameters[0];

            Assert.AreEqual("obj", objParameter.Name);
        }
Example #15
0
        private void InitializeContext(RootFolderDefinition rootFolder)
        {
            _context = new CppParserContext(rootFolder)
            {
                NodeVisitor = HeaderVisitor
            };

            var classParser  = new ClassParser();
            var methodParser = new MethodParser();

            _context.DefinitionParsers.Add(CursorKind.ClassDecl, classParser);
            _context.DefinitionParsers.Add(CursorKind.ClassTemplate, classParser);
            _context.DefinitionParsers.Add(CursorKind.StructDecl, classParser);
            _context.DefinitionParsers.Add(CursorKind.EnumDecl, new EnumParser());
            _context.DefinitionParsers.Add(CursorKind.Namespace, new NamespaceParser());
            _context.DeclarationParsers.Add(CursorKind.FieldDecl, new FieldParser());
            _context.DeclarationParsers.Add(CursorKind.CxxMethod, methodParser);
            _context.DeclarationParsers.Add(CursorKind.Constructor, methodParser);

            var globalNamespace = new NamespaceDefinition("");

            _context.Namespace = globalNamespace;
        }
 public CppParserContext(RootFolderDefinition rootFolder)
 {
     RootFolder = rootFolder;
 }
 public void Transform(NamespaceDefinition globalNamespace, RootFolderDefinition rootFolder)
 {
     Order(globalNamespace);
 }
Example #18
0
 public void Transform(NamespaceDefinition globalNamespace, RootFolderDefinition rootFolder)
 {
     RenameHeaders(rootFolder);
     RenameClasses(globalNamespace);
     MoveGlobalNodes(globalNamespace);
 }