1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
#include "DeclarationFolderParser.h"
#include "DeclarationManager.h"
#include "parser/DefBlockSyntaxParser.h"
#include "string/trim.h"
namespace decl
{
namespace
{
DeclarationBlockSyntax createBlock(const parser::DefBlockSyntax& block,
const vfs::FileInfo& fileInfo, const std::string& modName)
{
DeclarationBlockSyntax syntax;
const auto& nameSyntax = block.getName();
const auto& typeSyntax = block.getType();
syntax.typeName = typeSyntax ? typeSyntax->getToken().value : "";
syntax.name = nameSyntax ? nameSyntax->getToken().value : "";
syntax.contents = block.getBlockContents();
syntax.modName = modName;
syntax.fileInfo = fileInfo;
return syntax;
}
}
DeclarationFolderParser::DeclarationFolderParser(DeclarationManager& owner, Type declType,
const std::string& baseDir, const std::string& extension,
const std::map<std::string, Type, string::ILess>& typeMapping) :
ThreadedDeclParser<void>(declType, baseDir, extension, 1),
_owner(owner),
_typeMapping(typeMapping),
_defaultDeclType(declType)
{}
void DeclarationFolderParser::parse(std::istream& stream, const vfs::FileInfo& fileInfo, const std::string& modDir)
{
// Parse the incoming stream into syntax blocks
parser::DefBlockSyntaxParser<std::istream> parser(stream);
auto syntaxTree = parser.parse();
for (const auto& node : syntaxTree->getRoot()->getChildren())
{
if (node->getType() != parser::DefSyntaxNode::Type::DeclBlock)
{
continue;
}
const auto& blockNode = static_cast<const parser::DefBlockSyntax&>(*node);
// Convert the incoming block to a DeclarationBlockSyntax
auto blockSyntax = createBlock(blockNode, fileInfo, modDir);
// Move the block in the correct bucket
auto declType = determineBlockType(blockSyntax);
auto& blockList = _parsedBlocks.try_emplace(declType).first->second;
blockList.emplace_back(std::move(blockSyntax));
}
}
void DeclarationFolderParser::onFinishParsing()
{
// Submit all parsed declarations to the decl manager
_owner.onParserFinished(_defaultDeclType, _parsedBlocks);
}
Type DeclarationFolderParser::determineBlockType(const DeclarationBlockSyntax& block)
{
if (block.typeName.empty())
{
return _defaultDeclType;
}
auto foundType = _typeMapping.find(block.typeName);
return foundType != _typeMapping.end() ? foundType->second : Type::Undetermined;
}
}
|