data: Saving TokenLocations of scopes separately

This change parses the TokenLocations of scopes of classes, structs, functions, methods, namespaces and enums and
saves them in Storage with type LOCATION_SCOPE. The TokenLocations of these nodes are just their name declarations now.
Scope locations are displayed in blue color in the code view.
This commit is contained in:
Eberhard Graether
2014-07-28 17:54:36 +02:00
parent 182e18840e
commit 96df63055a
18 changed files with 261 additions and 114 deletions
+22 -7
View File
@@ -49,22 +49,26 @@ void Storage::onTypedefParsed(
addTypeEdge(node, Edge::EDGE_TYPEDEF_OF, underlyingType);
}
void Storage::onClassParsed(const ParseLocation& location, const std::string& fullName, AccessType access)
void Storage::onClassParsed(
const ParseLocation& location, const std::string& fullName, AccessType access, const ParseLocation& scopeLocation)
{
log("class", fullName, location);
Node* node = m_graph.createNodeHierarchy(Node::NODE_CLASS, fullName);
addAccess(node, access);
addTokenLocation(node, location);
addTokenLocation(node, scopeLocation, true);
}
void Storage::onStructParsed(const ParseLocation& location, const std::string& fullName, AccessType access)
void Storage::onStructParsed(
const ParseLocation& location, const std::string& fullName, AccessType access, const ParseLocation& scopeLocation)
{
log("struct", fullName, location);
Node* node = m_graph.createNodeHierarchy(Node::NODE_STRUCT, fullName);
addAccess(node, access);
addTokenLocation(node, location);
addTokenLocation(node, scopeLocation, true);
}
void Storage::onGlobalVariableParsed(const ParseLocation& location, const ParseVariable& variable)
@@ -106,7 +110,7 @@ void Storage::onFieldParsed(const ParseLocation& location, const ParseVariable&
void Storage::onFunctionParsed(
const ParseLocation& location, const std::string& fullName, const ParseTypeUsage& returnType,
const std::vector<ParseTypeUsage>& parameters
const std::vector<ParseTypeUsage>& parameters, const ParseLocation& scopeLocation
)
{
log("function", fullName, location);
@@ -116,6 +120,7 @@ void Storage::onFunctionParsed(
ParserClient::functionSignatureStr(returnType.dataType, fullName, parameters, false)
);
addTokenLocation(node, location);
addTokenLocation(node, scopeLocation, true);
addTypeEdge(node, Edge::EDGE_RETURN_TYPE_OF, returnType);
for (const ParseTypeUsage& parameter : parameters)
@@ -127,7 +132,7 @@ void Storage::onFunctionParsed(
void Storage::onMethodParsed(
const ParseLocation& location, const std::string& fullName, const ParseTypeUsage& returnType,
const std::vector<ParseTypeUsage>& parameters, AccessType access, AbstractionType abstraction,
bool isConst, bool isStatic
bool isConst, bool isStatic, const ParseLocation& scopeLocation
)
{
log("method", fullName, location);
@@ -155,6 +160,7 @@ void Storage::onMethodParsed(
addAccess(node, access);
addTokenLocation(node, location);
addTokenLocation(node, scopeLocation, true);
addTypeEdge(node, Edge::EDGE_RETURN_TYPE_OF, returnType);
for (const ParseTypeUsage& parameter : parameters)
@@ -163,21 +169,25 @@ void Storage::onMethodParsed(
}
}
void Storage::onNamespaceParsed(const ParseLocation& location, const std::string& fullName)
void Storage::onNamespaceParsed(
const ParseLocation& location, const std::string& fullName, const ParseLocation& scopeLocation)
{
log("namespace", fullName, location);
Node* node = m_graph.createNodeHierarchy(Node::NODE_NAMESPACE, fullName);
addTokenLocation(node, location);
addTokenLocation(node, scopeLocation, true);
}
void Storage::onEnumParsed(const ParseLocation& location, const std::string& fullName, AccessType access)
void Storage::onEnumParsed(
const ParseLocation& location, const std::string& fullName, AccessType access, const ParseLocation& scopeLocation)
{
log("enum", fullName, location);
Node* node = m_graph.createNodeHierarchy(Node::NODE_ENUM, fullName);
addAccess(node, access);
addTokenLocation(node, location);
addTokenLocation(node, scopeLocation, true);
}
void Storage::onEnumFieldParsed(const ParseLocation& location, const std::string& fullName)
@@ -595,7 +605,7 @@ Edge* Storage::addTypeEdge(Node* node, Edge::EdgeType edgeType, const ParseTypeU
return edge;
}
TokenLocation* Storage::addTokenLocation(Token* token, const ParseLocation& loc)
TokenLocation* Storage::addTokenLocation(Token* token, const ParseLocation& loc, bool isScope)
{
if (!loc.isValid())
{
@@ -608,6 +618,11 @@ TokenLocation* Storage::addTokenLocation(Token* token, const ParseLocation& loc)
loc.endLineNumber, loc.endColumnNumber
);
if (isScope)
{
location->setType(TokenLocation::LOCATION_SCOPE);
}
token->addLocationId(location->getId());
return location;
}
+11 -7
View File
@@ -30,25 +30,29 @@ public:
const ParseLocation& location, const std::string& fullName, const DataType& underlyingType,
AccessType access
);
virtual void onClassParsed(const ParseLocation& location, const std::string& fullName, AccessType access);
virtual void onStructParsed(const ParseLocation& location, const std::string& fullName, AccessType access);
virtual void onClassParsed(
const ParseLocation& location, const std::string& fullName, AccessType access, const ParseLocation& scopeLocation);
virtual void onStructParsed(
const ParseLocation& location, const std::string& fullName, AccessType access, const ParseLocation& scopeLocation);
virtual void onGlobalVariableParsed(const ParseLocation& location, const ParseVariable& variable);
virtual void onFieldParsed(const ParseLocation& location, const ParseVariable& variable, AccessType access);
virtual void onFunctionParsed(
const ParseLocation& location, const std::string& fullName, const ParseTypeUsage& returnType,
const std::vector<ParseTypeUsage>& parameters
const std::vector<ParseTypeUsage>& parameters, const ParseLocation& scopeLocation
);
virtual void onMethodParsed(
const ParseLocation& location, const std::string& fullName, const ParseTypeUsage& returnType,
const std::vector<ParseTypeUsage>& parameters, AccessType access, AbstractionType abstraction,
bool isConst, bool isStatic
bool isConst, bool isStatic, const ParseLocation& scopeLocation
);
virtual void onNamespaceParsed(const ParseLocation& location, const std::string& fullName);
virtual void onNamespaceParsed(
const ParseLocation& location, const std::string& fullName, const ParseLocation& scopeLocation);
virtual void onEnumParsed(const ParseLocation& location, const std::string& fullName, AccessType access);
virtual void onEnumParsed(
const ParseLocation& location, const std::string& fullName, AccessType access, const ParseLocation& scopeLocation);
virtual void onEnumFieldParsed(const ParseLocation& location, const std::string& fullName);
virtual void onInheritanceParsed(
@@ -96,7 +100,7 @@ private:
TokenComponentAccess* addAccess(Node* node, ParserClient::AccessType access);
Edge* addTypeEdge(Node* node, Edge::EdgeType edgeType, const DataType& type);
Edge* addTypeEdge(Node* node, Edge::EdgeType edgeType, const ParseTypeUsage& typeUsage);
TokenLocation* addTokenLocation(Token* token, const ParseLocation& location);
TokenLocation* addTokenLocation(Token* token, const ParseLocation& location, bool isScope = false);
void log(std::string type, std::string str, const ParseLocation& location) const;
+27 -9
View File
@@ -5,6 +5,7 @@
TokenLocation::TokenLocation(Id tokenId, TokenLocationLine* line, unsigned int columnNumber, bool isStart)
: m_id(s_locationId++)
, m_tokenId(tokenId)
, m_type(LOCATION_TOKEN)
, m_line(line)
, m_columnNumber(columnNumber)
, m_other(nullptr)
@@ -12,16 +13,28 @@ TokenLocation::TokenLocation(Id tokenId, TokenLocationLine* line, unsigned int c
{
}
TokenLocation::TokenLocation(Id id, Id tokenId, TokenLocationLine* line, unsigned int columnNumber, bool isStart)
: m_id(id)
, m_tokenId(tokenId)
TokenLocation::TokenLocation(TokenLocation *other, TokenLocationLine* line, unsigned int columnNumber, bool isStart)
: m_id(other->m_id)
, m_tokenId(other->m_tokenId)
, m_type(other->m_type)
, m_line(line)
, m_columnNumber(columnNumber)
, m_other(nullptr)
, m_other(other)
, m_isStart(isStart)
{
}
TokenLocation::TokenLocation(const TokenLocation& other, TokenLocationLine* line)
: m_id(other.m_id)
, m_tokenId(other.m_tokenId)
, m_type(other.m_type)
, m_line(line)
, m_columnNumber(other.m_columnNumber)
, m_other(nullptr)
, m_isStart(other.m_isStart)
{
}
TokenLocation::~TokenLocation()
{
}
@@ -36,6 +49,16 @@ Id TokenLocation::getTokenId() const
return m_tokenId;
}
TokenLocation::LocationType TokenLocation::getType() const
{
return m_type;
}
void TokenLocation::setType(LocationType type)
{
m_type = type;
}
TokenLocationLine* TokenLocation::getTokenLocationLine() const
{
return m_line;
@@ -105,11 +128,6 @@ bool TokenLocation::isEndTokenLocation() const
return !m_isStart;
}
std::shared_ptr<TokenLocation> TokenLocation::createPlainCopy(TokenLocationLine* line) const
{
return std::shared_ptr<TokenLocation>(new TokenLocation(m_id, m_tokenId, line, m_columnNumber, m_isStart));
}
Id TokenLocation::s_locationId = 1;
std::ostream& operator<<(std::ostream& ostream, const TokenLocation& location)
+13 -3
View File
@@ -14,13 +14,23 @@ class TokenLocationLine;
class TokenLocation
{
public:
enum LocationType
{
LOCATION_TOKEN,
LOCATION_SCOPE
};
TokenLocation(Id tokenId, TokenLocationLine* line, unsigned int columnNumber, bool isStart);
TokenLocation(Id id, Id tokenId, TokenLocationLine* line, unsigned int columnNumber, bool isStart);
TokenLocation(TokenLocation* other, TokenLocationLine* line, unsigned int columnNumber, bool isStart);
TokenLocation(const TokenLocation& other, TokenLocationLine* line);
~TokenLocation();
Id getId() const;
Id getTokenId() const;
LocationType getType() const;
void setType(LocationType type);
TokenLocationLine* getTokenLocationLine() const;
TokenLocationFile* getTokenLocationFile() const;
@@ -37,14 +47,14 @@ public:
bool isStartTokenLocation() const;
bool isEndTokenLocation() const;
std::shared_ptr<TokenLocation> createPlainCopy(TokenLocationLine* line) const;
private:
static Id s_locationId; // next free own id
const Id m_id; // own id
const Id m_tokenId;
LocationType m_type;
TokenLocationLine* const m_line;
const unsigned int m_columnNumber;
+2 -6
View File
@@ -48,12 +48,8 @@ TokenLocation* TokenLocationLine::addStartTokenLocation(Id tokenId, unsigned int
TokenLocation* TokenLocationLine::addEndTokenLocation(TokenLocation* start, unsigned int columnNumber)
{
std::shared_ptr<TokenLocation> locationPtr = std::make_shared<TokenLocation>(
start->getId(), start->getTokenId(), this, columnNumber, false);
std::shared_ptr<TokenLocation> locationPtr = std::make_shared<TokenLocation>(start, this, columnNumber, false);
start->setOtherTokenLocation(locationPtr.get());
locationPtr->setOtherTokenLocation(start);
m_locations.emplace(columnNumber, locationPtr);
return locationPtr.get();
}
@@ -97,7 +93,7 @@ void TokenLocationLine::forEachTokenLocation(std::function<void(TokenLocation*)>
TokenLocation* TokenLocationLine::addTokenLocationAsPlainCopy(const TokenLocation* location)
{
std::shared_ptr<TokenLocation> locationPtr = location->createPlainCopy(this);
std::shared_ptr<TokenLocation> locationPtr = std::make_shared<TokenLocation>(*location, this);
m_locations.emplace(location->getColumnNumber(), locationPtr);
return locationPtr.get();
}
+11 -2
View File
@@ -1,9 +1,18 @@
#include "data/parser/ParseLocation.h"
ParseLocation::ParseLocation()
: filePath("")
, startLineNumber(0)
, startColumnNumber(0)
, endLineNumber(0)
, endColumnNumber(0)
{
}
ParseLocation::ParseLocation(
const std::string& filePath,
unsigned int startLineNumber, unsigned int startColumnNumber,
unsigned int endLineNumber, unsigned int endColumnNumber
uint startLineNumber, uint startColumnNumber,
uint endLineNumber, uint endColumnNumber
)
: filePath(filePath)
, startLineNumber(startLineNumber)
+10 -6
View File
@@ -3,20 +3,24 @@
#include <string>
#include "utility/types.h"
struct ParseLocation
{
ParseLocation();
ParseLocation(
const std::string& filePath,
unsigned int startLineNumber, unsigned int startColumnNumber,
unsigned int endLineNumber, unsigned int endColumnNumber);
uint startLineNumber, uint startColumnNumber,
uint endLineNumber, uint endColumnNumber
);
bool isValid() const;
const std::string filePath;
unsigned int startLineNumber;
unsigned int startColumnNumber;
unsigned int endLineNumber;
unsigned int endColumnNumber;
uint startLineNumber;
uint startColumnNumber;
uint endLineNumber;
uint endColumnNumber;
};
#endif // PARSE_LOCATION_H
+23 -1
View File
@@ -56,11 +56,33 @@ std::string ParserClient::addConstPrefix(const std::string& str, bool isConst, b
std::string ParserClient::addLocationSuffix(const std::string& str, const ParseLocation& location)
{
std::stringstream ss;
ss << str << " <" << location.startLineNumber << ":" << location.startColumnNumber << " ";
ss << str;
ss << " <" << location.startLineNumber << ":" << location.startColumnNumber << " ";
ss << location.endLineNumber << ":" << location.endColumnNumber << ">";
return ss.str();
}
std::string ParserClient::addLocationSuffix(
const std::string& str, const ParseLocation& location, const ParseLocation& scopeLocation
){
if (!location.isValid())
{
return addLocationSuffix(str, scopeLocation);
}
else if (!scopeLocation.isValid())
{
return addLocationSuffix(str, location);
}
std::stringstream ss;
ss << str;
ss << " <" << scopeLocation.startLineNumber << ":" << scopeLocation.startColumnNumber;
ss << " <" << location.startLineNumber << ":" << location.startColumnNumber << " ";
ss << location.endLineNumber << ":" << location.endColumnNumber << "> ";
ss << scopeLocation.endLineNumber << ":" << scopeLocation.endColumnNumber << ">";
return ss.str();
}
std::string ParserClient::variableStr(const ParseVariable& variable)
{
std::string str = variable.type.dataType.getFullTypeName() + " " + variable.fullName;
+16 -6
View File
@@ -30,6 +30,9 @@ public:
static std::string addStaticPrefix(const std::string& str, bool isStatic);
static std::string addConstPrefix(const std::string& str, bool isConst, bool atFront);
static std::string addLocationSuffix(const std::string& str, const ParseLocation& location);
static std::string addLocationSuffix(
const std::string& str, const ParseLocation& location, const ParseLocation& scopeLocation);
static std::string variableStr(const ParseVariable& variable);
static std::string parameterStr(const std::vector<ParseTypeUsage> parameters);
static std::string functionStr(
@@ -51,23 +54,30 @@ public:
virtual void onTypedefParsed(
const ParseLocation& location, const std::string& fullName, const DataType& underlyingType,
AccessType access) = 0;
virtual void onClassParsed(const ParseLocation& location, const std::string& fullName, AccessType access) = 0;
virtual void onStructParsed(const ParseLocation& location, const std::string& fullName, AccessType access) = 0;
virtual void onClassParsed(
const ParseLocation& location, const std::string& fullName, AccessType access,
const ParseLocation& scopeLocation) = 0;
virtual void onStructParsed(
const ParseLocation& location, const std::string& fullName, AccessType access,
const ParseLocation& scopeLocation) = 0;
virtual void onGlobalVariableParsed(const ParseLocation& location, const ParseVariable& variable) = 0;
virtual void onFieldParsed(const ParseLocation& location, const ParseVariable& variable, AccessType access) = 0;
virtual void onFunctionParsed(
const ParseLocation& location, const std::string& fullName, const ParseTypeUsage& returnType,
const std::vector<ParseTypeUsage>& parameters) = 0;
const std::vector<ParseTypeUsage>& parameters, const ParseLocation& scopeLocation) = 0;
virtual void onMethodParsed(
const ParseLocation& location, const std::string& fullName, const ParseTypeUsage& returnType,
const std::vector<ParseTypeUsage>& parameters, AccessType access, AbstractionType abstraction,
bool isConst, bool isStatic) = 0;
bool isConst, bool isStatic, const ParseLocation& scopeLocation) = 0;
virtual void onNamespaceParsed(const ParseLocation& location, const std::string& fullName) = 0;
virtual void onNamespaceParsed(
const ParseLocation& location, const std::string& fullName, const ParseLocation& scopeLocation) = 0;
virtual void onEnumParsed(const ParseLocation& location, const std::string& fullName, AccessType access) = 0;
virtual void onEnumParsed(
const ParseLocation& location, const std::string& fullName, AccessType access,
const ParseLocation& scopeLocation) = 0;
virtual void onEnumFieldParsed(const ParseLocation& location, const std::string& fullName) = 0;
virtual void onInheritanceParsed(
+39 -13
View File
@@ -44,9 +44,10 @@ bool ASTVisitor::VisitCXXRecordDecl(clang::CXXRecordDecl* declaration)
if (declaration->isClass())
{
m_client->onClassParsed(
getParseLocation(declaration->getSourceRange()),
getParseLocationForNamedDecl(declaration),
declaration->getQualifiedNameAsString(),
convertAccessType(declaration->getAccess())
convertAccessType(declaration->getAccess()),
getParseLocationOfRecordBody(declaration)
);
if (declaration->hasDefinition() && declaration->getNumBases())
@@ -65,9 +66,10 @@ bool ASTVisitor::VisitCXXRecordDecl(clang::CXXRecordDecl* declaration)
else if (declaration->isStruct())
{
m_client->onStructParsed(
getParseLocation(declaration->getSourceRange()),
getParseLocationForNamedDecl(declaration),
declaration->getQualifiedNameAsString(),
convertAccessType(declaration->getAccess())
convertAccessType(declaration->getAccess()),
getParseLocationOfRecordBody(declaration)
);
}
}
@@ -138,10 +140,11 @@ bool ASTVisitor::VisitFunctionDecl(clang::FunctionDecl* declaration)
if (hasValidLocation(declaration))
{
m_client->onFunctionParsed(
getParseLocation(declaration->getSourceRange()),
getParseLocationForNamedDecl(declaration),
declaration->getQualifiedNameAsString(),
getParseTypeUsageOfReturnType(declaration),
getParameters(declaration)
getParameters(declaration),
getParseLocationOfFunctionBody(declaration)
);
if (declaration->hasBody() && declaration->isThisDeclarationADefinition())
@@ -169,14 +172,15 @@ bool ASTVisitor::VisitCXXMethodDecl(clang::CXXMethodDecl* declaration)
}
m_client->onMethodParsed(
getParseLocation(declaration->getSourceRange()),
getParseLocationForNamedDecl(declaration),
declaration->getQualifiedNameAsString(),
getParseTypeUsageOfReturnType(declaration),
getParameters(declaration),
convertAccessType(declaration->getAccess()),
abstraction,
declaration->isConst(),
declaration->isStatic()
declaration->isStatic(),
getParseLocationOfFunctionBody(declaration)
);
if (declaration->hasBody() && declaration->isThisDeclarationADefinition())
@@ -211,8 +215,9 @@ bool ASTVisitor::VisitNamespaceDecl(clang::NamespaceDecl* declaration)
if (hasValidLocation(declaration))
{
m_client->onNamespaceParsed(
getParseLocation(declaration->getSourceRange()),
declaration->getQualifiedNameAsString()
declaration->isAnonymousNamespace() ? ParseLocation() : getParseLocationForNamedDecl(declaration),
declaration->getQualifiedNameAsString(),
getParseLocation(declaration->getSourceRange())
);
}
@@ -224,9 +229,10 @@ bool ASTVisitor::VisitEnumDecl(clang::EnumDecl* declaration)
if (hasValidLocation(declaration))
{
m_client->onEnumParsed(
getParseLocation(declaration->getSourceRange()),
getParseLocationForNamedDecl(declaration),
declaration->getQualifiedNameAsString(),
convertAccessType(declaration->getAccess())
convertAccessType(declaration->getAccess()),
getParseLocation(declaration->getSourceRange())
);
}
@@ -316,7 +322,7 @@ ParseLocation ASTVisitor::getParseLocation(const clang::SourceRange& sourceRange
{
if (sourceRange.isInvalid())
{
return ParseLocation("", 0, 0, 0, 0);
return ParseLocation();
}
const clang::SourceManager& sourceManager = m_context->getSourceManager();
@@ -346,6 +352,26 @@ ParseLocation ASTVisitor::getParseLocationForNamedDecl(clang::NamedDecl* decl) c
);
}
ParseLocation ASTVisitor::getParseLocationOfFunctionBody(clang::FunctionDecl* decl) const
{
if (decl->hasBody() && decl->isThisDeclarationADefinition())
{
return getParseLocation(decl->getSourceRange());
}
return ParseLocation();
}
ParseLocation ASTVisitor::getParseLocationOfRecordBody(clang::CXXRecordDecl* decl) const
{
if (decl->hasDefinition() && decl->isThisDeclarationADefinition())
{
return getParseLocation(decl->getDefinition()->getSourceRange());
}
return ParseLocation();
}
ParseVariable ASTVisitor::getParseVariable(clang::DeclaratorDecl* declaration) const
{
bool isStatic = false;
+2
View File
@@ -48,6 +48,8 @@ private:
bool hasValidLocation(const clang::Decl* declaration) const;
ParseLocation getParseLocation(const clang::SourceRange& sourceRange) const;
ParseLocation getParseLocationForNamedDecl(clang::NamedDecl* decl) const;
ParseLocation getParseLocationOfFunctionBody(clang::FunctionDecl* decl) const;
ParseLocation getParseLocationOfRecordBody(clang::CXXRecordDecl* decl) const;
ParseVariable getParseVariable(clang::DeclaratorDecl* declaration) const;
ParseTypeUsage getParseTypeUsage(clang::DeclaratorDecl* declaration) const;
ParseTypeUsage getParseTypeUsageOfReturnType(clang::FunctionDecl* declaration) const;