summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2025-02-13 03:29:36 -0800
committerGitHub <noreply@github.com>2025-02-13 19:29:36 +0800
commitccc75cdd9508a4e19efa22e7c911cc2013f514fa (patch)
tree6cc198fcb0d5a58b58f56705ef134bbd5f584587
parent8406b5647a61fb70be4e041a76c1b64b05a70452 (diff)
Reflection Fixes. (#6346)
* Fix 6317. * Fixes #6316. * Fix cmake preset. --------- Co-authored-by: Ellie Hermaszewska <ellieh@nvidia.com>
-rw-r--r--CMakePresets.json3
-rw-r--r--source/slang/slang-reflection-api.cpp7
-rw-r--r--source/slang/slang.cpp23
-rw-r--r--tools/slang-unit-test/unit-test-function-reflection.cpp11
4 files changed, 39 insertions, 5 deletions
diff --git a/CMakePresets.json b/CMakePresets.json
index b0fa9b8bf..86ba402b2 100644
--- a/CMakePresets.json
+++ b/CMakePresets.json
@@ -12,7 +12,8 @@
"generator": "Ninja Multi-Config",
"binaryDir": "${sourceDir}/build",
"cacheVariables": {
- "CMAKE_MSVC_RUNTIME_LIBRARY": "MultiThreaded$<$<CONFIG:Debug>:Debug>"
+ "CMAKE_MSVC_RUNTIME_LIBRARY": "MultiThreaded$<$<CONFIG:Debug>:Debug>",
+ "SLANG_ENABLE_IR_BREAK_ALLOC": "$<$<CONFIG:Debug>:TRUE>$<$<NOT:$<CONFIG:Debug>>:FALSE>"
}
},
{
diff --git a/source/slang/slang-reflection-api.cpp b/source/slang/slang-reflection-api.cpp
index d1adfedc0..52047a751 100644
--- a/source/slang/slang-reflection-api.cpp
+++ b/source/slang/slang-reflection-api.cpp
@@ -1016,9 +1016,10 @@ SLANG_API SlangReflectionType* spReflection_FindTypeByName(
SubstitutionSet(genericDeclRef),
astBuilder,
genericDeclRef.getDecl()->inner);
- return convert(DeclRefType::create(
- astBuilder,
- createDefaultSubstitutionsIfNeeded(astBuilder, nullptr, innerDeclRef)));
+ if (as<AggTypeDecl>(innerDeclRef.getDecl()) ||
+ as<SimpleTypeDecl>(innerDeclRef.getDecl()))
+ return convert(DeclRefType::create(astBuilder, innerDeclRef));
+ return nullptr;
}
if (as<ErrorType>(result))
diff --git a/source/slang/slang.cpp b/source/slang/slang.cpp
index ee0aa4c14..c316974f1 100644
--- a/source/slang/slang.cpp
+++ b/source/slang/slang.cpp
@@ -2714,6 +2714,16 @@ Expr* ComponentType::findDeclFromString(String const& name, DiagnosticSink* sink
return result;
}
+bool isSimpleName(String const& name)
+{
+ for (char c : name)
+ {
+ if (!CharUtil::isAlphaOrDigit(c) && c != '_' && c != '$')
+ return false;
+ }
+ return true;
+}
+
Expr* ComponentType::findDeclFromStringInType(
Type* type,
String const& name,
@@ -2743,8 +2753,19 @@ Expr* ComponentType::findDeclFromStringInType(
SLANG_AST_BUILDER_RAII(linkage->getASTBuilder());
- Expr* expr = linkage->parseTermString(name, scope);
+ Expr* expr = nullptr;
+ if (isSimpleName(name))
+ {
+ auto varExpr = astBuilder->create<VarExpr>();
+ varExpr->scope = scope;
+ varExpr->name = getLinkage()->getNamePool()->getName(name);
+ expr = varExpr;
+ }
+ else
+ {
+ expr = linkage->parseTermString(name, scope);
+ }
SemanticsContext context(linkage->getSemanticsForReflection());
context = context.allowStaticReferenceToNonStaticMember().withSink(sink);
diff --git a/tools/slang-unit-test/unit-test-function-reflection.cpp b/tools/slang-unit-test/unit-test-function-reflection.cpp
index 3ce6ab7a5..2f57d4151 100644
--- a/tools/slang-unit-test/unit-test-function-reflection.cpp
+++ b/tools/slang-unit-test/unit-test-function-reflection.cpp
@@ -42,6 +42,9 @@ SLANG_UNIT_TEST(functionReflection)
int bar1(IFloat a, IFloat b) { return 0; }
int bar2<T>(T a, float3 b) { return 0; }
int bar3(float3 b) { return 0; }
+ int bar4<T:IFloat>(T a){return 0;}
+
+ struct Foo { __init() {} }
)";
auto moduleName = "moduleG" + String(Process::getId());
@@ -205,4 +208,12 @@ SLANG_UNIT_TEST(functionReflection)
resolvedFunctionReflection = bar3Reflection->specializeWithArgTypes(1, argTypes);
SLANG_CHECK(resolvedFunctionReflection != nullptr);
SLANG_CHECK(resolvedFunctionReflection == bar3Reflection);
+
+ // GitHub issue #6317: bar2 is a function, not a type, so it should not be found.
+ SLANG_CHECK(module->getLayout()->findTypeByName("bar4") == nullptr);
+
+ auto fooType = module->getLayout()->findTypeByName("Foo");
+ SLANG_CHECK_ABORT(fooType != nullptr);
+ auto ctor = module->getLayout()->findFunctionByNameInType(fooType, "$init");
+ SLANG_CHECK(ctor != nullptr);
}