summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--source/slang/slang-syntax.cpp11
-rw-r--r--source/slang/slang-syntax.h17
2 files changed, 27 insertions, 1 deletions
diff --git a/source/slang/slang-syntax.cpp b/source/slang/slang-syntax.cpp
index e41e5517c..d74e3a993 100644
--- a/source/slang/slang-syntax.cpp
+++ b/source/slang/slang-syntax.cpp
@@ -12,7 +12,7 @@ namespace Slang
bool BasicExpressionType::EqualsImpl(Type * type)
{
- auto basicType = dynamicCast<const BasicExpressionType>(type);
+ auto basicType = as<BasicExpressionType>(type);
return basicType && basicType->baseType == this->baseType;
}
@@ -85,6 +85,15 @@ bool SyntaxClassBase::isSubClassOfImpl(SyntaxClassBase const& super) const
return false;
}
+NodeBase* _dynamicCastImpl(NodeBase* node, SyntaxClassBase const& toClass)
+{
+ if(!node) return nullptr;
+ if(node->getClass().isSubClassOfImpl(toClass))
+ return node;
+ return nullptr;
+}
+
+
void Type::accept(IValVisitor* visitor, void* extra)
{
accept((ITypeVisitor*)visitor, extra);
diff --git a/source/slang/slang-syntax.h b/source/slang/slang-syntax.h
index 86cc4b902..35c21227c 100644
--- a/source/slang/slang-syntax.h
+++ b/source/slang/slang-syntax.h
@@ -541,6 +541,23 @@ namespace Slang
return SyntaxClass<T>::getClass();
}
+ NodeBase* _dynamicCastImpl(NodeBase* node, SyntaxClassBase const& toClass);
+
+ template<typename T>
+ T* dynamicCast(NodeBase* node)
+ {
+ return (T*) _dynamicCastImpl(node, getClass<T>());
+ }
+
+ template<typename T>
+ const T* dynamicCast(const NodeBase* node) { return dynamicCast<T>(const_cast<NodeBase*>(node)); }
+
+ template<typename T>
+ T* as(NodeBase* node) { return dynamicCast<T>(node); }
+
+ template<typename T>
+ const T* as(const NodeBase* node) { return dynamicCast<T>(const_cast<NodeBase*>(node)); }
+
struct SubstitutionSet
{
RefPtr<Substitutions> substitutions;