/* Copyright (c) 2014 Microsoft Corporation. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Author: Leonardo de Moura */ #include "util/sexpr/option_declarations.h" #include "frontends/lean/elaborator_context.h" #ifndef LEAN_DEFAULT_ELABORATOR_LOCAL_INSTANCES #define LEAN_DEFAULT_ELABORATOR_LOCAL_INSTANCES true #endif #ifndef LEAN_DEFAULT_ELABORATOR_IGNORE_INSTANCES #define LEAN_DEFAULT_ELABORATOR_IGNORE_INSTANCES false #endif #ifndef LEAN_DEFAULT_ELABORATOR_FLYCHECK_GOALS #define LEAN_DEFAULT_ELABORATOR_FLYCHECK_GOALS false #endif #ifndef LEAN_DEFAULT_ELABORATOR_FAIL_MISSING_FIELD #define LEAN_DEFAULT_ELABORATOR_FAIL_MISSING_FIELD false #endif namespace lean { // ========================================== // elaborator configuration options static name * g_elaborator_local_instances = nullptr; static name * g_elaborator_ignore_instances = nullptr; static name * g_elaborator_flycheck_goals = nullptr; static name * g_elaborator_fail_missing_field = nullptr; name const & get_elaborator_ignore_instances_name() { return *g_elaborator_ignore_instances; } bool get_elaborator_local_instances(options const & opts) { return opts.get_bool(*g_elaborator_local_instances, LEAN_DEFAULT_ELABORATOR_LOCAL_INSTANCES); } bool get_elaborator_ignore_instances(options const & opts) { return opts.get_bool(*g_elaborator_ignore_instances, LEAN_DEFAULT_ELABORATOR_IGNORE_INSTANCES); } bool get_elaborator_flycheck_goals(options const & opts) { return opts.get_bool(*g_elaborator_flycheck_goals, LEAN_DEFAULT_ELABORATOR_FLYCHECK_GOALS); } bool get_elaborator_fail_missing_field(options const & opts) { return opts.get_bool(*g_elaborator_fail_missing_field, LEAN_DEFAULT_ELABORATOR_FAIL_MISSING_FIELD); } // ========================================== elaborator_context::elaborator_context(environment const & env, io_state const & ios, local_decls const & lls, pos_info_provider const * pp, info_manager * info, bool check_unassigned): m_env(env), m_ios(ios), m_lls(lls), m_pos_provider(pp), m_info_manager(info), m_check_unassigned(check_unassigned) { m_use_local_instances = get_elaborator_local_instances(ios.get_options()); m_ignore_instances = get_elaborator_ignore_instances(ios.get_options()); m_flycheck_goals = get_elaborator_flycheck_goals(ios.get_options()); m_fail_missing_field = get_elaborator_fail_missing_field(ios.get_options()); } void initialize_elaborator_context() { g_elaborator_local_instances = new name{"elaborator", "local_instances"}; g_elaborator_ignore_instances = new name{"elaborator", "ignore_instances"}; g_elaborator_flycheck_goals = new name{"elaborator", "flycheck_goals"}; g_elaborator_fail_missing_field = new name{"elaborator", "fail_if_missing_field"}; register_bool_option(*g_elaborator_local_instances, LEAN_DEFAULT_ELABORATOR_LOCAL_INSTANCES, "(lean elaborator) use local declarates as class instances"); register_bool_option(*g_elaborator_ignore_instances, LEAN_DEFAULT_ELABORATOR_IGNORE_INSTANCES, "(lean elaborator) if true, then elaborator does not perform class-instance resolution"); register_bool_option(*g_elaborator_flycheck_goals, LEAN_DEFAULT_ELABORATOR_FLYCHECK_GOALS, "(lean elaborator) if true, then elaborator display current goals for flycheck before each " "tactic is executed in a `begin ... end` block"); register_bool_option(*g_elaborator_fail_missing_field, LEAN_DEFAULT_ELABORATOR_FAIL_MISSING_FIELD, "(lean elaborator) if true, then elaborator generates an error for missing fields instead " "of adding placeholders"); } void finalize_elaborator_context() { delete g_elaborator_local_instances; delete g_elaborator_ignore_instances; delete g_elaborator_flycheck_goals; delete g_elaborator_fail_missing_field; } }