From 8f84f81e6d319404ef549726c62fdbef1d699df0 Mon Sep 17 00:00:00 2001 From: Roberto Raggi <roberto.raggi@nokia.com> Date: Tue, 31 Mar 2009 13:56:28 +0200 Subject: [PATCH] Introduced startOffset(), endOffset(), getPosition(), getStartPosition(), and getEndPosition(). --- src/shared/cplusplus/CheckDeclaration.cpp | 8 ++++++++ src/shared/cplusplus/CheckSpecifier.cpp | 4 ++++ src/shared/cplusplus/CheckStatement.cpp | 2 ++ src/shared/cplusplus/Symbol.cpp | 23 +++++++++++++++++++++++ src/shared/cplusplus/Symbol.h | 12 ++++++++++++ 5 files changed, 49 insertions(+) diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp index c6de2cf4aa0..c5081101677 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 e79f6aa0ba6..935c74affcb 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 d65bd88dea4..7d8bde823b6 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 8f5dc3b4921..c02a10f318b 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 d7c70c38ae7..ac8f0b11cab 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; -- GitLab