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