public void SetData(WrapperProject project)
        {
            _project = project;

            if (project?.GlobalNamespaceCSharp != null)
            {
                //parseFilesButton.Enabled = true;
                AddModelNode(project.GlobalNamespaceCSharp, null);
            }
            else
            {
                //parseFilesButton.Enabled = false;
            }
        }
Beispiel #2
0
        public IActionResult CreatProject([FromBody] WrapperProject Param)
        {
            #region Validate Token
            RequestResponse isAuthorized = new Authorize().RequestTokenAuth(Request);
            if (isAuthorized.Success == false)
            {
                return(BadRequest(isAuthorized));
            }
            #endregion



            WrapperProject data = new Services.ProjectUDService().CreateSingleProject(Param.Project);

            return(Ok(data));
        }
Beispiel #3
0
        static void ReadHeaderDefinition(WrapperProject project, XmlReader reader)
        {
            string sourceRootFolder = project.SourceRootFoldersFull.Last();
            string headerPath       = Path.Combine(sourceRootFolder, reader.GetAttribute("Path"));

            headerPath = headerPath.Replace('\\', '/');
            var    header     = new HeaderDefinition(headerPath);
            string isExcluded = reader.GetAttribute("IsExcluded");

            if ("true".Equals(isExcluded))
            {
                header.IsExcluded = true;
            }

            project.HeaderDefinitions.Add(headerPath, header);

            if (reader.IsEmptyElement)
            {
                return;
            }

            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.Name)
                    {
                    case "Class":
                    case "ClassTemplate":
                    case "Enum":
                    {
                        var classes = ReadClassDefinition(project, reader, header).ToList();
                        foreach (var @class in classes)
                        {
                            project.ClassDefinitions.Add(@class.FullyQualifiedName, @class);
                        }
                    }
                    break;
                    }
                }
                else if (reader.NodeType == XmlNodeType.EndElement)
                {
                    break;
                }
            }
        }
Beispiel #4
0
        static void ReadProject(WrapperProject project, XmlReader reader)
        {
            string sourceRootFolder = null;

            while (reader.Read())
            {
                if (reader.NodeType != XmlNodeType.Element)
                {
                    continue;
                }

                switch (reader.Name)
                {
                case "HeaderDefinition":
                {
                    ReadHeaderDefinition(project, reader, sourceRootFolder);
                }
                break;

                case "NamespaceName":
                {
                    reader.Read();
                    project.NamespaceName = reader.Value;
                }
                break;

                case "SourceRootFolder":
                {
                    sourceRootFolder = reader.GetAttribute("Path");
                    sourceRootFolder = Path.Combine(Path.GetDirectoryName(project.ProjectPath), sourceRootFolder);
                    sourceRootFolder = Path.GetFullPath(sourceRootFolder);
                    project.SourceRootFolders.Add(sourceRootFolder);
                }
                break;

                case "ReplaceMapping":
                case "ScriptedMapping":
                {
                    ReadSymbolMapping(project, reader);
                }
                break;
                }
            }
        }
Beispiel #5
0
        static void ReadHeaderDefinition(WrapperProject project, XmlReader reader, string sourceRootFolder)
        {
            string headerPath = Path.Combine(sourceRootFolder, reader.GetAttribute("Path"));

            headerPath = headerPath.Replace('\\', '/');
            HeaderDefinition header     = new HeaderDefinition(headerPath);
            string           isExcluded = reader.GetAttribute("IsExcluded");

            if ("true".Equals(isExcluded))
            {
                header.IsExcluded = true;
            }

            project.HeaderDefinitions.Add(headerPath, header);

            if (reader.IsEmptyElement)
            {
                return;
            }

            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.Name)
                    {
                    case "ClassDefinition":
                    case "ClassTemplateDefinition":
                    case "EnumDefinition":
                    {
                        ReadClassDefinition(project, reader, header);
                    }
                    break;
                    }
                }
                else if (reader.NodeType == XmlNodeType.EndElement)
                {
                    break;
                }
            }
        }
        public static void Read(WrapperProject project)
        {
            var xmlSettings = new XmlReaderSettings();
            xmlSettings.Schemas.Add("urn:dotnetwrappergen", "dotnetwrappergen.xsd");
            xmlSettings.ValidationType = ValidationType.Schema;
            xmlSettings.ValidationEventHandler += (sender, args) =>
            {
                Console.WriteLine(args.Message);
            };

            using (var reader = XmlReader.Create(project.ProjectFilePath, xmlSettings))
            {
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element && reader.Name.Equals("Project"))
                    {
                        ReadProject(project, reader);
                    }
                }
            }
        }
