Skip to content

Commit 46aad44

Browse files
committed
Add an error when importing a symbol not existing in module
1 parent de4a36a commit 46aad44

File tree

3 files changed

+34
-11
lines changed

3 files changed

+34
-11
lines changed

include/NZSL/Lang/ErrorList.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ NZSL_SHADERLANG_COMPILER_ERROR(FunctionCallUnmatchingParameterType, "function {}
102102
NZSL_SHADERLANG_COMPILER_ERROR(FunctionDeclarationInsideFunction, "a function cannot be defined inside another function")
103103
NZSL_SHADERLANG_COMPILER_ERROR(IdentifierAlreadyUsed, "identifier {} is already used", std::string)
104104
NZSL_SHADERLANG_COMPILER_ERROR(ImportIdentifierAlreadyPresent, "{} identifier was already imported", std::string)
105+
NZSL_SHADERLANG_COMPILER_ERROR(ImportIdentifierNotFound, "identifier {} not found in module {}", std::string, std::string)
105106
NZSL_SHADERLANG_COMPILER_ERROR(ImportMultipleWildcard, "only one wildcard can be present in an import directive")
106107
NZSL_SHADERLANG_COMPILER_ERROR(ImportWildcardRename, "wildcard cannot be renamed")
107108
NZSL_SHADERLANG_COMPILER_ERROR(IndexRequiresIntegerIndices, "index access requires integer indices (got {})", std::string)

src/NZSL/Ast/SanitizeVisitor.cpp

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2580,20 +2580,23 @@ namespace nzsl::Ast
25802580
std::vector<DeclareAliasStatementPtr> aliasStatements;
25812581
std::vector<DeclareConstStatementPtr> constStatements;
25822582

2583-
std::vector<std::string> wildcardImport{ std::string{} };
2584-
2585-
auto CheckImport = [&](const std::string& identifier) -> std::pair<bool, const std::vector<std::string>*>
2583+
auto CheckImport = [&](const std::string& identifier) -> std::pair<bool, std::vector<std::string>>
25862584
{
25872585
auto it = importedSymbols.find(identifier);
25882586
if (it == importedSymbols.end())
25892587
{
25902588
if (!importEverythingElse)
2591-
return { false, nullptr };
2589+
return { false, {} };
25922590

2593-
return { true, &wildcardImport };
2591+
return { true, { std::string{} } };
25942592
}
25952593
else
2596-
return { true, &it->second };
2594+
{
2595+
std::vector<std::string> imports = std::move(it->second);
2596+
importedSymbols.erase(it);
2597+
2598+
return { true, std::move(imports) };
2599+
}
25972600
};
25982601

25992602
ExportVisitor::Callbacks callbacks;
@@ -2617,7 +2620,7 @@ namespace nzsl::Ast
26172620
return ShaderBuilder::Constant(*node.constIndex, GetConstantType(*value));
26182621
};
26192622

2620-
for (const std::string& aliasName : *aliasesName)
2623+
for (const std::string& aliasName : aliasesName)
26212624
{
26222625
if (aliasName.empty())
26232626
{
@@ -2644,7 +2647,7 @@ namespace nzsl::Ast
26442647
if (moduleData.dependenciesVisitor)
26452648
moduleData.dependenciesVisitor->MarkFunctionAsUsed(*node.funcIndex);
26462649

2647-
for (const std::string& aliasName : *aliasesName)
2650+
for (const std::string& aliasName : aliasesName)
26482651
{
26492652
if (aliasName.empty())
26502653
{
@@ -2671,7 +2674,7 @@ namespace nzsl::Ast
26712674
if (moduleData.dependenciesVisitor)
26722675
moduleData.dependenciesVisitor->MarkStructAsUsed(*node.structIndex);
26732676

2674-
for (const std::string& aliasName : *aliasesName)
2677+
for (const std::string& aliasName : aliasesName)
26752678
{
26762679
if (aliasName.empty())
26772680
{
@@ -2690,6 +2693,12 @@ namespace nzsl::Ast
26902693
ExportVisitor exportVisitor;
26912694
exportVisitor.Visit(*m_context->currentModule->importedModules[moduleIndex].module->rootNode, callbacks);
26922695

2696+
if (!importedSymbols.empty())
2697+
{
2698+
for (const auto& [identifier, aliasesName] : importedSymbols)
2699+
throw CompilerImportIdentifierNotFoundError{ node.sourceLocation, identifier, node.moduleName };
2700+
}
2701+
26932702
if (aliasStatements.empty() && constStatements.empty())
26942703
return ShaderBuilder::NoOp();
26952704

tests/src/Tests/ErrorsTests.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -842,26 +842,39 @@ module Module;
842842
843843
external
844844
{
845+
[binding(0)]
845846
data: mat4[f32]
846847
}
847848
)";
848849

849-
std::string_view shaderSource = R"(
850+
std::string_view wildcardImportSource = R"(
850851
[nzsl_version("1.0")]
851852
module;
852853
853854
import * from Module;
854855
)";
855856

856-
nzsl::Ast::ModulePtr shaderModule = nzsl::Parse(shaderSource);
857+
nzsl::Ast::ModulePtr shaderModule;
857858

858859
auto directoryModuleResolver = std::make_shared<nzsl::FilesystemModuleResolver>();
859860
directoryModuleResolver->RegisterModule(importedSource);
860861

861862
nzsl::Ast::SanitizeVisitor::Options sanitizeOpt;
862863
sanitizeOpt.moduleResolver = directoryModuleResolver;
863864

865+
shaderModule = nzsl::Parse(wildcardImportSource);
864866
CHECK_THROWS_WITH(nzsl::Ast::Sanitize(*shaderModule, sanitizeOpt), "(5,1 -> 21): CModuleFeatureMismatch error: module Module requires feature primitive_externals");
867+
868+
std::string_view nonExistentImportShaderSource = R"(
869+
[nzsl_version("1.0")]
870+
[feature(primitive_externals)]
871+
module;
872+
873+
import Foo from Module;
874+
)";
875+
876+
shaderModule = nzsl::Parse(nonExistentImportShaderSource);
877+
CHECK_THROWS_WITH(nzsl::Ast::Sanitize(*shaderModule, sanitizeOpt), "(6,1 -> 23): CImportIdentifierNotFound error: identifier Foo not found in module Module");
865878
}
866879

867880
/************************************************************************/

0 commit comments

Comments
 (0)