diff --git a/indexer.cpp b/indexer.cpp index 1f9ad536..3178b85e 100644 --- a/indexer.cpp +++ b/indexer.cpp @@ -1,5 +1,7 @@ #include "indexer.h" +#include "serializer.h" + IndexedFile::IndexedFile() {} // TODO: Optimize for const char*? @@ -57,196 +59,18 @@ IndexedVarDef* IndexedFile::Resolve(VarId id) { return &vars[id.local_id]; } - -using Writer = rapidjson::PrettyWriter; - -void Write(Writer& writer, const char* key, Location location) { - if (key) writer.Key(key); - std::string s = location.ToString(); - writer.String(s.c_str()); -} - -void Write(Writer& writer, const char* key, optional location) { - if (location) { - Write(writer, key, location.value()); - } - //else { - // if (key) writer.Key(key); - // writer.Null(); - //} -} - -void Write(Writer& writer, const char* key, const std::vector& locs) { - if (locs.size() == 0) - return; - - if (key) writer.Key(key); - writer.StartArray(); - for (const Location& loc : locs) - Write(writer, nullptr, loc); - writer.EndArray(); -} - -template -void Write(Writer& writer, const char* key, LocalId id) { - if (key) writer.Key(key); - writer.Uint64(id.local_id); -} - -template -void Write(Writer& writer, const char* key, optional> id) { - if (id) { - Write(writer, key, id.value()); - } - //else { - // if (key) writer.Key(key); - // writer.Null(); - //} -} - -template -void Write(Writer& writer, const char* key, const std::vector>& ids) { - if (ids.size() == 0) - return; - - if (key) writer.Key(key); - writer.StartArray(); - for (LocalId id : ids) - Write(writer, nullptr, id); - writer.EndArray(); -} - -template -void Write(Writer& writer, const char* key, Ref ref) { - if (key) writer.Key(key); - std::string s = std::to_string(ref.id.local_id) + "@" + ref.loc.ToString(); - writer.String(s.c_str()); -} - -template -void Write(Writer& writer, const char* key, const std::vector>& refs) { - if (refs.size() == 0) - return; - - if (key) writer.Key(key); - writer.StartArray(); - for (Ref ref : refs) - Write(writer, nullptr, ref); - writer.EndArray(); -} - -void Write(Writer& writer, const char* key, const std::string& value) { - if (value.size() == 0) - return; - - if (key) writer.Key(key); - writer.String(value.c_str()); -} - -void Write(Writer& writer, const char* key, uint64_t value) { - if (key) writer.Key(key); - writer.Uint64(value); -} - std::string IndexedFile::ToString() { - auto it = usr_to_type_id.find(""); - if (it != usr_to_type_id.end()) { - Resolve(it->second)->short_name = ""; - assert(Resolve(it->second)->uses.size() == 0); - } - -#define WRITE(name) Write(writer, #name, def.name) - rapidjson::StringBuffer output; rapidjson::PrettyWriter writer(output); writer.SetFormatOptions( rapidjson::PrettyFormatOptions::kFormatSingleLineArray); writer.SetIndent(' ', 2); - writer.StartObject(); - - // Types - writer.Key("types"); - writer.StartArray(); - for (IndexedTypeDef& def : types) { - if (def.is_system_def) continue; - - writer.StartObject(); - WRITE(id); - WRITE(usr); - WRITE(short_name); - WRITE(qualified_name); - WRITE(definition); - WRITE(alias_of); - WRITE(parents); - WRITE(derived); - WRITE(types); - WRITE(funcs); - WRITE(vars); - WRITE(uses); - writer.EndObject(); - } - writer.EndArray(); - - // Functions - writer.Key("functions"); - writer.StartArray(); - for (IndexedFuncDef& def : funcs) { - if (def.is_system_def) continue; - - writer.StartObject(); - WRITE(id); - WRITE(usr); - WRITE(short_name); - WRITE(qualified_name); - WRITE(declaration); - WRITE(definition); - WRITE(declaring_type); - WRITE(base); - WRITE(derived); - WRITE(locals); - WRITE(callers); - WRITE(callees); - WRITE(uses); - writer.EndObject(); - } - writer.EndArray(); - - // Variables - writer.Key("variables"); - writer.StartArray(); - for (IndexedVarDef& def : vars) { - if (def.is_system_def) continue; - - writer.StartObject(); - WRITE(id); - WRITE(usr); - WRITE(short_name); - WRITE(qualified_name); - WRITE(declaration); - WRITE(definition); - WRITE(variable_type); - WRITE(declaring_type); - WRITE(uses); - writer.EndObject(); - } - writer.EndArray(); - - writer.EndObject(); + Serialize(writer, this); return output.GetString(); - -#undef WRITE } -struct FileDef { - uint64_t id; - std::string path; - std::vector types; - std::vector funcs; - std::vector vars; -}; - diff --git a/serializer.cc b/serializer.cc new file mode 100644 index 00000000..7414c832 --- /dev/null +++ b/serializer.cc @@ -0,0 +1,164 @@ +#include "serializer.h" + +#include "indexer.h" + +void Serialize(Writer& writer, const char* key, Location location) { + if (key) writer.Key(key); + std::string s = location.ToString(); + writer.String(s.c_str()); +} + +void Serialize(Writer& writer, const char* key, optional location) { + if (location) + Serialize(writer, key, location.value()); +} + +void Serialize(Writer& writer, const char* key, const std::vector& locs) { + if (locs.size() == 0) + return; + + if (key) writer.Key(key); + writer.StartArray(); + for (const Location& loc : locs) + Serialize(writer, nullptr, loc); + writer.EndArray(); +} + +template +void Serialize(Writer& writer, const char* key, LocalId id) { + if (key) writer.Key(key); + writer.Uint64(id.local_id); +} + +template +void Serialize(Writer& writer, const char* key, optional> id) { + if (id) { + Serialize(writer, key, id.value()); + } +} + +template +void Serialize(Writer& writer, const char* key, const std::vector>& ids) { + if (ids.size() == 0) + return; + + if (key) writer.Key(key); + writer.StartArray(); + for (LocalId id : ids) + Serialize(writer, nullptr, id); + writer.EndArray(); +} + +template +void Serialize(Writer& writer, const char* key, Ref ref) { + if (key) writer.Key(key); + std::string s = std::to_string(ref.id.local_id) + "@" + ref.loc.ToString(); + writer.String(s.c_str()); +} + +template +void Serialize(Writer& writer, const char* key, const std::vector>& refs) { + if (refs.size() == 0) + return; + + if (key) writer.Key(key); + writer.StartArray(); + for (Ref ref : refs) + Serialize(writer, nullptr, ref); + writer.EndArray(); +} + +void Serialize(Writer& writer, const char* key, const std::string& value) { + if (value.size() == 0) + return; + + if (key) writer.Key(key); + writer.String(value.c_str()); +} + +void Serialize(Writer& writer, const char* key, uint64_t value) { + if (key) writer.Key(key); + writer.Uint64(value); +} + +void Serialize(Writer& writer, IndexedFile* file) { + auto it = file->usr_to_type_id.find(""); + if (it != file->usr_to_type_id.end()) { + file->Resolve(it->second)->short_name = ""; + assert(file->Resolve(it->second)->uses.size() == 0); + } + +#define SERIALIZE(name) Serialize(writer, #name, def.name) + + writer.StartObject(); + + // Types + writer.Key("types"); + writer.StartArray(); + for (IndexedTypeDef& def : file->types) { + if (def.is_system_def) continue; + + writer.StartObject(); + SERIALIZE(id); + SERIALIZE(usr); + SERIALIZE(short_name); + SERIALIZE(qualified_name); + SERIALIZE(definition); + SERIALIZE(alias_of); + SERIALIZE(parents); + SERIALIZE(derived); + SERIALIZE(types); + SERIALIZE(funcs); + SERIALIZE(vars); + SERIALIZE(uses); + writer.EndObject(); + } + writer.EndArray(); + + // Functions + writer.Key("functions"); + writer.StartArray(); + for (IndexedFuncDef& def : file->funcs) { + if (def.is_system_def) continue; + + writer.StartObject(); + SERIALIZE(id); + SERIALIZE(usr); + SERIALIZE(short_name); + SERIALIZE(qualified_name); + SERIALIZE(declaration); + SERIALIZE(definition); + SERIALIZE(declaring_type); + SERIALIZE(base); + SERIALIZE(derived); + SERIALIZE(locals); + SERIALIZE(callers); + SERIALIZE(callees); + SERIALIZE(uses); + writer.EndObject(); + } + writer.EndArray(); + + // Variables + writer.Key("variables"); + writer.StartArray(); + for (IndexedVarDef& def : file->vars) { + if (def.is_system_def) continue; + + writer.StartObject(); + SERIALIZE(id); + SERIALIZE(usr); + SERIALIZE(short_name); + SERIALIZE(qualified_name); + SERIALIZE(declaration); + SERIALIZE(definition); + SERIALIZE(variable_type); + SERIALIZE(declaring_type); + SERIALIZE(uses); + writer.EndObject(); + } + writer.EndArray(); + + writer.EndObject(); +#undef WRITE +} diff --git a/serializer.h b/serializer.h new file mode 100644 index 00000000..120e191d --- /dev/null +++ b/serializer.h @@ -0,0 +1,7 @@ +#include +#include + +struct IndexedFile; +using Writer = rapidjson::PrettyWriter; + +void Serialize(Writer& writer, IndexedFile* file); \ No newline at end of file