forked from qt-creator/qt-creator
Fixes for scope range calculation.
This commit is contained in:
@@ -89,11 +89,11 @@ protected:
|
||||
}
|
||||
|
||||
unsigned startLine, startColumn;
|
||||
_unit->getPosition(symbol->startOffset(), &startLine, &startColumn);
|
||||
_unit->getPosition(scope->startOffset(), &startLine, &startColumn);
|
||||
|
||||
if (_line > startLine || (_line == startLine && _column >= startColumn)) {
|
||||
unsigned endLine, endColumn;
|
||||
_unit->getPosition(symbol->endOffset(), &endLine, &endColumn);
|
||||
_unit->getPosition(scope->endOffset(), &endLine, &endColumn);
|
||||
|
||||
if (_line < endLine || (_line == endLine && _column <= endColumn))
|
||||
_scope = scope;
|
||||
|
@@ -87,12 +87,12 @@ public:
|
||||
static Scope *findScope(unsigned tokenOffset, const QList<ScopedSymbol *> &scopes)
|
||||
{
|
||||
for (int i = scopes.size() - 1; i != -1; --i) {
|
||||
ScopedSymbol *symbol = scopes.at(i);
|
||||
const unsigned start = symbol->startOffset();
|
||||
const unsigned end = symbol->endOffset();
|
||||
Scope *scope = scopes.at(i)->members();
|
||||
const unsigned start = scope->startOffset();
|
||||
const unsigned end = scope->endOffset();
|
||||
|
||||
if (tokenOffset >= start && tokenOffset < end)
|
||||
return symbol->members();
|
||||
return scope;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@@ -349,8 +349,8 @@ bool CheckDeclaration::visit(FunctionDefinitionAST *ast)
|
||||
fun->setDeprecated(true);
|
||||
if (ty.isUnavailable())
|
||||
fun->setUnavailable(true);
|
||||
fun->setStartOffset(funStartOffset);
|
||||
fun->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
fun->members()->setStartOffset(funStartOffset);
|
||||
fun->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
if (ast->declarator)
|
||||
fun->setSourceLocation(ast->declarator->firstToken(), translationUnit());
|
||||
fun->setName(name);
|
||||
@@ -410,13 +410,15 @@ bool CheckDeclaration::visit(NamespaceAST *ast)
|
||||
namespaceName = control()->nameId(id);
|
||||
|
||||
unsigned sourceLocation = ast->firstToken();
|
||||
|
||||
if (ast->identifier_token)
|
||||
sourceLocation = ast->identifier_token;
|
||||
unsigned scopeStart = tokenAt(ast->firstToken()).offset;
|
||||
if (ast->linkage_body && ast->linkage_body->firstToken())
|
||||
scopeStart = tokenAt(ast->linkage_body->firstToken()).offset;
|
||||
|
||||
Namespace *ns = control()->newNamespace(sourceLocation, namespaceName);
|
||||
ns->setStartOffset(tokenAt(ast->firstToken()).offset);
|
||||
ns->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
ns->members()->setStartOffset(scopeStart);
|
||||
ns->members()->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.
|
||||
@@ -583,6 +585,18 @@ bool CheckDeclaration::visit(ObjCProtocolForwardDeclarationAST *ast)
|
||||
return false;
|
||||
}
|
||||
|
||||
unsigned CheckDeclaration::calculateScopeStart(ObjCProtocolDeclarationAST *ast) const
|
||||
{
|
||||
if (ast->protocol_refs)
|
||||
if (unsigned pos = ast->protocol_refs->lastToken())
|
||||
return tokenAt(pos - 1).end();
|
||||
if (ast->name)
|
||||
if (unsigned pos = ast->name->lastToken())
|
||||
return tokenAt(pos - 1).end();
|
||||
|
||||
return tokenAt(ast->firstToken()).offset;
|
||||
}
|
||||
|
||||
bool CheckDeclaration::visit(ObjCProtocolDeclarationAST *ast)
|
||||
{
|
||||
unsigned sourceLocation;
|
||||
@@ -593,8 +607,8 @@ bool CheckDeclaration::visit(ObjCProtocolDeclarationAST *ast)
|
||||
|
||||
const Name *protocolName = semantic()->check(ast->name, _scope);
|
||||
ObjCProtocol *protocol = control()->newObjCProtocol(sourceLocation, protocolName);
|
||||
protocol->setStartOffset(tokenAt(ast->firstToken()).offset);
|
||||
protocol->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
protocol->members()->setStartOffset(calculateScopeStart(ast));
|
||||
protocol->members()->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) {
|
||||
@@ -642,6 +656,40 @@ bool CheckDeclaration::visit(ObjCClassForwardDeclarationAST *ast)
|
||||
return false;
|
||||
}
|
||||
|
||||
unsigned CheckDeclaration::calculateScopeStart(ObjCClassDeclarationAST *ast) const
|
||||
{
|
||||
if (ast->inst_vars_decl)
|
||||
if (unsigned pos = ast->inst_vars_decl->lbrace_token)
|
||||
return tokenAt(pos).end();
|
||||
|
||||
if (ast->protocol_refs)
|
||||
if (unsigned pos = ast->protocol_refs->lastToken())
|
||||
return tokenAt(pos - 1).end();
|
||||
|
||||
if (ast->superclass)
|
||||
if (unsigned pos = ast->superclass->lastToken())
|
||||
return tokenAt(pos - 1).end();
|
||||
|
||||
if (ast->colon_token)
|
||||
return tokenAt(ast->colon_token).end();
|
||||
|
||||
if (ast->rparen_token)
|
||||
return tokenAt(ast->rparen_token).end();
|
||||
|
||||
if (ast->category_name)
|
||||
if (unsigned pos = ast->category_name->lastToken())
|
||||
return tokenAt(pos - 1).end();
|
||||
|
||||
if (ast->lparen_token)
|
||||
return tokenAt(ast->lparen_token).end();
|
||||
|
||||
if (ast->class_name)
|
||||
if (unsigned pos = ast->class_name->lastToken())
|
||||
return tokenAt(pos - 1).end();
|
||||
|
||||
return tokenAt(ast->firstToken()).offset;
|
||||
}
|
||||
|
||||
bool CheckDeclaration::visit(ObjCClassDeclarationAST *ast)
|
||||
{
|
||||
unsigned sourceLocation;
|
||||
@@ -652,8 +700,8 @@ bool CheckDeclaration::visit(ObjCClassDeclarationAST *ast)
|
||||
|
||||
const Name *className = semantic()->check(ast->class_name, _scope);
|
||||
ObjCClass *klass = control()->newObjCClass(sourceLocation, className);
|
||||
klass->setStartOffset(tokenAt(ast->firstToken()).offset);
|
||||
klass->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
klass->members()->setStartOffset(calculateScopeStart(ast));
|
||||
klass->members()->setEndOffset(tokenAt(ast->lastToken() - 1).offset);
|
||||
ast->symbol = klass;
|
||||
|
||||
klass->setInterface(ast->interface_token != 0);
|
||||
@@ -716,8 +764,8 @@ bool CheckDeclaration::visit(ObjCMethodDeclarationAST *ast)
|
||||
Symbol *symbol;
|
||||
if (ast->function_body) {
|
||||
symbol = methodTy;
|
||||
methodTy->setStartOffset(tokenAt(ast->firstToken()).offset);
|
||||
methodTy->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
methodTy->members()->setStartOffset(tokenAt(ast->function_body->firstToken()).offset);
|
||||
methodTy->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
} else {
|
||||
Declaration *decl = control()->newDeclaration(selector->firstToken(), methodTy->name());
|
||||
decl->setType(methodTy);
|
||||
|
@@ -111,6 +111,9 @@ private:
|
||||
void checkQEnumsQFlagsNames(NameListAST *nameListAst,
|
||||
const char *declName);
|
||||
|
||||
unsigned calculateScopeStart(ObjCClassDeclarationAST *ast) const;
|
||||
unsigned calculateScopeStart(ObjCProtocolDeclarationAST *ast) const;
|
||||
|
||||
private:
|
||||
DeclarationAST *_declaration;
|
||||
Scope *_scope;
|
||||
|
@@ -316,8 +316,8 @@ bool CheckSpecifier::visit(ClassSpecifierAST *ast)
|
||||
|
||||
const Name *className = semantic()->check(ast->name, _scope);
|
||||
Class *klass = control()->newClass(sourceLocation, className);
|
||||
klass->setStartOffset(classScopeStart);
|
||||
klass->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
klass->members()->setStartOffset(classScopeStart);
|
||||
klass->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
ast->symbol = klass;
|
||||
unsigned classKey = tokenKind(ast->classkey_token);
|
||||
if (classKey == T_CLASS)
|
||||
@@ -407,8 +407,8 @@ bool CheckSpecifier::visit(EnumSpecifierAST *ast)
|
||||
|
||||
const Name *name = semantic()->check(ast->name, _scope);
|
||||
Enum *e = control()->newEnum(sourceLocation, name);
|
||||
e->setStartOffset(scopeStart);
|
||||
e->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
e->members()->setStartOffset(scopeStart);
|
||||
e->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
e->setVisibility(semantic()->currentVisibility());
|
||||
_scope->enterSymbol(e);
|
||||
_fullySpecifiedType.setType(e);
|
||||
|
@@ -111,8 +111,8 @@ bool CheckStatement::visit(CaseStatementAST *ast)
|
||||
bool CheckStatement::visit(CompoundStatementAST *ast)
|
||||
{
|
||||
Block *block = control()->newBlock(ast->lbrace_token);
|
||||
block->setStartOffset(tokenAt(ast->firstToken()).end());
|
||||
block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
block->members()->setStartOffset(tokenAt(ast->firstToken()).end());
|
||||
block->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
ast->symbol = block;
|
||||
_scope->enterSymbol(block);
|
||||
Scope *previousScope = switchScope(block->members());
|
||||
@@ -167,6 +167,7 @@ bool CheckStatement::visit(ExpressionStatementAST *ast)
|
||||
}
|
||||
|
||||
bool CheckStatement::forEachFastEnum(unsigned firstToken,
|
||||
unsigned lparen,
|
||||
unsigned lastToken,
|
||||
SpecifierListAST *type_specifier_list,
|
||||
DeclaratorAST *declarator,
|
||||
@@ -175,9 +176,13 @@ bool CheckStatement::forEachFastEnum(unsigned firstToken,
|
||||
StatementAST *statement,
|
||||
Block *&symbol)
|
||||
{
|
||||
unsigned scopeStart = tokenAt(firstToken).offset;
|
||||
if (lparen)
|
||||
scopeStart = tokenAt(lparen).end();
|
||||
|
||||
Block *block = control()->newBlock(firstToken);
|
||||
block->setStartOffset(tokenAt(firstToken).offset);
|
||||
block->setEndOffset(tokenAt(lastToken - 1).end());
|
||||
block->members()->setStartOffset(scopeStart);
|
||||
block->members()->setEndOffset(tokenAt(lastToken - 1).end());
|
||||
symbol = block;
|
||||
_scope->enterSymbol(block);
|
||||
Scope *previousScope = switchScope(block->members());
|
||||
@@ -205,6 +210,7 @@ bool CheckStatement::forEachFastEnum(unsigned firstToken,
|
||||
bool CheckStatement::visit(ForeachStatementAST *ast)
|
||||
{
|
||||
return forEachFastEnum(ast->firstToken(),
|
||||
ast->lparen_token,
|
||||
ast->lastToken(),
|
||||
ast->type_specifier_list,
|
||||
ast->declarator,
|
||||
@@ -217,6 +223,7 @@ bool CheckStatement::visit(ForeachStatementAST *ast)
|
||||
bool CheckStatement::visit(ObjCFastEnumerationAST *ast)
|
||||
{
|
||||
return forEachFastEnum(ast->firstToken(),
|
||||
ast->lparen_token,
|
||||
ast->lastToken(),
|
||||
ast->type_specifier_list,
|
||||
ast->declarator,
|
||||
@@ -228,9 +235,13 @@ bool CheckStatement::visit(ObjCFastEnumerationAST *ast)
|
||||
|
||||
bool CheckStatement::visit(ForStatementAST *ast)
|
||||
{
|
||||
unsigned scopeStart = tokenAt(ast->firstToken()).offset;
|
||||
if (ast->lparen_token)
|
||||
scopeStart = tokenAt(ast->lparen_token).end();
|
||||
|
||||
Block *block = control()->newBlock(ast->for_token);
|
||||
block->setStartOffset(tokenAt(ast->firstToken()).offset);
|
||||
block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
block->members()->setStartOffset(scopeStart);
|
||||
block->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
ast->symbol = block;
|
||||
_scope->enterSymbol(block);
|
||||
Scope *previousScope = switchScope(block->members());
|
||||
@@ -245,9 +256,13 @@ bool CheckStatement::visit(ForStatementAST *ast)
|
||||
|
||||
bool CheckStatement::visit(IfStatementAST *ast)
|
||||
{
|
||||
unsigned scopeStart = tokenAt(ast->firstToken()).offset;
|
||||
if (ast->lparen_token)
|
||||
scopeStart = tokenAt(ast->lparen_token).end();
|
||||
|
||||
Block *block = control()->newBlock(ast->if_token);
|
||||
block->setStartOffset(tokenAt(ast->firstToken()).offset);
|
||||
block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
block->members()->setStartOffset(scopeStart);
|
||||
block->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
ast->symbol = block;
|
||||
_scope->enterSymbol(block);
|
||||
Scope *previousScope = switchScope(block->members());
|
||||
@@ -292,9 +307,13 @@ bool CheckStatement::visit(ReturnStatementAST *ast)
|
||||
|
||||
bool CheckStatement::visit(SwitchStatementAST *ast)
|
||||
{
|
||||
unsigned scopeStart = tokenAt(ast->firstToken()).offset;
|
||||
if (ast->lparen_token)
|
||||
scopeStart = tokenAt(ast->lparen_token).offset;
|
||||
|
||||
Block *block = control()->newBlock(ast->switch_token);
|
||||
block->setStartOffset(tokenAt(ast->firstToken()).offset);
|
||||
block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
block->members()->setStartOffset(scopeStart);
|
||||
block->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
ast->symbol = block;
|
||||
_scope->enterSymbol(block);
|
||||
Scope *previousScope = switchScope(block->members());
|
||||
@@ -317,9 +336,13 @@ bool CheckStatement::visit(TryBlockStatementAST *ast)
|
||||
|
||||
bool CheckStatement::visit(CatchClauseAST *ast)
|
||||
{
|
||||
unsigned scopeStart = tokenAt(ast->firstToken()).offset;
|
||||
if (ast->lparen_token)
|
||||
scopeStart = tokenAt(ast->lparen_token).end();
|
||||
|
||||
Block *block = control()->newBlock(ast->catch_token);
|
||||
block->setStartOffset(tokenAt(ast->firstToken()).offset);
|
||||
block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
block->members()->setStartOffset(scopeStart);
|
||||
block->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
ast->symbol = block;
|
||||
_scope->enterSymbol(block);
|
||||
Scope *previousScope = switchScope(block->members());
|
||||
@@ -332,9 +355,13 @@ bool CheckStatement::visit(CatchClauseAST *ast)
|
||||
|
||||
bool CheckStatement::visit(WhileStatementAST *ast)
|
||||
{
|
||||
unsigned scopeStart = tokenAt(ast->firstToken()).offset;
|
||||
if (ast->lparen_token)
|
||||
scopeStart = tokenAt(ast->lparen_token).end();
|
||||
|
||||
Block *block = control()->newBlock(ast->while_token);
|
||||
block->setStartOffset(tokenAt(ast->firstToken()).offset);
|
||||
block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
block->members()->setStartOffset(scopeStart);
|
||||
block->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
|
||||
ast->symbol = block;
|
||||
_scope->enterSymbol(block);
|
||||
Scope *previousScope = switchScope(block->members());
|
||||
|
@@ -92,6 +92,7 @@ protected:
|
||||
virtual bool visit(QtMemberDeclarationAST *ast);
|
||||
|
||||
bool forEachFastEnum(unsigned firstToken,
|
||||
unsigned lparen,
|
||||
unsigned lastToken,
|
||||
SpecifierListAST *type_specifier_list,
|
||||
DeclaratorAST *declarator,
|
||||
|
@@ -427,18 +427,6 @@ Scope *ScopedSymbol::members() const
|
||||
void ScopedSymbol::addMember(Symbol *member)
|
||||
{ _members->enterSymbol(member); }
|
||||
|
||||
unsigned ScopedSymbol::startOffset() const
|
||||
{ return _members->startOffset(); }
|
||||
|
||||
void ScopedSymbol::setStartOffset(unsigned offset)
|
||||
{ _members->setStartOffset(offset); }
|
||||
|
||||
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)
|
||||
{ }
|
||||
|
@@ -234,14 +234,6 @@ public:
|
||||
virtual ScopedSymbol *asScopedSymbol()
|
||||
{ return this; }
|
||||
|
||||
/// Set the start offset of the scope for this symbol
|
||||
unsigned startOffset() const;
|
||||
void setStartOffset(unsigned offset);
|
||||
|
||||
/// Set the end offset of the scope for this symbol
|
||||
unsigned endOffset() const;
|
||||
void setEndOffset(unsigned offset);
|
||||
|
||||
private:
|
||||
Scope *_members;
|
||||
};
|
||||
|
Reference in New Issue
Block a user