summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorYong He <yongh@outlook.com>2018-01-03 17:15:03 -0800
committerYong He <yongh@outlook.com>2018-01-03 17:15:03 -0800
commit550405d2de2ca617046e73fe5ec7e5e1765a5c97 (patch)
tree89b1e0e3f0e95ea0bf586bd67fa36066f0021ce7 /source
parent61b206db5fc5a4c9d42fa3fbb4f50624b6c6c6c5 (diff)
Fix type lookup of global type arguments
Global type argument lookup should be done in both loaded modules and current trnaslation units. This is the same as the logic of spReflection_FindTypeByName, so it is extracted into `CompileRequest::lookupGlobalDecl(Name*)` method and reused in places.
Diffstat (limited to 'source')
-rw-r--r--source/slang/check.cpp3
-rw-r--r--source/slang/compiler.h2
-rw-r--r--source/slang/reflection.cpp12
-rw-r--r--source/slang/slang.cpp16
4 files changed, 21 insertions, 12 deletions
diff --git a/source/slang/check.cpp b/source/slang/check.cpp
index dc5efbd73..46ed9da15 100644
--- a/source/slang/check.cpp
+++ b/source/slang/check.cpp
@@ -6777,7 +6777,8 @@ namespace Slang
// Lookup generic parameter types in global scope
for (auto name : entryPoint->genericParameterTypeNames)
{
- if (!translationUnitSyntax->memberDictionary.TryGetValue(name, firstDeclWithName))
+ firstDeclWithName = entryPoint->compileRequest->lookupGlobalDecl(name);
+ if (!firstDeclWithName)
{
// If there doesn't appear to be any such declaration, then
// we need to diagnose it as an error, and then bail out.
diff --git a/source/slang/compiler.h b/source/slang/compiler.h
index 2302c77c0..1fca4751c 100644
--- a/source/slang/compiler.h
+++ b/source/slang/compiler.h
@@ -373,6 +373,8 @@ namespace Slang
Name* name,
SourceLoc const& loc);
+ Decl* lookupGlobalDecl(Name* name);
+
SourceManager* getSourceManager()
{
return sourceManager;
diff --git a/source/slang/reflection.cpp b/source/slang/reflection.cpp
index 59b50891c..c9de75d6e 100644
--- a/source/slang/reflection.cpp
+++ b/source/slang/reflection.cpp
@@ -437,18 +437,8 @@ SLANG_API SlangReflectionType * spReflection_FindTypeByName(SlangReflection * re
if (compileRequest->types.TryGetValue(name, result))
return (SlangReflectionType*)result.Ptr();
- Decl* resultDecl = nullptr;
auto nameObj = compileRequest->getNamePool()->getName(name);
- for (auto module : compileRequest->loadedModulesList)
- {
- if (module->moduleDecl->memberDictionary.TryGetValue(nameObj, resultDecl))
- break;
- }
- for (auto transUnit : compileRequest->translationUnits)
- {
- if (transUnit->SyntaxNode->memberDictionary.TryGetValue(nameObj, resultDecl))
- break;
- }
+ Decl* resultDecl = compileRequest->lookupGlobalDecl(nameObj);
if (resultDecl)
{
RefPtr<DeclRefType> declRefType = new DeclRefType();
diff --git a/source/slang/slang.cpp b/source/slang/slang.cpp
index 3156e5008..0b3e0ceb7 100644
--- a/source/slang/slang.cpp
+++ b/source/slang/slang.cpp
@@ -590,6 +590,22 @@ RefPtr<ModuleDecl> CompileRequest::findOrImportModule(
loc);
}
+Decl * CompileRequest::lookupGlobalDecl(Name * name)
+{
+ Decl* resultDecl = nullptr;
+ for (auto module : loadedModulesList)
+ {
+ if (module->moduleDecl->memberDictionary.TryGetValue(name, resultDecl))
+ break;
+ }
+ for (auto transUnit : translationUnits)
+ {
+ if (transUnit->SyntaxNode->memberDictionary.TryGetValue(name, resultDecl))
+ break;
+ }
+ return resultDecl;
+}
+
RefPtr<ModuleDecl> findOrImportModule(
CompileRequest* request,
Name* name,