Beispiel #7
0
        public static void Read(WrapperProject project)
        {
            var xmlSettings = new XmlReaderSettings();

            xmlSettings.Schemas.Add("urn:dotnetwrappergen", "dotnetwrappergen.xsd");
            xmlSettings.ValidationType          = ValidationType.Schema;
            xmlSettings.ValidationEventHandler += (sender, args) =>
            {
                Console.WriteLine(args.Message);
            };

            using (var reader = XmlReader.Create(project.ProjectPath, xmlSettings))
            {
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element && reader.Name.Equals("Project"))
                    {
                        ReadProject(project, reader);
                    }
                }
            }
        }
        static void ReadHeaderDefinition(WrapperProject project, XmlReader reader)
        {
            string sourceRootFolder = project.SourceRootFoldersFull.Last();
            string headerPath = Path.Combine(sourceRootFolder, reader.GetAttribute("Path"));
            headerPath = headerPath.Replace('\\', '/');
            var header = new HeaderDefinition(headerPath);
            string isExcluded = reader.GetAttribute("IsExcluded");
            if ("true".Equals(isExcluded))
            {
                header.IsExcluded = true;
            }

            project.HeaderDefinitions.Add(headerPath, header);

            if (reader.IsEmptyElement)
            {
                return;
            }

            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.Name)
                    {
                        case "Class":
                        case "ClassTemplate":
                        case "Enum":
                            {
                                ReadClassDefinition(project, reader, header);
                            }
                            break;
                    }
                }
                else if (reader.NodeType == XmlNodeType.EndElement)
                {
                    break;
                }
            }
        }
        public static void Write(WrapperProject project)
        {
            using (var writer = XmlWriter.Create(project.ProjectFilePath, new XmlWriterSettings()
            {
                Indent = true
            }))
            {
                writer.WriteStartElement("Project", "urn:dotnetwrappergen");

                WriteStringElementIfNotNull(writer, "CppProjectPath", project.CppProjectPath);
                WriteStringElementIfNotNull(writer, "CProjectPath", project.CProjectPath);
                WriteStringElementIfNotNull(writer, "CsProjectPath", project.CsProjectPath);
                WriteStringElementIfNotNull(writer, "CppCliProjectPath", project.CppCliProjectPath);

                if (project.ClassNameMapping != null)
                {
                    WriteMapping(writer, project.ClassNameMapping);
                }
                if (project.MethodNameMapping != null)
                {
                    WriteMapping(writer, project.MethodNameMapping);
                }
                if (project.ParameterNameMapping != null)
                {
                    WriteMapping(writer, project.ParameterNameMapping);
                }

                writer.WriteStartElement("NamespaceName");
                writer.WriteString(project.NamespaceName);
                writer.WriteEndElement();

                for (int i = 0; i < project.SourceRootFolders.Count; i++)
                {
                    string sourceRootFolder          = project.SourceRootFolders[i];
                    string sourceRootFolderFull      = project.SourceRootFoldersFull.ElementAt(i);
                    string sourceRootFolderCanonical = sourceRootFolderFull.Replace('\\', '/');

                    writer.WriteStartElement("SourceRootFolder");
                    writer.WriteAttributeString("Path", sourceRootFolder);

                    foreach (var header in project.HeaderDefinitions)
                    {
                        if (!header.Key.StartsWith(sourceRootFolderCanonical))
                        {
                            continue;
                        }

                        writer.WriteStartElement("Header");
                        string headerRelativePath = WrapperProject.MakeRelativePath(sourceRootFolderFull, header.Key);
                        headerRelativePath = headerRelativePath.Replace('\\', '/');
                        writer.WriteAttributeString("Path", headerRelativePath);
                        if (header.Value.IsExcluded)
                        {
                            writer.WriteAttributeString("IsExcluded", "true");
                        }
                        else
                        {
                            foreach (var @class in header.Value.Classes)
                            {
                                WriteClassDefinition(writer, @class);
                            }
                        }

                        writer.WriteEndElement();
                    }

                    writer.WriteEndElement();
                }
            }
        }
        public static void Write(WrapperProject project)
        {
            using (var writer = XmlWriter.Create(project.ProjectFilePath, new XmlWriterSettings() { Indent = true }))
            {
                writer.WriteStartElement("Project", "urn:dotnetwrappergen");

                WriteStringElementIfNotNull(writer, "CppProjectPath", project.CppProjectPath);
                WriteStringElementIfNotNull(writer, "CProjectPath", project.CProjectPath);
                WriteStringElementIfNotNull(writer, "CsProjectPath", project.CsProjectPath);
                WriteStringElementIfNotNull(writer, "CppCliProjectPath", project.CppCliProjectPath);

                if (project.ClassNameMapping != null) WriteMapping(writer, project.ClassNameMapping);
                if (project.MethodNameMapping != null) WriteMapping(writer, project.MethodNameMapping);
                if (project.ParameterNameMapping != null) WriteMapping(writer, project.ParameterNameMapping);

                writer.WriteStartElement("NamespaceName");
                writer.WriteString(project.NamespaceName);
                writer.WriteEndElement();

                for (int i = 0; i < project.SourceRootFolders.Count; i++)
                {
                    string sourceRootFolder = project.SourceRootFolders[i];
                    string sourceRootFolderFull = project.SourceRootFoldersFull.ElementAt(i);
                    string sourceRootFolderCanonical = sourceRootFolderFull.Replace('\\', '/');

                    writer.WriteStartElement("SourceRootFolder");
                    writer.WriteAttributeString("Path", sourceRootFolder);

                    foreach (var header in project.HeaderDefinitions)
                    {
                        if (!header.Key.StartsWith(sourceRootFolderCanonical)) continue;

                        writer.WriteStartElement("Header");
                        string headerRelativePath = WrapperProject.MakeRelativePath(sourceRootFolderFull, header.Key);
                        headerRelativePath = headerRelativePath.Replace('\\', '/');
                        writer.WriteAttributeString("Path", headerRelativePath);
                        if (header.Value.IsExcluded)
                        {
                            writer.WriteAttributeString("IsExcluded", "true");
                        }
                        else
                        {
                            foreach (var @class in header.Value.Classes)
                            {
                                WriteClassDefinition(writer, @class);
                            }
                        }

                        writer.WriteEndElement();
                    }

                    writer.WriteEndElement();
                }
            }
        }
        static void ReadSymbolMapping(WrapperProject project, XmlReader reader)
        {
            string mappingType = reader.Name;
            string mappingName = reader.GetAttribute("Name");
            var replacements = new Dictionary<string, string>();
            string scriptBody = null;

            if (reader.IsEmptyElement)
            {
                return;
            }

            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.Name)
                    {
                        case "Replacement":
                            {
                                string replace = reader.GetAttribute("Replace");
                                string with = reader.GetAttribute("With");
                                replacements.Add(replace, with);
                            }
                            break;
                        case "ScriptBody":
                            {
                                scriptBody = reader.ReadElementContentAsString();
                            }
                            break;
                    }
                }
                else if (reader.NodeType == XmlNodeType.EndElement)
                {
                    break;
                }
            }

            ISymbolMapping mapping;

            switch (mappingType)
            {
                case "ScriptedMapping":
                    {
                        mapping = new ScriptedMapping(mappingName, scriptBody);
                    }
                    break;
                case "ReplaceMapping":
                    {
                        mapping = new ReplaceMapping(mappingName);
                    }
                    break;
                default:
                    Console.WriteLine("Unknown mapping!");
                    return;
            }

            var replaceMapping = mapping as ReplaceMapping;
            if (replaceMapping != null)
            {
                foreach (var replacement in replacements)
                {
                    replaceMapping.Replacements.Add(replacement.Key, replacement.Value);
                }
            }

            switch (mapping.Name)
            {
                case "NameMapping":
                    project.ClassNameMapping = mapping;
                    project.HeaderNameMapping = mapping;
                    break;
                case "MethodNameMapping":
                    project.MethodNameMapping = mapping;
                    break;
                case "ParameterNameMapping":
                    project.ParameterNameMapping = mapping;
                    break;
            }
        }
