123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081(************************************************************************)(* * The Coq Proof Assistant / The Coq Development Team *)(* v * Copyright INRIA, CNRS and contributors *)(* <O___,, * (see version control and CREDITS file for authors & dates) *)(* \VV/ **************************************************************)(* // * This file is distributed under the terms of the *)(* * GNU Lesser General Public License Version 2.1 *)(* * (see LICENSE file for the text of the license) *)(************************************************************************)(** * Managing locality *)typeimport_status=ImportDefaultBehavior|ImportNeedQualifiedtypelocality=Discharge|Globalofimport_statusletimportability_of_bool=function|true->ImportNeedQualified|false->ImportDefaultBehavior(** Positioning locality for commands supporting discharging and export
outside of modules *)(* For commands whose default is to discharge and export:
Global is the default and is neutral;
Local in a section deactivates discharge,
Local not in a section deactivates export *)letmake_non_locality=functionSomefalse->false|_->trueletmake_locality=functionSometrue->true|_->falseletwarn_local_declaration=CWarnings.create~name:"local-declaration"~category:"scope"Pp.(fun()->Pp.strbrk"Interpreting this declaration as if "++strbrk"a global declaration prefixed by \"Local\", "++strbrk"i.e. as a global declaration which shall not be "++strbrk"available without qualification when imported.")letenforce_locality_explocality_flagdischarge=letopenVernacexprinmatchlocality_flag,dischargewith|Someb,NoDischarge->Global(importability_of_boolb)|None,NoDischarge->GlobalImportDefaultBehavior|None,DoDischargewhennot(Global.sections_are_opened())->(* If a Let/Variable is defined outside a section, then we consider it as a local definition *)warn_local_declaration();GlobalImportNeedQualified|None,DoDischarge->Discharge|Sometrue,DoDischarge->CErrors.user_errPp.(str"Local not allowed in this case")|Somefalse,DoDischarge->CErrors.user_errPp.(str"Global not allowed in this case")letenforce_localitylocality_flag=make_localitylocality_flag(* For commands whose default is to not discharge but to export:
Global in sections forces discharge, Global not in section is the default;
Local in sections is the default, Local not in section forces non-export *)letmake_section_locality=functionSomeb->b|None->Global.sections_are_opened()letenforce_section_localitylocality_flag=make_section_localitylocality_flag(** Positioning locality for commands supporting export but not discharge *)(* For commands whose default is to export (if not in section):
Global in sections is forbidden, Global not in section is neutral;
Local in sections is the default, Local not in section forces non-export *)letmake_module_locality=function|Somefalse->ifGlobal.sections_are_opened()thenCErrors.user_errPp.(str"This command does not support the Global option in sections.");false|Sometrue->true|None->falseletenforce_module_localitylocality_flag=make_module_localitylocality_flag