Ejemplo n.º 1
0
 public void ResolveIncompletion(Globals globs)
 {
     if (!Type.IsComplete && globs.ContainsTypeInfo(Type.Name))
         Type = globs.GetTypeInfo(Type.Name);
     if (WrappedType != null && !WrappedType.IsComplete && globs.ContainsTypeInfo(WrappedType.Name))
         WrappedType = globs.GetTypeInfo(WrappedType.Name);
 }
Ejemplo n.º 2
0
 public void ResolveIncompletion(Globals globs)
 {
     if (globs.ContainsTypeInfo(ReturnType.Name))
         ReturnType = globs.GetTypeInfo(ReturnType.Name);
     if (ReturnType is TemplateInst)
     { //not found in globals
         ((TemplateInst)ReturnType).WrappedType = globs.GetTypeInfo(((TemplateInst)ReturnType).WrappedType.Name);
     }
     for (int i = 0; i < Params.Count; ++i)
     {
         if (!Params[i].IsComplete && globs.ContainsTypeInfo(Params[i].Name))
             Params[i] = globs.GetTypeInfo(Params[i].Name);
     }
 }
Ejemplo n.º 3
0
 void ParseDumpGlobProps(string line, StringReader rdr, Globals globals)
 {
     while ((line = rdr.ReadLine()) != null)
     {
         if (line.Length == 0)
         {
             return;
         }
         if (line.StartsWith("/*") || line.StartsWith("//"))
         {
             continue;
         }
         else
         {
             string[] parts  = line.Replace(";", "").Split(' ');                                               //[TypeName] [PropertyName]
             string   pname  = parts[0].EndsWith("@") ? parts[0].Substring(0, parts[0].Length - 1) : parts[0]; //handle
             TypeInfo pType  = null;
             string   myname = parts[1];
             if (globals.ContainsTypeInfo(pname))
             {
                 pType = globals.GetTypeInfo(pname);
             }
             if (pType == null)   //create temp type to resolve
             {
                 pType = new TypeInfo()
                 {
                     Name = pname, IsComplete = false
                 };
             }
             globals.AddProperty(myname, pType, -1, null);
         }
     }
 }
Ejemplo n.º 4
0
        static FunctionInfo _parseFunction(string line, Globals globals)
        {
            int firstParen = line.IndexOf('(');
            int lastParen = line.LastIndexOf(')');
            string baseDecl = line.Substring(0, firstParen);
            string paramDecl = line.Substring(firstParen, lastParen - firstParen + 1); //-1 for the ;
            string[] nameParts = baseDecl.Split(' ');
            if (nameParts.Length > 1)
            {
                if (nameParts[0].ToLower().Equals("const")) // Tolerate const type returns
                    nameParts = nameParts.SubArray(1, nameParts.Length - 1);
            }
            TypeInfo retType = null;

            //TODO: split the name parts
            if (globals.ContainsTypeInfo(nameParts[0])) {
                retType = globals.GetTypeInfo(nameParts[0]);
            } else if (nameParts[0].Contains('<')) {
                string wrappedType = nameParts[0].Extract('<', '>');
                string templateType = nameParts[0].Replace(string.Format("<{0}>", wrappedType), "");
                TypeInfo wrapped = globals.GetTypeInfo(wrappedType);
                TemplateInst ti = new TemplateInst() { Name = nameParts[0], IsTemplate = true, WrappedType = wrapped != null ? wrapped : new TypeInfo { Name = wrappedType, IsComplete = false } };
                retType = ti;
            } else {
                retType = new TypeInfo() { Name = nameParts[0], IsPrimitive = false };
            }
            return new FunctionInfo {Name = nameParts[1], ReturnType = retType, Inner = paramDecl};
        }
Ejemplo n.º 5
0
 public bool ContainsTypeInfo(string name)
 {
     if (name.Contains("::"))
     {
         string[] parts = name.Split(new string[] { "::" }, StringSplitOptions.RemoveEmptyEntries);
         Globals ns = GetNamespace(name);
         if (ns != null)
             return ns.ContainsTypeInfo(name);
         if (Parent != null)
             return Parent.ContainsTypeInfo(name);
         return false;
     }
     else
     {
         if (Classes.ContainsKey(name))
             return true;
         if (Parent != null)
             return Parent.ContainsTypeInfo(name);
         return false;
     }
 }
