Example #1
0
    public LexClass Clone()
    {
        LexClass copy = MemberwiseClone() as LexClass;

        copy.functions = new List <LexFunction>();
        foreach (var fnc in functions)
        {
            var cloned = fnc.Clone();
            cloned.ownSection = copy;
            copy.functions.Add(cloned);
        }

        copy.variables = new List <LexVariable>();
        foreach (var vr in variables)
        {
            var cloned = vr.Clone();
            vr.ownSection = copy;
            copy.variables.Add(vr);
        }

        copy.classes       = new List <LexClass>();
        copy.childSections = new List <LexSection>();
        foreach (var cls in classes)
        {
            var cloned = cls.Clone();
            copy.classes.Add(cloned);
            copy.childSections.Add(cloned);
            cloned.parentLexSection = copy;
        }

        return(copy);
    }
    string GetBaseClassSetting(LexClass lexClass, List <LexClass> processed)
    {
        if (!reflectableClasses.Contains(lexClass))
        {
            return("");
        }

        if (processed.Contains(lexClass))
        {
            return("");
        }

        processed.Add(lexClass);

        string res = "";

        foreach (var cls in lexClass.baseClasses)
        {
            if (cls.lexClass == null || cls.lexClass == iobjectClass || !cls.lexClass.IsBasedOn(iobjectClass))
            {
                continue;
            }

            res += GetBaseClassSetting(cls.lexClass, processed);
            res += "\tTypeInitializer::AddBaseType(&" + lexClass.name + "::type, &" + cls.lexClass.name + "::type);\n";
        }

        return(res);
    }
Example #3
0
    void SpecializeClassName(LexClass cls, string specialize, string tempClassName, List <LexClass> newClasses, List <LexClass> allClasses)
    {
        cls.isTemplate = false;
        int pos = cls.name.IndexOf(tempClassName);

        if (pos >= 0)
        {
            pos     += tempClassName.Length;
            cls.name = cls.name.Insert(pos, "<" + specialize + ">");
        }

        string[] templates = new string[0];
        if (cls.templates != null)
        {
            templates = cls.templates.Split(',');
        }

        for (int i = 0; i < templates.Count(); i++)
        {
            int x = templates[i].IndexOf("typename");
            if (x >= 0)
            {
                templates[i] = templates[i].Remove(x, "typename".Length).Trim(' ');
            }
        }

        for (int i = 0; i < cls.functions.Count(); i++)
        {
            var func = cls.functions[i];

            if (func.returnType.definition != null)
            {
                foreach (var templ in templates)
                {
                    func.returnType.definition = func.returnType.definition.Replace(templ, specialize);
                }
            }

            foreach (var param in func.parameters)
            {
                foreach (var templ in templates)
                {
                    param.type.definition = param.type.definition.Replace(templ, specialize);
                }
            }
        }

        var fnd = allClasses.Find(x => x.name == cls.name);

        if (fnd != null)
        {
            fnd.isTemplate = false;
        }
        else
        {
            newClasses.Add(cls);
        }

        cls.classes.ForEach(x => SpecializeClassName(x, specialize, tempClassName, newClasses, allClasses));
    }
Example #4
0
    void SearchSpecializations(List <string> specializations, SourceFile src, LexClass cls)
    {
        int caret = 0;

        while (caret < src.data.Length)
        {
            caret = src.data.IndexOf(cls.shortName, caret);

            if (caret < 0)
            {
                break;
            }

            caret += cls.shortName.Length;

            string spec = ReadWord(src.data, ref caret).Trim(' ', '\n', '\t', '\r');
            if (spec.Length > 0 && spec[0] == '<' && spec[spec.Length - 1] == '>')
            {
                string sspec = spec.Substring(1, spec.Length - 2).Trim(' ', '\n', '\t', '\r');
                if (!specializations.Contains(sspec) && !cls.templates.Contains(sspec))
                {
                    specializations.Add(sspec);
                }
            }
        }
    }
    public void Generate(string outputPath, string directoriesCut, SrcMap map)
    {
        this.directoriesCut = directoriesCut;
        iobjectClass        = map.allClasses.Find(x => x.name == "::IObject");
        reflectableClasses  = map.allClasses.FindAll(x =>
        {
            return(x.IsBasedOn(iobjectClass) && !x.isTemplate && !x.isTypedef);
        }).ToList();

        GenerateHeader(outputPath);
        GenerateSource(outputPath);
    }
