diff options
| author | Tim Foley <tfoleyNV@users.noreply.github.com> | 2017-08-11 14:04:24 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-08-11 14:04:24 -0700 |
| commit | 495f88167527945e680e091d49b5705f5f1af1f9 (patch) | |
| tree | 8be4a0505bd121edbbcf5dd5b3cd9d43c51ec377 /source/slang/syntax.cpp | |
| parent | db4079f7e3635a6a61b8725643b1d7ecf68b97d8 (diff) | |
| parent | b2febc7966c2533f756a6829656423f05b2f21e5 (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.cpp | 40 |
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); |
