Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Belle2021-02-25 19:00:52 +0000
committerJan Belle2021-02-25 19:00:52 +0000
commit503180b63e1d4bd0168d8aa50f88ae5c99eac27b (patch)
tree958b42cf96266bc7bc878c3f70f9bd0c363604f0
parent89dfe75a24925eb6fcc8cb9718ca30e67f03add2 (diff)
downloadorg.eclipse.etrice-503180b63e1d4bd0168d8aa50f88ae5c99eac27b.tar.gz
org.eclipse.etrice-503180b63e1d4bd0168d8aa50f88ae5c99eac27b.tar.xz
org.eclipse.etrice-503180b63e1d4bd0168d8aa50f88ae5c99eac27b.zip
[genmodel.fsm] Fix wrong validation errors for cyclic transition chainsv_3.1.3
-rw-r--r--plugins/org.eclipse.etrice.core.genmodel.fsm/src/org/eclipse/etrice/core/genmodel/fsm/ExtendedFsmGenBuilder.xtend28
1 files changed, 17 insertions, 11 deletions
diff --git a/plugins/org.eclipse.etrice.core.genmodel.fsm/src/org/eclipse/etrice/core/genmodel/fsm/ExtendedFsmGenBuilder.xtend b/plugins/org.eclipse.etrice.core.genmodel.fsm/src/org/eclipse/etrice/core/genmodel/fsm/ExtendedFsmGenBuilder.xtend
index cc7ba54c4..cf484dd37 100644
--- a/plugins/org.eclipse.etrice.core.genmodel.fsm/src/org/eclipse/etrice/core/genmodel/fsm/ExtendedFsmGenBuilder.xtend
+++ b/plugins/org.eclipse.etrice.core.genmodel.fsm/src/org/eclipse/etrice/core/genmodel/fsm/ExtendedFsmGenBuilder.xtend
@@ -14,8 +14,11 @@
package org.eclipse.etrice.core.genmodel.fsm
+import java.util.ArrayDeque
+import java.util.Deque
import java.util.HashMap
import java.util.List
+import java.util.Set
import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.EStructuralFeature
import org.eclipse.etrice.core.fsm.fSM.FSMPackage
@@ -75,7 +78,7 @@ class ExtendedFsmGenBuilder extends BasicFsmGenBuilder {
def withChainHeads(GraphContainer gc) {
if (!gc.initializedChainHeads) {
if (gc.graph!==null) {
- gc.graph.allChainHeads.forEach[it.followChain(it)]
+ gc.graph.allChainHeads.forEach[it.followChain(it, newHashSet, new ArrayDeque)]
}
gc.initializedChainHeads = true
}
@@ -101,7 +104,7 @@ class ExtendedFsmGenBuilder extends BasicFsmGenBuilder {
return gc
}
- private def void followChain(Link l, Link head) {
+ private def void followChain(Link l, Link head, Set<Node> visited, Deque<Node> stack) {
// if we started at an initial or guarded transition no interface item can be provided
if (!(head.transition instanceof TriggeredTransition)) {
l.ifitemTriggered = false
@@ -115,18 +118,21 @@ class ExtendedFsmGenBuilder extends BasicFsmGenBuilder {
if (target instanceof State || target instanceof TransitionPoint) {
return
}
- else {
- // check whether we already visited the target node
- if(!l.target.outgoing.empty && l.target.outgoing.head.chainHeads.contains(head)) {
- // the transition chain generator can't handle cyclic transition chains
- validationError("This transition is part of a cyclic transition chain", l.transition, null);
- return;
- }
-
+ // check whether we already came from the target of this link
+ else if(stack.contains(l.target)) {
+ // the transition chain generator can't handle cyclic transition chains
+ validationError("This transition is part of a cyclic transition chain", l.transition, null);
+ return;
+ }
+ // only proceed if we did not visit the target of this link already
+ else if(!visited.contains(l.target)) {
+ visited.add(l.target);
+ stack.addLast(l.target);
// follow all outgoing links recursively
for (next : l.target.outgoing) {
- next.followChain(head)
+ next.followChain(head, visited, stack)
}
+ stack.removeLast();
}
}

Back to the top