forked from qt-creator/qt-creator
Merged ScopedSymbol and Scope.
This commit is contained in:
@@ -76,13 +76,13 @@ public:
|
||||
}
|
||||
|
||||
protected:
|
||||
bool process(ScopedSymbol *symbol)
|
||||
bool process(Scope *symbol)
|
||||
{
|
||||
if (! _scope) {
|
||||
Scope *scope = symbol->members();
|
||||
Scope *scope = symbol;
|
||||
|
||||
for (unsigned i = 0; i < scope->symbolCount(); ++i) {
|
||||
accept(scope->symbolAt(i));
|
||||
for (unsigned i = 0; i < scope->memberCount(); ++i) {
|
||||
accept(scope->memberAt(i));
|
||||
|
||||
if (_scope)
|
||||
return false;
|
||||
@@ -388,14 +388,6 @@ Symbol *Document::globalSymbolAt(unsigned index) const
|
||||
return _globalNamespace->memberAt(index);
|
||||
}
|
||||
|
||||
Scope *Document::globalSymbols() const
|
||||
{
|
||||
if (! _globalNamespace)
|
||||
return 0;
|
||||
|
||||
return _globalNamespace->members();
|
||||
}
|
||||
|
||||
Namespace *Document::globalNamespace() const
|
||||
{
|
||||
return _globalNamespace;
|
||||
@@ -411,20 +403,20 @@ Scope *Document::scopeAt(unsigned line, unsigned column)
|
||||
FindScopeAt findScopeAt(_translationUnit, line, column);
|
||||
if (Scope *scope = findScopeAt(_globalNamespace))
|
||||
return scope;
|
||||
return globalSymbols();
|
||||
return globalNamespace();
|
||||
}
|
||||
|
||||
Symbol *Document::lastVisibleSymbolAt(unsigned line, unsigned column) const
|
||||
{
|
||||
return lastVisibleSymbolAt(line, column, globalSymbols());
|
||||
return lastVisibleSymbolAt(line, column, globalNamespace());
|
||||
}
|
||||
|
||||
Symbol *Document::lastVisibleSymbolAt(unsigned line, unsigned column, Scope *scope) const
|
||||
{
|
||||
Symbol *previousSymbol = 0;
|
||||
|
||||
for (unsigned i = 0; i < scope->symbolCount(); ++i) {
|
||||
Symbol *symbol = scope->symbolAt(i);
|
||||
for (unsigned i = 0; i < scope->memberCount(); ++i) {
|
||||
Symbol *symbol = scope->memberAt(i);
|
||||
if (symbol->line() > line)
|
||||
break;
|
||||
|
||||
@@ -432,8 +424,8 @@ Symbol *Document::lastVisibleSymbolAt(unsigned line, unsigned column, Scope *sco
|
||||
}
|
||||
|
||||
if (previousSymbol) {
|
||||
if (ScopedSymbol *scoped = previousSymbol->asScopedSymbol()) {
|
||||
if (Symbol *member = lastVisibleSymbolAt(line, column, scoped->members()))
|
||||
if (Scope *scope = previousSymbol->asScope()) {
|
||||
if (Symbol *member = lastVisibleSymbolAt(line, column, scope))
|
||||
return member;
|
||||
}
|
||||
}
|
||||
@@ -558,7 +550,7 @@ void Document::check(CheckMode mode)
|
||||
semantic.setSkipFunctionBodies(true);
|
||||
|
||||
_globalNamespace = _control->newNamespace(0);
|
||||
Scope *globals = _globalNamespace->members();
|
||||
Scope *globals = _globalNamespace;
|
||||
if (! _translationUnit->ast())
|
||||
return; // nothing to do.
|
||||
|
||||
|
||||
@@ -84,7 +84,6 @@ public:
|
||||
|
||||
unsigned globalSymbolCount() const;
|
||||
Symbol *globalSymbolAt(unsigned index) const;
|
||||
Scope *globalSymbols() const; // ### deprecate?
|
||||
|
||||
Namespace *globalNamespace() const;
|
||||
void setGlobalNamespace(Namespace *globalNamespace); // ### internal
|
||||
|
||||
@@ -401,7 +401,7 @@ FullySpecifiedType DeprecatedGenTemplateInstance::instantiate(const Name *classN
|
||||
{
|
||||
if (className) {
|
||||
if (const TemplateNameId *templId = className->asTemplateNameId()) {
|
||||
if (Class *klass = candidate->enclosingSymbol()->asClass()) {
|
||||
if (Class *klass = candidate->scope()->asClass()) {
|
||||
DeprecatedGenTemplateInstance::Substitution subst;
|
||||
|
||||
for (unsigned i = 0; i < templId->templateArgumentCount(); ++i) {
|
||||
|
||||
@@ -209,7 +209,7 @@ bool FindUsages::checkCandidates(const QList<LookupItem> &candidates) const
|
||||
const LookupItem &r = candidates.at(i);
|
||||
|
||||
if (Symbol *s = r.declaration()) {
|
||||
if (_declSymbol->scope() && (_declSymbol->scope()->isPrototypeScope() || _declSymbol->scope()->isBlockScope())) {
|
||||
if (_declSymbol->scope() && (_declSymbol->scope()->isFunction() || _declSymbol->scope()->isBlock())) {
|
||||
if (s->scope() != _declSymbol->scope())
|
||||
return false;
|
||||
|
||||
@@ -240,19 +240,12 @@ void FindUsages::checkExpression(unsigned startToken, unsigned endToken, Scope *
|
||||
reportResult(endToken, results);
|
||||
}
|
||||
|
||||
Scope *FindUsages::switchScope(ScopedSymbol *symbol)
|
||||
{
|
||||
if (! symbol)
|
||||
return _currentScope; // ### assert?
|
||||
|
||||
return switchScope(symbol->members());
|
||||
}
|
||||
|
||||
Scope *FindUsages::switchScope(Scope *scope)
|
||||
{
|
||||
Scope *previousScope = _currentScope;
|
||||
_currentScope = scope;
|
||||
return previousScope;
|
||||
if (! scope)
|
||||
return _currentScope;
|
||||
|
||||
return switchScope(scope);
|
||||
}
|
||||
|
||||
void FindUsages::statement(StatementAST *ast)
|
||||
@@ -345,7 +338,7 @@ bool FindUsages::visit(DeclaratorAST *ast)
|
||||
return false;
|
||||
}
|
||||
|
||||
void FindUsages::declarator(DeclaratorAST *ast, ScopedSymbol *symbol)
|
||||
void FindUsages::declarator(DeclaratorAST *ast, Scope *symbol)
|
||||
{
|
||||
if (! ast)
|
||||
return;
|
||||
@@ -493,13 +486,13 @@ void FindUsages::memInitializer(MemInitializerAST *ast)
|
||||
if (! ast)
|
||||
return;
|
||||
|
||||
if (_currentScope->isPrototypeScope()) {
|
||||
Scope *classScope = _currentScope->enclosingClassScope();
|
||||
if (_currentScope->isFunction()) {
|
||||
Class *classScope = _currentScope->enclosingClass();
|
||||
if (! classScope) {
|
||||
if (ClassOrNamespace *binding = _context.lookupType(_currentScope->owner())) {
|
||||
if (ClassOrNamespace *binding = _context.lookupType(_currentScope)) {
|
||||
foreach (Symbol *s, binding->symbols()) {
|
||||
if (Class *k = s->asClass()) {
|
||||
classScope = k->members();
|
||||
classScope = k;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -658,7 +651,7 @@ void FindUsages::translationUnit(TranslationUnitAST *ast)
|
||||
if (! ast)
|
||||
return;
|
||||
|
||||
Scope *previousScope = switchScope(_doc->globalSymbols());
|
||||
Scope *previousScope = switchScope(_doc->globalNamespace());
|
||||
for (DeclarationListAST *it = ast->declaration_list; it; it = it->next) {
|
||||
this->declaration(it->value);
|
||||
}
|
||||
|
||||
@@ -71,7 +71,6 @@ protected:
|
||||
using ASTVisitor::translationUnit;
|
||||
|
||||
Scope *switchScope(Scope *scope);
|
||||
Scope *switchScope(ScopedSymbol *symbol);
|
||||
|
||||
QString matchingLine(const Token &tk) const;
|
||||
|
||||
@@ -97,7 +96,7 @@ protected:
|
||||
|
||||
void objCSelectorArgument(ObjCSelectorArgumentAST *ast);
|
||||
void attribute(AttributeAST *ast);
|
||||
void declarator(DeclaratorAST *ast, ScopedSymbol *symbol = 0);
|
||||
void declarator(DeclaratorAST *ast, Scope *symbol = 0);
|
||||
void qtPropertyDeclarationItem(QtPropertyDeclarationItemAST *ast);
|
||||
void qtInterfaceName(QtInterfaceNameAST *ast);
|
||||
void baseSpecifier(BaseSpecifierAST *ast);
|
||||
|
||||
@@ -99,7 +99,7 @@ Icons::IconType Icons::iconTypeForSymbol(const Symbol *symbol)
|
||||
} else if (symbol->isPrivate()) {
|
||||
return FuncPrivateIconType;
|
||||
}
|
||||
} else if (symbol->scope() && symbol->scope()->isEnumScope()) {
|
||||
} else if (symbol->scope() && symbol->scope()->isEnum()) {
|
||||
return EnumeratorIconType;
|
||||
} else if (symbol->isDeclaration() || symbol->isArgument()) {
|
||||
if (symbol->isPublic()) {
|
||||
|
||||
@@ -68,7 +68,7 @@ static void path_helper(Symbol *symbol, QList<const Name *> *names)
|
||||
if (! symbol)
|
||||
return;
|
||||
|
||||
path_helper(symbol->enclosingSymbol(), names);
|
||||
path_helper(symbol->scope(), names);
|
||||
|
||||
if (symbol->name()) {
|
||||
if (symbol->isClass() || symbol->isNamespace()) {
|
||||
@@ -142,7 +142,7 @@ LookupContext &LookupContext::operator = (const LookupContext &other)
|
||||
|
||||
QList<const Name *> LookupContext::fullyQualifiedName(Symbol *symbol)
|
||||
{
|
||||
QList<const Name *> qualifiedName = path(symbol->enclosingSymbol());
|
||||
QList<const Name *> qualifiedName = path(symbol->scope());
|
||||
addNames(symbol->name(), &qualifiedName, /*add all names*/ true);
|
||||
return qualifiedName;
|
||||
}
|
||||
@@ -238,7 +238,7 @@ ClassOrNamespace *LookupContext::globalNamespace() const
|
||||
|
||||
ClassOrNamespace *LookupContext::lookupType(const Name *name, Scope *scope) const
|
||||
{
|
||||
if (ClassOrNamespace *b = bindings()->lookupType(scope->owner()))
|
||||
if (ClassOrNamespace *b = bindings()->lookupType(scope))
|
||||
return b->lookupType(name);
|
||||
|
||||
return 0;
|
||||
@@ -256,18 +256,18 @@ QList<LookupItem> LookupContext::lookup(const Name *name, Scope *scope) const
|
||||
if (! name)
|
||||
return candidates;
|
||||
|
||||
for (; scope; scope = scope->enclosingScope()) {
|
||||
if ((name->isNameId() || name->isTemplateNameId()) && scope->isBlockScope()) {
|
||||
for (; scope; scope = scope->scope()) {
|
||||
if ((name->isNameId() || name->isTemplateNameId()) && scope->isBlock()) {
|
||||
bindings()->lookupInScope(name, scope, &candidates, /*templateId = */ 0, /*binding=*/ 0);
|
||||
|
||||
if (! candidates.isEmpty())
|
||||
break; // it's a local.
|
||||
|
||||
for (unsigned index = 0; index < scope->symbolCount(); ++index) {
|
||||
Symbol *member = scope->symbolAt(index);
|
||||
for (unsigned index = 0; index < scope->memberCount(); ++index) {
|
||||
Symbol *member = scope->memberAt(index);
|
||||
|
||||
if (UsingNamespaceDirective *u = member->asUsingNamespaceDirective()) {
|
||||
if (Namespace *enclosingNamespace = u->enclosingNamespaceScope()->owner()->asNamespace()) {
|
||||
if (Namespace *enclosingNamespace = u->enclosingNamespace()->asNamespace()) {
|
||||
if (ClassOrNamespace *b = bindings()->lookupType(enclosingNamespace)) {
|
||||
if (ClassOrNamespace *uu = b->lookupType(u->name())) {
|
||||
candidates = uu->find(name);
|
||||
@@ -280,9 +280,8 @@ QList<LookupItem> LookupContext::lookup(const Name *name, Scope *scope) const
|
||||
}
|
||||
}
|
||||
|
||||
} else if (scope->isPrototypeScope()) {
|
||||
Function *fun = scope->owner()->asFunction();
|
||||
bindings()->lookupInScope(name, fun->members(), &candidates, /*templateId = */ 0, /*binding=*/ 0);
|
||||
} else if (Function *fun = scope->asFunction()) {
|
||||
bindings()->lookupInScope(name, fun, &candidates, /*templateId = */ 0, /*binding=*/ 0);
|
||||
|
||||
for (TemplateParameters *it = fun->templateParameters(); it && candidates.isEmpty(); it = it->previous())
|
||||
bindings()->lookupInScope(name, it->scope(), &candidates, /* templateId = */ 0, /*binding=*/ 0);
|
||||
@@ -301,16 +300,13 @@ QList<LookupItem> LookupContext::lookup(const Name *name, Scope *scope) const
|
||||
|
||||
// contunue, and look at the enclosing scope.
|
||||
|
||||
} else if (scope->isObjCMethodScope()) {
|
||||
ObjCMethod *method = scope->owner()->asObjCMethod();
|
||||
bindings()->lookupInScope(name, method->arguments(), &candidates, /*templateId = */ 0, /*binding=*/ 0);
|
||||
} else if (ObjCMethod *method = scope->asObjCMethod()) {
|
||||
bindings()->lookupInScope(name, method, &candidates, /*templateId = */ 0, /*binding=*/ 0);
|
||||
|
||||
if (! candidates.isEmpty())
|
||||
break; // it's a formal argument.
|
||||
|
||||
} else if (scope->isClassScope()) {
|
||||
Class *klass = scope->owner()->asClass();
|
||||
|
||||
} else if (Class *klass = scope->asClass()) {
|
||||
for (TemplateParameters *it = klass->templateParameters(); it && candidates.isEmpty(); it = it->previous())
|
||||
bindings()->lookupInScope(name, it->scope(), &candidates, /* templateId = */ 0, /*binding=*/ 0);
|
||||
|
||||
@@ -324,15 +320,15 @@ QList<LookupItem> LookupContext::lookup(const Name *name, Scope *scope) const
|
||||
return candidates;
|
||||
}
|
||||
|
||||
} else if (scope->isNamespaceScope()) {
|
||||
if (ClassOrNamespace *binding = bindings()->lookupType(scope->owner()))
|
||||
} else if (Namespace *ns = scope->asNamespace()) {
|
||||
if (ClassOrNamespace *binding = bindings()->lookupType(ns))
|
||||
candidates = binding->find(name);
|
||||
|
||||
if (! candidates.isEmpty())
|
||||
return candidates;
|
||||
|
||||
} else if (scope->isObjCClassScope() || scope->isObjCProtocolScope()) {
|
||||
if (ClassOrNamespace *binding = bindings()->lookupType(scope->owner()))
|
||||
} else if (scope->isObjCClass() || scope->isObjCProtocol()) {
|
||||
if (ClassOrNamespace *binding = bindings()->lookupType(scope))
|
||||
candidates = binding->find(name);
|
||||
|
||||
if (! candidates.isEmpty())
|
||||
@@ -456,8 +452,8 @@ void ClassOrNamespace::lookup_helper(const Name *name, ClassOrNamespace *binding
|
||||
if (s->isFriend())
|
||||
continue;
|
||||
|
||||
if (ScopedSymbol *scoped = s->asScopedSymbol()) {
|
||||
if (Class *klass = scoped->asClass()) {
|
||||
if (Scope *scope = s->asScope()) {
|
||||
if (Class *klass = scope->asClass()) {
|
||||
if (const Identifier *id = klass->identifier()) {
|
||||
if (nameId && nameId->isEqualTo(id)) {
|
||||
LookupItem item;
|
||||
@@ -467,12 +463,12 @@ void ClassOrNamespace::lookup_helper(const Name *name, ClassOrNamespace *binding
|
||||
}
|
||||
}
|
||||
}
|
||||
_factory->lookupInScope(name, scoped->members(), result, templateId, binding);
|
||||
_factory->lookupInScope(name, scope, result, templateId, binding);
|
||||
}
|
||||
}
|
||||
|
||||
foreach (Enum *e, binding->enums())
|
||||
_factory->lookupInScope(name, e->members(), result, templateId, binding);
|
||||
_factory->lookupInScope(name, e, result, templateId, binding);
|
||||
|
||||
foreach (ClassOrNamespace *u, binding->usings())
|
||||
lookup_helper(name, u, result, processed, binding->_templateId);
|
||||
@@ -490,7 +486,7 @@ void CreateBindings::lookupInScope(const Name *name, Scope *scope,
|
||||
return;
|
||||
|
||||
} else if (const OperatorNameId *op = name->asOperatorNameId()) {
|
||||
for (Symbol *s = scope->lookat(op->kind()); s; s = s->next()) {
|
||||
for (Symbol *s = scope->find(op->kind()); s; s = s->next()) {
|
||||
if (! s->name())
|
||||
continue;
|
||||
else if (s->isFriend())
|
||||
@@ -505,7 +501,7 @@ void CreateBindings::lookupInScope(const Name *name, Scope *scope,
|
||||
}
|
||||
|
||||
} else if (const Identifier *id = name->identifier()) {
|
||||
for (Symbol *s = scope->lookat(id); s; s = s->next()) {
|
||||
for (Symbol *s = scope->find(id); s; s = s->next()) {
|
||||
if (s->isFriend())
|
||||
continue; // skip friends
|
||||
else if (! id->isEqualTo(s->identifier()))
|
||||
|
||||
@@ -79,13 +79,9 @@ QModelIndex OverviewModel::index(int row, int column, const QModelIndex &parent)
|
||||
Symbol *parentSymbol = static_cast<Symbol *>(parent.internalPointer());
|
||||
Q_ASSERT(parentSymbol);
|
||||
|
||||
ScopedSymbol *scopedSymbol = parentSymbol->asScopedSymbol();
|
||||
Q_ASSERT(scopedSymbol);
|
||||
|
||||
Scope *scope = scopedSymbol->members();
|
||||
Q_ASSERT(scope);
|
||||
|
||||
return createIndex(row, 0, scope->symbolAt(row));
|
||||
Scope *scope = parentSymbol->asScope();
|
||||
Q_ASSERT(scope != 0);
|
||||
return createIndex(row, 0, scope->memberAt(row));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -96,14 +92,12 @@ QModelIndex OverviewModel::parent(const QModelIndex &child) const
|
||||
return QModelIndex();
|
||||
|
||||
if (Scope *scope = symbol->scope()) {
|
||||
Symbol *parentSymbol = scope->owner();
|
||||
if (parentSymbol && parentSymbol->scope()) {
|
||||
if (scope->scope()) {
|
||||
QModelIndex index;
|
||||
if (parentSymbol->scope() && parentSymbol->scope()->owner()
|
||||
&& parentSymbol->scope()->owner()->scope()) // the parent doesn't have a parent
|
||||
index = createIndex(parentSymbol->index(), 0, parentSymbol);
|
||||
if (scope->scope() && scope->scope()->scope()) // the parent doesn't have a parent
|
||||
index = createIndex(scope->index(), 0, scope);
|
||||
else //+1 to account for no symbol item
|
||||
index = createIndex(parentSymbol->index() + 1, 0, parentSymbol);
|
||||
index = createIndex(scope->index() + 1, 0, scope);
|
||||
return index;
|
||||
}
|
||||
}
|
||||
@@ -122,12 +116,9 @@ int OverviewModel::rowCount(const QModelIndex &parent) const
|
||||
Symbol *parentSymbol = static_cast<Symbol *>(parent.internalPointer());
|
||||
Q_ASSERT(parentSymbol);
|
||||
|
||||
if (ScopedSymbol *scopedSymbol = parentSymbol->asScopedSymbol()) {
|
||||
if (!scopedSymbol->isFunction() && !scopedSymbol->isObjCMethod()) {
|
||||
Scope *parentScope = scopedSymbol->members();
|
||||
Q_ASSERT(parentScope);
|
||||
|
||||
return parentScope->symbolCount();
|
||||
if (Scope *parentScope = parentSymbol->asScope()) {
|
||||
if (!parentScope->isFunction() && !parentScope->isObjCMethod()) {
|
||||
return parentScope->memberCount();
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
||||
@@ -88,7 +88,8 @@ QList<LookupItem> ResolveExpression::operator()(ExpressionAST *ast, Scope *scope
|
||||
|
||||
QList<LookupItem> ResolveExpression::resolve(ExpressionAST *ast, Scope *scope)
|
||||
{
|
||||
Q_ASSERT(scope != 0);
|
||||
if (! scope)
|
||||
return QList<LookupItem>();
|
||||
|
||||
Scope *previousVisibleSymbol = _scope;
|
||||
_scope = scope;
|
||||
@@ -174,7 +175,7 @@ bool ResolveExpression::visit(BinaryExpressionAST *ast)
|
||||
|
||||
bool ResolveExpression::visit(CastExpressionAST *ast)
|
||||
{
|
||||
Scope *dummyScope = _context.expressionDocument()->globalSymbols();
|
||||
Scope *dummyScope = _context.expressionDocument()->globalNamespace();
|
||||
FullySpecifiedType ty = sem.check(ast->type_id, dummyScope);
|
||||
addResult(ty, _scope);
|
||||
return false;
|
||||
@@ -199,7 +200,7 @@ bool ResolveExpression::visit(ConditionalExpressionAST *ast)
|
||||
|
||||
bool ResolveExpression::visit(CppCastExpressionAST *ast)
|
||||
{
|
||||
Scope *dummyScope = _context.expressionDocument()->globalSymbols();
|
||||
Scope *dummyScope = _context.expressionDocument()->globalNamespace();
|
||||
FullySpecifiedType ty = sem.check(ast->type_id, dummyScope);
|
||||
addResult(ty, _scope);
|
||||
return false;
|
||||
@@ -221,7 +222,7 @@ bool ResolveExpression::visit(ArrayInitializerAST *)
|
||||
bool ResolveExpression::visit(NewExpressionAST *ast)
|
||||
{
|
||||
if (ast->new_type_id) {
|
||||
Scope *dummyScope = _context.expressionDocument()->globalSymbols();
|
||||
Scope *dummyScope = _context.expressionDocument()->globalNamespace();
|
||||
FullySpecifiedType ty = sem.check(ast->new_type_id->type_specifier_list, dummyScope);
|
||||
ty = sem.check(ast->new_type_id->ptr_operator_list, ty, dummyScope);
|
||||
FullySpecifiedType ptrTy(control()->pointerType(ty));
|
||||
@@ -315,11 +316,9 @@ bool ResolveExpression::visit(ThisExpressionAST *)
|
||||
void ResolveExpression::thisObject()
|
||||
{
|
||||
Scope *scope = _scope;
|
||||
for (; scope; scope = scope->enclosingScope()) {
|
||||
if (scope->isPrototypeScope()) {
|
||||
Function *fun = scope->owner()->asFunction();
|
||||
if (Scope *cscope = scope->enclosingClassScope()) {
|
||||
Class *klass = cscope->owner()->asClass();
|
||||
for (; scope; scope = scope->scope()) {
|
||||
if (Function *fun = scope->asFunction()) {
|
||||
if (Class *klass = scope->enclosingClass()) {
|
||||
FullySpecifiedType classTy(control()->namedType(klass->name()));
|
||||
FullySpecifiedType ptrTy(control()->pointerType(classTy));
|
||||
addResult(ptrTy, fun->scope());
|
||||
@@ -562,7 +561,7 @@ QList<LookupItem> ResolveExpression::getMembers(ClassOrNamespace *binding, const
|
||||
|
||||
Symbol *decl = m.declaration();
|
||||
|
||||
if (Class *klass = decl->enclosingSymbol()->asClass()) {
|
||||
if (Class *klass = decl->scope()->asClass()) {
|
||||
if (klass->templateParameters() != 0) {
|
||||
SubstitutionMap map;
|
||||
|
||||
|
||||
@@ -289,7 +289,7 @@ void Parser::addSymbol(const ParserTreeItem::Ptr &item, const CPlusPlus::Symbol
|
||||
return;
|
||||
|
||||
// skip static local functions
|
||||
// if ((!symbol->scope() || symbol->scope()->owner()->isClass())
|
||||
// if ((!symbol->scope() || symbol->scope()->isClass())
|
||||
// && symbol->isStatic() && symbol->isFunction())
|
||||
// return;
|
||||
|
||||
@@ -320,22 +320,19 @@ void Parser::addSymbol(const ParserTreeItem::Ptr &item, const CPlusPlus::Symbol
|
||||
|
||||
// prevent showing a content of the functions
|
||||
if (!symbol->isFunction()) {
|
||||
const CPlusPlus::ScopedSymbol *scopedSymbol = symbol->asScopedSymbol();
|
||||
if (scopedSymbol) {
|
||||
CPlusPlus::Scope *scope = scopedSymbol->members();
|
||||
if (scope) {
|
||||
CPlusPlus::Scope::iterator cur = scope->firstSymbol();
|
||||
while (cur != scope->lastSymbol()) {
|
||||
const CPlusPlus::Symbol *curSymbol = *cur;
|
||||
++cur;
|
||||
if (!curSymbol)
|
||||
continue;
|
||||
const CPlusPlus::Scope *scope = symbol->asScope();
|
||||
if (scope) {
|
||||
CPlusPlus::Scope::iterator cur = scope->firstMember();
|
||||
while (cur != scope->lastMember()) {
|
||||
const CPlusPlus::Symbol *curSymbol = *cur;
|
||||
++cur;
|
||||
if (!curSymbol)
|
||||
continue;
|
||||
|
||||
// if (!symbol->isClass() && curSymbol->isStatic() && curSymbol->isFunction())
|
||||
// return;
|
||||
// if (!symbol->isClass() && curSymbol->isStatic() && curSymbol->isFunction())
|
||||
// return;
|
||||
|
||||
addSymbol(itemAdd, curSymbol);
|
||||
}
|
||||
addSymbol(itemAdd, curSymbol);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -181,8 +181,8 @@ protected:
|
||||
|
||||
for (TemplateParameters *p = symbol->templateParameters(); p; p = p->previous()) {
|
||||
Scope *scope = p->scope();
|
||||
for (unsigned i = 0; i < scope->symbolCount(); ++i)
|
||||
accept(scope->symbolAt(i));
|
||||
for (unsigned i = 0; i < scope->memberCount(); ++i)
|
||||
accept(scope->memberAt(i));
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -201,7 +201,7 @@ protected:
|
||||
|
||||
virtual bool visit(Declaration *symbol)
|
||||
{
|
||||
if (symbol->enclosingEnumScope() != 0)
|
||||
if (symbol->enclosingEnum() != 0)
|
||||
addStatic(symbol->name());
|
||||
|
||||
if (Function *funTy = symbol->type()->asFunctionType()) {
|
||||
@@ -211,7 +211,7 @@ protected:
|
||||
|
||||
if (symbol->isTypedef())
|
||||
addType(symbol->name());
|
||||
else if (! symbol->type()->isFunctionType() && symbol->enclosingSymbol()->isClass())
|
||||
else if (! symbol->type()->isFunctionType() && symbol->scope()->isClass())
|
||||
addMember(symbol->name());
|
||||
|
||||
return true;
|
||||
@@ -239,8 +239,8 @@ protected:
|
||||
{
|
||||
for (TemplateParameters *p = symbol->templateParameters(); p; p = p->previous()) {
|
||||
Scope *scope = p->scope();
|
||||
for (unsigned i = 0; i < scope->symbolCount(); ++i)
|
||||
accept(scope->symbolAt(i));
|
||||
for (unsigned i = 0; i < scope->memberCount(); ++i)
|
||||
accept(scope->memberAt(i));
|
||||
}
|
||||
|
||||
addType(symbol->name());
|
||||
@@ -251,8 +251,8 @@ protected:
|
||||
{
|
||||
for (TemplateParameters *p = symbol->templateParameters(); p; p = p->previous()) {
|
||||
Scope *scope = p->scope();
|
||||
for (unsigned i = 0; i < scope->symbolCount(); ++i)
|
||||
accept(scope->symbolAt(i));
|
||||
for (unsigned i = 0; i < scope->memberCount(); ++i)
|
||||
accept(scope->memberAt(i));
|
||||
}
|
||||
|
||||
addType(symbol->name());
|
||||
@@ -383,48 +383,48 @@ Scope *CheckSymbols::enclosingScope() const
|
||||
|
||||
if (NamespaceAST *ns = ast->asNamespace()) {
|
||||
if (ns->symbol)
|
||||
return ns->symbol->members();
|
||||
return ns->symbol;
|
||||
|
||||
} else if (ClassSpecifierAST *classSpec = ast->asClassSpecifier()) {
|
||||
if (classSpec->symbol)
|
||||
return classSpec->symbol->members();
|
||||
return classSpec->symbol;
|
||||
|
||||
} else if (FunctionDefinitionAST *funDef = ast->asFunctionDefinition()) {
|
||||
if (funDef->symbol)
|
||||
return funDef->symbol->members();
|
||||
return funDef->symbol;
|
||||
|
||||
} else if (CompoundStatementAST *blockStmt = ast->asCompoundStatement()) {
|
||||
if (blockStmt->symbol)
|
||||
return blockStmt->symbol->members();
|
||||
return blockStmt->symbol;
|
||||
|
||||
} else if (IfStatementAST *ifStmt = ast->asIfStatement()) {
|
||||
if (ifStmt->symbol)
|
||||
return ifStmt->symbol->members();
|
||||
return ifStmt->symbol;
|
||||
|
||||
} else if (WhileStatementAST *whileStmt = ast->asWhileStatement()) {
|
||||
if (whileStmt->symbol)
|
||||
return whileStmt->symbol->members();
|
||||
return whileStmt->symbol;
|
||||
|
||||
} else if (ForStatementAST *forStmt = ast->asForStatement()) {
|
||||
if (forStmt->symbol)
|
||||
return forStmt->symbol->members();
|
||||
return forStmt->symbol;
|
||||
|
||||
} else if (ForeachStatementAST *foreachStmt = ast->asForeachStatement()) {
|
||||
if (foreachStmt->symbol)
|
||||
return foreachStmt->symbol->members();
|
||||
return foreachStmt->symbol;
|
||||
|
||||
} else if (SwitchStatementAST *switchStmt = ast->asSwitchStatement()) {
|
||||
if (switchStmt->symbol)
|
||||
return switchStmt->symbol->members();
|
||||
return switchStmt->symbol;
|
||||
|
||||
} else if (CatchClauseAST *catchClause = ast->asCatchClause()) {
|
||||
if (catchClause->symbol)
|
||||
return catchClause->symbol->members();
|
||||
return catchClause->symbol;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return _doc->globalSymbols();
|
||||
return _doc->globalNamespace();
|
||||
}
|
||||
|
||||
bool CheckSymbols::preVisit(AST *ast)
|
||||
@@ -596,7 +596,7 @@ bool CheckSymbols::hasVirtualDestructor(Class *klass) const
|
||||
const Identifier *id = klass->identifier();
|
||||
if (! id)
|
||||
return false;
|
||||
for (Symbol *s = klass->members()->lookat(id); s; s = s->next()) {
|
||||
for (Symbol *s = klass->find(id); s; s = s->next()) {
|
||||
if (! s->name())
|
||||
continue;
|
||||
else if (s->name()->isDestructorNameId()) {
|
||||
@@ -639,8 +639,8 @@ void CheckSymbols::checkName(NameAST *ast, Scope *scope)
|
||||
if (! scope)
|
||||
scope = enclosingScope();
|
||||
|
||||
if (ast->asDestructorName() != 0 && scope->isClassScope()) {
|
||||
Class *klass = scope->owner()->asClass();
|
||||
if (ast->asDestructorName() != 0 && scope->isClass()) {
|
||||
Class *klass = scope->asClass();
|
||||
if (hasVirtualDestructor(_context.lookupType(klass)))
|
||||
addUse(ast, Use::VirtualMethod);
|
||||
} else if (maybeType(ast->name) || maybeStatic(ast->name)) {
|
||||
@@ -735,7 +735,7 @@ bool CheckSymbols::visit(MemInitializerAST *ast)
|
||||
if (ClassOrNamespace *binding = _context.lookupType(enclosingFunction->symbol)) {
|
||||
foreach (Symbol *s, binding->symbols()) {
|
||||
if (Class *klass = s->asClass()){
|
||||
checkName(ast->name, klass->members());
|
||||
checkName(ast->name, klass);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -876,7 +876,7 @@ void CheckSymbols::addTypeOrStatic(const QList<LookupItem> &candidates, NameAST
|
||||
continue;
|
||||
else if (c->isTypedef() || c->isNamespace() ||
|
||||
c->isClass() || c->isEnum() ||
|
||||
c->isForwardClassDeclaration() || c->isTypenameArgument() || c->enclosingEnumScope() != 0) {
|
||||
c->isForwardClassDeclaration() || c->isTypenameArgument() || c->enclosingEnum() != 0) {
|
||||
|
||||
unsigned line, column;
|
||||
getTokenStartPosition(startToken, &line, &column);
|
||||
@@ -884,7 +884,7 @@ void CheckSymbols::addTypeOrStatic(const QList<LookupItem> &candidates, NameAST
|
||||
|
||||
Use::Kind kind = Use::Type;
|
||||
|
||||
if (c->enclosingEnumScope() != 0)
|
||||
if (c->enclosingEnum() != 0)
|
||||
kind = Use::Static;
|
||||
|
||||
const Use use(line, column, length, kind);
|
||||
@@ -911,7 +911,7 @@ void CheckSymbols::addClassMember(const QList<LookupItem> &candidates, NameAST *
|
||||
continue;
|
||||
else if (! c->isDeclaration())
|
||||
return;
|
||||
else if (! (c->enclosingSymbol() && c->enclosingSymbol()->isClass()))
|
||||
else if (! (c->scope() && c->scope()->isClass()))
|
||||
return; // shadowed
|
||||
else if (c->isTypedef() || c->type()->isFunctionType())
|
||||
return; // shadowed
|
||||
@@ -940,7 +940,7 @@ void CheckSymbols::addStatic(const QList<LookupItem> &candidates, NameAST *ast)
|
||||
Symbol *c = r.declaration();
|
||||
if (! c)
|
||||
return;
|
||||
if (c->scope()->isEnumScope()) {
|
||||
if (c->scope()->isEnum()) {
|
||||
unsigned line, column;
|
||||
getTokenStartPosition(startToken, &line, &column);
|
||||
const unsigned length = tok.length();
|
||||
|
||||
@@ -246,8 +246,8 @@ public:
|
||||
_declarationName = declarationName;
|
||||
_functions = functions;
|
||||
|
||||
for (unsigned i = 0; i < globals->symbolCount(); ++i) {
|
||||
accept(globals->symbolAt(i));
|
||||
for (unsigned i = 0; i < globals->memberCount(); ++i) {
|
||||
accept(globals->memberAt(i));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -350,7 +350,7 @@ struct CanonicalSymbol
|
||||
break;
|
||||
else if (! r.declaration()->scope())
|
||||
break;
|
||||
else if (! r.declaration()->scope()->isClassScope())
|
||||
else if (! r.declaration()->scope()->isClass())
|
||||
break;
|
||||
|
||||
if (Function *funTy = r.declaration()->type()->asFunctionType())
|
||||
@@ -1079,20 +1079,20 @@ void CPPEditor::switchDeclarationDefinition()
|
||||
Symbol *lastVisibleSymbol = thisDocument->lastVisibleSymbolAt(line, column);
|
||||
|
||||
Scope *functionScope = 0;
|
||||
if (scope->isPrototypeScope())
|
||||
if (scope->isFunction())
|
||||
functionScope = scope;
|
||||
else
|
||||
functionScope = scope->enclosingPrototypeScope();
|
||||
functionScope = scope->enclosingFunction();
|
||||
|
||||
if (! functionScope && lastVisibleSymbol) {
|
||||
if (Function *def = lastVisibleSymbol->asFunction())
|
||||
functionScope = def->members();
|
||||
functionScope = def;
|
||||
}
|
||||
|
||||
if (functionScope) {
|
||||
LookupContext context(thisDocument, snapshot);
|
||||
|
||||
Function *functionDefinition = functionScope->owner()->asFunction();
|
||||
Function *functionDefinition = functionScope->asFunction();
|
||||
const QList<LookupItem> declarations = context.lookup(functionDefinition->name(), functionDefinition->scope());
|
||||
foreach (const LookupItem &r, declarations) {
|
||||
Symbol *decl = r.declaration();
|
||||
|
||||
@@ -249,9 +249,9 @@ void CppHoverHandler::handleLookupItemMatch(const LookupItem &lookupItem,
|
||||
setToolTip(overview.prettyType(matchingType, QString()));
|
||||
} else {
|
||||
QString name;
|
||||
if (matchingDeclaration->enclosingSymbol()->isClass() ||
|
||||
matchingDeclaration->enclosingSymbol()->isNamespace() ||
|
||||
matchingDeclaration->enclosingSymbol()->isEnum()) {
|
||||
if (matchingDeclaration->scope()->isClass() ||
|
||||
matchingDeclaration->scope()->isNamespace() ||
|
||||
matchingDeclaration->scope()->isEnum()) {
|
||||
name.append(overview.prettyName(
|
||||
LookupContext::fullyQualifiedName(matchingDeclaration)));
|
||||
|
||||
@@ -280,7 +280,7 @@ void CppHoverHandler::handleLookupItemMatch(const LookupItem &lookupItem,
|
||||
matchingDeclaration->isForwardClassDeclaration()) {
|
||||
helpCategory = HelpCandidate::ClassOrNamespace;
|
||||
} else if (matchingDeclaration->isEnum() ||
|
||||
matchingDeclaration->enclosingSymbol()->isEnum()) {
|
||||
matchingDeclaration->scope()->isEnum()) {
|
||||
helpCategory = HelpCandidate::Enum;
|
||||
} else if (matchingDeclaration->isTypedef()) {
|
||||
helpCategory = HelpCandidate::Typedef;
|
||||
@@ -327,8 +327,8 @@ void CppHoverHandler::handleLookupItemMatch(const LookupItem &lookupItem,
|
||||
overview.setShowFunctionSignatures(false);
|
||||
const QString &functionName = overview.prettyName(matchingDeclaration->name());
|
||||
addHelpCandidate(HelpCandidate(functionName, docMark, helpCategory));
|
||||
} else if (matchingDeclaration->enclosingSymbol()->isEnum()) {
|
||||
Symbol *enumSymbol = matchingDeclaration->enclosingSymbol()->asEnum();
|
||||
} else if (matchingDeclaration->scope()->isEnum()) {
|
||||
Symbol *enumSymbol = matchingDeclaration->scope()->asEnum();
|
||||
docMark = overview.prettyName(enumSymbol->name());
|
||||
}
|
||||
|
||||
|
||||
@@ -68,12 +68,12 @@ public:
|
||||
|
||||
if (FunctionDefinitionAST *def = ast->asFunctionDefinition()) {
|
||||
if (def->symbol) {
|
||||
_functionScope = def->symbol->members();
|
||||
_functionScope = def->symbol;
|
||||
accept(ast);
|
||||
}
|
||||
} else if (ObjCMethodDeclarationAST *decl = ast->asObjCMethodDeclaration()) {
|
||||
if (decl->method_prototype->symbol) {
|
||||
_functionScope = decl->method_prototype->symbol->members();
|
||||
_functionScope = decl->method_prototype->symbol;
|
||||
accept(ast);
|
||||
}
|
||||
}
|
||||
@@ -87,8 +87,8 @@ protected:
|
||||
{
|
||||
_scopeStack.append(scope);
|
||||
|
||||
for (unsigned i = 0; i < scope->symbolCount(); ++i) {
|
||||
if (Symbol *member = scope->symbolAt(i)) {
|
||||
for (unsigned i = 0; i < scope->memberCount(); ++i) {
|
||||
if (Symbol *member = scope->memberAt(i)) {
|
||||
if (! member->isGenerated() && (member->isDeclaration() || member->isArgument())) {
|
||||
if (member->name() && member->name()->isNameId()) {
|
||||
const Identifier *id = member->identifier();
|
||||
@@ -106,8 +106,8 @@ protected:
|
||||
if (SimpleNameAST *simpleName = ast->name->asSimpleName()) {
|
||||
const Identifier *id = identifier(simpleName->identifier_token);
|
||||
for (int i = _scopeStack.size() - 1; i != -1; --i) {
|
||||
if (Symbol *member = _scopeStack.at(i)->lookat(id)) {
|
||||
if (!member->isGenerated() && (member->sourceLocation() < ast->firstToken() || member->scope()->isPrototypeScope())) {
|
||||
if (Symbol *member = _scopeStack.at(i)->find(id)) {
|
||||
if (!member->isGenerated() && (member->sourceLocation() < ast->firstToken() || member->scope()->isFunction())) {
|
||||
unsigned line, column;
|
||||
getTokenStartPosition(simpleName->identifier_token, &line, &column);
|
||||
localUses[member].append(SemanticInfo::Use(line, column, id->size(), SemanticInfo::Use::Local));
|
||||
@@ -133,7 +133,7 @@ protected:
|
||||
virtual bool visit(FunctionDefinitionAST *ast)
|
||||
{
|
||||
if (ast->symbol)
|
||||
enterScope(ast->symbol->members());
|
||||
enterScope(ast->symbol);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -146,7 +146,7 @@ protected:
|
||||
virtual bool visit(CompoundStatementAST *ast)
|
||||
{
|
||||
if (ast->symbol)
|
||||
enterScope(ast->symbol->members());
|
||||
enterScope(ast->symbol);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -159,7 +159,7 @@ protected:
|
||||
virtual bool visit(IfStatementAST *ast)
|
||||
{
|
||||
if (ast->symbol)
|
||||
enterScope(ast->symbol->members());
|
||||
enterScope(ast->symbol);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -172,7 +172,7 @@ protected:
|
||||
virtual bool visit(WhileStatementAST *ast)
|
||||
{
|
||||
if (ast->symbol)
|
||||
enterScope(ast->symbol->members());
|
||||
enterScope(ast->symbol);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -185,7 +185,7 @@ protected:
|
||||
virtual bool visit(ForStatementAST *ast)
|
||||
{
|
||||
if (ast->symbol)
|
||||
enterScope(ast->symbol->members());
|
||||
enterScope(ast->symbol);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -198,7 +198,7 @@ protected:
|
||||
virtual bool visit(ForeachStatementAST *ast)
|
||||
{
|
||||
if (ast->symbol)
|
||||
enterScope(ast->symbol->members());
|
||||
enterScope(ast->symbol);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -211,7 +211,7 @@ protected:
|
||||
virtual bool visit(SwitchStatementAST *ast)
|
||||
{
|
||||
if (ast->symbol)
|
||||
enterScope(ast->symbol->members());
|
||||
enterScope(ast->symbol);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -224,7 +224,7 @@ protected:
|
||||
virtual bool visit(CatchClauseAST *ast)
|
||||
{
|
||||
if (ast->symbol)
|
||||
enterScope(ast->symbol->members());
|
||||
enterScope(ast->symbol);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -68,15 +68,14 @@ QString AbstractEditorSupport::functionAt(const CppModelManagerInterface *modelM
|
||||
return QString();
|
||||
if (const CPlusPlus::Symbol *symbol = document->lastVisibleSymbolAt(line, column))
|
||||
if (const CPlusPlus::Scope *scope = symbol->scope())
|
||||
if (const CPlusPlus::Scope *functionScope = scope->enclosingPrototypeScope())
|
||||
if (const CPlusPlus::Symbol *function = functionScope->owner()) {
|
||||
if (const CPlusPlus::Scope *functionScope = scope->enclosingFunction())
|
||||
if (const CPlusPlus::Symbol *function = functionScope) {
|
||||
const CPlusPlus::Overview o;
|
||||
QString rc = o.prettyName(function->name());
|
||||
// Prepend namespace "Foo::Foo::foo()" up to empty root namespace
|
||||
for (const CPlusPlus::Symbol *owner = function; ; ) {
|
||||
if (const CPlusPlus::Scope *nameSpace = owner->enclosingNamespaceScope()) {
|
||||
owner = nameSpace->owner();
|
||||
const QString name = o.prettyName(owner->name());
|
||||
if (const CPlusPlus::Scope *nameSpace = owner->enclosingNamespace()) {
|
||||
const QString name = o.prettyName(nameSpace->name());
|
||||
if (name.isEmpty()) {
|
||||
break;
|
||||
} else {
|
||||
|
||||
@@ -709,12 +709,12 @@ void CppCodeCompletion::completeObjCMsgSend(ClassOrNamespace *binding,
|
||||
QList<Scope*> memberScopes;
|
||||
foreach (Symbol *s, binding->symbols()) {
|
||||
if (ObjCClass *c = s->asObjCClass())
|
||||
memberScopes.append(c->members());
|
||||
memberScopes.append(c);
|
||||
}
|
||||
|
||||
foreach (Scope *scope, memberScopes) {
|
||||
for (unsigned i = 0; i < scope->symbolCount(); ++i) {
|
||||
Symbol *symbol = scope->symbolAt(i);
|
||||
for (unsigned i = 0; i < scope->memberCount(); ++i) {
|
||||
Symbol *symbol = scope->memberAt(i);
|
||||
|
||||
if (ObjCMethod *method = symbol->type()->asObjCMethodType()) {
|
||||
if (method->isStatic() == staticClassAccess) {
|
||||
@@ -1055,11 +1055,11 @@ void CppCodeCompletion::globalCompletion(Scope *currentScope)
|
||||
QList<ClassOrNamespace *> usingBindings;
|
||||
ClassOrNamespace *currentBinding = 0;
|
||||
|
||||
for (Scope *scope = currentScope; scope; scope = scope->enclosingScope()) {
|
||||
if (scope->isBlockScope()) {
|
||||
if (ClassOrNamespace *binding = context.lookupType(scope->owner())) {
|
||||
for (unsigned i = 0; i < scope->symbolCount(); ++i) {
|
||||
Symbol *member = scope->symbolAt(i);
|
||||
for (Scope *scope = currentScope; scope; scope = scope->scope()) {
|
||||
if (scope->isBlock()) {
|
||||
if (ClassOrNamespace *binding = context.lookupType(scope)) {
|
||||
for (unsigned i = 0; i < scope->memberCount(); ++i) {
|
||||
Symbol *member = scope->memberAt(i);
|
||||
if (! member->name())
|
||||
continue;
|
||||
else if (UsingNamespaceDirective *u = member->asUsingNamespaceDirective()) {
|
||||
@@ -1068,19 +1068,19 @@ void CppCodeCompletion::globalCompletion(Scope *currentScope)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (scope->isPrototypeScope() || scope->isClassScope() || scope->isNamespaceScope()) {
|
||||
currentBinding = context.lookupType(scope->owner());
|
||||
} else if (scope->isFunction() || scope->isClass() || scope->isNamespace()) {
|
||||
currentBinding = context.lookupType(scope);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (Scope *scope = currentScope; scope; scope = scope->enclosingScope()) {
|
||||
if (scope->isBlockScope()) {
|
||||
for (unsigned i = 0; i < scope->symbolCount(); ++i) {
|
||||
addCompletionItem(scope->symbolAt(i));
|
||||
for (Scope *scope = currentScope; scope; scope = scope->scope()) {
|
||||
if (scope->isBlock()) {
|
||||
for (unsigned i = 0; i < scope->memberCount(); ++i) {
|
||||
addCompletionItem(scope->memberAt(i));
|
||||
}
|
||||
} else if (scope->isPrototypeScope()) {
|
||||
Function *fun = scope->owner()->asFunction();
|
||||
} else if (scope->isFunction()) {
|
||||
Function *fun = scope->asFunction();
|
||||
for (unsigned i = 0; i < fun->argumentCount(); ++i) {
|
||||
addCompletionItem(fun->argumentAt(i));
|
||||
}
|
||||
@@ -1216,7 +1216,7 @@ bool CppCodeCompletion::completeConstructorOrFunction(const QList<LookupItem> &r
|
||||
|
||||
Scope *sc = context.thisDocument()->scopeAt(line, column);
|
||||
|
||||
if (sc && (sc->isClassScope() || sc->isNamespaceScope())) {
|
||||
if (sc && (sc->isClass() || sc->isNamespace())) {
|
||||
// It may still be a function call. If the whole line parses as a function
|
||||
// declaration, we should be certain that it isn't.
|
||||
bool autocompleteSignature = false;
|
||||
@@ -1528,11 +1528,11 @@ void CppCodeCompletion::completeNamespace(ClassOrNamespace *b)
|
||||
|
||||
foreach (Symbol *bb, binding->symbols()) {
|
||||
if (Namespace *ns = bb->asNamespace())
|
||||
scopesToVisit.append(ns->members());
|
||||
scopesToVisit.append(ns);
|
||||
}
|
||||
|
||||
foreach (Enum *e, binding->enums()) {
|
||||
scopesToVisit.append(e->members());
|
||||
scopesToVisit.append(e);
|
||||
}
|
||||
|
||||
while (! scopesToVisit.isEmpty()) {
|
||||
@@ -1542,7 +1542,7 @@ void CppCodeCompletion::completeNamespace(ClassOrNamespace *b)
|
||||
|
||||
scopesVisited.insert(scope);
|
||||
|
||||
for (Scope::iterator it = scope->firstSymbol(); it != scope->lastSymbol(); ++it) {
|
||||
for (Scope::iterator it = scope->firstMember(); it != scope->lastMember(); ++it) {
|
||||
Symbol *member = *it;
|
||||
addCompletionItem(member);
|
||||
}
|
||||
@@ -1569,11 +1569,11 @@ void CppCodeCompletion::completeClass(ClassOrNamespace *b, bool staticLookup)
|
||||
|
||||
foreach (Symbol *bb, binding->symbols()) {
|
||||
if (Class *k = bb->asClass())
|
||||
scopesToVisit.append(k->members());
|
||||
scopesToVisit.append(k);
|
||||
}
|
||||
|
||||
foreach (Enum *e, binding->enums())
|
||||
scopesToVisit.append(e->members());
|
||||
scopesToVisit.append(e);
|
||||
|
||||
while (! scopesToVisit.isEmpty()) {
|
||||
Scope *scope = scopesToVisit.takeFirst();
|
||||
@@ -1582,9 +1582,9 @@ void CppCodeCompletion::completeClass(ClassOrNamespace *b, bool staticLookup)
|
||||
|
||||
scopesVisited.insert(scope);
|
||||
|
||||
addCompletionItem(scope->owner()); // add a completion item for the injected class name.
|
||||
addCompletionItem(scope); // add a completion item for the injected class name.
|
||||
|
||||
for (Scope::iterator it = scope->firstSymbol(); it != scope->lastSymbol(); ++it) {
|
||||
for (Scope::iterator it = scope->firstMember(); it != scope->lastMember(); ++it) {
|
||||
Symbol *member = *it;
|
||||
if (member->isFriend())
|
||||
continue;
|
||||
@@ -1641,18 +1641,18 @@ bool CppCodeCompletion::completeQtMethod(const QList<LookupItem> &results,
|
||||
|
||||
foreach (Symbol *s, binding->symbols())
|
||||
if (Class *clazz = s->asClass())
|
||||
scopes.append(clazz->members());
|
||||
scopes.append(clazz);
|
||||
|
||||
todo.append(binding->usings());
|
||||
}
|
||||
}
|
||||
|
||||
foreach (Scope *scope, scopes) {
|
||||
if (! scope->isClassScope())
|
||||
if (! scope->isClass())
|
||||
continue;
|
||||
|
||||
for (unsigned i = 0; i < scope->symbolCount(); ++i) {
|
||||
Symbol *member = scope->symbolAt(i);
|
||||
for (unsigned i = 0; i < scope->memberCount(); ++i) {
|
||||
Symbol *member = scope->memberAt(i);
|
||||
Function *fun = member->type()->asFunctionType();
|
||||
if (! fun)
|
||||
continue;
|
||||
|
||||
@@ -191,7 +191,7 @@ static void find_helper(QFutureInterface<Usage> &future,
|
||||
QStringList files(sourceFile);
|
||||
|
||||
if (symbol->isClass() || symbol->isForwardClassDeclaration() || (symbol->scope() && ! symbol->isStatic() &&
|
||||
symbol->scope()->isNamespaceScope())) {
|
||||
symbol->scope()->isNamespace())) {
|
||||
foreach (const Document::Ptr &doc, context.snapshot()) {
|
||||
if (doc->fileName() == sourceFile)
|
||||
continue;
|
||||
|
||||
@@ -88,9 +88,8 @@ bool SearchSymbols::visit(Enum *symbol)
|
||||
appendItem(separateScope ? name : scopedName,
|
||||
separateScope ? previousScope : QString(),
|
||||
ModelItemInfo::Enum, symbol);
|
||||
Scope *members = symbol->members();
|
||||
for (unsigned i = 0; i < members->symbolCount(); ++i) {
|
||||
accept(members->symbolAt(i));
|
||||
for (unsigned i = 0; i < symbol->memberCount(); ++i) {
|
||||
accept(symbol->memberAt(i));
|
||||
}
|
||||
(void) switchScope(previousScope);
|
||||
return false;
|
||||
@@ -126,9 +125,8 @@ bool SearchSymbols::visit(Namespace *symbol)
|
||||
{
|
||||
QString name = findOrInsert(scopedSymbolName(symbol));
|
||||
QString previousScope = switchScope(name);
|
||||
Scope *members = symbol->members();
|
||||
for (unsigned i = 0; i < members->symbolCount(); ++i) {
|
||||
accept(members->symbolAt(i));
|
||||
for (unsigned i = 0; i < symbol->memberCount(); ++i) {
|
||||
accept(symbol->memberAt(i));
|
||||
}
|
||||
(void) switchScope(previousScope);
|
||||
return false;
|
||||
@@ -159,9 +157,8 @@ bool SearchSymbols::visit(Class *symbol)
|
||||
separateScope ? previousScope : QString(),
|
||||
ModelItemInfo::Class, symbol);
|
||||
}
|
||||
Scope *members = symbol->members();
|
||||
for (unsigned i = 0; i < members->symbolCount(); ++i) {
|
||||
accept(members->symbolAt(i));
|
||||
for (unsigned i = 0; i < symbol->memberCount(); ++i) {
|
||||
accept(symbol->memberAt(i));
|
||||
}
|
||||
(void) switchScope(previousScope);
|
||||
return false;
|
||||
|
||||
@@ -85,7 +85,7 @@ static void debugCppSymbolRecursion(QTextStream &str, const Overview &o,
|
||||
if (s.isBlock())
|
||||
str << " block";
|
||||
if (doRecurse && s.isScopedSymbol()) {
|
||||
const ScopedSymbol *scoped = s.asScopedSymbol();
|
||||
const Scope *scoped = s.asScope();
|
||||
const int size = scoped->memberCount();
|
||||
str << " scoped symbol of " << size << '\n';
|
||||
for (int m = 0; m < size; m++)
|
||||
@@ -110,28 +110,31 @@ QDebug operator<<(QDebug d, const Scope &scope)
|
||||
QString output;
|
||||
Overview o;
|
||||
QTextStream str(&output);
|
||||
const int size = scope.symbolCount();
|
||||
const int size = scope.memberCount();
|
||||
str << "Scope of " << size;
|
||||
if (scope.isNamespaceScope())
|
||||
if (scope.isNamespace())
|
||||
str << " namespace";
|
||||
if (scope.isClassScope())
|
||||
if (scope.isClass())
|
||||
str << " class";
|
||||
if (scope.isEnumScope())
|
||||
if (scope.isEnum())
|
||||
str << " enum";
|
||||
if (scope.isBlockScope())
|
||||
if (scope.isBlock())
|
||||
str << " block";
|
||||
if (scope.isPrototypeScope())
|
||||
if (scope.isFunction())
|
||||
str << " function";
|
||||
if (scope.isPrototypeScope())
|
||||
if (scope.isFunction())
|
||||
str << " prototype";
|
||||
if (const Symbol *owner = scope.owner()) {
|
||||
#warning robe fix me
|
||||
#if 0
|
||||
if (const Symbol *owner = &scope) {
|
||||
str << " owner: ";
|
||||
debugCppSymbolRecursion(str, o, *owner, false, 0);
|
||||
} else {
|
||||
str << " 0-owner\n";
|
||||
}
|
||||
#endif
|
||||
for (int s = 0; s < size; s++)
|
||||
debugCppSymbolRecursion(str, o, *scope.symbolAt(s), true, 2);
|
||||
debugCppSymbolRecursion(str, o, *scope.memberAt(s), true, 2);
|
||||
d.nospace() << output;
|
||||
return d;
|
||||
}
|
||||
@@ -319,9 +322,9 @@ static void blockRecursion(const CPlusPlus::Overview &overview,
|
||||
SeenHash *seenHash,
|
||||
int level = 0)
|
||||
{
|
||||
const int size = scope->symbolCount();
|
||||
const int size = scope->memberCount();
|
||||
for (int s = 0; s < size; s++){
|
||||
const CPlusPlus::Symbol *symbol = scope->symbolAt(s);
|
||||
const CPlusPlus::Symbol *symbol = scope->memberAt(s);
|
||||
if (symbol->isDeclaration()) {
|
||||
// Find out about shadowed symbols by bookkeeping
|
||||
// the already seen occurrences in a hash.
|
||||
@@ -339,7 +342,7 @@ static void blockRecursion(const CPlusPlus::Overview &overview,
|
||||
}
|
||||
}
|
||||
// Next block scope.
|
||||
if (const CPlusPlus::Scope *enclosingScope = scope->enclosingBlockScope())
|
||||
if (const CPlusPlus::Scope *enclosingScope = scope->enclosingBlock())
|
||||
blockRecursion(overview, enclosingScope, line, uninitializedVariables, seenHash, level + 1);
|
||||
}
|
||||
|
||||
@@ -372,13 +375,13 @@ int getUninitializedVariablesI(const CPlusPlus::Snapshot &snapshot,
|
||||
function = symbolAtLine->asFunction();
|
||||
if (function->memberCount() == 1) // Skip over function block
|
||||
if (CPlusPlus::Block *block = function->memberAt(0)->asBlock())
|
||||
innerMostScope = block->members();
|
||||
innerMostScope = block;
|
||||
} else {
|
||||
if (const CPlusPlus::Scope *functionScope = symbolAtLine->enclosingPrototypeScope()) {
|
||||
function = functionScope->owner()->asFunction();
|
||||
if (const CPlusPlus::Scope *functionScope = symbolAtLine->enclosingFunction()) {
|
||||
function = functionScope->asFunction();
|
||||
innerMostScope = symbolAtLine->isBlock() ?
|
||||
symbolAtLine->asBlock()->members() :
|
||||
symbolAtLine->enclosingBlockScope();
|
||||
symbolAtLine->asBlock() :
|
||||
symbolAtLine->enclosingBlock();
|
||||
}
|
||||
}
|
||||
if (!function || !innerMostScope)
|
||||
|
||||
@@ -79,7 +79,7 @@ class Literal;
|
||||
class StringLiteral;
|
||||
class NumericLiteral;
|
||||
|
||||
class Scope;
|
||||
class SymbolTable;
|
||||
class TemplateParameters;
|
||||
|
||||
// names
|
||||
@@ -111,7 +111,7 @@ class NamedType;
|
||||
// symbols
|
||||
class SymbolVisitor;
|
||||
class Symbol;
|
||||
class ScopedSymbol;
|
||||
class Scope;
|
||||
class UsingNamespaceDirective;
|
||||
class UsingDeclaration;
|
||||
class Declaration;
|
||||
|
||||
@@ -154,7 +154,7 @@ void CheckDeclaration::checkFunctionArguments(Function *fun)
|
||||
if (! _checkAnonymousArguments)
|
||||
return;
|
||||
|
||||
if (_scope->isClassScope() && fun->isPublic()) {
|
||||
if (_scope->isClass() && fun->isPublic()) {
|
||||
for (unsigned argc = 0; argc < fun->argumentCount(); ++argc) {
|
||||
Argument *arg = fun->argumentAt(argc)->asArgument();
|
||||
assert(arg != 0);
|
||||
@@ -201,7 +201,7 @@ bool CheckDeclaration::visit(SimpleDeclarationAST *ast)
|
||||
|
||||
setDeclSpecifiers(symbol, declSpecifiers);
|
||||
|
||||
_scope->enterSymbol(symbol);
|
||||
_scope->addMember(symbol);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -262,7 +262,7 @@ bool CheckDeclaration::visit(SimpleDeclarationAST *ast)
|
||||
(*decl_it)->value = symbol;
|
||||
decl_it = &(*decl_it)->next;
|
||||
|
||||
_scope->enterSymbol(symbol);
|
||||
_scope->addMember(symbol);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -310,7 +310,7 @@ bool CheckDeclaration::visit(ExceptionDeclarationAST *ast)
|
||||
|
||||
Declaration *symbol = control()->newDeclaration(location, name);
|
||||
symbol->setType(declTy);
|
||||
_scope->enterSymbol(symbol);
|
||||
_scope->addMember(symbol);
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -322,7 +322,7 @@ bool CheckDeclaration::visit(FunctionDefinitionAST *ast)
|
||||
const Name *name = 0;
|
||||
FullySpecifiedType funTy = semantic()->check(ast->declarator, qualTy,
|
||||
_scope, &name);
|
||||
if (! (funTy && funTy->isFunctionType())) {
|
||||
if (! funTy->isFunctionType()) {
|
||||
translationUnit()->error(ast->firstToken(),
|
||||
"expected a function prototype");
|
||||
return false;
|
||||
@@ -336,8 +336,8 @@ bool CheckDeclaration::visit(FunctionDefinitionAST *ast)
|
||||
Function *fun = funTy->asFunctionType();
|
||||
setDeclSpecifiers(fun, ty);
|
||||
|
||||
fun->members()->setStartOffset(funStartOffset);
|
||||
fun->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
fun->setStartOffset(funStartOffset);
|
||||
fun->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
if (ast->declarator) {
|
||||
unsigned loc = semantic()->location(ast->declarator);
|
||||
if (! loc)
|
||||
@@ -363,7 +363,7 @@ bool CheckDeclaration::visit(FunctionDefinitionAST *ast)
|
||||
checkFunctionArguments(fun);
|
||||
|
||||
ast->symbol = fun;
|
||||
_scope->enterSymbol(fun);
|
||||
_scope->addMember(fun);
|
||||
|
||||
if (! semantic()->skipFunctionBodies())
|
||||
semantic()->checkFunctionDefinition(ast);
|
||||
@@ -408,11 +408,11 @@ bool CheckDeclaration::visit(NamespaceAST *ast)
|
||||
scopeStart = tokenAt(ast->linkage_body->firstToken()).offset;
|
||||
|
||||
Namespace *ns = control()->newNamespace(sourceLocation, namespaceName);
|
||||
ns->members()->setStartOffset(scopeStart);
|
||||
ns->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
ns->setStartOffset(scopeStart);
|
||||
ns->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
ast->symbol = ns;
|
||||
_scope->enterSymbol(ns);
|
||||
semantic()->check(ast->linkage_body, ns->members()); // ### we'll do the merge later.
|
||||
_scope->addMember(ns);
|
||||
semantic()->check(ast->linkage_body, ns); // ### we'll do the merge later.
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -434,7 +434,7 @@ bool CheckDeclaration::visit(NamespaceAliasDefinitionAST *ast)
|
||||
NamespaceAlias *namespaceAlias = control()->newNamespaceAlias(sourceLocation, name);
|
||||
namespaceAlias->setNamespaceName(namespaceName);
|
||||
//ast->symbol = namespaceAlias;
|
||||
_scope->enterSymbol(namespaceAlias);
|
||||
_scope->addMember(namespaceAlias);
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -470,12 +470,14 @@ bool CheckDeclaration::visit(ParameterDeclarationAST *ast)
|
||||
arg->setInitializer(initializer);
|
||||
}
|
||||
arg->setType(argTy);
|
||||
_scope->enterSymbol(arg);
|
||||
_scope->addMember(arg);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CheckDeclaration::visit(TemplateDeclarationAST *ast)
|
||||
{
|
||||
#warning robe process template arguments
|
||||
#if 0
|
||||
Scope *scope = new Scope(_scope->owner());
|
||||
|
||||
for (DeclarationListAST *param = ast->template_parameter_list; param; param = param->next) {
|
||||
@@ -484,6 +486,9 @@ bool CheckDeclaration::visit(TemplateDeclarationAST *ast)
|
||||
|
||||
semantic()->check(ast->declaration, _scope,
|
||||
new TemplateParameters(_templateParameters, scope));
|
||||
#else
|
||||
semantic()->check(ast->declaration, _scope);
|
||||
#endif
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -499,7 +504,7 @@ bool CheckDeclaration::visit(TypenameTypeParameterAST *ast)
|
||||
FullySpecifiedType ty = semantic()->check(ast->type_id, _scope);
|
||||
arg->setType(ty);
|
||||
ast->symbol = arg;
|
||||
_scope->enterSymbol(arg);
|
||||
_scope->addMember(arg);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -514,7 +519,7 @@ bool CheckDeclaration::visit(TemplateTypeParameterAST *ast)
|
||||
FullySpecifiedType ty = semantic()->check(ast->type_id, _scope);
|
||||
arg->setType(ty);
|
||||
ast->symbol = arg;
|
||||
_scope->enterSymbol(arg);
|
||||
_scope->addMember(arg);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -528,7 +533,7 @@ bool CheckDeclaration::visit(UsingAST *ast)
|
||||
|
||||
UsingDeclaration *u = control()->newUsingDeclaration(sourceLocation, name);
|
||||
ast->symbol = u;
|
||||
_scope->enterSymbol(u);
|
||||
_scope->addMember(u);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -542,9 +547,9 @@ bool CheckDeclaration::visit(UsingDirectiveAST *ast)
|
||||
|
||||
UsingNamespaceDirective *u = control()->newUsingNamespaceDirective(sourceLocation, name);
|
||||
ast->symbol = u;
|
||||
_scope->enterSymbol(u);
|
||||
_scope->addMember(u);
|
||||
|
||||
if (! (_scope->isBlockScope() || _scope->isNamespaceScope()))
|
||||
if (! (_scope->isBlock() || _scope->isNamespace()))
|
||||
translationUnit()->error(ast->firstToken(),
|
||||
"using-directive not within namespace or block scope");
|
||||
|
||||
@@ -566,7 +571,7 @@ bool CheckDeclaration::visit(ObjCProtocolForwardDeclarationAST *ast)
|
||||
const Name *protocolName = semantic()->check(it->value, _scope);
|
||||
ObjCForwardProtocolDeclaration *fwdProtocol = control()->newObjCForwardProtocolDeclaration(sourceLocation, protocolName);
|
||||
|
||||
_scope->enterSymbol(fwdProtocol);
|
||||
_scope->addMember(fwdProtocol);
|
||||
|
||||
*symbolIter = new (translationUnit()->memoryPool()) List<ObjCForwardProtocolDeclaration *>();
|
||||
(*symbolIter)->value = fwdProtocol;
|
||||
@@ -598,8 +603,8 @@ bool CheckDeclaration::visit(ObjCProtocolDeclarationAST *ast)
|
||||
|
||||
const Name *protocolName = semantic()->check(ast->name, _scope);
|
||||
ObjCProtocol *protocol = control()->newObjCProtocol(sourceLocation, protocolName);
|
||||
protocol->members()->setStartOffset(calculateScopeStart(ast));
|
||||
protocol->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
protocol->setStartOffset(calculateScopeStart(ast));
|
||||
protocol->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
|
||||
if (ast->protocol_refs && ast->protocol_refs->identifier_list) {
|
||||
for (NameListAST *iter = ast->protocol_refs->identifier_list; iter; iter = iter->next) {
|
||||
@@ -612,12 +617,12 @@ bool CheckDeclaration::visit(ObjCProtocolDeclarationAST *ast)
|
||||
|
||||
int previousObjCVisibility = semantic()->switchObjCVisibility(Function::Public);
|
||||
for (DeclarationListAST *it = ast->member_declaration_list; it; it = it->next) {
|
||||
semantic()->check(it->value, protocol->members());
|
||||
semantic()->check(it->value, protocol);
|
||||
}
|
||||
(void) semantic()->switchObjCVisibility(previousObjCVisibility);
|
||||
|
||||
ast->symbol = protocol;
|
||||
_scope->enterSymbol(protocol);
|
||||
_scope->addMember(protocol);
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -637,7 +642,7 @@ bool CheckDeclaration::visit(ObjCClassForwardDeclarationAST *ast)
|
||||
const Name *className = semantic()->check(it->value, _scope);
|
||||
ObjCForwardClassDeclaration *fwdClass = control()->newObjCForwardClassDeclaration(sourceLocation, className);
|
||||
|
||||
_scope->enterSymbol(fwdClass);
|
||||
_scope->addMember(fwdClass);
|
||||
|
||||
*symbolIter = new (translationUnit()->memoryPool()) List<ObjCForwardClassDeclaration *>();
|
||||
(*symbolIter)->value = fwdClass;
|
||||
@@ -691,8 +696,8 @@ bool CheckDeclaration::visit(ObjCClassDeclarationAST *ast)
|
||||
|
||||
const Name *className = semantic()->check(ast->class_name, _scope);
|
||||
ObjCClass *klass = control()->newObjCClass(sourceLocation, className);
|
||||
klass->members()->setStartOffset(calculateScopeStart(ast));
|
||||
klass->members()->setEndOffset(tokenAt(ast->lastToken() - 1).offset);
|
||||
klass->setStartOffset(calculateScopeStart(ast));
|
||||
klass->setEndOffset(tokenAt(ast->lastToken() - 1).offset);
|
||||
ast->symbol = klass;
|
||||
|
||||
klass->setInterface(ast->interface_token != 0);
|
||||
@@ -717,20 +722,20 @@ bool CheckDeclaration::visit(ObjCClassDeclarationAST *ast)
|
||||
}
|
||||
}
|
||||
|
||||
_scope->enterSymbol(klass);
|
||||
_scope->addMember(klass);
|
||||
|
||||
int previousObjCVisibility = semantic()->switchObjCVisibility(Function::Protected);
|
||||
|
||||
if (ast->inst_vars_decl) {
|
||||
for (DeclarationListAST *it = ast->inst_vars_decl->instance_variable_list; it; it = it->next) {
|
||||
semantic()->check(it->value, klass->members());
|
||||
semantic()->check(it->value, klass);
|
||||
}
|
||||
}
|
||||
|
||||
(void) semantic()->switchObjCVisibility(Function::Public);
|
||||
|
||||
for (DeclarationListAST *it = ast->member_declaration_list; it; it = it->next) {
|
||||
semantic()->check(it->value, klass->members());
|
||||
semantic()->check(it->value, klass);
|
||||
}
|
||||
|
||||
(void) semantic()->switchObjCVisibility(previousObjCVisibility);
|
||||
@@ -755,8 +760,8 @@ bool CheckDeclaration::visit(ObjCMethodDeclarationAST *ast)
|
||||
Symbol *symbol;
|
||||
if (ast->function_body) {
|
||||
symbol = methodTy;
|
||||
methodTy->members()->setStartOffset(tokenAt(ast->function_body->firstToken()).offset);
|
||||
methodTy->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
methodTy->setStartOffset(tokenAt(ast->function_body->firstToken()).offset);
|
||||
methodTy->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
} else {
|
||||
Declaration *decl = control()->newDeclaration(selector->firstToken(), methodTy->name());
|
||||
decl->setType(methodTy);
|
||||
@@ -770,10 +775,10 @@ bool CheckDeclaration::visit(ObjCMethodDeclarationAST *ast)
|
||||
if (ty.isUnavailable())
|
||||
symbol->setUnavailable(true);
|
||||
|
||||
_scope->enterSymbol(symbol);
|
||||
_scope->addMember(symbol);
|
||||
|
||||
if (ast->function_body && !semantic()->skipFunctionBodies()) {
|
||||
semantic()->check(ast->function_body, methodTy->members());
|
||||
semantic()->check(ast->function_body, methodTy);
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -868,7 +873,7 @@ bool CheckDeclaration::visit(ObjCPropertyDeclarationAST *ast)
|
||||
propDecl->setAttributes(propAttrs);
|
||||
propDecl->setGetterName(getterName);
|
||||
propDecl->setSetterName(setterName);
|
||||
_scope->enterSymbol(propDecl);
|
||||
_scope->addMember(propDecl);
|
||||
|
||||
*lastSymbols = new (translationUnit()->memoryPool()) List<ObjCPropertyDeclaration *>();
|
||||
(*lastSymbols)->value = propDecl;
|
||||
|
||||
@@ -172,7 +172,7 @@ bool CheckDeclarator::visit(FunctionDeclaratorAST *ast)
|
||||
if (ast->parameters) {
|
||||
DeclarationListAST *parameter_declarations = ast->parameters->parameter_declaration_list;
|
||||
for (DeclarationListAST *decl = parameter_declarations; decl; decl = decl->next) {
|
||||
semantic()->check(decl->value, fun->members());
|
||||
semantic()->check(decl->value, fun);
|
||||
}
|
||||
|
||||
if (ast->parameters->dot_dot_dot_token)
|
||||
@@ -276,7 +276,7 @@ bool CheckDeclarator::visit(ObjCMethodPrototypeAST *ast)
|
||||
for (ObjCMessageArgumentDeclarationListAST *it = ast->argument_list; it; it = it->next) {
|
||||
ObjCMessageArgumentDeclarationAST *argDecl = it->value;
|
||||
|
||||
semantic()->check(argDecl, method->arguments());
|
||||
semantic()->check(argDecl, method);
|
||||
}
|
||||
|
||||
if (ast->dot_dot_dot_token)
|
||||
|
||||
@@ -125,7 +125,7 @@ bool CheckExpression::visit(ConditionAST *ast)
|
||||
_scope, &name);
|
||||
Declaration *decl = control()->newDeclaration(semantic()->location(ast->declarator), name);
|
||||
decl->setType(declTy);
|
||||
_scope->enterSymbol(decl);
|
||||
_scope->addMember(decl);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -313,9 +313,10 @@ bool CheckExpression::visit(UnaryExpressionAST *ast)
|
||||
bool CheckExpression::visit(QtMethodAST *ast)
|
||||
{
|
||||
const Name *name = 0;
|
||||
Scope dummy;
|
||||
#warning robe set a valid scope
|
||||
Scope *dummy = 0;
|
||||
FullySpecifiedType methTy = semantic()->check(ast->declarator, FullySpecifiedType(),
|
||||
&dummy, &name);
|
||||
dummy, &name);
|
||||
Function *fty = methTy->asFunctionType();
|
||||
if (! fty)
|
||||
translationUnit()->warning(ast->firstToken(), "expected a function declarator");
|
||||
@@ -384,7 +385,7 @@ bool CheckExpression::visit(ObjCEncodeExpressionAST * /*ast*/)
|
||||
|
||||
bool CheckExpression::visit(ObjCSelectorExpressionAST *ast)
|
||||
{
|
||||
if (_scope->isPrototypeScope())
|
||||
if (_scope->isFunction())
|
||||
return false;
|
||||
|
||||
(void) semantic()->check(ast->selector, _scope);
|
||||
@@ -393,7 +394,7 @@ bool CheckExpression::visit(ObjCSelectorExpressionAST *ast)
|
||||
|
||||
bool CheckExpression::visit(LambdaExpressionAST *ast)
|
||||
{
|
||||
if (_scope->isPrototypeScope())
|
||||
if (_scope->isFunction())
|
||||
return false;
|
||||
|
||||
(void) semantic()->check(ast->statement, _scope);
|
||||
|
||||
@@ -412,7 +412,7 @@ bool CheckName::visit(ObjCMessageArgumentDeclarationAST *ast)
|
||||
ast->argument = arg;
|
||||
arg->setType(type);
|
||||
arg->setInitializer(0);
|
||||
_scope->enterSymbol(arg);
|
||||
_scope->addMember(arg);
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
@@ -316,8 +316,8 @@ bool CheckSpecifier::visit(ClassSpecifierAST *ast)
|
||||
|
||||
const Name *className = semantic()->check(ast->name, _scope);
|
||||
Class *klass = control()->newClass(sourceLocation, className);
|
||||
klass->members()->setStartOffset(classScopeStart);
|
||||
klass->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
klass->setStartOffset(classScopeStart);
|
||||
klass->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
ast->symbol = klass;
|
||||
unsigned classKey = tokenKind(ast->classkey_token);
|
||||
if (classKey == T_CLASS)
|
||||
@@ -327,7 +327,7 @@ bool CheckSpecifier::visit(ClassSpecifierAST *ast)
|
||||
else if (classKey == T_UNION)
|
||||
klass->setClassKey(Class::UnionKey);
|
||||
klass->setVisibility(semantic()->currentVisibility());
|
||||
_scope->enterSymbol(klass);
|
||||
_scope->addMember(klass);
|
||||
|
||||
ClassSpecifierAST *previousClassSpecifier = semantic()->switchDeclaringClass(ast);
|
||||
|
||||
@@ -362,7 +362,7 @@ bool CheckSpecifier::visit(ClassSpecifierAST *ast)
|
||||
DeclarationAST *previousDeclaration = 0;
|
||||
for (DeclarationListAST *it = ast->member_specifier_list; it; it = it->next) {
|
||||
DeclarationAST *declaration = it->value;
|
||||
semantic()->check(declaration, klass->members());
|
||||
semantic()->check(declaration, klass);
|
||||
|
||||
if (previousDeclaration && declaration &&
|
||||
declaration->asEmptyDeclaration() != 0 &&
|
||||
@@ -408,10 +408,10 @@ bool CheckSpecifier::visit(EnumSpecifierAST *ast)
|
||||
const Name *name = semantic()->check(ast->name, _scope);
|
||||
Enum *e = control()->newEnum(sourceLocation, name);
|
||||
ast->symbol = e;
|
||||
e->members()->setStartOffset(scopeStart);
|
||||
e->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
e->setStartOffset(scopeStart);
|
||||
e->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
e->setVisibility(semantic()->currentVisibility());
|
||||
_scope->enterSymbol(e);
|
||||
_scope->addMember(e);
|
||||
_fullySpecifiedType.setType(e);
|
||||
for (EnumeratorListAST *it = ast->enumerator_list; it; it = it->next) {
|
||||
EnumeratorAST *enumerator = it->value;
|
||||
|
||||
@@ -111,11 +111,11 @@ bool CheckStatement::visit(CaseStatementAST *ast)
|
||||
bool CheckStatement::visit(CompoundStatementAST *ast)
|
||||
{
|
||||
Block *block = control()->newBlock(ast->lbrace_token);
|
||||
block->members()->setStartOffset(tokenAt(ast->firstToken()).end());
|
||||
block->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
block->setStartOffset(tokenAt(ast->firstToken()).end());
|
||||
block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
ast->symbol = block;
|
||||
_scope->enterSymbol(block);
|
||||
Scope *previousScope = switchScope(block->members());
|
||||
_scope->addMember(block);
|
||||
Scope *previousScope = switchScope(block);
|
||||
StatementAST *previousStatement = 0;
|
||||
for (StatementListAST *it = ast->statement_list; it; it = it->next) {
|
||||
StatementAST *statement = it->value;
|
||||
@@ -181,11 +181,11 @@ bool CheckStatement::forEachFastEnum(unsigned firstToken,
|
||||
scopeStart = tokenAt(lparen).end();
|
||||
|
||||
Block *block = control()->newBlock(firstToken);
|
||||
block->members()->setStartOffset(scopeStart);
|
||||
block->members()->setEndOffset(tokenAt(lastToken - 1).end());
|
||||
block->setStartOffset(scopeStart);
|
||||
block->setEndOffset(tokenAt(lastToken - 1).end());
|
||||
symbol = block;
|
||||
_scope->enterSymbol(block);
|
||||
Scope *previousScope = switchScope(block->members());
|
||||
_scope->addMember(block);
|
||||
Scope *previousScope = switchScope(block);
|
||||
if (type_specifier_list && declarator) {
|
||||
FullySpecifiedType ty = semantic()->check(type_specifier_list, _scope);
|
||||
const Name *name = 0;
|
||||
@@ -195,7 +195,7 @@ bool CheckStatement::forEachFastEnum(unsigned firstToken,
|
||||
location = core_declarator->firstToken();
|
||||
Declaration *decl = control()->newDeclaration(location, name);
|
||||
decl->setType(ty);
|
||||
_scope->enterSymbol(decl);
|
||||
_scope->addMember(decl);
|
||||
} else {
|
||||
(void) semantic()->check(initializer, _scope);
|
||||
}
|
||||
@@ -240,11 +240,11 @@ bool CheckStatement::visit(ForStatementAST *ast)
|
||||
scopeStart = tokenAt(ast->lparen_token).end();
|
||||
|
||||
Block *block = control()->newBlock(ast->for_token);
|
||||
block->members()->setStartOffset(scopeStart);
|
||||
block->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
block->setStartOffset(scopeStart);
|
||||
block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
ast->symbol = block;
|
||||
_scope->enterSymbol(block);
|
||||
Scope *previousScope = switchScope(block->members());
|
||||
_scope->addMember(block);
|
||||
Scope *previousScope = switchScope(block);
|
||||
semantic()->check(ast->initializer, _scope);
|
||||
FullySpecifiedType condTy = semantic()->check(ast->condition, _scope);
|
||||
FullySpecifiedType exprTy = semantic()->check(ast->expression, _scope);
|
||||
@@ -261,11 +261,11 @@ bool CheckStatement::visit(IfStatementAST *ast)
|
||||
scopeStart = tokenAt(ast->lparen_token).end();
|
||||
|
||||
Block *block = control()->newBlock(ast->if_token);
|
||||
block->members()->setStartOffset(scopeStart);
|
||||
block->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
block->setStartOffset(scopeStart);
|
||||
block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
ast->symbol = block;
|
||||
_scope->enterSymbol(block);
|
||||
Scope *previousScope = switchScope(block->members());
|
||||
_scope->addMember(block);
|
||||
Scope *previousScope = switchScope(block);
|
||||
FullySpecifiedType exprTy = semantic()->check(ast->condition, _scope);
|
||||
semantic()->check(ast->statement, _scope);
|
||||
semantic()->check(ast->else_statement, _scope);
|
||||
@@ -312,11 +312,11 @@ bool CheckStatement::visit(SwitchStatementAST *ast)
|
||||
scopeStart = tokenAt(ast->lparen_token).offset;
|
||||
|
||||
Block *block = control()->newBlock(ast->switch_token);
|
||||
block->members()->setStartOffset(scopeStart);
|
||||
block->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
block->setStartOffset(scopeStart);
|
||||
block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
ast->symbol = block;
|
||||
_scope->enterSymbol(block);
|
||||
Scope *previousScope = switchScope(block->members());
|
||||
_scope->addMember(block);
|
||||
Scope *previousScope = switchScope(block);
|
||||
FullySpecifiedType condTy = semantic()->check(ast->condition, _scope);
|
||||
semantic()->check(ast->statement, _scope);
|
||||
(void) switchScope(previousScope);
|
||||
@@ -341,11 +341,11 @@ bool CheckStatement::visit(CatchClauseAST *ast)
|
||||
scopeStart = tokenAt(ast->lparen_token).end();
|
||||
|
||||
Block *block = control()->newBlock(ast->catch_token);
|
||||
block->members()->setStartOffset(scopeStart);
|
||||
block->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
block->setStartOffset(scopeStart);
|
||||
block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
ast->symbol = block;
|
||||
_scope->enterSymbol(block);
|
||||
Scope *previousScope = switchScope(block->members());
|
||||
_scope->addMember(block);
|
||||
Scope *previousScope = switchScope(block);
|
||||
semantic()->check(ast->exception_declaration, _scope);
|
||||
semantic()->check(ast->statement, _scope);
|
||||
(void) switchScope(previousScope);
|
||||
@@ -360,11 +360,11 @@ bool CheckStatement::visit(WhileStatementAST *ast)
|
||||
scopeStart = tokenAt(ast->lparen_token).end();
|
||||
|
||||
Block *block = control()->newBlock(ast->while_token);
|
||||
block->members()->setStartOffset(scopeStart);
|
||||
block->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
block->setStartOffset(scopeStart);
|
||||
block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
ast->symbol = block;
|
||||
_scope->enterSymbol(block);
|
||||
Scope *previousScope = switchScope(block->members());
|
||||
_scope->addMember(block);
|
||||
Scope *previousScope = switchScope(block);
|
||||
FullySpecifiedType condTy = semantic()->check(ast->condition, _scope);
|
||||
semantic()->check(ast->statement, _scope);
|
||||
(void) switchScope(previousScope);
|
||||
@@ -400,7 +400,7 @@ bool CheckStatement::visit(QtMemberDeclarationAST *ast)
|
||||
Declaration *symbol = control()->newDeclaration(/*generated*/ 0, name);
|
||||
symbol->setType(control()->pointerType(declTy));
|
||||
|
||||
_scope->enterSymbol(symbol);
|
||||
_scope->addMember(symbol);
|
||||
_exprType = FullySpecifiedType();
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -55,18 +55,77 @@
|
||||
|
||||
using namespace CPlusPlus;
|
||||
|
||||
Scope::Scope(ScopedSymbol *owner)
|
||||
class CPlusPlus::SymbolTable
|
||||
{
|
||||
SymbolTable(const SymbolTable &other);
|
||||
void operator =(const SymbolTable &other);
|
||||
|
||||
public:
|
||||
typedef Symbol **iterator;
|
||||
|
||||
public:
|
||||
/// Constructs an empty Scope.
|
||||
SymbolTable(Scope *owner = 0);
|
||||
|
||||
/// Destroy this scope.
|
||||
~SymbolTable();
|
||||
|
||||
/// Returns this scope's owner Symbol.
|
||||
Scope *owner() const;
|
||||
|
||||
/// Sets this scope's owner Symbol.
|
||||
void setOwner(Scope *owner); // ### remove me
|
||||
|
||||
/// Adds a Symbol to this Scope.
|
||||
void enterSymbol(Symbol *symbol);
|
||||
|
||||
/// Returns true if this Scope is empty; otherwise returns false.
|
||||
bool isEmpty() const;
|
||||
|
||||
/// Returns the number of symbols is in the scope.
|
||||
unsigned symbolCount() const;
|
||||
|
||||
/// Returns the Symbol at the given position.
|
||||
Symbol *symbolAt(unsigned index) const;
|
||||
|
||||
/// Returns the first Symbol in the scope.
|
||||
iterator firstSymbol() const;
|
||||
|
||||
/// Returns the last Symbol in the scope.
|
||||
iterator lastSymbol() const;
|
||||
|
||||
Symbol *lookat(const Name *name) const;
|
||||
Symbol *lookat(const Identifier *id) const;
|
||||
Symbol *lookat(int operatorId) const;
|
||||
|
||||
private:
|
||||
/// Returns the hash value for the given Symbol.
|
||||
unsigned hashValue(Symbol *symbol) const;
|
||||
|
||||
/// Updates the hash table.
|
||||
void rehash();
|
||||
|
||||
private:
|
||||
enum { DefaultInitialSize = 11 };
|
||||
|
||||
Scope *_owner;
|
||||
Symbol **_symbols;
|
||||
Symbol **_hash;
|
||||
int _allocatedSymbols;
|
||||
int _symbolCount;
|
||||
int _hashSize;
|
||||
};
|
||||
|
||||
SymbolTable::SymbolTable(Scope *owner)
|
||||
: _owner(owner),
|
||||
_symbols(0),
|
||||
_hash(0),
|
||||
_allocatedSymbols(0),
|
||||
_symbolCount(-1),
|
||||
_hashSize(0),
|
||||
_startOffset(0),
|
||||
_endOffset(0)
|
||||
_hashSize(0)
|
||||
{ }
|
||||
|
||||
Scope::~Scope()
|
||||
SymbolTable::~SymbolTable()
|
||||
{
|
||||
if (_symbols)
|
||||
free(_symbols);
|
||||
@@ -74,128 +133,7 @@ Scope::~Scope()
|
||||
free(_hash);
|
||||
}
|
||||
|
||||
ScopedSymbol *Scope::owner() const
|
||||
{ return _owner; }
|
||||
|
||||
void Scope::setOwner(ScopedSymbol *owner)
|
||||
{ _owner = owner; }
|
||||
|
||||
Scope *Scope::enclosingScope() const
|
||||
{
|
||||
if (! _owner)
|
||||
return 0;
|
||||
|
||||
return _owner->scope();
|
||||
}
|
||||
|
||||
Scope *Scope::enclosingNamespaceScope() const
|
||||
{
|
||||
Scope *scope = enclosingScope();
|
||||
for (; scope; scope = scope->enclosingScope()) {
|
||||
if (scope->owner()->isNamespace())
|
||||
break;
|
||||
}
|
||||
return scope;
|
||||
}
|
||||
|
||||
Scope *Scope::enclosingClassScope() const
|
||||
{
|
||||
Scope *scope = enclosingScope();
|
||||
for (; scope; scope = scope->enclosingScope()) {
|
||||
if (scope->owner()->isClass())
|
||||
break;
|
||||
}
|
||||
return scope;
|
||||
}
|
||||
|
||||
Scope *Scope::enclosingEnumScope() const
|
||||
{
|
||||
Scope *scope = enclosingScope();
|
||||
for (; scope; scope = scope->enclosingScope()) {
|
||||
if (scope->owner()->isEnum())
|
||||
break;
|
||||
}
|
||||
return scope;
|
||||
}
|
||||
|
||||
Scope *Scope::enclosingPrototypeScope() const
|
||||
{
|
||||
Scope *scope = enclosingScope();
|
||||
for (; scope; scope = scope->enclosingScope()) {
|
||||
if (scope->owner()->isFunction())
|
||||
break;
|
||||
}
|
||||
return scope;
|
||||
}
|
||||
|
||||
Scope *Scope::enclosingBlockScope() const
|
||||
{
|
||||
Scope *scope = enclosingScope();
|
||||
for (; scope; scope = scope->enclosingScope()) {
|
||||
if (scope->owner()->isBlock())
|
||||
break;
|
||||
}
|
||||
return scope;
|
||||
}
|
||||
|
||||
bool Scope::isNamespaceScope() const
|
||||
{
|
||||
if (_owner)
|
||||
return _owner->isNamespace();
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Scope::isClassScope() const
|
||||
{
|
||||
if (_owner)
|
||||
return _owner->isClass();
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Scope::isEnumScope() const
|
||||
{
|
||||
if (_owner)
|
||||
return _owner->isEnum();
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Scope::isBlockScope() const
|
||||
{
|
||||
if (_owner)
|
||||
return _owner->isBlock();
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Scope::isObjCClassScope() const
|
||||
{
|
||||
if (_owner)
|
||||
return _owner->isObjCClass();
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Scope::isObjCProtocolScope() const
|
||||
{
|
||||
if (_owner)
|
||||
return _owner->isObjCProtocol();
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Scope::isPrototypeScope() const
|
||||
{
|
||||
if (_owner)
|
||||
return _owner->isFunction();
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Scope::isObjCMethodScope() const
|
||||
{
|
||||
ObjCMethod *m = 0;
|
||||
if (_owner && 0 != (m = _owner->asObjCMethod()))
|
||||
return m->arguments() != this;
|
||||
return false;
|
||||
}
|
||||
|
||||
void Scope::enterSymbol(Symbol *symbol)
|
||||
void SymbolTable::enterSymbol(Symbol *symbol)
|
||||
{
|
||||
if (++_symbolCount == _allocatedSymbols) {
|
||||
_allocatedSymbols <<= 1;
|
||||
@@ -207,7 +145,7 @@ void Scope::enterSymbol(Symbol *symbol)
|
||||
|
||||
assert(! symbol->_scope || symbol->scope() == this);
|
||||
symbol->_index = _symbolCount;
|
||||
symbol->_scope = this;
|
||||
symbol->_scope = _owner;
|
||||
_symbols[_symbolCount] = symbol;
|
||||
|
||||
if (_symbolCount >= _hashSize * 0.6)
|
||||
@@ -219,7 +157,7 @@ void Scope::enterSymbol(Symbol *symbol)
|
||||
}
|
||||
}
|
||||
|
||||
Symbol *Scope::lookat(const Name *name) const
|
||||
Symbol *SymbolTable::lookat(const Name *name) const
|
||||
{
|
||||
if (! name)
|
||||
return 0;
|
||||
@@ -234,7 +172,7 @@ Symbol *Scope::lookat(const Name *name) const
|
||||
return 0;
|
||||
}
|
||||
|
||||
Symbol *Scope::lookat(const Identifier *id) const
|
||||
Symbol *SymbolTable::lookat(const Identifier *id) const
|
||||
{
|
||||
if (! _hash || ! id)
|
||||
return 0;
|
||||
@@ -264,7 +202,7 @@ Symbol *Scope::lookat(const Identifier *id) const
|
||||
return symbol;
|
||||
}
|
||||
|
||||
Symbol *Scope::lookat(int operatorId) const
|
||||
Symbol *SymbolTable::lookat(int operatorId) const
|
||||
{
|
||||
if (! _hash)
|
||||
return 0;
|
||||
@@ -281,7 +219,7 @@ Symbol *Scope::lookat(int operatorId) const
|
||||
return symbol;
|
||||
}
|
||||
|
||||
void Scope::rehash()
|
||||
void SymbolTable::rehash()
|
||||
{
|
||||
_hashSize <<= 1;
|
||||
|
||||
@@ -299,7 +237,7 @@ void Scope::rehash()
|
||||
}
|
||||
}
|
||||
|
||||
unsigned Scope::hashValue(Symbol *symbol) const
|
||||
unsigned SymbolTable::hashValue(Symbol *symbol) const
|
||||
{
|
||||
if (! symbol)
|
||||
return 0;
|
||||
@@ -307,35 +245,83 @@ unsigned Scope::hashValue(Symbol *symbol) const
|
||||
return symbol->hashCode() % _hashSize;
|
||||
}
|
||||
|
||||
bool Scope::isEmpty() const
|
||||
bool SymbolTable::isEmpty() const
|
||||
{ return _symbolCount == -1; }
|
||||
|
||||
unsigned Scope::symbolCount() const
|
||||
unsigned SymbolTable::symbolCount() const
|
||||
{ return _symbolCount + 1; }
|
||||
|
||||
Symbol *Scope::symbolAt(unsigned index) const
|
||||
Symbol *SymbolTable::symbolAt(unsigned index) const
|
||||
{
|
||||
if (! _symbols)
|
||||
return 0;
|
||||
return _symbols[index];
|
||||
}
|
||||
|
||||
Scope::iterator Scope::firstSymbol() const
|
||||
SymbolTable::iterator SymbolTable::firstSymbol() const
|
||||
{ return _symbols; }
|
||||
|
||||
Scope::iterator Scope::lastSymbol() const
|
||||
SymbolTable::iterator SymbolTable::lastSymbol() const
|
||||
{ return _symbols + _symbolCount + 1; }
|
||||
|
||||
Scope::Scope(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name)
|
||||
: Symbol(translationUnit, sourceLocation, name),
|
||||
_members(0),
|
||||
_startOffset(0),
|
||||
_endOffset(0)
|
||||
{ }
|
||||
|
||||
Scope::~Scope()
|
||||
{ delete _members; }
|
||||
|
||||
/// Adds a Symbol to this Scope.
|
||||
void Scope::addMember(Symbol *symbol)
|
||||
{
|
||||
if (! _members)
|
||||
_members = new SymbolTable(this);
|
||||
|
||||
_members->enterSymbol(symbol);
|
||||
}
|
||||
|
||||
/// Returns true if this Scope is empty; otherwise returns false.
|
||||
bool Scope::isEmpty() const
|
||||
{ return _members ? _members->isEmpty() : true; }
|
||||
|
||||
/// Returns the number of symbols is in the scope.
|
||||
unsigned Scope::memberCount() const
|
||||
{ return _members ? _members->symbolCount() : 0; }
|
||||
|
||||
/// Returns the Symbol at the given position.
|
||||
Symbol *Scope::memberAt(unsigned index) const
|
||||
{ return _members ? _members->symbolAt(index) : 0; }
|
||||
|
||||
/// Returns the first Symbol in the scope.
|
||||
Scope::iterator Scope::firstMember() const
|
||||
{ return _members ? _members->firstSymbol() : 0; }
|
||||
|
||||
/// Returns the last Symbol in the scope.
|
||||
Scope::iterator Scope::lastMember() const
|
||||
{ return _members ? _members->lastSymbol() : 0; }
|
||||
|
||||
Symbol *Scope::find(const Name *name) const
|
||||
{ return _members ? _members->lookat(name) : 0; }
|
||||
|
||||
Symbol *Scope::find(const Identifier *id) const
|
||||
{ return _members ? _members->lookat(id) : 0; }
|
||||
|
||||
Symbol *Scope::find(int operatorId) const
|
||||
{ return _members ? _members->lookat(operatorId) : 0; }
|
||||
|
||||
/// Set the start offset of the scope
|
||||
unsigned Scope::startOffset() const
|
||||
{ return _startOffset; }
|
||||
|
||||
void Scope::setStartOffset(unsigned offset)
|
||||
{ _startOffset = offset; }
|
||||
|
||||
/// Set the end offset of the scope
|
||||
unsigned Scope::endOffset() const
|
||||
{ return _endOffset; }
|
||||
|
||||
void Scope::setEndOffset(unsigned offset)
|
||||
{ _endOffset = offset; }
|
||||
|
||||
|
||||
|
||||
@@ -50,94 +50,39 @@
|
||||
#define CPLUSPLUS_SCOPE_H
|
||||
|
||||
#include "CPlusPlusForwardDeclarations.h"
|
||||
|
||||
#include "Symbol.h"
|
||||
|
||||
namespace CPlusPlus {
|
||||
|
||||
class CPLUSPLUS_EXPORT Scope
|
||||
class CPLUSPLUS_EXPORT Scope: public Symbol
|
||||
{
|
||||
Scope(const Scope &other);
|
||||
void operator =(const Scope &other);
|
||||
|
||||
public:
|
||||
typedef Symbol **iterator;
|
||||
|
||||
public:
|
||||
/// Constructs an empty Scope.
|
||||
Scope(ScopedSymbol *owner = 0);
|
||||
|
||||
/// Destroy this scope.
|
||||
~Scope();
|
||||
|
||||
/// Returns this scope's owner Symbol.
|
||||
ScopedSymbol *owner() const;
|
||||
|
||||
/// Sets this scope's owner Symbol.
|
||||
void setOwner(ScopedSymbol *owner); // ### remove me
|
||||
|
||||
/// Returns the enclosing scope.
|
||||
Scope *enclosingScope() const;
|
||||
|
||||
/// Returns the eclosing namespace scope.
|
||||
Scope *enclosingNamespaceScope() const;
|
||||
|
||||
/// Returns the enclosing class scope.
|
||||
Scope *enclosingClassScope() const;
|
||||
|
||||
/// Returns the enclosing enum scope.
|
||||
Scope *enclosingEnumScope() const;
|
||||
|
||||
/// Rerturns the enclosing prototype scope.
|
||||
Scope *enclosingPrototypeScope() const;
|
||||
|
||||
/// Rerturns the enclosing Block scope.
|
||||
Scope *enclosingBlockScope() const;
|
||||
|
||||
/// Returns true if this scope's owner is a Namespace Symbol.
|
||||
bool isNamespaceScope() const;
|
||||
|
||||
/// Returns true if this scope's owner is a Class Symbol.
|
||||
bool isClassScope() const;
|
||||
|
||||
/// Returns true if this scope's owner is an Enum Symbol.
|
||||
bool isEnumScope() const;
|
||||
|
||||
/// Returns true if this scope's owner is a Block Symbol.
|
||||
bool isBlockScope() const;
|
||||
|
||||
/// Returns true if this scope's owner is a Prototype Symbol.
|
||||
bool isPrototypeScope() const;
|
||||
|
||||
/// Returns true if this scope's owner is an ObjCClass Symbol.
|
||||
bool isObjCClassScope() const;
|
||||
|
||||
/// Returns true if this scope's owner is an ObjCProtocol Symbol.
|
||||
bool isObjCProtocolScope() const;
|
||||
|
||||
/// Returns true if this scope's owner is an ObjCMethod symbol.
|
||||
bool isObjCMethodScope() const;
|
||||
Scope(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name);
|
||||
virtual ~Scope();
|
||||
|
||||
/// Adds a Symbol to this Scope.
|
||||
void enterSymbol(Symbol *symbol);
|
||||
void addMember(Symbol *symbol);
|
||||
|
||||
/// Returns true if this Scope is empty; otherwise returns false.
|
||||
bool isEmpty() const;
|
||||
|
||||
/// Returns the number of symbols is in the scope.
|
||||
unsigned symbolCount() const;
|
||||
unsigned memberCount() const;
|
||||
|
||||
/// Returns the Symbol at the given position.
|
||||
Symbol *symbolAt(unsigned index) const;
|
||||
Symbol *memberAt(unsigned index) const;
|
||||
|
||||
typedef Symbol **iterator;
|
||||
|
||||
/// Returns the first Symbol in the scope.
|
||||
iterator firstSymbol() const;
|
||||
iterator firstMember() const;
|
||||
|
||||
/// Returns the last Symbol in the scope.
|
||||
iterator lastSymbol() const;
|
||||
iterator lastMember() const;
|
||||
|
||||
Symbol *lookat(const Name *name) const;
|
||||
Symbol *lookat(const Identifier *id) const;
|
||||
Symbol *lookat(int operatorId) const;
|
||||
Symbol *find(const Name *name) const;
|
||||
Symbol *find(const Identifier *id) const;
|
||||
Symbol *find(int operatorId) const;
|
||||
|
||||
/// Set the start offset of the scope
|
||||
unsigned startOffset() const;
|
||||
@@ -147,22 +92,14 @@ public:
|
||||
unsigned endOffset() const;
|
||||
void setEndOffset(unsigned offset);
|
||||
|
||||
private:
|
||||
/// Returns the hash value for the given Symbol.
|
||||
unsigned hashValue(Symbol *symbol) const;
|
||||
virtual const Scope *asScope() const
|
||||
{ return this; }
|
||||
|
||||
/// Updates the hash table.
|
||||
void rehash();
|
||||
virtual Scope *asScope()
|
||||
{ return this; }
|
||||
|
||||
private:
|
||||
enum { DefaultInitialSize = 11 };
|
||||
|
||||
ScopedSymbol *_owner;
|
||||
Symbol **_symbols;
|
||||
Symbol **_hash;
|
||||
int _allocatedSymbols;
|
||||
int _symbolCount;
|
||||
int _hashSize;
|
||||
SymbolTable *_members;
|
||||
unsigned _startOffset;
|
||||
unsigned _endOffset;
|
||||
};
|
||||
|
||||
@@ -201,7 +201,7 @@ void Semantic::finishFunctionDefinition(FunctionDefinitionAST *ast)
|
||||
d->checkDeclaration->check(ast->ctor_initializer, fun->scope());
|
||||
|
||||
if (ast->function_body) {
|
||||
check(ast->function_body, fun->members());
|
||||
check(ast->function_body, fun);
|
||||
|
||||
if (CompoundStatementAST *c = ast->function_body->asCompoundStatement())
|
||||
fun->setBlock(c->symbol);
|
||||
|
||||
@@ -242,67 +242,49 @@ void Symbol::setScope(Scope *scope)
|
||||
_scope = scope;
|
||||
}
|
||||
|
||||
ScopedSymbol *Symbol::enclosingSymbol() const
|
||||
Namespace *Symbol::enclosingNamespace() const
|
||||
{
|
||||
if (! _scope)
|
||||
return 0;
|
||||
|
||||
return _scope->owner();
|
||||
for (Scope *s = _scope; s; s = s->scope()) {
|
||||
if (Namespace *ns = s->asNamespace())
|
||||
return ns;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Scope *Symbol::enclosingNamespaceScope() const
|
||||
Class *Symbol::enclosingClass() const
|
||||
{
|
||||
if (! _scope)
|
||||
return 0;
|
||||
|
||||
else if (_scope->isNamespaceScope())
|
||||
return _scope;
|
||||
|
||||
return _scope->enclosingNamespaceScope();
|
||||
for (Scope *s = _scope; s; s = s->scope()) {
|
||||
if (Class *klass = s->asClass())
|
||||
return klass;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Scope *Symbol::enclosingClassScope() const
|
||||
Enum *Symbol::enclosingEnum() const
|
||||
{
|
||||
if (! _scope)
|
||||
return 0;
|
||||
|
||||
else if (_scope->isClassScope())
|
||||
return _scope;
|
||||
|
||||
return _scope->enclosingClassScope();
|
||||
for (Scope *s = _scope; s; s = s->scope()) {
|
||||
if (Enum *e = s->asEnum())
|
||||
return e;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Scope *Symbol::enclosingEnumScope() const
|
||||
Function *Symbol::enclosingFunction() const
|
||||
{
|
||||
if (! _scope)
|
||||
return 0;
|
||||
|
||||
else if (_scope->isEnumScope())
|
||||
return _scope;
|
||||
|
||||
return _scope->enclosingEnumScope();
|
||||
for (Scope *s = _scope; s; s = s->scope()) {
|
||||
if (Function *fun = s->asFunction())
|
||||
return fun;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Scope *Symbol::enclosingPrototypeScope() const
|
||||
Block *Symbol::enclosingBlock() const
|
||||
{
|
||||
if (! _scope)
|
||||
return 0;
|
||||
|
||||
else if (_scope->isPrototypeScope())
|
||||
return _scope;
|
||||
|
||||
return _scope->enclosingPrototypeScope();
|
||||
}
|
||||
|
||||
Scope *Symbol::enclosingBlockScope() const
|
||||
{
|
||||
if (! _scope)
|
||||
return 0;
|
||||
|
||||
else if (_scope->isBlockScope())
|
||||
return _scope;
|
||||
|
||||
return _scope->enclosingBlockScope();
|
||||
for (Scope *s = _scope; s; s = s->scope()) {
|
||||
if (Block *block = s->asBlock())
|
||||
return block;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned Symbol::index() const
|
||||
@@ -354,7 +336,7 @@ bool Symbol::isPrivate() const
|
||||
{ return _visibility == Private; }
|
||||
|
||||
bool Symbol::isScopedSymbol() const
|
||||
{ return asScopedSymbol() != 0; }
|
||||
{ return asScope() != 0; }
|
||||
|
||||
bool Symbol::isEnum() const
|
||||
{ return asEnum() != 0; }
|
||||
|
||||
@@ -126,9 +126,6 @@ public:
|
||||
/// Sets this Symbol's visibility.
|
||||
void setVisibility(int visibility);
|
||||
|
||||
/// Returns this Symbol's scope.
|
||||
Scope *scope() const;
|
||||
|
||||
/// Returns the next chained Symbol.
|
||||
Symbol *next() const;
|
||||
|
||||
@@ -219,7 +216,7 @@ public:
|
||||
/// Returns true if this Symbol is an Objective-C @property declaration.
|
||||
bool isObjCPropertyDeclaration() const;
|
||||
|
||||
virtual const ScopedSymbol *asScopedSymbol() const { return 0; }
|
||||
virtual const Scope *asScope() const { return 0; }
|
||||
virtual const Enum *asEnum() const { return 0; }
|
||||
virtual const Function *asFunction() const { return 0; }
|
||||
virtual const Namespace *asNamespace() const { return 0; }
|
||||
@@ -242,7 +239,7 @@ public:
|
||||
virtual const ObjCMethod *asObjCMethod() const { return 0; }
|
||||
virtual const ObjCPropertyDeclaration *asObjCPropertyDeclaration() const { return 0; }
|
||||
|
||||
virtual ScopedSymbol *asScopedSymbol() { return 0; }
|
||||
virtual Scope *asScope() { return 0; }
|
||||
virtual Enum *asEnum() { return 0; }
|
||||
virtual Function *asFunction() { return 0; }
|
||||
virtual Namespace *asNamespace() { return 0; }
|
||||
@@ -284,22 +281,23 @@ public:
|
||||
bool isUnavailable() const;
|
||||
void setUnavailable(bool isUnavailable);
|
||||
|
||||
ScopedSymbol *enclosingSymbol() const;
|
||||
/// Returns this Symbol's eclosing scope.
|
||||
Scope *scope() const;
|
||||
|
||||
/// Returns the eclosing namespace scope.
|
||||
Scope *enclosingNamespaceScope() const;
|
||||
Namespace *enclosingNamespace() const;
|
||||
|
||||
/// Returns the enclosing class scope.
|
||||
Scope *enclosingClassScope() const;
|
||||
Class *enclosingClass() const;
|
||||
|
||||
/// Returns the enclosing enum scope.
|
||||
Scope *enclosingEnumScope() const;
|
||||
Enum *enclosingEnum() const;
|
||||
|
||||
/// Returns the enclosing prototype scope.
|
||||
Scope *enclosingPrototypeScope() const;
|
||||
Function *enclosingFunction() const;
|
||||
|
||||
/// Returns the enclosing Block scope.
|
||||
Scope *enclosingBlockScope() const;
|
||||
Block *enclosingBlock() const;
|
||||
|
||||
void setScope(Scope *scope); // ### make me private
|
||||
void setSourceLocation(unsigned sourceLocation, TranslationUnit *translationUnit); // ### make me private
|
||||
@@ -331,7 +329,7 @@ private:
|
||||
|
||||
class HashCode;
|
||||
|
||||
friend class Scope;
|
||||
friend class SymbolTable;
|
||||
};
|
||||
|
||||
} // end of namespace CPlusPlus
|
||||
|
||||
@@ -190,7 +190,7 @@ void TypenameArgument::visitSymbol0(SymbolVisitor *visitor)
|
||||
{ visitor->visit(this); }
|
||||
|
||||
Function::Function(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name)
|
||||
: ScopedSymbol(translationUnit, sourceLocation, name),
|
||||
: Scope(translationUnit, sourceLocation, name),
|
||||
_templateParameters(0),
|
||||
_block(0),
|
||||
_flags(0)
|
||||
@@ -230,11 +230,11 @@ unsigned Function::templateParameterCount() const
|
||||
if (! _templateParameters)
|
||||
return 0;
|
||||
|
||||
return _templateParameters->scope()->symbolCount();
|
||||
return _templateParameters->scope()->memberCount();
|
||||
}
|
||||
|
||||
Symbol *Function::templateParameterAt(unsigned index) const
|
||||
{ return _templateParameters->scope()->symbolAt(index); }
|
||||
{ return _templateParameters->scope()->memberAt(index); }
|
||||
|
||||
TemplateParameters *Function::templateParameters() const
|
||||
{ return _templateParameters; }
|
||||
@@ -414,114 +414,8 @@ void Function::visitSymbol0(SymbolVisitor *visitor)
|
||||
}
|
||||
}
|
||||
|
||||
ScopedSymbol::ScopedSymbol(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name)
|
||||
: Symbol(translationUnit, sourceLocation, name)
|
||||
{ _members = new Scope(this); }
|
||||
|
||||
ScopedSymbol::~ScopedSymbol()
|
||||
{ delete _members; }
|
||||
|
||||
unsigned ScopedSymbol::memberCount() const
|
||||
{
|
||||
if (! _members)
|
||||
return 0;
|
||||
return _members->symbolCount();
|
||||
}
|
||||
|
||||
Symbol *ScopedSymbol::memberAt(unsigned index) const
|
||||
{
|
||||
if (! _members)
|
||||
return 0;
|
||||
return _members->symbolAt(index);
|
||||
}
|
||||
|
||||
Scope *ScopedSymbol::members() const
|
||||
{ return _members; }
|
||||
|
||||
void ScopedSymbol::addMember(Symbol *member)
|
||||
{ _members->enterSymbol(member); }
|
||||
|
||||
/// Returns true if this scope's owner is a Namespace Symbol.
|
||||
bool ScopedSymbol::isNamespaceScope() const
|
||||
{ return _members->isNamespaceScope(); }
|
||||
|
||||
/// Returns true if this scope's owner is a Class Symbol.
|
||||
bool ScopedSymbol::isClassScope() const
|
||||
{ return _members->isClassScope(); }
|
||||
|
||||
/// Returns true if this scope's owner is an Enum Symbol.
|
||||
bool ScopedSymbol::isEnumScope() const
|
||||
{ return _members->isEnumScope(); }
|
||||
|
||||
/// Returns true if this scope's owner is a Block Symbol.
|
||||
bool ScopedSymbol::isBlockScope() const
|
||||
{ return _members->isBlockScope(); }
|
||||
|
||||
/// Returns true if this scope's owner is a Prototype Symbol.
|
||||
bool ScopedSymbol::isPrototypeScope() const
|
||||
{ return _members->isPrototypeScope(); }
|
||||
|
||||
/// Returns true if this scope's owner is an ObjCClass Symbol.
|
||||
bool ScopedSymbol::isObjCClassScope() const
|
||||
{ return _members->isObjCClassScope(); }
|
||||
|
||||
/// Returns true if this scope's owner is an ObjCProtocol Symbol.
|
||||
bool ScopedSymbol::isObjCProtocolScope() const
|
||||
{ return _members->isObjCProtocolScope(); }
|
||||
|
||||
/// Returns true if this scope's owner is an ObjCMethod symbol.
|
||||
bool ScopedSymbol::isObjCMethodScope() const
|
||||
{ return _members->isObjCMethodScope(); }
|
||||
|
||||
/// Adds a Symbol to this Scope.
|
||||
void ScopedSymbol::enterSymbol(Symbol *symbol)
|
||||
{ _members->enterSymbol(symbol); }
|
||||
|
||||
/// Returns true if this Scope is empty; otherwise returns false.
|
||||
bool ScopedSymbol::isEmpty() const
|
||||
{ return _members->isEmpty(); }
|
||||
|
||||
/// Returns the number of symbols is in the scope.
|
||||
unsigned ScopedSymbol::symbolCount() const
|
||||
{ return _members->symbolCount(); }
|
||||
|
||||
/// Returns the Symbol at the given position.
|
||||
Symbol *ScopedSymbol::symbolAt(unsigned index) const
|
||||
{ return _members->symbolAt(index); }
|
||||
|
||||
/// Returns the first Symbol in the scope.
|
||||
ScopedSymbol::iterator ScopedSymbol::firstSymbol() const
|
||||
{ return _members->firstSymbol(); }
|
||||
|
||||
/// Returns the last Symbol in the scope.
|
||||
Scope::iterator ScopedSymbol::lastSymbol() const
|
||||
{ return _members->lastSymbol(); }
|
||||
|
||||
Symbol *ScopedSymbol::lookat(const Name *name) const
|
||||
{ return _members->lookat(name); }
|
||||
|
||||
Symbol *ScopedSymbol::lookat(const Identifier *id) const
|
||||
{ return _members->lookat(id); }
|
||||
|
||||
Symbol *ScopedSymbol::lookat(int operatorId) const
|
||||
{ return _members->lookat(operatorId); }
|
||||
|
||||
/// Set the start offset of the scope
|
||||
unsigned ScopedSymbol::startOffset() const
|
||||
{ return _members->startOffset(); }
|
||||
|
||||
void ScopedSymbol::setStartOffset(unsigned offset)
|
||||
{ _members->setStartOffset(offset); }
|
||||
|
||||
/// Set the end offset of the scope
|
||||
unsigned ScopedSymbol::endOffset() const
|
||||
{ return _members->endOffset(); }
|
||||
|
||||
void ScopedSymbol::setEndOffset(unsigned offset)
|
||||
{ _members->setEndOffset(offset); }
|
||||
|
||||
Block::Block(TranslationUnit *translationUnit, unsigned sourceLocation)
|
||||
: ScopedSymbol(translationUnit, sourceLocation, /*name = */ 0)
|
||||
: Scope(translationUnit, sourceLocation, /*name = */ 0)
|
||||
{ }
|
||||
|
||||
Block::~Block()
|
||||
@@ -540,7 +434,7 @@ void Block::visitSymbol0(SymbolVisitor *visitor)
|
||||
}
|
||||
|
||||
Enum::Enum(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name)
|
||||
: ScopedSymbol(translationUnit, sourceLocation, name)
|
||||
: Scope(translationUnit, sourceLocation, name)
|
||||
{ }
|
||||
|
||||
Enum::~Enum()
|
||||
@@ -584,7 +478,7 @@ void Enum::visitSymbol0(SymbolVisitor *visitor)
|
||||
}
|
||||
|
||||
Namespace::Namespace(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name)
|
||||
: ScopedSymbol(translationUnit, sourceLocation, name)
|
||||
: Scope(translationUnit, sourceLocation, name)
|
||||
{ }
|
||||
|
||||
Namespace::~Namespace()
|
||||
@@ -694,7 +588,7 @@ bool ForwardClassDeclaration::matchType0(const Type *otherType, TypeMatcher *mat
|
||||
}
|
||||
|
||||
Class::Class(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name)
|
||||
: ScopedSymbol(translationUnit, sourceLocation, name),
|
||||
: Scope(translationUnit, sourceLocation, name),
|
||||
_key(ClassKey),
|
||||
_templateParameters(0)
|
||||
{ }
|
||||
@@ -722,11 +616,11 @@ unsigned Class::templateParameterCount() const
|
||||
if (! _templateParameters)
|
||||
return 0;
|
||||
|
||||
return _templateParameters->scope()->symbolCount();
|
||||
return _templateParameters->scope()->memberCount();
|
||||
}
|
||||
|
||||
Symbol *Class::templateParameterAt(unsigned index) const
|
||||
{ return _templateParameters->scope()->symbolAt(index); }
|
||||
{ return _templateParameters->scope()->memberAt(index); }
|
||||
|
||||
TemplateParameters *Class::templateParameters() const
|
||||
{ return _templateParameters; }
|
||||
@@ -809,7 +703,7 @@ void ObjCBaseProtocol::visitSymbol0(SymbolVisitor *visitor)
|
||||
{ visitor->visit(this); }
|
||||
|
||||
ObjCClass::ObjCClass(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name):
|
||||
ScopedSymbol(translationUnit, sourceLocation, name),
|
||||
Scope(translationUnit, sourceLocation, name),
|
||||
_isInterface(false),
|
||||
_categoryName(0),
|
||||
_baseClass(0)
|
||||
@@ -892,7 +786,7 @@ bool ObjCClass::matchType0(const Type *otherType, TypeMatcher *matcher) const
|
||||
}
|
||||
|
||||
ObjCProtocol::ObjCProtocol(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name):
|
||||
ScopedSymbol(translationUnit, sourceLocation, name)
|
||||
Scope(translationUnit, sourceLocation, name)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -1025,14 +919,12 @@ bool ObjCForwardProtocolDeclaration::matchType0(const Type *otherType, TypeMatch
|
||||
}
|
||||
|
||||
ObjCMethod::ObjCMethod(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name)
|
||||
: ScopedSymbol(translationUnit, sourceLocation, name),
|
||||
: Scope(translationUnit, sourceLocation, name),
|
||||
_flags(0)
|
||||
{ _arguments = new Scope(this); }
|
||||
{ }
|
||||
|
||||
ObjCMethod::~ObjCMethod()
|
||||
{
|
||||
delete _arguments;
|
||||
}
|
||||
{ }
|
||||
|
||||
bool ObjCMethod::isEqualTo(const Type *other) const
|
||||
{
|
||||
@@ -1043,13 +935,13 @@ bool ObjCMethod::isEqualTo(const Type *other) const
|
||||
const Name *l = identity();
|
||||
const Name *r = o->identity();
|
||||
if (l == r || (l && l->isEqualTo(r))) {
|
||||
if (_arguments->symbolCount() != o->_arguments->symbolCount())
|
||||
if (argumentCount() != o->argumentCount())
|
||||
return false;
|
||||
else if (! _returnType.isEqualTo(o->_returnType))
|
||||
return false;
|
||||
for (unsigned i = 0; i < _arguments->symbolCount(); ++i) {
|
||||
Symbol *l = _arguments->symbolAt(i);
|
||||
Symbol *r = o->_arguments->symbolAt(i);
|
||||
for (unsigned i = 0; i < argumentCount(); ++i) {
|
||||
Symbol *l = argumentAt(i);
|
||||
Symbol *r = o->argumentAt(i);
|
||||
if (! l->type().isEqualTo(r->type()))
|
||||
return false;
|
||||
}
|
||||
@@ -1086,17 +978,14 @@ bool ObjCMethod::hasReturnType() const
|
||||
|
||||
unsigned ObjCMethod::argumentCount() const
|
||||
{
|
||||
if (! _arguments)
|
||||
return 0;
|
||||
|
||||
return _arguments->symbolCount();
|
||||
#warning robe implement me
|
||||
return memberCount();
|
||||
}
|
||||
|
||||
Symbol *ObjCMethod::argumentAt(unsigned index) const
|
||||
{ return _arguments->symbolAt(index); }
|
||||
|
||||
Scope *ObjCMethod::arguments() const
|
||||
{ return _arguments; }
|
||||
{
|
||||
return memberAt(index);
|
||||
}
|
||||
|
||||
bool ObjCMethod::hasArguments() const
|
||||
{
|
||||
@@ -1113,9 +1002,6 @@ void ObjCMethod::setVariadic(bool isVariadic)
|
||||
void ObjCMethod::visitSymbol0(SymbolVisitor *visitor)
|
||||
{
|
||||
if (visitor->visit(this)) {
|
||||
for (unsigned i = 0; i < _arguments->symbolCount(); ++i) {
|
||||
visitSymbol(_arguments->symbolAt(i), visitor);
|
||||
}
|
||||
for (unsigned i = 0; i < memberCount(); ++i) {
|
||||
visitSymbol(memberAt(i), visitor);
|
||||
}
|
||||
|
||||
@@ -53,6 +53,7 @@
|
||||
#include "Symbol.h"
|
||||
#include "Type.h"
|
||||
#include "FullySpecifiedType.h"
|
||||
#include "Scope.h"
|
||||
#include <vector>
|
||||
|
||||
namespace CPlusPlus {
|
||||
@@ -217,84 +218,7 @@ private:
|
||||
FullySpecifiedType _type;
|
||||
};
|
||||
|
||||
class CPLUSPLUS_EXPORT ScopedSymbol: public Symbol
|
||||
{
|
||||
public:
|
||||
ScopedSymbol(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name);
|
||||
virtual ~ScopedSymbol();
|
||||
|
||||
unsigned memberCount() const;
|
||||
Symbol *memberAt(unsigned index) const;
|
||||
Scope *members() const;
|
||||
void addMember(Symbol *member);
|
||||
|
||||
/// Returns true if this scope's owner is a Namespace Symbol.
|
||||
bool isNamespaceScope() const;
|
||||
|
||||
/// Returns true if this scope's owner is a Class Symbol.
|
||||
bool isClassScope() const;
|
||||
|
||||
/// Returns true if this scope's owner is an Enum Symbol.
|
||||
bool isEnumScope() const;
|
||||
|
||||
/// Returns true if this scope's owner is a Block Symbol.
|
||||
bool isBlockScope() const;
|
||||
|
||||
/// Returns true if this scope's owner is a Prototype Symbol.
|
||||
bool isPrototypeScope() const;
|
||||
|
||||
/// Returns true if this scope's owner is an ObjCClass Symbol.
|
||||
bool isObjCClassScope() const;
|
||||
|
||||
/// Returns true if this scope's owner is an ObjCProtocol Symbol.
|
||||
bool isObjCProtocolScope() const;
|
||||
|
||||
/// Returns true if this scope's owner is an ObjCMethod symbol.
|
||||
bool isObjCMethodScope() const;
|
||||
|
||||
/// Adds a Symbol to this Scope.
|
||||
void enterSymbol(Symbol *symbol);
|
||||
|
||||
/// Returns true if this Scope is empty; otherwise returns false.
|
||||
bool isEmpty() const;
|
||||
|
||||
/// Returns the number of symbols is in the scope.
|
||||
unsigned symbolCount() const;
|
||||
|
||||
/// Returns the Symbol at the given position.
|
||||
Symbol *symbolAt(unsigned index) const;
|
||||
|
||||
typedef Symbol **iterator;
|
||||
|
||||
/// Returns the first Symbol in the scope.
|
||||
iterator firstSymbol() const;
|
||||
|
||||
/// Returns the last Symbol in the scope.
|
||||
iterator lastSymbol() const;
|
||||
|
||||
Symbol *lookat(const Name *name) const;
|
||||
Symbol *lookat(const Identifier *id) const;
|
||||
Symbol *lookat(int operatorId) const;
|
||||
|
||||
/// Set the start offset of the scope
|
||||
unsigned startOffset() const;
|
||||
void setStartOffset(unsigned offset);
|
||||
|
||||
/// Set the end offset of the scope
|
||||
unsigned endOffset() const;
|
||||
void setEndOffset(unsigned offset);
|
||||
|
||||
virtual const ScopedSymbol *asScopedSymbol() const
|
||||
{ return this; }
|
||||
|
||||
virtual ScopedSymbol *asScopedSymbol()
|
||||
{ return this; }
|
||||
|
||||
private:
|
||||
Scope *_members;
|
||||
};
|
||||
|
||||
class CPLUSPLUS_EXPORT Block: public ScopedSymbol
|
||||
class CPLUSPLUS_EXPORT Block: public Scope
|
||||
{
|
||||
public:
|
||||
Block(TranslationUnit *translationUnit, unsigned sourceLocation);
|
||||
@@ -347,7 +271,7 @@ private:
|
||||
TemplateParameters *_templateParameters;
|
||||
};
|
||||
|
||||
class CPLUSPLUS_EXPORT Enum: public ScopedSymbol, public Type
|
||||
class CPLUSPLUS_EXPORT Enum: public Scope, public Type
|
||||
{
|
||||
public:
|
||||
Enum(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name);
|
||||
@@ -377,7 +301,7 @@ protected:
|
||||
virtual bool matchType0(const Type *otherType, TypeMatcher *matcher) const;
|
||||
};
|
||||
|
||||
class CPLUSPLUS_EXPORT Function: public ScopedSymbol, public Type
|
||||
class CPLUSPLUS_EXPORT Function: public Scope, public Type
|
||||
{
|
||||
public:
|
||||
enum MethodKey {
|
||||
@@ -484,7 +408,7 @@ private:
|
||||
};
|
||||
};
|
||||
|
||||
class CPLUSPLUS_EXPORT Namespace: public ScopedSymbol, public Type
|
||||
class CPLUSPLUS_EXPORT Namespace: public Scope, public Type
|
||||
{
|
||||
public:
|
||||
Namespace(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name);
|
||||
@@ -541,7 +465,7 @@ private:
|
||||
FullySpecifiedType _type;
|
||||
};
|
||||
|
||||
class CPLUSPLUS_EXPORT Class: public ScopedSymbol, public Type
|
||||
class CPLUSPLUS_EXPORT Class: public Scope, public Type
|
||||
{
|
||||
public:
|
||||
Class(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name);
|
||||
@@ -668,7 +592,7 @@ protected:
|
||||
virtual bool matchType0(const Type *otherType, TypeMatcher *matcher) const;
|
||||
};
|
||||
|
||||
class CPLUSPLUS_EXPORT ObjCProtocol: public ScopedSymbol, public Type
|
||||
class CPLUSPLUS_EXPORT ObjCProtocol: public Scope, public Type
|
||||
{
|
||||
public:
|
||||
ObjCProtocol(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name);
|
||||
@@ -735,7 +659,7 @@ protected:
|
||||
private:
|
||||
};
|
||||
|
||||
class CPLUSPLUS_EXPORT ObjCClass: public ScopedSymbol, public Type
|
||||
class CPLUSPLUS_EXPORT ObjCClass: public Scope, public Type
|
||||
{
|
||||
public:
|
||||
ObjCClass(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name);
|
||||
@@ -785,7 +709,7 @@ private:
|
||||
std::vector<ObjCBaseProtocol *> _protocols;
|
||||
};
|
||||
|
||||
class CPLUSPLUS_EXPORT ObjCMethod: public ScopedSymbol, public Type
|
||||
class CPLUSPLUS_EXPORT ObjCMethod: public Scope, public Type
|
||||
{
|
||||
public:
|
||||
ObjCMethod(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name);
|
||||
@@ -799,7 +723,6 @@ public:
|
||||
|
||||
unsigned argumentCount() const;
|
||||
Symbol *argumentAt(unsigned index) const;
|
||||
Scope *arguments() const;
|
||||
|
||||
/** Convenience function that returns whether the function receives any arguments. */
|
||||
bool hasArguments() const;
|
||||
@@ -839,7 +762,6 @@ private:
|
||||
unsigned _flags;
|
||||
Flags f;
|
||||
};
|
||||
Scope *_arguments;
|
||||
};
|
||||
|
||||
class CPLUSPLUS_EXPORT ObjCPropertyDeclaration: public Symbol
|
||||
|
||||
Reference in New Issue
Block a user