2014-04-14 08:38:11 -07:00
|
|
|
#include "compiler/build_tables/get_metadata.h"
|
2014-04-03 19:10:09 -07:00
|
|
|
#include "compiler/rules/visitor.h"
|
2014-05-30 13:29:54 -07:00
|
|
|
#include "compiler/rules/seq.h"
|
2014-04-03 19:10:09 -07:00
|
|
|
|
|
|
|
|
namespace tree_sitter {
|
|
|
|
|
namespace build_tables {
|
2014-04-17 13:20:43 -07:00
|
|
|
int get_metadata(const rules::rule_ptr &rule, rules::MetadataKey key) {
|
|
|
|
|
class GetMetadata : public rules::RuleFn<int> {
|
|
|
|
|
rules::MetadataKey metadata_key;
|
2014-04-03 19:10:09 -07:00
|
|
|
|
2014-04-17 13:20:43 -07:00
|
|
|
int apply_to(const rules::Metadata *rule) {
|
2014-06-11 12:27:58 -07:00
|
|
|
int result = rule->value_for(metadata_key);
|
|
|
|
|
return (result != 0) ? result : apply(rule->rule);
|
2014-04-17 13:20:43 -07:00
|
|
|
}
|
2014-04-04 13:10:55 -07:00
|
|
|
|
2014-05-30 13:29:54 -07:00
|
|
|
// TODO -
|
|
|
|
|
// Remove this. It is currently needed to make the rule generated
|
|
|
|
|
// by `LexTableBuilder::after_separators` have the right precedence.
|
|
|
|
|
int apply_to(const rules::Seq *rule) {
|
|
|
|
|
return apply(rule->left);
|
|
|
|
|
}
|
|
|
|
|
|
2014-04-17 13:20:43 -07:00
|
|
|
public:
|
2014-04-28 21:46:43 -07:00
|
|
|
explicit GetMetadata(rules::MetadataKey key) : metadata_key(key) {}
|
2014-04-17 13:20:43 -07:00
|
|
|
};
|
2014-04-04 13:10:55 -07:00
|
|
|
|
2014-04-07 08:50:00 -07:00
|
|
|
return GetMetadata(key).apply(rule);
|
2014-04-03 19:10:09 -07:00
|
|
|
}
|
|
|
|
|
}
|
2014-04-28 21:46:43 -07:00
|
|
|
}
|