From 762810188f736547292bc25b2945413d50755038 Mon Sep 17 00:00:00 2001 From: Malcolm Nixon Date: Sun, 12 Jul 2026 19:03:36 -0400 Subject: [PATCH 1/7] docs(roadmap): ground Annotating elements item in confirmed AST/render gaps Comment/doc annotation text is already captured semantically but never read by GeneralViewLayoutStrategy; enum literal values, constraint bodies, and requirement subject/constraints/doc are not captured in the AST at all yet. Cites the spec's stereotype-style compartment title conventions (subject, doc, constraint). --- ROADMAP.md | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index 18f300b..0212e1d 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -71,14 +71,34 @@ implemented first). ### Annotating elements & compartment depth +Investigation confirmed the semantic model already captures `comment`/`doc` annotation text +verbatim (`SysmlAnnotation`/`SysmlAnnotationKind.Comment`/`.Documentation`, attached to the +annotated node's `Annotations` list via the existing `AnnotationCapture` mechanism) — but +`GeneralViewLayoutStrategy` never reads `Annotations` at all today, so no note is ever rendered. +Separately, enum literal values, constraint expression bodies, and requirement +`subject`/`constraints`/`doc` members are not captured in the AST at all yet (`VisitEnumerationDefinition` +delegates to the generic `BuildDefinitionFromDeclaration`, which never collects children, so an +`enum def`'s literal values are dropped at the semantic-model layer, not just unrendered) — this +is a semantic-exposure gap as much as a rendering gap. Per the OMG spec's Graphical Notation +chapter, the conventional compartment titles are stereotype-style: `«subject»` (requirement +subject), `«doc»` (documentation compartment), and a `«constraint»`/`«assume constraint»`/ +`«require constraint»`-labelled compartment holding the constraint's expression body (shown as a +"compartment stack" in the spec's own figures — an ellipsis-abbreviated body, not necessarily the +full expression rendered inline). + - Render **Documentation/Comment** notes as `BoxShape.Note` (folded-corner) nodes attached to their annotated element. - Extend compartments to spec depth: enumeration values, constraint bodies, requirement `subject`/`constraints`/`doc`, and a documentation compartment on definitions/usages. -**Scope:** semantic exposure of doc/comment + compartment content; `GeneralViewLayoutStrategy` -and renderers; possibly `LayoutLabel`/compartment tweaks. -**Visual gate:** a documented requirement/part renders its note and full compartments. +**Scope:** `AstBuilder` (capture enum literal values, constraint expression bodies, requirement +subject/constraints/doc as resolvable children/content — a semantic-exposure gap, not only +rendering); `GeneralViewLayoutStrategy` (read `Annotations` to emit `BoxShape.Note` nodes; +extend `BuildCompartments` for the new content kinds with spec-style stereotype titles); possibly +`LayoutLabel`/compartment tweaks. +**Visual gate:** a documented requirement/part renders its note and full compartments (an enum +def shows its literal values, a constraint shows its expression body, a requirement shows its +`«subject»`/`«doc»` compartments). ### Action Flow View: control-node/successor AST correctness + fork/join/decision/merge shapes — delivered From 9adf7161965c138f6cb4be848228bc29fab34db5 Mon Sep 17 00:00:00 2001 From: Malcolm Nixon Date: Sun, 12 Jul 2026 20:08:24 -0400 Subject: [PATCH 2/7] Capture enum literals, requirement subject/constraints, and standalone constraints in AstBuilder - Add nullable ExpressionText to SysmlFeatureNode, mirroring SysmlTransitionNode.Guard, for constraint-kind features' raw expression text. - VisitEnumerationDefinition: full body-collecting visitor via new CollectEnumerationBodyChildren helper, since enumerationBody uniquely alternates annotatingMember/enumerationUsageMember directly rather than wrapping them in a single rule. VisitEnumeratedValue builds an 'enum value'-keyword feature for each literal (bare, value-assignment, and redefinition-body forms). - VisitRequirementDefinition/VisitConcernDefinition: full body-collecting visitor (push-scope/CollectChildren(requirementBodyItem)/register), mirroring VisitStateUsage's established pattern. Also extend VisitRequirementUsage/VisitConcernUsage the same way, beyond a literal *Definition-only reading of the plan, because the dominant real OMG corpus idiom nests subject/assume constraint inside a requirement usage that specializes a def, not inside the def's own body. - New VisitSubjectUsage/VisitActorUsage/VisitStakeholderUsage (subject/actor/stakeholder keywords) and VisitRequirementConstraintMember/BuildConstraintFeatureNode (require constraint/assume constraint keywords, capturing raw expression text for both the reference and inline requirementConstraintUsage grammar alternatives). - New VisitConstraintUsage (previously entirely absent) and rewritten VisitConstraintDefinition, synthesizing a 'constraint'-keyword child feature carrying the raw calculationBody text. - New VisitRequirementVerificationMember/VisitFramedConcernMember returning null: once body-collection reaches requirementBodyItem, ANTLR's default dispatch would otherwise recurse into a nested verify/frame member's own body and incorrectly hoist its content onto the outer enclosing requirement. --- .../Semantic/Model/AstBuilder.cs | 380 +++++++++++++++++- .../Semantic/Model/SysmlNode.cs | 11 + 2 files changed, 382 insertions(+), 9 deletions(-) diff --git a/src/DemaConsulting.SysML2Tools.Language/Semantic/Model/AstBuilder.cs b/src/DemaConsulting.SysML2Tools.Language/Semantic/Model/AstBuilder.cs index 744e2d2..1ad293a 100644 --- a/src/DemaConsulting.SysML2Tools.Language/Semantic/Model/AstBuilder.cs +++ b/src/DemaConsulting.SysML2Tools.Language/Semantic/Model/AstBuilder.cs @@ -361,7 +361,83 @@ private sealed class MultiNodeCapture : SysmlNode /// public override SysmlNode? VisitEnumerationDefinition(SysMLv2Parser.EnumerationDefinitionContext context) { - return BuildDefinitionFromDeclaration(context.definitionDeclaration(), "enum def"); + var decl = context.definitionDeclaration(); + var name = GetDeclaredName(decl?.identification()); + if (name is null) + { + return null; + } + + var qualifiedName = QualifyName(name); + var supertypeNames = GetSubclassificationSupertypes(decl?.subclassificationPart()); + + // Collect the enumeration body (literal values) as children, mirroring VisitStateDefinition. + // enumerationBody is NOT a single wrapping rule (unlike stateDefBody/definitionBody/ + // requirementBody) — it directly alternates (annotatingMember | enumerationUsageMember)* + // with two distinct context types and no shared wrapper, so recovering source-order + // interleaving of annotations vs. literal values requires walking the raw ANTLR child + // list (see CollectEnumerationBodyChildren) rather than passing a single typed accessor + // array to CollectChildren, as every other body construct in this file does. + _namespaceStack.Add(name); + var (children, annotations) = CollectEnumerationBodyChildren(context.enumerationBody()); + _namespaceStack.RemoveAt(_namespaceStack.Count - 1); + + return new SysmlDefinitionNode + { + Name = name, + QualifiedName = qualifiedName, + DefinitionKeyword = "enum def", + SupertypeNames = supertypeNames, + Children = children, + Annotations = annotations, + }; + } + + /// + /// Collects an enumerationBody's child nodes (literal values and any interleaved + /// comment/documentation annotations), preserving source order. enumerationBody is + /// a narrow, deliberate exception to this file's usual "pass a single typed accessor array + /// to " convention: its grammar rule + /// (LBRACE ( annotatingMember | enumerationUsageMember )* RBRACE) alternates two + /// distinct child context types with no shared wrapping rule (unlike + /// stateBodyItem/definitionBodyItem/requirementBodyItem, which are + /// always wrapped in one rule per body element), so there is no single typed accessor that + /// yields the interleaved sequence. Walking context.children directly (the raw + /// ANTLR child list, filtering out the LBRACE/RBRACE terminals) recovers that + /// order without inventing a new collection mechanism — each remaining child is delegated + /// to the existing generic . + /// + private (IReadOnlyList Children, IReadOnlyList Annotations) + CollectEnumerationBodyChildren(SysMLv2Parser.EnumerationBodyContext? body) + { + if (body is null) + { + return (Array.Empty(), Array.Empty()); + } + + var members = new List(); + for (var i = 0; i < body.ChildCount; i++) + { + // Filter to ParserRuleContext to drop the LBRACE/RBRACE terminals — only + // annotatingMember/enumerationUsageMember contexts should reach CollectChildren. + if (body.GetChild(i) is Antlr4.Runtime.ParserRuleContext member) + { + members.Add(member); + } + } + + return CollectChildren(members); + } + + /// + public override SysmlNode? VisitEnumeratedValue(SysMLv2Parser.EnumeratedValueContext context) + { + // enumeratedValue: ENUM? usage — the exact same usage rule wrapped by + // VisitEnumerationUsage/VisitPartUsage/etc., so BuildUsageNode is reused as-is. "enum + // value" (not the bare "enum" keyword used by VisitEnumerationUsage) keeps an `enum def`'s + // literal-value compartment title ("enum values", via Pluralize's default keyword + "s" + // fallback) distinct from a definition's enum-typed attribute usages. + return BuildUsageNode(context.usage(), "enum value"); } /// @@ -704,19 +780,118 @@ private SysmlFeatureNode BuildActionNodeFeature(SysMLv2Parser.UsageDeclarationCo /// public override SysmlNode? VisitConstraintDefinition(SysMLv2Parser.ConstraintDefinitionContext context) { - return BuildDefinitionFromDeclaration(context.definitionDeclaration(), "constraint def"); + var decl = context.definitionDeclaration(); + var name = GetDeclaredName(decl?.identification()); + if (name is null) + { + return null; + } + + var qualifiedName = QualifyName(name); + var supertypeNames = GetSubclassificationSupertypes(decl?.subclassificationPart()); + + // Synthesize one child SysmlFeatureNode (Name = null, FeatureKeyword = "constraint") + // representing the definition's own calculationBody expression, so the definition's + // constraint expression renders through the same Children-driven compartment mechanism + // (GeneralViewLayoutStrategy.BuildCompartments) used for every other feature-kind + // compartment, rather than adding a second, definition-level-only expression-text field + // and a matching special-cased rendering path. + var expressionText = context.calculationBody()?.GetText(); + IReadOnlyList children = expressionText is null + ? Array.Empty() + : + [ + new SysmlFeatureNode + { + FeatureKeyword = "constraint", + ExpressionText = expressionText, + }, + ]; + + return new SysmlDefinitionNode + { + Name = name, + QualifiedName = qualifiedName, + DefinitionKeyword = "constraint def", + SupertypeNames = supertypeNames, + Children = children, + }; } /// public override SysmlNode? VisitRequirementDefinition(SysMLv2Parser.RequirementDefinitionContext context) { - return BuildDefinitionFromDeclaration(context.definitionDeclaration(), "requirement def"); + var decl = context.definitionDeclaration(); + var name = GetDeclaredName(decl?.identification()); + if (name is null) + { + return null; + } + + var qualifiedName = QualifyName(name); + var supertypeNames = GetSubclassificationSupertypes(decl?.subclassificationPart()); + var body = context.requirementBody(); + + // Collect the requirement body (subject/constraint/actor/stakeholder members, plus any + // ordinary definitionBodyItem alternatives) as children, mirroring VisitStateDefinition. + // requirementBody IS a single wrapping rule (requirementBodyItem), unlike enumerationBody, + // so the generic CollectChildren works unmodified here. + _namespaceStack.Add(name); + var (children, annotations) = CollectChildren(body?.requirementBodyItem() ?? []); + _namespaceStack.RemoveAt(_namespaceStack.Count - 1); + + // VerifiedRequirementNames is still populated by the separate manual-walk mechanism + // (FindVerificationMembers), unaffected by now also collecting Children. + var verifiedRequirementNames = body is not null + ? FindVerificationMembers(body) + : Array.Empty(); + + return new SysmlDefinitionNode + { + Name = name, + QualifiedName = qualifiedName, + DefinitionKeyword = "requirement def", + SupertypeNames = supertypeNames, + VerifiedRequirementNames = verifiedRequirementNames, + Children = children, + Annotations = annotations, + }; } /// public override SysmlNode? VisitConcernDefinition(SysMLv2Parser.ConcernDefinitionContext context) { - return BuildDefinitionFromDeclaration(context.definitionDeclaration(), "concern def"); + // concernDefinition's body is also requirementBody (grammar-confirmed identical shape to + // requirementDefinition), so it gets the same full body-collecting treatment. + var decl = context.definitionDeclaration(); + var name = GetDeclaredName(decl?.identification()); + if (name is null) + { + return null; + } + + var qualifiedName = QualifyName(name); + var supertypeNames = GetSubclassificationSupertypes(decl?.subclassificationPart()); + var body = context.requirementBody(); + + _namespaceStack.Add(name); + var (children, annotations) = CollectChildren(body?.requirementBodyItem() ?? []); + _namespaceStack.RemoveAt(_namespaceStack.Count - 1); + + var verifiedRequirementNames = body is not null + ? FindVerificationMembers(body) + : Array.Empty(); + + return new SysmlDefinitionNode + { + Name = name, + QualifiedName = qualifiedName, + DefinitionKeyword = "concern def", + SupertypeNames = supertypeNames, + VerifiedRequirementNames = verifiedRequirementNames, + Children = children, + Annotations = annotations, + }; } /// @@ -911,13 +1086,29 @@ private SysmlFeatureNode BuildActionNodeFeature(SysMLv2Parser.UsageDeclarationCo /// public override SysmlNode? VisitRequirementUsage(SysMLv2Parser.RequirementUsageContext context) { - // Minimal capture: name/qualified-name only, so that named requirement usages (the common - // real-world satisfy/verify target pattern) become resolvable symbols. Subject/constraint/ - // actor compartment members remain unvisited, consistent with existing scope discipline - // for specialized bodies (see BuildDefinitionFromDeclaration). + // Name/qualified-name capture, so that named requirement usages (the common real-world + // satisfy/verify target pattern) become resolvable symbols. Also collects the requirement + // body's subject/constraint/actor/stakeholder compartment members as Children — the + // dominant real-corpus idiom (a named requirement usage specializing a requirement def and + // supplying its own subject/assume-constraint body) nests these inside a requirement + // *usage*, not only inside a requirement definition's own body, so both must be collected + // for the "compartment depth" goal to be met for the corpus's idiomatic shape. var name = GetDeclaredName(context.constraintUsageDeclaration()?.usageDeclaration()?.identification()); + var body = context.requirementBody(); + + if (name is not null) + { + _namespaceStack.Add(name); + } + + var (children, annotations) = CollectChildren(body?.requirementBodyItem() ?? []); + + if (name is not null) + { + _namespaceStack.RemoveAt(_namespaceStack.Count - 1); + } - var verifiedRequirementNames = context.requirementBody() is { } body + var verifiedRequirementNames = body is not null ? FindVerificationMembers(body) : Array.Empty(); @@ -927,9 +1118,180 @@ private SysmlFeatureNode BuildActionNodeFeature(SysMLv2Parser.UsageDeclarationCo QualifiedName = name is not null ? QualifyName(name) : null, FeatureKeyword = "requirement", VerifiedRequirementNames = verifiedRequirementNames, + Children = children, + Annotations = annotations, }; } + /// + public override SysmlNode? VisitConcernUsage(SysMLv2Parser.ConcernUsageContext context) + { + // concernUsage: occurrenceUsagePrefix CONCERN constraintUsageDeclaration requirementBody — + // identical shape to requirementUsage, so the same name + VerifiedRequirementNames + + // Children capture applies here (see VisitRequirementUsage). + var name = GetDeclaredName(context.constraintUsageDeclaration()?.usageDeclaration()?.identification()); + var body = context.requirementBody(); + + if (name is not null) + { + _namespaceStack.Add(name); + } + + var (children, annotations) = CollectChildren(body?.requirementBodyItem() ?? []); + + if (name is not null) + { + _namespaceStack.RemoveAt(_namespaceStack.Count - 1); + } + + var verifiedRequirementNames = body is not null + ? FindVerificationMembers(body) + : Array.Empty(); + + return new SysmlFeatureNode + { + Name = name, + QualifiedName = name is not null ? QualifyName(name) : null, + FeatureKeyword = "concern", + VerifiedRequirementNames = verifiedRequirementNames, + Children = children, + Annotations = annotations, + }; + } + + /// + public override SysmlNode? VisitSubjectUsage(SysMLv2Parser.SubjectUsageContext context) + { + // subjectUsage: SUBJECT usageExtensionKeyword* usage — reuses the same usage rule as + // VisitPartUsage/VisitEnumerationUsage/etc., so BuildUsageNode is reused as-is. No + // override needed for VisitSubjectMember itself — default ANTLR VisitChildren dispatch + // already descends through memberPrefix (null-returning) into subjectUsage. + return BuildUsageNode(context.usage(), "subject"); + } + + /// + public override SysmlNode? VisitActorUsage(SysMLv2Parser.ActorUsageContext context) + { + // actorUsage: ACTOR usageExtensionKeyword* usage — same trivial reuse as VisitSubjectUsage. + return BuildUsageNode(context.usage(), "actor"); + } + + /// + public override SysmlNode? VisitStakeholderUsage(SysMLv2Parser.StakeholderUsageContext context) + { + // stakeholderUsage: STAKEHOLDER usageExtensionKeyword* usage — same trivial reuse. + return BuildUsageNode(context.usage(), "stakeholder"); + } + + /// + public override SysmlNode? VisitRequirementConstraintMember(SysMLv2Parser.RequirementConstraintMemberContext context) + { + // Must override at the member level (not requirementConstraintUsage) because the emitted + // FeatureKeyword ("assume constraint" vs. "require constraint") depends on the sibling + // requirementKind (ASSUME/REQUIRE token), which only this member context exposes. + var keyword = context.requirementKind()?.REQUIRE() is not null ? "require constraint" : "assume constraint"; + return BuildConstraintFeatureNode(context.requirementConstraintUsage(), keyword); + } + + /// + /// Builds a constraint-kind (FeatureKeyword of + /// "assume constraint"/"require constraint"/"constraint") from a + /// requirementConstraintUsage, handling both grammar alternatives. + /// + /// + /// Alternative 1 (ownedReferenceSubsetting featureSpecializationPart? requirementBody) + /// is a reference to an existing named constraint (e.g. assume + /// myOtherConstraint;): the raw reference text is captured into + /// — a raw reference, not an evaluated + /// expression, when this constraint form is used — and its own nested + /// requirementBody is not recursed into (out of scope). Alternative 2 + /// ((usageExtensionKeyword* CONSTRAINT | usageExtensionKeyword+) + /// constraintUsageDeclaration calculationBody, the corpus-dominant inline form, e.g. + /// require constraint { massActual <= massReqd }) captures the declared name + /// (usually anonymous per corpus) and the raw, unparsed, brace-included + /// calculationBody text into — + /// mirroring 's Guard raw-text-capture precedent. + /// No Children are collected in either case — calculation-body internals + /// (calculationBodyItem/actionBodyItem control nodes) are explicitly out of + /// scope per this unit's "do not model expression trees" boundary. + /// + private SysmlFeatureNode? BuildConstraintFeatureNode( + SysMLv2Parser.RequirementConstraintUsageContext? usage, string keyword) + { + if (usage is null) + { + return null; + } + + if (usage.ownedReferenceSubsetting() is { } reference) + { + return new SysmlFeatureNode + { + FeatureKeyword = keyword, + ExpressionText = reference.GetText(), + }; + } + + var name = GetDeclaredName(usage.constraintUsageDeclaration()?.usageDeclaration()?.identification()); + var expressionText = usage.calculationBody()?.GetText(); + + return new SysmlFeatureNode + { + Name = name, + QualifiedName = name is not null ? QualifyName(name) : null, + FeatureKeyword = keyword, + ExpressionText = expressionText, + }; + } + + /// + public override SysmlNode? VisitConstraintUsage(SysMLv2Parser.ConstraintUsageContext context) + { + // constraintUsage: occurrenceUsagePrefix CONSTRAINT constraintUsageDeclaration + // calculationBody — a top-level, non-nested-in-requirement `constraint { expr }` usage. + // Previously entirely absent from this file (no override at all), so such a usage + // vanished with zero AST trace. Minimal capture: name (usually anonymous per corpus) plus + // the raw calculationBody expression text. + var name = GetDeclaredName(context.constraintUsageDeclaration()?.usageDeclaration()?.identification()); + var expressionText = context.calculationBody()?.GetText(); + + return new SysmlFeatureNode + { + Name = name, + QualifiedName = name is not null ? QualifyName(name) : null, + FeatureKeyword = "constraint", + ExpressionText = expressionText, + }; + } + + /// + public override SysmlNode? VisitRequirementVerificationMember( + SysMLv2Parser.RequirementVerificationMemberContext context) + { + // Newly-required safeguard: now that VisitRequirementDefinition/VisitConcernDefinition + // call CollectChildren over requirementBodyItems, ANTLR's default VisitChildren dispatch + // would, for the first time, recurse into a `verify` member's own nested requirementBody + // (e.g. a nested subjectMember/constraint) — content that would otherwise incorrectly + // bubble up and be added as a child of the OUTER enclosing requirement, via the aggregate- + // last-non-null default dispatch behavior. A `verify` member's target is already captured + // separately by FindVerificationMembers (VerifiedRequirementNames), so this override + // short-circuits to null to suppress the now-newly-reachable recursive descent. Do not + // remove this override without re-verifying that CollectChildren no longer walks + // requirementBodyItem, since removing it would silently corrupt an enclosing requirement's + // Children with spuriously-hoisted nested content. + return null; + } + + /// + public override SysmlNode? VisitFramedConcernMember(SysMLv2Parser.FramedConcernMemberContext context) + { + // Same safeguard as VisitRequirementVerificationMember above: a `frame` member's nested + // concern/calculationBody content is explicitly out of scope and must not be spuriously + // hoisted onto the enclosing requirement's Children now that requirementBodyItems are + // collected. See that override's remarks for the full rationale. + return null; + } + /// /// Recursively scans a parse (sub)tree for /// nodes at any depth, extracting the raw requirement reference name from each. This is a diff --git a/src/DemaConsulting.SysML2Tools.Language/Semantic/Model/SysmlNode.cs b/src/DemaConsulting.SysML2Tools.Language/Semantic/Model/SysmlNode.cs index 91691f3..2cbbb0d 100644 --- a/src/DemaConsulting.SysML2Tools.Language/Semantic/Model/SysmlNode.cs +++ b/src/DemaConsulting.SysML2Tools.Language/Semantic/Model/SysmlNode.cs @@ -163,6 +163,17 @@ public sealed class SysmlFeatureNode : SysmlNode /// Gets the multiplicity text (e.g., "[4]", "[0..*]"), or null when unspecified. /// public string? Multiplicity { get; init; } + + /// + /// Gets the raw expression text of a constraint/assume constraint/ + /// require constraint feature's calculation body (or, for the reference form of a + /// requirement constraint, the raw reference text of the constraint it points to), or + /// null for features that are not a constraint expression. Captured verbatim, unparsed + /// (mirroring the raw-text-capture precedent) — + /// never evaluated, consistent with this unit's "do not model expression trees" scope + /// boundary. + /// + public string? ExpressionText { get; init; } } /// From 45b3705ceae6de3a1b6cb45c34811457455c61e5 Mon Sep 17 00:00:00 2001 From: Malcolm Nixon Date: Sun, 12 Jul 2026 20:08:32 -0400 Subject: [PATCH 3/7] Render annotation notes and new stereotype compartments in General View MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add DefBox.Annotations, threaded through CollectDefinitions. - New AddAnnotationNote/BuildNoteText/ComputeNoteBoxSize helpers: emit one BoxShape.Note box per annotated definition (concatenating multiple Documentation/Comment annotations into a single note), connected by a plain solid line with no end marker. Implemented as ordinary LayoutGraph nodes/edges added during the existing single-pass BuildGraph traversal, a documented deviation from a literal post-layout marker-decoration approach (this strategy has no equivalent decoration phase). - Pluralize: add guillemet stereotype titles for subject/assume constraint/require constraint/constraint compartments, reusing the pre-existing «allocate» edge-label convention. - FormatFeatureRow: render a constraint-kind feature's raw ExpressionText instead of the generic name : Type [multiplicity] row shape. --- .../Internal/GeneralViewLayoutStrategy.cs | 100 +++++++++++++++++- 1 file changed, 98 insertions(+), 2 deletions(-) diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/GeneralViewLayoutStrategy.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/GeneralViewLayoutStrategy.cs index 6d006d4..e9d7461 100644 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/GeneralViewLayoutStrategy.cs +++ b/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/GeneralViewLayoutStrategy.cs @@ -150,7 +150,8 @@ private sealed record DefBox( IReadOnlyList Memberships, IReadOnlyList Compartments, double Width, - double Height); + double Height, + IReadOnlyList Annotations); /// Where a located definition's node lives: the node itself and its owning package. private readonly record struct Location(LayoutGraphNode Node, string Package); @@ -302,7 +303,7 @@ private static IReadOnlyList CollectDefinitions( var memberships = CollectMemberships(def); var (width, height) = ComputeBoxSize(simpleName, keyword, compartments, theme); - result.Add(new DefBox(qualifiedName, simpleName, keyword, def.SupertypeNames, memberships, compartments, width, height)); + result.Add(new DefBox(qualifiedName, simpleName, keyword, def.SupertypeNames, memberships, compartments, width, height, def.Annotations)); } return result; @@ -342,6 +343,14 @@ private static IReadOnlyList BuildCompartments(SysmlDefinitio /// Formats a usage feature as a compartment row: name : Type [n]. private static string FormatFeatureRow(SysmlFeatureNode feature) { + // A constraint-kind feature's payload is a boolean expression, not a type reference — show + // its raw expression text instead of the generic "name : Type [multiplicity]" shape. Unnamed + // (the corpus-dominant case) shows the expression alone; named shows "name: expression". + if (feature.ExpressionText is { Length: > 0 } expr) + { + return feature.Name is { Length: > 0 } exprName ? $"{exprName}: {expr}" : expr; + } + var name = feature.Name ?? string.Empty; var typing = feature.FeatureTyping is { Length: > 0 } t ? $" : {t}" : string.Empty; var multiplicity = feature.Multiplicity is { Length: > 0 } m ? $" {m}" : string.Empty; @@ -353,6 +362,16 @@ private static string FormatFeatureRow(SysmlFeatureNode feature) private static string Pluralize(string keyword) => keyword switch { "ref" => "references", + + // Stereotype-style titles, per the OMG spec's Graphical Notation chapter conventions — + // reusing this file's existing guillemet convention already established for edge midpoint + // labels (e.g. "«allocate»" in BuildModelEdges), the dominant existing precedent for + // stereotype-style text in this renderer. A requirement conventionally has exactly one + // subject, so "subject" stays singular rather than pluralizing. + "subject" => "«subject»", + "assume constraint" => "«assume constraint»", + "require constraint" => "«require constraint»", + "constraint" => "«constraint»", _ => keyword + "s", }; @@ -910,6 +929,7 @@ private static (LayoutGraph Graph, List Truncated) BuildGraph( { var leaf = MakeDefNode(graph, def); located[def.QualifiedName] = new Location(leaf, package); + AddAnnotationNote(graph, def, leaf, theme); } continue; @@ -946,6 +966,7 @@ private static (LayoutGraph Graph, List Truncated) BuildGraph( { var leaf = MakeDefNode(folder.Children, def); located[def.QualifiedName] = new Location(leaf, package); + AddAnnotationNote(folder.Children, def, leaf, theme); } } @@ -987,6 +1008,81 @@ private static LayoutGraphNode MakeDefNode(LayoutGraph scope, DefBox def) return node; } + /// + /// Emits a companion node (plus a plain connecting edge) for a + /// definition that carries comment/doc annotations, in the same scope the + /// definition's own node was just added to (folder or root — mirrors the existing per-package + /// folder scoping already used for def nodes and model edges). Implemented as an ordinary + /// node/edge (rather than a post-layout coordinate-decoration pass + /// like ) so the existing + /// / can position + /// and route it automatically — a deliberate departure from the ROADMAP's suggested "adapt + /// StateTransitionViewLayoutStrategy.AddInitialMarker's marker-plus-line pattern": that + /// pattern manipulates raw Rect/LayoutNode coordinates after a simpler, + /// non-graph-based layout pass specific to state diagrams, which does not exist in this + /// strategy's architecture (a single handed once to + /// ). Emitting the note as an ordinary graph + /// node/edge is consistent with how every other box/edge in this file is already produced, and + /// lower-risk than hand-computing satellite coordinates in a graph-based layout model that was + /// not designed for post-hoc absolute placement. Does nothing when the definition has no + /// annotations. + /// + private static void AddAnnotationNote(LayoutGraph scope, DefBox def, LayoutGraphNode defNode, Theme theme) + { + if (def.Annotations.Count == 0) + { + return; + } + + var text = BuildNoteText(def.Annotations); + var (width, height, lines) = ComputeNoteBoxSize(text, theme); + + var note = scope.AddNode($"note:{def.QualifiedName}", width, height); + note.Shape = BoxShape.Note; + note.Compartments = [new LayoutCompartment(null, lines)]; + + var edge = scope.AddEdge($"note-edge:{def.QualifiedName}", note, defNode); + edge.TargetEnd = EndMarkerStyle.None; + edge.LineStyle = LineStyle.Solid; + } + + /// + /// Combines an element's comment/documentation annotations into a single note's text: one note + /// box per annotated element, not one per annotation, to avoid uncontrolled box proliferation + /// for well-annotated elements — matches this renderer's existing "one compartment per + /// keyword, not per feature" aggregation philosophy already used in . + /// Multiple annotations are concatenated with a blank-line separator. + /// + private static string BuildNoteText(IReadOnlyList annotations) => + string.Join("\n\n", annotations.Select(a => a.Text.Trim())); + + /// + /// Computes the intrinsic size of a note box from its already-combined text (see + /// ), analogous to but simpler — a + /// note has no title/keyword band, only its own body text rendered as a single untitled + /// compartment's rows. Sizing splits on the text's own newlines only; no word-wrap algorithm + /// is applied (this codebase's DemaConsulting.Rendering dependency has no + /// text-measurement primitive supporting wrapping elsewhere either), so an unusually long + /// single line renders wide — an accepted minimal-implementation limitation. + /// + private static (double Width, double Height, IReadOnlyList Lines) ComputeNoteBoxSize(string text, Theme theme) + { + var lines = text.Split('\n'); + + var width = MinBoxWidth; + foreach (var line in lines) + { + width = Math.Max(width, (line.Length * theme.FontSizeBody * CharWidthFactor) + (3.0 * theme.LabelPadding)); + } + + var height = BoxMetrics.TitleAreaHeight(theme, hasLabel: false, hasKeyword: false) + + theme.LabelPadding + + (lines.Length * (theme.LabelPadding + theme.FontSizeBody)) + + theme.LabelPadding; + + return (width, height, lines); + } + /// /// Replaces each truncated folder's placed box with one carrying its "+N more…" ellipsis label, /// positioned within the box's now-known absolute placement. From ab5e74a37afb7eb426707ee08e1943c1cbaf8951 Mon Sep 17 00:00:00 2001 From: Malcolm Nixon Date: Sun, 12 Jul 2026 20:08:39 -0400 Subject: [PATCH 4/7] Add tests for enum/requirement/constraint capture and note/compartment rendering MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - WorkspaceLoaderTests: enum def bare/value-assignment literal capture, requirement def/usage subject+constraint capture, actor/stakeholder capture, standalone constraint usage/definition, and a verify-member no-hoist regression guard. - OmgModelsTests: regression fixtures against the real OMG corpus for enumeration definitions, requirement definitions/usages, and comment/documentation examples. - GeneralViewLayoutStrategyTests: note-box emission (including the no-note and multiple-annotations-combine-into-one cases), «subject» guillemet compartment title, constraint expression-text rows, and the enum values compartment title. --- .../Layout/GeneralViewLayoutStrategyTests.cs | 208 ++++++++++ .../Parser/OmgModelsTests.cs | 159 ++++++++ .../Semantic/WorkspaceLoaderTests.cs | 377 ++++++++++++++++++ 3 files changed, 744 insertions(+) diff --git a/test/DemaConsulting.SysML2Tools.Tests/Layout/GeneralViewLayoutStrategyTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Layout/GeneralViewLayoutStrategyTests.cs index 82983ea..6c16748 100644 --- a/test/DemaConsulting.SysML2Tools.Tests/Layout/GeneralViewLayoutStrategyTests.cs +++ b/test/DemaConsulting.SysML2Tools.Tests/Layout/GeneralViewLayoutStrategyTests.cs @@ -1749,5 +1749,213 @@ public void GeneralViewLayoutStrategy_BuildLayout_SelfReferentialSubsetting_Prod var lines = CollectLines(layout.Nodes); Assert.DoesNotContain(lines, l => l.TargetEnd == EndMarkerStyle.HollowTriangle && l.LineStyle == LineStyle.Dashed); } + + /// + /// BuildLayout emits a companion box (plus a connecting plain + /// line) for a definition that carries a doc/comment annotation. + /// + [Fact] + public void GeneralViewLayoutStrategy_BuildLayout_AnnotatedDefinition_EmitsNoteBox() + { + // Arrange: a part def with one Documentation annotation + var strategy = new GeneralViewLayoutStrategy(); + var battery = new SysmlDefinitionNode + { + Name = "Battery", + QualifiedName = "P::Battery", + DefinitionKeyword = "part def", + Annotations = [new SysmlAnnotation(SysmlAnnotationKind.Documentation, "Nominal battery capacity is 5000mAh.")], + }; + var workspace = new SysmlWorkspace + { + Declarations = new Dictionary { ["P::Battery"] = battery } + }; + var context = new ViewContext("v", workspace); + var options = new RenderOptions(Themes.Light); + + // Act + var layout = strategy.BuildLayout(context, options); + + // Assert: a Note-shaped box is present, plus a plain (no-arrowhead, solid) connecting line + var boxes = CollectBoxes(layout.Nodes); + var note = Assert.Single(boxes, b => b.Shape == BoxShape.Note); + Assert.Contains(note.Compartments, c => c.Rows.Any(r => r.Contains("Nominal battery capacity"))); + + var lines = CollectLines(layout.Nodes); + Assert.Contains(lines, l => l.TargetEnd == EndMarkerStyle.None && l.LineStyle == LineStyle.Solid); + } + + /// + /// BuildLayout does not emit a Note box for a definition with no annotations (regression + /// guard against always-on note emission). + /// + [Fact] + public void GeneralViewLayoutStrategy_BuildLayout_UnannotatedDefinition_EmitsNoNoteBox() + { + // Arrange: a part def with no annotations + var strategy = new GeneralViewLayoutStrategy(); + var battery = new SysmlDefinitionNode + { + Name = "Battery", + QualifiedName = "P::Battery", + DefinitionKeyword = "part def", + }; + var workspace = new SysmlWorkspace + { + Declarations = new Dictionary { ["P::Battery"] = battery } + }; + var context = new ViewContext("v", workspace); + var options = new RenderOptions(Themes.Light); + + // Act + var layout = strategy.BuildLayout(context, options); + + // Assert: no Note-shaped box is emitted + var boxes = CollectBoxes(layout.Nodes); + Assert.DoesNotContain(boxes, b => b.Shape == BoxShape.Note); + } + + /// + /// BuildLayout combines multiple annotations on one element into a single Note box (not + /// one box per annotation), per this strategy's documented aggregation choice. + /// + [Fact] + public void GeneralViewLayoutStrategy_BuildLayout_MultipleAnnotations_ProduceOneNoteBox() + { + // Arrange: a part def with two annotations (a doc and a comment) + var strategy = new GeneralViewLayoutStrategy(); + var battery = new SysmlDefinitionNode + { + Name = "Battery", + QualifiedName = "P::Battery", + DefinitionKeyword = "part def", + Annotations = + [ + new SysmlAnnotation(SysmlAnnotationKind.Documentation, "Primary power source."), + new SysmlAnnotation(SysmlAnnotationKind.Comment, "TODO: revisit capacity."), + ], + }; + var workspace = new SysmlWorkspace + { + Declarations = new Dictionary { ["P::Battery"] = battery } + }; + var context = new ViewContext("v", workspace); + var options = new RenderOptions(Themes.Light); + + // Act + var layout = strategy.BuildLayout(context, options); + + // Assert: exactly one Note box, containing both annotations' text + var boxes = CollectBoxes(layout.Nodes); + var note = Assert.Single(boxes, b => b.Shape == BoxShape.Note); + Assert.Contains(note.Compartments, c => c.Rows.Any(r => r.Contains("Primary power source"))); + Assert.Contains(note.Compartments, c => c.Rows.Any(r => r.Contains("revisit capacity"))); + } + + /// + /// BuildLayout renders a requirement definition's subject feature under a + /// stereotype-style «subject» compartment title. + /// + [Fact] + public void GeneralViewLayoutStrategy_BuildLayout_RequirementSubject_UsesGuillemetTitle() + { + // Arrange: a requirement def owning a subject feature + var strategy = new GeneralViewLayoutStrategy(); + var requirement = new SysmlDefinitionNode + { + Name = "MassLimitationRequirement", + QualifiedName = "P::MassLimitationRequirement", + DefinitionKeyword = "requirement def", + Children = + [ + new SysmlFeatureNode { Name = "vehicle", QualifiedName = "P::MassLimitationRequirement::vehicle", FeatureKeyword = "subject", FeatureTyping = "Vehicle" } + ] + }; + var workspace = new SysmlWorkspace + { + Declarations = new Dictionary { ["P::MassLimitationRequirement"] = requirement } + }; + var context = new ViewContext("v", workspace); + var options = new RenderOptions(Themes.Light); + + // Act + var layout = strategy.BuildLayout(context, options); + + // Assert + var box = CollectBoxes(layout.Nodes).First(b => b.Label == "MassLimitationRequirement"); + Assert.Contains(box.Compartments, c => c.Title == "«subject»" && c.Rows.Contains("vehicle : Vehicle")); + } + + /// + /// BuildLayout renders assume constraint/require constraint/constraint + /// features under stereotype-style compartment titles, showing the raw expression text + /// instead of a name : Type row. + /// + [Fact] + public void GeneralViewLayoutStrategy_BuildLayout_ConstraintFeatures_ShowExpressionText() + { + // Arrange: a requirement def owning assume/require constraint features + var strategy = new GeneralViewLayoutStrategy(); + var requirement = new SysmlDefinitionNode + { + Name = "MassLimitationRequirement", + QualifiedName = "P::MassLimitationRequirement", + DefinitionKeyword = "requirement def", + Children = + [ + new SysmlFeatureNode { FeatureKeyword = "assume constraint", ExpressionText = "{fuelMass > 0}" }, + new SysmlFeatureNode { FeatureKeyword = "require constraint", ExpressionText = "{massActual <= massReqd}" } + ] + }; + var workspace = new SysmlWorkspace + { + Declarations = new Dictionary { ["P::MassLimitationRequirement"] = requirement } + }; + var context = new ViewContext("v", workspace); + var options = new RenderOptions(Themes.Light); + + // Act + var layout = strategy.BuildLayout(context, options); + + // Assert + var box = CollectBoxes(layout.Nodes).First(b => b.Label == "MassLimitationRequirement"); + Assert.Contains(box.Compartments, c => c.Title == "«assume constraint»" && c.Rows.Contains("{fuelMass > 0}")); + Assert.Contains(box.Compartments, c => c.Title == "«require constraint»" && c.Rows.Contains("{massActual <= massReqd}")); + } + + /// + /// BuildLayout renders an enum def's literal values under an "enum values" + /// compartment title (the plain default pluralization, not a stereotype). + /// + [Fact] + public void GeneralViewLayoutStrategy_BuildLayout_EnumDefLiteralValues_ProducesEnumValuesCompartment() + { + // Arrange: an enum def owning two enum-value features + var strategy = new GeneralViewLayoutStrategy(); + var flightMode = new SysmlDefinitionNode + { + Name = "FlightMode", + QualifiedName = "P::FlightMode", + DefinitionKeyword = "enum def", + Children = + [ + new SysmlFeatureNode { Name = "manual", QualifiedName = "P::FlightMode::manual", FeatureKeyword = "enum value" }, + new SysmlFeatureNode { Name = "auto", QualifiedName = "P::FlightMode::auto", FeatureKeyword = "enum value" } + ] + }; + var workspace = new SysmlWorkspace + { + Declarations = new Dictionary { ["P::FlightMode"] = flightMode } + }; + var context = new ViewContext("v", workspace); + var options = new RenderOptions(Themes.Light); + + // Act + var layout = strategy.BuildLayout(context, options); + + // Assert + var box = CollectBoxes(layout.Nodes).First(b => b.Label == "FlightMode"); + Assert.Contains(box.Compartments, c => c.Title == "enum values" && c.Rows.Contains("manual") && c.Rows.Contains("auto")); + } } diff --git a/test/DemaConsulting.SysML2Tools.Tests/Parser/OmgModelsTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Parser/OmgModelsTests.cs index 02de1d7..a3465c4 100644 --- a/test/DemaConsulting.SysML2Tools.Tests/Parser/OmgModelsTests.cs +++ b/test/DemaConsulting.SysML2Tools.Tests/Parser/OmgModelsTests.cs @@ -342,4 +342,163 @@ public async Task ControlNode_OmgCorpusFixture_ResolvesForkJoinDecisionMerge() // immediately preceding sibling `J`. Assert.Contains(controlTransitions, t => t.Source == "J" && t.Target == "F"); } + + /// + /// The dedicated 06.EnumerationDefinitions corpus fixtures exercise all three + /// enum def literal forms found in real OMG models: bare literals + /// (enum green;), a redefinition-body literal (unclassified { :>> code = + /// "..."; ... }), and the value-assignment form (A = 4.0;) — confirming + /// CollectEnumerationBodyChildren's narrow raw-children walk (needed because + /// enumerationBody uniquely alternates annotatingMember/ + /// enumerationUsageMember directly, unlike the single-wrapping-rule shape of + /// definitionBody/requirementBody) and VisitEnumeratedValue's + /// "enum value" keyword. + /// + [Fact] + public async Task Enumeration_OmgCorpusFixtures_CaptureAllLiteralForms() + { + var omgRoot = FindOmgModelsRoot(); + var files = new[] + { + Path.Combine(omgRoot, "training", "06.EnumerationDefinitions", "EnumerationDefinitions-1.sysml"), + Path.Combine(omgRoot, "training", "06.EnumerationDefinitions", "EnumerationDefinitions-2.sysml"), + }; + Assert.All(files, f => Assert.True(File.Exists(f), $"Expected fixture not found: {f}")); + + var (stdlibTable, _) = StdlibProvider.GetSymbolTable(); + var result = await WorkspaceLoader.LoadAsync(files, stdlibTable); + + Assert.DoesNotContain(result.Diagnostics, d => d.Severity == DiagnosticSeverity.Error); + + // Bare-literal form. + var trafficLightColor = + (SysmlDefinitionNode)result.Workspace!.Declarations["'Enumeration Definitions-1'::TrafficLightColor"]; + var trafficLightValues = trafficLightColor.Children + .OfType() + .Where(f => f.FeatureKeyword == "enum value") + .Select(f => f.Name) + .ToList(); + Assert.Equal(["green", "yellow", "red"], trafficLightValues); + + // Redefinition-body form (each literal redefines "code"/"color" attributes via `:>>`). + var classificationKind = + (SysmlDefinitionNode)result.Workspace!.Declarations["'Enumeration Definitions-2'::ClassificationKind"]; + var classificationValues = classificationKind.Children + .OfType() + .Where(f => f.FeatureKeyword == "enum value") + .Select(f => f.Name) + .ToList(); + Assert.Equal(["unclassified", "confidential", "secret"], classificationValues); + + // Value-assignment form (`A = 4.0;`) — the assigned value expression is not parsed, only + // the literal's own name, an accepted minimal-capture gap. + var gradePoints = + (SysmlDefinitionNode)result.Workspace!.Declarations["'Enumeration Definitions-2'::GradePoints"]; + var gradeValues = gradePoints.Children + .OfType() + .Where(f => f.FeatureKeyword == "enum value") + .Select(f => f.Name) + .ToList(); + Assert.Equal(["A", "B", "C", "D", "F"], gradeValues); + } + + /// + /// The dedicated 32.Requirements corpus fixtures exercise the requirement + /// compartment-depth idioms found in real OMG models: a requirement def with + /// doc/subject/require constraint/assume constraint members, and + /// — the dominant real-corpus idiom — a requirement *usage* that specializes a + /// requirement def and supplies its own subject/assume constraint body + /// (confirming the deliberate extension of VisitRequirementUsage to collect + /// Children, beyond the plan's literal *Definition-only wording). The nested + /// doc inside RequirementUsages.sysml's assume constraint { doc /* ... */ + /// ... } is confirmed NOT captured (an accepted scope boundary — constraint bodies are + /// captured only as raw ExpressionText, with no nested-member traversal). + /// + [Fact] + public async Task Requirement_OmgCorpusFixtures_CaptureSubjectAndConstraints() + { + var omgRoot = FindOmgModelsRoot(); + var definitionsFile = Path.Combine(omgRoot, "training", "32.Requirements", "RequirementDefinitions.sysml"); + var usagesFile = Path.Combine(omgRoot, "training", "32.Requirements", "RequirementUsages.sysml"); + Assert.All([definitionsFile, usagesFile], f => Assert.True(File.Exists(f), $"Expected fixture not found: {f}")); + + var (stdlibTable, _) = StdlibProvider.GetSymbolTable(); + var result = await WorkspaceLoader.LoadAsync([definitionsFile, usagesFile], stdlibTable); + + Assert.DoesNotContain(result.Diagnostics, d => d.Severity == DiagnosticSeverity.Error); + + // RequirementDefinitions.sysml: MassLimitationRequirement has doc + require constraint. + var massLimitation = + (SysmlDefinitionNode)result.Workspace!.Declarations[ + "'Requirement Definitions'::MassLimitationRequirement"]; + Assert.Contains(massLimitation.Annotations, a => a.Kind == SysmlAnnotationKind.Documentation); + var requireConstraint = Assert.Single( + massLimitation.Children.OfType(), f => f.FeatureKeyword == "require constraint"); + Assert.Contains("massActual", requireConstraint.ExpressionText); + Assert.Contains("massReqd", requireConstraint.ExpressionText); + + // VehicleMassLimitationRequirement (a requirement def specializing another) has subject + + // assume constraint. + var vehicleMassLimitation = + (SysmlDefinitionNode)result.Workspace!.Declarations[ + "'Requirement Definitions'::VehicleMassLimitationRequirement"]; + var subject = Assert.Single( + vehicleMassLimitation.Children.OfType(), f => f.FeatureKeyword == "subject"); + Assert.Equal("vehicle", subject.Name); + Assert.Equal("Vehicle", subject.FeatureTyping); + var assumeConstraint = Assert.Single( + vehicleMassLimitation.Children.OfType(), f => f.FeatureKeyword == "assume constraint"); + Assert.Contains("fuelMass", assumeConstraint.ExpressionText); + + // RequirementUsages.sysml: fullVehicleMassLimit is a requirement *usage* specializing + // VehicleMassLimitationRequirement, with its own subject + assume constraint body. + var fullVehicleMassLimit = + (SysmlFeatureNode)result.Workspace!.Declarations["'Requirement Usages'::fullVehicleMassLimit"]; + var usageSubject = Assert.Single( + fullVehicleMassLimit.Children.OfType(), f => f.FeatureKeyword == "subject"); + Assert.Equal("vehicle", usageSubject.Name); + var usageAssumeConstraint = Assert.Single( + fullVehicleMassLimit.Children.OfType(), f => f.FeatureKeyword == "assume constraint"); + Assert.Contains("fuelFullMass", usageAssumeConstraint.ExpressionText); + + // The nested `doc` inside the assume constraint's own calculation body is NOT captured as + // a separate Annotation anywhere on fullVehicleMassLimit — an accepted scope boundary. + Assert.DoesNotContain( + fullVehicleMassLimit.Annotations, a => a.Kind == SysmlAnnotationKind.Documentation); + } + + /// + /// The dedicated 01.Packages/CommentExample.sysml and + /// DocumentationExample.sysml corpus fixtures confirm comment/doc + /// annotations attach to their owning package/definition via the pre-existing + /// AnnotationCapture mechanism — the source of note-box text rendered by + /// GeneralViewLayoutStrategy.AddAnnotationNote. + /// + [Fact] + public async Task CommentAndDocumentation_OmgCorpusFixtures_CaptureAnnotations() + { + var omgRoot = FindOmgModelsRoot(); + var commentsFile = Path.Combine(omgRoot, "examples", "CommentExamples", "Comments.sysml"); + var docFile = Path.Combine(omgRoot, "training", "01.Packages", "DocumentationExample.sysml"); + Assert.All([commentsFile, docFile], f => Assert.True(File.Exists(f), $"Expected fixture not found: {f}")); + + var (stdlibTable, _) = StdlibProvider.GetSymbolTable(); + var result = await WorkspaceLoader.LoadAsync([commentsFile, docFile], stdlibTable); + + Assert.DoesNotContain(result.Diagnostics, d => d.Severity == DiagnosticSeverity.Error); + + // Comments.sysml's `part def C { doc /* ... */ comment /* Comment in Part Def */ ... }` + // nests both an annotatingMember doc and comment directly inside C's own body, so both + // attach to C itself (as opposed to the file's `comment about C ...`/`comment about + // Comments ...` forms, which target an element by name via `about` — a reference the + // existing AnnotationCapture mechanism does not resolve; such comments attach to their + // syntactically-owning namespace instead, an existing, unchanged limitation). + var partDefC = (SysmlDefinitionNode)result.Workspace!.Declarations["Comments::C"]; + Assert.Contains(partDefC.Annotations, a => a.Kind == SysmlAnnotationKind.Documentation); + Assert.Contains(partDefC.Annotations, a => a.Kind == SysmlAnnotationKind.Comment); + + var automobileWithDoc = + (SysmlDefinitionNode)result.Workspace!.Declarations["'Documentation Example'::Automobile"]; + Assert.Contains(automobileWithDoc.Annotations, a => a.Kind == SysmlAnnotationKind.Documentation); + } } diff --git a/test/DemaConsulting.SysML2Tools.Tests/Semantic/WorkspaceLoaderTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Semantic/WorkspaceLoaderTests.cs index 02fef40..4d04970 100644 --- a/test/DemaConsulting.SysML2Tools.Tests/Semantic/WorkspaceLoaderTests.cs +++ b/test/DemaConsulting.SysML2Tools.Tests/Semantic/WorkspaceLoaderTests.cs @@ -4238,6 +4238,383 @@ action def Flow { } } + /// + /// An enum def with bare literal values captures each as an "enum value" feature, + /// with an implicit source-order-preserving enumerationBody traversal. + /// + [Fact] + public async Task WorkspaceLoader_LoadAsync_EnumDefinition_BareLiterals_CapturesEnumValues() + { + var tempFile = Path.GetTempFileName() + ".sysml"; + try + { + await File.WriteAllTextAsync(tempFile, + """ + package E { + enum def TrafficLightColor { + enum green; + enum yellow; + enum red; + } + } + """, TestContext.Current.CancellationToken); + + var (stdlibTable, _) = StdlibProvider.GetSymbolTable(); + var result = await WorkspaceLoader.LoadAsync([tempFile], stdlibTable); + + Assert.NotNull(result.Workspace); + var color = Assert.IsType( + result.Workspace!.Declarations["E::TrafficLightColor"]); + var values = color.Children + .OfType() + .Where(f => f.FeatureKeyword == "enum value") + .Select(f => f.Name) + .ToList(); + Assert.Equal(["green", "yellow", "red"], values); + } + finally + { + File.Delete(tempFile); + } + } + + /// + /// An enum def with the value-assignment form (A = 4.0;) still captures each + /// literal's name (the assigned value expression is not parsed, an accepted minimal- + /// capture gap). + /// + [Fact] + public async Task WorkspaceLoader_LoadAsync_EnumDefinition_ValueAssignmentForm_CapturesNames() + { + var tempFile = Path.GetTempFileName() + ".sysml"; + try + { + await File.WriteAllTextAsync(tempFile, + """ + package E { + private import ScalarValues::Real; + enum def GradePoints :> Real { + A = 4.0; + B = 3.0; + } + } + """, TestContext.Current.CancellationToken); + + var (stdlibTable, _) = StdlibProvider.GetSymbolTable(); + var result = await WorkspaceLoader.LoadAsync([tempFile], stdlibTable); + + Assert.NotNull(result.Workspace); + var grades = Assert.IsType( + result.Workspace!.Declarations["E::GradePoints"]); + var values = grades.Children + .OfType() + .Where(f => f.FeatureKeyword == "enum value") + .Select(f => f.Name) + .ToList(); + Assert.Equal(["A", "B"], values); + } + finally + { + File.Delete(tempFile); + } + } + + /// + /// A requirement definition captures its doc, subject, + /// require constraint, and assume constraint members as Children/Annotations. + /// + [Fact] + public async Task WorkspaceLoader_LoadAsync_RequirementDefinition_CapturesSubjectAndConstraints() + { + var tempFile = Path.GetTempFileName() + ".sysml"; + try + { + await File.WriteAllTextAsync(tempFile, + """ + package R { + private import ScalarValues::Real; + + part def Vehicle { + attribute dryMass : Real; + } + + requirement def MassLimitationRequirement { + doc /* The actual mass shall be less than or equal to the required mass. */ + attribute massActual : Real; + attribute massReqd : Real; + require constraint { massActual <= massReqd } + } + + requirement def VehicleMassLimitationRequirement :> MassLimitationRequirement { + subject vehicle : Vehicle; + assume constraint { vehicle.dryMass > 0 } + } + } + """, TestContext.Current.CancellationToken); + + var (stdlibTable, _) = StdlibProvider.GetSymbolTable(); + var result = await WorkspaceLoader.LoadAsync([tempFile], stdlibTable); + + Assert.NotNull(result.Workspace); + + var massLimitation = Assert.IsType( + result.Workspace!.Declarations["R::MassLimitationRequirement"]); + Assert.Contains(massLimitation.Annotations, + a => a.Kind == DemaConsulting.SysML2Tools.Semantic.Model.SysmlAnnotationKind.Documentation); + var requireConstraint = Assert.Single(massLimitation.Children + .OfType(), + f => f.FeatureKeyword == "require constraint"); + Assert.Contains("massActual", requireConstraint.ExpressionText); + Assert.Contains("massReqd", requireConstraint.ExpressionText); + + var vehicleRequirement = Assert.IsType( + result.Workspace!.Declarations["R::VehicleMassLimitationRequirement"]); + var subject = Assert.Single(vehicleRequirement.Children + .OfType(), + f => f.FeatureKeyword == "subject"); + Assert.Equal("vehicle", subject.Name); + Assert.Equal("Vehicle", subject.FeatureTyping); + + var assumeConstraint = Assert.Single(vehicleRequirement.Children + .OfType(), + f => f.FeatureKeyword == "assume constraint"); + Assert.Contains("dryMass", assumeConstraint.ExpressionText); + } + finally + { + File.Delete(tempFile); + } + } + + /// + /// A requirement usage (not only a requirement definition) that specializes a requirement + /// def and supplies its own subject/assume constraint body also captures + /// those members as Children — the dominant real-corpus idiom. + /// + [Fact] + public async Task WorkspaceLoader_LoadAsync_RequirementUsage_CapturesSubjectAndConstraint() + { + var tempFile = Path.GetTempFileName() + ".sysml"; + try + { + await File.WriteAllTextAsync(tempFile, + """ + package R { + private import ScalarValues::Real; + + part def Vehicle { + attribute fuelMass : Real; + } + + requirement def VehicleMassLimitationRequirement; + + requirement fullVehicleMassLimit : VehicleMassLimitationRequirement { + subject vehicle : Vehicle; + assume constraint { + vehicle.fuelMass == 0 + } + } + } + """, TestContext.Current.CancellationToken); + + var (stdlibTable, _) = StdlibProvider.GetSymbolTable(); + var result = await WorkspaceLoader.LoadAsync([tempFile], stdlibTable); + + Assert.NotNull(result.Workspace); + var usage = Assert.IsType( + result.Workspace!.Declarations["R::fullVehicleMassLimit"]); + + var subject = Assert.Single(usage.Children + .OfType(), + f => f.FeatureKeyword == "subject"); + Assert.Equal("vehicle", subject.Name); + + var assumeConstraint = Assert.Single(usage.Children + .OfType(), + f => f.FeatureKeyword == "assume constraint"); + Assert.Contains("fuelMass", assumeConstraint.ExpressionText); + } + finally + { + File.Delete(tempFile); + } + } + + /// + /// A top-level constraint { expr } usage (not nested in a requirement) is captured + /// with its raw expression text — previously entirely absent from the AST. + /// + [Fact] + public async Task WorkspaceLoader_LoadAsync_ConstraintUsage_CapturesExpressionText() + { + var tempFile = Path.GetTempFileName() + ".sysml"; + try + { + await File.WriteAllTextAsync(tempFile, + """ + package C { + constraint massCheck { + 1 == 1 + } + } + """, TestContext.Current.CancellationToken); + + var (stdlibTable, _) = StdlibProvider.GetSymbolTable(); + var result = await WorkspaceLoader.LoadAsync([tempFile], stdlibTable); + + Assert.NotNull(result.Workspace); + var constraint = Assert.IsType( + result.Workspace!.Declarations["C::massCheck"]); + Assert.Equal("constraint", constraint.FeatureKeyword); + Assert.Contains("1==1", constraint.ExpressionText); + } + finally + { + File.Delete(tempFile); + } + } + + /// + /// A constraint def synthesizes one child feature node capturing its own + /// calculation-body expression text, reusing the same Children-driven compartment + /// mechanism as a nested requirement constraint. + /// + [Fact] + public async Task WorkspaceLoader_LoadAsync_ConstraintDefinition_SynthesizesExpressionChild() + { + var tempFile = Path.GetTempFileName() + ".sysml"; + try + { + await File.WriteAllTextAsync(tempFile, + """ + package C { + constraint def MassCheck { + 1 == 1 + } + } + """, TestContext.Current.CancellationToken); + + var (stdlibTable, _) = StdlibProvider.GetSymbolTable(); + var result = await WorkspaceLoader.LoadAsync([tempFile], stdlibTable); + + Assert.NotNull(result.Workspace); + var def = Assert.IsType( + result.Workspace!.Declarations["C::MassCheck"]); + var expressionChild = Assert.Single(def.Children + .OfType()); + Assert.Equal("constraint", expressionChild.FeatureKeyword); + Assert.Contains("1==1", expressionChild.ExpressionText); + } + finally + { + File.Delete(tempFile); + } + } + + /// + /// Actor and stakeholder usages nested in a requirement definition's body are captured, + /// mirroring the subject capture pattern. + /// + [Fact] + public async Task WorkspaceLoader_LoadAsync_RequirementDefinition_CapturesActorAndStakeholder() + { + var tempFile = Path.GetTempFileName() + ".sysml"; + try + { + await File.WriteAllTextAsync(tempFile, + """ + package R { + part def Driver; + part def Owner; + + requirement def DriveRequirement { + actor driver : Driver; + stakeholder owner : Owner; + } + } + """, TestContext.Current.CancellationToken); + + var (stdlibTable, _) = StdlibProvider.GetSymbolTable(); + var result = await WorkspaceLoader.LoadAsync([tempFile], stdlibTable); + + Assert.NotNull(result.Workspace); + var req = Assert.IsType( + result.Workspace!.Declarations["R::DriveRequirement"]); + var features = req.Children.OfType().ToList(); + + var actor = Assert.Single(features, f => f.FeatureKeyword == "actor"); + Assert.Equal("driver", actor.Name); + Assert.Equal("Driver", actor.FeatureTyping); + + var stakeholder = Assert.Single(features, f => f.FeatureKeyword == "stakeholder"); + Assert.Equal("owner", stakeholder.Name); + Assert.Equal("Owner", stakeholder.FeatureTyping); + } + finally + { + File.Delete(tempFile); + } + } + + /// + /// A verify member's nested content (its own requirementBody) is not + /// spuriously hoisted onto the enclosing requirement definition's Children — a + /// regression guard for the null-suppression safeguard in + /// VisitRequirementVerificationMember. Its target is still captured separately via + /// VerifiedRequirementNames. + /// + [Fact] + public async Task WorkspaceLoader_LoadAsync_RequirementVerifyMember_DoesNotHoistNestedContent() + { + var tempFile = Path.GetTempFileName() + ".sysml"; + try + { + await File.WriteAllTextAsync(tempFile, + """ + package R { + part def Vehicle; + + requirement def TargetRequirement { + subject shouldNotAppear : Vehicle; + } + + requirement def CheckMass { + subject checkSubject : Vehicle; + verify requirement notHoisted : TargetRequirement { + subject alsoShouldNotAppear : Vehicle; + } + } + } + """, TestContext.Current.CancellationToken); + + var (stdlibTable, _) = StdlibProvider.GetSymbolTable(); + var result = await WorkspaceLoader.LoadAsync([tempFile], stdlibTable); + + Assert.NotNull(result.Workspace); + var checkMass = Assert.IsType( + result.Workspace!.Declarations["R::CheckMass"]); + + // The verify member's own nested subject must not appear anywhere in CheckMass's + // Children — neither as a direct child nor spuriously flattened into one. The + // enclosing requirement's own legitimate "checkSubject" subject must still be present. + var subjects = checkMass.Children + .OfType() + .Where(f => f.FeatureKeyword == "subject") + .ToList(); + var subject = Assert.Single(subjects); + Assert.Equal("checkSubject", subject.Name); + Assert.DoesNotContain(checkMass.Children.OfType(), + f => f.Name is "notHoisted" or "alsoShouldNotAppear"); + + // The verify target is still captured via VerifiedRequirementNames. + Assert.Contains("TargetRequirement", checkMass.VerifiedRequirementNames); + } + finally + { + File.Delete(tempFile); + } + } + /// /// Finds the test/SysMLModels directory relative to the test assembly. /// From 2d79d75d40da897c098dcbbbbe2e19f5fd0c2d62 Mon Sep 17 00:00:00 2001 From: Malcolm Nixon Date: Sun, 12 Jul 2026 20:08:47 -0400 Subject: [PATCH 5/7] Document AstBuilder and GeneralViewLayoutStrategy annotation/compartment changes - ast-builder.md/general-view-layout-strategy.md design docs: describe the new visitor methods, the deliberate VisitRequirementUsage/VisitConcernUsage extension, the verify/frame null-suppression safeguard, and the AddAnnotationNote architectural deviation from a post-layout marker-decoration approach. - sysml-node.md: document the new SysmlFeatureNode.ExpressionText field. - Verification docs: add Test Scenarios entries for every new test. - Reqstream YAMLs: add new requirement IDs with test traces, following the shape established by PR #30/#31. --- .../internal/general-view-layout-strategy.md | 62 +++++++++-- .../semantic/model/ast-builder.md | 100 ++++++++++++++++-- .../semantic/model/sysml-node.md | 6 ++ .../general-view-layout-strategy.yaml | 44 ++++++++ .../semantic/model/ast-builder.yaml | 88 +++++++++++++++ .../internal/general-view-layout-strategy.md | 25 +++++ .../semantic/model/ast-builder.md | 31 ++++++ 7 files changed, 341 insertions(+), 15 deletions(-) diff --git a/docs/design/sysml2-tools-core/layout/internal/general-view-layout-strategy.md b/docs/design/sysml2-tools-core/layout/internal/general-view-layout-strategy.md index e51e680..a7a939c 100644 --- a/docs/design/sysml2-tools-core/layout/internal/general-view-layout-strategy.md +++ b/docs/design/sysml2-tools-core/layout/internal/general-view-layout-strategy.md @@ -21,7 +21,9 @@ box title and folder-tab geometry come from `BoxMetrics` in `DemaConsulting.Rend `GeneralViewLayoutStrategy` has no instance state; all input arrives through the `BuildLayout` parameters. Layout constants (`MinBoxWidth`, `CharWidthFactor`) are declared as `private const` fields. Private records carry intermediate data: `DefBox` (a user definition with its computed -size, keyword, supertype names, memberships, and compartments), `ModelEdge` (a resolved +size, keyword, supertype names, memberships, compartments, and `Annotations` — the definition's +own `SysmlNode.Annotations` list, threaded through by `CollectDefinitions` so `AddAnnotationNote` +(below) can render them without a second workspace lookup), `ModelEdge` (a resolved specialization/membership/attribute-typing/redefinition/subsetting/connect/allocate/dependency/ binding relationship expressed by qualified name, together with its target end marker, edge kind, and an optional midpoint label), `Location` (a located definition's @@ -33,10 +35,13 @@ carries the short kind label, raw source/target reference, and human-readable re rendered boxes, feeding `LayoutWarnings.ForDroppedRelationshipEdges`. `FeatureMembership` (a private record) carries each owned feature's keyword, raw type reference (`TypeName`, nullable — a feature may declare a redefinition with no explicit type annotation), simple `Name`, raw -`RedefinedFeatureName` reference, and the raw `SubsettedFeatureNames` list (populated verbatim -from `SysmlFeatureNode.SupertypeNames` — a feature's `subsets`/`:>` targets, not a new AST field); -`CollectMemberships` includes a feature when `TypeName`, `RedefinedFeatureName`, or a non-empty -`SubsettedFeatureNames` is present. The private `EdgeKind` enumeration classifies each edge as +`RedefinedFeatureName` reference, the raw `SubsettedFeatureNames` list (populated verbatim +from `SysmlFeatureNode.SupertypeNames` — a feature's `subsets`/`:>` targets, not a new AST field), +and `ExpressionText` (verbatim from `SysmlFeatureNode.ExpressionText`, non-null only for +constraint-kind features such as `"require constraint"`/`"assume constraint"`/`"constraint"`); +`CollectMemberships` includes a feature when `TypeName`, `RedefinedFeatureName`, +`ExpressionText`, or a non-empty `SubsettedFeatureNames` is present. The private `EdgeKind` +enumeration classifies each edge as `Specialization`, `Membership`, `Typing`, `Redefinition`, `Subsetting`, `Connect`, `Allocate`, `Dependency`, or `Binding`; `Subsetting` is a purely view-layer classification — it does not correspond to a public `SysmlEdgeKind` — reusing `SupertypeNames` and the same owner-resolution @@ -87,10 +92,26 @@ the `LayoutTree with { Warnings = … }` record-copy idiom. Iterates `workspace.Declarations`, keeping each `SysmlDefinitionNode` that is not a standard-library element (per `StdlibFilter.IsStdlibElement`) and, when `scope` is non-null, is within `scope` per `ExposeScopeResolver.IsInSubjectScope`. For each kept definition it builds the -compartments from the owned usage features (grouped by keyword, each formatted as a -`name : Type [n]` row), collects the typed memberships, and computes the box size from the title +compartments from the owned usage features (grouped by keyword, each formatted via +`FormatFeatureRow`), collects the typed memberships, and computes the box size from the title and the longest compartment row. +Each compartment's title comes from `Pluralize(keyword)`, which special-cases a small set of +individually-significant single-member keywords to a guillemet-wrapped stereotype form instead of +the generic pluralized-keyword default: `"subject"` → `"«subject»"`, `"assume constraint"` → +`"«assume constraint»"`, `"require constraint"` → `"«require constraint»"`, and `"constraint"` → +`"«constraint»"`. This reuses the exact guillemet convention already established elsewhere in this +file for the `«allocate»` edge midpoint label (see `BuildModelEdges`), rather than inventing a new +one. Every other keyword introduced alongside this work — `"enum value"` (rendered as the +compartment title `"enum values"`), `"actor"`, `"stakeholder"` — falls through to the generic +pluralized-keyword default, matching the OMG spec figures' own compartment-heading conventions for +those kinds. + +`FormatFeatureRow` renders a feature with a non-null, non-empty `ExpressionText` (constraint-kind +features only) as its raw expression text alone (unnamed) or as `"{name}: {expr}"` (named) +instead of the generic `"name : Type [multiplicity]"` shape used by every other feature kind, +since a constraint's defining content is its expression, not a type/multiplicity pair. + ###### `GroupByPackage(defs)` Groups definitions by the qualified-name prefix before the last `::`, preserving first-seen order. @@ -244,6 +265,33 @@ map to reference and is silently dropped, exactly as before. Adds one definition as a leaf node to the given scope (the root graph or a folder's `Children`), carrying its `Label`, `Shape = Rectangle`, `Keyword`, and `Compartments`. +###### `AddAnnotationNote(scope, def, defNode, theme)` + +Called immediately after `MakeDefNode` for every definition (both top-level and folder-scoped), +this no-ops when `def.Annotations` is empty; otherwise it adds one `BoxShape.Note` node (id +`note:{qualifiedName}`) to the same `scope` as `defNode`, plus a plain solid edge with no end +marker (id `note-edge:{qualifiedName}`, `TargetEnd = EndMarkerStyle.None`) from the note to the +definition. `BuildNoteText` concatenates every annotation's trimmed text with a blank-line +separator, so **one note box renders per annotated element**, never one box per individual +`comment`/`doc` — a definition with both a `doc` and two `comment`s still gets a single note. +`ComputeNoteBoxSize` sizes the note from the longest line and total line count using +`BoxMetrics.TitleAreaHeight(theme, hasLabel: false, hasKeyword: false)` for the (title-less) top +band plus per-line height and padding — deliberately simpler than the full `ComputeBoxSize` used +for definition boxes, since a note has no title/keyword band. The note's single +`LayoutCompartment` carries `Title = null` and one row per line of the concatenated text; no +`Label`/`Keyword` is set on the note node itself, matching conventional UML/SysML note rendering +(body text only). + +This is implemented as ordinary `LayoutGraph` nodes and edges added during the same +single-pass `BuildGraph`/`CollectDefinitions` traversal that builds each definition's own box — a +deliberate, documented deviation from a literal "post-layout marker decoration" approach (the +pattern used by, e.g., `StateTransitionViewLayoutStrategy.AddInitialMarker`, which stamps a marker +onto an already-placed box after layout completes). This strategy has no equivalent +post-layout decoration phase — its entire graph, including folder containers and truncated-folder +placeholders, is built in one `BuildGraph` pass before layout ever runs — so adding the note as an +ordinary graph node/edge pair up front is the natural fit, and lets the layout engine route and +position it like any other element rather than requiring bespoke placement math. + ###### `DecorateTruncatedFolders(tree, graph, truncated, theme)` Replaces each truncated folder's placed box with one carrying its "+N more…" ellipsis label, diff --git a/docs/design/sysml2-tools-language/semantic/model/ast-builder.md b/docs/design/sysml2-tools-language/semantic/model/ast-builder.md index b5faeda..c94341c 100644 --- a/docs/design/sysml2-tools-language/semantic/model/ast-builder.md +++ b/docs/design/sysml2-tools-language/semantic/model/ast-builder.md @@ -40,6 +40,15 @@ stack with `::` to form the fully-qualified name. | `VisitForkNode` | `ForkNodeContext` | `SysmlFeatureNode` (`FeatureKeyword = "fork"`) | | `VisitAcceptNode` | `AcceptNodeContext` | `SysmlFeatureNode` (`FeatureKeyword = "accept"`) | | `VisitSendNode` | `SendNodeContext` | `SysmlFeatureNode` (`FeatureKeyword = "send"`) | +| `VisitEnumeratedValue` | `EnumeratedValueContext` | `SysmlFeatureNode` (`FeatureKeyword = "enum value"`) | +| `VisitSubjectUsage` | `SubjectUsageContext` | `SysmlFeatureNode` (`FeatureKeyword = "subject"`) | +| `VisitActorUsage` | `ActorUsageContext` | `SysmlFeatureNode` (`FeatureKeyword = "actor"`) | +| `VisitStakeholderUsage` | `StakeholderUsageContext` | `SysmlFeatureNode` (`FeatureKeyword = "stakeholder"`) | +| `VisitRequirementConstraintMember` | `RequirementConstraintMemberContext` | require/assume constraint feature | +| `VisitConstraintUsage` | `ConstraintUsageContext` | `SysmlFeatureNode` (`"constraint"`, `ExpressionText` set) | +| `VisitConstraintDefinition` | `ConstraintDefinitionContext` | def + synthesized `"constraint"` child feature | +| `VisitRequirementVerificationMember` | `RequirementVerificationMemberContext` | `null` (suppresses hoisting) | +| `VisitFramedConcernMember` | `FramedConcernMemberContext` | `null` (suppresses hoisting) | `GetDeclaredName(IdentificationContext)` handles the three grammar alternatives: @@ -228,11 +237,20 @@ direct `qualifiedName()` child (which is null for this alternative). `VisitImpor `ExtractExposedNames` both call this one helper rather than duplicating the extraction logic, per the Copy-Paste Programming anti-pattern guidance in coding-principles.md. -`VisitRequirementUsage` performs a minimal capture (name/qualified-name only, so named -requirement usages become resolvable symbols) and additionally invokes `FindVerificationMembers` -against its own `requirementBody()` (when present) to populate `VerifiedRequirementNames` — -covering the case where a `verify` member appears directly inside a `requirement { }` usage -body. +`VisitRequirementUsage` and `VisitConcernUsage` push a namespace scope (when named) and call +`CollectChildren(body?.requirementBodyItem() ?? [])` in addition to their existing name/qualified- +name capture, so a requirement/concern *usage*'s own `subject`/`actor`/`stakeholder`/constraint +members are captured as `Children` — not only a requirement/concern *definition*'s. This is a +deliberate extension beyond a literal reading of "definitions only": the dominant idiom in the +real OMG training corpus (e.g. `test/SysMLModels/OMG/training/32.Requirements/ +RequirementUsages.sysml`) nests `subject`/`assume constraint` inside a requirement usage that +specializes a requirement def (`requirement <'1.1'> fullVehicleMassLimit : +VehicleMassLimitationRequirement { subject vehicle : Vehicle; assume constraint { ... } }`), not +inside the def's own body — without extending usages, this compartment-depth work would not +manifest for the corpus's actual idiomatic shape. `VisitRequirementUsage` additionally invokes +`FindVerificationMembers` against its own `requirementBody()` (when present) to populate +`VerifiedRequirementNames` — covering the case where a `verify` member appears directly inside a +`requirement { }` usage body. `FindVerificationMembers(IParseTree root)` / `CollectVerificationMembers(IParseTree, List)` / `ExtractVerifiedRequirementName(RequirementVerificationUsageContext?)` are a narrow, additive @@ -249,9 +267,75 @@ placeholder form's feature typing (`verify requirement : ;`, via th `VisitAnalysisCaseDefinition`, `VisitVerificationCaseDefinition` (via an optional `specializedBody` parameter added to the shared `BuildDefinitionFromDeclaration`, defaulting to `null` for backward compatibility with callers that don't have a specialized body to scan), and -`VisitRequirementUsage` (via its own `requirementBody()`). This walk is safe from double-counting -because nothing else in `AstBuilder` currently visits into `requirementBody`/`caseBody` -subtrees. +`VisitRequirementUsage`/`VisitConcernUsage` (via their own `requirementBody()`). + +**Enumeration literal values.** `VisitEnumerationDefinition` pushes a namespace scope and calls a +dedicated `CollectEnumerationBodyChildren(EnumerationBodyContext?)` helper, rather than +`CollectChildren` directly: `enumerationBody` uniquely alternates `annotatingMember | +enumerationUsageMember` directly (`LBRACE ( annotatingMember | enumerationUsageMember )* +RBRACE`), unlike every other body rule in this unit (`definitionBody`/`requirementBody`/ +`stateBody`/`actionBody`), which wrap their alternatives in a single intermediate rule that +`CollectChildren` can iterate directly. `CollectEnumerationBodyChildren` walks the body's raw +`context.children`, filters to `Antlr4.Runtime.ParserRuleContext` instances (dropping the +`LBRACE`/`RBRACE` terminal nodes), and delegates the filtered list to the existing +`CollectChildren` — a narrow, documented exception rather than a generalization of +`CollectChildren` itself. `VisitEnumeratedValue` builds a usage node via the existing +`BuildUsageNode` helper with `FeatureKeyword = "enum value"` (distinct from the bare `"enum"` +keyword used by `VisitEnumerationUsage`, to avoid a compartment-title collision), covering all +three literal forms observed in the OMG corpus: bare (`enum green;`), value-assignment +(`A = 4.0;`), and redefinition-body (`unclassified { :>> code = "..."; }`) — the assigned value +expression itself is not parsed in any form, an accepted minimal-capture gap. + +**Requirement subject, actor, stakeholder, and constraint members.** `VisitRequirementDefinition` +and `VisitConcernDefinition` push a namespace scope and call +`CollectChildren(body?.requirementBodyItem() ?? [])`, mirroring `VisitStateUsage`'s existing +push-scope/body-collect/register pattern; `VisitSubjectUsage`, `VisitActorUsage`, and +`VisitStakeholderUsage` each build a minimal usage node (via `BuildUsageNode`) with +`FeatureKeyword` `"subject"`, `"actor"`, `"stakeholder"` respectively. +`VisitRequirementConstraintMember` reads `context.requirementKind()?.REQUIRE()` to choose between +`"require constraint"` and `"assume constraint"` (defaulting to `"assume constraint"` when +neither `ASSUME` nor `REQUIRE` is present — the grammar treats `requirementKind` as optional), and +delegates to a new `BuildConstraintFeatureNode(RequirementConstraintUsageContext?, string +keyword)` helper. That helper handles both `requirementConstraintUsage` grammar alternatives: the +reference form (`ownedReferenceSubsetting featureSpecializationPart? requirementBody`, whose raw +referenced-name text is captured into `ExpressionText`) and the inline form +(`(usageExtensionKeyword* CONSTRAINT | usageExtensionKeyword+) constraintUsageDeclaration +calculationBody`, whose name comes from `constraintUsageDeclaration()?.usageDeclaration()? +.identification()` and whose raw `calculationBody().GetText()` is captured into +`ExpressionText`). A nested `doc` inside a constraint's own `calculationBody` (as seen in the +corpus's `assume constraint { doc /* ... */ ... }` idiom) is intentionally **not** captured — +constraint bodies are captured only as raw expression text, with no nested-member traversal; +this is a deliberate, accepted scope boundary rather than an oversight. + +**Standalone constraint usage and definition.** `VisitConstraintUsage` (previously entirely +absent) captures a top-level `constraint { expr }` usage's name and raw +`calculationBody()?.GetText()` into `ExpressionText`, with `FeatureKeyword = "constraint"`. +`VisitConstraintDefinition` no longer delegates to the generic `BuildDefinitionFromDeclaration` +(which has no way to expose a `constraintDefinition`'s own body, since that body is a +`calculationBody`, not a `definitionBody`); it instead builds the definition's name/qualified- +name/supertypes directly and synthesizes a single child `SysmlFeatureNode { FeatureKeyword = +"constraint", ExpressionText = context.calculationBody()?.GetText() }`, reusing the same +`"constraint"`-keyword/`ExpressionText` shape as a nested requirement constraint so +`GeneralViewLayoutStrategy` can render both uniformly. + +**Verify/frame null-suppression safeguard.** Once `VisitRequirementDefinition`, +`VisitConcernDefinition`, `VisitRequirementUsage`, and `VisitConcernUsage` began calling +`CollectChildren` over `requirementBodyItem`, ANTLR's default last-non-null-wins +`AggregateResult` dispatch would, for the first time, recurse into a nested `verify`/`frame` +member's own `requirementBody` — since `requirementVerificationMember` and `framedConcernMember` +are themselves `requirementBodyItem` alternatives with their own nested bodies that can contain +real content (e.g. a nested `subjectMember`) — and incorrectly bubble that nested content up as +if it were a direct child of the *outer* enclosing requirement/concern, rather than staying +scoped to the inner `verify`/`frame` member. `VisitRequirementVerificationMember` and +`VisitFramedConcernMember` now explicitly return `null`, short-circuiting that recursive descent; +the verify member's own target is still captured separately and correctly via the pre-existing +`FindVerificationMembers`/`VerifiedRequirementNames` mechanism above, which is unaffected by this +change since it performs its own independent tree walk rather than relying on `CollectChildren`. + +Note: unlike the transition-related walk in `FindVerificationMembers` above, this per-body +`CollectChildren(requirementBodyItem())` traversal is *not* immune to double-counting by +construction — it is precisely because it now visits into `requirementBody`/`caseBody` subtrees +that the null-suppression safeguard above is required. `VisitStateUsage` additionally calls `ExtractFeatureTyping(decl?.featureSpecializationPart())` and sets the result on the constructed `SysmlFeatureNode`'s `FeatureTyping` property — previously this diff --git a/docs/design/sysml2-tools-language/semantic/model/sysml-node.md b/docs/design/sysml2-tools-language/semantic/model/sysml-node.md index 3f0ffcb..a2cfcbd 100644 --- a/docs/design/sysml2-tools-language/semantic/model/sysml-node.md +++ b/docs/design/sysml2-tools-language/semantic/model/sysml-node.md @@ -88,6 +88,12 @@ There are no behavioral methods beyond the inherited `object` members. `SysmlImp `ReferenceResolver` into a `SysmlEdgeKind.Redefinition` edge, and rendered by `GeneralViewLayoutStrategy` as a hollow-triangle-crossbar marker. - `Multiplicity` — the multiplicity text (e.g., `"[4]"`, `"[0..*]"`), or null when unspecified. +- `ExpressionText` — the raw expression text of a constraint-kind feature's calculation body or + referenced constraint name (e.g. `"require constraint"`, `"assume constraint"`, `"constraint"` + keywords), or null for every other feature kind. Mirrors `SysmlTransitionNode.Guard`'s + raw-text-only capture; no expression-tree modeling is attempted. Rendered by + `GeneralViewLayoutStrategy.FormatFeatureRow` in place of the generic `name : Type + [multiplicity]` row shape when non-null. `SysmlConnectionNode` adds: diff --git a/docs/reqstream/sysml2-tools-core/layout/internal/general-view-layout-strategy.yaml b/docs/reqstream/sysml2-tools-core/layout/internal/general-view-layout-strategy.yaml index fd89efc..45d9c7b 100644 --- a/docs/reqstream/sysml2-tools-core/layout/internal/general-view-layout-strategy.yaml +++ b/docs/reqstream/sysml2-tools-core/layout/internal/general-view-layout-strategy.yaml @@ -390,3 +390,47 @@ sections: tests: - GeneralViewLayoutStrategy_BuildLayout_UnresolvableRedefinition_ProducesNoEdge - GeneralViewLayoutStrategy_BuildLayout_SelfReferentialRedefinition_ProducesNoEdge + + - id: SysML2Tools-Core-Layout-Internal-GeneralViewLayoutStrategy-AnnotationNote + title: >- + GeneralViewLayoutStrategy shall render one `BoxShape.Note` box per annotated + definition, connected to the definition's box by a plain solid line with no end + marker, containing the definition's Documentation/Comment annotation text (multiple + annotations concatenated with a blank-line separator into a single note), and shall + emit no note box for a definition with no annotations. + justification: | + The ROADMAP's "Annotating elements" gap: `comment`/`doc` annotations were already + captured into SysmlNode.Annotations by AstBuilder but never rendered anywhere in the + General View, silently discarding real model content. `AddAnnotationNote` implements + this as an ordinary `LayoutGraph` node/edge pair added during the same single-pass + `BuildGraph` traversal that builds each definition's own box — a deliberate, + documented deviation from a literal post-layout marker-decoration approach (as used + by `AddInitialMarker` in the State Transition View), chosen because this strategy + builds its entire graph in one pass with no separate decoration phase. One note per + annotated element (not one note per annotation) keeps the diagram from fragmenting + into many small boxes when an element has both a `doc` and one or more `comment`s. + tests: + - GeneralViewLayoutStrategy_BuildLayout_AnnotatedDefinition_EmitsNoteBox + - GeneralViewLayoutStrategy_BuildLayout_UnannotatedDefinition_EmitsNoNoteBox + - GeneralViewLayoutStrategy_BuildLayout_MultipleAnnotations_ProduceOneNoteBox + + - id: SysML2Tools-Core-Layout-Internal-GeneralViewLayoutStrategy-RequirementConstraintCompartments + title: >- + GeneralViewLayoutStrategy's Pluralize helper shall title a "subject", "assume + constraint", "require constraint", or "constraint" feature compartment with the + guillemet-wrapped stereotype form («subject», «assume constraint», «require + constraint», «constraint») rather than the generic pluralized-keyword form, and + FormatFeatureRow shall render a feature with a non-empty ExpressionText as its raw + expression text (optionally prefixed with "name: ") instead of the generic "name : + Type [multiplicity]" shape. + justification: | + These compartment kinds are new to AstBuilder's output (subject/actor/stakeholder/ + constraint members, enum literal values) and the plain pluralized-keyword default + ("subjects", "assume constraints", ...) does not match the stereotype convention this + file already applies to other individually-significant single-member compartments + (e.g. the pre-existing `«allocate»` edge-label convention reused here), nor would a + generic name/type row correctly convey a constraint's actual expression content. + tests: + - GeneralViewLayoutStrategy_BuildLayout_RequirementSubject_UsesGuillemetTitle + - GeneralViewLayoutStrategy_BuildLayout_ConstraintFeatures_ShowExpressionText + - GeneralViewLayoutStrategy_BuildLayout_EnumDefLiteralValues_ProducesEnumValuesCompartment diff --git a/docs/reqstream/sysml2-tools-language/semantic/model/ast-builder.yaml b/docs/reqstream/sysml2-tools-language/semantic/model/ast-builder.yaml index 64a01e9..4dfffcf 100644 --- a/docs/reqstream/sysml2-tools-language/semantic/model/ast-builder.yaml +++ b/docs/reqstream/sysml2-tools-language/semantic/model/ast-builder.yaml @@ -337,3 +337,91 @@ sections: - WorkspaceLoader_LoadAsync_AnonymousControlNodes_SynthesizeNames - WorkspaceLoader_LoadAsync_NamedControlNodes_KeepDeclaredName - ControlNode_OmgCorpusFixture_ResolvesForkJoinDecisionMerge + + - id: SysML2Tools-Language-Semantic-Model-AstBuilder-EnumerationValues + title: >- + AstBuilder shall build a SysmlFeatureNode (FeatureKeyword "enum value") for each + `enumeratedValue` in an `enum def`'s body, in source order, regardless of whether the + literal uses the bare form, the value-assignment form, or the redefinition-body form. + justification: | + `enumerationBody` uniquely alternates `annotatingMember | enumerationUsageMember` + directly rather than wrapping them in a single rule (unlike `definitionBody`'s + `definitionBodyItem` or `requirementBody`'s `requirementBodyItem`), so the generic + `CollectChildren` helper cannot be applied to it directly. A dedicated + `CollectEnumerationBodyChildren` helper walks the body's raw `context.children`, + filtering to parser-rule children before delegating to `CollectChildren`, so `enum + def` compartments render their literal values instead of always appearing empty. + tests: + - WorkspaceLoader_LoadAsync_EnumDefinition_BareLiterals_CapturesEnumValues + - WorkspaceLoader_LoadAsync_EnumDefinition_ValueAssignmentForm_CapturesNames + - Enumeration_OmgCorpusFixtures_CaptureAllLiteralForms + + - id: SysML2Tools-Language-Semantic-Model-AstBuilder-RequirementSubjectAndConstraints + title: >- + AstBuilder shall capture a requirement/concern definition's or usage's `subject`, + `actor`, and `stakeholder` members as minimal SysmlFeatureNodes (FeatureKeyword + "subject", "actor", "stakeholder"), and its `require constraint`/`assume constraint` + members as SysmlFeatureNodes (FeatureKeyword "require constraint"/"assume + constraint") whose ExpressionText captures the constraint's raw expression text. + justification: | + Requirement definitions previously delegated to the generic + BuildDefinitionFromDeclaration helper, which never collected a requirementBody's + Children at all — subject/actor/stakeholder/constraint members were always silently + dropped, defeating the compartment-depth goal for the view's most detailed element + kind. VisitRequirementDefinition and VisitConcernDefinition now push a namespace + scope and call CollectChildren over requirementBody().requirementBodyItem(), + mirroring VisitStateUsage's existing push-scope/body-collect/register pattern. + Because the real OMG training corpus's dominant idiom nests `subject`/`assume + constraint` inside a requirement *usage* that specializes a requirement def (not + inside a `requirement def` body), VisitRequirementUsage and VisitConcernUsage are + also extended to collect Children the same way — a deliberate extension beyond a + literal *Definition-only reading of the ROADMAP item, without which the + compartment-depth goal would not manifest for the corpus's actual idiomatic shape. + BuildConstraintFeatureNode handles both requirementConstraintUsage grammar + alternatives: the reference form (captures the referenced constraint's name into + ExpressionText) and the inline `CONSTRAINT constraintUsageDeclaration + calculationBody` form (captures the raw calculationBody().GetText()). A nested `doc` + inside a constraint's own calculationBody (as seen in the corpus's `assume + constraint { doc /* ... */ ... }` idiom) is intentionally NOT captured — constraint + bodies are captured only as raw expression text, with no nested-member traversal. + tests: + - WorkspaceLoader_LoadAsync_RequirementDefinition_CapturesSubjectAndConstraints + - WorkspaceLoader_LoadAsync_RequirementUsage_CapturesSubjectAndConstraint + - WorkspaceLoader_LoadAsync_RequirementDefinition_CapturesActorAndStakeholder + - Requirement_OmgCorpusFixtures_CaptureSubjectAndConstraints + + - id: SysML2Tools-Language-Semantic-Model-AstBuilder-StandaloneConstraintUsageAndDefinition + title: >- + AstBuilder shall build a SysmlFeatureNode (FeatureKeyword "constraint") for a + top-level `constraint { expr }` usage, capturing its raw calculation-body expression + text into ExpressionText, and shall synthesize the same shape as a single child + feature of a `constraint def`'s own SysmlDefinitionNode. + justification: | + VisitConstraintUsage was previously entirely absent from AstBuilder — a standalone + `constraint` usage (not nested inside a requirement) produced no AST node at all. + VisitConstraintDefinition previously delegated to BuildDefinitionFromDeclaration, + which builds name/qualifiedName/supertypes correctly for a `constraint def` but has + no way to expose the definition's own calculationBody (constraintDefinition's body is + a calculationBody, not a definitionBody), so it is now rewritten to synthesize a + single "constraint"-keyword child feature node carrying that raw expression text. + tests: + - WorkspaceLoader_LoadAsync_ConstraintUsage_CapturesExpressionText + - WorkspaceLoader_LoadAsync_ConstraintDefinition_SynthesizesExpressionChild + + - id: SysML2Tools-Language-Semantic-Model-AstBuilder-RequirementVerifyFrameNoHoist + title: >- + AstBuilder shall not hoist a requirementVerificationMember's or framedConcernMember's + own nested body content onto the enclosing requirement/concern's Children. + justification: | + Once VisitRequirementDefinition/VisitConcernDefinition/VisitRequirementUsage/ + VisitConcernUsage began calling CollectChildren over requirementBodyItem (needed to + capture subject/constraint members), ANTLR's default last-non-null-wins dispatch + would, for the first time, recurse into a nested `verify`/`frame` member's own + requirementBody and incorrectly bubble its content up as if it were a direct child of + the *outer* enclosing requirement. VisitRequirementVerificationMember and + VisitFramedConcernMember now explicitly return null, short-circuiting that recursive + descent; the verify target itself remains captured separately via the existing + FindVerificationMembers/VerifiedRequirementNames mechanism, unaffected by this + change. + tests: + - WorkspaceLoader_LoadAsync_RequirementVerifyMember_DoesNotHoistNestedContent diff --git a/docs/verification/sysml2-tools-core/layout/internal/general-view-layout-strategy.md b/docs/verification/sysml2-tools-core/layout/internal/general-view-layout-strategy.md index afb3c86..653f8a5 100644 --- a/docs/verification/sysml2-tools-core/layout/internal/general-view-layout-strategy.md +++ b/docs/verification/sysml2-tools-core/layout/internal/general-view-layout-strategy.md @@ -110,6 +110,15 @@ configuration are required beyond a standard .NET SDK installation. `LayoutTree.Warnings` (defense-in-depth diagnostic) — except an unresolved-endpoint drop caused solely by the endpoint falling outside an active `expose` scope narrowing, which is expected behavior and produces no warning. +- Every definition with one or more `Documentation`/`Comment` annotations gets exactly one + `BoxShape.Note` box, connected to the definition's own box by a plain solid line with no end + marker; a definition with no annotations gets no note box. +- A `"subject"`/`"assume constraint"`/`"require constraint"`/`"constraint"`-keyword feature + compartment is titled with the guillemet-wrapped stereotype form (e.g. `«subject»`), not the + generic pluralized-keyword default. +- A constraint-kind feature (non-null `ExpressionText`) renders its raw expression text in place + of the generic `name : Type [multiplicity]` row shape. +- An `"enum value"`-keyword feature compartment is titled `"enum values"`. ##### Test Scenarios @@ -210,3 +219,19 @@ configuration are required beyond a standard .NET SDK installation. - `GeneralViewLayoutStrategy_BuildLayout_SelfReferentialSubsetting_ProducesNoEdge`: A self-referential subsetting reference (resolving back to the subtype's own owning definition) produces no edge +- `GeneralViewLayoutStrategy_BuildLayout_AnnotatedDefinition_EmitsNoteBox`: + A definition with a `Documentation`/`Comment` annotation gets a `BoxShape.Note` box connected by + a plain solid line with no end marker +- `GeneralViewLayoutStrategy_BuildLayout_UnannotatedDefinition_EmitsNoNoteBox`: + A definition with no annotations gets no note box (regression guard) +- `GeneralViewLayoutStrategy_BuildLayout_MultipleAnnotations_ProduceOneNoteBox`: + A definition with multiple `Documentation`/`Comment` annotations gets exactly one note box, with + every annotation's text concatenated into it +- `GeneralViewLayoutStrategy_BuildLayout_RequirementSubject_UsesGuillemetTitle`: + A `"subject"`-keyword feature compartment is titled `«subject»`, not the generic pluralized form +- `GeneralViewLayoutStrategy_BuildLayout_ConstraintFeatures_ShowExpressionText`: + `"require constraint"`/`"assume constraint"` features render their raw `ExpressionText` instead + of a `name : Type [multiplicity]` row, under `«require constraint»`/`«assume constraint»` + compartment titles +- `GeneralViewLayoutStrategy_BuildLayout_EnumDefLiteralValues_ProducesEnumValuesCompartment`: + `"enum value"`-keyword features are grouped under an `"enum values"` compartment title diff --git a/docs/verification/sysml2-tools-language/semantic/model/ast-builder.md b/docs/verification/sysml2-tools-language/semantic/model/ast-builder.md index bb3531a..8c082e8 100644 --- a/docs/verification/sysml2-tools-language/semantic/model/ast-builder.md +++ b/docs/verification/sysml2-tools-language/semantic/model/ast-builder.md @@ -72,6 +72,26 @@ external services or additional configuration are required beyond a standard .NE unresolved-reference diagnostics for `start`/`off`/`starting`/`on`, and produces the exact expected declared-state and resolved-transition counts, including entry/do/exit action feature nodes on the `on` state. +- `VisitEnumeratedValue` captures each `enum def` literal (bare, value-assignment, and + redefinition-body forms) as an `"enum value"`-keyword feature, in source order, via the + dedicated `CollectEnumerationBodyChildren` helper. +- `VisitRequirementDefinition`/`VisitConcernDefinition` capture `subject`/`actor`/`stakeholder`/ + `require constraint`/`assume constraint` members as `Children`; `VisitRequirementUsage`/ + `VisitConcernUsage` capture the same members when nested in a requirement/concern *usage* + instead of a definition (the dominant real-corpus idiom). +- A `require constraint`/`assume constraint` member's `ExpressionText` captures its raw + calculation-body expression text, for both the reference form and the inline form. +- `VisitConstraintUsage` (previously entirely absent) captures a top-level `constraint { expr }` + usage's raw expression text; `VisitConstraintDefinition` synthesizes one child feature node + carrying its own calculation-body expression text. +- A `verify`/`frame` member's own nested `requirementBody` content is not spuriously hoisted onto + the enclosing requirement/concern's `Children`, while the verify target itself remains captured + via `VerifiedRequirementNames` — a regression guard for the null-suppression safeguard. +- The real OMG corpus fixtures `training/06.EnumerationDefinitions/EnumerationDefinitions-{1,2}. + sysml`, `training/32.Requirements/RequirementDefinitions.sysml` and `RequirementUsages.sysml`, + and `examples/CommentExamples/Comments.sysml`/`training/01.Packages/DocumentationExample.sysml` + parse with no error diagnostics and produce the expected enum-value/subject/constraint/ + annotation captures. ##### Test Scenarios @@ -120,3 +140,14 @@ external services or additional configuration are required beyond a standard .NE | Named control nodes keep declared name | `WorkspaceLoader_LoadAsync_NamedControlNodes_KeepDeclaredName` | | Guarded/default succession | `WorkspaceLoader_LoadAsync_GuardedAndDefaultActionTargetSuccession_ExtractTargets` | | Fork/join/decision/merge OMG fixtures + incoming | `ControlNode_OmgCorpusFixture_ResolvesForkJoinDecisionMerge` | +| Enum def bare literals | `WorkspaceLoader_LoadAsync_EnumDefinition_BareLiterals_CapturesEnumValues` | +| Enum def value-assignment form | `WorkspaceLoader_LoadAsync_EnumDefinition_ValueAssignmentForm_CapturesNames` | +| Requirement def subject/constraint | `WorkspaceLoader_LoadAsync_RequirementDefinition_CapturesSubjectAndConstraints` | +| Requirement usage subject/constraint | `WorkspaceLoader_LoadAsync_RequirementUsage_CapturesSubjectAndConstraint` | +| Requirement def actor/stakeholder | `WorkspaceLoader_LoadAsync_RequirementDefinition_CapturesActorAndStakeholder` | +| Standalone constraint usage | `WorkspaceLoader_LoadAsync_ConstraintUsage_CapturesExpressionText` | +| Constraint def synthesized child | `WorkspaceLoader_LoadAsync_ConstraintDefinition_SynthesizesExpressionChild` | +| Verify member no-hoist regression | `WorkspaceLoader_LoadAsync_RequirementVerifyMember_DoesNotHoistNestedContent` | +| Enum def OMG corpus fixtures | `Enumeration_OmgCorpusFixtures_CaptureAllLiteralForms` | +| Requirement OMG corpus fixtures | `Requirement_OmgCorpusFixtures_CaptureSubjectAndConstraints` | +| Comment/documentation OMG corpus fixtures | `CommentAndDocumentation_OmgCorpusFixtures_CaptureAnnotations` | From 3351021942807937ba624d7deb4560b0d4a4e10a Mon Sep 17 00:00:00 2001 From: Malcolm Nixon Date: Sun, 12 Jul 2026 20:08:53 -0400 Subject: [PATCH 6/7] Add annotation, enum, and requirement compartments to gallery + mark roadmap item delivered - 01-drone-general.sysml: Battery gains a doc annotation, FlightMode is now an enum def with literal values, and FlightTimeRequirement gains a subject/require constraint body. - Regenerate DroneGeneralView/BatterySubsystemView SVG and PNG. - Update gallery README caption for the new content. - ROADMAP.md: mark 'Annotating elements & compartment depth' delivered. --- ROADMAP.md | 69 ++--- docs/gallery/README.md | 9 + docs/gallery/models/01-drone-general.sysml | 20 +- docs/gallery/png/BatterySubsystemView.png | Bin 9285 -> 18074 bytes docs/gallery/png/DroneGeneralView.png | Bin 115835 -> 148835 bytes docs/gallery/svg/BatterySubsystemView.svg | 33 ++- docs/gallery/svg/DroneGeneralView.svg | 300 +++++++++++---------- 7 files changed, 247 insertions(+), 184 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index 0212e1d..612bfdc 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -69,36 +69,45 @@ gallery currently shows. **Depends on:** "Additional relationship edges (General View)" above (needs the new edge kinds implemented first). -### Annotating elements & compartment depth - -Investigation confirmed the semantic model already captures `comment`/`doc` annotation text -verbatim (`SysmlAnnotation`/`SysmlAnnotationKind.Comment`/`.Documentation`, attached to the -annotated node's `Annotations` list via the existing `AnnotationCapture` mechanism) — but -`GeneralViewLayoutStrategy` never reads `Annotations` at all today, so no note is ever rendered. -Separately, enum literal values, constraint expression bodies, and requirement -`subject`/`constraints`/`doc` members are not captured in the AST at all yet (`VisitEnumerationDefinition` -delegates to the generic `BuildDefinitionFromDeclaration`, which never collects children, so an -`enum def`'s literal values are dropped at the semantic-model layer, not just unrendered) — this -is a semantic-exposure gap as much as a rendering gap. Per the OMG spec's Graphical Notation -chapter, the conventional compartment titles are stereotype-style: `«subject»` (requirement -subject), `«doc»` (documentation compartment), and a `«constraint»`/`«assume constraint»`/ -`«require constraint»`-labelled compartment holding the constraint's expression body (shown as a -"compartment stack" in the spec's own figures — an ellipsis-abbreviated body, not necessarily the -full expression rendered inline). - -- Render **Documentation/Comment** notes as `BoxShape.Note` (folded-corner) nodes attached to - their annotated element. -- Extend compartments to spec depth: enumeration values, constraint bodies, requirement - `subject`/`constraints`/`doc`, and a documentation compartment on definitions/usages. - -**Scope:** `AstBuilder` (capture enum literal values, constraint expression bodies, requirement -subject/constraints/doc as resolvable children/content — a semantic-exposure gap, not only -rendering); `GeneralViewLayoutStrategy` (read `Annotations` to emit `BoxShape.Note` nodes; -extend `BuildCompartments` for the new content kinds with spec-style stereotype titles); possibly -`LayoutLabel`/compartment tweaks. -**Visual gate:** a documented requirement/part renders its note and full compartments (an enum -def shows its literal values, a constraint shows its expression body, a requirement shows its -`«subject»`/`«doc»` compartments). +### Annotating elements & compartment depth — delivered + +**Delivered.** `AstBuilder` now captures every content kind this item scoped: `VisitEnumeratedValue` +builds an `"enum value"`-keyword feature for each `enum def` literal (bare, value-assignment, and +redefinition-body forms), via a dedicated `CollectEnumerationBodyChildren` helper (needed because +`enumerationBody` uniquely alternates `annotatingMember`/`enumerationUsageMember` directly rather +than wrapping them in a single rule). `VisitRequirementDefinition`/`VisitConcernDefinition` and — +extending beyond a literal reading of this item, since the dominant real-corpus idiom nests these +inside a requirement/concern *usage* rather than a definition — `VisitRequirementUsage`/ +`VisitConcernUsage` now capture `subject`/`actor`/`stakeholder` members (`VisitSubjectUsage`/ +`VisitActorUsage`/`VisitStakeholderUsage`) and `require constraint`/`assume constraint` members +(`VisitRequirementConstraintMember`/`BuildConstraintFeatureNode`, capturing the raw expression text +into a new `SysmlFeatureNode.ExpressionText` field mirroring `SysmlTransitionNode.Guard`). +`VisitConstraintUsage` (previously entirely absent) and a rewritten `VisitConstraintDefinition` +capture standalone/definition-level constraint expressions the same way. A newly-introduced +`VisitRequirementVerificationMember`/`VisitFramedConcernMember` null-suppression safeguard +prevents a `verify`/`frame` member's own nested body from being spuriously hoisted onto the +enclosing requirement's `Children` now that body-collection reaches into `requirementBodyItem`. + +`GeneralViewLayoutStrategy` now reads `Annotations`: `AddAnnotationNote` emits one `BoxShape.Note` +box per annotated definition (concatenating multiple `Documentation`/`Comment` annotations into a +single note, documented as a deliberate choice) connected by a plain solid line with no end +marker — implemented as ordinary `LayoutGraph` nodes/edges added during the existing single-pass +`BuildGraph` traversal, a documented deviation from a literal post-layout marker-decoration +approach (no equivalent decoration phase exists in this strategy). `Pluralize` titles +`"subject"`/`"assume constraint"`/`"require constraint"`/`"constraint"` compartments with the +guillemet stereotype form (reusing the pre-existing `«allocate»` edge-label convention), and +`FormatFeatureRow` renders a constraint-kind feature's raw expression text in place of the generic +`name : Type [multiplicity]` row shape. + +The Quadcopter Drone gallery model (`docs/gallery/models/01-drone-general.sysml`) was extended +with a `doc`-annotated `Battery`, an `enum def FlightMode` with literal values, and a +`FlightTimeRequirement` with a `subject`/`require constraint` body, and regenerated. + +**Explicitly deferred (not delivered here):** full expression-tree modeling of constraint bodies +(raw text capture only); a nested `doc` annotation inside a constraint's own `calculationBody` +(e.g. `assume constraint { doc /* ... */ ... }`, seen in the OMG training corpus) is intentionally +not captured — an accepted scope boundary, not an oversight; any other view kind besides General +View. ### Action Flow View: control-node/successor AST correctness + fork/join/decision/merge shapes — delivered diff --git a/docs/gallery/README.md b/docs/gallery/README.md index 6570ac1..c08c939 100644 --- a/docs/gallery/README.md +++ b/docs/gallery/README.md @@ -44,6 +44,15 @@ standalone `dependency FlightController to Battery;` statement demonstrates the same dashed open-chevron line without a label, used for general OMG dependency relationships. +`Battery`'s `doc /* ... */` annotation demonstrates the `BoxShape.Note` +(folded-corner) box rendered for a documented element, connected to its box by +a plain solid line. `FlightMode` is now an `enum def` with literal values +(`idle`/`manual`/`autonomous`), demonstrating the `enum values` compartment. +`FlightTimeRequirement` gains a `subject`/`require constraint` body, +demonstrating the stereotype-titled `«subject»`/`«require constraint»` +compartments (a constraint compartment shows its raw expression text rather +than a `name : Type` row). + Model: [`models/01-drone-general.sysml`](models/01-drone-general.sysml) · SVG: [`svg/DroneGeneralView.svg`](svg/DroneGeneralView.svg) diff --git a/docs/gallery/models/01-drone-general.sysml b/docs/gallery/models/01-drone-general.sysml index 00150a4..31d9530 100644 --- a/docs/gallery/models/01-drone-general.sysml +++ b/docs/gallery/models/01-drone-general.sysml @@ -11,10 +11,20 @@ package QuadcopterDrone { // ===== Attribute and enumeration definitions ===== attribute def Mass; attribute def Voltage; - enum def FlightMode; + + // An enum def with literal values, demonstrating the "enum values" + // compartment populated from AstBuilder's enum-literal capture. + enum def FlightMode { + enum idle; + enum manual; + enum autonomous; + } // ===== Core part definitions ===== part def Battery { + doc /* Rechargeable lithium-polymer battery pack supplying the drone's + * flight controller, motors, and sensor bus via the PowerPort + * interface. Demonstrates the BoxShape.Note annotation rendering. */ attribute capacity : Voltage; port output : PowerPort; } @@ -77,7 +87,13 @@ package QuadcopterDrone { } // ===== A requirement ===== - requirement def FlightTimeRequirement; + // A subject and a require constraint, demonstrating the «subject» and + // «require constraint» stereotype-titled compartments. + requirement def FlightTimeRequirement { + subject drone : Drone; + attribute minFlightTimeMinutes : Mass; + require constraint { drone.totalMass <= 2500 } + } // An allocate relationship from the requirement to the part it is // allocated to, demonstrating the dashed open-chevron line with the diff --git a/docs/gallery/png/BatterySubsystemView.png b/docs/gallery/png/BatterySubsystemView.png index 43f7678786a5de79b7fbfa89f730bdeb12c57528..7a6a38c77072cea447f4c126376c0929b15b4493 100644 GIT binary patch literal 18074 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 aGAp0%i4M~$S;6OmkXs6B@`Z9{kN*eUMeT+F diff --git a/docs/gallery/png/DroneGeneralView.png b/docs/gallery/png/DroneGeneralView.png index d03431bca92acf32c1d36a2b7abce1359773e252..05e5409218f54d1986cdc1cf14e2721744b828cc 100644 GIT binary patch literal 148835 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

