From 34cdde604ecdd0a4748768e59b4bd2f40783e2b0 Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Sun, 23 Sep 2018 17:52:05 +0200 Subject: [PATCH] data: improved ParserClientImpl recording performance * Removed storage checks and single use methods * cache file ids in ParserClientImpl to avoid lookup for every source location * NameHierarchy::serialize with range to avoid copies when adding nodes * removed duplicate code in IndexerCxx and IndexerJava, moved to Indexer --- src/lib/data/indexer/Indexer.h | 47 +++++- src/lib/data/indexer/IndexerBase.h | 1 + src/lib/data/name/NameHierarchy.cpp | 16 +- src/lib/data/name/NameHierarchy.h | 5 +- src/lib/data/parser/ParserClientImpl.cpp | 190 ++++++---------------- src/lib/data/parser/ParserClientImpl.h | 21 +-- src/lib_cxx/data/indexer/IndexerCxx.cpp | 47 +----- src/lib_cxx/data/indexer/IndexerCxx.h | 19 +-- src/lib_java/data/indexer/IndexerJava.cpp | 48 +----- src/lib_java/data/indexer/IndexerJava.h | 14 +- 10 files changed, 149 insertions(+), 259 deletions(-) diff --git a/src/lib/data/indexer/Indexer.h b/src/lib/data/indexer/Indexer.h index 77edd59d..2c02a5e7 100644 --- a/src/lib/data/indexer/Indexer.h +++ b/src/lib/data/indexer/Indexer.h @@ -5,27 +5,49 @@ #include "IndexerBase.h" #include "IndexerCommand.h" +#include "IndexerStateInfo.h" #include "logging.h" +#include "ParserClientImpl.h" template class Indexer : public IndexerBase { public: + Indexer(); IndexerCommandType getSupportedIndexerCommandType() const override; std::shared_ptr index(std::shared_ptr indexerCommand) override; + void interrupt() override; private: - virtual std::shared_ptr doIndex(std::shared_ptr indexerCommand) = 0; + virtual void doIndex( + std::shared_ptr indexerCommand, + std::shared_ptr parserClient, + std::shared_ptr m_indexerStateInfo) = 0; + + std::shared_ptr m_indexerStateInfo; }; +template +Indexer::Indexer() + : m_indexerStateInfo(std::make_shared()) +{ + m_indexerStateInfo->indexingInterrupted = false; +} + template IndexerCommandType Indexer::getSupportedIndexerCommandType() const { return T::getStaticIndexerCommandType(); } +template +void Indexer::interrupt() +{ + m_indexerStateInfo->indexingInterrupted = true; +} + template std::shared_ptr Indexer::index(std::shared_ptr indexerCommand) { @@ -35,10 +57,29 @@ std::shared_ptr Indexer::index(std::shared_ptrgetIndexerCommandType()) + " indexer command with indexer that supports \"" + indexerCommandTypeToString(getSupportedIndexerCommandType()) + "\"."); - return std::shared_ptr(); + return nullptr; } - return doIndex(castCommand); + std::shared_ptr storage = std::make_shared(); + std::shared_ptr parserClient = std::make_shared(storage.get()); + + doIndex(castCommand, parserClient, m_indexerStateInfo); + + if (parserClient->hasFatalErrors()) + { + storage->setAllFilesIncomplete(); + } + else + { + storage->setFilesWithErrorsIncomplete(); + } + + if (m_indexerStateInfo->indexingInterrupted) + { + return nullptr; + } + + return storage; } #endif // INDEXER_H diff --git a/src/lib/data/indexer/IndexerBase.h b/src/lib/data/indexer/IndexerBase.h index a2c5e060..86cb1f0e 100644 --- a/src/lib/data/indexer/IndexerBase.h +++ b/src/lib/data/indexer/IndexerBase.h @@ -15,6 +15,7 @@ class IndexerBase public: IndexerBase(); virtual ~IndexerBase() = default; + virtual IndexerCommandType getSupportedIndexerCommandType() const = 0; virtual std::shared_ptr index(std::shared_ptr indexerCommand) = 0; virtual void interrupt() = 0; diff --git a/src/lib/data/name/NameHierarchy.cpp b/src/lib/data/name/NameHierarchy.cpp index bd38f000..1818d862 100644 --- a/src/lib/data/name/NameHierarchy.cpp +++ b/src/lib/data/name/NameHierarchy.cpp @@ -14,11 +14,16 @@ namespace } std::wstring NameHierarchy::serialize(const NameHierarchy& nameHierarchy) +{ + return serializeRange(nameHierarchy, 0, nameHierarchy.size()); +} + +std::wstring NameHierarchy::serializeRange(const NameHierarchy& nameHierarchy, size_t first, size_t last) { std::wstringstream ss; ss << nameDelimiterTypeToString(nameHierarchy.getDelimiter()); ss << META_DELIMITER; - for (size_t i = 0; i < nameHierarchy.size(); i++) + for (size_t i = first; i < last && i < nameHierarchy.size(); i++) { if (i > 0) { @@ -102,10 +107,10 @@ NameHierarchy::NameHierarchy(const NameDelimiterType delimiter) { } -NameHierarchy::NameHierarchy(const std::wstring& name, const NameDelimiterType delimiter) +NameHierarchy::NameHierarchy(std::wstring name, const NameDelimiterType delimiter) : m_delimiter(delimiter) { - push(std::make_shared(name)); + push(std::make_shared(std::move(name))); } NameHierarchy::NameHierarchy(const std::vector& names, const NameDelimiterType delimiter) @@ -138,6 +143,11 @@ void NameHierarchy::push(std::shared_ptr element) m_elements.push_back(element); } +void NameHierarchy::push(std::wstring name) +{ + m_elements.push_back(std::make_shared(std::move(name))); +} + void NameHierarchy::pop() { m_elements.pop_back(); diff --git a/src/lib/data/name/NameHierarchy.h b/src/lib/data/name/NameHierarchy.h index 236b1d07..8a1bb7bc 100644 --- a/src/lib/data/name/NameHierarchy.h +++ b/src/lib/data/name/NameHierarchy.h @@ -12,11 +12,13 @@ class NameHierarchy { public: static std::wstring serialize(const NameHierarchy& nameHierarchy); + static std::wstring serializeRange(const NameHierarchy& nameHierarchy, size_t first, size_t last); static NameHierarchy deserialize(const std::wstring& serializedName); NameHierarchy(const NameDelimiterType delimiter = NAME_DELIMITER_UNKNOWN); - NameHierarchy(const std::wstring& name, const NameDelimiterType delimiter); NameHierarchy(const std::vector& names, const NameDelimiterType delimiter); + NameHierarchy(std::wstring name, const NameDelimiterType delimiter); + NameHierarchy(const NameHierarchy& other); NameHierarchy(NameHierarchy&& other); ~NameHierarchy(); @@ -25,6 +27,7 @@ public: void setDelimiter(const NameDelimiterType delimiter); void push(std::shared_ptr element); + void push(std::wstring name); void pop(); std::shared_ptr back() const; diff --git a/src/lib/data/parser/ParserClientImpl.cpp b/src/lib/data/parser/ParserClientImpl.cpp index bb1d5623..a6f13704 100644 --- a/src/lib/data/parser/ParserClientImpl.cpp +++ b/src/lib/data/parser/ParserClientImpl.cpp @@ -2,32 +2,28 @@ #include "Edge.h" #include "Node.h" -#include "LocationType.h" #include "ParseLocation.h" #include "logging.h" -ParserClientImpl::ParserClientImpl() +ParserClientImpl::ParserClientImpl(IntermediateStorage* const storage) + : m_storage(storage) { } -void ParserClientImpl::setStorage(std::shared_ptr storage) -{ - m_storage = storage; -} - -void ParserClientImpl::resetStorage() -{ - m_storage.reset(); -} - Id ParserClientImpl::recordSymbol( const NameHierarchy& symbolName, SymbolKind symbolKind, AccessKind access, DefinitionKind definitionKind ) { Id nodeId = addNodeHierarchy(symbolName, symbolKindToNodeType(symbolKind)); - addSymbol(nodeId, definitionKind); - addAccess(nodeId, access); + if (definitionKind != DEFINITION_NONE) + { + m_storage->addSymbol(StorageSymbol(nodeId, definitionKindToInt(definitionKind))); + } + if (access != ACCESS_NONE) + { + m_storage->addComponentAccess(StorageComponentAccess(nodeId, accessKindToInt(access))); + } return nodeId; } @@ -38,7 +34,7 @@ Id ParserClientImpl::recordSymbolWithLocation( ) { Id nodeId = recordSymbol(symbolName, symbolKind, access, definitionKind); - addSourceLocation(nodeId, location, locationTypeToInt(LOCATION_TOKEN)); + addSourceLocation(nodeId, location, LOCATION_TOKEN); return nodeId; } @@ -49,7 +45,7 @@ Id ParserClientImpl::recordSymbolWithLocationAndScope( ) { Id nodeId = recordSymbolWithLocation(symbolName, symbolKind, location, access, definitionKind); - addSourceLocation(nodeId, scopeLocation, locationTypeToInt(LOCATION_SCOPE)); + addSourceLocation(nodeId, scopeLocation, LOCATION_SCOPE); return nodeId; } @@ -59,7 +55,7 @@ Id ParserClientImpl::recordSymbolWithLocationAndScopeAndSignature( AccessKind access, DefinitionKind definitionKind) { Id nodeId = recordSymbolWithLocationAndScope(symbolName, symbolKind, location, scopeLocation, access, definitionKind); - addSourceLocation(nodeId, signatureLocation, locationTypeToInt(LOCATION_SIGNATURE)); + addSourceLocation(nodeId, signatureLocation, LOCATION_SIGNATURE); return nodeId; } @@ -70,30 +66,36 @@ void ParserClientImpl::recordReference( Id contextNodeId = addNodeHierarchy(contextName); Id referencedNodeId = addNodeHierarchy(referencedName); Id edgeId = addEdge(referenceKindToEdgeType(referenceKind), contextNodeId, referencedNodeId); - addSourceLocation(edgeId, location, locationTypeToInt(LOCATION_TOKEN)); + addSourceLocation(edgeId, location, LOCATION_TOKEN); } void ParserClientImpl::recordQualifierLocation(const NameHierarchy& qualifierName, const ParseLocation& location) { Id nodeId = addNodeHierarchy(qualifierName, NodeType::NODE_SYMBOL); - addSourceLocation(nodeId, location, locationTypeToInt(LOCATION_QUALIFIER)); + addSourceLocation(nodeId, location, LOCATION_QUALIFIER); } void ParserClientImpl::recordLocalSymbol(const std::wstring& name, const ParseLocation& location) { - const Id localSymbolId = addLocalSymbol(name); - addSourceLocation(localSymbolId, location, locationTypeToInt(LOCATION_LOCAL_SYMBOL)); + const Id localSymbolId = m_storage->addLocalSymbol(name); + addSourceLocation(localSymbolId, location, LOCATION_LOCAL_SYMBOL); } void ParserClientImpl::recordFile(const FilePath& filePath, bool indexed) { - const Id nodeId = addNodeHierarchy(NameHierarchy(filePath.wstr(), NAME_DELIMITER_FILE), NodeType::NODE_FILE); - addFile(nodeId, filePath, indexed); + const Id fileId = addFileName(filePath); + m_storage->addFile(StorageFile(fileId, filePath.wstr(), indexed, true)); } void ParserClientImpl::recordComment(const ParseLocation& location) { - addCommentLocation(location); + m_storage->addCommentLocation(StorageCommentLocationData( + addFileName(location.filePath), + location.startLineNumber, + location.startColumnNumber, + location.endLineNumber, + location.endColumnNumber + )); } void ParserClientImpl::doRecordError( @@ -101,7 +103,15 @@ void ParserClientImpl::doRecordError( { if (location.isValid()) { - addError(message, fatal, indexed, location, translationUnit); + m_storage->addError(StorageErrorData( + message, + location.filePath.wstr(), + location.startLineNumber, + location.startColumnNumber, + translationUnit.wstr(), + fatal, + indexed + )); } } @@ -189,31 +199,15 @@ Edge::EdgeType ParserClientImpl::referenceKindToEdgeType(ReferenceKind reference return Edge::EDGE_UNDEFINED; } -void ParserClientImpl::addAccess(Id nodeId, AccessKind access) -{ - if (access != ACCESS_NONE) - { - addComponentAccess(nodeId, accessKindToInt(access)); - } -} - Id ParserClientImpl::addNodeHierarchy(const NameHierarchy& nameHierarchy, NodeType nodeType) { - if (nameHierarchy.size() == 0) - { - return 0; - } - Id parentNodeId = 0; - NameHierarchy currentNameHierarchy(nameHierarchy.getDelimiter()); - - for (size_t i = 0; i < nameHierarchy.size(); i++) + for (size_t i = 1; i <= nameHierarchy.size(); i++) { - currentNameHierarchy.push(nameHierarchy[i]); - const bool currentIsLastElement = (i == nameHierarchy.size() - 1); - const NodeType currentType = (currentIsLastElement ? nodeType : NodeType::NODE_SYMBOL); // TODO: rename to unknown! + const NodeType currentType = (i == nameHierarchy.size() ? nodeType : NodeType::NODE_SYMBOL); // TODO: rename to unknown! - Id nodeId = addNode(currentType, currentNameHierarchy); + Id nodeId = m_storage->addNode(StorageNodeData( + NodeType::typeToInt(currentType.getType()), NameHierarchy::serializeRange(nameHierarchy, 0, i))); if (parentNodeId != 0) { @@ -225,69 +219,32 @@ Id ParserClientImpl::addNodeHierarchy(const NameHierarchy& nameHierarchy, NodeTy return parentNodeId; } -Id ParserClientImpl::addNode(NodeType nodeType, const NameHierarchy& nameHierarchy) +Id ParserClientImpl::addFileName(const FilePath& filePath) { - if (!m_storage) + const std::wstring file = filePath.wstr(); + + auto it = m_fileIdMap.find(file); + if (it != m_fileIdMap.end()) { - return 0; + return it->second; } - return m_storage->addNode(StorageNodeData(NodeType::typeToInt(nodeType.getType()), NameHierarchy::serialize(nameHierarchy))); -} - -void ParserClientImpl::addFile(Id id, const FilePath& filePath, bool indexed) -{ - if (m_storage) - { - m_storage->addFile(StorageFile(id, filePath.wstr(), indexed, true)); - } -} - -void ParserClientImpl::addSymbol(Id id, DefinitionKind definitionKind) -{ - if (!m_storage) - { - return; - } - - if (definitionKind != DEFINITION_NONE) - { - m_storage->addSymbol(StorageSymbol(id, definitionKindToInt(definitionKind))); - } + const Id fileId = addNodeHierarchy(NameHierarchy(file, NAME_DELIMITER_FILE), NodeType::NODE_FILE); + m_fileIdMap.emplace(file, fileId); + return fileId; } Id ParserClientImpl::addEdge(int type, Id sourceId, Id targetId) { - if (!m_storage) + if (sourceId && targetId) { - return 0; + return m_storage->addEdge(StorageEdgeData(type, sourceId, targetId)); } - - if (!sourceId || !targetId) - { - return 0; - } - - return m_storage->addEdge(StorageEdgeData(type, sourceId, targetId)); + return 0; } -Id ParserClientImpl::addLocalSymbol(const std::wstring& name) +void ParserClientImpl::addSourceLocation(Id elementId, const ParseLocation& location, LocationType type) { - if (!m_storage) - { - return 0; - } - - return m_storage->addLocalSymbol(name); -} - -void ParserClientImpl::addSourceLocation(Id elementId, const ParseLocation& location, int type) -{ - if (!m_storage) - { - return; - } - if (!location.isValid()) { return; @@ -300,12 +257,12 @@ void ParserClientImpl::addSourceLocation(Id elementId, const ParseLocation& loca } Id sourceLocationId = m_storage->addSourceLocation(StorageSourceLocationData( - addNodeHierarchy(NameHierarchy(location.filePath.wstr(), NAME_DELIMITER_FILE), NodeType::NODE_FILE), + addFileName(location.filePath), location.startLineNumber, location.startColumnNumber, location.endLineNumber, location.endColumnNumber, - type + locationTypeToInt(type) )); m_storage->addOccurrence(StorageOccurrence( @@ -313,42 +270,3 @@ void ParserClientImpl::addSourceLocation(Id elementId, const ParseLocation& loca sourceLocationId )); } - -void ParserClientImpl::addComponentAccess(Id nodeId , int type) -{ - if (!m_storage) - { - return; - } - - m_storage->addComponentAccess(StorageComponentAccess(nodeId, type)); -} - -void ParserClientImpl::addCommentLocation(const ParseLocation& location) -{ - if (!m_storage) - { - return; - } - - m_storage->addCommentLocation(StorageCommentLocationData( - addNodeHierarchy(NameHierarchy(location.filePath.wstr(), NAME_DELIMITER_FILE), NodeType::NODE_FILE), - location.startLineNumber, - location.startColumnNumber, - location.endLineNumber, - location.endColumnNumber - )); -} - -void ParserClientImpl::addError( - const std::wstring& message, bool fatal, bool indexed, const ParseLocation& location, const FilePath& translationUnit) -{ - if (!m_storage) - { - return; - } - - m_storage->addError(StorageErrorData( - message, location.filePath.wstr(), location.startLineNumber, location.startColumnNumber, translationUnit.wstr(), fatal, indexed - )); -} diff --git a/src/lib/data/parser/ParserClientImpl.h b/src/lib/data/parser/ParserClientImpl.h index 07d2f165..71627b98 100644 --- a/src/lib/data/parser/ParserClientImpl.h +++ b/src/lib/data/parser/ParserClientImpl.h @@ -6,16 +6,14 @@ #include "DefinitionKind.h" #include "Node.h" #include "IntermediateStorage.h" +#include "LocationType.h" #include "ParserClient.h" class ParserClientImpl : public ParserClient { public: - ParserClientImpl(); - - void setStorage(std::shared_ptr storage); - void resetStorage(); + ParserClientImpl(IntermediateStorage* const storage); Id recordSymbol( const NameHierarchy& symbolName, SymbolKind symbolKind, @@ -54,20 +52,17 @@ private: NodeType symbolKindToNodeType(SymbolKind symbolType) const; Edge::EdgeType referenceKindToEdgeType(ReferenceKind referenceKind) const; void addAccess(Id nodeId, AccessKind access); - Id addNodeHierarchy(const NameHierarchy& nameHierarchy, NodeType nodeType = NodeType::NODE_SYMBOL); - Id addNode(NodeType nodeType, const NameHierarchy& nameHierarchy); - void addFile(Id id, const FilePath& filePath, bool indexed); - void addSymbol(Id id, DefinitionKind definitionKind); + Id addNodeHierarchy(const NameHierarchy& nameHierarchy, NodeType nodeType = NodeType::NODE_SYMBOL); + Id addFileName(const FilePath& filePath); Id addEdge(int type, Id sourceId, Id targetId); - Id addLocalSymbol(const std::wstring& name); - void addSourceLocation(Id elementId, const ParseLocation& location, int type); - void addComponentAccess(Id nodeId , int type); - void addCommentLocation(const ParseLocation& location); + + void addSourceLocation(Id elementId, const ParseLocation& location, LocationType type); void addError(const std::wstring& message, bool fatal, bool indexed, const ParseLocation& location, const FilePath& sourceFilePath); - std::shared_ptr m_storage; + IntermediateStorage* const m_storage; + std::map m_fileIdMap; }; #endif // PARSER_CLIENT_IMPL_H diff --git a/src/lib_cxx/data/indexer/IndexerCxx.cpp b/src/lib_cxx/data/indexer/IndexerCxx.cpp index 80999c7c..2468fc08 100644 --- a/src/lib_cxx/data/indexer/IndexerCxx.cpp +++ b/src/lib_cxx/data/indexer/IndexerCxx.cpp @@ -2,25 +2,13 @@ #include "CxxParser.h" #include "FileRegister.h" -#include "IndexerStateInfo.h" -#include "ParserClientImpl.h" -IndexerCxx::IndexerCxx() - : m_indexerStateInfo(std::make_shared()) -{ - m_indexerStateInfo->indexingInterrupted = false; -} - -void IndexerCxx::interrupt() -{ - m_indexerStateInfo->indexingInterrupted = true; -} - -std::shared_ptr IndexerCxx::doIndex(std::shared_ptr indexerCommand) -{ - std::shared_ptr parserClient = std::make_shared(); - - std::shared_ptr parser = std::make_shared( +void IndexerCxx::doIndex( + std::shared_ptr indexerCommand, + std::shared_ptr parserClient, + std::shared_ptr m_indexerStateInfo +){ + CxxParser parser( parserClient, std::make_shared( indexerCommand->getSourceFilePath(), indexerCommand->getIndexedPaths(), indexerCommand->getExcludeFilters() @@ -28,26 +16,5 @@ std::shared_ptr IndexerCxx::doIndex(std::shared_ptr storage = std::make_shared(); - parserClient->setStorage(storage); - - parser->buildIndex(indexerCommand); - - parserClient->resetStorage(); - - if (parserClient->hasFatalErrors()) - { - storage->setAllFilesIncomplete(); - } - else - { - storage->setFilesWithErrorsIncomplete(); - } - - if (m_indexerStateInfo->indexingInterrupted) - { - return std::shared_ptr(); - } - - return storage; + parser.buildIndex(indexerCommand); } diff --git a/src/lib_cxx/data/indexer/IndexerCxx.h b/src/lib_cxx/data/indexer/IndexerCxx.h index dea00077..8751f648 100644 --- a/src/lib_cxx/data/indexer/IndexerCxx.h +++ b/src/lib_cxx/data/indexer/IndexerCxx.h @@ -1,24 +1,17 @@ #ifndef INDEXER_CXX_H #define INDEXER_CXX_H -#include -#include - #include "Indexer.h" #include "IndexerCommandCxx.h" -struct IndexerStateInfo; - -class IndexerCxx: public Indexer +class IndexerCxx + : public Indexer { -public: - IndexerCxx(); - void interrupt() override; - private: - std::shared_ptr doIndex(std::shared_ptr indexerCommand) override; - - std::shared_ptr m_indexerStateInfo; + void doIndex( + std::shared_ptr indexerCommand, + std::shared_ptr parserClient, + std::shared_ptr m_indexerStateInfo) override; }; #endif // INDEXER_CXX_H diff --git a/src/lib_java/data/indexer/IndexerJava.cpp b/src/lib_java/data/indexer/IndexerJava.cpp index 91094716..c552df9c 100644 --- a/src/lib_java/data/indexer/IndexerJava.cpp +++ b/src/lib_java/data/indexer/IndexerJava.cpp @@ -1,52 +1,16 @@ #include "IndexerJava.h" -#include "IndexerCommandJava.h" -#include "IndexerStateInfo.h" #include "JavaParser.h" -#include "ParserClientImpl.h" - -IndexerJava::IndexerJava() - : m_indexerStateInfo(std::make_shared()) -{ - m_indexerStateInfo->indexingInterrupted = false; -} IndexerJava::~IndexerJava() { JavaParser::clearCaches(); } -void IndexerJava::interrupt() -{ - m_indexerStateInfo->indexingInterrupted = true; -} - -std::shared_ptr IndexerJava::doIndex(std::shared_ptr indexerCommand) -{ - std::shared_ptr parserClient = std::make_shared(); - - std::shared_ptr parser = std::make_shared(parserClient, m_indexerStateInfo); - - std::shared_ptr storage = std::make_shared(); - parserClient->setStorage(storage); - - parser->buildIndex(indexerCommand); - - parserClient->resetStorage(); - - if (parserClient->hasFatalErrors()) - { - storage->setAllFilesIncomplete(); - } - else - { - storage->setFilesWithErrorsIncomplete(); - } - - if (m_indexerStateInfo->indexingInterrupted) - { - return std::shared_ptr(); - } - - return storage; +void IndexerJava::doIndex( + std::shared_ptr indexerCommand, + std::shared_ptr parserClient, + std::shared_ptr m_indexerStateInfo +){ + JavaParser(parserClient, m_indexerStateInfo).buildIndex(indexerCommand); } diff --git a/src/lib_java/data/indexer/IndexerJava.h b/src/lib_java/data/indexer/IndexerJava.h index 788a8617..32d36674 100644 --- a/src/lib_java/data/indexer/IndexerJava.h +++ b/src/lib_java/data/indexer/IndexerJava.h @@ -1,24 +1,22 @@ #ifndef INDEXER_JAVA_H #define INDEXER_JAVA_H -#include - #include "Indexer.h" #include "IndexerCommandJava.h" struct IndexerStateInfo; -class IndexerJava: public Indexer +class IndexerJava + : public Indexer { public: - IndexerJava(); virtual ~IndexerJava(); - void interrupt() override; private: - std::shared_ptr doIndex(std::shared_ptr indexerCommand) override; - - std::shared_ptr m_indexerStateInfo; + void doIndex( + std::shared_ptr indexerCommand, + std::shared_ptr parserClient, + std::shared_ptr m_indexerStateInfo) override; }; #endif // INDEXER_JAVA_H