expressir 2.4.29-arm-linux-musl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.cargo/config.toml +3 -0
- data/.github/scripts/test_installed_gem.rb +34 -0
- data/.github/workflows/codeql.yml +35 -0
- data/.github/workflows/docs.yml +99 -0
- data/.github/workflows/links.yml +100 -0
- data/.github/workflows/native-gems.yml +201 -0
- data/.github/workflows/rake.yml +19 -0
- data/.github/workflows/release.yml +37 -0
- data/.github/workflows/rust-ext.yml +41 -0
- data/.github/workflows/stress.yml +36 -0
- data/.github/workflows/validate_schemas.yml +48 -0
- data/.github/workflows/verify_remarks.yml +33 -0
- data/.gitignore +55 -0
- data/.hound.yml +3 -0
- data/.rspec +2 -0
- data/.rubocop.yml +18 -0
- data/.rubocop_todo.yml +297 -0
- data/CHANGELOG.md +159 -0
- data/Gemfile +18 -0
- data/README.adoc +2783 -0
- data/Rakefile +41 -0
- data/TODO.bugs/01-stale-transformer-autoload.md +39 -0
- data/TODO.bugs/02-parser-class-instance-vars.md +36 -0
- data/TODO.bugs/03-builder-mutable-state.md +43 -0
- data/TODO.bugs/04-formatter-public-send-dispatch.md +53 -0
- data/TODO.bugs/05-anonymous-formatter-subclass.md +45 -0
- data/TODO.bugs/06-collection-registry-single-source.md +53 -0
- data/TODO.bugs/07-require-relative-cleanup.md +42 -0
- data/TODO.bugs/08-require-expressir-in-commands.md +34 -0
- data/TODO.bugs/09-parser-split.md +53 -0
- data/TODO.bugs/10-to-s-override.md +42 -0
- data/TODO.bugs/11-parser-class-variables.md +39 -0
- data/TODO.bugs/12-marker-modules-vs-registry.md +64 -0
- data/TODO.bugs/13-string-literal-scanner-limitation.md +52 -0
- data/TODO.bugs/14-model-formatting-leak.md +30 -0
- data/TODO.bugs/15-expression-children-macro.md +27 -0
- data/TODO.bugs/16-pretty-formatter-duplication.md +28 -0
- data/TODO.bugs/17-snake-case-cache-mutable-constant.md +28 -0
- data/TODO.bugs/18-const-get-private-constants.md +30 -0
- data/TODO.bugs/19-format-methods-public.md +22 -0
- data/TODO.bugs/20-coverage-nested-entities-dedup.md +20 -0
- data/TODO.bugs/21-operator-tokens-secondary-dispatch.md +21 -0
- data/TODO.bugs/22-builder-fast-path-wrappers.md +32 -0
- data/TODO.bugs/23-coverage-inverse-maps.md +21 -0
- data/TODO.bugs/24-streaming-builder-complexity.md +19 -0
- data/TODO.bugs/25-debug-puts-in-production.md +21 -0
- data/TODO.bugs/26-generic-entity-children-misplaced.md +21 -0
- data/TODO.bugs/27-package-build-god-method.md +19 -0
- data/TODO.bugs/28-package-god-class.md +30 -0
- data/TODO.bugs/29-validate-ascii-god-class.md +24 -0
- data/TODO.bugs/30-unicode-map-extraction.md +19 -0
- data/TODO.bugs/README.md +43 -0
- data/TODO.max-perf/01-restore-ci-green.md +36 -0
- data/TODO.max-perf/02-streaming-parse-path.md +31 -0
- data/TODO.max-perf/03-cli-parallel-opt-in.md +27 -0
- data/TODO.max-perf/04-benchmark-harness.md +28 -0
- data/TODO.max-perf/05-parallel-fidelity-specs.md +22 -0
- data/TODO.max-perf/06-builder-cpu-audit.md +41 -0
- data/TODO.max-perf/07-upstream-parsanol-roadmap.md +27 -0
- data/TODO.max-perf/08-builder-build-perf.md +45 -0
- data/TODO.max-perf/09-grammar-cold-start.md +25 -0
- data/TODO.max-perf/10-parser-facade-hygiene.md +23 -0
- data/TODO.max-perf/11-ci-green-closeout.md +25 -0
- data/TODO.max-perf/12-require-boot-profile.md +25 -0
- data/TODO.max-perf/13-key-conversion-specs.md +26 -0
- data/TODO.max-perf/14-builder-call-handler-audit.md +28 -0
- data/TODO.parity-ee/00-overview.md +76 -0
- data/TODO.parity-ee/01-annex-g-rule-extraction.md +41 -0
- data/TODO.parity-ee/02-eeng-algorithm-inventory.md +8 -0
- data/TODO.parity-ee/03-eeng-oracle-harness.md +33 -0
- data/TODO.parity-ee/04-shtolo-concatenate.md +44 -0
- data/TODO.parity-ee/05-shtolo-longform-flatten.md +53 -0
- data/TODO.parity-ee/06-interface-scheduling-parity.md +47 -0
- data/TODO.parity-ee/07-semantic-checks-port.md +35 -0
- data/TODO.parity-ee/08-pretty-roundtrip-gate.md +27 -0
- data/TODO.parity-ee/09-smrl-index-and-listing.md +22 -0
- data/TODO.parity-ee/10-interface-dot-graph.md +21 -0
- data/TODO.parity-ee/11-import-eeng-tests.md +79 -0
- data/TODO.parity-ee/12-full-check-catalog.md +67 -0
- data/TODO.parity-ee/13-population-p21.md +54 -0
- data/TODO.parity-ee/14-shtolo-completion.md +44 -0
- data/TODO.parity-ee/15-part28-xml.md +51 -0
- data/TODO.parity-ee/16-compare-patch.md +48 -0
- data/TODO.parity-ee/17-official-tests.md +42 -0
- data/TODO.parity-ee/18-mim-mapping.md +47 -0
- data/TODO.parity-ee/19-architecture.md +97 -0
- data/TODO.parity-ee/parity-matrix.md +108 -0
- data/TODO.refpath-v2/00-overview.md +64 -0
- data/TODO.suma-improvements/00-overview.md +23 -0
- data/TODO.suma-improvements/01-prebuilt-platform-gems.md +33 -0
- data/TODO.suma-improvements/02-suma-e2e.md +39 -0
- data/TODO.suma-improvements/03-item-graph.md +22 -0
- data/TODO.suma-improvements/04-compiled-set-default.md +16 -0
- data/TODO.suma-improvements/05-validation-in-docs.md +17 -0
- data/TODO.suma-improvements/06-memory-remeasure.md +36 -0
- data/TODO.suma-improvements/07-part28-xml.md +15 -0
- data/TODO.suma-improvements/08-windows-gnu-toolchain.md +15 -0
- data/TODO.suma-improvements/09-checker-tranche3.md +13 -0
- data/TODO.suma-improvements/10-expressdoc.md +8 -0
- data/benchmark/srl_benchmark.rb +458 -0
- data/benchmark/srl_native_benchmark.rb +146 -0
- data/benchmark/srl_ruby_benchmark.rb +132 -0
- data/bin/console +11 -0
- data/bin/rspec +30 -0
- data/bin/setup +8 -0
- data/docs/Gemfile +12 -0
- data/docs/_config.yml +141 -0
- data/docs/_guides/changes/changes-format.adoc +778 -0
- data/docs/_guides/changes/importing-eengine.adoc +898 -0
- data/docs/_guides/changes/index.adoc +396 -0
- data/docs/_guides/changes/programmatic-usage.adoc +1038 -0
- data/docs/_guides/changes/validating-changes.adoc +681 -0
- data/docs/_guides/cli/benchmark-performance.adoc +834 -0
- data/docs/_guides/cli/coverage-analysis.adoc +921 -0
- data/docs/_guides/cli/format-schemas.adoc +547 -0
- data/docs/_guides/cli/index.adoc +8 -0
- data/docs/_guides/cli/managing-changes.adoc +927 -0
- data/docs/_guides/cli/validate-ascii.adoc +645 -0
- data/docs/_guides/cli/validate-schemas.adoc +534 -0
- data/docs/_guides/formatter/formatter-architecture.adoc +401 -0
- data/docs/_guides/index.adoc +165 -0
- data/docs/_guides/ler/creating-packages.adoc +664 -0
- data/docs/_guides/ler/index.adoc +305 -0
- data/docs/_guides/ler/loading-packages.adoc +707 -0
- data/docs/_guides/ler/package-formats.adoc +748 -0
- data/docs/_guides/ler/querying-packages.adoc +826 -0
- data/docs/_guides/ler/step-packages.adoc +385 -0
- data/docs/_guides/ler/validating-packages.adoc +750 -0
- data/docs/_guides/liquid/basic-templates.adoc +813 -0
- data/docs/_guides/liquid/documentation-generation.adoc +1042 -0
- data/docs/_guides/liquid/drops-reference.adoc +829 -0
- data/docs/_guides/liquid/filters-and-tags.adoc +912 -0
- data/docs/_guides/liquid/index.adoc +468 -0
- data/docs/_guides/manifests/creating-manifests.adoc +483 -0
- data/docs/_guides/manifests/index.adoc +307 -0
- data/docs/_guides/manifests/resolving-manifests.adoc +557 -0
- data/docs/_guides/manifests/validating-manifests.adoc +713 -0
- data/docs/_guides/ruby-api/formatting-schemas.adoc +605 -0
- data/docs/_guides/ruby-api/index.adoc +257 -0
- data/docs/_guides/ruby-api/parsing-files.adoc +421 -0
- data/docs/_guides/ruby-api/search-engine.adoc +609 -0
- data/docs/_guides/ruby-api/working-with-repository.adoc +577 -0
- data/docs/_pages/data-model.adoc +665 -0
- data/docs/_pages/express-language.adoc +506 -0
- data/docs/_pages/getting-started.adoc +414 -0
- data/docs/_pages/index.adoc +116 -0
- data/docs/_pages/introduction.adoc +256 -0
- data/docs/_pages/ler-packages.adoc +837 -0
- data/docs/_pages/parsers.adoc +709 -0
- data/docs/_pages/schema-manifests.adoc +431 -0
- data/docs/_references/index.adoc +228 -0
- data/docs/_tutorials/creating-ler-package.adoc +735 -0
- data/docs/_tutorials/documentation-coverage.adoc +795 -0
- data/docs/_tutorials/formatting-schemas.adoc +89 -0
- data/docs/_tutorials/index.adoc +231 -0
- data/docs/_tutorials/liquid-templates.adoc +806 -0
- data/docs/_tutorials/parsing-your-first-schema.adoc +522 -0
- data/docs/_tutorials/querying-schemas.adoc +751 -0
- data/docs/_tutorials/working-with-multiple-schemas.adoc +676 -0
- data/docs/index.adoc +242 -0
- data/docs/lychee.toml +90 -0
- data/examples/demo_ler_usage.sh +86 -0
- data/examples/ler/README.md +111 -0
- data/examples/ler/simple_example.ler +0 -0
- data/examples/ler/simple_schema.exp +33 -0
- data/examples/ler_build.rb +75 -0
- data/examples/ler_cli.rb +79 -0
- data/examples/ler_demo_complete.rb +276 -0
- data/examples/ler_query.rb +91 -0
- data/examples/ler_query_examples.rb +305 -0
- data/examples/ler_stats.rb +81 -0
- data/examples/phase3_demo.rb +159 -0
- data/examples/query_demo_simple.rb +131 -0
- data/exe/expressir +11 -0
- data/exe/expressir-format +14 -0
- data/exe/expressir-format-test +82 -0
- data/expressir.gemspec +61 -0
- data/lib/expressir/3.2/expressir_core.so +0 -0
- data/lib/expressir/3.3/expressir_core.so +0 -0
- data/lib/expressir/3.4/expressir_core.so +0 -0
- data/lib/expressir/4.0/expressir_core.so +0 -0
- data/lib/expressir/benchmark.rb +310 -0
- data/lib/expressir/changes/item_change.rb +20 -0
- data/lib/expressir/changes/mapping_change.rb +16 -0
- data/lib/expressir/changes/schema_change.rb +85 -0
- data/lib/expressir/changes/version_change.rb +26 -0
- data/lib/expressir/changes.rb +9 -0
- data/lib/expressir/cli.rb +148 -0
- data/lib/expressir/commands/base.rb +25 -0
- data/lib/expressir/commands/benchmark.rb +59 -0
- data/lib/expressir/commands/benchmark_cache.rb +80 -0
- data/lib/expressir/commands/changes.rb +34 -0
- data/lib/expressir/commands/changes_import_eengine.rb +146 -0
- data/lib/expressir/commands/changes_validate.rb +63 -0
- data/lib/expressir/commands/check.rb +56 -0
- data/lib/expressir/commands/clean.rb +20 -0
- data/lib/expressir/commands/coverage.rb +458 -0
- data/lib/expressir/commands/expand.rb +26 -0
- data/lib/expressir/commands/file_violations.rb +70 -0
- data/lib/expressir/commands/fix.rb +33 -0
- data/lib/expressir/commands/flatten.rb +29 -0
- data/lib/expressir/commands/format.rb +43 -0
- data/lib/expressir/commands/manifest.rb +420 -0
- data/lib/expressir/commands/mapping_validate.rb +68 -0
- data/lib/expressir/commands/non_ascii_character.rb +49 -0
- data/lib/expressir/commands/non_ascii_violation_collection.rb +301 -0
- data/lib/expressir/commands/package.rb +1222 -0
- data/lib/expressir/commands/parity_inputs.rb +160 -0
- data/lib/expressir/commands/validate.rb +106 -0
- data/lib/expressir/commands/validate_ascii.rb +94 -0
- data/lib/expressir/commands/validate_load.rb +91 -0
- data/lib/expressir/commands/version.rb +9 -0
- data/lib/expressir/commands/xsd.rb +23 -0
- data/lib/expressir/commands.rb +30 -0
- data/lib/expressir/config.rb +60 -0
- data/lib/expressir/coverage.rb +510 -0
- data/lib/expressir/eengine/arm_compare_report.rb +23 -0
- data/lib/expressir/eengine/changes_section.rb +16 -0
- data/lib/expressir/eengine/compare_report.rb +69 -0
- data/lib/expressir/eengine/mim_compare_report.rb +23 -0
- data/lib/expressir/eengine/modified_object.rb +21 -0
- data/lib/expressir/eengine.rb +9 -0
- data/lib/expressir/errors.rb +113 -0
- data/lib/expressir/express/adoc_hyperlink_formatter.rb +30 -0
- data/lib/expressir/express/adoc_source_formatter.rb +12 -0
- data/lib/expressir/express/ast_key_converter.rb +114 -0
- data/lib/expressir/express/builder.rb +277 -0
- data/lib/expressir/express/builder_context.rb +22 -0
- data/lib/expressir/express/builder_registry.rb +397 -0
- data/lib/expressir/express/builders/attribute_decl_builder.rb +32 -0
- data/lib/expressir/express/builders/built_in_builder.rb +75 -0
- data/lib/expressir/express/builders/constant_builder.rb +108 -0
- data/lib/expressir/express/builders/declaration_builder.rb +20 -0
- data/lib/expressir/express/builders/derive_clause_builder.rb +14 -0
- data/lib/expressir/express/builders/derived_attr_builder.rb +28 -0
- data/lib/expressir/express/builders/domain_rule_builder.rb +21 -0
- data/lib/expressir/express/builders/entity_decl_builder.rb +116 -0
- data/lib/expressir/express/builders/explicit_attr_builder.rb +49 -0
- data/lib/expressir/express/builders/expression_builder.rb +416 -0
- data/lib/expressir/express/builders/function_decl_builder.rb +86 -0
- data/lib/expressir/express/builders/helpers.rb +148 -0
- data/lib/expressir/express/builders/interface_builder.rb +151 -0
- data/lib/expressir/express/builders/inverse_attr_builder.rb +43 -0
- data/lib/expressir/express/builders/inverse_attr_type_builder.rb +30 -0
- data/lib/expressir/express/builders/inverse_clause_builder.rb +14 -0
- data/lib/expressir/express/builders/literal_builder.rb +93 -0
- data/lib/expressir/express/builders/procedure_decl_builder.rb +82 -0
- data/lib/expressir/express/builders/qualifier_builder.rb +102 -0
- data/lib/expressir/express/builders/reference_builder.rb +18 -0
- data/lib/expressir/express/builders/rule_decl_builder.rb +97 -0
- data/lib/expressir/express/builders/schema_body_decl_builder.rb +18 -0
- data/lib/expressir/express/builders/schema_decl_builder.rb +56 -0
- data/lib/expressir/express/builders/schema_version_builder.rb +34 -0
- data/lib/expressir/express/builders/simple_id_builder.rb +17 -0
- data/lib/expressir/express/builders/statement_builder.rb +243 -0
- data/lib/expressir/express/builders/subtype_constraint_builder.rb +166 -0
- data/lib/expressir/express/builders/syntax_builder.rb +30 -0
- data/lib/expressir/express/builders/type_builder.rb +238 -0
- data/lib/expressir/express/builders/type_decl_builder.rb +26 -0
- data/lib/expressir/express/builders/unique_clause_builder.rb +20 -0
- data/lib/expressir/express/builders/unique_rule_builder.rb +41 -0
- data/lib/expressir/express/builders/where_clause_builder.rb +20 -0
- data/lib/expressir/express/builders.rb +55 -0
- data/lib/expressir/express/cache.rb +76 -0
- data/lib/expressir/express/checker.rb +812 -0
- data/lib/expressir/express/concatenator.rb +79 -0
- data/lib/expressir/express/core.rb +95 -0
- data/lib/expressir/express/error.rb +124 -0
- data/lib/expressir/express/formatter.rb +149 -0
- data/lib/expressir/express/formatters/data_types_formatter.rb +362 -0
- data/lib/expressir/express/formatters/declarations_formatter.rb +753 -0
- data/lib/expressir/express/formatters/expressions_formatter.rb +180 -0
- data/lib/expressir/express/formatters/literals_formatter.rb +55 -0
- data/lib/expressir/express/formatters/references_formatter.rb +53 -0
- data/lib/expressir/express/formatters/remark_formatter.rb +270 -0
- data/lib/expressir/express/formatters/remark_item_formatter.rb +28 -0
- data/lib/expressir/express/formatters/statements_formatter.rb +272 -0
- data/lib/expressir/express/formatters/supertype_expressions_formatter.rb +54 -0
- data/lib/expressir/express/formatters.rb +22 -0
- data/lib/expressir/express/grammar/parser.rb +712 -0
- data/lib/expressir/express/grammar.rb +11 -0
- data/lib/expressir/express/hyperlink_formatter.rb +35 -0
- data/lib/expressir/express/interface_dot.rb +105 -0
- data/lib/expressir/express/lazy_repository.rb +211 -0
- data/lib/expressir/express/line_map.rb +48 -0
- data/lib/expressir/express/listing.rb +174 -0
- data/lib/expressir/express/model_traversal.rb +42 -0
- data/lib/expressir/express/model_visitor.rb +25 -0
- data/lib/expressir/express/node_position_index.rb +342 -0
- data/lib/expressir/express/parallel_files.rb +229 -0
- data/lib/expressir/express/parser.rb +523 -0
- data/lib/expressir/express/pretty_formatter.rb +586 -0
- data/lib/expressir/express/pretty_gate.rb +61 -0
- data/lib/expressir/express/refs_overlay.rb +47 -0
- data/lib/expressir/express/remark_attacher.rb +1098 -0
- data/lib/expressir/express/remark_overlay.rb +86 -0
- data/lib/expressir/express/remark_scanner.rb +245 -0
- data/lib/expressir/express/resolve_references_model_visitor.rb +29 -0
- data/lib/expressir/express/schema_block_scanner.rb +137 -0
- data/lib/expressir/express/schema_head_formatter.rb +22 -0
- data/lib/expressir/express/schema_plain_source_formatter.rb +11 -0
- data/lib/expressir/express/schema_source_formatter.rb +15 -0
- data/lib/expressir/express/scope_resolver.rb +223 -0
- data/lib/expressir/express/self_schema_reference.rb +126 -0
- data/lib/expressir/express/shtolo.rb +679 -0
- data/lib/expressir/express/smrl_xml.rb +125 -0
- data/lib/expressir/express/source_formatter.rb +15 -0
- data/lib/expressir/express/streaming_builder.rb +435 -0
- data/lib/expressir/express/xsd.rb +259 -0
- data/lib/expressir/express.rb +53 -0
- data/lib/expressir/liquid.rb +1 -0
- data/lib/expressir/manifest/resolver.rb +210 -0
- data/lib/expressir/manifest/validator.rb +192 -0
- data/lib/expressir/manifest.rb +6 -0
- data/lib/expressir/mapping/refpath.rb +857 -0
- data/lib/expressir/mapping.rb +253 -0
- data/lib/expressir/model/cache.rb +18 -0
- data/lib/expressir/model/concerns.rb +42 -0
- data/lib/expressir/model/data_types/aggregate.rb +26 -0
- data/lib/expressir/model/data_types/array.rb +25 -0
- data/lib/expressir/model/data_types/bag.rb +21 -0
- data/lib/expressir/model/data_types/binary.rb +19 -0
- data/lib/expressir/model/data_types/boolean.rb +15 -0
- data/lib/expressir/model/data_types/enumeration.rb +21 -0
- data/lib/expressir/model/data_types/enumeration_item.rb +24 -0
- data/lib/expressir/model/data_types/generic.rb +24 -0
- data/lib/expressir/model/data_types/generic_entity.rb +24 -0
- data/lib/expressir/model/data_types/integer.rb +15 -0
- data/lib/expressir/model/data_types/list.rb +23 -0
- data/lib/expressir/model/data_types/logical.rb +15 -0
- data/lib/expressir/model/data_types/number.rb +15 -0
- data/lib/expressir/model/data_types/real.rb +17 -0
- data/lib/expressir/model/data_types/select.rb +23 -0
- data/lib/expressir/model/data_types/set.rb +21 -0
- data/lib/expressir/model/data_types/string.rb +19 -0
- data/lib/expressir/model/data_types.rb +25 -0
- data/lib/expressir/model/declarations/attribute.rb +38 -0
- data/lib/expressir/model/declarations/constant.rb +28 -0
- data/lib/expressir/model/declarations/derived_attribute.rb +25 -0
- data/lib/expressir/model/declarations/entity.rb +62 -0
- data/lib/expressir/model/declarations/function.rb +59 -0
- data/lib/expressir/model/declarations/informal_proposition_rule.rb +25 -0
- data/lib/expressir/model/declarations/interface.rb +37 -0
- data/lib/expressir/model/declarations/interface_item.rb +21 -0
- data/lib/expressir/model/declarations/interfaced_item.rb +33 -0
- data/lib/expressir/model/declarations/inverse_attribute.rb +25 -0
- data/lib/expressir/model/declarations/parameter.rb +28 -0
- data/lib/expressir/model/declarations/procedure.rb +57 -0
- data/lib/expressir/model/declarations/remark_item.rb +21 -0
- data/lib/expressir/model/declarations/rule.rb +66 -0
- data/lib/expressir/model/declarations/schema.rb +215 -0
- data/lib/expressir/model/declarations/schema_version.rb +19 -0
- data/lib/expressir/model/declarations/schema_version_item.rb +19 -0
- data/lib/expressir/model/declarations/subtype_constraint.rb +32 -0
- data/lib/expressir/model/declarations/type.rb +45 -0
- data/lib/expressir/model/declarations/unique_rule.rb +26 -0
- data/lib/expressir/model/declarations/variable.rb +28 -0
- data/lib/expressir/model/declarations/where_rule.rb +26 -0
- data/lib/expressir/model/declarations.rb +31 -0
- data/lib/expressir/model/dependency_resolver.rb +268 -0
- data/lib/expressir/model/exp_file.rb +42 -0
- data/lib/expressir/model/expressions/aggregate_initializer.rb +18 -0
- data/lib/expressir/model/expressions/aggregate_initializer_item.rb +20 -0
- data/lib/expressir/model/expressions/binary_expression.rb +59 -0
- data/lib/expressir/model/expressions/entity_constructor.rb +20 -0
- data/lib/expressir/model/expressions/function_call.rb +20 -0
- data/lib/expressir/model/expressions/interval.rb +29 -0
- data/lib/expressir/model/expressions/query_expression.rb +31 -0
- data/lib/expressir/model/expressions/unary_expression.rb +25 -0
- data/lib/expressir/model/expressions.rb +18 -0
- data/lib/expressir/model/identifier.rb +26 -0
- data/lib/expressir/model/indexes/entity_index.rb +103 -0
- data/lib/expressir/model/indexes/item_graph.rb +185 -0
- data/lib/expressir/model/indexes/reference_index.rb +148 -0
- data/lib/expressir/model/indexes/type_index.rb +149 -0
- data/lib/expressir/model/indexes.rb +12 -0
- data/lib/expressir/model/interface_validator.rb +384 -0
- data/lib/expressir/model/literals/binary.rb +17 -0
- data/lib/expressir/model/literals/integer.rb +17 -0
- data/lib/expressir/model/literals/logical.rb +21 -0
- data/lib/expressir/model/literals/real.rb +17 -0
- data/lib/expressir/model/literals/string.rb +20 -0
- data/lib/expressir/model/literals.rb +13 -0
- data/lib/expressir/model/model_element.rb +377 -0
- data/lib/expressir/model/references/attribute_reference.rb +19 -0
- data/lib/expressir/model/references/group_reference.rb +19 -0
- data/lib/expressir/model/references/index_reference.rb +23 -0
- data/lib/expressir/model/references/simple_reference.rb +21 -0
- data/lib/expressir/model/references.rb +12 -0
- data/lib/expressir/model/remark_format.rb +17 -0
- data/lib/expressir/model/remark_info.rb +92 -0
- data/lib/expressir/model/remark_placement.rb +42 -0
- data/lib/expressir/model/repository.rb +483 -0
- data/lib/expressir/model/repository_validator.rb +293 -0
- data/lib/expressir/model/search_engine.rb +551 -0
- data/lib/expressir/model/statements/alias.rb +31 -0
- data/lib/expressir/model/statements/assignment.rb +23 -0
- data/lib/expressir/model/statements/case.rb +42 -0
- data/lib/expressir/model/statements/case_action.rb +20 -0
- data/lib/expressir/model/statements/compound.rb +21 -0
- data/lib/expressir/model/statements/escape.rb +18 -0
- data/lib/expressir/model/statements/if.rb +26 -0
- data/lib/expressir/model/statements/null.rb +18 -0
- data/lib/expressir/model/statements/procedure_call.rb +22 -0
- data/lib/expressir/model/statements/repeat.rb +40 -0
- data/lib/expressir/model/statements/return.rb +20 -0
- data/lib/expressir/model/statements/skip.rb +18 -0
- data/lib/expressir/model/statements.rb +20 -0
- data/lib/expressir/model/supertype_expressions/binary_supertype_expression.rb +25 -0
- data/lib/expressir/model/supertype_expressions/oneof_supertype_expression.rb +17 -0
- data/lib/expressir/model/supertype_expressions.rb +12 -0
- data/lib/expressir/model.rb +39 -0
- data/lib/expressir/package/builder.rb +231 -0
- data/lib/expressir/package/metadata.rb +79 -0
- data/lib/expressir/package/reader.rb +149 -0
- data/lib/expressir/package.rb +8 -0
- data/lib/expressir/schema_manifest.rb +159 -0
- data/lib/expressir/schema_manifest_entry.rb +15 -0
- data/lib/expressir/version.rb +8 -0
- data/lib/expressir.rb +94 -0
- data/lib/tasks/verify_remarks.rake +16 -0
- data/rakelib/native.rake +24 -0
- data/rakelib/oracle.rake +52 -0
- data/rakelib/verify_remarks.rake +16 -0
- metadata +692 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Expressir
|
|
4
|
+
module Express
|
|
5
|
+
# Resolves the containing scope for a remark line.
|
|
6
|
+
#
|
|
7
|
+
# One interface (`containing_scope_for`), four strategies behind it:
|
|
8
|
+
# 1. O(1) lookup via a precomputed line→scope-name map
|
|
9
|
+
# 2. O(n) position-based fallback against the node index
|
|
10
|
+
# 3. Source-text scan for entity/type/rule boundaries
|
|
11
|
+
# 4. Schema-wide search by name
|
|
12
|
+
#
|
|
13
|
+
# Extracted from RemarkAttacher to deepen the seam: scope lookup is the
|
|
14
|
+
# only concern here, so changes to scope-detection heuristics land in
|
|
15
|
+
# one module and the attacher stops carrying the how.
|
|
16
|
+
class ScopeResolver
|
|
17
|
+
# Match declarations of the scopes we track.
|
|
18
|
+
SCOPE_OPEN_PATTERNS = {
|
|
19
|
+
Model::Declarations::Schema => /^\s*SCHEMA\s+(\w+)/i,
|
|
20
|
+
Model::Declarations::Function => /^\s*FUNCTION\s+(\w+)/i,
|
|
21
|
+
Model::Declarations::Procedure => /^\s*PROCEDURE\s+(\w+)/i,
|
|
22
|
+
Model::Declarations::Rule => /^\s*RULE\s+(\w+)/i,
|
|
23
|
+
Model::Declarations::Entity => /^\s*ENTITY\s+(\w+)/i,
|
|
24
|
+
Model::Declarations::Type => /^\s*TYPE\s+(\w+)/i,
|
|
25
|
+
}.freeze
|
|
26
|
+
|
|
27
|
+
SCOPE_CLOSE_PATTERNS = {
|
|
28
|
+
Model::Declarations::Schema => /END_SCHEMA/i,
|
|
29
|
+
Model::Declarations::Function => /END_FUNCTION/i,
|
|
30
|
+
Model::Declarations::Procedure => /END_PROCEDURE/i,
|
|
31
|
+
Model::Declarations::Rule => /END_RULE/i,
|
|
32
|
+
Model::Declarations::Entity => /END_ENTITY/i,
|
|
33
|
+
Model::Declarations::Type => /END_TYPE/i,
|
|
34
|
+
}.freeze
|
|
35
|
+
|
|
36
|
+
# Map scope node class → schema-level collection accessor on Schema.
|
|
37
|
+
SCHEMA_COLLECTION_ACCESSOR = {
|
|
38
|
+
Model::Declarations::Entity => lambda(&:entities),
|
|
39
|
+
Model::Declarations::Type => lambda(&:types),
|
|
40
|
+
Model::Declarations::Rule => lambda(&:rules),
|
|
41
|
+
}.freeze
|
|
42
|
+
|
|
43
|
+
# Schema-level collections searched when resolving a scope name to a
|
|
44
|
+
# model node. Sourced from Model::Declarations::Schema::SCOPE_DECL_COLLECTIONS
|
|
45
|
+
# so the "which Schema collections hold named scopes" fact lives on
|
|
46
|
+
# the model, not duplicated here.
|
|
47
|
+
|
|
48
|
+
def initialize(source:, model:, nodes_with_positions:)
|
|
49
|
+
@source = source
|
|
50
|
+
@model = model
|
|
51
|
+
@nodes_with_positions = nodes_with_positions
|
|
52
|
+
@scope_map = nil
|
|
53
|
+
@source_lines = nil
|
|
54
|
+
@position_buckets = nil
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Line-band width for the position fallback index.
|
|
58
|
+
BUCKET_LINES = 1024
|
|
59
|
+
|
|
60
|
+
# Returns the innermost Model::ScopeContainer whose source span contains
|
|
61
|
+
# the given 1-based remark line, or nil if none is found.
|
|
62
|
+
def containing_scope_for(remark_line)
|
|
63
|
+
scope = find_by_name(remark_line)
|
|
64
|
+
scope ||= find_by_position(remark_line)
|
|
65
|
+
scope
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Source-text fallback: scan backwards from remark_line for the
|
|
69
|
+
# entity/type/rule declaration that contains it. Used by the attacher
|
|
70
|
+
# when both name- and position-based lookup miss (e.g. for IP tags
|
|
71
|
+
# whose target is a Type/Entity/Rule declared on a previous line).
|
|
72
|
+
def find_by_source_text(remark_line)
|
|
73
|
+
entity_state = { line: nil, name: nil }
|
|
74
|
+
type_state = { line: nil, name: nil }
|
|
75
|
+
rule_state = { line: nil, name: nil }
|
|
76
|
+
|
|
77
|
+
source_lines.each_with_index do |line, idx|
|
|
78
|
+
line_num = idx + 1
|
|
79
|
+
|
|
80
|
+
case line
|
|
81
|
+
when /^\s*ENTITY\s+(\w+)/i
|
|
82
|
+
entity_state = { line: line_num, name: $1 }
|
|
83
|
+
when /^\s*END_ENTITY/i
|
|
84
|
+
return find_in_schema(Model::Declarations::Entity, entity_state[:name]) if span_contains?(entity_state, remark_line, line_num)
|
|
85
|
+
|
|
86
|
+
entity_state = { line: nil, name: nil }
|
|
87
|
+
when /^\s*TYPE\s+(\w+)/i
|
|
88
|
+
type_state = { line: line_num, name: $1 }
|
|
89
|
+
when /^\s*END_TYPE/i
|
|
90
|
+
return find_in_schema(Model::Declarations::Type, type_state[:name]) if span_contains?(type_state, remark_line, line_num)
|
|
91
|
+
|
|
92
|
+
type_state = { line: nil, name: nil }
|
|
93
|
+
when /^\s*RULE\s+(\w+)/i
|
|
94
|
+
rule_state = { line: line_num, name: $1 }
|
|
95
|
+
when /^\s*END_RULE/i
|
|
96
|
+
return find_in_schema(Model::Declarations::Rule, rule_state[:name]) if span_contains?(rule_state, remark_line, line_num)
|
|
97
|
+
|
|
98
|
+
rule_state = { line: nil, name: nil }
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
nil
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
private
|
|
106
|
+
|
|
107
|
+
def span_contains?(state, remark_line, end_line)
|
|
108
|
+
state[:line] && remark_line >= state[:line] && remark_line <= end_line
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# --- Strategy 1: precomputed line → scope-name map ---
|
|
112
|
+
|
|
113
|
+
def find_by_name(remark_line)
|
|
114
|
+
scope_name = scope_map[remark_line]
|
|
115
|
+
return nil unless scope_name
|
|
116
|
+
return nil unless @model
|
|
117
|
+
|
|
118
|
+
@model.schemas.each do |schema|
|
|
119
|
+
return schema if schema.id == scope_name
|
|
120
|
+
|
|
121
|
+
Model::Declarations::Schema::SCOPE_DECL_COLLECTIONS.each do |decl_type|
|
|
122
|
+
collection = schema.public_send(decl_type)
|
|
123
|
+
next unless collection.is_a?(Array)
|
|
124
|
+
|
|
125
|
+
found = collection.find { |n| n.id == scope_name }
|
|
126
|
+
return found if found
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
nil
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# Lazily build, on first lookup, the line → scope-name table.
|
|
134
|
+
# O(file_lines) scan; subsequent lookups are O(1).
|
|
135
|
+
def scope_map
|
|
136
|
+
@scope_map ||= build_scope_map
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# Source split into lines, computed once per resolver: both the
|
|
140
|
+
# scope-map build and find_by_source_text need it, and re-splitting the
|
|
141
|
+
# whole source per lookup dominates remark attachment on large files.
|
|
142
|
+
def source_lines
|
|
143
|
+
@source_lines ||= @source.lines
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def build_scope_map
|
|
147
|
+
lines = source_lines
|
|
148
|
+
map = {}
|
|
149
|
+
return map if lines.empty?
|
|
150
|
+
|
|
151
|
+
stack = [] # array of { type: Class, name: String }
|
|
152
|
+
|
|
153
|
+
lines.each_with_index do |line, idx|
|
|
154
|
+
line_num = idx + 1
|
|
155
|
+
|
|
156
|
+
SCOPE_OPEN_PATTERNS.each do |klass, pattern|
|
|
157
|
+
stack << { type: klass, name: $1 } if line =~ pattern
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
SCOPE_CLOSE_PATTERNS.each do |klass, pattern|
|
|
161
|
+
next unless line&.match?(pattern)
|
|
162
|
+
next unless stack.last && stack.last[:type] == klass
|
|
163
|
+
|
|
164
|
+
stack.pop
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
map[line_num] = stack.last&.dig(:name)
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
map
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
# --- Strategy 2: position-based fallback against the node index ---
|
|
174
|
+
|
|
175
|
+
# Nodes bucketed by 1024-line bands: a node spanning [line, end_line]
|
|
176
|
+
# is registered in every band it overlaps, so a remark-line lookup only
|
|
177
|
+
# scans nodes that can possibly contain it. Bucket order preserves the
|
|
178
|
+
# original index order, so select+reverse_each semantics are unchanged.
|
|
179
|
+
def position_buckets
|
|
180
|
+
@position_buckets ||= begin
|
|
181
|
+
buckets = Hash.new { |h, k| h[k] = [] }
|
|
182
|
+
@nodes_with_positions.each do |n|
|
|
183
|
+
next unless n[:line] && n[:end_line]
|
|
184
|
+
|
|
185
|
+
((n[:line] / BUCKET_LINES)..(n[:end_line] / BUCKET_LINES)).each do |b|
|
|
186
|
+
buckets[b] << n
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
buckets
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def find_by_position(remark_line)
|
|
194
|
+
containing = position_buckets[remark_line / BUCKET_LINES].select do |n|
|
|
195
|
+
remark_line.between?(n[:line], n[:end_line]) &&
|
|
196
|
+
!n[:node].is_a?(Model::Repository) && !n[:node].is_a?(Model::Cache)
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
containing.reverse_each do |n|
|
|
200
|
+
return n[:node] if n[:node].is_a?(Model::ScopeContainer)
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
nil
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
# --- Schema-wide name search (used by source-text fallback) ---
|
|
207
|
+
|
|
208
|
+
def find_in_schema(node_class, name)
|
|
209
|
+
return nil unless @model && name
|
|
210
|
+
|
|
211
|
+
accessor = SCHEMA_COLLECTION_ACCESSOR[node_class]
|
|
212
|
+
return nil unless accessor
|
|
213
|
+
|
|
214
|
+
@model.schemas.each do |schema|
|
|
215
|
+
found = accessor.call(schema)&.find { |n| n.id == name }
|
|
216
|
+
return found if found
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
nil
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
end
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Expressir
|
|
4
|
+
module Express
|
|
5
|
+
# Self-schema-qualified references (#125, ISO 10303-11 scope rules).
|
|
6
|
+
#
|
|
7
|
+
# A schema may not reference its own declarations through itself:
|
|
8
|
+
# `'AIC_TOPOLOGICALLY_BOUNDED_SURFACE.B_SPLINE_SURFACE'` inside that
|
|
9
|
+
# schema's TYPEOF is technically incorrect — the prefix names the
|
|
10
|
+
# current schema while the item actually comes from another schema
|
|
11
|
+
# (implicit through the supertype chain of a USEd entity).
|
|
12
|
+
#
|
|
13
|
+
# {matches} finds string literals carrying such prefixes and resolves
|
|
14
|
+
# where the suffixed item truly lives (local declaration, or the
|
|
15
|
+
# defining schema within the closure). {fix!} rewrites each literal in
|
|
16
|
+
# place — dropping the prefix for local items, substituting the true
|
|
17
|
+
# defining schema otherwise.
|
|
18
|
+
module SelfSchemaReference
|
|
19
|
+
Match = Struct.new(:literal, :item, :source_schema, :schema,
|
|
20
|
+
keyword_init: true) do
|
|
21
|
+
# :local - the item is declared in this schema (drop the prefix)
|
|
22
|
+
# :foreign - the item's defining schema is known (substitute it)
|
|
23
|
+
# :unknown - the item could not be located; left untouched
|
|
24
|
+
def status
|
|
25
|
+
return :local if declared_locally
|
|
26
|
+
return :foreign if source_schema
|
|
27
|
+
|
|
28
|
+
:unknown
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
attr_accessor :declared_locally
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
module_function
|
|
35
|
+
|
|
36
|
+
# Every self-qualified string literal in +schema+.
|
|
37
|
+
def matches(schema)
|
|
38
|
+
prefix = /\A#{Regexp.escape(schema.id)}\.(.+)\z/i
|
|
39
|
+
literals(schema).filter_map do |literal|
|
|
40
|
+
suffix = literal.value[prefix, 1]
|
|
41
|
+
next unless suffix
|
|
42
|
+
|
|
43
|
+
item = suffix.strip
|
|
44
|
+
declared_locally = declared?(schema, item.safe_downcase)
|
|
45
|
+
source = declared_locally ? nil : defining_schema(schema, item)
|
|
46
|
+
match = Match.new(literal: literal, item: item,
|
|
47
|
+
source_schema: source, schema: schema)
|
|
48
|
+
match.declared_locally = declared_locally
|
|
49
|
+
match
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Rewrite every self-qualified literal in +schema+; returns the
|
|
54
|
+
# number of rewrites. Local items lose the prefix; foreign items get
|
|
55
|
+
# their true defining schema's id.
|
|
56
|
+
def fix!(schema)
|
|
57
|
+
matches(schema).count do |match|
|
|
58
|
+
replacement = case match.status
|
|
59
|
+
when :local then match.item
|
|
60
|
+
when :foreign
|
|
61
|
+
"#{match.source_schema.id}.#{match.item}"
|
|
62
|
+
else next false
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
match.literal.value = replacement
|
|
66
|
+
true
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def literals(schema)
|
|
71
|
+
result = []
|
|
72
|
+
visitor = lambda do |node|
|
|
73
|
+
case node
|
|
74
|
+
when Model::Literals::String
|
|
75
|
+
result << node
|
|
76
|
+
when Model::ModelElement
|
|
77
|
+
node.class.attributes.each_key do |attr|
|
|
78
|
+
next if Model::ModelElement::SKIP_ATTRIBUTES.include?(attr)
|
|
79
|
+
|
|
80
|
+
value = node.public_send(attr)
|
|
81
|
+
case value
|
|
82
|
+
when Array then value.each { |item| visitor.call(item) }
|
|
83
|
+
when Model::ModelElement then visitor.call(value)
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
visitor.call(schema)
|
|
89
|
+
result
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def defining_schema(schema, item)
|
|
93
|
+
key = item.safe_downcase
|
|
94
|
+
repository = repository_of(schema)
|
|
95
|
+
return nil unless repository
|
|
96
|
+
|
|
97
|
+
repository.schemas.each do |other|
|
|
98
|
+
next if other.equal?(schema)
|
|
99
|
+
next unless declared?(other, key)
|
|
100
|
+
|
|
101
|
+
return other
|
|
102
|
+
end
|
|
103
|
+
nil
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def declared?(schema, key)
|
|
107
|
+
%i[types entities functions procedures constants rules
|
|
108
|
+
subtype_constraints].any? do |coll|
|
|
109
|
+
Array(schema.public_send(coll)).any? do |decl|
|
|
110
|
+
decl.respond_to?(:id) && decl.id&.safe_downcase == key
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def repository_of(schema)
|
|
116
|
+
current = schema.parent
|
|
117
|
+
while current
|
|
118
|
+
return current if current.is_a?(Model::Repository)
|
|
119
|
+
|
|
120
|
+
current = current.respond_to?(:parent) ? current.parent : nil
|
|
121
|
+
end
|
|
122
|
+
nil
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|