+32st=H 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

Q_n`N&RGChZPjYa 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 U8uw}a*XZ)NWB8xxM=t#KU)P#yO8@`> literal 115835 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�FUUS7_4)S&w1xyHcl;|qs? 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 diff --git a/docs/gallery/svg/BatterySubsystemView.svg b/docs/gallery/svg/BatterySubsystemView.svg index 249347d..ea5846e 100644 --- a/docs/gallery/svg/BatterySubsystemView.svg +++ b/docs/gallery/svg/BatterySubsystemView.svg @@ -1,4 +1,4 @@ - + @@ -30,16 +30,23 @@ - - «package» - QuadcopterDrone - - «part def» - Battery - - attributes - capacity : Voltage - - ports - output : PowerPort + + «package» + QuadcopterDrone + + «part def» + Battery + + attributes + capacity : Voltage + + ports + output : PowerPort + + + + Rechargeable lithium-polymer battery pack supplying the drone's + * flight controller, motors, and sensor bus via the PowerPort + * interface. Demonstrates the BoxShape.Note annotation rendering. + diff --git a/docs/gallery/svg/DroneGeneralView.svg b/docs/gallery/svg/DroneGeneralView.svg index 93b1d0c..4a2c150 100644 --- a/docs/gallery/svg/DroneGeneralView.svg +++ b/docs/gallery/svg/DroneGeneralView.svg @@ -1,4 +1,4 @@ - + @@ -30,145 +30,167 @@ - - «package» - QuadcopterDrone + + «package» + QuadcopterDrone «interface def» PowerBus - - «interface def» - DataBus - - «port def» - PowerPort - - «port def» - TelemetryPort - - «port def» - MotorControlPort - - «port def» - SensorPort - - «attribute def» - Mass - - «attribute def» - Voltage - - «enum def» - FlightMode - - «part def» - Battery - - attributes - capacity : Voltage - - ports - output : PowerPort - - «part def» - FlightController - - attributes - mode : FlightMode - - ports - power : PowerPort - telemetry : TelemetryPort - motors : MotorControlPort - sensors : SensorPort - - «part def» - Motor - - attributes - maxThrust : Mass - - ports - control : MotorControlPort - - «part def» - Propeller - - «part def» - ImuSensor - - ports - data : SensorPort - - «part def» - GpsSensor - - ports - data : SensorPort - - «part def» - Frame - - «part def» - RacingMotor - - attributes - : Mass - - «part def» - EnduranceBattery - - «part def» - Drone - - attributes - totalMass : Mass - - parts - airframe : Frame - battery : Battery - controller : FlightController - motors : Motor [4] - propellers : Propeller [4] - imu : ImuSensor - gps : GpsSensor - - «part def» - RacingDrone - - parts - frontMotors : Motor [2] - - «requirement def» - FlightTimeRequirement - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - «allocate» + + «interface def» + DataBus + + «port def» + PowerPort + + «port def» + TelemetryPort + + «port def» + MotorControlPort + + «port def» + SensorPort + + «attribute def» + Mass + + «attribute def» + Voltage + + «enum def» + FlightMode + + enum values + idle + manual + autonomous + + «part def» + Battery + + attributes + capacity : Voltage + + ports + output : PowerPort + + + + Rechargeable lithium-polymer battery pack supplying the drone's + * flight controller, motors, and sensor bus via the PowerPort + * interface. Demonstrates the BoxShape.Note annotation rendering. + + «part def» + FlightController + + attributes + mode : FlightMode + + ports + power : PowerPort + telemetry : TelemetryPort + motors : MotorControlPort + sensors : SensorPort + + «part def» + Motor + + attributes + maxThrust : Mass + + ports + control : MotorControlPort + + «part def» + Propeller + + «part def» + ImuSensor + + ports + data : SensorPort + + «part def» + GpsSensor + + ports + data : SensorPort + + «part def» + Frame + + «part def» + RacingMotor + + attributes + maxThrust : Mass + + «part def» + EnduranceBattery + + «part def» + Drone + + attributes + totalMass : Mass + + parts + airframe : Frame + battery : Battery + controller : FlightController + motors : Motor [4] + propellers : Propeller [4] + imu : ImuSensor + gps : GpsSensor + + «part def» + RacingDrone + + parts + frontMotors : Motor [2] + + «requirement def» + FlightTimeRequirement + + «subject» + drone : Drone + + attributes + minFlightTimeMinutes : Mass + + «require constraint» + {drone.totalMass<=2500} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + «allocate» From 2812bc155aa48dea61eb0f6e820cb068a816a09a Mon Sep 17 00:00:00 2001 From: Malcolm Nixon Date: Sun, 12 Jul 2026 20:38:30 -0400 Subject: [PATCH 7/7] test(semantic): add concern def/usage subject coverage; close traceability gap in ast-builder requirement The RequirementSubjectAndConstraints requirement in ast-builder.yaml claims coverage of both requirement and concern definition/usage paths (VisitConcernDefinition/VisitConcernUsage), but WorkspaceLoaderTests.cs only exercised requirement cases. - Add WorkspaceLoader_LoadAsync_ConcernDefinitionAndUsage_CapturesSubject to WorkspaceLoaderTests.cs, verifying that a concern def and a concern usage each capture their subject member as a Children entry. - Reference the new test in the RequirementSubjectAndConstraints requirement's tests list in docs/reqstream/sysml2-tools-language/semantic/model/ast-builder.yaml. - Add the corresponding row to docs/verification/sysml2-tools-language/semantic/model/ast-builder.md. --- .../semantic/model/ast-builder.yaml | 1 + .../semantic/model/ast-builder.md | 1 + .../Semantic/WorkspaceLoaderTests.cs | 55 +++++++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/docs/reqstream/sysml2-tools-language/semantic/model/ast-builder.yaml b/docs/reqstream/sysml2-tools-language/semantic/model/ast-builder.yaml index 4dfffcf..2dc58f5 100644 --- a/docs/reqstream/sysml2-tools-language/semantic/model/ast-builder.yaml +++ b/docs/reqstream/sysml2-tools-language/semantic/model/ast-builder.yaml @@ -388,6 +388,7 @@ sections: - WorkspaceLoader_LoadAsync_RequirementDefinition_CapturesSubjectAndConstraints - WorkspaceLoader_LoadAsync_RequirementUsage_CapturesSubjectAndConstraint - WorkspaceLoader_LoadAsync_RequirementDefinition_CapturesActorAndStakeholder + - WorkspaceLoader_LoadAsync_ConcernDefinitionAndUsage_CapturesSubject - Requirement_OmgCorpusFixtures_CaptureSubjectAndConstraints - id: SysML2Tools-Language-Semantic-Model-AstBuilder-StandaloneConstraintUsageAndDefinition diff --git a/docs/verification/sysml2-tools-language/semantic/model/ast-builder.md b/docs/verification/sysml2-tools-language/semantic/model/ast-builder.md index 8c082e8..7d2b364 100644 --- a/docs/verification/sysml2-tools-language/semantic/model/ast-builder.md +++ b/docs/verification/sysml2-tools-language/semantic/model/ast-builder.md @@ -145,6 +145,7 @@ external services or additional configuration are required beyond a standard .NE | Requirement def subject/constraint | `WorkspaceLoader_LoadAsync_RequirementDefinition_CapturesSubjectAndConstraints` | | Requirement usage subject/constraint | `WorkspaceLoader_LoadAsync_RequirementUsage_CapturesSubjectAndConstraint` | | Requirement def actor/stakeholder | `WorkspaceLoader_LoadAsync_RequirementDefinition_CapturesActorAndStakeholder` | +| Concern def/usage subject | `WorkspaceLoader_LoadAsync_ConcernDefinitionAndUsage_CapturesSubject` | | Standalone constraint usage | `WorkspaceLoader_LoadAsync_ConstraintUsage_CapturesExpressionText` | | Constraint def synthesized child | `WorkspaceLoader_LoadAsync_ConstraintDefinition_SynthesizesExpressionChild` | | Verify member no-hoist regression | `WorkspaceLoader_LoadAsync_RequirementVerifyMember_DoesNotHoistNestedContent` | diff --git a/test/DemaConsulting.SysML2Tools.Tests/Semantic/WorkspaceLoaderTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Semantic/WorkspaceLoaderTests.cs index 4d04970..edb44c7 100644 --- a/test/DemaConsulting.SysML2Tools.Tests/Semantic/WorkspaceLoaderTests.cs +++ b/test/DemaConsulting.SysML2Tools.Tests/Semantic/WorkspaceLoaderTests.cs @@ -4440,6 +4440,61 @@ assume constraint { } } + /// + /// A concern def and a concern usage that specializes it (mirroring the + /// requirement def/usage pattern verified above, since concernBody reuses the same + /// requirementBody grammar shape) also capture their subject member as a + /// Children entry — exercising + /// and . + /// + [Fact] + public async Task WorkspaceLoader_LoadAsync_ConcernDefinitionAndUsage_CapturesSubject() + { + var tempFile = Path.GetTempFileName() + ".sysml"; + try + { + await File.WriteAllTextAsync(tempFile, + """ + package Cn { + part def Vehicle; + + concern def SafetyConcern { + subject vehicle : Vehicle; + } + + concern vehicleSafety : SafetyConcern { + subject vehicle : Vehicle; + } + } + """, TestContext.Current.CancellationToken); + + var (stdlibTable, _) = StdlibProvider.GetSymbolTable(); + var result = await WorkspaceLoader.LoadAsync([tempFile], stdlibTable); + + Assert.NotNull(result.Workspace); + + var concernDef = Assert.IsType( + result.Workspace!.Declarations["Cn::SafetyConcern"]); + Assert.Equal("concern def", concernDef.DefinitionKeyword); + var defSubject = Assert.Single(concernDef.Children + .OfType(), + f => f.FeatureKeyword == "subject"); + Assert.Equal("vehicle", defSubject.Name); + + var concernUsage = Assert.IsType( + result.Workspace!.Declarations["Cn::vehicleSafety"]); + Assert.Equal("concern", concernUsage.FeatureKeyword); + var usageSubject = Assert.Single(concernUsage.Children + .OfType(), + f => f.FeatureKeyword == "subject"); + Assert.Equal("vehicle", usageSubject.Name); + } + finally + { + File.Delete(tempFile); + } + } + /// /// A top-level constraint { expr } usage (not nested in a requirement) is captured /// with its raw expression text — previously entirely absent from the AST.