Process $ expansions inside #include
This commit is contained in:
parent
d5c1759def
commit
d3f8a0bce1
4 changed files with 40 additions and 0 deletions
|
|
@ -184,8 +184,13 @@ void Parser::processDirective()
|
|||
std::string path;
|
||||
bool valid = false;
|
||||
|
||||
SourceLocation valueStart;
|
||||
SourceLocation valueEnd;
|
||||
|
||||
if (reader.extractExactChar('"')) {
|
||||
valueStart = reader.location();
|
||||
reader.extractWhile(&path, [](char c) { return c != '"' && c != '\r' && c != '\n'; });
|
||||
valueEnd = reader.location();
|
||||
valid = reader.extractExactChar('"');
|
||||
}
|
||||
|
||||
|
|
@ -197,6 +202,8 @@ void Parser::processDirective()
|
|||
return;
|
||||
}
|
||||
|
||||
path = expandDollarVars({ valueStart, valueEnd }, path);
|
||||
|
||||
std::replace(path.begin(), path.end(), '\\', '/');
|
||||
includeNewFile(path, nullptr, { start, end });
|
||||
}
|
||||
|
|
|
|||
|
|
@ -716,3 +716,32 @@ R"(<region> sample=foo bar baz .wav key=69 )");
|
|||
REQUIRE(mock.fullBlockHeaders == expectedHeaders);
|
||||
REQUIRE(mock.fullBlockMembers == expectedMembers);
|
||||
}
|
||||
|
||||
TEST_CASE("[Parsing] Expanded value of #include")
|
||||
{
|
||||
sfz::Parser parser;
|
||||
ParsingMocker mock;
|
||||
parser.setListener(&mock);
|
||||
parser.parseFile(fs::current_path() / "tests/TestFiles/dollar_include_main.sfz");
|
||||
|
||||
std::vector<std::vector<sfz::Opcode>> expectedMembers = {
|
||||
{{"sample", "*sine"}},
|
||||
};
|
||||
std::vector<std::string> expectedHeaders = {
|
||||
"region"
|
||||
};
|
||||
std::vector<sfz::Opcode> expectedOpcodes;
|
||||
|
||||
for (auto& members: expectedMembers)
|
||||
for (auto& opcode: members)
|
||||
expectedOpcodes.push_back(opcode);
|
||||
|
||||
REQUIRE(mock.beginnings == 1);
|
||||
REQUIRE(mock.endings == 1);
|
||||
REQUIRE(mock.errors.empty());
|
||||
REQUIRE(mock.warnings.empty());
|
||||
REQUIRE(mock.opcodes == expectedOpcodes);
|
||||
REQUIRE(mock.headers == expectedHeaders);
|
||||
REQUIRE(mock.fullBlockHeaders == expectedHeaders);
|
||||
REQUIRE(mock.fullBlockMembers == expectedMembers);
|
||||
}
|
||||
|
|
|
|||
3
tests/TestFiles/dollar_include_main.sfz
Normal file
3
tests/TestFiles/dollar_include_main.sfz
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#define $foo dollar
|
||||
#define $bar sine
|
||||
#include "$foo_include_$bar.sfz"
|
||||
1
tests/TestFiles/dollar_include_sine.sfz
Normal file
1
tests/TestFiles/dollar_include_sine.sfz
Normal file
|
|
@ -0,0 +1 @@
|
|||
<region> sample=*sine
|
||||
Loading…
Add table
Reference in a new issue