Skip to content
Draft
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
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import static java.util.stream.Collectors.joining;

import java.util.Objects;
import java.util.Optional;
import java.util.function.BinaryOperator;

import org.eclipse.emf.common.util.EList;
Expand All @@ -38,6 +39,7 @@
import org.eclipse.syson.sysml.FeatureValue;
import org.eclipse.syson.sysml.LiteralExpression;
import org.eclipse.syson.sysml.MultiplicityRange;
import org.eclipse.syson.sysml.Namespace;
import org.eclipse.syson.sysml.OwningMembership;
import org.eclipse.syson.sysml.Redefinition;
import org.eclipse.syson.sysml.ReferenceSubsetting;
Expand All @@ -50,6 +52,7 @@
import org.eclipse.syson.sysml.Type;
import org.eclipse.syson.sysml.Usage;
import org.eclipse.syson.sysml.VariantMembership;
import org.eclipse.syson.sysml.helper.EMFUtils;
import org.eclipse.syson.sysml.helper.LabelConstants;
import org.eclipse.syson.sysml.textual.SysMLElementSerializer;
import org.eclipse.syson.sysml.textual.utils.Appender;
Expand Down Expand Up @@ -202,13 +205,37 @@ public String getTypingLabel(Element element) {
label.append(LabelConstants.SPACE);
label.append(LabelConstants.COLON);
label.append(LabelConstants.SPACE);
label.append(this.getDeclaredNameLabel(type));
label.append(this.buildImportContextRelativeQualifiedName(type, element));
}
}
}
return label.toString();
}

private String buildImportContextRelativeQualifiedName(Element element, Element from) {
String qualifiedName = Optional.ofNullable(element.getQualifiedName()).orElse("");
Element commonAncestor = EMFUtils.getLeastCommonContainer(Element.class, element, from);
if (commonAncestor != null) {
String prefix = commonAncestor.getQualifiedName() + "::";
if (qualifiedName.startsWith(prefix)) {
qualifiedName = qualifiedName.substring(prefix.length());
}
}
var namespaces = EMFUtils.getAncestors(Namespace.class, from, null);
if (namespaces.stream().anyMatch(ns -> this.nsImports(ns, element))) {
qualifiedName = Optional.ofNullable(element.getDeclaredName()).orElse("");
}
return qualifiedName;
}

private boolean nsImports(Namespace ns, Element element) {
return ns.getImportedMembership().stream()
.filter(OwningMembership.class::isInstance)
.map(OwningMembership.class::cast)
.map(OwningMembership::getMemberElement)
.anyMatch(importedMemeber -> importedMemeber == element);
}

@Override
public String getValueLabel(Usage usage) {
return this.getValueStringRepresentation(usage, false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,19 +19,25 @@

import org.eclipse.syson.sysml.AttributeUsage;
import org.eclipse.syson.sysml.ConstraintUsage;
import org.eclipse.syson.sysml.DataType;
import org.eclipse.syson.sysml.Dependency;
import org.eclipse.syson.sysml.Element;
import org.eclipse.syson.sysml.Feature;
import org.eclipse.syson.sysml.FeatureChainExpression;
import org.eclipse.syson.sysml.FeatureChaining;
import org.eclipse.syson.sysml.FeatureDirectionKind;
import org.eclipse.syson.sysml.FeatureReferenceExpression;
import org.eclipse.syson.sysml.FeatureTyping;
import org.eclipse.syson.sysml.FeatureValue;
import org.eclipse.syson.sysml.InterfaceUsage;
import org.eclipse.syson.sysml.LiteralInteger;
import org.eclipse.syson.sysml.Membership;
import org.eclipse.syson.sysml.NamespaceImport;
import org.eclipse.syson.sysml.OperatorExpression;
import org.eclipse.syson.sysml.OwningMembership;
import org.eclipse.syson.sysml.Package;
import org.eclipse.syson.sysml.ParameterMembership;
import org.eclipse.syson.sysml.PartDefinition;
import org.eclipse.syson.sysml.ReferenceUsage;
import org.eclipse.syson.sysml.RequirementConstraintMembership;
import org.eclipse.syson.sysml.ResultExpressionMembership;
Expand Down Expand Up @@ -426,6 +432,51 @@ public void testGetEdgeLabelOfInterfaceWithNameAndShortName() {
assertThat(this.labelService.getEdgeLabel(interfaceUsage)).isEqualTo(SHORT_NAME_LABEL + " interface");
}

@DisplayName("GIVEN a namespace imported, WHEN the label of an attribute whose type is from the imported namespace, THEN the attribute's type should be shortened in its label")
@Test
public void testAttributeTypeShortenedIfNamespaceImported() {
String customTypeName = "CustomType";

Package parentPackage = SysmlFactory.eINSTANCE.createPackage();
parentPackage.setDeclaredName("Parent");

Package definition = SysmlFactory.eINSTANCE.createPackage();
definition.setDeclaredName("TypeDefinition");
this.addOwnedMember(parentPackage, definition);

DataType customDataType = SysmlFactory.eINSTANCE.createDataType();
customDataType.setDeclaredName(customTypeName);
this.addOwnedMember(definition, customDataType);

Package usage = SysmlFactory.eINSTANCE.createPackage();
usage.setDeclaredName("TypeUsage");
this.addOwnedMember(parentPackage, usage);

NamespaceImport nsImport = SysmlFactory.eINSTANCE.createNamespaceImport();
nsImport.setImportedNamespace(definition);
this.addOwnedMember(usage, nsImport);

PartDefinition partDef = SysmlFactory.eINSTANCE.createPartDefinition();
partDef.setDeclaredName("PartDef1");
this.addOwnedMember(usage, partDef);

AttributeUsage attribute = SysmlFactory.eINSTANCE.createAttributeUsage();
attribute.setDeclaredName("x1");
this.addOwnedMember(partDef, attribute);

FeatureTyping typing = SysmlFactory.eINSTANCE.createFeatureTyping();
typing.setType(customDataType);
attribute.getOwnedRelationship().add(typing);

assertThat(this.labelService.getCompartmentItemLabel(attribute)).isEqualTo("x1 : CustomType");
}

private void addOwnedMember(Element parent, Element child) {
OwningMembership owningMembership = SysmlFactory.eINSTANCE.createOwningMembership();
owningMembership.getOwnedRelatedElement().add(child);
parent.getOwnedRelationship().add(owningMembership);
}

/**
* Creates an {@link OperatorExpression} in the given {@code constraintUsage}.
* <p>
Expand Down
Loading