fix(frontends/lean): allow 'attribute <id> [priority ...]'
This commit is contained in:
parent
3b73e100dc
commit
fa79b214b8
4 changed files with 55 additions and 8 deletions
|
@ -297,7 +297,8 @@ struct decl_attributes {
|
|||
optional<unsigned> m_priority;
|
||||
optional<unsigned> m_unfold_c_hint;
|
||||
|
||||
decl_attributes(bool def_only = true, bool is_abbrev = false):m_priority() {
|
||||
decl_attributes(bool def_only = true, bool is_abbrev = false):
|
||||
m_priority() {
|
||||
m_def_only = def_only;
|
||||
m_is_abbrev = is_abbrev;
|
||||
m_is_instance = false;
|
||||
|
@ -350,7 +351,7 @@ struct decl_attributes {
|
|||
}
|
||||
}
|
||||
|
||||
void parse(parser & p) {
|
||||
void parse(buffer<name> const & ns, parser & p) {
|
||||
while (true) {
|
||||
auto pos = p.pos();
|
||||
if (p.curr_is_token(get_instance_tk())) {
|
||||
|
@ -389,8 +390,18 @@ struct decl_attributes {
|
|||
p.next();
|
||||
} else if (auto it = parse_instance_priority(p)) {
|
||||
m_priority = *it;
|
||||
if (!m_is_instance)
|
||||
if (!m_is_instance) {
|
||||
if (ns.empty()) {
|
||||
throw parser_error("invalid '[priority]' attribute, declaration must be marked as an '[instance]'", pos);
|
||||
} else {
|
||||
for (name const & n : ns) {
|
||||
if (!is_instance(p.env(), n))
|
||||
throw parser_error(sstream() << "invalid '[priority]' attribute, declaration '" << n
|
||||
<< "' must be marked as an '[instance]'", pos);
|
||||
}
|
||||
m_is_instance = true;
|
||||
}
|
||||
}
|
||||
} else if (p.curr_is_token(get_parsing_only_tk())) {
|
||||
if (!m_is_abbrev)
|
||||
throw parser_error("invalid '[parsing-only]' attribute, only abbreviations can be "
|
||||
|
@ -410,6 +421,17 @@ struct decl_attributes {
|
|||
}
|
||||
}
|
||||
|
||||
void parse(name const & n, parser & p) {
|
||||
buffer<name> ns;
|
||||
ns.push_back(n);
|
||||
parse(ns, p);
|
||||
}
|
||||
|
||||
void parse(parser & p) {
|
||||
buffer<name> ns;
|
||||
parse(ns, p);
|
||||
}
|
||||
|
||||
environment apply(environment env, io_state const & ios, name const & d, bool persistent) {
|
||||
if (m_is_instance) {
|
||||
if (m_priority) {
|
||||
|
@ -1113,7 +1135,7 @@ static environment attribute_cmd_core(parser & p, bool persistent) {
|
|||
}
|
||||
bool decl_only = false;
|
||||
decl_attributes attributes(decl_only);
|
||||
attributes.parse(p);
|
||||
attributes.parse(ds, p);
|
||||
environment env = p.env();
|
||||
for (name const & d : ds)
|
||||
env = attributes.apply(env, p.ios(), d, persistent);
|
||||
|
|
|
@ -46,6 +46,10 @@ struct class_state {
|
|||
return LEAN_INSTANCE_DEFAULT_PRIORITY;
|
||||
}
|
||||
|
||||
bool is_instance(name const & i) const {
|
||||
return m_priorities.contains(i);
|
||||
}
|
||||
|
||||
bool try_multiple_instances(name const & c) const {
|
||||
return m_multiple.contains(c);
|
||||
}
|
||||
|
@ -73,7 +77,6 @@ struct class_state {
|
|||
auto lst = filter(*it, [&](name const & i1) { return i1 != i; });
|
||||
m_instances.insert(c, insert(i, p, lst));
|
||||
}
|
||||
if (p != LEAN_INSTANCE_DEFAULT_PRIORITY)
|
||||
m_priorities.insert(i, p);
|
||||
}
|
||||
|
||||
|
@ -215,6 +218,11 @@ bool is_class(environment const & env, name const & c) {
|
|||
return s.m_instances.contains(c);
|
||||
}
|
||||
|
||||
bool is_instance(environment const & env, name const & i) {
|
||||
class_state const & s = class_ext::get_state(env);
|
||||
return s.is_instance(i);
|
||||
}
|
||||
|
||||
list<name> get_class_instances(environment const & env, name const & c) {
|
||||
class_state const & s = class_ext::get_state(env);
|
||||
return ptr_to_list(s.m_instances.find(c));
|
||||
|
|
|
@ -15,6 +15,8 @@ environment add_instance(environment const & env, name const & n, bool persisten
|
|||
environment add_instance(environment const & env, name const & n, unsigned priority, bool persistent);
|
||||
/** \brief Return true iff \c c was declared with \c add_class. */
|
||||
bool is_class(environment const & env, name const & c);
|
||||
/** \brief Return true iff \c i was declared with \c add_instance. */
|
||||
bool is_instance(environment const & env, name const & i);
|
||||
/** \brief Return the instances of the given class. */
|
||||
list<name> get_class_instances(environment const & env, name const & c);
|
||||
/** \brief Return the classes in the given environment. */
|
||||
|
|
|
@ -26,3 +26,18 @@ foo.mk 4 4
|
|||
|
||||
example : foo.a = 3 :=
|
||||
rfl
|
||||
|
||||
attribute i4 [priority default+2]
|
||||
|
||||
example : foo.a = 4 :=
|
||||
rfl
|
||||
|
||||
attribute i1 [priority default+3]
|
||||
|
||||
example : foo.a = 1 :=
|
||||
rfl
|
||||
|
||||
attribute i2 [instance] [priority default+4]
|
||||
|
||||
example : foo.a = 2 :=
|
||||
rfl
|
||||
|
|
Loading…
Reference in a new issue