00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef COMMA_AST_SCOPE_HDR_GUARD
00010 #define COMMA_AST_SCOPE_HDR_GUARD
00011
00012 #include "comma/ast/AstBase.h"
00013 #include "llvm/ADT/SmallPtrSet.h"
00014 #include <vector>
00015
00016 namespace comma {
00017
00018 class Scope {
00019
00020 public:
00021 enum ScopeKind {
00022 CUNIT_SCOPE,
00023 MODEL_SCOPE,
00024 FUNCTION_SCOPE
00025 };
00026
00027
00028 Scope();
00029
00030
00031 ScopeKind getKind() const { return kind; }
00032
00033
00034 Scope *pushScope(ScopeKind kind);
00035
00036
00037
00038 Scope *popScope();
00039
00040 void addType(ModelType *type);
00041
00042
00043
00044
00045 ModelType *lookupType(const IdentifierInfo *info, bool traverse = true) const;
00046
00047 private:
00048
00049 Scope(ScopeKind kind, Scope *parent);
00050
00051 ScopeKind kind;
00052 Scope *parentScope;
00053 Scope *childScope;
00054
00055
00056 typedef llvm::SmallPtrSet<IdentifierInfo*, 16> IdInfoSet;
00057 IdInfoSet identifiers;
00058
00059
00060
00061 struct DeclInfo {
00062 DeclInfo(Scope *scope) : scope(scope), type(0) { }
00063
00064
00065 Scope *scope;
00066 ModelType *type;
00067 };
00068
00069 typedef std::vector<DeclInfo> DeclStack;
00070
00071 DeclInfo *lookupDeclInfo(IdentifierInfo *idInfo);
00072 void ensureDisjointDeclarations() const;
00073 };
00074
00075 }
00076
00077 #endif