Beispiel #12
0
        static void ReadClassDefinition(WrapperProject project, XmlReader reader, HeaderDefinition header, ClassDefinition parent = null)
        {
            string className = reader.GetAttribute("Name");

            ClassDefinition @class;
            string          classType = reader.Name;

            switch (classType)
            {
            case "ClassDefinition":
                @class = new ClassDefinition(className, header, parent);
                break;

            case "ClassTemplateDefinition":
                @class = new ClassTemplateDefinition(className, header, parent);
                break;

            case "EnumDefinition":
                @class = new EnumDefinition(className, header, parent);
                break;

            default:
                throw new NotImplementedException();
            }

            string namespaceName = reader.GetAttribute("Namespace");

            if (namespaceName != null)
            {
                @class.NamespaceName = namespaceName;
            }

            string isExcluded = reader.GetAttribute("IsExcluded");

            if ("true".Equals(isExcluded))
            {
                @class.IsExcluded = true;
            }
            project.ClassDefinitions.Add(@class.FullyQualifiedName, @class);

            if (reader.IsEmptyElement)
            {
                return;
            }

            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.Name)
                    {
                    case "ClassDefinition":
                    case "ClassTemplateDefinition":
                    case "EnumDefinition":
                    {
                        ReadClassDefinition(project, reader, header, @class);
                    }
                    break;
                    }
                }
                else if (reader.NodeType == XmlNodeType.EndElement)
                {
                    break;
                }
            }
        }
 public CSharpProjectWriter(WrapperProject project)
 {
     _project = project;
 }
