From e161ade68c8f6c6818edd8a08b342f1dcb66cc85 Mon Sep 17 00:00:00 2001 From: Russell Chou Date: Fri, 16 Nov 2018 17:11:23 -0800 Subject: [PATCH] Make Parser skip files it's seen already. (#5048) The use case is so we can batch compile a bunch of schemas, some which can depend on each other, without caring about their order. --- src/idl_parser.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/idl_parser.cpp b/src/idl_parser.cpp index 9e9f77c53..357337a74 100644 --- a/src/idl_parser.cpp +++ b/src/idl_parser.cpp @@ -2441,10 +2441,14 @@ CheckedError Parser::ParseRoot(const char *source, const char **include_paths, CheckedError Parser::DoParse(const char *source, const char **include_paths, const char *source_filename, const char *include_filename) { - if (source_filename && - included_files_.find(source_filename) == included_files_.end()) { - included_files_[source_filename] = include_filename ? include_filename : ""; - files_included_per_file_[source_filename] = std::set(); + if (source_filename) { + if (included_files_.find(source_filename) == included_files_.end()) { + included_files_[source_filename] = + include_filename ? include_filename : ""; + files_included_per_file_[source_filename] = std::set(); + } else { + return NoError(); + } } if (!include_paths) { static const char *current_directory[] = { "", nullptr }; @@ -2505,6 +2509,9 @@ CheckedError Parser::DoParse(const char *source, const char **include_paths, // entered into included_files_. // This is recursive, but only go as deep as the number of include // statements. + if (source_filename) { + included_files_.erase(source_filename); + } return DoParse(source, include_paths, source_filename, include_filename); }