fix(frontends/lean): allow user set constants defined in other namespaces as opaque
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
parent
363c4dc5c2
commit
593f1f2ebd
3 changed files with 37 additions and 3 deletions
|
@ -547,6 +547,7 @@ void parser_imp::parse_set_option() {
|
||||||
/** Parse 'SetOpaque' [id] [true/false] */
|
/** Parse 'SetOpaque' [id] [true/false] */
|
||||||
void parser_imp::parse_set_opaque() {
|
void parser_imp::parse_set_opaque() {
|
||||||
next();
|
next();
|
||||||
|
auto p = pos();
|
||||||
name id;
|
name id;
|
||||||
if (curr() == scanner::token::Exists) {
|
if (curr() == scanner::token::Exists) {
|
||||||
id = "exists";
|
id = "exists";
|
||||||
|
@ -555,13 +556,20 @@ void parser_imp::parse_set_opaque() {
|
||||||
id = curr_name();
|
id = curr_name();
|
||||||
}
|
}
|
||||||
next();
|
next();
|
||||||
name full_id = mk_full_name(id);
|
expr d = get_name_ref(id, p, false);
|
||||||
|
name real_id;
|
||||||
|
if (is_constant(d))
|
||||||
|
real_id = const_name(d);
|
||||||
|
else if (is_value(d))
|
||||||
|
real_id = to_value(d).get_name();
|
||||||
|
else
|
||||||
|
throw parser_error(sstream() << "invalid set opaque, identifier '" << id << "' cannot be set opaque", p);
|
||||||
auto val_pos = pos();
|
auto val_pos = pos();
|
||||||
name val = check_identifier_next("invalid opaque flag, true/false expected");
|
name val = check_identifier_next("invalid opaque flag, true/false expected");
|
||||||
if (val == "true")
|
if (val == "true")
|
||||||
m_env->set_opaque(full_id, true);
|
m_env->set_opaque(real_id, true);
|
||||||
else if (val == "false")
|
else if (val == "false")
|
||||||
m_env->set_opaque(full_id, false);
|
m_env->set_opaque(real_id, false);
|
||||||
else
|
else
|
||||||
throw parser_error("invalid opaque flag, true/false expected", val_pos);
|
throw parser_error("invalid opaque flag, true/false expected", val_pos);
|
||||||
}
|
}
|
||||||
|
|
18
tests/lean/opaque.lean
Normal file
18
tests/lean/opaque.lean
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
import macros
|
||||||
|
import pair
|
||||||
|
import subtype
|
||||||
|
import optional
|
||||||
|
using subtype
|
||||||
|
using optional
|
||||||
|
|
||||||
|
namespace sum
|
||||||
|
|
||||||
|
set_opaque optional false
|
||||||
|
set_opaque subtype false
|
||||||
|
set_opaque some false
|
||||||
|
set_opaque optional::none false
|
||||||
|
set_opaque rep false
|
||||||
|
set_opaque subtype::abst false
|
||||||
|
set_opaque optional_pred false
|
||||||
|
|
||||||
|
end
|
8
tests/lean/opaque.lean.expected.out
Normal file
8
tests/lean/opaque.lean.expected.out
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
Set: pp::colors
|
||||||
|
Set: pp::unicode
|
||||||
|
Imported 'macros'
|
||||||
|
Imported 'pair'
|
||||||
|
Imported 'subtype'
|
||||||
|
Imported 'optional'
|
||||||
|
Using: subtype
|
||||||
|
Using: optional
|
Loading…
Reference in a new issue