Beispiel #14
0
        static void ReadProject(WrapperProject project, XmlReader reader)
        {
            while (reader.Read())
            {
                if (reader.NodeType != XmlNodeType.Element)
                {
                    continue;
                }

                switch (reader.Name)
                {
                case "CppProjectPath":
                {
                    project.CppProjectPath = reader.ReadElementContentAsString();
                }
                break;

                case "CProjectPath":
                {
                    project.CProjectPath = reader.ReadElementContentAsString();
                }
                break;

                case "CsProjectPath":
                {
                    project.CsProjectPath = reader.ReadElementContentAsString();
                }
                break;

                case "CppCliProjectPath":
                {
                    project.CppCliProjectPath = reader.ReadElementContentAsString();
                }
                break;

                case "Header":
                {
                    ReadHeaderDefinition(project, reader);
                }
                break;

                case "NamespaceName":
                {
                    reader.Read();
                    project.NamespaceName = reader.Value;
                }
                break;

                case "SourceRootFolder":
                {
                    string sourceRootFolder = reader.GetAttribute("Path");
                    project.SourceRootFolders.Add(sourceRootFolder);
                }
                break;

                case "ReplaceMapping":
                case "ScriptedMapping":
                {
                    ReadSymbolMapping(project, reader);
                }
                break;
                }
            }
        }
