logic: improved codeview performance
* reduced database queries necessary for creating code snippets in the codeview.
This commit is contained in:
@@ -1,189 +1,22 @@
|
|||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
|
ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:1:20
|
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:1:20
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:20
|
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:20
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:1:20
|
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:1:20
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:1:11
|
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:1:11
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:20
|
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:20
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:1:13
|
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:1:13
|
||||||
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:7:15
|
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:7:15
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:20
|
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:20
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:20
|
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:20
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:20
|
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:20
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:5:20
|
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:5:20
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:20
|
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:20
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:20
|
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:20
|
||||||
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:48
|
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:48
|
||||||
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:7:20
|
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:7:20
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:20
|
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:20
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:3:20
|
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:3:20
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:20
|
CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:20
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
|
|
||||||
Token.cpp ERROR: Location Id was not referenced by this Token.
|
Token.cpp ERROR: Location Id was not referenced by this Token.
|
||||||
Node.cpp WARNING: Cannot change NodeType after it was already set from namespace to class
|
Node.cpp WARNING: Cannot change NodeType after it was already set from namespace to class
|
||||||
Edge.cpp ERROR: Nodes are not plain copies.
|
Edge.cpp ERROR: Nodes are not plain copies.
|
||||||
|
|||||||
@@ -276,8 +276,8 @@ add_files(
|
|||||||
|
|
||||||
utility/solution/ISolutionParser.cpp
|
utility/solution/ISolutionParser.cpp
|
||||||
utility/solution/ISolutionParser.h
|
utility/solution/ISolutionParser.h
|
||||||
utility/solution/SolutionParserCompilationDatabase.cpp
|
utility/solution/SolutionParserCompilationDatabase.cpp
|
||||||
utility/solution/SolutionParserCompilationDatabase.h
|
utility/solution/SolutionParserCompilationDatabase.h
|
||||||
utility/solution/SolutionParserVisualStudio.cpp
|
utility/solution/SolutionParserVisualStudio.cpp
|
||||||
utility/solution/SolutionParserVisualStudio.h
|
utility/solution/SolutionParserVisualStudio.h
|
||||||
|
|
||||||
@@ -288,6 +288,7 @@ add_files(
|
|||||||
|
|
||||||
utility/AppPath.cpp
|
utility/AppPath.cpp
|
||||||
utility/AppPath.h
|
utility/AppPath.h
|
||||||
|
utility/Cache.h
|
||||||
utility/ConfigManager.cpp
|
utility/ConfigManager.cpp
|
||||||
utility/ConfigManager.h
|
utility/ConfigManager.h
|
||||||
utility/Property.h
|
utility/Property.h
|
||||||
|
|||||||
@@ -322,29 +322,53 @@ std::vector<CodeSnippetParams> CodeController::getSnippetsForActiveTokenLocation
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::vector<CodeSnippetParams> CodeController::getSnippetsForActiveTokenLocationsInFile(
|
std::vector<CodeSnippetParams> CodeController::getSnippetsForActiveTokenLocationsInFile(
|
||||||
std::shared_ptr<TokenLocationFile> file
|
std::shared_ptr<TokenLocationFile> activeTokenLocations
|
||||||
) const {
|
) const {
|
||||||
std::vector<CodeSnippetParams> fileSnippets = getSnippetsForFile(file);
|
std::shared_ptr<TokenLocationFile> fileLocations = m_storageAccess->getTokenLocationsForFile(activeTokenLocations->getFilePath().str());
|
||||||
|
|
||||||
if (!file->isWholeCopy)
|
std::vector<CodeSnippetParams> fileSnippets = getSnippetsForFile(activeTokenLocations, fileLocations);
|
||||||
|
|
||||||
|
if (!activeTokenLocations->isWholeCopy)
|
||||||
{
|
{
|
||||||
for (CodeSnippetParams& params : fileSnippets)
|
for (CodeSnippetParams& params : fileSnippets)
|
||||||
{
|
{
|
||||||
params.locationFile = m_storageAccess->getTokenLocationsForLinesInFile(
|
params.locationFile = fileLocations->getFilteredByLines(params.startLineNumber, params.endLineNumber);
|
||||||
file->getFilePath().str(), params.startLineNumber, params.endLineNumber);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return fileSnippets;
|
return fileSnippets;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<CodeSnippetParams> CodeController::getSnippetsForFile(std::shared_ptr<TokenLocationFile> file) const
|
std::vector<CodeSnippetParams> CodeController::getSnippetsForFile(std::shared_ptr<TokenLocationFile> activeTokenLocations) const
|
||||||
{
|
{
|
||||||
std::shared_ptr<TextAccess> textAccess = m_storageAccess->getFileContent(file->getFilePath());
|
return getSnippetsForFile(activeTokenLocations, m_storageAccess->getTokenLocationsForFile(activeTokenLocations->getFilePath().str()));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<CodeSnippetParams> CodeController::getSnippetsForFile(std::shared_ptr<TokenLocationFile> activeTokenLocations, const std::shared_ptr<TokenLocationFile> fileLocations) const
|
||||||
|
{
|
||||||
|
std::shared_ptr<TextAccess> textAccess = m_storageAccess->getFileContent(activeTokenLocations->getFilePath());
|
||||||
|
std::shared_ptr<TokenLocationFile> scopeLocations = std::make_shared<TokenLocationFile>(activeTokenLocations->getFilePath().str());
|
||||||
|
fileLocations->forEachStartTokenLocation(
|
||||||
|
[&](TokenLocation* startLoc) -> void
|
||||||
|
{
|
||||||
|
if (startLoc->getType() == TokenLocation::LOCATION_SCOPE)
|
||||||
|
{
|
||||||
|
TokenLocation* endLoc = startLoc->getOtherTokenLocation();
|
||||||
|
TokenLocation* scopeLoc = scopeLocations->addTokenLocation(
|
||||||
|
startLoc->getId(),
|
||||||
|
startLoc->getTokenId(),
|
||||||
|
startLoc->getLineNumber(),
|
||||||
|
startLoc->getColumnNumber(),
|
||||||
|
endLoc->getLineNumber(),
|
||||||
|
endLoc->getColumnNumber());
|
||||||
|
scopeLoc->setType(TokenLocation::LOCATION_SCOPE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
std::deque<SnippetMerger::Range> ranges;
|
std::deque<SnippetMerger::Range> ranges;
|
||||||
|
|
||||||
if (file->isWholeCopy)
|
if (activeTokenLocations->isWholeCopy)
|
||||||
{
|
{
|
||||||
ranges.push_back(SnippetMerger::Range(
|
ranges.push_back(SnippetMerger::Range(
|
||||||
SnippetMerger::Border(1, true),
|
SnippetMerger::Border(1, true),
|
||||||
@@ -355,15 +379,15 @@ std::vector<CodeSnippetParams> CodeController::getSnippetsForFile(std::shared_pt
|
|||||||
{
|
{
|
||||||
SnippetMerger fileScopedMerger(1, textAccess->getLineCount());
|
SnippetMerger fileScopedMerger(1, textAccess->getLineCount());
|
||||||
std::map<int, std::shared_ptr<SnippetMerger>> mergers;
|
std::map<int, std::shared_ptr<SnippetMerger>> mergers;
|
||||||
file->forEachStartTokenLocation(
|
activeTokenLocations->forEachStartTokenLocation(
|
||||||
[&](TokenLocation* location)
|
[&](TokenLocation* location)
|
||||||
{
|
{
|
||||||
buildMergerHierarchy(location, fileScopedMerger, mergers);
|
buildMergerHierarchy(location, scopeLocations, fileScopedMerger, mergers);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
std::vector<SnippetMerger::Range> atomicRanges;
|
std::vector<SnippetMerger::Range> atomicRanges;
|
||||||
m_storageAccess->getCommentLocationsInFile(file->getFilePath())->forEachStartTokenLocation(
|
m_storageAccess->getCommentLocationsInFile(activeTokenLocations->getFilePath())->forEachStartTokenLocation(
|
||||||
[&](TokenLocation* location)
|
[&](TokenLocation* location)
|
||||||
{
|
{
|
||||||
atomicRanges.push_back(SnippetMerger::Range(
|
atomicRanges.push_back(SnippetMerger::Range(
|
||||||
@@ -378,19 +402,19 @@ std::vector<CodeSnippetParams> CodeController::getSnippetsForFile(std::shared_pt
|
|||||||
}
|
}
|
||||||
|
|
||||||
const int snippetExpandRange = ApplicationSettings::getInstance()->getCodeSnippetExpandRange();
|
const int snippetExpandRange = ApplicationSettings::getInstance()->getCodeSnippetExpandRange();
|
||||||
|
TimePoint fileModificationTime = m_storageAccess->getFileModificationTime(activeTokenLocations->getFilePath());
|
||||||
std::vector<CodeSnippetParams> snippets;
|
std::vector<CodeSnippetParams> snippets;
|
||||||
for (const SnippetMerger::Range& range: ranges)
|
for (const SnippetMerger::Range& range: ranges)
|
||||||
{
|
{
|
||||||
CodeSnippetParams params;
|
CodeSnippetParams params;
|
||||||
params.locationFile = file;
|
params.locationFile = activeTokenLocations;
|
||||||
params.refCount = file->getUnscopedStartTokenLocationCount();
|
params.refCount = activeTokenLocations->getUnscopedStartTokenLocationCount();
|
||||||
params.startLineNumber = std::max<int>(1, range.start.row - (range.start.strong ? 0 : snippetExpandRange));
|
params.startLineNumber = std::max<int>(1, range.start.row - (range.start.strong ? 0 : snippetExpandRange));
|
||||||
params.endLineNumber = std::min<int>(textAccess->getLineCount(), range.end.row + (range.end.strong ? 0 : snippetExpandRange));
|
params.endLineNumber = std::min<int>(textAccess->getLineCount(), range.end.row + (range.end.strong ? 0 : snippetExpandRange));
|
||||||
params.modificationTime = m_storageAccess->getFileModificationTime(file->getFilePath());
|
params.modificationTime = fileModificationTime;
|
||||||
|
|
||||||
|
|
||||||
std::shared_ptr<TokenLocationFile> tempFile =
|
std::shared_ptr<TokenLocationFile> tempFile =
|
||||||
m_storageAccess->getTokenLocationsForLinesInFile(file->getFilePath().str(), params.startLineNumber, params.endLineNumber);
|
m_storageAccess->getTokenLocationsForLinesInFile(activeTokenLocations->getFilePath().str(), params.startLineNumber, params.endLineNumber);
|
||||||
TokenLocationLine* firstUsedLine = nullptr;
|
TokenLocationLine* firstUsedLine = nullptr;
|
||||||
for (size_t i = params.startLineNumber; i <= params.endLineNumber && firstUsedLine == nullptr; i++)
|
for (size_t i = params.startLineNumber; i <= params.endLineNumber && firstUsedLine == nullptr; i++)
|
||||||
{
|
{
|
||||||
@@ -400,8 +424,9 @@ std::vector<CodeSnippetParams> CodeController::getSnippetsForFile(std::shared_pt
|
|||||||
params.titleId = 0;
|
params.titleId = 0;
|
||||||
if (firstUsedLine && firstUsedLine->getTokenLocations().size())
|
if (firstUsedLine && firstUsedLine->getTokenLocations().size())
|
||||||
{
|
{
|
||||||
m_storageAccess->getTokenLocationOfParentScope(
|
getTokenLocationOfParentScope(
|
||||||
firstUsedLine->getTokenLocations().begin()->second.get()
|
firstUsedLine->getTokenLocations().begin()->second.get(),
|
||||||
|
scopeLocations
|
||||||
)->forEachStartTokenLocation( // this TokenLocationFile only contains a single StartTokenLocation.
|
)->forEachStartTokenLocation( // this TokenLocationFile only contains a single StartTokenLocation.
|
||||||
[&](TokenLocation* location)
|
[&](TokenLocation* location)
|
||||||
{
|
{
|
||||||
@@ -410,9 +435,9 @@ std::vector<CodeSnippetParams> CodeController::getSnippetsForFile(std::shared_pt
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (!file->isWholeCopy && params.titleId == 0)
|
if (!activeTokenLocations->isWholeCopy && params.titleId == 0)
|
||||||
{
|
{
|
||||||
params.title = file->getFilePath().str();
|
params.title = activeTokenLocations->getFilePath().str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -425,8 +450,9 @@ std::vector<CodeSnippetParams> CodeController::getSnippetsForFile(std::shared_pt
|
|||||||
params.footerId = 0;
|
params.footerId = 0;
|
||||||
if (lastUsedLine && lastUsedLine->getTokenLocations().size())
|
if (lastUsedLine && lastUsedLine->getTokenLocations().size())
|
||||||
{
|
{
|
||||||
m_storageAccess->getTokenLocationOfParentScope(
|
getTokenLocationOfParentScope(
|
||||||
lastUsedLine->getTokenLocations().begin()->second.get()
|
lastUsedLine->getTokenLocations().begin()->second.get(),
|
||||||
|
scopeLocations
|
||||||
)->forEachStartTokenLocation( // this TokenLocationFile only contains a single StartTokenLocation.
|
)->forEachStartTokenLocation( // this TokenLocationFile only contains a single StartTokenLocation.
|
||||||
[&](TokenLocation* location)
|
[&](TokenLocation* location)
|
||||||
{
|
{
|
||||||
@@ -448,7 +474,7 @@ std::vector<CodeSnippetParams> CodeController::getSnippetsForFile(std::shared_pt
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<SnippetMerger> CodeController::buildMergerHierarchy(
|
std::shared_ptr<SnippetMerger> CodeController::buildMergerHierarchy(
|
||||||
TokenLocation* location, SnippetMerger& fileScopedMerger, std::map<int, std::shared_ptr<SnippetMerger>>& mergers) const
|
TokenLocation* location, std::shared_ptr<TokenLocationFile> scopeLocations, SnippetMerger& fileScopedMerger, std::map<int, std::shared_ptr<SnippetMerger>>& mergers) const
|
||||||
{
|
{
|
||||||
const TokenLocation* currentLocation = location;
|
const TokenLocation* currentLocation = location;
|
||||||
std::shared_ptr<SnippetMerger> currentMerger = std::make_shared<SnippetMerger>(
|
std::shared_ptr<SnippetMerger> currentMerger = std::make_shared<SnippetMerger>(
|
||||||
@@ -456,7 +482,7 @@ std::shared_ptr<SnippetMerger> CodeController::buildMergerHierarchy(
|
|||||||
currentLocation->getEndTokenLocation()->getLineNumber()
|
currentLocation->getEndTokenLocation()->getLineNumber()
|
||||||
);
|
);
|
||||||
|
|
||||||
std::shared_ptr<TokenLocationFile> locationFile = m_storageAccess->getTokenLocationOfParentScope(currentLocation);
|
std::shared_ptr<TokenLocationFile> locationFile = getTokenLocationOfParentScope(currentLocation, scopeLocations);
|
||||||
if (locationFile->getTokenLocationLineCount() == 0)
|
if (locationFile->getTokenLocationLineCount() == 0)
|
||||||
{
|
{
|
||||||
fileScopedMerger.addChild(currentMerger);
|
fileScopedMerger.addChild(currentMerger);
|
||||||
@@ -470,7 +496,7 @@ std::shared_ptr<SnippetMerger> CodeController::buildMergerHierarchy(
|
|||||||
std::map<int, std::shared_ptr<SnippetMerger>>::iterator it = mergers.find(scopeLocation->getId());
|
std::map<int, std::shared_ptr<SnippetMerger>>::iterator it = mergers.find(scopeLocation->getId());
|
||||||
if (it == mergers.end())
|
if (it == mergers.end())
|
||||||
{
|
{
|
||||||
nextMerger = buildMergerHierarchy(scopeLocation, fileScopedMerger, mergers);
|
nextMerger = buildMergerHierarchy(scopeLocation, scopeLocations, fileScopedMerger, mergers);
|
||||||
mergers[scopeLocation->getId()] = nextMerger;
|
mergers[scopeLocation->getId()] = nextMerger;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -483,6 +509,39 @@ std::shared_ptr<SnippetMerger> CodeController::buildMergerHierarchy(
|
|||||||
return currentMerger;
|
return currentMerger;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<TokenLocationFile> CodeController::getTokenLocationOfParentScope(const TokenLocation* location, std::shared_ptr<TokenLocationFile> scopeLocations) const
|
||||||
|
{
|
||||||
|
const TokenLocation* parent = location;
|
||||||
|
const FilePath filePath = location->getFilePath();
|
||||||
|
|
||||||
|
scopeLocations->forEachStartTokenLocation(
|
||||||
|
[&](TokenLocation* tokenLocation) -> void
|
||||||
|
{
|
||||||
|
if ((*tokenLocation) < *(location->getStartTokenLocation()) &&
|
||||||
|
(*tokenLocation->getEndTokenLocation()) > *(location->getEndTokenLocation()))
|
||||||
|
{
|
||||||
|
if (parent == location)
|
||||||
|
{
|
||||||
|
parent = tokenLocation;
|
||||||
|
}
|
||||||
|
// since tokenLocation is a start location the > location indicates the scope that is closer to the child.
|
||||||
|
else if ((*tokenLocation) > *parent)
|
||||||
|
{
|
||||||
|
parent = tokenLocation;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
std::shared_ptr<TokenLocationFile> file = std::make_shared<TokenLocationFile>(filePath);
|
||||||
|
if (parent != location)
|
||||||
|
{
|
||||||
|
file->addTokenLocationAsPlainCopy(parent);
|
||||||
|
file->addTokenLocationAsPlainCopy(parent->getOtherTokenLocation());
|
||||||
|
}
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<CodeSnippetParams> CodeController::getSnippetsForErrorLocations(
|
std::vector<CodeSnippetParams> CodeController::getSnippetsForErrorLocations(
|
||||||
std::vector<std::string>* errorMessages)
|
std::vector<std::string>* errorMessages)
|
||||||
const {
|
const {
|
||||||
|
|||||||
@@ -60,9 +60,12 @@ private:
|
|||||||
const TokenLocationCollection* collection, Id declarationId) const;
|
const TokenLocationCollection* collection, Id declarationId) const;
|
||||||
std::vector<CodeSnippetParams> getSnippetsForActiveTokenLocationsInFile(
|
std::vector<CodeSnippetParams> getSnippetsForActiveTokenLocationsInFile(
|
||||||
std::shared_ptr<TokenLocationFile>) const;
|
std::shared_ptr<TokenLocationFile>) const;
|
||||||
|
std::vector<CodeSnippetParams> getSnippetsForFile(
|
||||||
|
std::shared_ptr<TokenLocationFile> activeTokenLocations, std::shared_ptr<TokenLocationFile> fileLocations) const;
|
||||||
std::vector<CodeSnippetParams> getSnippetsForFile(std::shared_ptr<TokenLocationFile> file) const;
|
std::vector<CodeSnippetParams> getSnippetsForFile(std::shared_ptr<TokenLocationFile> file) const;
|
||||||
std::shared_ptr<SnippetMerger> buildMergerHierarchy(
|
std::shared_ptr<SnippetMerger> buildMergerHierarchy(
|
||||||
TokenLocation* location, SnippetMerger& fileScopedMerger, std::map<int, std::shared_ptr<SnippetMerger>>& mergers) const;
|
TokenLocation* location, std::shared_ptr<TokenLocationFile> context, SnippetMerger& fileScopedMerger, std::map<int, std::shared_ptr<SnippetMerger>>& mergers) const;
|
||||||
|
std::shared_ptr<TokenLocationFile> getTokenLocationOfParentScope(const TokenLocation* location, std::shared_ptr<TokenLocationFile> context) const;
|
||||||
|
|
||||||
std::vector<CodeSnippetParams> getSnippetsForErrorLocations(std::vector<std::string>* errorMessages) const;
|
std::vector<CodeSnippetParams> getSnippetsForErrorLocations(std::vector<std::string>* errorMessages) const;
|
||||||
|
|
||||||
|
|||||||
@@ -517,24 +517,31 @@ std::shared_ptr<TokenLocationFile> SqliteStorage::getTokenLocationsForFile(const
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::vector<StorageSourceLocation> SqliteStorage::getTokenLocationsForElementId(const Id elementId) const
|
std::vector<StorageSourceLocation> SqliteStorage::getTokenLocationsForElementId(const Id elementId) const
|
||||||
|
{
|
||||||
|
std::vector<Id> elementIds {elementId};
|
||||||
|
return getTokenLocationsForElementIds(elementIds);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<StorageSourceLocation> SqliteStorage::getTokenLocationsForElementIds(const std::vector<Id> elementIds) const
|
||||||
{
|
{
|
||||||
std::vector<StorageSourceLocation> locations;
|
std::vector<StorageSourceLocation> locations;
|
||||||
|
|
||||||
CppSQLite3Query q = m_database.execQuery((
|
CppSQLite3Query q = m_database.execQuery((
|
||||||
"SELECT id, file_node_id, start_line, start_column, end_line, end_column, is_scope FROM source_location WHERE element_id == " + std::to_string(elementId) + ";"
|
"SELECT id, element_id, file_node_id, start_line, start_column, end_line, end_column, is_scope FROM source_location WHERE element_id IN (" + utility::join(utility::toStrings(elementIds), ',') + ");"
|
||||||
).c_str());
|
).c_str());
|
||||||
|
|
||||||
while (!q.eof())
|
while (!q.eof())
|
||||||
{
|
{
|
||||||
const Id id = q.getIntField(0, 0);
|
const Id id = q.getIntField(0, 0);
|
||||||
const Id fileNodeId = q.getIntField(1, 0);
|
const Id elementId = q.getIntField(1, 0);
|
||||||
const int startLineNumber = q.getIntField(2, -1);
|
const Id fileNodeId = q.getIntField(2, 0);
|
||||||
const int startColNumber = q.getIntField(3, -1);
|
const int startLineNumber = q.getIntField(3, -1);
|
||||||
const int endLineNumber = q.getIntField(4, -1);
|
const int startColNumber = q.getIntField(4, -1);
|
||||||
const int endColNumber = q.getIntField(5, -1);
|
const int endLineNumber = q.getIntField(5, -1);
|
||||||
const int isScope = q.getIntField(6, -1);
|
const int endColNumber = q.getIntField(6, -1);
|
||||||
|
const int isScope = q.getIntField(7, -1);
|
||||||
|
|
||||||
if (id != 0 && fileNodeId != 0 && startLineNumber != -1 && startColNumber != -1 && endLineNumber != -1 && endColNumber != -1 && isScope != -1)
|
if (id != 0 && elementId != 0 && fileNodeId != 0 && startLineNumber != -1 && startColNumber != -1 && endLineNumber != -1 && endColNumber != -1 && isScope != -1)
|
||||||
{
|
{
|
||||||
locations.push_back(StorageSourceLocation(
|
locations.push_back(StorageSourceLocation(
|
||||||
id, elementId, fileNodeId, startLineNumber, startColNumber, endLineNumber, endColNumber, isScope
|
id, elementId, fileNodeId, startLineNumber, startColNumber, endLineNumber, endColNumber, isScope
|
||||||
|
|||||||
@@ -86,6 +86,7 @@ public:
|
|||||||
StorageSourceLocation getSourceLocationById(const Id id) const;
|
StorageSourceLocation getSourceLocationById(const Id id) const;
|
||||||
std::shared_ptr<TokenLocationFile> getTokenLocationsForFile(const FilePath& filePath) const;
|
std::shared_ptr<TokenLocationFile> getTokenLocationsForFile(const FilePath& filePath) const;
|
||||||
std::vector<StorageSourceLocation> getTokenLocationsForElementId(const Id elementId) const;
|
std::vector<StorageSourceLocation> getTokenLocationsForElementId(const Id elementId) const;
|
||||||
|
std::vector<StorageSourceLocation> getTokenLocationsForElementIds(const std::vector<Id> elementIds) const;
|
||||||
|
|
||||||
Id getElementIdByLocationId(Id locationId) const;
|
Id getElementIdByLocationId(Id locationId) const;
|
||||||
|
|
||||||
|
|||||||
+41
-110
@@ -11,6 +11,7 @@
|
|||||||
#include "utility/utility.h"
|
#include "utility/utility.h"
|
||||||
#include "utility/utilityString.h"
|
#include "utility/utilityString.h"
|
||||||
#include "utility/Version.h"
|
#include "utility/Version.h"
|
||||||
|
#include "utility/Cache.h"
|
||||||
|
|
||||||
#include "data/graph/token_component/TokenComponentAggregation.h"
|
#include "data/graph/token_component/TokenComponentAggregation.h"
|
||||||
#include "data/graph/token_component/TokenComponentSignature.h"
|
#include "data/graph/token_component/TokenComponentSignature.h"
|
||||||
@@ -957,37 +958,52 @@ std::shared_ptr<TokenLocationCollection> Storage::getTokenLocationsForTokenIds(c
|
|||||||
{
|
{
|
||||||
std::shared_ptr<TokenLocationCollection> collection = std::make_shared<TokenLocationCollection>();
|
std::shared_ptr<TokenLocationCollection> collection = std::make_shared<TokenLocationCollection>();
|
||||||
|
|
||||||
for (Id elementId: tokenIds)
|
std::vector<Id> fileIds;
|
||||||
|
std::vector<Id> nonFileIds;
|
||||||
|
for (size_t i = 0; i < tokenIds.size(); i++)
|
||||||
{
|
{
|
||||||
if (m_sqliteStorage.isFile(elementId))
|
if (m_sqliteStorage.isFile(tokenIds[i]))
|
||||||
{
|
{
|
||||||
StorageFile storageFile = m_sqliteStorage.getFileById(elementId);
|
fileIds.push_back(tokenIds[i]);
|
||||||
collection->addTokenLocationFileAsPlainCopy(m_sqliteStorage.getTokenLocationsForFile(storageFile.filePath).get());
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::vector<StorageSourceLocation> locations = m_sqliteStorage.getTokenLocationsForElementId(elementId);
|
nonFileIds.push_back(tokenIds[i]);
|
||||||
for (size_t i = 0; i < locations.size(); i++)
|
}
|
||||||
{
|
}
|
||||||
// TODO: optimize: fileNodeId to name in a separate map
|
|
||||||
const StorageSourceLocation& location = locations[i];
|
|
||||||
StorageFile storageFile = m_sqliteStorage.getFileById(location.fileNodeId);
|
|
||||||
|
|
||||||
TokenLocation* loc = collection->addTokenLocation(
|
for (Id fileId: fileIds)
|
||||||
location.id,
|
{
|
||||||
location.elementId,
|
StorageFile storageFile = m_sqliteStorage.getFileById(fileId);
|
||||||
storageFile.filePath,
|
collection->addTokenLocationFileAsPlainCopy(m_sqliteStorage.getTokenLocationsForFile(storageFile.filePath).get());
|
||||||
location.startLine,
|
}
|
||||||
location.startCol,
|
|
||||||
location.endLine,
|
|
||||||
location.endCol
|
|
||||||
);
|
|
||||||
|
|
||||||
if (loc)
|
Cache<Id, std::string> filePathCache(
|
||||||
{
|
[this](Id id) -> std::string
|
||||||
loc->setType(location.isScope ? TokenLocation::LOCATION_SCOPE : TokenLocation::LOCATION_TOKEN);
|
{
|
||||||
}
|
return m_sqliteStorage.getFileById(id).filePath;
|
||||||
}
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
std::vector<StorageSourceLocation> locations = m_sqliteStorage.getTokenLocationsForElementIds(nonFileIds);
|
||||||
|
for (size_t i = 0; i < locations.size(); i++)
|
||||||
|
{
|
||||||
|
const StorageSourceLocation& location = locations[i];
|
||||||
|
std::string filePath = filePathCache.getValue(location.fileNodeId);
|
||||||
|
|
||||||
|
TokenLocation* loc = collection->addTokenLocation(
|
||||||
|
location.id,
|
||||||
|
location.elementId,
|
||||||
|
filePath,
|
||||||
|
location.startLine,
|
||||||
|
location.startCol,
|
||||||
|
location.endLine,
|
||||||
|
location.endCol
|
||||||
|
);
|
||||||
|
|
||||||
|
if (loc)
|
||||||
|
{
|
||||||
|
loc->setType(location.isScope ? TokenLocation::LOCATION_SCOPE : TokenLocation::LOCATION_TOKEN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1026,57 +1042,7 @@ std::shared_ptr<TokenLocationFile> Storage::getTokenLocationsForLinesInFile(
|
|||||||
const std::string& filePath, uint firstLineNumber, uint lastLineNumber
|
const std::string& filePath, uint firstLineNumber, uint lastLineNumber
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
std::shared_ptr<TokenLocationFile> ret = std::make_shared<TokenLocationFile>(filePath);
|
return m_sqliteStorage.getTokenLocationsForFile(filePath)->getFilteredByLines(firstLineNumber, lastLineNumber);
|
||||||
|
|
||||||
std::shared_ptr<TokenLocationFile> locationFile = m_sqliteStorage.getTokenLocationsForFile(filePath);
|
|
||||||
if (!locationFile->getTokenLocationLines().size())
|
|
||||||
{
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint endLineNumber = locationFile->getTokenLocationLines().rbegin()->first;
|
|
||||||
std::set<Id> addedLocationIds;
|
|
||||||
for (uint i = firstLineNumber; i <= endLineNumber; i++)
|
|
||||||
{
|
|
||||||
TokenLocationLine* locationLine = locationFile->findTokenLocationLineByNumber(i);
|
|
||||||
if (!locationLine)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (locationLine->getLineNumber() <= lastLineNumber)
|
|
||||||
{
|
|
||||||
locationLine->forEachTokenLocation(
|
|
||||||
[&](TokenLocation* tokenLocation) -> void
|
|
||||||
{
|
|
||||||
const Id tokenId = tokenLocation->getId();
|
|
||||||
if (addedLocationIds.find(tokenId) == addedLocationIds.end())
|
|
||||||
{
|
|
||||||
ret->addTokenLocationAsPlainCopy(tokenLocation->getStartTokenLocation());
|
|
||||||
ret->addTokenLocationAsPlainCopy(tokenLocation->getEndTokenLocation());
|
|
||||||
addedLocationIds.insert(tokenId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Save start locations of TokenLocations that span accross the line range.
|
|
||||||
locationLine->forEachTokenLocation(
|
|
||||||
[&](TokenLocation* tokenLocation) -> void
|
|
||||||
{
|
|
||||||
if (tokenLocation->isEndTokenLocation() &&
|
|
||||||
tokenLocation->getStartTokenLocation()->getLineNumber() < firstLineNumber)
|
|
||||||
{
|
|
||||||
ret->addTokenLocationAsPlainCopy(tokenLocation->getStartTokenLocation());
|
|
||||||
ret->addTokenLocationAsPlainCopy(tokenLocation->getEndTokenLocation());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TokenLocationCollection Storage::getErrorTokenLocations(std::vector<std::string>* errorMessages) const
|
TokenLocationCollection Storage::getErrorTokenLocations(std::vector<std::string>* errorMessages) const
|
||||||
@@ -1095,41 +1061,6 @@ TokenLocationCollection Storage::getErrorTokenLocations(std::vector<std::string>
|
|||||||
return errorCollection;
|
return errorCollection;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<TokenLocationFile> Storage::getTokenLocationOfParentScope(const TokenLocation* child) const
|
|
||||||
{
|
|
||||||
const TokenLocation* parent = child;
|
|
||||||
const FilePath filePath = child->getFilePath();
|
|
||||||
|
|
||||||
std::shared_ptr<TokenLocationFile> locationFile = m_sqliteStorage.getTokenLocationsForFile(filePath); // TODO: sqlite should not know TokenLocationFile!
|
|
||||||
locationFile->forEachStartTokenLocation(
|
|
||||||
[&](TokenLocation* tokenLocation) -> void
|
|
||||||
{
|
|
||||||
if (tokenLocation->getType() == TokenLocation::LOCATION_SCOPE &&
|
|
||||||
(*tokenLocation) < *(child->getStartTokenLocation()) &&
|
|
||||||
(*tokenLocation->getEndTokenLocation()) > *(child->getEndTokenLocation()))
|
|
||||||
{
|
|
||||||
if (parent == child)
|
|
||||||
{
|
|
||||||
parent = tokenLocation;
|
|
||||||
}
|
|
||||||
// since tokenLocation is a start location the > location indicates the scope that is closer to the child.
|
|
||||||
else if ((*tokenLocation) > *parent)
|
|
||||||
{
|
|
||||||
parent = tokenLocation;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
std::shared_ptr<TokenLocationFile> file = std::make_shared<TokenLocationFile>(filePath);
|
|
||||||
if (parent != child)
|
|
||||||
{
|
|
||||||
file->addTokenLocationAsPlainCopy(parent);
|
|
||||||
file->addTokenLocationAsPlainCopy(parent->getOtherTokenLocation());
|
|
||||||
}
|
|
||||||
return file;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::shared_ptr<TokenLocationFile> Storage::getCommentLocationsInFile(const FilePath& filePath) const
|
std::shared_ptr<TokenLocationFile> Storage::getCommentLocationsInFile(const FilePath& filePath) const
|
||||||
{
|
{
|
||||||
std::shared_ptr<TokenLocationFile> file = std::make_shared<TokenLocationFile>(filePath);
|
std::shared_ptr<TokenLocationFile> file = std::make_shared<TokenLocationFile>(filePath);
|
||||||
|
|||||||
@@ -147,7 +147,6 @@ public:
|
|||||||
) const;
|
) const;
|
||||||
|
|
||||||
virtual TokenLocationCollection getErrorTokenLocations(std::vector<std::string>* errorMessages) const;
|
virtual TokenLocationCollection getErrorTokenLocations(std::vector<std::string>* errorMessages) const;
|
||||||
virtual std::shared_ptr<TokenLocationFile> getTokenLocationOfParentScope(const TokenLocation* child) const;
|
|
||||||
virtual std::shared_ptr<TokenLocationFile> getCommentLocationsInFile(const FilePath& filePath) const;
|
virtual std::shared_ptr<TokenLocationFile> getCommentLocationsInFile(const FilePath& filePath) const;
|
||||||
|
|
||||||
virtual std::shared_ptr<TextAccess> getFileContent(const FilePath& filePath) const;
|
virtual std::shared_ptr<TextAccess> getFileContent(const FilePath& filePath) const;
|
||||||
|
|||||||
@@ -57,7 +57,6 @@ public:
|
|||||||
const std::string& filePath, uint firstLineNumber, uint lastLineNumber) const = 0;
|
const std::string& filePath, uint firstLineNumber, uint lastLineNumber) const = 0;
|
||||||
|
|
||||||
virtual TokenLocationCollection getErrorTokenLocations(std::vector<std::string>* errorMessages) const = 0;
|
virtual TokenLocationCollection getErrorTokenLocations(std::vector<std::string>* errorMessages) const = 0;
|
||||||
virtual std::shared_ptr<TokenLocationFile> getTokenLocationOfParentScope(const TokenLocation* child) const = 0;
|
|
||||||
virtual std::shared_ptr<TokenLocationFile> getCommentLocationsInFile(const FilePath& filePath) const = 0;
|
virtual std::shared_ptr<TokenLocationFile> getCommentLocationsInFile(const FilePath& filePath) const = 0;
|
||||||
|
|
||||||
virtual std::shared_ptr<TextAccess> getFileContent(const FilePath& filePath) const = 0;
|
virtual std::shared_ptr<TextAccess> getFileContent(const FilePath& filePath) const = 0;
|
||||||
|
|||||||
@@ -245,16 +245,6 @@ TokenLocationCollection StorageAccessProxy::getErrorTokenLocations(std::vector<s
|
|||||||
return TokenLocationCollection();
|
return TokenLocationCollection();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<TokenLocationFile> StorageAccessProxy::getTokenLocationOfParentScope(const TokenLocation* child) const
|
|
||||||
{
|
|
||||||
if (hasSubject())
|
|
||||||
{
|
|
||||||
return m_subject->getTokenLocationOfParentScope(child);
|
|
||||||
}
|
|
||||||
|
|
||||||
return std::make_shared<TokenLocationFile>("");
|
|
||||||
}
|
|
||||||
|
|
||||||
std::shared_ptr<TokenLocationFile> StorageAccessProxy::getCommentLocationsInFile(const FilePath& filePath) const
|
std::shared_ptr<TokenLocationFile> StorageAccessProxy::getCommentLocationsInFile(const FilePath& filePath) const
|
||||||
{
|
{
|
||||||
if (hasSubject())
|
if (hasSubject())
|
||||||
|
|||||||
@@ -46,7 +46,6 @@ public:
|
|||||||
) const;
|
) const;
|
||||||
|
|
||||||
virtual TokenLocationCollection getErrorTokenLocations(std::vector<std::string>* errorMessages) const;
|
virtual TokenLocationCollection getErrorTokenLocations(std::vector<std::string>* errorMessages) const;
|
||||||
virtual std::shared_ptr<TokenLocationFile> getTokenLocationOfParentScope(const TokenLocation* child) const;
|
|
||||||
virtual std::shared_ptr<TokenLocationFile> getCommentLocationsInFile(const FilePath& filePath) const;
|
virtual std::shared_ptr<TokenLocationFile> getCommentLocationsInFile(const FilePath& filePath) const;
|
||||||
|
|
||||||
virtual std::shared_ptr<TextAccess> getFileContent(const FilePath& filePath) const;
|
virtual std::shared_ptr<TextAccess> getFileContent(const FilePath& filePath) const;
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
#include "data/location/TokenLocationFile.h"
|
#include "data/location/TokenLocationFile.h"
|
||||||
|
|
||||||
|
#include <set>
|
||||||
|
|
||||||
#include "utility/logging/logging.h"
|
#include "utility/logging/logging.h"
|
||||||
|
#include "utility/types.h"
|
||||||
|
|
||||||
#include "data/location/TokenLocation.h"
|
#include "data/location/TokenLocation.h"
|
||||||
#include "data/location/TokenLocationLine.h"
|
#include "data/location/TokenLocationLine.h"
|
||||||
@@ -164,6 +167,60 @@ TokenLocation* TokenLocationFile::addTokenLocationAsPlainCopy(const TokenLocatio
|
|||||||
return copy;
|
return copy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<TokenLocationFile> TokenLocationFile::getFilteredByLines(unsigned int firstLineNumber, unsigned int lastLineNumber) const
|
||||||
|
{
|
||||||
|
std::shared_ptr<TokenLocationFile> ret = std::make_shared<TokenLocationFile>(getFilePath().str());
|
||||||
|
|
||||||
|
if (getTokenLocationLines().size() == 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint endLineNumber = getTokenLocationLines().rbegin()->first;
|
||||||
|
std::set<Id> addedLocationIds;
|
||||||
|
for (uint i = firstLineNumber; i <= endLineNumber; i++)
|
||||||
|
{
|
||||||
|
TokenLocationLine* locationLine = findTokenLocationLineByNumber(i);
|
||||||
|
if (!locationLine)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (locationLine->getLineNumber() <= lastLineNumber)
|
||||||
|
{
|
||||||
|
locationLine->forEachTokenLocation(
|
||||||
|
[&](TokenLocation* tokenLocation) -> void
|
||||||
|
{
|
||||||
|
const Id tokenId = tokenLocation->getId();
|
||||||
|
if (addedLocationIds.find(tokenId) == addedLocationIds.end())
|
||||||
|
{
|
||||||
|
ret->addTokenLocationAsPlainCopy(tokenLocation->getStartTokenLocation());
|
||||||
|
ret->addTokenLocationAsPlainCopy(tokenLocation->getEndTokenLocation());
|
||||||
|
addedLocationIds.insert(tokenId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Save start locations of TokenLocations that span accross the line range.
|
||||||
|
locationLine->forEachTokenLocation(
|
||||||
|
[&](TokenLocation* tokenLocation) -> void
|
||||||
|
{
|
||||||
|
if (tokenLocation->isEndTokenLocation() &&
|
||||||
|
tokenLocation->getStartTokenLocation()->getLineNumber() < firstLineNumber)
|
||||||
|
{
|
||||||
|
ret->addTokenLocationAsPlainCopy(tokenLocation->getStartTokenLocation());
|
||||||
|
ret->addTokenLocationAsPlainCopy(tokenLocation->getEndTokenLocation());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
TokenLocationLine* TokenLocationFile::findTokenLocationLine(unsigned int lineNumber) const
|
TokenLocationLine* TokenLocationFile::findTokenLocationLine(unsigned int lineNumber) const
|
||||||
{
|
{
|
||||||
TokenLocationLineMapType::const_iterator it = m_lines.find(lineNumber);
|
TokenLocationLineMapType::const_iterator it = m_lines.find(lineNumber);
|
||||||
@@ -199,3 +256,4 @@ std::ostream& operator<<(std::ostream& ostream, const TokenLocationFile& file)
|
|||||||
});
|
});
|
||||||
return ostream;
|
return ostream;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -43,6 +43,8 @@ public:
|
|||||||
|
|
||||||
TokenLocation* addTokenLocationAsPlainCopy(const TokenLocation* location);
|
TokenLocation* addTokenLocationAsPlainCopy(const TokenLocation* location);
|
||||||
|
|
||||||
|
std::shared_ptr<TokenLocationFile> getFilteredByLines(unsigned int firstLineNumber, unsigned int lastLineNumber) const;
|
||||||
|
|
||||||
bool isWholeCopy;
|
bool isWholeCopy;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
#ifndef CACHE_H
|
||||||
|
#define CACHE_H
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
template <typename KeyType, typename ValType>
|
||||||
|
class Cache
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Cache(std::function<ValType(KeyType)> calculator);
|
||||||
|
ValType getValue(KeyType key);
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::function<ValType(KeyType)> m_calculator;
|
||||||
|
std::map<KeyType, ValType> m_map;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename KeyType, typename ValType>
|
||||||
|
Cache<KeyType, ValType>::Cache(std::function<ValType(KeyType)> calculator)
|
||||||
|
: m_calculator(calculator)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename KeyType, typename ValType>
|
||||||
|
ValType Cache<KeyType, ValType>::getValue(KeyType key)
|
||||||
|
{
|
||||||
|
std::map<KeyType, ValType>::const_iterator it = m_map.find(key);
|
||||||
|
if (it != m_map.end())
|
||||||
|
{
|
||||||
|
return it->second;
|
||||||
|
}
|
||||||
|
ValType val = m_calculator(key);
|
||||||
|
m_map[key] = val;
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // CACHE_H
|
||||||
Reference in New Issue
Block a user