Example #6
0
    void RenameClass(LexClass cls, string oldName, string newName)
    {
        cls.isTypedef = true;

        int pos = cls.name.IndexOf(oldName);

        if (pos >= 0)
        {
            cls.name = cls.name.Remove(pos, oldName.Length).Insert(pos, newName);
        }

        cls.classes.ForEach(x => RenameClass(x, oldName, newName));
    }
    public void Generate(string outputPath, string directoriesCut, SrcMap map)
    {
        this.directoriesCut = directoriesCut;
        iobjectClass = map.allClasses.Find(x => x.name == "::IObject");
        reflectableClasses = map.allClasses.FindAll(x =>
        {
            return x.IsBasedOn(iobjectClass) &&  !x.isTemplate && !x.isTypedef;

        }).ToList();

        GenerateHeader(outputPath);
        GenerateSource(outputPath);
    }
Example #8
0
    public bool IsBasedOn(LexClass baseClass)
    {
        foreach (var bs in baseClasses)
        {
            if (bs.lexClass == baseClass)
            {
                return(true);
            }

            if (bs.lexClass != null && bs.lexClass.IsBasedOn(baseClass))
            {
                return(true);
            }
        }

        return(false);
    }
Example #9
0
    void ProcessTypedefs(LexSection section)
    {
        foreach (var tpd in section.typedefs)
        {
            LexClass defClass = section.FindLexSection(tpd.value) as LexClass;
            if (defClass == null)
            {
                continue;
            }

            LexClass newClass = defClass.Clone();
            string   oldName  = newClass.shortName;
            newClass.shortName = tpd.name;
            RenameClass(newClass, newClass.name, section.name + "::" + newClass.shortName);
            section.classes.Add(newClass);
            section.childSections.Add(newClass);
        }

        section.childSections.ForEach(x => ProcessTypedefs(x));
    }
Example #10
0
    void SpecializeTemplates(SrcMap srcMap)
    {
        List <LexClass> newClasses = new List <LexClass>();

        foreach (var cls in srcMap.allClasses)
        {
            if (!cls.isTemplate)
            {
                continue;
            }

            if (cls.shortName[cls.shortName.Length - 1] == '>')
            {
                continue;
            }

            List <string> specializations = new List <string>();

            foreach (var src in srcMap.headers)
            {
                SearchSpecializations(specializations, src, cls);
            }

            /*foreach (var src in srcMap.sources)
             *      SearchSpecializations(specializations, src, cls);*/

            //Console.Write("Found " + specializations.Count() + " specializations for " + cls.name + "\n");

            foreach (var spec in specializations)
            {
                LexClass newClass = cls.Clone();
                newClass.shortName += "<" + spec + ">";
                newClass.isTemplate = false;
                SpecializeClassName(newClass, spec, cls.shortName, newClasses, srcMap.allClasses);
                cls.parentLexSection.classes.Add(newClass);
                cls.parentLexSection.childSections.Add(newClass);
            }
        }

        newClasses.ForEach(x => srcMap.allClasses.Add(x));
    }
    string GetBaseClassSetting(LexClass lexClass, List<LexClass> processed)
    {
        if (!reflectableClasses.Contains(lexClass))
            return "";

        if (processed.Contains(lexClass))
            return "";

        processed.Add(lexClass);

        string res = "";

        foreach (var cls in lexClass.baseClasses)
        {
            if (cls.lexClass == null || cls.lexClass == iobjectClass || !cls.lexClass.IsBasedOn(iobjectClass))
                continue;

            res += GetBaseClassSetting(cls.lexClass, processed);
            res += "\tTypeInitializer::AddBaseType(&" + lexClass.name + "::type, &" + cls.lexClass.name + "::type);\n";
        }

        return res;
    }
