[idl_parser] Track included files by hash (#6434)
authorMark Spatz <mspatz@leaflabs.com>
Mon, 1 Mar 2021 20:34:01 +0000 (14:34 -0600)
committerGitHub <noreply@github.com>
Mon, 1 Mar 2021 20:34:01 +0000 (12:34 -0800)
commitbd4e0b30a7301b0fc134f10ea1bd618922b60a5c
tree01c540d6351034fb156f7dfb196eb33685f31284
parentbf90612007f2163857eaefd5ab1989a9fd7fc253
[idl_parser] Track included files by hash (#6434)

* [idl_gen] Delete ts::GenPrefixedImport()

I don't know what this is for, but it's the only piece of code external
to idl_parser.cpp that expects the key of Parser::included_files_ to be
a path. And it appears to be unused.

* [idl_parser] Track included files by hash

Parser::included_files_ is a map whose main purpose is to keep track of
which files have already been parsed in order to protect against
multiple inclusion. Its key is the path that the file was found at
during parsing (or, if it's an in-memory file, just its name).

This commit changes the key to be the 64 bit FNV-1a hash of the file's
name (just the name, not the complete path) xor'd with the hash of the
file's contents (unless it's an in-memory file, then we only hash the
name.)

This allows multiple include protection to function even in the face of
unique per-file include paths (fixes #6425).

* Ran tests/generate_code.sh

CI told me to do it.

* Gracefullt handle case where source_filename == nullptr

I just learned source_filename might also be null. In that case, we
should exclude it from the hash instead of hashing a zero length
string, just like we exclude source when it is null.

Presumably nameless files will never be included (they can't, can they?)
so this doesn't really matter, but I think it's prettier anyways.
include/flatbuffers/idl.h
src/idl_gen_ts.cpp
src/idl_parser.cpp
tests/monster_test_generated.rs