Ejemplo n.º 6
0
        static FunctionInfo _parseFunction(string line, Globals globals)
        {
            int    firstParen = line.IndexOf('(');
            int    lastParen  = line.LastIndexOf(')');
            string baseDecl   = line.Substring(0, firstParen);
            string paramDecl  = line.Substring(firstParen, lastParen - firstParen + 1); //-1 for the ;

            string[] nameParts = baseDecl.Split(' ');
            TypeInfo retType   = null;

            //TODO: split the name parts
            if (globals.ContainsTypeInfo(nameParts[0]))
            {
                retType = globals.GetTypeInfo(nameParts[0]);
            }
            else if (nameParts[0].Contains('<'))
            {
                string       wrappedType  = nameParts[0].Extract('<', '>');
                string       templateType = nameParts[0].Replace(string.Format("<{0}>", wrappedType), "");
                TypeInfo     wrapped      = globals.GetTypeInfo(wrappedType);
                TemplateInst ti           = new TemplateInst()
                {
                    Name = nameParts[0], IsTemplate = true, WrappedType = wrapped != null ? wrapped : new TypeInfo {
                        Name = wrappedType, IsComplete = false
                    }
                };
                retType = ti;
            }
            else
            {
                retType = new TypeInfo()
                {
                    Name = nameParts[0], IsPrimitive = false
                };
            }
            return(new FunctionInfo {
                Name = nameParts[1], ReturnType = retType, Inner = paramDecl
            });
        }
Ejemplo n.º 7
0
        void ParseDumpClass(string line, StringReader rdr, Globals globals)
        {
            bool isTemplate = false;

            if (line.Contains("template <class T> "))
            {
                isTemplate = true;
            }
            string[] nameparts = line.Replace(",", "").Replace("template <class T> ", "").Split(' '); //dump the commas
            string   classname = nameparts[1];                                                        //class is first
            string   classtype = nameparts[0];                                                        //it might be an interface

            TypeInfo classInfo = new TypeInfo()
            {
                IsTemplate = isTemplate
            };

            classInfo.Name = classname;
            globals.AddTypeInfo(classInfo.Name, classInfo);

            for (int i = 3; i < nameparts.Length; ++i)   //list bases 2 would be :, 3 will be first basetype
            {
                classInfo.BaseTypeStr.Add(nameparts[i]); //add a base class
            }

            bool inprops       = false;
            bool nextReadOnly  = false;
            bool nextProtected = false;

            while ((line = rdr.ReadLine()) != null)
            {
                if (line.Length == 0) //empty line
                {
                    continue;
                }
                if (line.StartsWith("{"))
                {
                    continue;
                }
                if (line.Equals("};"))
                {
                    //TODO: push our class
                    return;
                }
                else if (line.StartsWith("/* readonly */"))
                {
                    nextReadOnly = true;
                    continue;
                }
                else if (line.StartsWith("/* protected */"))
                {
                    nextProtected = true;
                    continue;
                }
                else if (line.StartsWith("/*"))
                {
                    continue;
                }
                else if (line.Contains("// Properties:"))
                {
                    inprops = true;
                }
                else if (line.StartsWith("//"))     // // Methods:
                {
                    continue;
                }
                else if (inprops)                                      //property
                {
                    string[] parts = line.Replace(";", "").Split(' '); //[TypeName] [PropertyName]
                    if (parts[0].Contains('<'))
                    {
                        string       templateType  = parts[0].Substring(0, parts[0].IndexOf('<'));
                        string       containedType = parts[0].Extract('<', '>');
                        TypeInfo     wrapped       = globals.GetTypeInfo(containedType);
                        TemplateInst ti            = new TemplateInst()
                        {
                            Name = templateType, IsTemplate = true, WrappedType = wrapped != null ? wrapped : new TypeInfo {
                                Name = containedType, IsComplete = false
                            }
                        };
                        classInfo.Properties[parts[1]]    = ti;
                        classInfo.PropertyLines[parts[1]] = -1;
                        if (nextReadOnly)
                        {
                            classInfo.ReadonlyProperties.Add(parts[1]);
                        }
                        else if (nextProtected)
                        {
                            classInfo.ProtectedProperties.Add(parts[1]);
                        }
                    }
                    else
                    {
                        string   pname = parts[0].EndsWith("@") ? parts[0].Substring(0, parts[0].Length - 1) : parts[0]; //handle
                        TypeInfo pType = null;
                        if (globals.ContainsTypeInfo(pname))
                        {
                            pType = globals.GetTypeInfo(pname);
                        }
                        if (pType == null)   //create temp type to resolve later
                        {
                            pType = new TypeInfo()
                            {
                                Name = pname, IsComplete = false
                            };
                        }
                        classInfo.Properties[parts[1]]    = pType;
                        classInfo.PropertyLines[parts[1]] = -1;
                        if (nextReadOnly)
                        {
                            classInfo.ReadonlyProperties.Add(parts[1]);
                        }
                        else if (nextProtected)
                        {
                            classInfo.ProtectedProperties.Add(parts[1]);
                        }
                    }
                    nextReadOnly  = false;
                    nextProtected = false;
                }
                else     //function
                {
                    classInfo.Functions.Add(_parseFunction(line, globals));
                    nextReadOnly  = false;
                    nextProtected = false;
                }
            }
        }
