diff --git a/src/shared/cplusplus/ASTVisitor.cpp b/src/shared/cplusplus/ASTVisitor.cpp
index bee79230eadc2439d4c44f8473c17cdef64afc2d..2cc3d218c5414418a2b522f1b6bf3e49de55184a 100644
--- a/src/shared/cplusplus/ASTVisitor.cpp
+++ b/src/shared/cplusplus/ASTVisitor.cpp
@@ -69,6 +69,9 @@ Control *ASTVisitor::control() const
 TranslationUnit *ASTVisitor::translationUnit() const
 { return _control->translationUnit(); }
 
+const Token &ASTVisitor::tokenAt(unsigned index) const
+{ return translationUnit()->tokenAt(index); }
+
 int ASTVisitor::tokenKind(unsigned index) const
 { return translationUnit()->tokenKind(index); }
 
@@ -87,10 +90,22 @@ NumericLiteral *ASTVisitor::numericLiteral(unsigned index) const
 StringLiteral *ASTVisitor::stringLiteral(unsigned index) const
 { return translationUnit()->stringLiteral(index); }
 
+void ASTVisitor::getPosition(unsigned offset,
+                             unsigned *line,
+                             unsigned *column,
+                             StringLiteral **fileName) const
+{ translationUnit()->getPosition(offset, line, column, fileName); }
+
 void ASTVisitor::getTokenPosition(unsigned index,
                                   unsigned *line,
                                   unsigned *column,
                                   StringLiteral **fileName) const
 { translationUnit()->getTokenPosition(index, line, column, fileName); }
 
+void ASTVisitor::getTokenStartPosition(unsigned index, unsigned *line, unsigned *column) const
+{ getPosition(tokenAt(index).begin(), line, column); }
+
+void ASTVisitor::getTokenEndPosition(unsigned index, unsigned *line, unsigned *column) const
+{ getPosition(tokenAt(index).end(), line, column); }
+
 CPLUSPLUS_END_NAMESPACE
diff --git a/src/shared/cplusplus/ASTVisitor.h b/src/shared/cplusplus/ASTVisitor.h
index b1d3d1a49f6f1fc0d9717477dc61966ff47d09fe..64002b8a6c3e4b84e48a4e19297c11a9ae1e6064 100644
--- a/src/shared/cplusplus/ASTVisitor.h
+++ b/src/shared/cplusplus/ASTVisitor.h
@@ -67,6 +67,7 @@ public:
     Control *control() const;
     TranslationUnit *translationUnit() const;
 
+    const Token &tokenAt(unsigned index) const;
     int tokenKind(unsigned index) const;
     const char *spell(unsigned index) const;
     Identifier *identifier(unsigned index) const;
@@ -74,11 +75,19 @@ public:
     NumericLiteral *numericLiteral(unsigned index) const;
     StringLiteral *stringLiteral(unsigned index) const;
 
+    void getPosition(unsigned offset,
+                     unsigned *line,
+                     unsigned *column = 0,
+                     StringLiteral **fileName = 0) const;
+
     void getTokenPosition(unsigned index,
                           unsigned *line,
                           unsigned *column = 0,
                           StringLiteral **fileName = 0) const;
 
+    void getTokenStartPosition(unsigned index, unsigned *line, unsigned *column) const;
+    void getTokenEndPosition(unsigned index, unsigned *line, unsigned *column) const;
+
     void accept(AST *ast);
 
     virtual bool preVisit(AST *) { return true; }
diff --git a/src/shared/cplusplus/CPlusPlusForwardDeclarations.h b/src/shared/cplusplus/CPlusPlusForwardDeclarations.h
index bc2decdf0f360a3774758c82a4bbf1732bcba7cf..d04147ad874bdf00563e767618939c40cbfac8ea 100644
--- a/src/shared/cplusplus/CPlusPlusForwardDeclarations.h
+++ b/src/shared/cplusplus/CPlusPlusForwardDeclarations.h
@@ -131,6 +131,7 @@ class Enum;
 class ForwardClassDeclaration;
 
 class Use;
+class Token;
 
 CPLUSPLUS_END_NAMESPACE
 CPLUSPLUS_END_HEADER