public void Visit(GenericTypeDecl decl) { decl.Element.Resolve(this.Symbol, this.Environment); foreach (var type in decl.TypeArguments) { type.Resolve(this.Symbol, this.Environment); } }
public void Visit(GenericTypeDecl decl) { string result = decl.Element.ToString(); result += "<"; for (int i = 0; i < decl.TypeArguments.Count; i++) { if (i > 0) { result += ", "; } result += decl.TypeArguments[i].ToString(); } result += ">"; this.Result = result; }
public void Visit(GenericTypeDecl decl) { Deserialize(decl); decl.Element = TypeDecl.Deserialize(this.Element.Element("Element").Elements().First()); decl.TypeArguments = this.Element.Element("TypeArguments").Elements().Select(x => TypeDecl.Deserialize(x)).ToList(); }
public void Visit(GenericTypeDecl decl) { Serialize(decl); this.Element.Add(new XElement("Element", decl.Element.Serialize())); this.Element.Add(new XElement("TypeArguments", decl.TypeArguments.Select(x => x.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; } } }