12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485(*********************************************************************************)(* Dunolint - A tool to lint and help manage files in dune projects *)(* Copyright (C) 2024-2025 Mathieu Barbin <mathieu.barbin@gmail.com> *)(* *)(* This file is part of Dunolint. *)(* *)(* Dunolint is free software; you can redistribute it and/or modify it *)(* under the terms of the GNU Lesser General Public License as published by *)(* the Free Software Foundation either version 3 of the License, or any later *)(* version, with the LGPL-3.0 Linking Exception. *)(* *)(* Dunolint is distributed in the hope that it will be useful, but WITHOUT *)(* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or *)(* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License *)(* and the file `NOTICE.md` at the root of this repository for more details. *)(* *)(* You should have received a copy of the GNU Lesser General Public License *)(* and the LGPL-3.0 Linking Exception along with this library. If not, see *)(* <http://www.gnu.org/licenses/> and <https://spdx.org>, respectively. *)(*********************************************************************************)moduletypeS=Linter_intf.Stypet=|Unhandled|T:{eval:Dunolint.Predicate.t->Dunolint.Trilang.t;enforce:Dunolint.Predicate.tBlang.t->unit}->tletenforce_blang(typepredicate)(modulePredicate:Handler.Predicatewithtypet=predicate)t~condition~eval~enforce=match(condition:_Blang.t)with|Base_->enforcet~condition|And(a,b)->enforcet~condition:a;enforcet~condition:b|If(if_,then_,else_)->(matchDunolint.Trilang.evalif_~f:(funpredicate->evalt~predicate)with|True->enforcet~condition:then_|False->enforcet~condition:else_|Undefined->())|True->()|(False|Not_|Or_)ascondition->(matchDunolint.Trilang.evalcondition~f:(funpredicate->evalt~predicate)with|True|Undefined->()|False->Handler.enforce_failure(modulePredicate)~loc:Loc.none~condition);;letat_positive_enforcing_position(condition:'aBlang.t)=letrecloopacct=match(t:_Blang.t)with|Basea->a::acc|And(a,b)->letacc=loopaccainletacc=loopaccbinacc|If_|True|False|Not_|Or_->accinList.rev(loop[]condition);;letpublic_name_is_prefixname~prefix=(* This helps in cases where the library public name has not the
correct package prefix, in favoring a strategy that proposes to
replace it by the enforced one, rather than producing a
proposition with two dots in it. *)matchifString.is_suffixprefix~suffix:"."then(matchString.lsplit2name~on:'.'with|None->None|Some(_,right)->Some(prefix^right))elseNonewith|None->prefix^name|Someresult->result;;