Skip to content
Snippets Groups Projects
Commit c3f5b702 authored by René Schöne's avatar René Schöne
Browse files

Change token component directly in supertype if connected in any subtype.

parent d1df8b82
No related branches found
No related tags found
1 merge request!37Resolve "Inherited components of a type can not be chosen as port targets"
Pipeline #15520 failed
...@@ -98,10 +98,18 @@ aspect Analysis { ...@@ -98,10 +98,18 @@ aspect Analysis {
eq ContextFreeTypePortTarget.hasAttributeResetMethod() = false; eq ContextFreeTypePortTarget.hasAttributeResetMethod() = false;
// --- needProxyToken --- // --- needProxyToken ---
syn boolean TokenComponent.needProxyToken() = !getDependencySourceDefinitionList().isEmpty() || syn boolean TokenComponent.needProxyToken() {
getTokenPortTargetList().stream() for (Component comp : meOwnedByOthers()) {
.map(PortTarget::containingPortDefinition) TokenComponent tokenComp = comp.asTokenComponent();
.anyMatch(PortDefinition::shouldNotResetValue); if (!tokenComp.getDependencySourceDefinitionList().isEmpty() ||
tokenComp.getTokenPortTargetList().stream()
.map(PortTarget::containingPortDefinition)
.anyMatch(PortDefinition::shouldNotResetValue)) {
return true;
}
}
return false;
}
// --- effectiveUsedAt --- // --- effectiveUsedAt ---
coll Set<PortDefinition> MappingDefinition.effectiveUsedAt() coll Set<PortDefinition> MappingDefinition.effectiveUsedAt()
......
...@@ -358,7 +358,14 @@ aspect MustacheRagConnect { ...@@ -358,7 +358,14 @@ aspect MustacheRagConnect {
eq ContextFreeTypePortTarget.impliedPortDefinitions() { eq ContextFreeTypePortTarget.impliedPortDefinitions() {
JastAddList<PortDefinition> result = super.impliedPortDefinitions(); JastAddList<PortDefinition> result = super.impliedPortDefinitions();
PortDefinition containingDef = containingPortDefinition(); PortDefinition containingDef = containingPortDefinition();
Set<TypeComponent> seenTypeComponents = new HashSet<>();
for (TypeComponent typeComponent : getTypeDecl().occurencesInProductionRules()) { for (TypeComponent typeComponent : getTypeDecl().occurencesInProductionRules()) {
// only process each once
if (seenTypeComponents.contains(typeComponent)) {
continue;
}
seenTypeComponents.add(typeComponent);
List<PortDefinition> defsForTypeComponent = lookupGivenTypePortDefinitions(typeComponent); List<PortDefinition> defsForTypeComponent = lookupGivenTypePortDefinitions(typeComponent);
if (!defsForTypeComponent.stream().anyMatch(containingDef::matchesType)) { if (!defsForTypeComponent.stream().anyMatch(containingDef::matchesType)) {
// there is no user-defined port definition for this typeComponent yet // there is no user-defined port definition for this typeComponent yet
...@@ -630,9 +637,12 @@ aspect MustacheTokenComponent { ...@@ -630,9 +637,12 @@ aspect MustacheTokenComponent {
syn String TokenComponent.javaType() = effectiveJavaTypeUse().prettyPrint(); syn String TokenComponent.javaType() = effectiveJavaTypeUse().prettyPrint();
syn PortDefinition TokenComponent.normalTokenSendDef() { syn PortDefinition TokenComponent.normalTokenSendDef() {
for (PortTarget target : getTokenPortTargetList()) { for (Component comp : meOwnedByOthers()) {
if (target.isTokenPortTarget() && target.containingPortDefinition().shouldNotResetValue()) { TokenComponent tokenComp = comp.asTokenComponent();
return target.containingPortDefinition(); for (PortTarget target : tokenComp.getTokenPortTargetList()) {
if (target.isTokenPortTarget() && target.containingPortDefinition().shouldNotResetValue()) {
return target.containingPortDefinition();
}
} }
} }
return null; return null;
...@@ -670,6 +680,10 @@ aspect MustacheTypeDecl { ...@@ -670,6 +680,10 @@ aspect MustacheTypeDecl {
syn String TypeComponent.parentTypeName() = containingTypeDecl().getName(); syn String TypeComponent.parentTypeName() = containingTypeDecl().getName();
syn String TypeComponent.disconnectMethodName() { syn String TypeComponent.disconnectMethodName() {
List<TypePortTarget> typePortTargets = getTypePortTargets(); List<TypePortTarget> typePortTargets = getTypePortTargets();
while (typePortTargets.isEmpty() && getRealComponent() != null) {
// get for "real" typeComponent (of super-type) and use its getTypePortTargets
typePortTargets = getRealComponent().asTypeComponent().getTypePortTargets();
}
if (typePortTargets.isEmpty()) { if (typePortTargets.isEmpty()) {
return "MISSING_PORT"; return "MISSING_PORT";
} else { } else {
......
...@@ -197,7 +197,9 @@ aspect RelastNameResolution { ...@@ -197,7 +197,9 @@ aspect RelastNameResolution {
syn nta JastAddList<Component> TypeDecl.allComponentsAsOwnedByMe() { syn nta JastAddList<Component> TypeDecl.allComponentsAsOwnedByMe() {
JastAddList<Component> result = new JastAddList<>(); JastAddList<Component> result = new JastAddList<>();
for (Component comp : allComponents()) { for (Component comp : allComponents()) {
result.add(comp.treeCopy()); Component newComp = comp.treeCopy();
newComp.setRealComponent(comp);
result.add(newComp);
} }
return result; return result;
} }
...@@ -214,7 +216,7 @@ aspect RelastNameResolution { ...@@ -214,7 +216,7 @@ aspect RelastNameResolution {
syn boolean Component.matches(Component other) = false; syn boolean Component.matches(Component other) = false;
eq TokenComponent.matches(Component other) { eq TokenComponent.matches(Component other) {
if (!other.isTokenComponent()) { return false; } if (!other.isTokenComponent()) { return false; }
return getName().equals(other.getName()) && getJavaTypeUse().prettyPrint().equals(other.asTokenComponent().getJavaTypeUse().prettyPrint()); return getName().equals(other.getName()) && (getJavaTypeUse() == null && other.asTokenComponent().getJavaTypeUse() == null || getJavaTypeUse().prettyPrint().equals(other.asTokenComponent().getJavaTypeUse().prettyPrint()));
} }
eq TypeComponent.matches(Component other) = matchesNameAndType(other); eq TypeComponent.matches(Component other) = matchesNameAndType(other);
eq NormalComponent.matches(Component other) { eq NormalComponent.matches(Component other) {
......
...@@ -175,4 +175,25 @@ aspect RagConnectNavigation { ...@@ -175,4 +175,25 @@ aspect RagConnectNavigation {
// --- isListComponent --- (defined in PP, but only on TypeComponent) // --- isListComponent --- (defined in PP, but only on TypeComponent)
syn boolean Component.isListComponent() = false; syn boolean Component.isListComponent() = false;
syn Set<Component> Component.meOwnedByOthers() {
Set<Component> result = new HashSet<>();
Deque<TypeDecl> todo = new ArrayDeque<>();
todo.add(containingTypeDecl());
while (!todo.isEmpty()) {
TypeDecl current = todo.pop();
todo.addAll(current.getSubTypeList());
for (Component comp : current.allComponentsAsOwnedByMe()) {
if (comp.matches(this)) {
result.add(comp);
}
}
}
return result;
}
}
aspect RelastNavigation {
// TODO only token-components from the nta "owned-by-me" must be added to Program.allTokenComponents
//TypeDecl contributes nta allComponentsAsOwnedByMe() to Program.allTokenComponents();
} }
...@@ -47,3 +47,5 @@ Configuration ::= ...@@ -47,3 +47,5 @@ Configuration ::=
<EvaluationCounter:boolean> <EvaluationCounter:boolean>
<ExperimentalJastAdd329:boolean>; <ExperimentalJastAdd329:boolean>;
rel Configuration.RootNode -> TypeDecl ; rel Configuration.RootNode -> TypeDecl ;
rel Component.RealComponent? -> Component ;
...@@ -150,7 +150,10 @@ public class JavaTest extends RagConnectTest { ...@@ -150,7 +150,10 @@ public class JavaTest extends RagConnectTest {
model.ragconnectJavaPush(TOPIC_RECEIVE_NTA, ExposingASTNode.INSTANCE.aToBytes(createA("12"))); model.ragconnectJavaPush(TOPIC_RECEIVE_NTA, ExposingASTNode.INSTANCE.aToBytes(createA("12")));
checker.put(TOPIC_RECEIVE_NTA, "12").check(); checker.put(TOPIC_RECEIVE_NTA, "12").check();
}
@AfterEach
public void printEvaluationSummary() {
System.out.println(model.ragconnectEvaluationCounterSummary()); System.out.println(model.ragconnectEvaluationCounterSummary());
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment