Fix multiplicity for redefine elements

multiplicity should match the parent property.
This commit is contained in:
Arjan Molenaar 2019-11-04 14:32:49 +01:00
parent 991daf5481
commit a49a4ce6ae
5 changed files with 54 additions and 30 deletions

View File

@ -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

View File

@ -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">

View File

@ -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

View File

@ -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)
"""

View File

@ -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]",