ST6RI-890 Multiple default multiplicities are added if there is a nested alias #708
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Previously, when a usage requiring a default multiplicity has a nested alias declaration, then many multiplicity elements were physically added, rather than just one, resulting in a validation error. Indeed, there was actually an infinite recursion during the name resolution in the alias declaration, which was only terminated by the throwing of a
org.eclipse.xtext.linking.lazy.LazyLinkingResource$CyclicLinkingException.The recursion happened in the
TypeUtil::addMultiplicityTomethod, which checked for an existing nested multiplicity element using the conditionAn alias declaration is parsed as an
ownedMembership, so it was included in the stream that is checked in this condition. However, it is not anOwningMembership, which means itsmemberElementvalue is a reference, which is a proxy requiring name resolution. But this name resolution began in the namespace of the containing usage, which triggerd adding memberships again, causing the recursive call to addMultiplicityTo.This PR fixes the infinite recursion by changing the condition in
addMultiplicityTotoThe
getOwnedMembersOfmethod filters theownedMembershipsof a namespace to only includeOwningMembershipsand then gets theownedMemberElementsof those. This skips aliasMemberships, resolving the problem.