2014-04-07 08:50:00 -07:00
|
|
|
#include "get_metadata.h"
|
2014-04-03 19:10:09 -07:00
|
|
|
#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 {
|
2014-04-07 08:50:00 -07:00
|
|
|
class GetMetadata : public rules::RuleFn<int> {
|
|
|
|
|
rules::MetadataKey metadata_key;
|
2014-04-03 19:10:09 -07:00
|
|
|
public:
|
2014-04-07 08:50:00 -07:00
|
|
|
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-03 19:10:09 -07:00
|
|
|
}
|
|
|
|
|
|
2014-04-09 13:14:46 -07:00
|
|
|
int apply_to(const rules::Repeat *rule) {
|
|
|
|
|
return apply(rule->content);
|
2014-04-03 19:10:09 -07:00
|
|
|
}
|
|
|
|
|
|
2014-04-09 13:14:46 -07:00
|
|
|
int apply_to(const rules::Seq *rule) {
|
2014-04-07 08:50:00 -07:00
|
|
|
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-03 19:10:09 -07:00
|
|
|
}
|
2014-04-04 13:10:55 -07:00
|
|
|
|
2014-04-09 13:14:46 -07:00
|
|
|
int apply_to(const rules::Metadata *rule) {
|
2014-04-07 08:50:00 -07:00
|
|
|
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-03 19:10:09 -07:00
|
|
|
}
|
|
|
|
|
};
|
2014-04-04 13:10:55 -07:00
|
|
|
|
2014-04-07 08:50:00 -07:00
|
|
|
int get_metadata(const rules::rule_ptr &rule, rules::MetadataKey key) {
|
|
|
|
|
return GetMetadata(key).apply(rule);
|
2014-04-03 19:10:09 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|