Example #12
0
        static void PrintClass(LexClass cls, string indent)
        {
            Console.Write(indent + "-----------------\n" + indent + "//" + (cls.comment != null ? cls.comment.comment : "") + "\n" + indent + "class: " + cls.name + ":");

            cls.baseClasses.ForEach(x => Console.Write(x.type + " " + x.className + ", "));

            Console.Write("\n" + indent + "{\n");

//          Console.Write(indent + "  Classes: \n");
//          cls.classes.ForEach(x => PrintClass(x, indent + "    "));

            Console.Write("\n" + indent + "  Variables: \n");
            cls.variables.ForEach(x => Console.Write(indent + "  //" + (x.comment != null ? x.comment.comment:"") + "\n" + indent + "  " + x.protectLevel + " " + x.type.definition + " " + x.name + "\n"));

            Console.Write("\n" + indent + "  Functions: \n");
            cls.functions.ForEach(x =>
            {
                Console.Write(indent + "  //" + (x.comment != null ? x.comment.comment : "") + "\n" + indent + "  " + x.protectLevel + " " + x.returnType.definition + " " + x.name + "(");
                x.parameters.ForEach(y => Console.Write(y.type.definition + " " + y.name + ", "));
                Console.Write(")\n");
            });

            Console.Write(indent + "}\n");
        }
Example #13
0
        static void PrintClass(LexClass cls, string indent)
        {
            Console.Write(indent + "-----------------\n" + indent + "//" + (cls.comment !=null ? cls.comment.comment : "") + "\n" + indent + "class: " + cls.name + ":");

            cls.baseClasses.ForEach(x => Console.Write(x.type + " " + x.className + ", "));

            Console.Write("\n" + indent + "{\n");

            // 			Console.Write(indent + "  Classes: \n");
            // 			cls.classes.ForEach(x => PrintClass(x, indent + "    "));

            Console.Write("\n" + indent + "  Variables: \n");
            cls.variables.ForEach(x => Console.Write(indent + "  //" + (x.comment !=null ? x.comment.comment:"") + "\n" + indent + "  " + x.protectLevel + " " + x.type.definition + " " + x.name + "\n"));

            Console.Write("\n" + indent + "  Functions: \n");
            cls.functions.ForEach(x =>
            {
                Console.Write(indent + "  //" + (x.comment !=null ? x.comment.comment : "") + "\n" + indent + "  " + x.protectLevel + " " + x.returnType.definition + " " + x.name + "(");
                x.parameters.ForEach(y => Console.Write(y.type.definition + " " + y.name + ", "));
                Console.Write(")\n");
            });

            Console.Write(indent + "}\n");
        }