Beispiel #15
0
        static IEnumerable <ClassDefinition> ReadClassDefinition(WrapperProject project,
                                                                 XmlReader reader, HeaderDefinition header, ClassDefinition parent = null)
        {
            string className = reader.GetAttribute("Name");

            ClassDefinition @class;
            string          classType = reader.Name;

            switch (classType)
            {
            case "Class":
                @class = new ClassDefinition(className, header, parent);
                break;

            case "ClassTemplate":
                @class = new ClassTemplateDefinition(className, header, parent);
                break;

            case "Enum":
                @class = new EnumDefinition(className, header, parent);
                break;

            default:
                throw new NotImplementedException();
            }

            string namespaceName = reader.GetAttribute("Namespace");

            if (namespaceName != null)
            {
                @class.NamespaceName = namespaceName;
            }

            if ("true".Equals(reader.GetAttribute("IsExcluded")))
            {
                @class.IsExcluded = true;
            }
            if ("true".Equals(reader.GetAttribute("HasPreventDelete")))
            {
                @class.HasPreventDelete = true;
            }
            if ("true".Equals(reader.GetAttribute("MarshalAsStruct")))
            {
                @class.MarshalAsStruct = true;
            }

            if (reader.IsEmptyElement)
            {
                yield return(@class);

                yield break;
            }

            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.Name)
                    {
                    case "Class":
                    case "ClassTemplate":
                    case "Enum":
                        var classes = ReadClassDefinition(project, reader, header, @class);
                        foreach (var c in classes)
                        {
                            yield return(c);
                        }
                        break;

                    case "Method":
                        ReadMethodDefinition(reader, @class);
                        break;

                    case "TemplateParameter":
                        (@class as ClassTemplateDefinition).TemplateParameters
                        .Add(reader.ReadElementContentAsString());
                        break;
                    }
                }
                else if (reader.NodeType == XmlNodeType.EndElement)
                {
                    break;
                }
            }

            yield return(@class);
        }
        static void ReadClassDefinition(WrapperProject project, XmlReader reader, HeaderDefinition header, ClassDefinition parent = null)
        {
            string className = reader.GetAttribute("Name");

            ClassDefinition @class;
            string classType = reader.Name;
            switch (classType)
            {
                case "Class":
                    @class = new ClassDefinition(className, header, parent);
                    break;
                case "ClassTemplate":
                    @class = new ClassTemplateDefinition(className, header, parent);
                    break;
                case "Enum":
                    @class = new EnumDefinition(className, header, parent);
                    break;
                default:
                    throw new NotImplementedException();
            }

            string namespaceName = reader.GetAttribute("Namespace");
            if (namespaceName != null)
            {
                @class.NamespaceName = namespaceName;
            }

            if ("true".Equals(reader.GetAttribute("IsExcluded")))
            {
                @class.IsExcluded = true;
            }
            if ("true".Equals(reader.GetAttribute("HasPreventDelete")))
            {
                @class.HasPreventDelete = true;
            }
            project.ClassDefinitions.Add(@class.FullyQualifiedName, @class);

            if (reader.IsEmptyElement)
            {
                return;
            }

            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.Name)
                    {
                        case "Class":
                        case "ClassTemplate":
                        case "Enum":
                            {
                                ReadClassDefinition(project, reader, header, @class);
                            }
                            break;
                        case "Method":
                            {
                                ReadMethodDefinition(reader, @class);
                            }
                            break;
                    }
                }
                else if (reader.NodeType == XmlNodeType.EndElement)
                {
                    break;
                }
            }
        }
        static void ReadProject(WrapperProject project, XmlReader reader)
        {
            while (reader.Read())
            {
                if (reader.NodeType != XmlNodeType.Element)
                {
                    continue;
                }

                switch (reader.Name)
                {
                    case "CppProjectPath":
                        {
                            project.CppProjectPath = reader.ReadElementContentAsString();
                        }
                        break;
                    case "CProjectPath":
                        {
                            project.CProjectPath = reader.ReadElementContentAsString();
                        }
                        break;
                    case "CsProjectPath":
                        {
                            project.CsProjectPath = reader.ReadElementContentAsString();
                        }
                        break;
                    case "CppCliProjectPath":
                        {
                            project.CppCliProjectPath = reader.ReadElementContentAsString();
                        }
                        break;
                    case "Header":
                        {
                            ReadHeaderDefinition(project, reader);
                        }
                        break;

                    case "NamespaceName":
                        {
                            reader.Read();
                            project.NamespaceName = reader.Value;
                        }
                        break;

                    case "SourceRootFolder":
                        {
                            string sourceRootFolder = reader.GetAttribute("Path");
                            project.SourceRootFolders.Add(sourceRootFolder);
                        }
                        break;
                    case "ReplaceMapping":
                    case "ScriptedMapping":
                        {
                            ReadSymbolMapping(project, reader);
                        }
                        break;
                }
            }
        }
