File: DeclarationFolderParser.cpp

package info (click to toggle)
darkradiant 3.9.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 41,080 kB
  • sloc: cpp: 264,743; ansic: 10,659; python: 1,852; xml: 1,650; sh: 92; makefile: 21
file content (83 lines) | stat: -rw-r--r-- 2,539 bytes parent folder | download | duplicates (3)
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;
}

}