Example #14
0
    void ParseClassOrStruct(LexSection section, ref int caret, ref ProtectLevel protectionLevel, bool isstruct)
    {
        int begin = caret;

        if (isstruct) caret += "struct".Length;
        else caret += "class".Length;

        string className = ReadWord(section.data, ref caret, " \n\t\r:;/");
        string afterName = ReadWord(section.data, ref caret, ";{/").Trim(' ', ':', '\r', '\n', '\t');

        string shortClassName = className;

        if (section.GetType() == typeof(LexClass))
            className = (section as LexClass).name + "::" + className;
        else
            className = (section as LexNamespace).name + "::" + className;

        LexClass newClass = new LexClass()
        {
            begin = begin,
            end = caret,
            data = section.data.Substring(begin, caret - begin),
            name = className,
            shortName = shortClassName,
            source = source,
            parentLexSection = section,
            protectLevel = protectionLevel,
            haveBody = false,
            isTemplate = isNextLexTemplate
        };

        if (isNextLexTemplate)
            newClass.templates = templatesBuffer;

        isNextLexTemplate = false;

        if (afterName.Length > 0)
        {
            var baseClasses = Split(afterName, ',');

            foreach (var baseClass in baseClasses)
            {
                string trimmedBaseClass = baseClass.Trim();

                int spacePos = trimmedBaseClass.IndexOf(' ');
                if (spacePos < 0)
                {
                    newClass.baseClasses.Add(new LexClass.BaseClassDef()
                    {
                        type = ProtectLevel.Private,
                        className = trimmedBaseClass
                    });
                }
                else
                {
                    string sectionTypeName = trimmedBaseClass.Substring(0, spacePos);
                    string baseClassName = trimmedBaseClass.Substring(spacePos + 1);

                    if (baseClassName.StartsWith("virtual"))
                        baseClassName = baseClassName.Substring("virtual".Length + 1);

                    ProtectLevel sectionType = ProtectLevel.Private;

                    if (sectionTypeName == "public")
                        sectionType = ProtectLevel.Public;
                    else if (sectionTypeName == "protected")
                        sectionType = ProtectLevel.Protected;

                    newClass.baseClasses.Add(new LexClass.BaseClassDef()
                    {
                        type = sectionType,
                        className = baseClassName
                    });
                }
            }
        }

        if (caret < section.data.Length && section.data[caret] == '/')
        {
            string comment = ReadWord(section.data, ref caret, "\n");
            ReadWord(section.data, ref caret, ";{/");

            newClass.comment = new LexComment() { comment = comment };
        }

        if (caret < section.data.Length && section.data[caret] == '{')
        {
            int sectionBegin = caret;
            newClass.data = ReadBlock(section.data, ref caret).Trim('{', '}', ' ', '\n', '\r', '\t');
            newClass.haveBody = true;

            section.classes.Add(newClass);
            section.childSections.Add(newClass);

            ParseLexSection(newClass, isstruct ? ProtectLevel.Public : ProtectLevel.Private);
        }
    }
Example #15
0
    void SpecializeClassName(LexClass cls, string specialize, string tempClassName, List<LexClass> newClasses, List<LexClass> allClasses)
    {
        cls.isTemplate = false;
        int pos = cls.name.IndexOf(tempClassName);
        if (pos >= 0)
        {
            pos += tempClassName.Length;
            cls.name = cls.name.Insert(pos, "<" + specialize + ">");
        }

        string[] templates = new string[0];
        if (cls.templates != null)
            templates = cls.templates.Split(',');

        for (int i = 0; i < templates.Count(); i++)
        {
            int x = templates[i].IndexOf("typename");
            if (x >= 0)
                templates[i] = templates[i].Remove(x, "typename".Length).Trim(' ');
        }

        for (int i = 0; i < cls.functions.Count(); i++)
        {
            var func = cls.functions[i];

            if (func.returnType.definition != null)
            {
                foreach (var templ in templates)
                    func.returnType.definition = func.returnType.definition.Replace(templ, specialize);
            }

            foreach (var param in func.parameters)
            {
                foreach (var templ in templates)
                    param.type.definition = param.type.definition.Replace(templ, specialize);
            }
        }

        var fnd = allClasses.Find(x => x.name == cls.name);
        if (fnd != null)
            fnd.isTemplate = false;
        else
            newClasses.Add(cls);

        cls.classes.ForEach(x => SpecializeClassName(x, specialize, tempClassName, newClasses, allClasses));
    }
Example #16
0
    void SearchSpecializations(List<string> specializations, SourceFile src, LexClass cls)
    {
        int caret = 0;
        while (caret < src.data.Length)
        {
            caret = src.data.IndexOf(cls.shortName, caret);

            if (caret < 0)
                break;

            caret += cls.shortName.Length;

            string spec = ReadWord(src.data, ref caret).Trim(' ', '\n', '\t', '\r');
            if (spec.Length > 0 && spec[0] == '<' && spec[spec.Length - 1] == '>')
            {
                string sspec = spec.Substring(1, spec.Length - 2).Trim(' ', '\n', '\t', '\r');
                if (!specializations.Contains(sspec) && !cls.templates.Contains(sspec))
                    specializations.Add(sspec);
            }
        }
    }
