Fix multiplicity for redefine elements
multiplicity should match the parent property.
This commit is contained in:
parent
991daf5481
commit
a49a4ce6ae
@ -847,9 +847,17 @@ class redefine(umlproperty[T]):
|
||||
"""
|
||||
|
||||
def __init__(
|
||||
self, decl_class: Type[E], name: str, type: Type[T], original: association
|
||||
self,
|
||||
decl_class: Type[E],
|
||||
name: str,
|
||||
type: Type[T],
|
||||
upper: Upper,
|
||||
original: association,
|
||||
):
|
||||
super().__init__()
|
||||
assert (
|
||||
upper == original.upper
|
||||
), f"Multiplicity of {decl_class}.{name} and {original} differ: {upper} != {original.upper}"
|
||||
self.decl_class = decl_class
|
||||
self.name = name
|
||||
self._name = "_" + name
|
||||
|
@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<gaphor xmlns="http://gaphor.sourceforge.net/model" version="3.0" gaphor-version="1.1.0">
|
||||
<gaphor xmlns="http://gaphor.sourceforge.net/model" version="3.0" gaphor-version="1.1.1">
|
||||
<Association id="DCE:12A2B620-4B3C-11D7-B391-02BBFE4396CE">
|
||||
<memberEnd>
|
||||
<reflist>
|
||||
@ -37776,7 +37776,7 @@ some elements to have a stereotype</val>
|
||||
<ref refid="DCE:F10D682A-4A87-11D7-B08B-133D836EF880"/>
|
||||
</type>
|
||||
<upperValue>
|
||||
<val>1</val>
|
||||
<val>*</val>
|
||||
</upperValue>
|
||||
</Property>
|
||||
<Property id="DCE:4CB066FA-46F9-11DA-91FC-00123FE76EBE">
|
||||
@ -37808,9 +37808,6 @@ some elements to have a stereotype</val>
|
||||
<class_>
|
||||
<ref refid="DCE:BE153618-458A-11DA-A04F-00123FE76EBE"/>
|
||||
</class_>
|
||||
<lowerValue>
|
||||
<val>0</val>
|
||||
</lowerValue>
|
||||
<name>
|
||||
<val>redefinedState</val>
|
||||
</name>
|
||||
@ -37821,7 +37818,7 @@ some elements to have a stereotype</val>
|
||||
<ref refid="DCE:BE153618-458A-11DA-A04F-00123FE76EBE"/>
|
||||
</type>
|
||||
<upperValue>
|
||||
<val>1</val>
|
||||
<val>*</val>
|
||||
</upperValue>
|
||||
</Property>
|
||||
<Association id="DCE:94F89B82-46FA-11DA-91FC-00123FE76EBE">
|
||||
@ -37964,9 +37961,6 @@ some elements to have a stereotype</val>
|
||||
<class_>
|
||||
<ref refid="DCE:E0936CBE-4587-11DA-A04F-00123FE76EBE"/>
|
||||
</class_>
|
||||
<lowerValue>
|
||||
<val>0</val>
|
||||
</lowerValue>
|
||||
<name>
|
||||
<val>redefinedTransition</val>
|
||||
</name>
|
||||
@ -37977,7 +37971,7 @@ some elements to have a stereotype</val>
|
||||
<ref refid="DCE:E0936CBE-4587-11DA-A04F-00123FE76EBE"/>
|
||||
</type>
|
||||
<upperValue>
|
||||
<val>1</val>
|
||||
<val>*</val>
|
||||
</upperValue>
|
||||
</Property>
|
||||
<Property id="DCE:C98B8490-46FA-11DA-91FC-00123FE76EBE">
|
||||
|
@ -419,9 +419,7 @@ class Activity(Behavior):
|
||||
|
||||
class Implementation(Realization):
|
||||
contract: relation_many[Interface] # type: ignore[assignment]
|
||||
implementatingClassifier: relation_many[
|
||||
BehavioredClassifier
|
||||
] # type: ignore[assignment]
|
||||
implementatingClassifier: relation_many[BehavioredClassifier] # type: ignore[assignment]
|
||||
|
||||
|
||||
class Parameter(TypedElement, MultiplicityElement):
|
||||
@ -647,7 +645,7 @@ class State(Vertex, Namespace, RedefinableElement):
|
||||
doActivity: relation_one[Behavior]
|
||||
statevariant: relation_one[Constraint]
|
||||
submachine: relation_one[StateMachine]
|
||||
redefinedState: relation_one[State] # type: ignore[assignment]
|
||||
redefinedState: relation_many[State] # type: ignore[assignment]
|
||||
|
||||
|
||||
class FinalState(State):
|
||||
@ -1658,51 +1656,69 @@ StructuredClassifier.part = property(
|
||||
# 85: override Class.superClass: derived[Classifier]
|
||||
Class.superClass = Classifier.general
|
||||
|
||||
ExtensionEnd.type = redefine(ExtensionEnd, "type", Stereotype, Property.type)
|
||||
ExtensionEnd.type = redefine(ExtensionEnd, "type", Stereotype, 1, Property.type)
|
||||
ActivityNode.redefinedElement = redefine(
|
||||
ActivityNode, "redefinedElement", ActivityNode, RedefinableElement.redefinedElement
|
||||
ActivityNode,
|
||||
"redefinedElement",
|
||||
ActivityNode,
|
||||
"*",
|
||||
RedefinableElement.redefinedElement,
|
||||
)
|
||||
Implementation.contract = redefine(
|
||||
Implementation, "contract", Interface, Dependency.supplier
|
||||
Implementation, "contract", Interface, "*", Dependency.supplier
|
||||
)
|
||||
BehavioredClassifier.implementation = redefine(
|
||||
BehavioredClassifier,
|
||||
"implementation",
|
||||
Implementation,
|
||||
"*",
|
||||
NamedElement.clientDependency,
|
||||
)
|
||||
Implementation.implementatingClassifier = redefine(
|
||||
Implementation, "implementatingClassifier", BehavioredClassifier, Dependency.client
|
||||
Implementation,
|
||||
"implementatingClassifier",
|
||||
BehavioredClassifier,
|
||||
"*",
|
||||
Dependency.client,
|
||||
)
|
||||
Parameter.operation = redefine(
|
||||
Parameter, "operation", Operation, Parameter.ownerFormalParam
|
||||
Parameter, "operation", Operation, 1, Parameter.ownerFormalParam
|
||||
)
|
||||
Operation.formalParameter = redefine(
|
||||
Operation, "formalParameter", Parameter, BehavioralFeature.formalParameter
|
||||
Operation, "formalParameter", Parameter, "*", BehavioralFeature.formalParameter
|
||||
)
|
||||
ActivityEdge.redefinedElement = redefine(
|
||||
ActivityEdge, "redefinedElement", ActivityEdge, RedefinableElement.redefinedElement
|
||||
ActivityEdge,
|
||||
"redefinedElement",
|
||||
ActivityEdge,
|
||||
"*",
|
||||
RedefinableElement.redefinedElement,
|
||||
)
|
||||
Package.ownedMember = redefine(
|
||||
Package, "ownedMember", PackageableElement, Namespace.ownedMember
|
||||
Package, "ownedMember", PackageableElement, "*", Namespace.ownedMember
|
||||
)
|
||||
Component.ownedMember = redefine(
|
||||
Component, "ownedMember", PackageableElement, Namespace.ownedMember
|
||||
Component, "ownedMember", PackageableElement, "*", Namespace.ownedMember
|
||||
)
|
||||
Transition.redefinitionContext = redefine(
|
||||
Transition,
|
||||
"redefinitionContext",
|
||||
Classifier,
|
||||
"*",
|
||||
RedefinableElement.redefinitionContext,
|
||||
)
|
||||
Region.extendedRegion = redefine(
|
||||
Region, "extendedRegion", Region, RedefinableElement.redefinedElement
|
||||
Region, "extendedRegion", Region, "*", RedefinableElement.redefinedElement
|
||||
)
|
||||
State.redefinedState = redefine(
|
||||
State, "redefinedState", State, RedefinableElement.redefinedElement
|
||||
State, "redefinedState", State, "*", RedefinableElement.redefinedElement
|
||||
)
|
||||
Transition.redefinedTransition = redefine(
|
||||
Transition, "redefinedTransition", Transition, RedefinableElement.redefinedElement
|
||||
Transition,
|
||||
"redefinedTransition",
|
||||
Transition,
|
||||
"*",
|
||||
RedefinableElement.redefinedElement,
|
||||
)
|
||||
# 106: override Lifeline.parse: Callable[[Lifeline, str], None]
|
||||
Lifeline.parse = umllex.parse_lifeline
|
||||
|
@ -78,7 +78,7 @@ D.name3 = association('name3', SubClass, opposite='name4')
|
||||
# 'SubClass.value' is a simple attribute
|
||||
SubClass.value = attribute('value', str)
|
||||
SubClass.abstract = derivedunion('abstract', C, 0, '*', SubClass.concrete)
|
||||
SubClass.name4 = redefine(SubClass, 'name4', D, SubClass.name2)
|
||||
SubClass.name4 = redefine(SubClass, 'name4', D, '*', SubClass.name2)
|
||||
"""
|
||||
|
||||
|
||||
|
@ -270,8 +270,14 @@ class Writer:
|
||||
self.add_property(
|
||||
r.class_name,
|
||||
r.name,
|
||||
"redefine(%s, '%s', %s, %s)"
|
||||
% (r.class_name, r.name, r.opposite_class_name, r.redefines),
|
||||
"redefine(%s, '%s', %s, %s, %s)"
|
||||
% (
|
||||
r.class_name,
|
||||
r.name,
|
||||
r.opposite_class_name,
|
||||
r.upper == "*" and "'*'" or r.upper,
|
||||
r.redefines,
|
||||
),
|
||||
type=f"relation_one[{r.opposite_class_name}] # type: ignore[assignment]"
|
||||
if r.upper == "1"
|
||||
else f"relation_many[{r.opposite_class_name}] # type: ignore[assignment]",
|
||||
|
Loading…
x
Reference in New Issue
Block a user