1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283(************************************************************************)(* * 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|ImportNeedQualifiedtypedefinition_scope=Discharge|Globalofimport_statusletdefault_scope=GlobalImportDefaultBehaviorletimportability_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