Example #17
0
    void RenameClass(LexClass cls, string oldName, string newName)
    {
        cls.isTypedef = true;

        int pos = cls.name.IndexOf(oldName);
        if (pos >= 0)
            cls.name = cls.name.Remove(pos, oldName.Length).Insert(pos, newName);

        cls.classes.ForEach(x => RenameClass(x, oldName, newName));
    }
    public bool IsBasedOn(LexClass baseClass)
    {
        foreach (var bs in baseClasses)
        {
            if (bs.lexClass == baseClass)
                return true;

            if (bs.lexClass != null && bs.lexClass.IsBasedOn(baseClass))
                return true;
        }

        return false;
    }
Example #19
0
    void ParseClassOrStruct(LexSection section, ref int caret, ref ProtectLevel protectionLevel, bool isstruct)
    {
        int begin = caret;

        if (isstruct)
        {
            caret += "struct".Length;
        }
        else
        {
            caret += "class".Length;
        }

        string className = ReadWord(section.data, ref caret, " \n\t\r:;/");
        string afterName = ReadWord(section.data, ref caret, ";{/").Trim(' ', ':', '\r', '\n', '\t');

        string shortClassName = className;

        if (section.GetType() == typeof(LexClass))
        {
            className = (section as LexClass).name + "::" + className;
        }
        else
        {
            className = (section as LexNamespace).name + "::" + className;
        }

        LexClass newClass = new LexClass()
        {
            begin            = begin,
            end              = caret,
            data             = section.data.Substring(begin, caret - begin),
            name             = className,
            shortName        = shortClassName,
            source           = source,
            parentLexSection = section,
            protectLevel     = protectionLevel,
            haveBody         = false,
            isTemplate       = isNextLexTemplate
        };

        if (isNextLexTemplate)
        {
            newClass.templates = templatesBuffer;
        }

        isNextLexTemplate = false;

        if (afterName.Length > 0)
        {
            var baseClasses = Split(afterName, ',');

            foreach (var baseClass in baseClasses)
            {
                string trimmedBaseClass = baseClass.Trim();

                int spacePos = trimmedBaseClass.IndexOf(' ');
                if (spacePos < 0)
                {
                    newClass.baseClasses.Add(new LexClass.BaseClassDef()
                    {
                        type      = ProtectLevel.Private,
                        className = trimmedBaseClass
                    });
                }
                else
                {
                    string sectionTypeName = trimmedBaseClass.Substring(0, spacePos);
                    string baseClassName   = trimmedBaseClass.Substring(spacePos + 1);

                    if (baseClassName.StartsWith("virtual"))
                    {
                        baseClassName = baseClassName.Substring("virtual".Length + 1);
                    }

                    ProtectLevel sectionType = ProtectLevel.Private;

                    if (sectionTypeName == "public")
                    {
                        sectionType = ProtectLevel.Public;
                    }
                    else if (sectionTypeName == "protected")
                    {
                        sectionType = ProtectLevel.Protected;
                    }

                    newClass.baseClasses.Add(new LexClass.BaseClassDef()
                    {
                        type      = sectionType,
                        className = baseClassName
                    });
                }
            }
        }

        if (caret < section.data.Length && section.data[caret] == '/')
        {
            string comment = ReadWord(section.data, ref caret, "\n");
            ReadWord(section.data, ref caret, ";{/");

            newClass.comment = new LexComment()
            {
                comment = comment
            };
        }

        if (caret < section.data.Length && section.data[caret] == '{')
        {
            int sectionBegin = caret;
            newClass.data     = ReadBlock(section.data, ref caret).Trim('{', '}', ' ', '\n', '\r', '\t');
            newClass.haveBody = true;

            section.classes.Add(newClass);
            section.childSections.Add(newClass);

            ParseLexSection(newClass, isstruct ? ProtectLevel.Public : ProtectLevel.Private);
        }
    }