summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2009-03-31 13:56:28 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2009-03-31 13:56:28 +0200
commit8f84f81e6d319404ef549726c62fdbef1d699df0 (patch)
treecc741aefc751704c881ed196f17e2d5bf40a7a2d /src/shared/cplusplus
parent3b04247689df6bb39c24497adda228ba93866dea (diff)
downloadqt-creator-8f84f81e6d319404ef549726c62fdbef1d699df0.tar.gz
Introduced startOffset(), endOffset(), getPosition(), getStartPosition(), and getEndPosition().
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r--src/shared/cplusplus/CheckDeclaration.cpp8
-rw-r--r--src/shared/cplusplus/CheckSpecifier.cpp4
-rw-r--r--src/shared/cplusplus/CheckStatement.cpp2
-rw-r--r--src/shared/cplusplus/Symbol.cpp23
-rw-r--r--src/shared/cplusplus/Symbol.h12
5 files changed, 49 insertions, 0 deletions
diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp
index c6de2cf4aa..c508110167 100644
--- a/src/shared/cplusplus/CheckDeclaration.cpp
+++ b/src/shared/cplusplus/CheckDeclaration.cpp
@@ -55,6 +55,7 @@
#include "CoreTypes.h"
#include "Symbols.h"
#include "Control.h"
+#include "Literals.h"
#include <cassert>
CPLUSPLUS_BEGIN_NAMESPACE
@@ -186,6 +187,9 @@ bool CheckDeclaration::visit(SimpleDeclarationAST *ast)
}
Declaration *symbol = control()->newDeclaration(location, name);
+ symbol->setStartOffset(tokenAt(ast->firstToken()).offset);
+ symbol->setEndOffset(tokenAt(ast->lastToken()).offset);
+
symbol->setType(control()->integerType(IntegerType::Int));
symbol->setType(declTy);
@@ -259,6 +263,8 @@ bool CheckDeclaration::visit(FunctionDefinitionAST *ast)
}
Function *fun = funTy->asFunctionType();
+ fun->setStartOffset(tokenAt(ast->firstToken()).offset);
+ fun->setEndOffset(tokenAt(ast->lastToken()).offset);
if (ast->declarator)
fun->setSourceLocation(ast->declarator->firstToken());
fun->setName(name);
@@ -335,6 +341,8 @@ bool CheckDeclaration::visit(NamespaceAST *ast)
sourceLocation = ast->identifier_token;
Namespace *ns = control()->newNamespace(sourceLocation, namespaceName);
+ ns->setStartOffset(tokenAt(ast->firstToken()).offset);
+ ns->setEndOffset(tokenAt(ast->lastToken()).offset);
ast->symbol = ns;
_scope->enterSymbol(ns);
semantic()->check(ast->linkage_body, ns->members()); // ### we'll do the merge later.
diff --git a/src/shared/cplusplus/CheckSpecifier.cpp b/src/shared/cplusplus/CheckSpecifier.cpp
index e79f6aa0ba..935c74affc 100644
--- a/src/shared/cplusplus/CheckSpecifier.cpp
+++ b/src/shared/cplusplus/CheckSpecifier.cpp
@@ -303,6 +303,8 @@ bool CheckSpecifier::visit(ClassSpecifierAST *ast)
Name *className = semantic()->check(ast->name, _scope);
Class *klass = control()->newClass(sourceLocation, className);
+ klass->setStartOffset(tokenAt(ast->firstToken()).offset);
+ klass->setEndOffset(tokenAt(ast->lastToken()).offset);
ast->symbol = klass;
unsigned classKey = tokenKind(ast->classkey_token);
if (classKey == T_CLASS)
@@ -369,6 +371,8 @@ bool CheckSpecifier::visit(EnumSpecifierAST *ast)
Name *name = semantic()->check(ast->name, _scope);
Enum *e = control()->newEnum(sourceLocation, name);
+ e->setStartOffset(tokenAt(ast->firstToken()).offset);
+ e->setEndOffset(tokenAt(ast->lastToken()).offset);
e->setVisibility(semantic()->currentVisibility());
_scope->enterSymbol(e);
_fullySpecifiedType.setType(e);
diff --git a/src/shared/cplusplus/CheckStatement.cpp b/src/shared/cplusplus/CheckStatement.cpp
index d65bd88dea..7d8bde823b 100644
--- a/src/shared/cplusplus/CheckStatement.cpp
+++ b/src/shared/cplusplus/CheckStatement.cpp
@@ -99,6 +99,8 @@ bool CheckStatement::visit(CaseStatementAST *ast)
bool CheckStatement::visit(CompoundStatementAST *ast)
{
Block *block = control()->newBlock(ast->lbrace_token);
+ block->setStartOffset(tokenAt(ast->firstToken()).offset);
+ block->setEndOffset(tokenAt(ast->lastToken()).offset);
ast->symbol = block;
_scope->enterSymbol(block);
Scope *previousScope = switchScope(block->members());
diff --git a/src/shared/cplusplus/Symbol.cpp b/src/shared/cplusplus/Symbol.cpp
index 8f5dc3b492..c02a10f318 100644
--- a/src/shared/cplusplus/Symbol.cpp
+++ b/src/shared/cplusplus/Symbol.cpp
@@ -158,6 +158,8 @@ Symbol::Symbol(TranslationUnit *translationUnit, unsigned sourceLocation, Name *
: _control(translationUnit->control()),
_sourceLocation(sourceLocation),
_sourceOffset(0),
+ _startOffset(0),
+ _endOffset(0),
_name(0),
_hashCode(0),
_storage(Symbol::NoStorage),
@@ -245,12 +247,33 @@ StringLiteral *Symbol::fileId() const
return fileId;
}
+void Symbol::getPosition(unsigned *line, unsigned *column, StringLiteral **fileId)
+{ translationUnit()->getPosition(_sourceOffset, line, column, fileId); }
+
+void Symbol::getStartPosition(unsigned *line, unsigned *column, StringLiteral **fileId)
+{ translationUnit()->getPosition(_startOffset, line, column, fileId); }
+
+void Symbol::getEndPosition(unsigned *line, unsigned *column, StringLiteral **fileId)
+{ translationUnit()->getPosition(_endOffset, line, column, fileId); }
+
const char *Symbol::fileName() const
{ return fileId()->chars(); }
unsigned Symbol::fileNameLength() const
{ return fileId()->size(); }
+unsigned Symbol::startOffset() const
+{ return _startOffset; }
+
+void Symbol::setStartOffset(unsigned offset)
+{ _startOffset = offset; }
+
+unsigned Symbol::endOffset() const
+{ return _endOffset; }
+
+void Symbol::setEndOffset(unsigned offset)
+{ _endOffset = offset; }
+
Name *Symbol::identity() const
{
IdentityForName id;
diff --git a/src/shared/cplusplus/Symbol.h b/src/shared/cplusplus/Symbol.h
index d7c70c38ae..ac8f0b11ca 100644
--- a/src/shared/cplusplus/Symbol.h
+++ b/src/shared/cplusplus/Symbol.h
@@ -109,6 +109,16 @@ public:
/// Returns this Symbol's file name length.
unsigned fileNameLength() const;
+ unsigned startOffset() const;
+ void setStartOffset(unsigned offset);
+
+ unsigned endOffset() const;
+ void setEndOffset(unsigned offset);
+
+ void getPosition(unsigned *line, unsigned *column = 0, StringLiteral **fileId = 0);
+ void getStartPosition(unsigned *line, unsigned *column = 0, StringLiteral **fileId = 0);
+ void getEndPosition(unsigned *line, unsigned *column = 0, StringLiteral **fileId = 0);
+
/// Returns this Symbol's name.
Name *name() const;
@@ -250,6 +260,8 @@ private:
Control *_control;
unsigned _sourceLocation;
unsigned _sourceOffset;
+ unsigned _startOffset;
+ unsigned _endOffset;
Name *_name;
unsigned _hashCode;
int _storage;