@@ -172,9 +172,8 @@ export function gen_ast_encoder_cc({
172172 emit ( ` static_cast<std::uint32_t>(ast->${ m . name } ));` ) ;
173173 } ) ;
174174 } else if ( m . kind == "token" ) {
175- emit ( ` auto ${ m . name } = encodeSourceLocation(ast->${ m . name } );` ) ;
176175 finalizers . push ( ( ) => {
177- emit ( ` builder.add_${ fieldName } (${ m . name } .o );` ) ;
176+ emit ( ` builder.add_${ fieldName } (ast-> ${ m . name } .index() );` ) ;
178177 } ) ;
179178 }
180179 } ) ;
@@ -201,8 +200,9 @@ export function gen_ast_encoder_cc({
201200#include <cxx/literals.h>
202201#include <cxx/names.h>
203202#include <cxx/translation_unit.h>
204- #include <format >
203+ #include <cxx/preprocessor.h >
205204
205+ #include <format>
206206#include <algorithm>
207207
208208namespace cxx {
@@ -214,17 +214,32 @@ auto ASTEncoder::operator()(TranslationUnit* unit) -> std::span<const std::uint8
214214 Table<StringLiteral> stringLiterals;
215215 Table<IntegerLiteral> integerLiterals;
216216 Table<FloatLiteral> floatLiterals;
217- SourceFiles sourceFiles;
218- SourceLines sourceLines;
219217
220218 std::swap(unit_, unit);
221219 std::swap(identifiers_, identifiers);
222220 std::swap(charLiterals_, charLiterals);
223221 std::swap(stringLiterals_, stringLiterals);
224222 std::swap(integerLiterals_, integerLiterals);
225223 std::swap(floatLiterals_, floatLiterals);
226- std::swap(sourceFiles_, sourceFiles);
227- std::swap(sourceLines_, sourceLines);
224+
225+ std::vector<flatbuffers::Offset<io::Source>> sources;
226+ for (const auto& source : unit_->preprocessor()->sources()) {
227+ auto file_name = fbb_.CreateString(source.fileName);
228+ std::vector<int> lineOffsets(source.lineOffsets.begin(),
229+ source.lineOffsets.end());
230+ auto line_offsets = fbb_.CreateVector(lineOffsets);
231+ sources.push_back(io::CreateSource(fbb_, file_name, line_offsets));
232+ }
233+
234+ auto source_list = fbb_.CreateVector(sources);
235+
236+ std::vector<std::uint64_t> tokens;
237+ for (std::uint32_t i = 0; i < unit_->tokenCount(); ++i) {
238+ const auto& token = unit_->tokenAt(SourceLocation(i));
239+ tokens.push_back(token.raw());
240+ }
241+
242+ auto token_list = fbb_.CreateVector(tokens);
228243
229244 auto [unitOffset, unitType] = acceptUnit(unit_->ast());
230245
@@ -234,15 +249,15 @@ auto ASTEncoder::operator()(TranslationUnit* unit) -> std::span<const std::uint8
234249 builder.add_unit(unitOffset);
235250 builder.add_unit_type(static_cast<io::Unit>(unitType));
236251 builder.add_file_name(file_name);
252+ builder.add_source_list(source_list);
253+ builder.add_token_list(token_list);
237254
238255 std::swap(unit_, unit);
239256 std::swap(identifiers_, identifiers);
240257 std::swap(charLiterals_, charLiterals);
241258 std::swap(stringLiterals_, stringLiterals);
242259 std::swap(integerLiterals_, integerLiterals);
243260 std::swap(floatLiterals_, floatLiterals);
244- std::swap(sourceFiles_, sourceFiles);
245- std::swap(sourceLines_, sourceLines);
246261
247262 fbb_.Finish(builder.Finish(), io::SerializedUnitIdentifier());
248263
@@ -258,47 +273,6 @@ auto ASTEncoder::accept(AST* ast) -> flatbuffers::Offset<> {
258273 return offset;
259274}
260275
261- auto ASTEncoder::encodeSourceLocation(const SourceLocation& loc)
262- -> flatbuffers::Offset<> {
263- if (!loc) {
264- return {};
265- }
266-
267- const auto start = unit_->tokenStartPosition(loc);
268-
269- flatbuffers::Offset<io::SourceLine> sourceLineOffset;
270-
271- auto key = std::tuple(start.fileName, start.line);
272-
273- if (sourceLines_.contains(key)) {
274- sourceLineOffset = sourceLines_.at(key).o;
275- } else {
276- flatbuffers::Offset<flatbuffers::String> fileNameOffset;
277-
278- if (sourceFiles_.contains(start.fileName)) {
279- fileNameOffset = sourceFiles_.at(start.fileName);
280- } else {
281- fileNameOffset = fbb_.CreateString(start.fileName);
282- sourceFiles_.emplace(start.fileName, fileNameOffset.o);
283- }
284-
285- io::SourceLineBuilder sourceLineBuilder{fbb_};
286- sourceLineBuilder.add_file_name(fileNameOffset);
287- sourceLineBuilder.add_line(start.line);
288- sourceLineOffset = sourceLineBuilder.Finish();
289- sourceLines_.emplace(std::move(key), sourceLineOffset.o);
290- }
291-
292- io::SourceLocationBuilder sourceLocationBuilder{fbb_};
293- sourceLocationBuilder.add_source_line(sourceLineOffset);
294- sourceLocationBuilder.add_column(start.column);
295-
296- auto offset = sourceLocationBuilder.Finish();
297-
298- return offset.Union();
299- }
300-
301-
302276${ code . join ( "\n" ) }
303277
304278} // namespace cxx
0 commit comments