summaryrefslogtreecommitdiffstats
path: root/source/slang/syntax.cpp
diff options
context:
space:
mode:
authorTim Foley <tfoleyNV@users.noreply.github.com>2017-08-11 14:04:24 -0700
committerGitHub <noreply@github.com>2017-08-11 14:04:24 -0700
commit495f88167527945e680e091d49b5705f5f1af1f9 (patch)
tree8be4a0505bd121edbbcf5dd5b3cd9d43c51ec377 /source/slang/syntax.cpp
parentdb4079f7e3635a6a61b8725643b1d7ecf68b97d8 (diff)
parentb2febc7966c2533f756a6829656423f05b2f21e5 (diff)
Merge pull request #157 from tfoleyNV/syntax-lookup
Look up declaration keywords using ordinary scoping.
Diffstat (limited to 'source/slang/syntax.cpp')
-rw-r--r--source/slang/syntax.cpp40
1 files changed, 35 insertions, 5 deletions
diff --git a/source/slang/syntax.cpp b/source/slang/syntax.cpp
index 33fa5be20..0135e2316 100644
--- a/source/slang/syntax.cpp
+++ b/source/slang/syntax.cpp
@@ -62,11 +62,14 @@ namespace Slang
#undef SYNTAX_CLASS
#undef ABSTRACT_SYNTAX_CLASS
-#define ABSTRACT_SYNTAX_CLASS(NAME, BASE) /* empty */
-#define SYNTAX_CLASS(NAME, BASE) \
- void NAME::accept(NAME::Visitor* visitor, void* extra) \
- { visitor->dispatch_##NAME(this, extra); } \
- void* SyntaxClassBase::Impl<NAME>::createFunc() { return new NAME(); }
+#define ABSTRACT_SYNTAX_CLASS(NAME, BASE) \
+ SyntaxClassBase::ClassInfo const SyntaxClassBase::Impl<NAME>::kClassInfo = { #NAME, &SyntaxClassBase::Impl<BASE>::kClassInfo, nullptr };
+
+#define SYNTAX_CLASS(NAME, BASE) \
+ void NAME::accept(NAME::Visitor* visitor, void* extra) \
+ { visitor->dispatch_##NAME(this, extra); } \
+ void* SyntaxClassBase::Impl<NAME>::createFunc() { return new NAME(); } \
+ SyntaxClassBase::ClassInfo const SyntaxClassBase::Impl<NAME>::kClassInfo = { #NAME, &SyntaxClassBase::Impl<BASE>::kClassInfo, &SyntaxClassBase::Impl<NAME>::createFunc };
#include "expr-defs.h"
#include "decl-defs.h"
#include "modifier-defs.h"
@@ -74,8 +77,35 @@ namespace Slang
#include "type-defs.h"
#include "val-defs.h"
+SyntaxClassBase::ClassInfo const SyntaxClassBase::Impl<RefObject>::kClassInfo = { "RefObject", nullptr, nullptr };
+
+ABSTRACT_SYNTAX_CLASS(SyntaxNodeBase, RefObject);
+ABSTRACT_SYNTAX_CLASS(SyntaxNode, SyntaxNodeBase);
+ABSTRACT_SYNTAX_CLASS(ModifiableSyntaxNode, SyntaxNode);
+ABSTRACT_SYNTAX_CLASS(DeclBase, ModifiableSyntaxNode);
+ABSTRACT_SYNTAX_CLASS(Decl, DeclBase);
+ABSTRACT_SYNTAX_CLASS(Stmt, ModifiableSyntaxNode);
+ABSTRACT_SYNTAX_CLASS(Val, RefObject);
+ABSTRACT_SYNTAX_CLASS(Type, Val);
+ABSTRACT_SYNTAX_CLASS(Modifier, SyntaxNodeBase);
+ABSTRACT_SYNTAX_CLASS(Expr, SyntaxNode);
+
#include "object-meta-end.h"
+bool SyntaxClassBase::isSubClassOfImpl(SyntaxClassBase const& super) const
+{
+ SyntaxClassBase::ClassInfo const* info = classInfo;
+ while (info)
+ {
+ if (info == super.classInfo)
+ return true;
+
+ info = info->baseClass;
+ }
+
+ return false;
+}
+
void Type::accept(IValVisitor* visitor, void* extra)
{
accept((ITypeVisitor*)visitor, extra);