Ejemplo n.º 8
0
 public void ResolveIncompletion(Globals globs)
 {
     if (!Type.IsComplete && globs.ContainsTypeInfo(Type.Name))
         Type = globs.GetTypeInfo(Type.Name);
     if (WrappedType != null && !WrappedType.IsComplete && globs.ContainsTypeInfo(WrappedType.Name))
         WrappedType = globs.GetTypeInfo(WrappedType.Name);
 }
Ejemplo n.º 9
0
 public void ResolveIncompletion(Globals globs)
 {
     if (globs.ContainsTypeInfo(ReturnType.Name))
         ReturnType = globs.GetTypeInfo(ReturnType.Name);
     if (ReturnType is TemplateInst)
     { //not found in globals
         ((TemplateInst)ReturnType).WrappedType = globs.GetTypeInfo(((TemplateInst)ReturnType).WrappedType.Name);
     }
     for (int i = 0; i < Params.Count; ++i)
     {
         if (!Params[i].IsComplete && globs.ContainsTypeInfo(Params[i].Name))
             Params[i] = globs.GetTypeInfo(Params[i].Name);
     }
 }
Ejemplo n.º 10
0
        void ParseDumpClass(string line, StringReader rdr, Globals globals)
        {
            bool isTemplate = false;
            if (line.Contains("template <class T> "))
                isTemplate = true;
            string[] nameparts = line.Replace(",","").Replace("template <class T> ","").Split(' '); //dump the commas
            string classname = nameparts[1]; //class is first
            string classtype = nameparts[0]; //it might be an interface

            TypeInfo classInfo = new TypeInfo() { IsTemplate = isTemplate };
            classInfo.Name = classname;
            globals.AddTypeInfo(classInfo.Name, classInfo);

            for (int i = 3; i < nameparts.Length; ++i) { //list bases 2 would be :, 3 will be first basetype
                classInfo.BaseTypeStr.Add(nameparts[i]); //add a base class
            }

            bool inprops = false;
            bool nextReadOnly = false;
            bool nextProtected = false;
            while ((line = rdr.ReadLine()) != null) {
                if (line.Length == 0) //empty line
                    continue;
                if (line.StartsWith("{"))
                    continue;
                if (line.Equals("};")) {
                    //TODO: push our class
                    return;
                } else if (line.StartsWith("/* readonly */")) {
                    nextReadOnly = true;
                    continue;
                } else if (line.StartsWith("/* protected */")) {
                    nextProtected = true;
                    continue;
                } else if (line.StartsWith("/*")) {
                    continue;
                } else if (line.Contains("// Properties:")) {
                    inprops = true;
                } else if (line.StartsWith("//")) { // // Methods:
                    continue;
                } else if (inprops) { //property
                    string[] parts = line.Replace(";", "").Split(' '); //[TypeName] [PropertyName]
                    if (parts[0].Contains('<')) {
                        string templateType = parts[0].Substring(0, parts[0].IndexOf('<'));
                        string containedType = parts[0].Extract('<', '>');
                        TypeInfo wrapped = globals.GetTypeInfo(containedType);
                        TemplateInst ti = new TemplateInst() { Name = templateType, IsTemplate = true, WrappedType = wrapped != null ? wrapped : new TypeInfo { Name = containedType, IsComplete = false } };
                        classInfo.Properties[parts[1]] = ti;
                        classInfo.PropertyLines[parts[1]] = -1;
                        if (nextReadOnly)
                            classInfo.ReadonlyProperties.Add(parts[1]);
                        else if (nextProtected)
                            classInfo.ProtectedProperties.Add(parts[1]);
                    } else {
                        string pname = parts[0].EndsWith("@") ? parts[0].Substring(0, parts[0].Length - 1) : parts[0]; //handle
                        TypeInfo pType = null;
                        if (globals.ContainsTypeInfo(pname))
                            pType = globals.GetTypeInfo(pname);
                        if (pType == null) { //create temp type to resolve later
                            pType = new TypeInfo() { Name = pname, IsComplete = false };
                        }
                        classInfo.Properties[parts[1]] = pType;
                        classInfo.PropertyLines[parts[1]] = -1;
                        if (nextReadOnly)
                            classInfo.ReadonlyProperties.Add(parts[1]);
                        else if (nextProtected)
                            classInfo.ProtectedProperties.Add(parts[1]);
                    }
                    nextReadOnly = false;
                    nextProtected = false;

                } else { //function
                    classInfo.Functions.Add(_parseFunction(line, globals));
                    nextReadOnly = false;
                    nextProtected = false;
                }
            }
        }
