summaryrefslogtreecommitdiff
path: root/src/shared
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/cplusplus/AST.h49
-rw-r--r--src/shared/cplusplus/CheckDeclaration.cpp21
-rw-r--r--src/shared/cplusplus/CheckDeclarator.cpp1
-rw-r--r--src/shared/cplusplus/CheckName.cpp6
-rw-r--r--src/shared/cplusplus/CheckSpecifier.cpp3
-rw-r--r--src/shared/cplusplus/Control.cpp1
6 files changed, 69 insertions, 12 deletions
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index f5e3ac42fc..d29342b30a 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -60,6 +60,20 @@
CPLUSPLUS_BEGIN_HEADER
CPLUSPLUS_BEGIN_NAMESPACE
+template <typename _Tp>
+class List: public Managed
+{
+ List(const List &other);
+ void operator =(const List &other);
+
+public:
+ List()
+ { }
+
+ _Tp value;
+ List *next;
+};
+
class CPLUSPLUS_EXPORT AST: public Managed
{
AST(const AST &other);
@@ -352,6 +366,9 @@ public:
unsigned semicolon_token;
public:
+ List<Declaration *> *symbols;
+
+public:
virtual unsigned firstToken() const;
virtual unsigned lastToken() const;
@@ -422,6 +439,9 @@ public:
NameAST *name;
BaseSpecifierAST *next;
+public: // annotations
+ BaseClass *symbol;
+
public:
virtual unsigned firstToken() const;
virtual unsigned lastToken() const;
@@ -516,7 +536,7 @@ public:
unsigned rbrace_token;
public: // annotations
- Class *class_symbol;
+ Class *symbol;
public:
virtual unsigned firstToken() const;
@@ -691,6 +711,9 @@ public:
SpecifierAST *cv_qualifier_seq;
ExceptionSpecificationAST *exception_specification;
+public: // annotations
+ Function *symbol;
+
public:
virtual unsigned firstToken() const;
virtual unsigned lastToken() const;
@@ -918,6 +941,9 @@ public:
CtorInitializerAST *ctor_initializer;
StatementAST *function_body;
+public: // annotations
+ Function *symbol;
+
public:
virtual unsigned firstToken() const;
virtual unsigned lastToken() const;
@@ -1060,6 +1086,9 @@ protected:
class CPLUSPLUS_EXPORT NameAST: public ExpressionAST
{
+public: // annotations
+ Name *name;
+
public:
virtual NameAST *clone(MemoryPool *pool) const = 0;
};
@@ -1188,6 +1217,9 @@ public:
SpecifierAST *attributes;
DeclarationAST *linkage_body;
+public: // annotations
+ Namespace *symbol;
+
public:
virtual unsigned firstToken() const;
virtual unsigned lastToken() const;
@@ -1312,6 +1344,9 @@ public:
unsigned equal_token;
ExpressionAST *expression;
+public: // annotations
+ Argument *symbol;
+
public:
virtual unsigned firstToken() const;
virtual unsigned lastToken() const;
@@ -1849,6 +1884,9 @@ public:
unsigned equal_token;
ExpressionAST *type_id;
+public: // annotations
+ Argument *symbol;
+
public:
virtual unsigned firstToken() const;
virtual unsigned lastToken() const;
@@ -1872,6 +1910,9 @@ public:
ExpressionAST *type_id;
public:
+ Argument *symbol;
+
+public:
virtual unsigned firstToken() const;
virtual unsigned lastToken() const;
@@ -1905,6 +1946,9 @@ public:
NameAST *name;
unsigned semicolon_token;
+public: // annotations
+ UsingDeclaration *symbol;
+
public:
virtual unsigned firstToken() const;
virtual unsigned lastToken() const;
@@ -1924,6 +1968,9 @@ public:
unsigned semicolon_token;
public:
+ UsingNamespaceDirective *symbol;
+
+public:
virtual unsigned firstToken() const;
virtual unsigned lastToken() const;
diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp
index 610d57626f..179dd06987 100644
--- a/src/shared/cplusplus/CheckDeclaration.cpp
+++ b/src/shared/cplusplus/CheckDeclaration.cpp
@@ -136,6 +136,7 @@ bool CheckDeclaration::visit(SimpleDeclarationAST *ast)
}
}
+ List<Declaration *> **decl_it = &ast->symbols;
for (DeclaratorListAST *it = ast->declarators; it; it = it->next) {
Name *name = 0;
FullySpecifiedType declTy = semantic()->check(it->declarator, qualTy,
@@ -179,6 +180,10 @@ bool CheckDeclaration::visit(SimpleDeclarationAST *ast)
else if (ty.isTypedef())
symbol->setStorage(Symbol::Typedef);
+ *decl_it = new (translationUnit()->memoryPool()) List<Declaration *>();
+ (*decl_it)->value = symbol;
+ decl_it = &(*decl_it)->next;
+
_scope->enterSymbol(symbol);
}
return false;
@@ -234,6 +239,7 @@ bool CheckDeclaration::visit(FunctionDefinitionAST *ast)
checkFunctionArguments(fun);
+ ast->symbol = fun;
_scope->enterSymbol(fun);
if (ast->ctor_initializer) {
@@ -286,6 +292,7 @@ bool CheckDeclaration::visit(NamespaceAST *ast)
Identifier *id = identifier(ast->identifier_token);
Name *namespaceName = control()->nameId(id);
Namespace *ns = control()->newNamespace(ast->firstToken(), namespaceName);
+ ast->symbol = ns;
_scope->enterSymbol(ns);
semantic()->check(ast->linkage_body, ns->members()); // ### we'll do the merge later.
@@ -310,6 +317,7 @@ bool CheckDeclaration::visit(ParameterDeclarationAST *ast)
_scope, &argName);
FullySpecifiedType exprTy = semantic()->check(ast->expression, _scope);
Argument *arg = control()->newArgument(ast->firstToken(), argName);
+ ast->symbol = arg;
if (ast->expression)
arg->setInitializer(true);
arg->setType(argTy);
@@ -319,15 +327,6 @@ bool CheckDeclaration::visit(ParameterDeclarationAST *ast)
bool CheckDeclaration::visit(TemplateDeclarationAST *ast)
{
-/*
- Template *templ = control()->newTemplate(ast->firstToken());
-
- for (DeclarationAST *param = ast->template_parameters; param;
- param = param->next) {
- semantic()->check(param, templ->members());
- }
-*/
-
Scope *previousScope = switchScope(new Scope(_scope->owner()));
for (DeclarationAST *param = ast->template_parameters; param;
param = param->next) {
@@ -343,6 +342,7 @@ bool CheckDeclaration::visit(TypenameTypeParameterAST *ast)
{
Name *name = semantic()->check(ast->name, _scope);
Argument *arg = control()->newArgument(ast->firstToken(), name); // ### new template type
+ ast->symbol = arg;
_scope->enterSymbol(arg);
return false;
}
@@ -351,6 +351,7 @@ bool CheckDeclaration::visit(TemplateTypeParameterAST *ast)
{
Name *name = semantic()->check(ast->name, _scope);
Argument *arg = control()->newArgument(ast->firstToken(), name); // ### new template type
+ ast->symbol = arg;
_scope->enterSymbol(arg);
return false;
}
@@ -359,6 +360,7 @@ bool CheckDeclaration::visit(UsingAST *ast)
{
Name *name = semantic()->check(ast->name, _scope);
UsingDeclaration *u = control()->newUsingDeclaration(ast->firstToken(), name);
+ ast->symbol = u;
_scope->enterSymbol(u);
return false;
}
@@ -367,6 +369,7 @@ bool CheckDeclaration::visit(UsingDirectiveAST *ast)
{
Name *name = semantic()->check(ast->name, _scope);
UsingNamespaceDirective *u = control()->newUsingNamespaceDirective(ast->firstToken(), name);
+ ast->symbol = u;
_scope->enterSymbol(u);
return false;
}
diff --git a/src/shared/cplusplus/CheckDeclarator.cpp b/src/shared/cplusplus/CheckDeclarator.cpp
index 13120fec58..beb2ed0bca 100644
--- a/src/shared/cplusplus/CheckDeclarator.cpp
+++ b/src/shared/cplusplus/CheckDeclarator.cpp
@@ -158,6 +158,7 @@ bool CheckDeclarator::visit(NestedDeclaratorAST *ast)
bool CheckDeclarator::visit(FunctionDeclaratorAST *ast)
{
Function *fun = control()->newFunction(ast->firstToken());
+ ast->symbol = fun;
fun->setReturnType(_fullySpecifiedType);
if (ast->parameters) {
diff --git a/src/shared/cplusplus/CheckName.cpp b/src/shared/cplusplus/CheckName.cpp
index 09b90f3cb8..dfd8158464 100644
--- a/src/shared/cplusplus/CheckName.cpp
+++ b/src/shared/cplusplus/CheckName.cpp
@@ -121,6 +121,8 @@ bool CheckName::visit(QualifiedNameAST *ast)
names.push_back(semantic()->check(ast->unqualified_name, _scope));
_name = control()->qualifiedNameId(&names[0], names.size(),
ast->global_scope_token != 0);
+
+ ast->name = _name;
return false;
}
@@ -302,6 +304,7 @@ bool CheckName::visit(OperatorFunctionIdAST *ast)
} // switch
_name = control()->operatorNameId(kind);
+ ast->name = _name;
return false;
}
@@ -317,6 +320,7 @@ bool CheckName::visit(SimpleNameAST *ast)
{
Identifier *id = identifier(ast->identifier_token);
_name = control()->nameId(id);
+ ast->name = _name;
return false;
}
@@ -324,6 +328,7 @@ bool CheckName::visit(DestructorNameAST *ast)
{
Identifier *id = identifier(ast->identifier_token);
_name = control()->destructorNameId(id);
+ ast->name = _name;
return false;
}
@@ -342,6 +347,7 @@ bool CheckName::visit(TemplateIdAST *ast)
else
_name = control()->templateNameId(id, &templateArguments[0],
templateArguments.size());
+ ast->name = _name;
return false;
}
diff --git a/src/shared/cplusplus/CheckSpecifier.cpp b/src/shared/cplusplus/CheckSpecifier.cpp
index cb929b868c..20a3662e7b 100644
--- a/src/shared/cplusplus/CheckSpecifier.cpp
+++ b/src/shared/cplusplus/CheckSpecifier.cpp
@@ -300,7 +300,7 @@ bool CheckSpecifier::visit(ClassSpecifierAST *ast)
{
Name *className = semantic()->check(ast->name, _scope);
Class *klass = control()->newClass(ast->firstToken(), className);
- ast->class_symbol = klass;
+ ast->symbol = klass;
unsigned classKey = tokenKind(ast->classkey_token);
if (classKey == T_CLASS)
klass->setClassKey(Class::ClassKey);
@@ -315,6 +315,7 @@ bool CheckSpecifier::visit(ClassSpecifierAST *ast)
for (BaseSpecifierAST *base = ast->base_clause; base; base = base->next) {
Name *baseClassName = semantic()->check(base->name, _scope);
BaseClass *baseClass = control()->newBaseClass(ast->firstToken(), baseClassName);
+ base->symbol = baseClass;
if (base->token_virtual)
baseClass->setVirtual(true);
if (base->token_access_specifier) {
diff --git a/src/shared/cplusplus/Control.cpp b/src/shared/cplusplus/Control.cpp
index e44d84a1ae..4d708f4340 100644
--- a/src/shared/cplusplus/Control.cpp
+++ b/src/shared/cplusplus/Control.cpp
@@ -51,7 +51,6 @@
// THE SOFTWARE.
#include "Control.h"
-#include "MemoryPool.h"
#include "Literals.h"
#include "LiteralTable.h"
#include "TranslationUnit.h"