diff options
author | Nikolai Kosjar <nikolai.kosjar@theqtcompany.com> | 2015-07-30 18:15:07 +0200 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@theqtcompany.com> | 2015-07-31 11:01:02 +0000 |
commit | 892cb154b2a781e9056d6754f3d24a3912d9ca17 (patch) | |
tree | a67d0581bc3f015f94a96584ffe51afd81a105b0 /src/libs/cplusplus/ASTPath.cpp | |
parent | e3fbe7e93a2ac7926b41ea0963ad12aaab0c0f00 (diff) |
C++: Do not let ASTPath calculate line/column for generated tokens
ASTPath uses TranslationUnit::getPosition(), which returns reasonable
results for:
1. non-expanded tokens
2. expanded but not generated tokens
The expanded *and* generated tokens case is not handled since there is
no reasonable mapping from generated tokens to a continuous line/column
information. Consider:
#define DECLARE_FOO int foo; // Multiple generated tokens
DECLARE_FOO // ...can be mapped to this line, but to which columns?
Since the result where not valid for the expanded and generated case,
ASTPath took the wrong branches. Avoid this by skipping generated
tokens.
Change-Id: I33a2e0f62917f87d691b19feaeef67b09ea8d563
Task-number: QTCREATORBUG-13386
Task-number: QTCREATORBUG-13390
Reviewed-by: Joerg Bornemann <joerg.bornemann@theqtcompany.com>
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Diffstat (limited to 'src/libs/cplusplus/ASTPath.cpp')
-rw-r--r-- | src/libs/cplusplus/ASTPath.cpp | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/src/libs/cplusplus/ASTPath.cpp b/src/libs/cplusplus/ASTPath.cpp index a38c5eadc1..9a4ef293a7 100644 --- a/src/libs/cplusplus/ASTPath.cpp +++ b/src/libs/cplusplus/ASTPath.cpp @@ -65,8 +65,8 @@ void ASTPath::dump(const QList<AST *> nodes) bool ASTPath::preVisit(AST *ast) { - unsigned firstToken = ast->firstToken(); - unsigned lastToken = ast->lastToken(); + const unsigned firstToken = firstNonGeneratedToken(ast); + const unsigned lastToken = lastNonGeneratedToken(ast); if (firstToken > 0) { if (lastToken <= firstToken) @@ -89,3 +89,24 @@ bool ASTPath::preVisit(AST *ast) return false; } + +unsigned ASTPath::firstNonGeneratedToken(AST *ast) const +{ + const unsigned lastTokenIndex = ast->lastToken(); + unsigned tokenIndex = ast->firstToken(); + while (tokenIndex <= lastTokenIndex && tokenAt(tokenIndex).generated()) + ++tokenIndex; + return tokenIndex; +} + +unsigned ASTPath::lastNonGeneratedToken(AST *ast) const +{ + const unsigned firstTokenIndex = ast->firstToken(); + const unsigned lastTokenIndex = ast->lastToken(); + unsigned tokenIndex = lastTokenIndex; + while (firstTokenIndex <= tokenIndex && tokenAt(tokenIndex).generated()) + --tokenIndex; + return tokenIndex != lastTokenIndex + ? tokenIndex + 1 + : tokenIndex; +} |