Added highlighting for locals in ObjC methods.

This commit is contained in:
Erik Verbruggen
2009-12-18 17:03:30 +01:00
parent 918856cac3
commit f229a7618a

View File

@@ -201,13 +201,23 @@ public:
bool hasD; bool hasD;
bool hasQ; bool hasQ;
void operator()(FunctionDefinitionAST *ast) void operator()(DeclarationAST *ast)
{ {
localUses.clear(); localUses.clear();
if (ast && ast->symbol) { if (!ast)
_functionScope = ast->symbol->members(); return;
accept(ast);
if (FunctionDefinitionAST *def = ast->asFunctionDefinition()) {
if (def->symbol) {
_functionScope = def->symbol->members();
accept(ast);
}
} else if (ObjCMethodDeclarationAST *decl = ast->asObjCMethodDeclaration()) {
if (decl->method_prototype->symbol) {
_functionScope = decl->method_prototype->symbol->members();
accept(ast);
}
} }
} }
@@ -392,7 +402,7 @@ class FunctionDefinitionUnderCursor: protected ASTVisitor
{ {
unsigned _line; unsigned _line;
unsigned _column; unsigned _column;
FunctionDefinitionAST *_functionDefinition; DeclarationAST *_functionDefinition;
public: public:
FunctionDefinitionUnderCursor(TranslationUnit *translationUnit) FunctionDefinitionUnderCursor(TranslationUnit *translationUnit)
@@ -400,7 +410,7 @@ public:
_line(0), _column(0) _line(0), _column(0)
{ } { }
FunctionDefinitionAST *operator()(AST *ast, unsigned line, unsigned column) DeclarationAST *operator()(AST *ast, unsigned line, unsigned column)
{ {
_functionDefinition = 0; _functionDefinition = 0;
_line = line; _line = line;
@@ -416,22 +426,34 @@ protected:
return false; return false;
else if (FunctionDefinitionAST *def = ast->asFunctionDefinition()) { else if (FunctionDefinitionAST *def = ast->asFunctionDefinition()) {
unsigned startLine, startColumn; return checkDeclaration(def);
unsigned endLine, endColumn; }
getTokenStartPosition(def->firstToken(), &startLine, &startColumn);
getTokenEndPosition(def->lastToken() - 1, &endLine, &endColumn);
if (_line > startLine || (_line == startLine && _column >= startColumn)) { else if (ObjCMethodDeclarationAST *method = ast->asObjCMethodDeclaration()) {
if (_line < endLine || (_line == endLine && _column < endColumn)) { if (method->function_body)
_functionDefinition = def; return checkDeclaration(method);
return false;
}
}
} }
return true; return true;
} }
private:
bool checkDeclaration(DeclarationAST *ast)
{
unsigned startLine, startColumn;
unsigned endLine, endColumn;
getTokenStartPosition(ast->firstToken(), &startLine, &startColumn);
getTokenEndPosition(ast->lastToken() - 1, &endLine, &endColumn);
if (_line > startLine || (_line == startLine && _column >= startColumn)) {
if (_line < endLine || (_line == endLine && _column < endColumn)) {
_functionDefinition = ast;
return false;
}
}
return true;
}
}; };
class ProcessDeclarators: protected ASTVisitor class ProcessDeclarators: protected ASTVisitor
@@ -2195,7 +2217,7 @@ SemanticInfo SemanticHighlighter::semanticInfo(const Source &source)
AST *ast = translationUnit->ast(); AST *ast = translationUnit->ast();
FunctionDefinitionUnderCursor functionDefinitionUnderCursor(translationUnit); FunctionDefinitionUnderCursor functionDefinitionUnderCursor(translationUnit);
FunctionDefinitionAST *currentFunctionDefinition = functionDefinitionUnderCursor(ast, source.line, source.column); DeclarationAST *currentFunctionDefinition = functionDefinitionUnderCursor(ast, source.line, source.column);
FindLocalUses useTable(translationUnit); FindLocalUses useTable(translationUnit);
useTable(currentFunctionDefinition); useTable(currentFunctionDefinition);