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 {
eq ContextFreeTypePortTarget.hasAttributeResetMethod() = false;
// --- needProxyToken ---
syn boolean TokenComponent.needProxyToken() = !getDependencySourceDefinitionList().isEmpty() ||
getTokenPortTargetList().stream()
syn boolean TokenComponent.needProxyToken() {
for (Component comp : meOwnedByOthers()) {
TokenComponent tokenComp = comp.asTokenComponent();
if (!tokenComp.getDependencySourceDefinitionList().isEmpty() ||
tokenComp.getTokenPortTargetList().stream()
.map(PortTarget::containingPortDefinition)
.anyMatch(PortDefinition::shouldNotResetValue);
.anyMatch(PortDefinition::shouldNotResetValue)) {
return true;
}
}
return false;
}
// --- effectiveUsedAt ---
coll Set<PortDefinition> MappingDefinition.effectiveUsedAt()
......
......@@ -358,7 +358,14 @@ aspect MustacheRagConnect {
eq ContextFreeTypePortTarget.impliedPortDefinitions() {
JastAddList<PortDefinition> result = super.impliedPortDefinitions();
PortDefinition containingDef = containingPortDefinition();
Set<TypeComponent> seenTypeComponents = new HashSet<>();
for (TypeComponent typeComponent : getTypeDecl().occurencesInProductionRules()) {
// only process each once
if (seenTypeComponents.contains(typeComponent)) {
continue;
}
seenTypeComponents.add(typeComponent);
List<PortDefinition> defsForTypeComponent = lookupGivenTypePortDefinitions(typeComponent);
if (!defsForTypeComponent.stream().anyMatch(containingDef::matchesType)) {
// there is no user-defined port definition for this typeComponent yet
......@@ -630,11 +637,14 @@ aspect MustacheTokenComponent {
syn String TokenComponent.javaType() = effectiveJavaTypeUse().prettyPrint();
syn PortDefinition TokenComponent.normalTokenSendDef() {
for (PortTarget target : getTokenPortTargetList()) {
for (Component comp : meOwnedByOthers()) {
TokenComponent tokenComp = comp.asTokenComponent();
for (PortTarget target : tokenComp.getTokenPortTargetList()) {
if (target.isTokenPortTarget() && target.containingPortDefinition().shouldNotResetValue()) {
return target.containingPortDefinition();
}
}
}
return null;
}
......@@ -670,6 +680,10 @@ aspect MustacheTypeDecl {
syn String TypeComponent.parentTypeName() = containingTypeDecl().getName();
syn String TypeComponent.disconnectMethodName() {
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()) {
return "MISSING_PORT";
} else {
......
......@@ -197,7 +197,9 @@ aspect RelastNameResolution {
syn nta JastAddList<Component> TypeDecl.allComponentsAsOwnedByMe() {
JastAddList<Component> result = new JastAddList<>();
for (Component comp : allComponents()) {
result.add(comp.treeCopy());
Component newComp = comp.treeCopy();
newComp.setRealComponent(comp);
result.add(newComp);
}
return result;
}
......@@ -214,7 +216,7 @@ aspect RelastNameResolution {
syn boolean Component.matches(Component other) = false;
eq TokenComponent.matches(Component other) {
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 NormalComponent.matches(Component other) {
......
......@@ -175,4 +175,25 @@ aspect RagConnectNavigation {
// --- isListComponent --- (defined in PP, but only on TypeComponent)
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 ::=
<EvaluationCounter:boolean>
<ExperimentalJastAdd329:boolean>;
rel Configuration.RootNode -> TypeDecl ;
rel Component.RealComponent? -> Component ;
......@@ -150,7 +150,10 @@ public class JavaTest extends RagConnectTest {
model.ragconnectJavaPush(TOPIC_RECEIVE_NTA, ExposingASTNode.INSTANCE.aToBytes(createA("12")));
checker.put(TOPIC_RECEIVE_NTA, "12").check();
}
@AfterEach
public void printEvaluationSummary() {
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