public void Visit(SubTypeDecl decl) { decl.Parent.Resolve(this.Symbol, this.Environment); var refType = this.Environment.FindRefType(decl.Parent); if (refType.ReferencingNameKey != null) { Dictionary <string, List <SymbolDecl> > content = null; if (!this.Environment.NamespaceContents.TryGetValue(refType.ReferencingNameKey, out content)) { var parentDecls = this.Environment.ResolvedTypes[refType]; content = parentDecls .Select(x => this.Environment.GetSymbolContent(x, true)) .Where(x => x != null) .SelectMany(x => x) .GroupBy(x => x.Key) .ToDictionary(x => x.Key, x => x.SelectMany(y => y.Value).ToList()) ; } var decls = FindSymbolInContent(decl, decl.Name, content, true, false); if (decls == null) { decls = FindSymbolInContent(decl, decl.Name, content, false, !this.SupressError); } if (decls != null) { this.Environment.ResolvedTypes.Add(decl, decls); return; } } AddError(decl, decl.Name); }
public void Visit(SubTypeDecl decl) { Deserialize(decl); decl.Name = Element.Attribute("Name").Value; decl.Parent = TypeDecl.Deserialize(this.Element.Element("Parent").Elements().First()); }
public void Visit(SubTypeDecl decl) { this.Result = decl.Parent.ToString() + "::" + decl.Name; }
public void Visit(SubTypeDecl decl) { Serialize(decl); this.Element.Add(new XAttribute("Name", decl.Name)); this.Element.Add(new XElement("Parent", decl.Parent.Serialize())); }
static bool ParseMiniType(string[] tokens, ref int index, out TypeDecl decl) { decl = null; if (CppParser.Token(tokens, ref index, "const")) { decl = new DecorateTypeDecl { Decoration = Decoration.Const, Element = EnsureMiniType(tokens, ref index), }; return true; } else if (CppParser.Token(tokens, ref index, "volatile")) { decl = new DecorateTypeDecl { Decoration = Decoration.Volatile, Element = EnsureMiniType(tokens, ref index), }; return true; } else if (CppParser.Token(tokens, ref index, "signed")) { decl = new DecorateTypeDecl { Decoration = Decoration.Signed, Element = EnsureMiniType(tokens, ref index), }; return true; } else if (CppParser.Token(tokens, ref index, "unsigned")) { decl = new DecorateTypeDecl { Decoration = Decoration.Unsigned, Element = EnsureMiniType(tokens, ref index), }; return true; } else if (CppParser.Token(tokens, ref index, "decltype")) { CppParser.EnsureToken(tokens, ref index, "("); int oldIndex = index; CppParser.SkipUntil(tokens, ref index, ")"); decl = new DeclTypeDecl { Expression = tokens .Skip(oldIndex) .Take(index - 1 - oldIndex) .Aggregate((a, b) => a + " " + b), }; return true; } else if (CppParser.Token(tokens, ref index, "false") || CppParser.Token(tokens, ref index, "true")) { decl = new ConstantTypeDecl { Value = tokens[index - 1], }; return true; } else { if (index < tokens.Length) { int value = 0; if (int.TryParse(tokens[index], out value)) { index++; decl = new ConstantTypeDecl { Value = tokens[index - 1], }; return true; } } string token = null; CppParser.Token(tokens, ref index, "typename"); if (CppParser.Id(tokens, ref index, out token)) { decl = new RefTypeDecl { Name = token, }; if (token != "operator") { while (true) { if (CppParser.Token(tokens, ref index, "<")) { var genericDecl = new GenericTypeDecl { Element = decl, TypeArguments = new List<TypeDecl>(), }; decl = genericDecl; if (!CppParser.Token(tokens, ref index, ">")) { while (true) { genericDecl.TypeArguments.Add(EnsureTypeWithoutName(tokens, ref index)); if (CppParser.Token(tokens, ref index, ">")) { break; } else { CppParser.EnsureToken(tokens, ref index, ","); } } } } else if (CppParser.Token(tokens, ref index, ":")) { CppParser.EnsureToken(tokens, ref index, ":"); CppParser.Token(tokens, ref index, "template"); if (CppParser.Id(tokens, ref index, out token)) { decl = new SubTypeDecl { Parent = decl, Name = token, }; } else { index -= 2; break; } } else { break; } } } return true; } else { return false; } } }
public void Visit(SubTypeDecl decl) { decl.Parent.Resolve(this.Symbol, this.Environment); var refType = this.Environment.FindRefType(decl.Parent); if (refType.ReferencingNameKey != null) { Dictionary<string, List<SymbolDecl>> content = null; if (!this.Environment.NamespaceContents.TryGetValue(refType.ReferencingNameKey, out content)) { var parentDecls = this.Environment.ResolvedTypes[refType]; content = parentDecls .Select(x => this.Environment.GetSymbolContent(x)) .Where(x => x != null) .SelectMany(x => x) .GroupBy(x => x.Key) .ToDictionary(x => x.Key, x => x.SelectMany(y => y.Value).ToList()) ; } var decls = FindSymbolInContent(decl, decl.Name, content, true, false); if (decls == null) { decls = FindSymbolInContent(decl, decl.Name, content, false, !this.SupressError); } if (decls != null) { this.Environment.ResolvedTypes.Add(decl, decls); return; } } AddError(decl, decl.Name); }