Ejemplo n.º 11
0
 void ParseDumpGlobProps(string line, StringReader rdr, Globals globals)
 {
     while ((line = rdr.ReadLine()) != null) {
         if (line.Length == 0)
             return;
         if (line.StartsWith("/*") || line.StartsWith("//"))
             continue;
         else {
             string[] parts = line.Replace(";", "").Split(' '); //[TypeName] [PropertyName]
             string pname = parts[0].EndsWith("@") ? parts[0].Substring(0, parts[0].Length - 1) : parts[0]; //handle
             TypeInfo pType = null;
             string myname = parts[1];
             if (globals.ContainsTypeInfo(pname))
                 pType = globals.GetTypeInfo(pname);
             if (pType == null) { //create temp type to resolve
                 pType = new TypeInfo() { Name = pname, IsComplete = false };
             }
             globals.AddProperty(myname, pType, -1, null);
         }
     }
 }
Ejemplo n.º 12
0
        public BaseTypeInfo GetClassType(TextDocument aDoc, int line, string text)
        {
            if (globals_ == null)
            {
                return(null);
            }
            --line; //subtract one for how AvalonEdit stores text versus reports its position
            int startLine = line;

            if (text.Equals("this"))   //easy case
            {
                int depth = scanner_.GetBraceDepth(line);
                do
                {
                    string lineCode = aDoc.GetText(aDoc.Lines[line]);
                    if (lineCode.Contains("class "))
                    {
                        string[] parts = lineCode.Trim().Split(SPACECHAR, StringSplitOptions.RemoveEmptyEntries);
                        if (parts[0].Equals("shared") && globals_.ContainsTypeInfo(parts[2]))
                        {
                            return(globals_.GetTypeInfo(parts[2]));
                        }
                        else if (globals_.ContainsTypeInfo(parts[1]))
                        {
                            return(globals_.GetTypeInfo(parts[1]));
                        }
                        else
                        {
                            break;
                        }
                    }
                    depth = scanner_.GetBraceDepth(line);
                    --line;
                } while (depth > 0 && line > 0); //class def may be on last line

                //unkonwn class
                int      curDepth  = depth;
                string[] nameparts = aDoc.GetText(aDoc.Lines[line]).Trim().Split(SPACECHAR, StringSplitOptions.RemoveEmptyEntries);
                string   className = "";
                if (nameparts[0].Equals("shared"))
                {
                    className = nameparts[2];
                }
                else if (nameparts[0].Equals("abstract"))
                {
                    className = nameparts[2];
                }
                else
                {
                    className = nameparts[1];
                }
                //TODO get baseclasses
                if (globals_.ContainsTypeInfo(className))
                {
                    return(globals_.GetTypeInfo(className));
                }
                TypeInfo tempType = new TypeInfo()
                {
                    Name = className
                };
                ++line;
                do
                {
                    depth = scanner_.GetBraceDepth(line);
                    if (depth == curDepth + 1)
                    {
                        string   lineCode = aDoc.GetText(aDoc.Lines[line]);
                        string[] words    = aDoc.GetText(aDoc.Lines[line]).Trim().Split(SPACECHAR, StringSplitOptions.RemoveEmptyEntries);
                        if (words != null && words.Length > 1)
                        {
                            if (words[1].Contains("("))   //function
                            {
                                if (globals_.ContainsTypeInfo(words[0]))
                                {
                                }
                            }
                            else
                            {
                                string rettype  = FilterTypeName(words[0]);
                                string propname = FilterTypeName(words[1]);
                                if (globals_.ContainsTypeInfo(rettype))
                                {
                                    tempType.Properties[propname] = globals_.GetTypeInfo(rettype);
                                }
                            }
                        }
                    }
                    ++line;
                } while (line < startLine);
                return(tempType);
            }

            //SCOPE block for depth
            {
                int  depth     = scanner_.GetBraceDepth(line);
                bool indexType = false;
                if (text.Contains('['))
                {
                    indexType = true;
                    text      = text.Substring(0, text.IndexOf('['));
                }
                do
                {
                    string lineCode = aDoc.GetText(aDoc.Lines[line]).Trim();
                    if (lineCode.Contains(text))
                    {
                        // Prevent partial matches as false positives, ie. "sceneFile" passing as "scene"
                        string[] lineTokens = lineCode.Split(BREAKCHARS, StringSplitOptions.RemoveEmptyEntries);
                        if (!lineTokens.Contains(text))
                        {
                            --line;
                            depth = scanner_.GetBraceDepth(line);
                            continue;
                        }

                        int  endidx   = lineCode.IndexOf(text);
                        int  idx      = endidx;
                        bool okay     = true;
                        bool hitSpace = false;
                        while (idx > 0)   //scan backwards to find the typename
                        {
                            if (!char.IsLetterOrDigit(lineCode[idx]) && !BACKSCAN_ALLOW.Contains(lineCode[idx]))
                            {
                                okay = false;
                                ++idx;
                                break;
                            }
                            if (!hitSpace && lineCode[idx] == ' ')
                            {
                                hitSpace = true;
                            }
                            else if (lineCode[idx] == ' ')
                            {
                                break;
                            }
                            --idx;
                        }
                        if (idx < 0)
                        {
                            idx = 0;
                        }
                        string substr = endidx - idx > 0 ? FilterTypeName(lineCode.Substring(idx, endidx - idx).Trim()) : "";
                        if (substr.Length > 0)        //not empty
                        {
                            if (substr.Contains(">")) //TEMPLATE DEFINITION
                            {
                                try
                                {
                                    if (!indexType)
                                    {
                                        substr = lineCode.Substring(0, lineCode.IndexOf('<'));
                                    }
                                    else
                                    {
                                        int start = lineCode.IndexOf('<');
                                        int end   = lineCode.IndexOf('>');
                                        substr = lineCode.Substring(start + 1, end - start - 1);
                                        substr = substr.Replace("@", "");
                                    }
                                }
                                catch (Exception) { /* silently eat */ }
                            }
                            if (globals_.ContainsTypeInfo(substr))
                            {
                                //Found a class
                                if (indexType)
                                {
                                    TypeInfo ti = globals_.GetTypeInfo(substr);
                                    //HACK for Map types
                                    if (ti.Properties.ContainsKey("values"))
                                    {
                                        TypeInfo valueType = ti.Properties["values"];
                                        if (valueType is TemplateInst)
                                        {
                                            return(((TemplateInst)valueType).WrappedType);
                                        }
                                    }
                                }
                                return(globals_.GetTypeInfo(substr));
                            }
                            else if (substr.Contains(':'))
                            {
                                string[] words = substr.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
                                if (words.Length > 1 && globals_.ContainsNamespace(words[0]))
                                {
                                    Globals g = globals_;
                                    for (int i = 0; i < words.Length - 1; ++i)
                                    {
                                        g = globals_.GetNamespace(words[i]);
                                    }
                                    if (g.ContainsTypeInfo(words[words.Length - 1]))
                                    {
                                        return(g.GetTypeInfo(words[words.Length - 1]));
                                    }
                                }
                            }
                        }
                    }
                    --line;
                    depth = scanner_.GetBraceDepth(line);
                } while (depth >= 0 && line > 0);
                return(null);
            }
        }