Beispiel #18
0
        static void ReadSymbolMapping(WrapperProject project, XmlReader reader)
        {
            string mappingType  = reader.Name;
            string mappingName  = reader.GetAttribute("Name");
            var    replacements = new Dictionary <string, string>();
            string scriptBody   = null;

            if (reader.IsEmptyElement)
            {
                return;
            }

            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.Name)
                    {
                    case "Replacement":
                    {
                        string replace = reader.GetAttribute("Replace");
                        string with    = reader.GetAttribute("With");
                        replacements.Add(replace, with);
                    }
                    break;

                    case "ScriptBody":
                    {
                        scriptBody = reader.ReadElementContentAsString();
                    }
                    break;
                    }
                }
                else if (reader.NodeType == XmlNodeType.EndElement)
                {
                    break;
                }
            }

            ISymbolMapping mapping;

            switch (mappingType)
            {
            case "ScriptedMapping":
            {
                mapping = new ScriptedMapping(mappingName, scriptBody);
            }
            break;

            case "ReplaceMapping":
            {
                mapping = new ReplaceMapping(mappingName);
            }
            break;

            default:
                Console.WriteLine("Unknown mapping!");
                return;
            }

            if (mapping is ReplaceMapping)
            {
                var replaceMapping = mapping as ReplaceMapping;
                foreach (var replacement in replacements)
                {
                    replaceMapping.Replacements.Add(replacement.Key, replacement.Value);
                }
            }

            switch (mapping.Name)
            {
            case "NameMapping":
                project.ClassNameMapping  = mapping;
                project.HeaderNameMapping = mapping;
                break;

            case "MethodNameMapping":
                project.MethodNameMapping = mapping;
                break;

            case "ParameterNameMapping":
                project.ParameterNameMapping = mapping;
                break;
            }
        }
        public static void Write(WrapperProject project)
        {
            using (var writer = XmlWriter.Create(project.ProjectPath, new XmlWriterSettings()
            {
                Indent = true
            }))
            {
                writer.WriteStartElement("Project");

                if (project.ClassNameMapping != null)
                {
                    WriteMapping(writer, project.ClassNameMapping);
                }
                if (project.MethodNameMapping != null)
                {
                    WriteMapping(writer, project.MethodNameMapping);
                }
                if (project.ParameterNameMapping != null)
                {
                    WriteMapping(writer, project.ParameterNameMapping);
                }

                writer.WriteStartElement("NamespaceName");
                writer.WriteString(project.NamespaceName);
                writer.WriteEndElement();

                foreach (string sourceRootFolder in project.SourceRootFolders)
                {
                    string sourceRootFolderCanonical = sourceRootFolder.Replace('\\', '/');

                    writer.WriteStartElement("SourceRootFolder");
                    string sourceRootFolderRelative = MakeRelativePath(project.ProjectPath, sourceRootFolder);
                    sourceRootFolderRelative = sourceRootFolderRelative.Replace('\\', '/');
                    writer.WriteAttributeString("Path", sourceRootFolderRelative);

                    foreach (var header in project.HeaderDefinitions)
                    {
                        if (!header.Key.StartsWith(sourceRootFolderCanonical))
                        {
                            continue;
                        }

                        writer.WriteStartElement("HeaderDefinition");
                        string headerRelativePath = MakeRelativePath(sourceRootFolder, header.Key);
                        headerRelativePath = headerRelativePath.Replace('\\', '/');
                        writer.WriteAttributeString("Path", headerRelativePath);
                        if (header.Value.IsExcluded)
                        {
                            writer.WriteAttributeString("IsExcluded", "true");
                        }
                        else
                        {
                            foreach (var @class in header.Value.Classes)
                            {
                                WriteClassDefinition(writer, @class);
                            }
                        }

                        writer.WriteEndElement();
                    }

                    writer.WriteEndElement();
                }
            }
        }
        static IEnumerable<ClassDefinition> ReadClassDefinition(WrapperProject project,
            XmlReader reader, HeaderDefinition header, ClassDefinition parent = null)
        {
            string className = reader.GetAttribute("Name");

            ClassDefinition @class;
            string classType = reader.Name;
            switch (classType)
            {
                case "Class":
                    @class = new ClassDefinition(className, header, parent);
                    break;
                case "ClassTemplate":
                    @class = new ClassTemplateDefinition(className, header, parent);
                    break;
                case "Enum":
                    @class = new EnumDefinition(className, header, parent);
                    break;
                default:
                    throw new NotImplementedException();
            }

            string namespaceName = reader.GetAttribute("Namespace");
            if (namespaceName != null)
            {
                @class.NamespaceName = namespaceName;
            }

            if ("true".Equals(reader.GetAttribute("IsExcluded"))) @class.IsExcluded = true;
            if ("true".Equals(reader.GetAttribute("HasPreventDelete"))) @class.HasPreventDelete = true;
            if ("true".Equals(reader.GetAttribute("MarshalAsStruct"))) @class.MarshalAsStruct = true;

            if (reader.IsEmptyElement)
            {
                yield return @class;
                yield break;
            }

            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.Name)
                    {
                        case "Class":
                        case "ClassTemplate":
                        case "Enum":
                            var classes = ReadClassDefinition(project, reader, header, @class);
                            foreach (var c in classes)
                            {
                                yield return c;
                            }
                            break;

                        case "Method":
                            ReadMethodDefinition(reader, @class);
                            break;

                        case "TemplateParameter":
                            (@class as ClassTemplateDefinition).TemplateParameters
                                .Add(reader.ReadElementContentAsString());
                            break;
                    }
                }
                else if (reader.NodeType == XmlNodeType.EndElement)
                {
                    break;
                }
            }

            yield return @class;
        }