diff --git a/CMakeLists.txt b/CMakeLists.txt index 4038104fb..d31398077 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -195,6 +195,7 @@ function(compile_flatbuffers_schema_to_cpp SRC_FBS) OUTPUT ${GEN_HEADER} COMMAND "${FLATBUFFERS_FLATC_EXECUTABLE}" -c --no-includes --gen-mutable --gen-object-api -o "${SRC_FBS_DIR}" + -I "${CMAKE_CURRENT_SOURCE_DIR}/tests/include_test" "${CMAKE_CURRENT_SOURCE_DIR}/${SRC_FBS}" DEPENDS flatc) endfunction() diff --git a/appveyor.yml b/appveyor.yml index 0dd5a2ed1..262d9b07f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -35,7 +35,7 @@ test_script: - "JavaTest.bat" - rem "---------------- JS -----------------" - "node --version" - - "..\\%CONFIGURATION%\\flatc -b monster_test.fbs unicode_test.json" + - "..\\%CONFIGURATION%\\flatc -b -I include_test monster_test.fbs unicode_test.json" - "node JavaScriptTest ./monster_test_generated" - rem "---------------- C# -----------------" # Have to compile this here rather than in "build" above because AppVeyor only diff --git a/include/flatbuffers/idl.h b/include/flatbuffers/idl.h index 262d21937..2781852cd 100644 --- a/include/flatbuffers/idl.h +++ b/include/flatbuffers/idl.h @@ -590,7 +590,8 @@ private: FLATBUFFERS_CHECKED_ERROR SkipJsonString(); FLATBUFFERS_CHECKED_ERROR DoParse(const char *_source, const char **include_paths, - const char *source_filename); + const char *source_filename, + const char *include_filename); FLATBUFFERS_CHECKED_ERROR CheckClash(std::vector &fields, StructDef *struct_def, const char *suffix, diff --git a/src/idl_gen_cpp.cpp b/src/idl_gen_cpp.cpp index 378990448..6bd958f5c 100644 --- a/src/idl_gen_cpp.cpp +++ b/src/idl_gen_cpp.cpp @@ -72,11 +72,11 @@ class CppGenerator : public BaseGenerator { } for (auto it = parser_.included_files_.begin(); it != parser_.included_files_.end(); ++it) { - auto basename = flatbuffers::StripExtension(it->first); - if (!parser_.opts.keep_include_path) - basename = flatbuffers::StripPath(basename); + auto noext = flatbuffers::StripExtension(it->first); + auto basename = flatbuffers::StripPath(noext); if (basename != file_name_) { - code_ += "#include \"" + parser_.opts.include_prefix + basename + + code_ += "#include \"" + parser_.opts.include_prefix + + (parser_.opts.keep_include_path ? noext : basename) + "_generated.h\""; num_includes++; } diff --git a/src/idl_parser.cpp b/src/idl_parser.cpp index 4c2556272..f03ad9a88 100644 --- a/src/idl_parser.cpp +++ b/src/idl_parser.cpp @@ -1917,15 +1917,17 @@ CheckedError Parser::SkipJsonString() { bool Parser::Parse(const char *source, const char **include_paths, const char *source_filename) { - return !DoParse(source, include_paths, source_filename).Check(); + return !DoParse(source, include_paths, source_filename, + source_filename).Check(); } CheckedError Parser::DoParse(const char *source, const char **include_paths, - const char *source_filename) { + const char *source_filename, + const char *include_filename) { file_being_parsed_ = source_filename ? source_filename : ""; if (source_filename && - included_files_.find(source_filename) == included_files_.end()) { - included_files_[source_filename] = true; + included_files_.find(include_filename) == included_files_.end()) { + included_files_[include_filename] = true; files_included_per_file_[source_filename] = std::set(); } if (!include_paths) { @@ -1974,13 +1976,14 @@ CheckedError Parser::DoParse(const char *source, const char **include_paths, return Error("unable to locate include file: " + name); if (source_filename) files_included_per_file_[source_filename].insert(filepath); - if (included_files_.find(filepath) == included_files_.end()) { + if (included_files_.find(name) == included_files_.end()) { // We found an include file that we have not parsed yet. // Load it and parse it. std::string contents; if (!LoadFile(filepath.c_str(), true, &contents)) return Error("unable to load include file: " + name); - ECHECK(DoParse(contents.c_str(), include_paths, filepath.c_str())); + ECHECK(DoParse(contents.c_str(), include_paths, filepath.c_str(), + name.c_str())); // We generally do not want to output code for any included files: if (!opts.generate_all) MarkGenerated(); // This is the easiest way to continue this file after an include: @@ -1990,7 +1993,7 @@ 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. - return DoParse(source, include_paths, source_filename); + return DoParse(source, include_paths, source_filename, include_filename); } EXPECT(';'); } else { diff --git a/tests/GoTest.sh b/tests/GoTest.sh index 7be4affb7..248a13f26 100755 --- a/tests/GoTest.sh +++ b/tests/GoTest.sh @@ -20,7 +20,7 @@ go_path=${test_dir}/go_gen go_src=${go_path}/src # Emit Go code for the example schema in the test dir: -../flatc -g monster_test.fbs +../flatc -g -I include_test monster_test.fbs # Go requires a particular layout of files in order to link multiple packages. # Copy flatbuffer Go files to their own package directories to compile the diff --git a/tests/JavaScriptTest.sh b/tests/JavaScriptTest.sh index cdba5fa69..c0286a057 100755 --- a/tests/JavaScriptTest.sh +++ b/tests/JavaScriptTest.sh @@ -15,5 +15,5 @@ # limitations under the License. pushd "$(dirname $0)" >/dev/null -../flatc -b monster_test.fbs unicode_test.json +../flatc -b -I include_test monster_test.fbs unicode_test.json node JavaScriptTest ./monster_test_generated diff --git a/tests/PythonTest.sh b/tests/PythonTest.sh index 00fee7c7b..e4dbe8dae 100755 --- a/tests/PythonTest.sh +++ b/tests/PythonTest.sh @@ -20,7 +20,7 @@ gen_code_path=${test_dir} runtime_library_dir=${test_dir}/../python # Emit Python code for the example schema in the test dir: -${test_dir}/../flatc -p -o ${gen_code_path} monster_test.fbs +${test_dir}/../flatc -p -o ${gen_code_path} -I include_test monster_test.fbs # Syntax: run_tests # diff --git a/tests/TypeScriptTest.sh b/tests/TypeScriptTest.sh index 54c6d086c..b033a3024 100755 --- a/tests/TypeScriptTest.sh +++ b/tests/TypeScriptTest.sh @@ -15,8 +15,8 @@ # limitations under the License. pushd "$(dirname $0)" >/dev/null -../flatc --ts --no-fb-import --gen-mutable -o ts monster_test.fbs -../flatc -b monster_test.fbs unicode_test.json +../flatc --ts --no-fb-import --gen-mutable -o ts -I include_test monster_test.fbs +../flatc -b -I include_test monster_test.fbs unicode_test.json npm install @types/flatbuffers tsc --strict --noUnusedParameters --noUnusedLocals --noImplicitReturns --strictNullChecks ts/monster_test_generated.ts npm uninstall @types/flatbuffers diff --git a/tests/generate_code.bat b/tests/generate_code.bat index e7660a2f2..2abfe9b3c 100644 --- a/tests/generate_code.bat +++ b/tests/generate_code.bat @@ -15,6 +15,6 @@ set buildtype=Release if "%1"=="-b" set buildtype=%2 -..\%buildtype%\flatc.exe --cpp --java --csharp --go --binary --python --js --php --grpc --gen-mutable --gen-object-api --no-includes monster_test.fbs monsterdata_test.json +..\%buildtype%\flatc.exe --cpp --java --csharp --go --binary --python --js --php --grpc --gen-mutable --gen-object-api --no-includes -I include_test monster_test.fbs monsterdata_test.json ..\%buildtype%\flatc.exe --cpp --java --csharp --go --binary --python --js --php --gen-mutable -o namespace_test namespace_test\namespace_test1.fbs namespace_test\namespace_test2.fbs -..\%buildtype%\flatc.exe --binary --schema monster_test.fbs +..\%buildtype%\flatc.exe --binary --schema -I include_test monster_test.fbs diff --git a/tests/generate_code.sh b/tests/generate_code.sh index bdce8405d..8e3ac5112 100755 --- a/tests/generate_code.sh +++ b/tests/generate_code.sh @@ -14,11 +14,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -../flatc --cpp --java --csharp --go --binary --python --js --ts --php --grpc --gen-mutable --gen-object-api --no-includes --no-fb-import monster_test.fbs monsterdata_test.json +../flatc --cpp --java --csharp --go --binary --python --js --ts --php --grpc --gen-mutable --gen-object-api --no-includes --no-fb-import -I include_test monster_test.fbs monsterdata_test.json ../flatc --cpp --java --csharp --go --binary --python --js --ts --php --gen-mutable --no-fb-import -o namespace_test namespace_test/namespace_test1.fbs namespace_test/namespace_test2.fbs ../flatc --cpp --gen-mutable --gen-object-api -o union_vector ./union_vector/union_vector.fbs -../flatc -b --schema --bfbs-comments monster_test.fbs +../flatc -b --schema --bfbs-comments -I include_test monster_test.fbs cd ../samples ../flatc --cpp --gen-mutable --gen-object-api monster.fbs cd ../reflection -sh generate_code.sh diff --git a/tests/include_test/include_test1.fbs b/tests/include_test/include_test1.fbs new file mode 100644 index 000000000..39bc666be --- /dev/null +++ b/tests/include_test/include_test1.fbs @@ -0,0 +1,5 @@ +include "sub/include_test2.fbs"; +include "sub/include_test2.fbs"; // should be skipped +include "include_test1.fbs"; // should be skipped + + diff --git a/tests/include_test2.fbs b/tests/include_test/sub/include_test2.fbs similarity index 61% rename from tests/include_test2.fbs rename to tests/include_test/sub/include_test2.fbs index d22c0d9b4..13aa229e8 100644 --- a/tests/include_test2.fbs +++ b/tests/include_test/sub/include_test2.fbs @@ -1,4 +1,4 @@ -include "include_test2.fbs"; // should be skipped +include "sub/include_test2.fbs"; // should be skipped namespace MyGame.OtherNameSpace; diff --git a/tests/include_test1.fbs b/tests/include_test1.fbs deleted file mode 100644 index 11aebe81f..000000000 --- a/tests/include_test1.fbs +++ /dev/null @@ -1,5 +0,0 @@ -include "include_test2.fbs"; -include "include_test2.fbs"; // should be skipped -include "include_test1.fbs"; // should be skipped - - diff --git a/tests/test.cpp b/tests/test.cpp index 3f5cddc49..3141a9685 100644 --- a/tests/test.cpp +++ b/tests/test.cpp @@ -472,7 +472,11 @@ void ParseAndGenerateTextTest() { // parse schema first, so we can use it to parse the data after flatbuffers::Parser parser; - const char *include_directories[] = { test_data_path.c_str(), nullptr }; + auto include_test_path = + flatbuffers::ConCatPathFileName(test_data_path, "include_test"); + const char *include_directories[] = { + test_data_path.c_str(), include_test_path.c_str(), nullptr + }; TEST_EQ(parser.Parse(schemafile.c_str(), include_directories), true); TEST_EQ(parser.Parse(jsonfile.c_str(), include_directories), true);