From b27612db4a9f9db40b4129b2130cd1e8021160bd Mon Sep 17 00:00:00 2001 From: Alan Garny Date: Mon, 28 Sep 2026 19:36:58 +1300 Subject: [PATCH 1/7] Inline global constants and simplify issue lookup. --- src/internaltypes.h | 2 +- src/issue.cpp | 305 ++++++++++++++++++++++++-------------------- src/utilities.h | 14 +- 3 files changed, 174 insertions(+), 147 deletions(-) diff --git a/src/internaltypes.h b/src/internaltypes.h index 77d278877..4562baa05 100644 --- a/src/internaltypes.h +++ b/src/internaltypes.h @@ -27,7 +27,7 @@ limitations under the License. namespace libcellml { -const std::string ORIGIN_MODEL_REF = ":this:"; +inline const std::string ORIGIN_MODEL_REF = ":this:"; using ComponentNameMap = std::map; /**< Type definition for map of component name to component pointer. */ diff --git a/src/issue.cpp b/src/issue.cpp index da64bd978..53d3929e2 100644 --- a/src/issue.cpp +++ b/src/issue.cpp @@ -16,6 +16,10 @@ limitations under the License. #include "libcellml/issue.h" +#include +#include +#include + #include "issue_p.h" #include "utilities.h" @@ -76,169 +80,192 @@ AnyCellmlElementPtr Issue::item() const * * An internal map used to convert a Issue::ReferenceRule into its heading string. */ -static const std::map> ruleToInformation = { - {Issue::ReferenceRule::UNDEFINED, {"", "", "", ""}}, +struct RuleInformation +{ + Issue::ReferenceRule rule; + const char *name; + const char *heading; + const std::string *baseUrl; + const char *page; +}; + +static constexpr RuleInformation ruleToInformation[] = { + {Issue::ReferenceRule::UNDEFINED, "", "", nullptr, ""}, // Validation errors related to the CellML Specification: - {Issue::ReferenceRule::XML, {"XML", "1.2.1.1", baseSpecificationUrl, "specA02"}}, - {Issue::ReferenceRule::XML_UNEXPECTED_ELEMENT, {"XML_UNEXPECTED_ELEMENT", "1.2.2.2", baseSpecificationUrl, "specA02"}}, - {Issue::ReferenceRule::XML_UNEXPECTED_CHARACTER, {"XML_UNEXPECTED_CHARACTER", "1.2.3.2", baseSpecificationUrl, "specA02"}}, - {Issue::ReferenceRule::XML_UNEXPECTED_NAMESPACE, {"XML_UNEXPECTED_NAMESPACE", "1.2.4.1", baseSpecificationUrl, "specA02"}}, - {Issue::ReferenceRule::XML_ATTRIBUTE_HAS_NAMESPACE, {"XML_ATTRIBUTE_HAS_NAMESPACE", "1.2.4.2", baseSpecificationUrl, "specA02"}}, - {Issue::ReferenceRule::XML_ID_ATTRIBUTE, {"XML_ID_ATTRIBUTE", "1.2.5.1.1", baseSpecificationUrl, "specA02"}}, - {Issue::ReferenceRule::MODEL_ELEMENT, {"MODEL_ELEMENT", "2.1", baseSpecificationUrl, "specB01"}}, - {Issue::ReferenceRule::MODEL_NAME, {"MODEL_NAME", "2.1.1", baseSpecificationUrl, "specB01"}}, - {Issue::ReferenceRule::MODEL_NAME_VALUE, {"MODEL_NAME_VALUE", "2.1.1.1", baseSpecificationUrl, "specB01"}}, - {Issue::ReferenceRule::MODEL_CHILD, {"MODEL_CHILD", "2.1.2", baseSpecificationUrl, "specB01"}}, - {Issue::ReferenceRule::MODEL_MORE_THAN_ONE_ENCAPSULATION, {"MODEL_MORE_THAN_ONE_ENCAPSULATION", "2.1.3", baseSpecificationUrl, "specB01"}}, - {Issue::ReferenceRule::IMPORT_ELEMENT, {"IMPORT_ELEMENT", "2.2", baseSpecificationUrl, "specB02"}}, - {Issue::ReferenceRule::IMPORT_HREF, {"IMPORT_HREF", "2.2.1", baseSpecificationUrl, "specB02"}}, - {Issue::ReferenceRule::IMPORT_HREF_LOCATOR, {"IMPORT_HREF_LOCATOR", "2.2.1.1", baseSpecificationUrl, "specB02"}}, - {Issue::ReferenceRule::IMPORT_CHILD, {"IMPORT_CHILD", "2.2.2", baseSpecificationUrl, "specB02"}}, - {Issue::ReferenceRule::IMPORT_EQUIVALENT_INFOSET, {"IMPORT_EQUIVALENT_INFOSET", "2.2.3", baseSpecificationUrl, "specB02"}}, - {Issue::ReferenceRule::IMPORT_UNITS_ELEMENT, {"IMPORT_UNITS_ELEMENT", "2.3", baseSpecificationUrl, "specB03"}}, - {Issue::ReferenceRule::IMPORT_UNITS_NAME, {"IMPORT_UNITS_NAME", "2.3.1", baseSpecificationUrl, "specB03"}}, - {Issue::ReferenceRule::IMPORT_UNITS_NAME_VALUE, {"IMPORT_UNITS_NAME_VALUE", "2.3.1.1", baseSpecificationUrl, "specB03"}}, - {Issue::ReferenceRule::IMPORT_UNITS_NAME_UNIQUE, {"IMPORT_UNITS_NAME_UNIQUE", "2.3.1.2", baseSpecificationUrl, "specB03"}}, - {Issue::ReferenceRule::IMPORT_UNITS_UNITS_REFERENCE, {"IMPORT_UNITS_UNITS_REFERENCE", "2.3.2", baseSpecificationUrl, "specB03"}}, - {Issue::ReferenceRule::IMPORT_UNITS_UNITS_REFERENCE_VALUE, {"IMPORT_UNITS_UNITS_REFERENCE_VALUE", "2.3.2.1", baseSpecificationUrl, "specB03"}}, - {Issue::ReferenceRule::IMPORT_UNITS_UNITS_REFERENCE_VALUE_TARGET, {"IMPORT_UNITS_UNITS_REFERENCE_VALUE_TARGET", "2.3.2.2", baseSpecificationUrl, "specB03"}}, - {Issue::ReferenceRule::IMPORT_COMPONENT_ELEMENT, {"IMPORT_COMPONENT_ELEMENT", "2.4", baseSpecificationUrl, "specB04"}}, - {Issue::ReferenceRule::IMPORT_COMPONENT_NAME, {"IMPORT_COMPONENT_NAME", "2.4.1", baseSpecificationUrl, "specB04"}}, - {Issue::ReferenceRule::IMPORT_COMPONENT_NAME_VALUE, {"IMPORT_COMPONENT_NAME_VALUE", "2.4.1.1", baseSpecificationUrl, "specB04"}}, - {Issue::ReferenceRule::IMPORT_COMPONENT_NAME_UNIQUE, {"IMPORT_COMPONENT_NAME_UNIQUE", "2.4.1.2", baseSpecificationUrl, "specB04"}}, - {Issue::ReferenceRule::IMPORT_COMPONENT_COMPONENT_REFERENCE, {"IMPORT_COMPONENT_COMPONENT_REFERENCE", "2.4.2", baseSpecificationUrl, "specB04"}}, - {Issue::ReferenceRule::IMPORT_COMPONENT_COMPONENT_REFERENCE_VALUE, {"IMPORT_COMPONENT_COMPONENT_REFERENCE_VALUE", "2.4.2.1", baseSpecificationUrl, "specB04"}}, - {Issue::ReferenceRule::IMPORT_COMPONENT_COMPONENT_REFERENCE_TARGET, {"IMPORT_COMPONENT_COMPONENT_REFERENCE_TARGET", "2.4.2.2", baseSpecificationUrl, "specB04"}}, - {Issue::ReferenceRule::UNITS_ELEMENT, {"UNITS_ELEMENT", "2.5", baseSpecificationUrl, "specB05"}}, - {Issue::ReferenceRule::UNITS_NAME, {"UNITS_NAME", "2.5.1", baseSpecificationUrl, "specB05"}}, - {Issue::ReferenceRule::UNITS_NAME_VALUE, {"UNITS_NAME_VALUE", "2.5.1.1", baseSpecificationUrl, "specB05"}}, - {Issue::ReferenceRule::UNITS_NAME_UNIQUE, {"UNITS_NAME_UNIQUE", "2.5.1.2", baseSpecificationUrl, "specB05"}}, - {Issue::ReferenceRule::UNITS_STANDARD, {"UNITS_STANDARD", "2.5.2", baseSpecificationUrl, "specB05"}}, - {Issue::ReferenceRule::UNITS_CHILD, {"UNITS_CHILD", "2.5.3", baseSpecificationUrl, "specB05"}}, - {Issue::ReferenceRule::UNIT_ELEMENT, {"UNIT_ELEMENT", "2.6", baseSpecificationUrl, "specB06"}}, - {Issue::ReferenceRule::UNIT_UNITS, {"UNIT_UNITS", "2.6.1", baseSpecificationUrl, "specB06"}}, - {Issue::ReferenceRule::UNIT_UNITS_REFERENCE, {"UNIT_UNITS_REFERENCE", "2.6.1.1", baseSpecificationUrl, "specB06"}}, - {Issue::ReferenceRule::UNIT_UNITS_CIRCULAR_REFERENCE, {"UNIT_UNITS_CIRCULAR_REFERENCE", "2.6.1.3", baseSpecificationUrl, "specB06"}}, - {Issue::ReferenceRule::UNIT_ATTRIBUTE_OPTIONAL, {"UNIT_ATTRIBUTE_OPTIONAL", "2.6.2", baseSpecificationUrl, "specB06"}}, - {Issue::ReferenceRule::UNIT_ATTRIBUTE_PREFIX_VALUE, {"UNIT_ATTRIBUTE_PREFIX_VALUE", "2.6.2.1.1", baseSpecificationUrl, "specB06"}}, - {Issue::ReferenceRule::UNIT_ATTRIBUTE_MULTIPLIER_VALUE, {"UNIT_ATTRIBUTE_MULTIPLIER_VALUE", "2.6.2.2.1", baseSpecificationUrl, "specB06"}}, - {Issue::ReferenceRule::UNIT_ATTRIBUTE_EXPONENT_VALUE, {"UNIT_ATTRIBUTE_EXPONENT_VALUE", "2.6.2.3.1", baseSpecificationUrl, "specB06"}}, - {Issue::ReferenceRule::COMPONENT_ELEMENT, {"COMPONENT_ELEMENT", "2.7", baseSpecificationUrl, "specB07"}}, - {Issue::ReferenceRule::COMPONENT_NAME, {"COMPONENT_NAME", "2.7.1", baseSpecificationUrl, "specB07"}}, - {Issue::ReferenceRule::COMPONENT_NAME_VALUE, {"COMPONENT_NAME_VALUE", "2.7.1.1", baseSpecificationUrl, "specB07"}}, - {Issue::ReferenceRule::COMPONENT_NAME_UNIQUE, {"COMPONENT_NAME_UNIQUE", "2.7.1.2", baseSpecificationUrl, "specB07"}}, - {Issue::ReferenceRule::COMPONENT_CHILD, {"COMPONENT_CHILD", "2.7.2", baseSpecificationUrl, "specB07"}}, - {Issue::ReferenceRule::VARIABLE_ELEMENT, {"VARIABLE_ELEMENT", "2.8", baseSpecificationUrl, "specB08"}}, - {Issue::ReferenceRule::VARIABLE_ATTRIBUTE_REQUIRED, {"VARIABLE_ATTRIBUTE_REQUIRED", "2.8.1", baseSpecificationUrl, "specB08"}}, - {Issue::ReferenceRule::VARIABLE_NAME_VALUE, {"VARIABLE_NAME_VALUE", "2.8.1.1.1", baseSpecificationUrl, "specB08"}}, - {Issue::ReferenceRule::VARIABLE_NAME_UNIQUE, {"VARIABLE_NAME_UNIQUE", "2.8.1.1.2", baseSpecificationUrl, "specB08"}}, - {Issue::ReferenceRule::VARIABLE_UNITS_VALUE, {"VARIABLE_UNITS_VALUE", "2.8.1.2.1", baseSpecificationUrl, "specB08"}}, - {Issue::ReferenceRule::VARIABLE_ATTRIBUTE_OPTIONAL, {"VARIABLE_ATTRIBUTE_OPTIONAL", "2.8.2", baseSpecificationUrl, "specB08"}}, - {Issue::ReferenceRule::VARIABLE_INTERFACE_VALUE, {"VARIABLE_INTERFACE_VALUE", "2.8.2.1.1", baseSpecificationUrl, "specB08"}}, - {Issue::ReferenceRule::VARIABLE_INITIAL_VALUE_VALUE, {"VARIABLE_INITIAL_VALUE_VALUE", "2.8.2.2.1", baseSpecificationUrl, "specB08"}}, - {Issue::ReferenceRule::RESET_ELEMENT, {"RESET_ELEMENT", "2.9", baseSpecificationUrl, "specB09"}}, - {Issue::ReferenceRule::RESET_ATTRIBUTE_REQUIRED, {"RESET_ATTRIBUTE_REQUIRED", "2.9.1", baseSpecificationUrl, "specB09"}}, - {Issue::ReferenceRule::RESET_VARIABLE_REFERENCE, {"RESET_VARIABLE_REFERENCE", "2.9.1.1.1", baseSpecificationUrl, "specB09"}}, - {Issue::ReferenceRule::RESET_TEST_VARIABLE_REFERENCE, {"RESET_TEST_VARIABLE_REFERENCE", "2.9.1.2.1", baseSpecificationUrl, "specB09"}}, - {Issue::ReferenceRule::RESET_ORDER_VALUE, {"RESET_ORDER_VALUE", "2.9.1.3.1", baseSpecificationUrl, "specB09"}}, - {Issue::ReferenceRule::RESET_ORDER_UNIQUE, {"RESET_ORDER_UNIQUE", "2.9.1.3.2", baseSpecificationUrl, "specB09"}}, - {Issue::ReferenceRule::RESET_CHILD, {"RESET_CHILD", "2.9.2", baseSpecificationUrl, "specB09"}}, - {Issue::ReferenceRule::RESET_RESET_VALUE_CHILD, {"RESET_RESET_VALUE_CHILD", "2.9.2.1", baseSpecificationUrl, "specB09"}}, - {Issue::ReferenceRule::RESET_TEST_VALUE_CHILD, {"RESET_TEST_VALUE_CHILD", "2.9.2.2", baseSpecificationUrl, "specB09"}}, - {Issue::ReferenceRule::TEST_VALUE_ELEMENT, {"TEST_VALUE_ELEMENT", "2.10", baseSpecificationUrl, "specB10"}}, - {Issue::ReferenceRule::TEST_VALUE_CHILD, {"TEST_VALUE_CHILD", "2.10.1", baseSpecificationUrl, "specB10"}}, - {Issue::ReferenceRule::RESET_VALUE_ELEMENT, {"RESET_VALUE_ELEMENT", "2.11", baseSpecificationUrl, "specB11"}}, - {Issue::ReferenceRule::RESET_VALUE_CHILD, {"RESET_VALUE_CHILD", "2.11.1", baseSpecificationUrl, "specB11"}}, - {Issue::ReferenceRule::MATH_ELEMENT, {"MATH_ELEMENT", "2.12", baseSpecificationUrl, "specB12"}}, - {Issue::ReferenceRule::MATH_MATHML, {"MATH_MATHML", "2.12.1", baseSpecificationUrl, "specB12"}}, - {Issue::ReferenceRule::MATH_CHILD, {"MATH_CHILD", "2.12.2", baseSpecificationUrl, "specB12"}}, - {Issue::ReferenceRule::MATH_CI_VARIABLE_REFERENCE, {"MATH_CI_VARIABLE_REFERENCE", "2.12.3", baseSpecificationUrl, "specB12"}}, - {Issue::ReferenceRule::MATH_CN_UNITS_ATTRIBUTE, {"MATH_CN_UNITS_ATTRIBUTE", "2.12.4", baseSpecificationUrl, "specB12"}}, - {Issue::ReferenceRule::MATH_CN_UNITS_ATTRIBUTE_REFERENCE, {"MATH_CN_UNITS_ATTRIBUTE_REFERENCE", "2.12.4.1", baseSpecificationUrl, "specB12"}}, - {Issue::ReferenceRule::MATH_CN_BASE10, {"MATH_CN_BASE10", "2.12.5", baseSpecificationUrl, "specB12"}}, - {Issue::ReferenceRule::MATH_CN_FORMAT, {"MATH_CN_FORMAT", "2.12.5.1", baseSpecificationUrl, "specB12"}}, - {Issue::ReferenceRule::ENCAPSULATION_ELEMENT, {"ENCAPSULATION_ELEMENT", "2.13", baseSpecificationUrl, "specB13"}}, - {Issue::ReferenceRule::ENCAPSULATION_CHILD, {"ENCAPSULATION_CHILD", "2.13.1", baseSpecificationUrl, "specB13"}}, - {Issue::ReferenceRule::COMPONENT_REF_ELEMENT, {"COMPONENT_REF_ELEMENT", "2.14", baseSpecificationUrl, "specB14"}}, - {Issue::ReferenceRule::COMPONENT_REF_COMPONENT_ATTRIBUTE, {"COMPONENT_REF_COMPONENT_ATTRIBUTE", "2.14.1", baseSpecificationUrl, "specB14"}}, - {Issue::ReferenceRule::COMPONENT_REF_COMPONENT_ATTRIBUTE_REFERENCE, {"COMPONENT_REF_COMPONENT_ATTRIBUTE_REFERENCE", "2.14.1.1", baseSpecificationUrl, "specB14"}}, - {Issue::ReferenceRule::COMPONENT_REF_COMPONENT_ATTRIBUTE_UNIQUE, {"COMPONENT_REF_COMPONENT_ATTRIBUTE_UNIQUE", "2.14.1.2", baseSpecificationUrl, "specB14"}}, - {Issue::ReferenceRule::COMPONENT_REF_CHILD, {"COMPONENT_REF_CHILD", "2.14.2", baseSpecificationUrl, "specB14"}}, - {Issue::ReferenceRule::CONNECTION_ELEMENT, {"CONNECTION_ELEMENT", "2.15", baseSpecificationUrl, "specB14"}}, - {Issue::ReferenceRule::CONNECTION_COMPONENT1_ATTRIBUTE, {"CONNECTION_COMPONENT1_ATTRIBUTE", "2.15.1", baseSpecificationUrl, "specB15"}}, - {Issue::ReferenceRule::CONNECTION_COMPONENT1_ATTRIBUTE_REFERENCE, {"CONNECTION_COMPONENT1_ATTRIBUTE_REFERENCE", "2.15.1.1", baseSpecificationUrl, "specB15"}}, - {Issue::ReferenceRule::CONNECTION_COMPONENT2_ATTRIBUTE, {"CONNECTION_COMPONENT2_ATTRIBUTE", "2.15.2", baseSpecificationUrl, "specB15"}}, - {Issue::ReferenceRule::CONNECTION_COMPONENT2_ATTRIBUTE_REFERENCE, {"CONNECTION_COMPONENT2_ATTRIBUTE_REFERENCE", "2.15.2.1", baseSpecificationUrl, "specB15"}}, - {Issue::ReferenceRule::CONNECTION_EXCLUDE_SELF, {"CONNECTION_EXCLUDE_SELF", "2.15.3", baseSpecificationUrl, "specB15"}}, - {Issue::ReferenceRule::CONNECTION_UNIQUE, {"CONNECTION_UNIQUE", "2.15.4", baseSpecificationUrl, "specB15"}}, - {Issue::ReferenceRule::CONNECTION_CHILD, {"CONNECTION_CHILD", "2.15.5", baseSpecificationUrl, "specB15"}}, - {Issue::ReferenceRule::MAP_VARIABLES_ELEMENT, {"MAP_VARIABLES_ELEMENT", "2.16", baseSpecificationUrl, "specB16"}}, - {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE1_ATTRIBUTE, {"MAP_VARIABLES_VARIABLE1_ATTRIBUTE", "2.16.1", baseSpecificationUrl, "specB16"}}, - {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE1_ATTRIBUTE_REFERENCE, {"MAP_VARIABLES_VARIABLE1_ATTRIBUTE_REFERENCE", "2.16.1.1", baseSpecificationUrl, "specB16"}}, - {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE2_ATTRIBUTE, {"MAP_VARIABLES_VARIABLE2", "2.16.2", baseSpecificationUrl, "specB16"}}, - {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE2_ATTRIBUTE_REFERENCE, {"MAP_VARIABLES_VARIABLE2_ATTRIBUTE_REFERENCE", "2.16.2.1", baseSpecificationUrl, "specB16"}}, - {Issue::ReferenceRule::MAP_VARIABLES_UNIQUE, {"MAP_VARIABLES_UNIQUE", "2.16.3", baseSpecificationUrl, "specB16"}}, + {Issue::ReferenceRule::XML, "XML", "1.2.1.1", &baseSpecificationUrl, "specA02"}, + {Issue::ReferenceRule::XML_UNEXPECTED_ELEMENT, "XML_UNEXPECTED_ELEMENT", "1.2.2.2", &baseSpecificationUrl, "specA02"}, + {Issue::ReferenceRule::XML_UNEXPECTED_CHARACTER, "XML_UNEXPECTED_CHARACTER", "1.2.3.2", &baseSpecificationUrl, "specA02"}, + {Issue::ReferenceRule::XML_UNEXPECTED_NAMESPACE, "XML_UNEXPECTED_NAMESPACE", "1.2.4.1", &baseSpecificationUrl, "specA02"}, + {Issue::ReferenceRule::XML_ATTRIBUTE_HAS_NAMESPACE, "XML_ATTRIBUTE_HAS_NAMESPACE", "1.2.4.2", &baseSpecificationUrl, "specA02"}, + {Issue::ReferenceRule::XML_ID_ATTRIBUTE, "XML_ID_ATTRIBUTE", "1.2.5.1.1", &baseSpecificationUrl, "specA02"}, + {Issue::ReferenceRule::MODEL_ELEMENT, "MODEL_ELEMENT", "2.1", &baseSpecificationUrl, "specB01"}, + {Issue::ReferenceRule::MODEL_NAME, "MODEL_NAME", "2.1.1", &baseSpecificationUrl, "specB01"}, + {Issue::ReferenceRule::MODEL_NAME_VALUE, "MODEL_NAME_VALUE", "2.1.1.1", &baseSpecificationUrl, "specB01"}, + {Issue::ReferenceRule::MODEL_CHILD, "MODEL_CHILD", "2.1.2", &baseSpecificationUrl, "specB01"}, + {Issue::ReferenceRule::MODEL_MORE_THAN_ONE_ENCAPSULATION, "MODEL_MORE_THAN_ONE_ENCAPSULATION", "2.1.3", &baseSpecificationUrl, "specB01"}, + {Issue::ReferenceRule::IMPORT_ELEMENT, "IMPORT_ELEMENT", "2.2", &baseSpecificationUrl, "specB02"}, + {Issue::ReferenceRule::IMPORT_HREF, "IMPORT_HREF", "2.2.1", &baseSpecificationUrl, "specB02"}, + {Issue::ReferenceRule::IMPORT_HREF_LOCATOR, "IMPORT_HREF_LOCATOR", "2.2.1.1", &baseSpecificationUrl, "specB02"}, + {Issue::ReferenceRule::IMPORT_CHILD, "IMPORT_CHILD", "2.2.2", &baseSpecificationUrl, "specB02"}, + {Issue::ReferenceRule::IMPORT_EQUIVALENT_INFOSET, "IMPORT_EQUIVALENT_INFOSET", "2.2.3", &baseSpecificationUrl, "specB02"}, + {Issue::ReferenceRule::IMPORT_UNITS_ELEMENT, "IMPORT_UNITS_ELEMENT", "2.3", &baseSpecificationUrl, "specB03"}, + {Issue::ReferenceRule::IMPORT_UNITS_NAME, "IMPORT_UNITS_NAME", "2.3.1", &baseSpecificationUrl, "specB03"}, + {Issue::ReferenceRule::IMPORT_UNITS_NAME_VALUE, "IMPORT_UNITS_NAME_VALUE", "2.3.1.1", &baseSpecificationUrl, "specB03"}, + {Issue::ReferenceRule::IMPORT_UNITS_NAME_UNIQUE, "IMPORT_UNITS_NAME_UNIQUE", "2.3.1.2", &baseSpecificationUrl, "specB03"}, + {Issue::ReferenceRule::IMPORT_UNITS_UNITS_REFERENCE, "IMPORT_UNITS_UNITS_REFERENCE", "2.3.2", &baseSpecificationUrl, "specB03"}, + {Issue::ReferenceRule::IMPORT_UNITS_UNITS_REFERENCE_VALUE, "IMPORT_UNITS_UNITS_REFERENCE_VALUE", "2.3.2.1", &baseSpecificationUrl, "specB03"}, + {Issue::ReferenceRule::IMPORT_UNITS_UNITS_REFERENCE_VALUE_TARGET, "IMPORT_UNITS_UNITS_REFERENCE_VALUE_TARGET", "2.3.2.2", &baseSpecificationUrl, "specB03"}, + {Issue::ReferenceRule::IMPORT_COMPONENT_ELEMENT, "IMPORT_COMPONENT_ELEMENT", "2.4", &baseSpecificationUrl, "specB04"}, + {Issue::ReferenceRule::IMPORT_COMPONENT_NAME, "IMPORT_COMPONENT_NAME", "2.4.1", &baseSpecificationUrl, "specB04"}, + {Issue::ReferenceRule::IMPORT_COMPONENT_NAME_VALUE, "IMPORT_COMPONENT_NAME_VALUE", "2.4.1.1", &baseSpecificationUrl, "specB04"}, + {Issue::ReferenceRule::IMPORT_COMPONENT_NAME_UNIQUE, "IMPORT_COMPONENT_NAME_UNIQUE", "2.4.1.2", &baseSpecificationUrl, "specB04"}, + {Issue::ReferenceRule::IMPORT_COMPONENT_COMPONENT_REFERENCE, "IMPORT_COMPONENT_COMPONENT_REFERENCE", "2.4.2", &baseSpecificationUrl, "specB04"}, + {Issue::ReferenceRule::IMPORT_COMPONENT_COMPONENT_REFERENCE_VALUE, "IMPORT_COMPONENT_COMPONENT_REFERENCE_VALUE", "2.4.2.1", &baseSpecificationUrl, "specB04"}, + {Issue::ReferenceRule::IMPORT_COMPONENT_COMPONENT_REFERENCE_TARGET, "IMPORT_COMPONENT_COMPONENT_REFERENCE_TARGET", "2.4.2.2", &baseSpecificationUrl, "specB04"}, + {Issue::ReferenceRule::UNITS_ELEMENT, "UNITS_ELEMENT", "2.5", &baseSpecificationUrl, "specB05"}, + {Issue::ReferenceRule::UNITS_NAME, "UNITS_NAME", "2.5.1", &baseSpecificationUrl, "specB05"}, + {Issue::ReferenceRule::UNITS_NAME_VALUE, "UNITS_NAME_VALUE", "2.5.1.1", &baseSpecificationUrl, "specB05"}, + {Issue::ReferenceRule::UNITS_NAME_UNIQUE, "UNITS_NAME_UNIQUE", "2.5.1.2", &baseSpecificationUrl, "specB05"}, + {Issue::ReferenceRule::UNITS_STANDARD, "UNITS_STANDARD", "2.5.2", &baseSpecificationUrl, "specB05"}, + {Issue::ReferenceRule::UNITS_CHILD, "UNITS_CHILD", "2.5.3", &baseSpecificationUrl, "specB05"}, + {Issue::ReferenceRule::UNIT_ELEMENT, "UNIT_ELEMENT", "2.6", &baseSpecificationUrl, "specB06"}, + {Issue::ReferenceRule::UNIT_UNITS, "UNIT_UNITS", "2.6.1", &baseSpecificationUrl, "specB06"}, + {Issue::ReferenceRule::UNIT_UNITS_REFERENCE, "UNIT_UNITS_REFERENCE", "2.6.1.1", &baseSpecificationUrl, "specB06"}, + {Issue::ReferenceRule::UNIT_UNITS_CIRCULAR_REFERENCE, "UNIT_UNITS_CIRCULAR_REFERENCE", "2.6.1.3", &baseSpecificationUrl, "specB06"}, + {Issue::ReferenceRule::UNIT_ATTRIBUTE_OPTIONAL, "UNIT_ATTRIBUTE_OPTIONAL", "2.6.2", &baseSpecificationUrl, "specB06"}, + {Issue::ReferenceRule::UNIT_ATTRIBUTE_PREFIX_VALUE, "UNIT_ATTRIBUTE_PREFIX_VALUE", "2.6.2.1.1", &baseSpecificationUrl, "specB06"}, + {Issue::ReferenceRule::UNIT_ATTRIBUTE_MULTIPLIER_VALUE, "UNIT_ATTRIBUTE_MULTIPLIER_VALUE", "2.6.2.2.1", &baseSpecificationUrl, "specB06"}, + {Issue::ReferenceRule::UNIT_ATTRIBUTE_EXPONENT_VALUE, "UNIT_ATTRIBUTE_EXPONENT_VALUE", "2.6.2.3.1", &baseSpecificationUrl, "specB06"}, + {Issue::ReferenceRule::COMPONENT_ELEMENT, "COMPONENT_ELEMENT", "2.7", &baseSpecificationUrl, "specB07"}, + {Issue::ReferenceRule::COMPONENT_NAME, "COMPONENT_NAME", "2.7.1", &baseSpecificationUrl, "specB07"}, + {Issue::ReferenceRule::COMPONENT_NAME_VALUE, "COMPONENT_NAME_VALUE", "2.7.1.1", &baseSpecificationUrl, "specB07"}, + {Issue::ReferenceRule::COMPONENT_NAME_UNIQUE, "COMPONENT_NAME_UNIQUE", "2.7.1.2", &baseSpecificationUrl, "specB07"}, + {Issue::ReferenceRule::COMPONENT_CHILD, "COMPONENT_CHILD", "2.7.2", &baseSpecificationUrl, "specB07"}, + {Issue::ReferenceRule::VARIABLE_ELEMENT, "VARIABLE_ELEMENT", "2.8", &baseSpecificationUrl, "specB08"}, + {Issue::ReferenceRule::VARIABLE_ATTRIBUTE_REQUIRED, "VARIABLE_ATTRIBUTE_REQUIRED", "2.8.1", &baseSpecificationUrl, "specB08"}, + {Issue::ReferenceRule::VARIABLE_NAME_VALUE, "VARIABLE_NAME_VALUE", "2.8.1.1.1", &baseSpecificationUrl, "specB08"}, + {Issue::ReferenceRule::VARIABLE_NAME_UNIQUE, "VARIABLE_NAME_UNIQUE", "2.8.1.1.2", &baseSpecificationUrl, "specB08"}, + {Issue::ReferenceRule::VARIABLE_UNITS_VALUE, "VARIABLE_UNITS_VALUE", "2.8.1.2.1", &baseSpecificationUrl, "specB08"}, + {Issue::ReferenceRule::VARIABLE_ATTRIBUTE_OPTIONAL, "VARIABLE_ATTRIBUTE_OPTIONAL", "2.8.2", &baseSpecificationUrl, "specB08"}, + {Issue::ReferenceRule::VARIABLE_INTERFACE_VALUE, "VARIABLE_INTERFACE_VALUE", "2.8.2.1.1", &baseSpecificationUrl, "specB08"}, + {Issue::ReferenceRule::VARIABLE_INITIAL_VALUE_VALUE, "VARIABLE_INITIAL_VALUE_VALUE", "2.8.2.2.1", &baseSpecificationUrl, "specB08"}, + {Issue::ReferenceRule::RESET_ELEMENT, "RESET_ELEMENT", "2.9", &baseSpecificationUrl, "specB09"}, + {Issue::ReferenceRule::RESET_ATTRIBUTE_REQUIRED, "RESET_ATTRIBUTE_REQUIRED", "2.9.1", &baseSpecificationUrl, "specB09"}, + {Issue::ReferenceRule::RESET_VARIABLE_REFERENCE, "RESET_VARIABLE_REFERENCE", "2.9.1.1.1", &baseSpecificationUrl, "specB09"}, + {Issue::ReferenceRule::RESET_TEST_VARIABLE_REFERENCE, "RESET_TEST_VARIABLE_REFERENCE", "2.9.1.2.1", &baseSpecificationUrl, "specB09"}, + {Issue::ReferenceRule::RESET_ORDER_VALUE, "RESET_ORDER_VALUE", "2.9.1.3.1", &baseSpecificationUrl, "specB09"}, + {Issue::ReferenceRule::RESET_ORDER_UNIQUE, "RESET_ORDER_UNIQUE", "2.9.1.3.2", &baseSpecificationUrl, "specB09"}, + {Issue::ReferenceRule::RESET_CHILD, "RESET_CHILD", "2.9.2", &baseSpecificationUrl, "specB09"}, + {Issue::ReferenceRule::RESET_RESET_VALUE_CHILD, "RESET_RESET_VALUE_CHILD", "2.9.2.1", &baseSpecificationUrl, "specB09"}, + {Issue::ReferenceRule::RESET_TEST_VALUE_CHILD, "RESET_TEST_VALUE_CHILD", "2.9.2.2", &baseSpecificationUrl, "specB09"}, + {Issue::ReferenceRule::TEST_VALUE_ELEMENT, "TEST_VALUE_ELEMENT", "2.10", &baseSpecificationUrl, "specB10"}, + {Issue::ReferenceRule::TEST_VALUE_CHILD, "TEST_VALUE_CHILD", "2.10.1", &baseSpecificationUrl, "specB10"}, + {Issue::ReferenceRule::RESET_VALUE_ELEMENT, "RESET_VALUE_ELEMENT", "2.11", &baseSpecificationUrl, "specB11"}, + {Issue::ReferenceRule::RESET_VALUE_CHILD, "RESET_VALUE_CHILD", "2.11.1", &baseSpecificationUrl, "specB11"}, + {Issue::ReferenceRule::MATH_ELEMENT, "MATH_ELEMENT", "2.12", &baseSpecificationUrl, "specB12"}, + {Issue::ReferenceRule::MATH_MATHML, "MATH_MATHML", "2.12.1", &baseSpecificationUrl, "specB12"}, + {Issue::ReferenceRule::MATH_CHILD, "MATH_CHILD", "2.12.2", &baseSpecificationUrl, "specB12"}, + {Issue::ReferenceRule::MATH_CI_VARIABLE_REFERENCE, "MATH_CI_VARIABLE_REFERENCE", "2.12.3", &baseSpecificationUrl, "specB12"}, + {Issue::ReferenceRule::MATH_CN_UNITS_ATTRIBUTE, "MATH_CN_UNITS_ATTRIBUTE", "2.12.4", &baseSpecificationUrl, "specB12"}, + {Issue::ReferenceRule::MATH_CN_UNITS_ATTRIBUTE_REFERENCE, "MATH_CN_UNITS_ATTRIBUTE_REFERENCE", "2.12.4.1", &baseSpecificationUrl, "specB12"}, + {Issue::ReferenceRule::MATH_CN_BASE10, "MATH_CN_BASE10", "2.12.5", &baseSpecificationUrl, "specB12"}, + {Issue::ReferenceRule::MATH_CN_FORMAT, "MATH_CN_FORMAT", "2.12.5.1", &baseSpecificationUrl, "specB12"}, + {Issue::ReferenceRule::ENCAPSULATION_ELEMENT, "ENCAPSULATION_ELEMENT", "2.13", &baseSpecificationUrl, "specB13"}, + {Issue::ReferenceRule::ENCAPSULATION_CHILD, "ENCAPSULATION_CHILD", "2.13.1", &baseSpecificationUrl, "specB13"}, + {Issue::ReferenceRule::COMPONENT_REF_ELEMENT, "COMPONENT_REF_ELEMENT", "2.14", &baseSpecificationUrl, "specB14"}, + {Issue::ReferenceRule::COMPONENT_REF_COMPONENT_ATTRIBUTE, "COMPONENT_REF_COMPONENT_ATTRIBUTE", "2.14.1", &baseSpecificationUrl, "specB14"}, + {Issue::ReferenceRule::COMPONENT_REF_COMPONENT_ATTRIBUTE_REFERENCE, "COMPONENT_REF_COMPONENT_ATTRIBUTE_REFERENCE", "2.14.1.1", &baseSpecificationUrl, "specB14"}, + {Issue::ReferenceRule::COMPONENT_REF_COMPONENT_ATTRIBUTE_UNIQUE, "COMPONENT_REF_COMPONENT_ATTRIBUTE_UNIQUE", "2.14.1.2", &baseSpecificationUrl, "specB14"}, + {Issue::ReferenceRule::COMPONENT_REF_CHILD, "COMPONENT_REF_CHILD", "2.14.2", &baseSpecificationUrl, "specB14"}, + {Issue::ReferenceRule::CONNECTION_ELEMENT, "CONNECTION_ELEMENT", "2.15", &baseSpecificationUrl, "specB14"}, + {Issue::ReferenceRule::CONNECTION_COMPONENT1_ATTRIBUTE, "CONNECTION_COMPONENT1_ATTRIBUTE", "2.15.1", &baseSpecificationUrl, "specB15"}, + {Issue::ReferenceRule::CONNECTION_COMPONENT1_ATTRIBUTE_REFERENCE, "CONNECTION_COMPONENT1_ATTRIBUTE_REFERENCE", "2.15.1.1", &baseSpecificationUrl, "specB15"}, + {Issue::ReferenceRule::CONNECTION_COMPONENT2_ATTRIBUTE, "CONNECTION_COMPONENT2_ATTRIBUTE", "2.15.2", &baseSpecificationUrl, "specB15"}, + {Issue::ReferenceRule::CONNECTION_COMPONENT2_ATTRIBUTE_REFERENCE, "CONNECTION_COMPONENT2_ATTRIBUTE_REFERENCE", "2.15.2.1", &baseSpecificationUrl, "specB15"}, + {Issue::ReferenceRule::CONNECTION_EXCLUDE_SELF, "CONNECTION_EXCLUDE_SELF", "2.15.3", &baseSpecificationUrl, "specB15"}, + {Issue::ReferenceRule::CONNECTION_UNIQUE, "CONNECTION_UNIQUE", "2.15.4", &baseSpecificationUrl, "specB15"}, + {Issue::ReferenceRule::CONNECTION_CHILD, "CONNECTION_CHILD", "2.15.5", &baseSpecificationUrl, "specB15"}, + {Issue::ReferenceRule::MAP_VARIABLES_ELEMENT, "MAP_VARIABLES_ELEMENT", "2.16", &baseSpecificationUrl, "specB16"}, + {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE1_ATTRIBUTE, "MAP_VARIABLES_VARIABLE1_ATTRIBUTE", "2.16.1", &baseSpecificationUrl, "specB16"}, + {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE1_ATTRIBUTE_REFERENCE, "MAP_VARIABLES_VARIABLE1_ATTRIBUTE_REFERENCE", "2.16.1.1", &baseSpecificationUrl, "specB16"}, + {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE2_ATTRIBUTE, "MAP_VARIABLES_VARIABLE2", "2.16.2", &baseSpecificationUrl, "specB16"}, + {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE2_ATTRIBUTE_REFERENCE, "MAP_VARIABLES_VARIABLE2_ATTRIBUTE_REFERENCE", "2.16.2.1", &baseSpecificationUrl, "specB16"}, + {Issue::ReferenceRule::MAP_VARIABLES_UNIQUE, "MAP_VARIABLES_UNIQUE", "2.16.3", &baseSpecificationUrl, "specB16"}, // Secondary specification rules: - {Issue::ReferenceRule::DATA_REPR_IDENTIFIER_AT_LEAST_ONE_ALPHANUM, {"DATA_REPR_IDENTIFIER_AT_LEAST_ONE_ALPHANUM", "1.3.1.1", baseSpecificationUrl, "specA03"}}, - {Issue::ReferenceRule::DATA_REPR_IDENTIFIER_BEGIN_EURO_NUM, {"DATA_REPR_IDENTIFIER_BEGIN_EURO_NUM", "1.3.1.1", baseSpecificationUrl, "specA03"}}, - {Issue::ReferenceRule::DATA_REPR_IDENTIFIER_LATIN_ALPHANUM, {"DATA_REPR_IDENTIFIER_LATIN_ALPHANUM", "1.3.1.1", baseSpecificationUrl, "specA03"}}, + {Issue::ReferenceRule::DATA_REPR_IDENTIFIER_AT_LEAST_ONE_ALPHANUM, "DATA_REPR_IDENTIFIER_AT_LEAST_ONE_ALPHANUM", "1.3.1.1", &baseSpecificationUrl, "specA03"}, + {Issue::ReferenceRule::DATA_REPR_IDENTIFIER_BEGIN_EURO_NUM, "DATA_REPR_IDENTIFIER_BEGIN_EURO_NUM", "1.3.1.1", &baseSpecificationUrl, "specA03"}, + {Issue::ReferenceRule::DATA_REPR_IDENTIFIER_LATIN_ALPHANUM, "DATA_REPR_IDENTIFIER_LATIN_ALPHANUM", "1.3.1.1", &baseSpecificationUrl, "specA03"}, // Not in normative specification: - {Issue::ReferenceRule::INVALID_ARGUMENT, {"INVALID_ARGUMENT", "", docsUrl, ""}}, + {Issue::ReferenceRule::INVALID_ARGUMENT, "INVALID_ARGUMENT", "", &docsUrl, ""}, // Importer class issues: - {Issue::ReferenceRule::IMPORTER_ERROR_IMPORTING_UNITS, {"IMPORTER_ERROR_IMPORTING_UNITS", "", docsUrl, ""}}, - {Issue::ReferenceRule::IMPORTER_MISSING_FILE, {"IMPORTER_MISSING_FILE", "", docsUrl, ""}}, - {Issue::ReferenceRule::IMPORTER_MISSING_COMPONENT, {"IMPORTER_MISSING_COMPONENT", "", docsUrl, ""}}, - {Issue::ReferenceRule::IMPORTER_MISSING_UNITS, {"IMPORTER_MISSING_UNITS", "", docsUrl, ""}}, - {Issue::ReferenceRule::IMPORTER_NULL_MODEL, {"IMPORTER_NULL_MODEL", "", docsUrl, ""}}, - {Issue::ReferenceRule::IMPORTER_UNDEFINED_MODEL, {"IMPORTER_UNDEFINED_MODEL", "", docsUrl, ""}}, - {Issue::ReferenceRule::IMPORTER_UNRESOLVED_IMPORTS, {"IMPORTER_UNRESOLVED_IMPORTS", "", docsUrl, ""}}, + {Issue::ReferenceRule::IMPORTER_ERROR_IMPORTING_UNITS, "IMPORTER_ERROR_IMPORTING_UNITS", "", &docsUrl, ""}, + {Issue::ReferenceRule::IMPORTER_MISSING_FILE, "IMPORTER_MISSING_FILE", "", &docsUrl, ""}, + {Issue::ReferenceRule::IMPORTER_MISSING_COMPONENT, "IMPORTER_MISSING_COMPONENT", "", &docsUrl, ""}, + {Issue::ReferenceRule::IMPORTER_MISSING_UNITS, "IMPORTER_MISSING_UNITS", "", &docsUrl, ""}, + {Issue::ReferenceRule::IMPORTER_NULL_MODEL, "IMPORTER_NULL_MODEL", "", &docsUrl, ""}, + {Issue::ReferenceRule::IMPORTER_UNDEFINED_MODEL, "IMPORTER_UNDEFINED_MODEL", "", &docsUrl, ""}, + {Issue::ReferenceRule::IMPORTER_UNRESOLVED_IMPORTS, "IMPORTER_UNRESOLVED_IMPORTS", "", &docsUrl, ""}, // Analyser issues: - {Issue::ReferenceRule::ANALYSER_EQUATION_NOT_EQUALITY_STATEMENT, {"ANALYSER_EQUATION_NOT_EQUALITY_STATEMENT", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_UNITS, {"ANALYSER_UNITS", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_UNLINKED_UNITS, {"ANALYSER_UNLINKED_UNITS", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_VARIABLE_INITIALISED_MORE_THAN_ONCE, {"ANALYSER_VARIABLE_INITIALISED_MORE_THAN_ONCE", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_VARIABLE_INITIALISED_USING_ALGEBRAIC_VARIABLE, {"ANALYSER_VARIABLE_INITIALISED_USING_ALGEBRAIC_VARIABLE", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_VARIABLE_INITIALISED_USING_VARIABLE_WITH_DIFFERENT_UNITS, {"ANALYSER_VARIABLE_INITIALISED_USING_VARIABLE_WITH_DIFFERENT_UNITS", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_VOI_INITIALISED, {"ANALYSER_VOI_INITIALISED", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_VOI_SEVERAL, {"ANALYSER_VOI_SEVERAL", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_ODE_NOT_FIRST_ORDER, {"ANALYSER_ODE_NOT_FIRST_ORDER", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_VARIABLE_UNUSED, {"ANALYSER_VARIABLE_UNUSED", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_STATE_NOT_INITIALISED, {"ANALYSER_STATE_NOT_INITIALISED", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_STATE_RATE_AS_ALGEBRAIC_VARIABLE, {"ANALYSER_STATE_RATE_AS_ALGEBRAIC_VARIABLE", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_VARIABLE_UNDERCONSTRAINED, {"ANALYSER_VARIABLE_UNDERCONSTRAINED", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_VARIABLE_OVERCONSTRAINED, {"ANALYSER_VARIABLE_OVERCONSTRAINED", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_EXTERNAL_VARIABLE_DIFFERENT_MODEL, {"ANALYSER_EXTERNAL_VARIABLE_DIFFERENT_MODEL", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_EXTERNAL_VARIABLE_VOI, {"ANALYSER_EXTERNAL_VARIABLE_VOI", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_EXTERNAL_VARIABLE_USE_PRIMARY_VARIABLE, {"ANALYSER_EXTERNAL_VARIABLE_USE_PRIMARY_VARIABLE", "", docsUrl, ""}}, + {Issue::ReferenceRule::ANALYSER_EQUATION_NOT_EQUALITY_STATEMENT, "ANALYSER_EQUATION_NOT_EQUALITY_STATEMENT", "", &docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_UNITS, "ANALYSER_UNITS", "", &docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_UNLINKED_UNITS, "ANALYSER_UNLINKED_UNITS", "", &docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_VARIABLE_INITIALISED_MORE_THAN_ONCE, "ANALYSER_VARIABLE_INITIALISED_MORE_THAN_ONCE", "", &docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_VARIABLE_INITIALISED_USING_ALGEBRAIC_VARIABLE, "ANALYSER_VARIABLE_INITIALISED_USING_ALGEBRAIC_VARIABLE", "", &docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_VARIABLE_INITIALISED_USING_VARIABLE_WITH_DIFFERENT_UNITS, "ANALYSER_VARIABLE_INITIALISED_USING_VARIABLE_WITH_DIFFERENT_UNITS", "", &docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_VOI_INITIALISED, "ANALYSER_VOI_INITIALISED", "", &docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_VOI_SEVERAL, "ANALYSER_VOI_SEVERAL", "", &docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_ODE_NOT_FIRST_ORDER, "ANALYSER_ODE_NOT_FIRST_ORDER", "", &docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_VARIABLE_UNUSED, "ANALYSER_VARIABLE_UNUSED", "", &docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_STATE_NOT_INITIALISED, "ANALYSER_STATE_NOT_INITIALISED", "", &docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_STATE_RATE_AS_ALGEBRAIC_VARIABLE, "ANALYSER_STATE_RATE_AS_ALGEBRAIC_VARIABLE", "", &docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_VARIABLE_UNDERCONSTRAINED, "ANALYSER_VARIABLE_UNDERCONSTRAINED", "", &docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_VARIABLE_OVERCONSTRAINED, "ANALYSER_VARIABLE_OVERCONSTRAINED", "", &docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_EXTERNAL_VARIABLE_DIFFERENT_MODEL, "ANALYSER_EXTERNAL_VARIABLE_DIFFERENT_MODEL", "", &docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_EXTERNAL_VARIABLE_VOI, "ANALYSER_EXTERNAL_VARIABLE_VOI", "", &docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_EXTERNAL_VARIABLE_USE_PRIMARY_VARIABLE, "ANALYSER_EXTERNAL_VARIABLE_USE_PRIMARY_VARIABLE", "", &docsUrl, ""}, // Annotator issues: - {Issue::ReferenceRule::ANNOTATOR_ID_NOT_FOUND, {"ANNOTATOR_ID_NOT_FOUND", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANNOTATOR_ID_NOT_UNIQUE, {"ANNOTATOR_ID_NOT_UNIQUE", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANNOTATOR_NO_MODEL, {"ANNOTATOR_NO_MODEL", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANNOTATOR_INCONSISTENT_TYPE, {"ANNOTATOR_INCONSISTENT_TYPE", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANNOTATOR_NULL_MODEL, {"ANNOTATOR_NULL_MODEL", "", docsUrl, ""}}, + {Issue::ReferenceRule::ANNOTATOR_ID_NOT_FOUND, "ANNOTATOR_ID_NOT_FOUND", "", &docsUrl, ""}, + {Issue::ReferenceRule::ANNOTATOR_ID_NOT_UNIQUE, "ANNOTATOR_ID_NOT_UNIQUE", "", &docsUrl, ""}, + {Issue::ReferenceRule::ANNOTATOR_NO_MODEL, "ANNOTATOR_NO_MODEL", "", &docsUrl, ""}, + {Issue::ReferenceRule::ANNOTATOR_INCONSISTENT_TYPE, "ANNOTATOR_INCONSISTENT_TYPE", "", &docsUrl, ""}, + {Issue::ReferenceRule::ANNOTATOR_NULL_MODEL, "ANNOTATOR_NULL_MODEL", "", &docsUrl, ""}, }; +static const RuleInformation &ruleInformation(Issue::ReferenceRule rule) +{ + auto res = std::find_if(std::begin(ruleToInformation), std::end(ruleToInformation), [rule](const RuleInformation &information) { + return information.rule == rule; + }); + + if (res == std::end(ruleToInformation)) { + throw std::out_of_range("Unknown reference rule."); + } + + return *res; +} + std::string Issue::referenceHeading() const { - return ruleToInformation.at(referenceRule())[1]; + return ruleInformation(referenceRule()).heading; } std::string Issue::url() const { - auto search = ruleToInformation.at(referenceRule()); + const auto &information = ruleInformation(referenceRule()); + std::string baseUrl = (information.baseUrl != nullptr) ? *information.baseUrl : ""; - if (search[1].empty()) { - return search[2] + "?issue=" + search[0]; + if (*information.heading == '\0') { + return baseUrl + "?issue=" + information.name; } - return search[2] + search[3] + ".html?issue=" + search[0]; + return baseUrl + information.page + ".html?issue=" + information.name; } } // namespace libcellml diff --git a/src/utilities.h b/src/utilities.h index 888447f1f..4e9332242 100644 --- a/src/utilities.h +++ b/src/utilities.h @@ -34,15 +34,15 @@ namespace libcellml { /** * Base URLs of sites from which Issue::url() strings will be constructed. */ -static const std::string baseSpecificationUrl = "https://cellml-specification.readthedocs.io/en/latest/reference/formal_and_informative/"; -static const std::string docsUrl = "https://libcellml.org/documentation/guides/latest/runtime_codes/index"; +inline const std::string baseSpecificationUrl = "https://cellml-specification.readthedocs.io/en/latest/reference/formal_and_informative/"; +inline const std::string docsUrl = "https://libcellml.org/documentation/guides/latest/runtime_codes/index"; static const size_t MAX_SIZE_T = std::numeric_limits::max(); /** * Vector of base units. */ -static const NameList baseUnitsList = { +inline const NameList baseUnitsList = { "ampere", "candela", "dimensionless", @@ -55,7 +55,7 @@ static const NameList baseUnitsList = { /** * Map connecting standard built-in units to their base unit components and their exponents. */ -static const std::map> standardUnitsList = { +inline const std::map> standardUnitsList = { {"ampere", {{"ampere", 1.0}}}, {"becquerel", {{"second", -1.0}}}, {"candela", {{"candela", 1.0}}}, @@ -91,7 +91,7 @@ static const std::map> standardUnitsL /** * Map connecting standard built-in units to the multiplier exponent of their base unit components. */ -static const std::map standardMultiplierList = { +inline const std::map standardMultiplierList = { {"ampere", 0.0}, {"becquerel", 0.0}, {"candela", 0.0}, @@ -127,7 +127,7 @@ static const std::map standardMultiplierList = { /** * List of MathML elements supported by CellML. */ -static const NameList supportedMathMLElements = { +inline const NameList supportedMathMLElements = { "ci", "cn", "sep", "apply", "piecewise", "piece", "otherwise", "eq", "neq", "gt", "lt", "geq", "leq", "and", "or", "xor", "not", "plus", "minus", "times", "divide", "power", "root", "abs", "exp", "ln", "log", "floor", "ceiling", "min", "max", "rem", "diff", "bvar", "logbase", "degree", "sin", "cos", "tan", "sec", "csc", @@ -140,7 +140,7 @@ static const NameList supportedMathMLElements = { * * An internal map used to convert a Variable InterfaceType enum class member into its string form. */ -static const std::map interfaceTypeToString = { +inline const std::map interfaceTypeToString = { {Variable::InterfaceType::NONE, "none"}, {Variable::InterfaceType::PRIVATE, "private"}, {Variable::InterfaceType::PUBLIC, "public"}, From a19ec30c7ba9e9704ec394a35c010ef7758b965f Mon Sep 17 00:00:00 2001 From: Alan Garny Date: Mon, 28 Sep 2026 22:21:09 +1300 Subject: [PATCH 2/7] Simplified issue reference URL metadata. --- src/issue.cpp | 281 ++++++++++++++++++++++++------------------------ src/utilities.h | 4 +- 2 files changed, 140 insertions(+), 145 deletions(-) diff --git a/src/issue.cpp b/src/issue.cpp index 53d3929e2..c69cb2c7b 100644 --- a/src/issue.cpp +++ b/src/issue.cpp @@ -18,7 +18,6 @@ limitations under the License. #include #include -#include #include "issue_p.h" #include "utilities.h" @@ -85,170 +84,166 @@ struct RuleInformation Issue::ReferenceRule rule; const char *name; const char *heading; - const std::string *baseUrl; + const char *baseUrl; const char *page; }; static constexpr RuleInformation ruleToInformation[] = { - {Issue::ReferenceRule::UNDEFINED, "", "", nullptr, ""}, + {Issue::ReferenceRule::UNDEFINED, "", "", "", ""}, // Validation errors related to the CellML Specification: - {Issue::ReferenceRule::XML, "XML", "1.2.1.1", &baseSpecificationUrl, "specA02"}, - {Issue::ReferenceRule::XML_UNEXPECTED_ELEMENT, "XML_UNEXPECTED_ELEMENT", "1.2.2.2", &baseSpecificationUrl, "specA02"}, - {Issue::ReferenceRule::XML_UNEXPECTED_CHARACTER, "XML_UNEXPECTED_CHARACTER", "1.2.3.2", &baseSpecificationUrl, "specA02"}, - {Issue::ReferenceRule::XML_UNEXPECTED_NAMESPACE, "XML_UNEXPECTED_NAMESPACE", "1.2.4.1", &baseSpecificationUrl, "specA02"}, - {Issue::ReferenceRule::XML_ATTRIBUTE_HAS_NAMESPACE, "XML_ATTRIBUTE_HAS_NAMESPACE", "1.2.4.2", &baseSpecificationUrl, "specA02"}, - {Issue::ReferenceRule::XML_ID_ATTRIBUTE, "XML_ID_ATTRIBUTE", "1.2.5.1.1", &baseSpecificationUrl, "specA02"}, - {Issue::ReferenceRule::MODEL_ELEMENT, "MODEL_ELEMENT", "2.1", &baseSpecificationUrl, "specB01"}, - {Issue::ReferenceRule::MODEL_NAME, "MODEL_NAME", "2.1.1", &baseSpecificationUrl, "specB01"}, - {Issue::ReferenceRule::MODEL_NAME_VALUE, "MODEL_NAME_VALUE", "2.1.1.1", &baseSpecificationUrl, "specB01"}, - {Issue::ReferenceRule::MODEL_CHILD, "MODEL_CHILD", "2.1.2", &baseSpecificationUrl, "specB01"}, - {Issue::ReferenceRule::MODEL_MORE_THAN_ONE_ENCAPSULATION, "MODEL_MORE_THAN_ONE_ENCAPSULATION", "2.1.3", &baseSpecificationUrl, "specB01"}, - {Issue::ReferenceRule::IMPORT_ELEMENT, "IMPORT_ELEMENT", "2.2", &baseSpecificationUrl, "specB02"}, - {Issue::ReferenceRule::IMPORT_HREF, "IMPORT_HREF", "2.2.1", &baseSpecificationUrl, "specB02"}, - {Issue::ReferenceRule::IMPORT_HREF_LOCATOR, "IMPORT_HREF_LOCATOR", "2.2.1.1", &baseSpecificationUrl, "specB02"}, - {Issue::ReferenceRule::IMPORT_CHILD, "IMPORT_CHILD", "2.2.2", &baseSpecificationUrl, "specB02"}, - {Issue::ReferenceRule::IMPORT_EQUIVALENT_INFOSET, "IMPORT_EQUIVALENT_INFOSET", "2.2.3", &baseSpecificationUrl, "specB02"}, - {Issue::ReferenceRule::IMPORT_UNITS_ELEMENT, "IMPORT_UNITS_ELEMENT", "2.3", &baseSpecificationUrl, "specB03"}, - {Issue::ReferenceRule::IMPORT_UNITS_NAME, "IMPORT_UNITS_NAME", "2.3.1", &baseSpecificationUrl, "specB03"}, - {Issue::ReferenceRule::IMPORT_UNITS_NAME_VALUE, "IMPORT_UNITS_NAME_VALUE", "2.3.1.1", &baseSpecificationUrl, "specB03"}, - {Issue::ReferenceRule::IMPORT_UNITS_NAME_UNIQUE, "IMPORT_UNITS_NAME_UNIQUE", "2.3.1.2", &baseSpecificationUrl, "specB03"}, - {Issue::ReferenceRule::IMPORT_UNITS_UNITS_REFERENCE, "IMPORT_UNITS_UNITS_REFERENCE", "2.3.2", &baseSpecificationUrl, "specB03"}, - {Issue::ReferenceRule::IMPORT_UNITS_UNITS_REFERENCE_VALUE, "IMPORT_UNITS_UNITS_REFERENCE_VALUE", "2.3.2.1", &baseSpecificationUrl, "specB03"}, - {Issue::ReferenceRule::IMPORT_UNITS_UNITS_REFERENCE_VALUE_TARGET, "IMPORT_UNITS_UNITS_REFERENCE_VALUE_TARGET", "2.3.2.2", &baseSpecificationUrl, "specB03"}, - {Issue::ReferenceRule::IMPORT_COMPONENT_ELEMENT, "IMPORT_COMPONENT_ELEMENT", "2.4", &baseSpecificationUrl, "specB04"}, - {Issue::ReferenceRule::IMPORT_COMPONENT_NAME, "IMPORT_COMPONENT_NAME", "2.4.1", &baseSpecificationUrl, "specB04"}, - {Issue::ReferenceRule::IMPORT_COMPONENT_NAME_VALUE, "IMPORT_COMPONENT_NAME_VALUE", "2.4.1.1", &baseSpecificationUrl, "specB04"}, - {Issue::ReferenceRule::IMPORT_COMPONENT_NAME_UNIQUE, "IMPORT_COMPONENT_NAME_UNIQUE", "2.4.1.2", &baseSpecificationUrl, "specB04"}, - {Issue::ReferenceRule::IMPORT_COMPONENT_COMPONENT_REFERENCE, "IMPORT_COMPONENT_COMPONENT_REFERENCE", "2.4.2", &baseSpecificationUrl, "specB04"}, - {Issue::ReferenceRule::IMPORT_COMPONENT_COMPONENT_REFERENCE_VALUE, "IMPORT_COMPONENT_COMPONENT_REFERENCE_VALUE", "2.4.2.1", &baseSpecificationUrl, "specB04"}, - {Issue::ReferenceRule::IMPORT_COMPONENT_COMPONENT_REFERENCE_TARGET, "IMPORT_COMPONENT_COMPONENT_REFERENCE_TARGET", "2.4.2.2", &baseSpecificationUrl, "specB04"}, - {Issue::ReferenceRule::UNITS_ELEMENT, "UNITS_ELEMENT", "2.5", &baseSpecificationUrl, "specB05"}, - {Issue::ReferenceRule::UNITS_NAME, "UNITS_NAME", "2.5.1", &baseSpecificationUrl, "specB05"}, - {Issue::ReferenceRule::UNITS_NAME_VALUE, "UNITS_NAME_VALUE", "2.5.1.1", &baseSpecificationUrl, "specB05"}, - {Issue::ReferenceRule::UNITS_NAME_UNIQUE, "UNITS_NAME_UNIQUE", "2.5.1.2", &baseSpecificationUrl, "specB05"}, - {Issue::ReferenceRule::UNITS_STANDARD, "UNITS_STANDARD", "2.5.2", &baseSpecificationUrl, "specB05"}, - {Issue::ReferenceRule::UNITS_CHILD, "UNITS_CHILD", "2.5.3", &baseSpecificationUrl, "specB05"}, - {Issue::ReferenceRule::UNIT_ELEMENT, "UNIT_ELEMENT", "2.6", &baseSpecificationUrl, "specB06"}, - {Issue::ReferenceRule::UNIT_UNITS, "UNIT_UNITS", "2.6.1", &baseSpecificationUrl, "specB06"}, - {Issue::ReferenceRule::UNIT_UNITS_REFERENCE, "UNIT_UNITS_REFERENCE", "2.6.1.1", &baseSpecificationUrl, "specB06"}, - {Issue::ReferenceRule::UNIT_UNITS_CIRCULAR_REFERENCE, "UNIT_UNITS_CIRCULAR_REFERENCE", "2.6.1.3", &baseSpecificationUrl, "specB06"}, - {Issue::ReferenceRule::UNIT_ATTRIBUTE_OPTIONAL, "UNIT_ATTRIBUTE_OPTIONAL", "2.6.2", &baseSpecificationUrl, "specB06"}, - {Issue::ReferenceRule::UNIT_ATTRIBUTE_PREFIX_VALUE, "UNIT_ATTRIBUTE_PREFIX_VALUE", "2.6.2.1.1", &baseSpecificationUrl, "specB06"}, - {Issue::ReferenceRule::UNIT_ATTRIBUTE_MULTIPLIER_VALUE, "UNIT_ATTRIBUTE_MULTIPLIER_VALUE", "2.6.2.2.1", &baseSpecificationUrl, "specB06"}, - {Issue::ReferenceRule::UNIT_ATTRIBUTE_EXPONENT_VALUE, "UNIT_ATTRIBUTE_EXPONENT_VALUE", "2.6.2.3.1", &baseSpecificationUrl, "specB06"}, - {Issue::ReferenceRule::COMPONENT_ELEMENT, "COMPONENT_ELEMENT", "2.7", &baseSpecificationUrl, "specB07"}, - {Issue::ReferenceRule::COMPONENT_NAME, "COMPONENT_NAME", "2.7.1", &baseSpecificationUrl, "specB07"}, - {Issue::ReferenceRule::COMPONENT_NAME_VALUE, "COMPONENT_NAME_VALUE", "2.7.1.1", &baseSpecificationUrl, "specB07"}, - {Issue::ReferenceRule::COMPONENT_NAME_UNIQUE, "COMPONENT_NAME_UNIQUE", "2.7.1.2", &baseSpecificationUrl, "specB07"}, - {Issue::ReferenceRule::COMPONENT_CHILD, "COMPONENT_CHILD", "2.7.2", &baseSpecificationUrl, "specB07"}, - {Issue::ReferenceRule::VARIABLE_ELEMENT, "VARIABLE_ELEMENT", "2.8", &baseSpecificationUrl, "specB08"}, - {Issue::ReferenceRule::VARIABLE_ATTRIBUTE_REQUIRED, "VARIABLE_ATTRIBUTE_REQUIRED", "2.8.1", &baseSpecificationUrl, "specB08"}, - {Issue::ReferenceRule::VARIABLE_NAME_VALUE, "VARIABLE_NAME_VALUE", "2.8.1.1.1", &baseSpecificationUrl, "specB08"}, - {Issue::ReferenceRule::VARIABLE_NAME_UNIQUE, "VARIABLE_NAME_UNIQUE", "2.8.1.1.2", &baseSpecificationUrl, "specB08"}, - {Issue::ReferenceRule::VARIABLE_UNITS_VALUE, "VARIABLE_UNITS_VALUE", "2.8.1.2.1", &baseSpecificationUrl, "specB08"}, - {Issue::ReferenceRule::VARIABLE_ATTRIBUTE_OPTIONAL, "VARIABLE_ATTRIBUTE_OPTIONAL", "2.8.2", &baseSpecificationUrl, "specB08"}, - {Issue::ReferenceRule::VARIABLE_INTERFACE_VALUE, "VARIABLE_INTERFACE_VALUE", "2.8.2.1.1", &baseSpecificationUrl, "specB08"}, - {Issue::ReferenceRule::VARIABLE_INITIAL_VALUE_VALUE, "VARIABLE_INITIAL_VALUE_VALUE", "2.8.2.2.1", &baseSpecificationUrl, "specB08"}, - {Issue::ReferenceRule::RESET_ELEMENT, "RESET_ELEMENT", "2.9", &baseSpecificationUrl, "specB09"}, - {Issue::ReferenceRule::RESET_ATTRIBUTE_REQUIRED, "RESET_ATTRIBUTE_REQUIRED", "2.9.1", &baseSpecificationUrl, "specB09"}, - {Issue::ReferenceRule::RESET_VARIABLE_REFERENCE, "RESET_VARIABLE_REFERENCE", "2.9.1.1.1", &baseSpecificationUrl, "specB09"}, - {Issue::ReferenceRule::RESET_TEST_VARIABLE_REFERENCE, "RESET_TEST_VARIABLE_REFERENCE", "2.9.1.2.1", &baseSpecificationUrl, "specB09"}, - {Issue::ReferenceRule::RESET_ORDER_VALUE, "RESET_ORDER_VALUE", "2.9.1.3.1", &baseSpecificationUrl, "specB09"}, - {Issue::ReferenceRule::RESET_ORDER_UNIQUE, "RESET_ORDER_UNIQUE", "2.9.1.3.2", &baseSpecificationUrl, "specB09"}, - {Issue::ReferenceRule::RESET_CHILD, "RESET_CHILD", "2.9.2", &baseSpecificationUrl, "specB09"}, - {Issue::ReferenceRule::RESET_RESET_VALUE_CHILD, "RESET_RESET_VALUE_CHILD", "2.9.2.1", &baseSpecificationUrl, "specB09"}, - {Issue::ReferenceRule::RESET_TEST_VALUE_CHILD, "RESET_TEST_VALUE_CHILD", "2.9.2.2", &baseSpecificationUrl, "specB09"}, - {Issue::ReferenceRule::TEST_VALUE_ELEMENT, "TEST_VALUE_ELEMENT", "2.10", &baseSpecificationUrl, "specB10"}, - {Issue::ReferenceRule::TEST_VALUE_CHILD, "TEST_VALUE_CHILD", "2.10.1", &baseSpecificationUrl, "specB10"}, - {Issue::ReferenceRule::RESET_VALUE_ELEMENT, "RESET_VALUE_ELEMENT", "2.11", &baseSpecificationUrl, "specB11"}, - {Issue::ReferenceRule::RESET_VALUE_CHILD, "RESET_VALUE_CHILD", "2.11.1", &baseSpecificationUrl, "specB11"}, - {Issue::ReferenceRule::MATH_ELEMENT, "MATH_ELEMENT", "2.12", &baseSpecificationUrl, "specB12"}, - {Issue::ReferenceRule::MATH_MATHML, "MATH_MATHML", "2.12.1", &baseSpecificationUrl, "specB12"}, - {Issue::ReferenceRule::MATH_CHILD, "MATH_CHILD", "2.12.2", &baseSpecificationUrl, "specB12"}, - {Issue::ReferenceRule::MATH_CI_VARIABLE_REFERENCE, "MATH_CI_VARIABLE_REFERENCE", "2.12.3", &baseSpecificationUrl, "specB12"}, - {Issue::ReferenceRule::MATH_CN_UNITS_ATTRIBUTE, "MATH_CN_UNITS_ATTRIBUTE", "2.12.4", &baseSpecificationUrl, "specB12"}, - {Issue::ReferenceRule::MATH_CN_UNITS_ATTRIBUTE_REFERENCE, "MATH_CN_UNITS_ATTRIBUTE_REFERENCE", "2.12.4.1", &baseSpecificationUrl, "specB12"}, - {Issue::ReferenceRule::MATH_CN_BASE10, "MATH_CN_BASE10", "2.12.5", &baseSpecificationUrl, "specB12"}, - {Issue::ReferenceRule::MATH_CN_FORMAT, "MATH_CN_FORMAT", "2.12.5.1", &baseSpecificationUrl, "specB12"}, - {Issue::ReferenceRule::ENCAPSULATION_ELEMENT, "ENCAPSULATION_ELEMENT", "2.13", &baseSpecificationUrl, "specB13"}, - {Issue::ReferenceRule::ENCAPSULATION_CHILD, "ENCAPSULATION_CHILD", "2.13.1", &baseSpecificationUrl, "specB13"}, - {Issue::ReferenceRule::COMPONENT_REF_ELEMENT, "COMPONENT_REF_ELEMENT", "2.14", &baseSpecificationUrl, "specB14"}, - {Issue::ReferenceRule::COMPONENT_REF_COMPONENT_ATTRIBUTE, "COMPONENT_REF_COMPONENT_ATTRIBUTE", "2.14.1", &baseSpecificationUrl, "specB14"}, - {Issue::ReferenceRule::COMPONENT_REF_COMPONENT_ATTRIBUTE_REFERENCE, "COMPONENT_REF_COMPONENT_ATTRIBUTE_REFERENCE", "2.14.1.1", &baseSpecificationUrl, "specB14"}, - {Issue::ReferenceRule::COMPONENT_REF_COMPONENT_ATTRIBUTE_UNIQUE, "COMPONENT_REF_COMPONENT_ATTRIBUTE_UNIQUE", "2.14.1.2", &baseSpecificationUrl, "specB14"}, - {Issue::ReferenceRule::COMPONENT_REF_CHILD, "COMPONENT_REF_CHILD", "2.14.2", &baseSpecificationUrl, "specB14"}, - {Issue::ReferenceRule::CONNECTION_ELEMENT, "CONNECTION_ELEMENT", "2.15", &baseSpecificationUrl, "specB14"}, - {Issue::ReferenceRule::CONNECTION_COMPONENT1_ATTRIBUTE, "CONNECTION_COMPONENT1_ATTRIBUTE", "2.15.1", &baseSpecificationUrl, "specB15"}, - {Issue::ReferenceRule::CONNECTION_COMPONENT1_ATTRIBUTE_REFERENCE, "CONNECTION_COMPONENT1_ATTRIBUTE_REFERENCE", "2.15.1.1", &baseSpecificationUrl, "specB15"}, - {Issue::ReferenceRule::CONNECTION_COMPONENT2_ATTRIBUTE, "CONNECTION_COMPONENT2_ATTRIBUTE", "2.15.2", &baseSpecificationUrl, "specB15"}, - {Issue::ReferenceRule::CONNECTION_COMPONENT2_ATTRIBUTE_REFERENCE, "CONNECTION_COMPONENT2_ATTRIBUTE_REFERENCE", "2.15.2.1", &baseSpecificationUrl, "specB15"}, - {Issue::ReferenceRule::CONNECTION_EXCLUDE_SELF, "CONNECTION_EXCLUDE_SELF", "2.15.3", &baseSpecificationUrl, "specB15"}, - {Issue::ReferenceRule::CONNECTION_UNIQUE, "CONNECTION_UNIQUE", "2.15.4", &baseSpecificationUrl, "specB15"}, - {Issue::ReferenceRule::CONNECTION_CHILD, "CONNECTION_CHILD", "2.15.5", &baseSpecificationUrl, "specB15"}, - {Issue::ReferenceRule::MAP_VARIABLES_ELEMENT, "MAP_VARIABLES_ELEMENT", "2.16", &baseSpecificationUrl, "specB16"}, - {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE1_ATTRIBUTE, "MAP_VARIABLES_VARIABLE1_ATTRIBUTE", "2.16.1", &baseSpecificationUrl, "specB16"}, - {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE1_ATTRIBUTE_REFERENCE, "MAP_VARIABLES_VARIABLE1_ATTRIBUTE_REFERENCE", "2.16.1.1", &baseSpecificationUrl, "specB16"}, - {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE2_ATTRIBUTE, "MAP_VARIABLES_VARIABLE2", "2.16.2", &baseSpecificationUrl, "specB16"}, - {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE2_ATTRIBUTE_REFERENCE, "MAP_VARIABLES_VARIABLE2_ATTRIBUTE_REFERENCE", "2.16.2.1", &baseSpecificationUrl, "specB16"}, - {Issue::ReferenceRule::MAP_VARIABLES_UNIQUE, "MAP_VARIABLES_UNIQUE", "2.16.3", &baseSpecificationUrl, "specB16"}, + {Issue::ReferenceRule::XML, "XML", "1.2.1.1", baseSpecificationUrl, "specA02"}, + {Issue::ReferenceRule::XML_UNEXPECTED_ELEMENT, "XML_UNEXPECTED_ELEMENT", "1.2.2.2", baseSpecificationUrl, "specA02"}, + {Issue::ReferenceRule::XML_UNEXPECTED_CHARACTER, "XML_UNEXPECTED_CHARACTER", "1.2.3.2", baseSpecificationUrl, "specA02"}, + {Issue::ReferenceRule::XML_UNEXPECTED_NAMESPACE, "XML_UNEXPECTED_NAMESPACE", "1.2.4.1", baseSpecificationUrl, "specA02"}, + {Issue::ReferenceRule::XML_ATTRIBUTE_HAS_NAMESPACE, "XML_ATTRIBUTE_HAS_NAMESPACE", "1.2.4.2", baseSpecificationUrl, "specA02"}, + {Issue::ReferenceRule::XML_ID_ATTRIBUTE, "XML_ID_ATTRIBUTE", "1.2.5.1.1", baseSpecificationUrl, "specA02"}, + {Issue::ReferenceRule::MODEL_ELEMENT, "MODEL_ELEMENT", "2.1", baseSpecificationUrl, "specB01"}, + {Issue::ReferenceRule::MODEL_NAME, "MODEL_NAME", "2.1.1", baseSpecificationUrl, "specB01"}, + {Issue::ReferenceRule::MODEL_NAME_VALUE, "MODEL_NAME_VALUE", "2.1.1.1", baseSpecificationUrl, "specB01"}, + {Issue::ReferenceRule::MODEL_CHILD, "MODEL_CHILD", "2.1.2", baseSpecificationUrl, "specB01"}, + {Issue::ReferenceRule::MODEL_MORE_THAN_ONE_ENCAPSULATION, "MODEL_MORE_THAN_ONE_ENCAPSULATION", "2.1.3", baseSpecificationUrl, "specB01"}, + {Issue::ReferenceRule::IMPORT_ELEMENT, "IMPORT_ELEMENT", "2.2", baseSpecificationUrl, "specB02"}, + {Issue::ReferenceRule::IMPORT_HREF, "IMPORT_HREF", "2.2.1", baseSpecificationUrl, "specB02"}, + {Issue::ReferenceRule::IMPORT_HREF_LOCATOR, "IMPORT_HREF_LOCATOR", "2.2.1.1", baseSpecificationUrl, "specB02"}, + {Issue::ReferenceRule::IMPORT_CHILD, "IMPORT_CHILD", "2.2.2", baseSpecificationUrl, "specB02"}, + {Issue::ReferenceRule::IMPORT_EQUIVALENT_INFOSET, "IMPORT_EQUIVALENT_INFOSET", "2.2.3", baseSpecificationUrl, "specB02"}, + {Issue::ReferenceRule::IMPORT_UNITS_ELEMENT, "IMPORT_UNITS_ELEMENT", "2.3", baseSpecificationUrl, "specB03"}, + {Issue::ReferenceRule::IMPORT_UNITS_NAME, "IMPORT_UNITS_NAME", "2.3.1", baseSpecificationUrl, "specB03"}, + {Issue::ReferenceRule::IMPORT_UNITS_NAME_VALUE, "IMPORT_UNITS_NAME_VALUE", "2.3.1.1", baseSpecificationUrl, "specB03"}, + {Issue::ReferenceRule::IMPORT_UNITS_NAME_UNIQUE, "IMPORT_UNITS_NAME_UNIQUE", "2.3.1.2", baseSpecificationUrl, "specB03"}, + {Issue::ReferenceRule::IMPORT_UNITS_UNITS_REFERENCE, "IMPORT_UNITS_UNITS_REFERENCE", "2.3.2", baseSpecificationUrl, "specB03"}, + {Issue::ReferenceRule::IMPORT_UNITS_UNITS_REFERENCE_VALUE, "IMPORT_UNITS_UNITS_REFERENCE_VALUE", "2.3.2.1", baseSpecificationUrl, "specB03"}, + {Issue::ReferenceRule::IMPORT_UNITS_UNITS_REFERENCE_VALUE_TARGET, "IMPORT_UNITS_UNITS_REFERENCE_VALUE_TARGET", "2.3.2.2", baseSpecificationUrl, "specB03"}, + {Issue::ReferenceRule::IMPORT_COMPONENT_ELEMENT, "IMPORT_COMPONENT_ELEMENT", "2.4", baseSpecificationUrl, "specB04"}, + {Issue::ReferenceRule::IMPORT_COMPONENT_NAME, "IMPORT_COMPONENT_NAME", "2.4.1", baseSpecificationUrl, "specB04"}, + {Issue::ReferenceRule::IMPORT_COMPONENT_NAME_VALUE, "IMPORT_COMPONENT_NAME_VALUE", "2.4.1.1", baseSpecificationUrl, "specB04"}, + {Issue::ReferenceRule::IMPORT_COMPONENT_NAME_UNIQUE, "IMPORT_COMPONENT_NAME_UNIQUE", "2.4.1.2", baseSpecificationUrl, "specB04"}, + {Issue::ReferenceRule::IMPORT_COMPONENT_COMPONENT_REFERENCE, "IMPORT_COMPONENT_COMPONENT_REFERENCE", "2.4.2", baseSpecificationUrl, "specB04"}, + {Issue::ReferenceRule::IMPORT_COMPONENT_COMPONENT_REFERENCE_VALUE, "IMPORT_COMPONENT_COMPONENT_REFERENCE_VALUE", "2.4.2.1", baseSpecificationUrl, "specB04"}, + {Issue::ReferenceRule::IMPORT_COMPONENT_COMPONENT_REFERENCE_TARGET, "IMPORT_COMPONENT_COMPONENT_REFERENCE_TARGET", "2.4.2.2", baseSpecificationUrl, "specB04"}, + {Issue::ReferenceRule::UNITS_ELEMENT, "UNITS_ELEMENT", "2.5", baseSpecificationUrl, "specB05"}, + {Issue::ReferenceRule::UNITS_NAME, "UNITS_NAME", "2.5.1", baseSpecificationUrl, "specB05"}, + {Issue::ReferenceRule::UNITS_NAME_VALUE, "UNITS_NAME_VALUE", "2.5.1.1", baseSpecificationUrl, "specB05"}, + {Issue::ReferenceRule::UNITS_NAME_UNIQUE, "UNITS_NAME_UNIQUE", "2.5.1.2", baseSpecificationUrl, "specB05"}, + {Issue::ReferenceRule::UNITS_STANDARD, "UNITS_STANDARD", "2.5.2", baseSpecificationUrl, "specB05"}, + {Issue::ReferenceRule::UNITS_CHILD, "UNITS_CHILD", "2.5.3", baseSpecificationUrl, "specB05"}, + {Issue::ReferenceRule::UNIT_ELEMENT, "UNIT_ELEMENT", "2.6", baseSpecificationUrl, "specB06"}, + {Issue::ReferenceRule::UNIT_UNITS, "UNIT_UNITS", "2.6.1", baseSpecificationUrl, "specB06"}, + {Issue::ReferenceRule::UNIT_UNITS_REFERENCE, "UNIT_UNITS_REFERENCE", "2.6.1.1", baseSpecificationUrl, "specB06"}, + {Issue::ReferenceRule::UNIT_UNITS_CIRCULAR_REFERENCE, "UNIT_UNITS_CIRCULAR_REFERENCE", "2.6.1.3", baseSpecificationUrl, "specB06"}, + {Issue::ReferenceRule::UNIT_ATTRIBUTE_OPTIONAL, "UNIT_ATTRIBUTE_OPTIONAL", "2.6.2", baseSpecificationUrl, "specB06"}, + {Issue::ReferenceRule::UNIT_ATTRIBUTE_PREFIX_VALUE, "UNIT_ATTRIBUTE_PREFIX_VALUE", "2.6.2.1.1", baseSpecificationUrl, "specB06"}, + {Issue::ReferenceRule::UNIT_ATTRIBUTE_MULTIPLIER_VALUE, "UNIT_ATTRIBUTE_MULTIPLIER_VALUE", "2.6.2.2.1", baseSpecificationUrl, "specB06"}, + {Issue::ReferenceRule::UNIT_ATTRIBUTE_EXPONENT_VALUE, "UNIT_ATTRIBUTE_EXPONENT_VALUE", "2.6.2.3.1", baseSpecificationUrl, "specB06"}, + {Issue::ReferenceRule::COMPONENT_ELEMENT, "COMPONENT_ELEMENT", "2.7", baseSpecificationUrl, "specB07"}, + {Issue::ReferenceRule::COMPONENT_NAME, "COMPONENT_NAME", "2.7.1", baseSpecificationUrl, "specB07"}, + {Issue::ReferenceRule::COMPONENT_NAME_VALUE, "COMPONENT_NAME_VALUE", "2.7.1.1", baseSpecificationUrl, "specB07"}, + {Issue::ReferenceRule::COMPONENT_NAME_UNIQUE, "COMPONENT_NAME_UNIQUE", "2.7.1.2", baseSpecificationUrl, "specB07"}, + {Issue::ReferenceRule::COMPONENT_CHILD, "COMPONENT_CHILD", "2.7.2", baseSpecificationUrl, "specB07"}, + {Issue::ReferenceRule::VARIABLE_ELEMENT, "VARIABLE_ELEMENT", "2.8", baseSpecificationUrl, "specB08"}, + {Issue::ReferenceRule::VARIABLE_ATTRIBUTE_REQUIRED, "VARIABLE_ATTRIBUTE_REQUIRED", "2.8.1", baseSpecificationUrl, "specB08"}, + {Issue::ReferenceRule::VARIABLE_NAME_VALUE, "VARIABLE_NAME_VALUE", "2.8.1.1.1", baseSpecificationUrl, "specB08"}, + {Issue::ReferenceRule::VARIABLE_NAME_UNIQUE, "VARIABLE_NAME_UNIQUE", "2.8.1.1.2", baseSpecificationUrl, "specB08"}, + {Issue::ReferenceRule::VARIABLE_UNITS_VALUE, "VARIABLE_UNITS_VALUE", "2.8.1.2.1", baseSpecificationUrl, "specB08"}, + {Issue::ReferenceRule::VARIABLE_ATTRIBUTE_OPTIONAL, "VARIABLE_ATTRIBUTE_OPTIONAL", "2.8.2", baseSpecificationUrl, "specB08"}, + {Issue::ReferenceRule::VARIABLE_INTERFACE_VALUE, "VARIABLE_INTERFACE_VALUE", "2.8.2.1.1", baseSpecificationUrl, "specB08"}, + {Issue::ReferenceRule::VARIABLE_INITIAL_VALUE_VALUE, "VARIABLE_INITIAL_VALUE_VALUE", "2.8.2.2.1", baseSpecificationUrl, "specB08"}, + {Issue::ReferenceRule::RESET_ELEMENT, "RESET_ELEMENT", "2.9", baseSpecificationUrl, "specB09"}, + {Issue::ReferenceRule::RESET_ATTRIBUTE_REQUIRED, "RESET_ATTRIBUTE_REQUIRED", "2.9.1", baseSpecificationUrl, "specB09"}, + {Issue::ReferenceRule::RESET_VARIABLE_REFERENCE, "RESET_VARIABLE_REFERENCE", "2.9.1.1.1", baseSpecificationUrl, "specB09"}, + {Issue::ReferenceRule::RESET_TEST_VARIABLE_REFERENCE, "RESET_TEST_VARIABLE_REFERENCE", "2.9.1.2.1", baseSpecificationUrl, "specB09"}, + {Issue::ReferenceRule::RESET_ORDER_VALUE, "RESET_ORDER_VALUE", "2.9.1.3.1", baseSpecificationUrl, "specB09"}, + {Issue::ReferenceRule::RESET_ORDER_UNIQUE, "RESET_ORDER_UNIQUE", "2.9.1.3.2", baseSpecificationUrl, "specB09"}, + {Issue::ReferenceRule::RESET_CHILD, "RESET_CHILD", "2.9.2", baseSpecificationUrl, "specB09"}, + {Issue::ReferenceRule::RESET_RESET_VALUE_CHILD, "RESET_RESET_VALUE_CHILD", "2.9.2.1", baseSpecificationUrl, "specB09"}, + {Issue::ReferenceRule::RESET_TEST_VALUE_CHILD, "RESET_TEST_VALUE_CHILD", "2.9.2.2", baseSpecificationUrl, "specB09"}, + {Issue::ReferenceRule::TEST_VALUE_ELEMENT, "TEST_VALUE_ELEMENT", "2.10", baseSpecificationUrl, "specB10"}, + {Issue::ReferenceRule::TEST_VALUE_CHILD, "TEST_VALUE_CHILD", "2.10.1", baseSpecificationUrl, "specB10"}, + {Issue::ReferenceRule::RESET_VALUE_ELEMENT, "RESET_VALUE_ELEMENT", "2.11", baseSpecificationUrl, "specB11"}, + {Issue::ReferenceRule::RESET_VALUE_CHILD, "RESET_VALUE_CHILD", "2.11.1", baseSpecificationUrl, "specB11"}, + {Issue::ReferenceRule::MATH_ELEMENT, "MATH_ELEMENT", "2.12", baseSpecificationUrl, "specB12"}, + {Issue::ReferenceRule::MATH_MATHML, "MATH_MATHML", "2.12.1", baseSpecificationUrl, "specB12"}, + {Issue::ReferenceRule::MATH_CHILD, "MATH_CHILD", "2.12.2", baseSpecificationUrl, "specB12"}, + {Issue::ReferenceRule::MATH_CI_VARIABLE_REFERENCE, "MATH_CI_VARIABLE_REFERENCE", "2.12.3", baseSpecificationUrl, "specB12"}, + {Issue::ReferenceRule::MATH_CN_UNITS_ATTRIBUTE, "MATH_CN_UNITS_ATTRIBUTE", "2.12.4", baseSpecificationUrl, "specB12"}, + {Issue::ReferenceRule::MATH_CN_UNITS_ATTRIBUTE_REFERENCE, "MATH_CN_UNITS_ATTRIBUTE_REFERENCE", "2.12.4.1", baseSpecificationUrl, "specB12"}, + {Issue::ReferenceRule::MATH_CN_BASE10, "MATH_CN_BASE10", "2.12.5", baseSpecificationUrl, "specB12"}, + {Issue::ReferenceRule::MATH_CN_FORMAT, "MATH_CN_FORMAT", "2.12.5.1", baseSpecificationUrl, "specB12"}, + {Issue::ReferenceRule::ENCAPSULATION_ELEMENT, "ENCAPSULATION_ELEMENT", "2.13", baseSpecificationUrl, "specB13"}, + {Issue::ReferenceRule::ENCAPSULATION_CHILD, "ENCAPSULATION_CHILD", "2.13.1", baseSpecificationUrl, "specB13"}, + {Issue::ReferenceRule::COMPONENT_REF_ELEMENT, "COMPONENT_REF_ELEMENT", "2.14", baseSpecificationUrl, "specB14"}, + {Issue::ReferenceRule::COMPONENT_REF_COMPONENT_ATTRIBUTE, "COMPONENT_REF_COMPONENT_ATTRIBUTE", "2.14.1", baseSpecificationUrl, "specB14"}, + {Issue::ReferenceRule::COMPONENT_REF_COMPONENT_ATTRIBUTE_REFERENCE, "COMPONENT_REF_COMPONENT_ATTRIBUTE_REFERENCE", "2.14.1.1", baseSpecificationUrl, "specB14"}, + {Issue::ReferenceRule::COMPONENT_REF_COMPONENT_ATTRIBUTE_UNIQUE, "COMPONENT_REF_COMPONENT_ATTRIBUTE_UNIQUE", "2.14.1.2", baseSpecificationUrl, "specB14"}, + {Issue::ReferenceRule::COMPONENT_REF_CHILD, "COMPONENT_REF_CHILD", "2.14.2", baseSpecificationUrl, "specB14"}, + {Issue::ReferenceRule::CONNECTION_ELEMENT, "CONNECTION_ELEMENT", "2.15", baseSpecificationUrl, "specB14"}, + {Issue::ReferenceRule::CONNECTION_COMPONENT1_ATTRIBUTE, "CONNECTION_COMPONENT1_ATTRIBUTE", "2.15.1", baseSpecificationUrl, "specB15"}, + {Issue::ReferenceRule::CONNECTION_COMPONENT1_ATTRIBUTE_REFERENCE, "CONNECTION_COMPONENT1_ATTRIBUTE_REFERENCE", "2.15.1.1", baseSpecificationUrl, "specB15"}, + {Issue::ReferenceRule::CONNECTION_COMPONENT2_ATTRIBUTE, "CONNECTION_COMPONENT2_ATTRIBUTE", "2.15.2", baseSpecificationUrl, "specB15"}, + {Issue::ReferenceRule::CONNECTION_COMPONENT2_ATTRIBUTE_REFERENCE, "CONNECTION_COMPONENT2_ATTRIBUTE_REFERENCE", "2.15.2.1", baseSpecificationUrl, "specB15"}, + {Issue::ReferenceRule::CONNECTION_EXCLUDE_SELF, "CONNECTION_EXCLUDE_SELF", "2.15.3", baseSpecificationUrl, "specB15"}, + {Issue::ReferenceRule::CONNECTION_UNIQUE, "CONNECTION_UNIQUE", "2.15.4", baseSpecificationUrl, "specB15"}, + {Issue::ReferenceRule::CONNECTION_CHILD, "CONNECTION_CHILD", "2.15.5", baseSpecificationUrl, "specB15"}, + {Issue::ReferenceRule::MAP_VARIABLES_ELEMENT, "MAP_VARIABLES_ELEMENT", "2.16", baseSpecificationUrl, "specB16"}, + {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE1_ATTRIBUTE, "MAP_VARIABLES_VARIABLE1_ATTRIBUTE", "2.16.1", baseSpecificationUrl, "specB16"}, + {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE1_ATTRIBUTE_REFERENCE, "MAP_VARIABLES_VARIABLE1_ATTRIBUTE_REFERENCE", "2.16.1.1", baseSpecificationUrl, "specB16"}, + {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE2_ATTRIBUTE, "MAP_VARIABLES_VARIABLE2", "2.16.2", baseSpecificationUrl, "specB16"}, + {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE2_ATTRIBUTE_REFERENCE, "MAP_VARIABLES_VARIABLE2_ATTRIBUTE_REFERENCE", "2.16.2.1", baseSpecificationUrl, "specB16"}, + {Issue::ReferenceRule::MAP_VARIABLES_UNIQUE, "MAP_VARIABLES_UNIQUE", "2.16.3", baseSpecificationUrl, "specB16"}, // Secondary specification rules: - {Issue::ReferenceRule::DATA_REPR_IDENTIFIER_AT_LEAST_ONE_ALPHANUM, "DATA_REPR_IDENTIFIER_AT_LEAST_ONE_ALPHANUM", "1.3.1.1", &baseSpecificationUrl, "specA03"}, - {Issue::ReferenceRule::DATA_REPR_IDENTIFIER_BEGIN_EURO_NUM, "DATA_REPR_IDENTIFIER_BEGIN_EURO_NUM", "1.3.1.1", &baseSpecificationUrl, "specA03"}, - {Issue::ReferenceRule::DATA_REPR_IDENTIFIER_LATIN_ALPHANUM, "DATA_REPR_IDENTIFIER_LATIN_ALPHANUM", "1.3.1.1", &baseSpecificationUrl, "specA03"}, + {Issue::ReferenceRule::DATA_REPR_IDENTIFIER_AT_LEAST_ONE_ALPHANUM, "DATA_REPR_IDENTIFIER_AT_LEAST_ONE_ALPHANUM", "1.3.1.1", baseSpecificationUrl, "specA03"}, + {Issue::ReferenceRule::DATA_REPR_IDENTIFIER_BEGIN_EURO_NUM, "DATA_REPR_IDENTIFIER_BEGIN_EURO_NUM", "1.3.1.1", baseSpecificationUrl, "specA03"}, + {Issue::ReferenceRule::DATA_REPR_IDENTIFIER_LATIN_ALPHANUM, "DATA_REPR_IDENTIFIER_LATIN_ALPHANUM", "1.3.1.1", baseSpecificationUrl, "specA03"}, // Not in normative specification: - {Issue::ReferenceRule::INVALID_ARGUMENT, "INVALID_ARGUMENT", "", &docsUrl, ""}, + {Issue::ReferenceRule::INVALID_ARGUMENT, "INVALID_ARGUMENT", "", docsUrl, ""}, // Importer class issues: - {Issue::ReferenceRule::IMPORTER_ERROR_IMPORTING_UNITS, "IMPORTER_ERROR_IMPORTING_UNITS", "", &docsUrl, ""}, - {Issue::ReferenceRule::IMPORTER_MISSING_FILE, "IMPORTER_MISSING_FILE", "", &docsUrl, ""}, - {Issue::ReferenceRule::IMPORTER_MISSING_COMPONENT, "IMPORTER_MISSING_COMPONENT", "", &docsUrl, ""}, - {Issue::ReferenceRule::IMPORTER_MISSING_UNITS, "IMPORTER_MISSING_UNITS", "", &docsUrl, ""}, - {Issue::ReferenceRule::IMPORTER_NULL_MODEL, "IMPORTER_NULL_MODEL", "", &docsUrl, ""}, - {Issue::ReferenceRule::IMPORTER_UNDEFINED_MODEL, "IMPORTER_UNDEFINED_MODEL", "", &docsUrl, ""}, - {Issue::ReferenceRule::IMPORTER_UNRESOLVED_IMPORTS, "IMPORTER_UNRESOLVED_IMPORTS", "", &docsUrl, ""}, + {Issue::ReferenceRule::IMPORTER_ERROR_IMPORTING_UNITS, "IMPORTER_ERROR_IMPORTING_UNITS", "", docsUrl, ""}, + {Issue::ReferenceRule::IMPORTER_MISSING_FILE, "IMPORTER_MISSING_FILE", "", docsUrl, ""}, + {Issue::ReferenceRule::IMPORTER_MISSING_COMPONENT, "IMPORTER_MISSING_COMPONENT", "", docsUrl, ""}, + {Issue::ReferenceRule::IMPORTER_MISSING_UNITS, "IMPORTER_MISSING_UNITS", "", docsUrl, ""}, + {Issue::ReferenceRule::IMPORTER_NULL_MODEL, "IMPORTER_NULL_MODEL", "", docsUrl, ""}, + {Issue::ReferenceRule::IMPORTER_UNDEFINED_MODEL, "IMPORTER_UNDEFINED_MODEL", "", docsUrl, ""}, + {Issue::ReferenceRule::IMPORTER_UNRESOLVED_IMPORTS, "IMPORTER_UNRESOLVED_IMPORTS", "", docsUrl, ""}, // Analyser issues: - {Issue::ReferenceRule::ANALYSER_EQUATION_NOT_EQUALITY_STATEMENT, "ANALYSER_EQUATION_NOT_EQUALITY_STATEMENT", "", &docsUrl, ""}, - {Issue::ReferenceRule::ANALYSER_UNITS, "ANALYSER_UNITS", "", &docsUrl, ""}, - {Issue::ReferenceRule::ANALYSER_UNLINKED_UNITS, "ANALYSER_UNLINKED_UNITS", "", &docsUrl, ""}, - {Issue::ReferenceRule::ANALYSER_VARIABLE_INITIALISED_MORE_THAN_ONCE, "ANALYSER_VARIABLE_INITIALISED_MORE_THAN_ONCE", "", &docsUrl, ""}, - {Issue::ReferenceRule::ANALYSER_VARIABLE_INITIALISED_USING_ALGEBRAIC_VARIABLE, "ANALYSER_VARIABLE_INITIALISED_USING_ALGEBRAIC_VARIABLE", "", &docsUrl, ""}, - {Issue::ReferenceRule::ANALYSER_VARIABLE_INITIALISED_USING_VARIABLE_WITH_DIFFERENT_UNITS, "ANALYSER_VARIABLE_INITIALISED_USING_VARIABLE_WITH_DIFFERENT_UNITS", "", &docsUrl, ""}, - {Issue::ReferenceRule::ANALYSER_VOI_INITIALISED, "ANALYSER_VOI_INITIALISED", "", &docsUrl, ""}, - {Issue::ReferenceRule::ANALYSER_VOI_SEVERAL, "ANALYSER_VOI_SEVERAL", "", &docsUrl, ""}, - {Issue::ReferenceRule::ANALYSER_ODE_NOT_FIRST_ORDER, "ANALYSER_ODE_NOT_FIRST_ORDER", "", &docsUrl, ""}, - {Issue::ReferenceRule::ANALYSER_VARIABLE_UNUSED, "ANALYSER_VARIABLE_UNUSED", "", &docsUrl, ""}, - {Issue::ReferenceRule::ANALYSER_STATE_NOT_INITIALISED, "ANALYSER_STATE_NOT_INITIALISED", "", &docsUrl, ""}, - {Issue::ReferenceRule::ANALYSER_STATE_RATE_AS_ALGEBRAIC_VARIABLE, "ANALYSER_STATE_RATE_AS_ALGEBRAIC_VARIABLE", "", &docsUrl, ""}, - {Issue::ReferenceRule::ANALYSER_VARIABLE_UNDERCONSTRAINED, "ANALYSER_VARIABLE_UNDERCONSTRAINED", "", &docsUrl, ""}, - {Issue::ReferenceRule::ANALYSER_VARIABLE_OVERCONSTRAINED, "ANALYSER_VARIABLE_OVERCONSTRAINED", "", &docsUrl, ""}, - {Issue::ReferenceRule::ANALYSER_EXTERNAL_VARIABLE_DIFFERENT_MODEL, "ANALYSER_EXTERNAL_VARIABLE_DIFFERENT_MODEL", "", &docsUrl, ""}, - {Issue::ReferenceRule::ANALYSER_EXTERNAL_VARIABLE_VOI, "ANALYSER_EXTERNAL_VARIABLE_VOI", "", &docsUrl, ""}, - {Issue::ReferenceRule::ANALYSER_EXTERNAL_VARIABLE_USE_PRIMARY_VARIABLE, "ANALYSER_EXTERNAL_VARIABLE_USE_PRIMARY_VARIABLE", "", &docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_EQUATION_NOT_EQUALITY_STATEMENT, "ANALYSER_EQUATION_NOT_EQUALITY_STATEMENT", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_UNITS, "ANALYSER_UNITS", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_UNLINKED_UNITS, "ANALYSER_UNLINKED_UNITS", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_VARIABLE_INITIALISED_MORE_THAN_ONCE, "ANALYSER_VARIABLE_INITIALISED_MORE_THAN_ONCE", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_VARIABLE_INITIALISED_USING_ALGEBRAIC_VARIABLE, "ANALYSER_VARIABLE_INITIALISED_USING_ALGEBRAIC_VARIABLE", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_VARIABLE_INITIALISED_USING_VARIABLE_WITH_DIFFERENT_UNITS, "ANALYSER_VARIABLE_INITIALISED_USING_VARIABLE_WITH_DIFFERENT_UNITS", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_VOI_INITIALISED, "ANALYSER_VOI_INITIALISED", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_VOI_SEVERAL, "ANALYSER_VOI_SEVERAL", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_ODE_NOT_FIRST_ORDER, "ANALYSER_ODE_NOT_FIRST_ORDER", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_VARIABLE_UNUSED, "ANALYSER_VARIABLE_UNUSED", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_STATE_NOT_INITIALISED, "ANALYSER_STATE_NOT_INITIALISED", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_STATE_RATE_AS_ALGEBRAIC_VARIABLE, "ANALYSER_STATE_RATE_AS_ALGEBRAIC_VARIABLE", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_VARIABLE_UNDERCONSTRAINED, "ANALYSER_VARIABLE_UNDERCONSTRAINED", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_VARIABLE_OVERCONSTRAINED, "ANALYSER_VARIABLE_OVERCONSTRAINED", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_EXTERNAL_VARIABLE_DIFFERENT_MODEL, "ANALYSER_EXTERNAL_VARIABLE_DIFFERENT_MODEL", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_EXTERNAL_VARIABLE_VOI, "ANALYSER_EXTERNAL_VARIABLE_VOI", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_EXTERNAL_VARIABLE_USE_PRIMARY_VARIABLE, "ANALYSER_EXTERNAL_VARIABLE_USE_PRIMARY_VARIABLE", "", docsUrl, ""}, // Annotator issues: - {Issue::ReferenceRule::ANNOTATOR_ID_NOT_FOUND, "ANNOTATOR_ID_NOT_FOUND", "", &docsUrl, ""}, - {Issue::ReferenceRule::ANNOTATOR_ID_NOT_UNIQUE, "ANNOTATOR_ID_NOT_UNIQUE", "", &docsUrl, ""}, - {Issue::ReferenceRule::ANNOTATOR_NO_MODEL, "ANNOTATOR_NO_MODEL", "", &docsUrl, ""}, - {Issue::ReferenceRule::ANNOTATOR_INCONSISTENT_TYPE, "ANNOTATOR_INCONSISTENT_TYPE", "", &docsUrl, ""}, - {Issue::ReferenceRule::ANNOTATOR_NULL_MODEL, "ANNOTATOR_NULL_MODEL", "", &docsUrl, ""}, + {Issue::ReferenceRule::ANNOTATOR_ID_NOT_FOUND, "ANNOTATOR_ID_NOT_FOUND", "", docsUrl, ""}, + {Issue::ReferenceRule::ANNOTATOR_ID_NOT_UNIQUE, "ANNOTATOR_ID_NOT_UNIQUE", "", docsUrl, ""}, + {Issue::ReferenceRule::ANNOTATOR_NO_MODEL, "ANNOTATOR_NO_MODEL", "", docsUrl, ""}, + {Issue::ReferenceRule::ANNOTATOR_INCONSISTENT_TYPE, "ANNOTATOR_INCONSISTENT_TYPE", "", docsUrl, ""}, + {Issue::ReferenceRule::ANNOTATOR_NULL_MODEL, "ANNOTATOR_NULL_MODEL", "", docsUrl, ""}, }; static const RuleInformation &ruleInformation(Issue::ReferenceRule rule) { - auto res = std::find_if(std::begin(ruleToInformation), std::end(ruleToInformation), [rule](const RuleInformation &information) { + // Note: every Issue::ReferenceRule value has an entry in ruleToInformation, so the search always succeeds. + + return *std::find_if(std::begin(ruleToInformation), std::end(ruleToInformation), [rule](const RuleInformation &information) { return information.rule == rule; }); - - if (res == std::end(ruleToInformation)) { - throw std::out_of_range("Unknown reference rule."); - } - - return *res; } std::string Issue::referenceHeading() const @@ -259,7 +254,7 @@ std::string Issue::referenceHeading() const std::string Issue::url() const { const auto &information = ruleInformation(referenceRule()); - std::string baseUrl = (information.baseUrl != nullptr) ? *information.baseUrl : ""; + std::string baseUrl = information.baseUrl; if (*information.heading == '\0') { return baseUrl + "?issue=" + information.name; diff --git a/src/utilities.h b/src/utilities.h index 4e9332242..53cc56f11 100644 --- a/src/utilities.h +++ b/src/utilities.h @@ -34,8 +34,8 @@ namespace libcellml { /** * Base URLs of sites from which Issue::url() strings will be constructed. */ -inline const std::string baseSpecificationUrl = "https://cellml-specification.readthedocs.io/en/latest/reference/formal_and_informative/"; -inline const std::string docsUrl = "https://libcellml.org/documentation/guides/latest/runtime_codes/index"; +inline constexpr const char *baseSpecificationUrl = "https://cellml-specification.readthedocs.io/en/latest/reference/formal_and_informative/"; +inline constexpr const char *docsUrl = "https://libcellml.org/documentation/guides/latest/runtime_codes/index"; static const size_t MAX_SIZE_T = std::numeric_limits::max(); From 0c991f85842189819bfe24cbdfa6ed04b7f508b2 Mon Sep 17 00:00:00 2001 From: Alan Garny Date: Mon, 28 Sep 2026 22:38:01 +1300 Subject: [PATCH 3/7] Map the generator rules with compile-time guard. --- src/issue.cpp | 40 +++++++++++++++++--- tests/generator/generatorvariabletracker.cpp | 3 ++ 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/issue.cpp b/src/issue.cpp index c69cb2c7b..3fc77d374 100644 --- a/src/issue.cpp +++ b/src/issue.cpp @@ -16,7 +16,6 @@ limitations under the License. #include "libcellml/issue.h" -#include #include #include "issue_p.h" @@ -235,15 +234,44 @@ static constexpr RuleInformation ruleToInformation[] = { {Issue::ReferenceRule::ANNOTATOR_INCONSISTENT_TYPE, "ANNOTATOR_INCONSISTENT_TYPE", "", docsUrl, ""}, {Issue::ReferenceRule::ANNOTATOR_NULL_MODEL, "ANNOTATOR_NULL_MODEL", "", docsUrl, ""}, + // Generator issues: + {Issue::ReferenceRule::GENERATOR_NULL_MODEL, "GENERATOR_NULL_MODEL", "", docsUrl, ""}, + {Issue::ReferenceRule::GENERATOR_NULL_VARIABLE, "GENERATOR_NULL_VARIABLE", "", docsUrl, ""}, + {Issue::ReferenceRule::GENERATOR_VOI_VARIABLE_ALWAYS_TRACKED, "GENERATOR_VOI_VARIABLE_ALWAYS_TRACKED", "", docsUrl, ""}, + {Issue::ReferenceRule::GENERATOR_VOI_VARIABLE_NOT_UNTRACKABLE, "GENERATOR_VOI_VARIABLE_NOT_UNTRACKABLE", "", docsUrl, ""}, + {Issue::ReferenceRule::GENERATOR_STATE_VARIABLE_ALWAYS_TRACKED, "GENERATOR_STATE_VARIABLE_ALWAYS_TRACKED", "", docsUrl, ""}, + {Issue::ReferenceRule::GENERATOR_STATE_VARIABLE_NOT_UNTRACKABLE, "GENERATOR_STATE_VARIABLE_NOT_UNTRACKABLE", "", docsUrl, ""}, + {Issue::ReferenceRule::GENERATOR_EXTERNAL_VARIABLE_ALWAYS_TRACKED, "GENERATOR_EXTERNAL_VARIABLE_ALWAYS_TRACKED", "", docsUrl, ""}, + {Issue::ReferenceRule::GENERATOR_EXTERNAL_VARIABLE_NOT_UNTRACKABLE, "GENERATOR_EXTERNAL_VARIABLE_NOT_UNTRACKABLE", "", docsUrl, ""}, + {Issue::ReferenceRule::GENERATOR_NLA_BASED_VARIABLE_ALWAYS_TRACKED, "GENERATOR_NLA_BASED_VARIABLE_ALWAYS_TRACKED", "", docsUrl, ""}, + {Issue::ReferenceRule::GENERATOR_NLA_BASED_VARIABLE_NOT_UNTRACKABLE, "GENERATOR_NLA_BASED_VARIABLE_NOT_UNTRACKABLE", "", docsUrl, ""}, + {Issue::ReferenceRule::GENERATOR_EXTERNALLY_NEEDED_VARIABLE_ALWAYS_TRACKED, "GENERATOR_EXTERNALLY_NEEDED_VARIABLE_ALWAYS_TRACKED", "", docsUrl, ""}, + {Issue::ReferenceRule::GENERATOR_EXTERNALLY_NEEDED_VARIABLE_NOT_UNTRACKABLE, "GENERATOR_EXTERNALLY_NEEDED_VARIABLE_NOT_UNTRACKABLE", "", docsUrl, ""}, + + // Placeholder for further references: + {Issue::ReferenceRule::UNSPECIFIED, "", "", "", ""}, }; -static const RuleInformation &ruleInformation(Issue::ReferenceRule rule) +static consteval bool hasInformationForAllRules() { - // Note: every Issue::ReferenceRule value has an entry in ruleToInformation, so the search always succeeds. + if (std::size(ruleToInformation) != static_cast(Issue::ReferenceRule::UNSPECIFIED) + 1) { + return false; + } - return *std::find_if(std::begin(ruleToInformation), std::end(ruleToInformation), [rule](const RuleInformation &information) { - return information.rule == rule; - }); + for (size_t i = 0; i < std::size(ruleToInformation); ++i) { + if (ruleToInformation[i].rule != static_cast(i)) { + return false; + } + } + + return true; +} + +static_assert(hasInformationForAllRules(), "ruleToInformation must have one entry for each Issue::ReferenceRule value, in declaration order."); + +static const RuleInformation &ruleInformation(Issue::ReferenceRule rule) +{ + return ruleToInformation[static_cast(rule)]; } std::string Issue::referenceHeading() const diff --git a/tests/generator/generatorvariabletracker.cpp b/tests/generator/generatorvariabletracker.cpp index b7ac79f25..ebca6bd8d 100644 --- a/tests/generator/generatorvariabletracker.cpp +++ b/tests/generator/generatorvariabletracker.cpp @@ -40,6 +40,9 @@ TEST(GeneratorVariableTracker, noModelOrVariable) generatorVariableTracker->trackVariable(nullptr); EXPECT_EQ_ISSUES_LEVELS_REFERENCERULES(nullVariableIssue, errorLevel, nullVariableReferenceRule, generatorVariableTracker); + EXPECT_EQ_ISSUES_SPECIFICATION_HEADINGS_URLS(nullVariableIssue, std::vector({""}), + std::vector({"https://libcellml.org/documentation/guides/latest/runtime_codes/index?issue=GENERATOR_NULL_VARIABLE"}), + generatorVariableTracker); generatorVariableTracker->untrackVariable(nullptr); EXPECT_EQ_ISSUES_LEVELS_REFERENCERULES(nullVariableIssue, errorLevel, nullVariableReferenceRule, generatorVariableTracker); From f697050b5bba5c5bcd34b7059b8b59ab8b65672c Mon Sep 17 00:00:00 2001 From: Alan Garny Date: Tue, 29 Sep 2026 15:05:13 +1300 Subject: [PATCH 4/7] Issue: use `if constexpr` in the compile-time guard. --- src/issue.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/issue.cpp b/src/issue.cpp index 3fc77d374..d402e2ba3 100644 --- a/src/issue.cpp +++ b/src/issue.cpp @@ -254,7 +254,7 @@ static constexpr RuleInformation ruleToInformation[] = { static consteval bool hasInformationForAllRules() { - if (std::size(ruleToInformation) != static_cast(Issue::ReferenceRule::UNSPECIFIED) + 1) { + if constexpr (std::size(ruleToInformation) != static_cast(Issue::ReferenceRule::UNSPECIFIED) + 1) { return false; } From 4d93c934817bf01e4c2044ee51c0e095ead7ce06 Mon Sep 17 00:00:00 2001 From: Alan Garny Date: Wed, 30 Sep 2026 09:59:36 +1300 Subject: [PATCH 5/7] Removed compile-time rule table validation. --- src/issue.cpp | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/issue.cpp b/src/issue.cpp index d402e2ba3..da1b13b5f 100644 --- a/src/issue.cpp +++ b/src/issue.cpp @@ -252,23 +252,6 @@ static constexpr RuleInformation ruleToInformation[] = { {Issue::ReferenceRule::UNSPECIFIED, "", "", "", ""}, }; -static consteval bool hasInformationForAllRules() -{ - if constexpr (std::size(ruleToInformation) != static_cast(Issue::ReferenceRule::UNSPECIFIED) + 1) { - return false; - } - - for (size_t i = 0; i < std::size(ruleToInformation); ++i) { - if (ruleToInformation[i].rule != static_cast(i)) { - return false; - } - } - - return true; -} - -static_assert(hasInformationForAllRules(), "ruleToInformation must have one entry for each Issue::ReferenceRule value, in declaration order."); - static const RuleInformation &ruleInformation(Issue::ReferenceRule rule) { return ruleToInformation[static_cast(rule)]; From f39f572e785de02b3c7443cb1913baed41376d72 Mon Sep 17 00:00:00 2001 From: Alan Garny Date: Wed, 30 Sep 2026 10:46:14 +1300 Subject: [PATCH 6/7] CMake: added Issue reference rule consistency check. Note that it's not a gtest because `ruleToInformation` is file-static in `issue.cpp` and `Issue`'s constructor and `IssueImpl` are private. --- cmake/checkissuereferencerules.cmake | 83 ++++++++++++++++++++++++++++ src/issue.cpp | 2 +- tests/CMakeLists.txt | 1 + 3 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 cmake/checkissuereferencerules.cmake diff --git a/cmake/checkissuereferencerules.cmake b/cmake/checkissuereferencerules.cmake new file mode 100644 index 000000000..d2ae048c6 --- /dev/null +++ b/cmake/checkissuereferencerules.cmake @@ -0,0 +1,83 @@ +# Copyright libCellML Contributors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Check that ruleToInformation (in issue.cpp) has one entry for each +# Issue::ReferenceRule value (in issue.h), in declaration order, and that the +# name of each entry matches its rule. +# Usage: cmake -P checkissuereferencerules.cmake + +set(_ISSUE_HEADER_FILE ${CMAKE_ARGV3}) +set(_ISSUE_SOURCE_FILE ${CMAKE_ARGV4}) + +# Retrieve the Issue::ReferenceRule values. + +file(READ ${_ISSUE_HEADER_FILE} _CONTENT) +string(REGEX MATCH "enum class ReferenceRule[^{]*{([^}]*)}" _MATCH "${_CONTENT}") + +if(NOT _MATCH) + message(FATAL_ERROR "Could not find the Issue::ReferenceRule enum in '${_ISSUE_HEADER_FILE}'.") +endif() + +string(REGEX REPLACE "//[^\n]*" "" _ENUM_BODY "${CMAKE_MATCH_1}") +string(REGEX MATCHALL "[A-Z0-9_]+" _RULES "${_ENUM_BODY}") + +# Retrieve the ruleToInformation entries. + +file(READ ${_ISSUE_SOURCE_FILE} _CONTENT) +string(REGEX MATCH "ruleToInformation\\[\\] = {(.*)\n};" _MATCH "${_CONTENT}") + +if(NOT _MATCH) + message(FATAL_ERROR "Could not find the ruleToInformation table in '${_ISSUE_SOURCE_FILE}'.") +endif() + +string(REGEX MATCHALL "{Issue::ReferenceRule::[A-Z0-9_]+, \"[A-Z0-9_]*\"" _ENTRIES "${CMAKE_MATCH_1}") + +# Compare the two. + +list(LENGTH _RULES _RULES_COUNT) +list(LENGTH _ENTRIES _ENTRIES_COUNT) + +if(NOT _RULES_COUNT EQUAL _ENTRIES_COUNT) + message(FATAL_ERROR "Issue::ReferenceRule has ${_RULES_COUNT} values, but ruleToInformation has ${_ENTRIES_COUNT} entries.") +endif() + +math(EXPR _LAST_INDEX "${_RULES_COUNT} - 1") + +foreach(_INDEX RANGE ${_LAST_INDEX}) + list(GET _RULES ${_INDEX} _RULE) + list(GET _ENTRIES ${_INDEX} _ENTRY) + string(REGEX REPLACE "{Issue::ReferenceRule::([A-Z0-9_]+), \"([A-Z0-9_]*)\"" "\\1;\\2" _ENTRY "${_ENTRY}") + list(GET _ENTRY 0 _ENTRY_RULE) + list(LENGTH _ENTRY _ENTRY_LENGTH) + + if(_ENTRY_LENGTH EQUAL 2) + list(GET _ENTRY 1 _ENTRY_NAME) + else() + set(_ENTRY_NAME "") + endif() + + if(NOT _ENTRY_RULE STREQUAL _RULE) + message(FATAL_ERROR "ruleToInformation entry #${_INDEX} is for '${_ENTRY_RULE}', but Issue::ReferenceRule value #${_INDEX} is '${_RULE}'.") + endif() + + if(_RULE STREQUAL "UNDEFINED" OR _RULE STREQUAL "UNSPECIFIED") + set(_EXPECTED_NAME "") + else() + set(_EXPECTED_NAME ${_RULE}) + endif() + + if(NOT _ENTRY_NAME STREQUAL _EXPECTED_NAME) + message(FATAL_ERROR "ruleToInformation entry for '${_RULE}' has name '${_ENTRY_NAME}', but '${_EXPECTED_NAME}' was expected.") + endif() +endforeach() diff --git a/src/issue.cpp b/src/issue.cpp index da1b13b5f..eb458e67b 100644 --- a/src/issue.cpp +++ b/src/issue.cpp @@ -187,7 +187,7 @@ static constexpr RuleInformation ruleToInformation[] = { {Issue::ReferenceRule::MAP_VARIABLES_ELEMENT, "MAP_VARIABLES_ELEMENT", "2.16", baseSpecificationUrl, "specB16"}, {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE1_ATTRIBUTE, "MAP_VARIABLES_VARIABLE1_ATTRIBUTE", "2.16.1", baseSpecificationUrl, "specB16"}, {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE1_ATTRIBUTE_REFERENCE, "MAP_VARIABLES_VARIABLE1_ATTRIBUTE_REFERENCE", "2.16.1.1", baseSpecificationUrl, "specB16"}, - {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE2_ATTRIBUTE, "MAP_VARIABLES_VARIABLE2", "2.16.2", baseSpecificationUrl, "specB16"}, + {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE2_ATTRIBUTE, "MAP_VARIABLES_VARIABLE2_ATTRIBUTE", "2.16.2", baseSpecificationUrl, "specB16"}, {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE2_ATTRIBUTE_REFERENCE, "MAP_VARIABLES_VARIABLE2_ATTRIBUTE_REFERENCE", "2.16.2.1", baseSpecificationUrl, "specB16"}, {Issue::ReferenceRule::MAP_VARIABLES_UNIQUE, "MAP_VARIABLES_UNIQUE", "2.16.3", baseSpecificationUrl, "specB16"}, diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index b2b96add1..190e53f47 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -126,6 +126,7 @@ endforeach() set(ALL_LIBRARY_SOURCE_FILES ${SOURCE_FILES} ${API_HEADER_FILES} ${MODULE_HEADER_FILES} ${GENERATED_HEADER_FILES} ${HEADER_FILES}) add_test(NAME are_debug_utilities_used COMMAND ${CMAKE_COMMAND} -P ${CMAKE_SOURCE_DIR}/cmake/checkfordebugheaderusage.cmake ${ALL_LIBRARY_SOURCE_FILES}) +add_test(NAME are_issue_reference_rules_consistent COMMAND ${CMAKE_COMMAND} -P ${CMAKE_SOURCE_DIR}/cmake/checkissuereferencerules.cmake ${CMAKE_SOURCE_DIR}/src/api/libcellml/issue.h ${CMAKE_SOURCE_DIR}/src/issue.cpp) # Generate tests for header files. include(api_headers/tests.cmake) From 2871c9b50cfa632249b57c935d795b37624449f6 Mon Sep 17 00:00:00 2001 From: Alan Garny Date: Wed, 30 Sep 2026 12:26:53 +1300 Subject: [PATCH 7/7] CMake: improved the regex processing in checkissuereferencerules. Refactored the regex handling for issue reference rules to use string matching. Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- cmake/checkissuereferencerules.cmake | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/cmake/checkissuereferencerules.cmake b/cmake/checkissuereferencerules.cmake index d2ae048c6..530d3d183 100644 --- a/cmake/checkissuereferencerules.cmake +++ b/cmake/checkissuereferencerules.cmake @@ -57,15 +57,9 @@ math(EXPR _LAST_INDEX "${_RULES_COUNT} - 1") foreach(_INDEX RANGE ${_LAST_INDEX}) list(GET _RULES ${_INDEX} _RULE) list(GET _ENTRIES ${_INDEX} _ENTRY) - string(REGEX REPLACE "{Issue::ReferenceRule::([A-Z0-9_]+), \"([A-Z0-9_]*)\"" "\\1;\\2" _ENTRY "${_ENTRY}") - list(GET _ENTRY 0 _ENTRY_RULE) - list(LENGTH _ENTRY _ENTRY_LENGTH) - - if(_ENTRY_LENGTH EQUAL 2) - list(GET _ENTRY 1 _ENTRY_NAME) - else() - set(_ENTRY_NAME "") - endif() + string(REGEX MATCH "{Issue::ReferenceRule::([A-Z0-9_]+), \"([A-Z0-9_]*)\"" _ENTRY_MATCH "${_ENTRY}") + set(_ENTRY_RULE "${CMAKE_MATCH_1}") + set(_ENTRY_NAME "${CMAKE_MATCH_2}") if(NOT _ENTRY_RULE STREQUAL _RULE) message(FATAL_ERROR "ruleToInformation entry #${_INDEX} is for '${_ENTRY_RULE}', but Issue::ReferenceRule value #${_INDEX} is '${_RULE}'.")