tree-sitter/src/compiler/build_tables/get_metadata.cc

44 lines
1.4 KiB
C++
Raw Normal View History

#include "get_metadata.h"
#include "compiler/rules/seq.h"
#include "compiler/rules/choice.h"
#include "compiler/rules/repeat.h"
#include "compiler/rules/visitor.h"
#include "compiler/build_tables/rule_can_be_blank.h"
namespace tree_sitter {
namespace build_tables {
class GetMetadata : public rules::RuleFn<int> {
rules::MetadataKey metadata_key;
public:
GetMetadata(rules::MetadataKey key) :
metadata_key(key) {}
2014-04-04 13:10:55 -07:00
2014-04-09 13:14:46 -07:00
int apply_to(const rules::Choice *rule) {
return apply(rule->left) || apply(rule->right);
}
2014-04-09 13:14:46 -07:00
int apply_to(const rules::Repeat *rule) {
return apply(rule->content);
}
2014-04-09 13:14:46 -07:00
int apply_to(const rules::Seq *rule) {
int result = apply(rule->left);
if (rule_can_be_blank(rule->left) && result == 0)
result = apply(rule->right);
2014-04-09 13:14:46 -07:00
return result;
}
2014-04-04 13:10:55 -07:00
2014-04-09 13:14:46 -07:00
int apply_to(const rules::Metadata *rule) {
auto pair = rule->value.find(metadata_key);
if (pair != rule->value.end())
2014-04-09 13:14:46 -07:00
return pair->second;
else
return 0;
}
};
2014-04-04 13:10:55 -07:00
int get_metadata(const rules::rule_ptr &rule, rules::MetadataKey key) {
return GetMetadata(key).apply(rule);
}
}
}