void visitEnumStatement(EnumStatement *node) override { if (!node->name()) { for (size_t i = 0; i < node->entries()->length(); i++) { EnumConstant *cs = node->entries()->at(i); JsonObject *val = new (pool_) JsonObject(); val->add(atom_name_, toJson(cs->name())); startDoc(val, "enum value", cs->name(), cs->loc()); constants_->add(val); } return; } JsonObject *obj = new (pool_) JsonObject(); obj->add(atom_name_, toJson(node->name())); startDoc(obj, "enum", node->name(), node->loc()); JsonList *list = new (pool_) JsonList(); for (size_t i = 0; i < node->entries()->length(); i++) { EnumConstant *cs = node->entries()->at(i); JsonObject *val = new (pool_) JsonObject(); val->add(atom_name_, toJson(cs->name())); startDoc(val, "enum value", cs->name(), cs->loc()); list->add(val); } obj->add(atom_entries_, list); enums_->add(obj); }
JsonList * JsonList::fromString(string message, int & i) { i++; JsonList * r = new JsonList(); i += skip_whitespace(message, i); if (message[i] == ']') { i++; return r; } while (1) { JsonValue * value = NULL; i += skip_whitespace(message, i); value = JsonValue::fromString(message, i); r->add(value); i += skip_whitespace(message, i); switch (message[i]) { case ',': i++; break; case ']': i++; return r; break; default: throw PARSE_ERROR("expected ] or , found " + string(1, message[i]), i); } } }
Team::operator JsonDict() const { JsonDict r; JsonList * players = new JsonList(); for (int i = 0; i < 7; i++) { if (players_[i] != NULL) { JsonDict * item = new JsonDict(*(players_[i])); players->add(item); } else { players->add(new JsonNull()); } } r.add("players", players); return r; }
void visitTypesetDecl(TypesetDecl *decl) override { JsonObject *obj = new (pool_) JsonObject(); obj->add(atom_name_, toJson(decl->name())); startDoc(obj, "typeset", decl->name(), decl->loc()); JsonList *list = new (pool_) JsonList(); for (size_t i = 0; i < decl->types()->length(); i++) { const TypesetDecl::Entry &entry = decl->types()->at(i); JsonObject *te = new (pool_) JsonObject(); te->add(atom_type_, toJson(entry.te)); unsigned start, end; if (comments_.findCommentFor(entry.loc, &start, &end)) { te->add(atom_doc_start_, new (pool_) JsonInt(start)); te->add(atom_doc_end_, new (pool_) JsonInt(end)); } list->add(te); } obj->add(cc_.add("types"), list); typesets_->add(obj); }
JsonList *toJson(const ParameterList *params) { JsonList *list = new (pool_) JsonList(); for (size_t i = 0; i < params->length(); i++) { VarDecl *decl = params->at(i); JsonObject *obj = new (pool_) JsonObject(); obj->add(atom_type_, toJson(decl, false)); if (decl->name()) { obj->add(atom_name_, toJson(decl->name())); obj->add(atom_decl_, toJson(decl, true)); } else { obj->add(atom_name_, toJson("...")); AutoString builder = BuildTypeName(decl->te(), nullptr, TypeDiagFlags::Names); builder = builder + " ..."; obj->add(atom_decl_, toJson(builder.ptr())); } list->add(obj); } return list; }