@@ -98,6 +98,9 @@ import org.omg.sysml.util.ImplicitGeneralizationMap
9898
9999import org.omg.sysml.expressions.util.EvaluationUtil
100100import java.util.Collections
101+ import java.util.HashMap
102+ import java.util.Set
103+ import java.util.Map
101104
102105/**
103106 * This class contains custom validation rules.
@@ -379,31 +382,59 @@ class KerMLValidator extends AbstractKerMLValidator {
379382 val ownedMemberships = namesp. ownedMembership
380383 val owningMemberships = ownedMemberships. filter[m | m instanceof OwningMembership ]
381384 val aliasMemberships = ownedMemberships. filter[m | ! (m instanceof OwningMembership )]
385+
386+ val owningMembershipMap = owningMemberships. nameMap
382387 for (mem: owningMemberships) {
383- checkDistinguishibility(mem, owningMemberships , INVALID_NAMESPACE_DISTINGUISHABILITY_MSG )
388+ checkDistinguishibility(mem, owningMembershipMap , INVALID_NAMESPACE_DISTINGUISHABILITY_MSG )
384389 }
390+
391+ val aliasMembershipMap = aliasMemberships. nameMap
385392 for (mem: aliasMemberships) {
386- checkDistinguishibility(mem, owningMemberships , INVALID_NAMESPACE_DISTINGUISHABILITY_MSG_0 )
387- checkDistinguishibility(mem, aliasMemberships , INVALID_NAMESPACE_DISTINGUISHABILITY_MSG_1 )
393+ checkDistinguishibility(mem, owningMembershipMap , INVALID_NAMESPACE_DISTINGUISHABILITY_MSG_0 )
394+ checkDistinguishibility(mem, aliasMembershipMap , INVALID_NAMESPACE_DISTINGUISHABILITY_MSG_1 )
388395 }
389396 if (namesp instanceof Type ) {
390- ElementUtil . clearCachesOf(namesp)
391- val inheritedMemberships = namesp. inheritedMembership
397+ val inheritedMembershipMap = namesp. inheritedMembership. nameMap
392398 for (mem: ownedMemberships) {
393- checkDistinguishibility(mem, inheritedMemberships , INVALID_NAMESPACE_DISTINGUISHABILITY_MSG_2 )
399+ checkDistinguishibility(mem, inheritedMembershipMap , INVALID_NAMESPACE_DISTINGUISHABILITY_MSG_2 )
394400 }
395401 }
396402 }
397403 }
398404
399- def checkDistinguishibility (Membership mem , Iterable<Membership > others , String msg ) {
405+ def nameMap (Iterable<Membership > memberships ) {
406+ var nameMap = new HashMap<String , Set<Membership > > ()
407+ for (mem: memberships) {
408+ val shortName = mem. memberShortName
409+ val name = mem. memberName
410+ if (shortName !== null ) {
411+ var mems = nameMap. get(shortName)
412+ if (mems == = null ) {
413+ mems = newHashSet
414+ nameMap. put(shortName, mems)
415+ }
416+ mems. add(mem)
417+ }
418+ if (name !== null ) {
419+ var mems = nameMap. get(name)
420+ if (mems == = null ) {
421+ mems = newHashSet
422+ nameMap. put(name, mems)
423+ }
424+ mems. add(mem)
425+ }
426+ }
427+ return nameMap;
428+ }
429+
430+ def checkDistinguishibility (Membership mem , Map<String , Set<Membership > > nameMap , String msg ) {
400431 val memShortName = mem. memberShortName
401432 val memName = mem. memberName
402-
403- val distinctOthers = others . filter[other | mem . memberElement !== other . memberElement]
433+ val memElement = mem . memberElement
434+
404435 if (memShortName !== null ) {
405- val dups = distinctOthers . filter[other | memShortName == other . memberShortName || memShortName == other . memberName ]
406- if (! dups. empty) {
436+ var dups = nameMap . get(memShortName) ? . filter[m | m . memberElement != memElement ]
437+ if (dups !== null && ! dups. empty) {
407438 val msgDups = msg. identifyDuplicates(mem. membershipOwningNamespace, memShortName, dups)
408439 if (mem instanceof OwningMembership ) {
409440 warning(msgDups, mem. ownedMemberElement, SysMLPackage . eINSTANCE. element_DeclaredShortName, INVALID_NAMESPACE_DISTINGUISHABILITY )
@@ -413,8 +444,8 @@ class KerMLValidator extends AbstractKerMLValidator {
413444 }
414445 }
415446 if (memName !== null ) {
416- val dups = distinctOthers . filter[other | memName == other . memberShortName || memName == other . memberName ]
417- if (! dups. empty) {
447+ val dups = nameMap . get(memName) ? . filter[m | m . memberElement != memElement ]
448+ if (dups !== null && ! dups. empty) {
418449 val msgDups = msg. identifyDuplicates(mem. membershipOwningNamespace, memName, dups)
419450 if (mem instanceof OwningMembership ) {
420451 warning(msgDups, mem. ownedMemberElement, SysMLPackage . eINSTANCE. element_DeclaredName, INVALID_NAMESPACE_DISTINGUISHABILITY )
0 commit comments