Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 22 additions & 1 deletion SysML2.NET.CodeGenerator/Extensions/GrammarErrata.cs
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,28 @@ public static class GrammarErrata
"alternative spelling: rendering the ReturnParameterMembership through the generic " +
"parameter path emits 'out verdict', which re-parses as a plain FeatureMembership with " +
"direction out and so loses the metaclass. CalculationBodyItem is already declared in the " +
"same file, so the replacement resolves without any further correction.")
"same file, so the replacement resolves without any further correction."),
new("DefinitionElement",
" | InterfaceDefinition\n | PortDefinition",
" | InterfaceDefinition\n | AllocationDefinition\n | PortDefinition",
"SysML 8.2.2.5.2 declares 'AllocationDefinition = OccurrenceDefinitionPrefix 'allocation' " +
"'def' Definition' but no production references it: DefinitionElement lists " +
"ConnectionDefinition, FlowDefinition, InterfaceDefinition and PortDefinition, and omits " +
"AllocationDefinition, so there is no path to it from RootNamespace. OMG has CONFIRMED this " +
"as a specification error — Systems-Modeling/SysML-v2-Release issue 124 item 1, answered " +
"2026-07-29: 'I can confirm that all your items are specification errors, except for item " +
"5'; the correction is routed to a Revision Task Force, so it is not expected in the KEBNF " +
"for some time. The issue's own suggested fix is the one applied here. The pilot " +
"implementation already wires it exactly this way (org.omg.sysml.xtext SysML.xtext, rule " +
"DefinitionElement, AllocationDefinition listed directly after InterfaceDefinition), which " +
"is why the alternative is inserted at that position. There is no admissible alternative " +
"spelling: AllocationDefinition specializes ConnectionDefinition, so without the " +
"alternative the generator emits no dispatch arm and an AllocationDefinition renders " +
"through the ConnectionDefinition arm as 'connection def'. That re-parses to a DIFFERENT " +
"metaclass — AllocationUsage::allocationDefinition (which redefines " +
"ConnectionUsage::connectionDefinition) derives to empty, and the library grounding shifts " +
"from Allocations::Allocation to Connections::Connection. No OCL constraint flags the " +
"downgrade, so nothing but the validation corpus catches it.")
];

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package '12a-Dependency' {
package 'Application Layer';
package 'Service Layer';
package 'Data Layer';
dependency Use from 'Application Layer' to 'Service Layer';
dependency 'Service Layer' to 'Data Layer';
attribute x;
attribute y;
attribute z;
dependency z to x, y;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package '12b-Allocation-1' {
private import SI::*;
private import RequirementModel::*;
private import LogicalModel::*;
private import PhysicalModel::*;
package RequirementModel {
requirement torqueGeneration {
subject generator: TorqueGenerator;
require constraint { generator.generateTorque.torque > 0.0[(N * m)] }
}
}
package LogicalModel {
action def GenerateTorque {
out torque :> ISQ::torque;
}
part def LogicalElement;
part def TorqueGenerator :> LogicalElement {
perform action generateTorque: GenerateTorque;
}
action providePower {
action generateTorque: GenerateTorque;
}
part torqueGenerator: TorqueGenerator {
perform providePower.generateTorque :>> generateTorque;
}
assert satisfy torqueGeneration by torqueGenerator;
}
package PhysicalModel {
part def PhysicalElement;
part def PowerTrain :> PhysicalElement;
part powerTrain: PowerTrain {
part engine {
perform providePower.generateTorque;
}
}
}
allocation def LogicalToPhysical {
end ref logical: LogicalElement;
end ref physical: PhysicalElement;
}
allocation torqueGenAlloc: LogicalToPhysical allocate logical ::> torqueGenerator to physical ::> powerTrain {
allocate torqueGenerator.generateTorque to powerTrain.engine.generateTorque;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package '12b-Allocation' {
private import LogicalModel::*;
private import PhysicalModel::*;
package LogicalModel {
action providePower {
action generateTorque;
}
part torqueGenerator {
perform providePower.generateTorque;
}
}
package PhysicalModel {
part powerTrain {
part engine {
perform providePower.generateTorque;
}
}
}
allocate torqueGenerator to powerTrain {
allocate torqueGenerator.generateTorque to powerTrain.engine.generateTorque;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,9 @@ public void OneTimeTearDown()
[TestCase("10-Analysis and Trades", "10b-Trade-off Among Alternative Configurations.sysmlx")]
[TestCase("10-Analysis and Trades", "10c-Fuel Economy Analysis.sysmlx")]
[TestCase("10-Analysis and Trades", "10d-Dynamics Analysis.sysmlx")]
[TestCase("12-Dependency Relationships", "12a-Dependency.sysmlx")]
[TestCase("12-Dependency Relationships", "12b-Allocation-1.sysmlx")]
[TestCase("12-Dependency Relationships", "12b-Allocation.sysmlx")]
public async Task VerifyValidationTextualNotationXmi(string folderName, string fileName)
{
var loggerFactory = LoggerFactory.Create(builder =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ public static void BuildIdentification(SysML2.NET.Core.POCO.Root.Elements.IEleme

/// <summary>
/// Builds the Textual Notation string for the rule DefinitionElement
/// <para>DefinitionElement:Element=Package|LibraryPackage|AnnotatingElement|Dependency|AttributeDefinition|EnumerationDefinition|OccurrenceDefinition|IndividualDefinition|ItemDefinition|PartDefinition|ConnectionDefinition|FlowDefinition|InterfaceDefinition|PortDefinition|ActionDefinition|CalculationDefinition|StateDefinition|ConstraintDefinition|RequirementDefinition|ConcernDefinition|CaseDefinition|AnalysisCaseDefinition|VerificationCaseDefinition|UseCaseDefinition|ViewDefinition|ViewpointDefinition|RenderingDefinition|MetadataDefinition|ExtendedDefinition</para>
/// <para>DefinitionElement:Element=Package|LibraryPackage|AnnotatingElement|Dependency|AttributeDefinition|EnumerationDefinition|OccurrenceDefinition|IndividualDefinition|ItemDefinition|PartDefinition|ConnectionDefinition|FlowDefinition|InterfaceDefinition|AllocationDefinition|PortDefinition|ActionDefinition|CalculationDefinition|StateDefinition|ConstraintDefinition|RequirementDefinition|ConcernDefinition|CaseDefinition|AnalysisCaseDefinition|VerificationCaseDefinition|UseCaseDefinition|ViewDefinition|ViewpointDefinition|RenderingDefinition|MetadataDefinition|ExtendedDefinition</para>
/// </summary>
/// <param name="poco">The <see cref="SysML2.NET.Core.POCO.Root.Elements.IElement" /> from which the rule should be build</param>
/// <param name="writerContext">The <see cref="TextualNotationWriterContext" /> providing the serialization context for the current <paramref name="poco"/></param>
Expand All @@ -74,6 +74,9 @@ public static void BuildDefinitionElement(SysML2.NET.Core.POCO.Root.Elements.IEl
case SysML2.NET.Core.POCO.Systems.Interfaces.IInterfaceDefinition pocoInterfaceDefinition:
InterfaceDefinitionTextualNotationBuilder.BuildInterfaceDefinition(pocoInterfaceDefinition, writerContext, stringBuilder);
break;
case SysML2.NET.Core.POCO.Systems.Allocations.IAllocationDefinition pocoAllocationDefinition:
AllocationDefinitionTextualNotationBuilder.BuildAllocationDefinition(pocoAllocationDefinition, writerContext, stringBuilder);
break;
case SysML2.NET.Core.POCO.Systems.Connections.IConnectionDefinition pocoConnectionDefinition:
ConnectionDefinitionTextualNotationBuilder.BuildConnectionDefinition(pocoConnectionDefinition, writerContext, stringBuilder);
break;
Expand Down Expand Up @@ -101,14 +104,14 @@ public static void BuildDefinitionElement(SysML2.NET.Core.POCO.Root.Elements.IEl
case SysML2.NET.Core.POCO.Systems.Cases.ICaseDefinition pocoCaseDefinition:
CaseDefinitionTextualNotationBuilder.BuildCaseDefinition(pocoCaseDefinition, writerContext, stringBuilder);
break;
case SysML2.NET.Core.POCO.Systems.Views.IRenderingDefinition pocoRenderingDefinition:
RenderingDefinitionTextualNotationBuilder.BuildRenderingDefinition(pocoRenderingDefinition, writerContext, stringBuilder);
case SysML2.NET.Core.POCO.Systems.Metadata.IMetadataDefinition pocoMetadataDefinition:
MetadataDefinitionTextualNotationBuilder.BuildMetadataDefinition(pocoMetadataDefinition, writerContext, stringBuilder);
break;
case SysML2.NET.Core.POCO.Systems.Views.IViewDefinition pocoViewDefinition:
ViewDefinitionTextualNotationBuilder.BuildViewDefinition(pocoViewDefinition, writerContext, stringBuilder);
break;
case SysML2.NET.Core.POCO.Systems.Metadata.IMetadataDefinition pocoMetadataDefinition:
MetadataDefinitionTextualNotationBuilder.BuildMetadataDefinition(pocoMetadataDefinition, writerContext, stringBuilder);
case SysML2.NET.Core.POCO.Systems.Views.IRenderingDefinition pocoRenderingDefinition:
RenderingDefinitionTextualNotationBuilder.BuildRenderingDefinition(pocoRenderingDefinition, writerContext, stringBuilder);
break;
case SysML2.NET.Core.POCO.Systems.Calculations.ICalculationDefinition pocoCalculationDefinition:
CalculationDefinitionTextualNotationBuilder.BuildCalculationDefinition(pocoCalculationDefinition, writerContext, stringBuilder);
Expand Down
Loading