Skip to content

Commit a1c404c

Browse files
committed
Fixed and switched to tree-based implementation of omniscient navigation
1 parent 5703445 commit a1c404c

File tree

10 files changed

+210
-290
lines changed

10 files changed

+210
-290
lines changed

java_execution/java_engine/plugins/org.gemoc.execution.sequential.javaengine.ui/src/org/gemoc/execution/sequential/javaengine/ui/debug/OmniscientGenericSequentialModelDebugger.xtend

Lines changed: 29 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@ import fr.inria.diverse.trace.gemoc.api.IMultiDimensionalTraceAddon
66
import fr.obeo.dsl.debug.ide.event.IDSLDebugEventProcessor
77
import java.util.ArrayList
88
import java.util.Collections
9-
import java.util.Comparator
109
import java.util.List
11-
import java.util.Map
1210
import java.util.function.BiPredicate
1311
import org.eclipse.core.runtime.IStatus
1412
import org.eclipse.core.runtime.Status
@@ -17,7 +15,6 @@ import org.eclipse.jface.dialogs.ErrorDialog
1715
import org.eclipse.xtext.naming.DefaultDeclarativeQualifiedNameProvider
1816
import org.eclipse.xtext.naming.QualifiedName
1917
import org.gemoc.execution.sequential.javaengine.ui.Activator
20-
import org.gemoc.execution.sequential.javaengine.ui.debug.GenericSequentialModelDebugger.ToPushPop
2118
import org.gemoc.executionframework.engine.core.AbstractSequentialExecutionEngine
2219
import org.gemoc.executionframework.engine.core.EngineStoppedException
2320
import org.gemoc.executionframework.engine.mse.MSE
@@ -178,13 +175,8 @@ public class OmniscientGenericSequentialModelDebugger extends GenericSequentialM
178175
private var List<Object> newStack
179176

180177
def private void doStuff(List<Object> path, boolean updateStack) {
181-
val Map<IStep,List<IStep>> stepGraph = traceAddon.traceManager.getStepsForStates(0,traceAddon.traceManager.traceSize)
182-
val rootSteps = stepGraph.keySet()
183-
.filter[s|s.getParentStep() == null]
184-
.sortWith(new Comparator<IStep>() {
185-
override int compare(IStep o1, IStep o2) {
186-
return o1.getStartingIndex()-o2.getStartingIndex()
187-
}})
178+
val List<IStep> rootSteps = traceAddon.traceManager.getStepsForStates(0,traceAddon.traceManager.traceSize)
179+
188180
val stepPath = new ArrayList
189181
val currentSteps = new ArrayList
190182
currentSteps.addAll(rootSteps)
@@ -193,19 +185,19 @@ public class OmniscientGenericSequentialModelDebugger extends GenericSequentialM
193185
currentSteps.clear
194186
if (step != null) {
195187
stepPath.add(step)
196-
currentSteps.addAll(stepGraph.get(step))
188+
currentSteps.addAll(step.subSteps)
197189
}
198190
]
199191

200192
val stepPathUnmodifiable = stepPath.unmodifiableView
201193

202-
stepIntoResult = computeStepInto(stepGraph,stepPathUnmodifiable,rootSteps)
203-
stepOverResult = computeStepOver(stepGraph,stepPathUnmodifiable,rootSteps)
204-
stepReturnResult = computeStepReturn(stepGraph,stepPathUnmodifiable,rootSteps)
194+
stepIntoResult = computeStepInto(stepPathUnmodifiable,rootSteps)
195+
stepOverResult = computeStepOver(stepPathUnmodifiable,rootSteps)
196+
stepReturnResult = computeStepReturn(stepPathUnmodifiable,rootSteps)
205197

206-
backIntoResult = computeBackInto(stepGraph,stepPathUnmodifiable,rootSteps)
207-
backOverResult = computeBackOver(stepGraph,stepPathUnmodifiable,rootSteps)
208-
backOutResult = computeBackOut(stepGraph,stepPathUnmodifiable,rootSteps)
198+
backIntoResult = computeBackInto(stepPathUnmodifiable,rootSteps)
199+
backOverResult = computeBackOver(stepPathUnmodifiable,rootSteps)
200+
backOutResult = computeBackOut(stepPathUnmodifiable,rootSteps)
209201

210202
var i = 0
211203
while (i < path.size && i < callStack.size && path.get(i) == callStack.get(i)) i++
@@ -216,13 +208,13 @@ public class OmniscientGenericSequentialModelDebugger extends GenericSequentialM
216208
callStack = stepPathUnmodifiable
217209
}
218210

219-
def computeBackInto(Map<IStep,List<IStep>> stepGraph, List<IStep> stepPath, List<IStep> rootSteps) {
211+
def computeBackInto(List<IStep> stepPath, List<IStep> rootSteps) {
220212
var IStep result = null
221213
if (stepPath.size > 1) {
222214
val reversedPath = stepPath.reverseView
223215
val currentStep = reversedPath.get(0)
224216
val parentStep = reversedPath.get(1)
225-
val parentSubSteps = stepGraph.get(parentStep)
217+
val parentSubSteps = parentStep.subSteps
226218
val idx = parentSubSteps.indexOf(currentStep)
227219
if (idx == 0) {
228220
// If the current step is the first in its parents substeps, return parent step
@@ -231,10 +223,10 @@ public class OmniscientGenericSequentialModelDebugger extends GenericSequentialM
231223
// Otherwise, return the deepest substep in the previous sibling step
232224
val previousStep = parentSubSteps.get(idx-1)
233225
var tmpStep = previousStep
234-
var tmpSubSteps = stepGraph.get(tmpStep)
226+
var tmpSubSteps = tmpStep.subSteps
235227
while (!tmpSubSteps.empty) {
236228
tmpStep = tmpSubSteps.last
237-
tmpSubSteps = stepGraph.get(tmpStep)
229+
tmpSubSteps = tmpStep.subSteps
238230
}
239231
result = tmpStep
240232
}
@@ -244,41 +236,41 @@ public class OmniscientGenericSequentialModelDebugger extends GenericSequentialM
244236
if (idx > 0) {
245237
val previousStep = rootSteps.get(idx-1)
246238
var tmpStep = previousStep
247-
var tmpSubSteps = stepGraph.get(tmpStep)
239+
var tmpSubSteps = tmpStep.subSteps
248240
while (!tmpSubSteps.empty) {
249241
tmpStep = tmpSubSteps.last
250-
tmpSubSteps = stepGraph.get(tmpStep)
242+
tmpSubSteps = tmpStep.subSteps
251243
}
252244
result = tmpStep
253245
}
254246
}
255247
return result
256248
}
257249

258-
def computeBackOver(Map<IStep,List<IStep>> stepGraph, List<IStep> stepPath, List<IStep> rootSteps) {
250+
def computeBackOver(List<IStep> stepPath, List<IStep> rootSteps) {
259251
if (!stepPath.empty) {
260252
val reversedPath = stepPath.reverseView
261-
return findPreviousStep(stepGraph,reversedPath,rootSteps,reversedPath.get(0),1)
253+
return findPreviousStep(reversedPath,rootSteps,reversedPath.get(0),1)
262254
}
263255
return null
264256
}
265257

266-
def computeBackOut(Map<IStep,List<IStep>> stepGraph, List<IStep> stepPath, List<IStep> rootSteps) {
258+
def computeBackOut(List<IStep> stepPath, List<IStep> rootSteps) {
267259
if (stepPath.size > 1) {
268260
val reversedPath = stepPath.reverseView
269-
return findPreviousStep(stepGraph,reversedPath,rootSteps,reversedPath.get(1),2)
261+
return findPreviousStep(reversedPath,rootSteps,reversedPath.get(1),2)
270262
}
271263
return null
272264
}
273265

274-
def findPreviousStep(Map<IStep,List<IStep>> stepGraph, List<IStep> stepPath,
266+
def findPreviousStep(List<IStep> stepPath,
275267
List<IStep> rootSteps, IStep previousStep, int start) {
276268
var IStep result = null
277269
var i = start
278270
var previous = previousStep
279271
while (result == null && i < stepPath.size) {
280272
val currentStep = stepPath.get(i)
281-
val currentSubSteps = stepGraph.get(currentStep)
273+
val currentSubSteps = currentStep.subSteps
282274
var idx = currentSubSteps.indexOf(previous) - 1
283275
if (idx > 0) {
284276
result = currentSubSteps.get(idx)
@@ -296,14 +288,14 @@ public class OmniscientGenericSequentialModelDebugger extends GenericSequentialM
296288
return result
297289
}
298290

299-
def findNextStep(Map<IStep,List<IStep>> stepGraph, List<IStep> stepPath,
291+
def findNextStep(List<IStep> stepPath,
300292
List<IStep> rootSteps, IStep previousStep, int start) {
301293
var IStep result = null
302294
var i = start
303295
var previous = previousStep
304296
while (result == null && i < stepPath.size) {
305297
val currentStep = stepPath.get(i)
306-
val currentSubSteps = stepGraph.get(currentStep)
298+
val currentSubSteps = currentStep.subSteps
307299
if (currentSubSteps.empty) {
308300
// No substep to step into, we thus have to explore the substeps of the parent step
309301
previous = currentStep
@@ -332,22 +324,22 @@ public class OmniscientGenericSequentialModelDebugger extends GenericSequentialM
332324
return result
333325
}
334326

335-
def computeStepInto(Map<IStep,List<IStep>> stepGraph, List<IStep> stepPath, List<IStep> rootSteps) {
336-
return findNextStep(stepGraph,stepPath.reverseView,rootSteps,null,0)
327+
def computeStepInto(List<IStep> stepPath, List<IStep> rootSteps) {
328+
return findNextStep(stepPath.reverseView,rootSteps,null,0)
337329
}
338330

339-
def computeStepOver(Map<IStep, List<IStep>> stepGraph, List<IStep> stepPath, List<IStep> rootSteps) {
331+
def computeStepOver(List<IStep> stepPath, List<IStep> rootSteps) {
340332
if (!stepPath.empty) {
341333
val reversedPath = stepPath.reverseView
342-
return findNextStep(stepGraph,reversedPath,rootSteps,reversedPath.get(0),1)
334+
return findNextStep(reversedPath,rootSteps,reversedPath.get(0),1)
343335
}
344336
return null
345337
}
346338

347-
def computeStepReturn(Map<IStep, List<IStep>> stepGraph, List<IStep> stepPath, List<IStep> rootSteps) {
339+
def computeStepReturn(List<IStep> stepPath, List<IStep> rootSteps) {
348340
if (stepPath.size > 1) {
349341
val reversedPath = stepPath.reverseView
350-
return findNextStep(stepGraph,reversedPath,rootSteps,reversedPath.get(1),2)
342+
return findNextStep(reversedPath,rootSteps,reversedPath.get(1),2)
351343
}
352344
return null
353345
}

trace/commons/plugins/fr.inria.diverse.trace.api/src/fr/inria/diverse/trace/api/IStep.java

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,32 +10,25 @@
1010
*******************************************************************************/
1111
package fr.inria.diverse.trace.api;
1212

13+
import java.util.List;
1314
import java.util.Map;
1415

1516
public interface IStep {
16-
17-
public static class StepEvent {
18-
public final IStep step;
19-
public final boolean start;
20-
21-
public StepEvent(fr.inria.diverse.trace.api.IStep step, boolean start) {
22-
this.step = step;
23-
this.start = start;
24-
}
25-
}
26-
17+
2718
Map<String, Object> getParameters();
28-
19+
2920
String getContainingClassName();
3021

3122
String getOperationName();
32-
23+
3324
void addParameter(String name, Object value);
34-
25+
3526
int getEndingIndex();
3627

3728
int getStartingIndex();
3829

3930
IStep getParentStep();
4031

32+
List<IStep> getSubSteps();
33+
4134
}

trace/commons/plugins/fr.inria.diverse.trace.api/src/fr/inria/diverse/trace/api/ITraceManager.java

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -47,24 +47,18 @@ public interface ITraceManager {
4747
List<IValueTrace> getAllValueTraces();
4848

4949
String getDescriptionOfValue(EObject value);
50-
50+
5151
default Object getContainedValue(EObject value) {
52-
// For now we do nothing by default, so that former trace managers can keep compiling
53-
throw new IllegalStateException("The new getContainedValue method should not be used with old trace managers! Regenerate a trace manager to use it.");
52+
// For now we do nothing by default, so that former trace managers can
53+
// keep compiling
54+
throw new IllegalStateException(
55+
"The new getContainedValue method should not be used with old trace managers! Regenerate a trace manager to use it.");
5456
};
5557

5658
Set<EObject> getAllCurrentValues(int stateIndex);
5759

5860
int getStateOrValueIndex(EObject stateOrValue);
5961

60-
List<fr.inria.diverse.trace.api.IStep> getStackForwardAfterState(int stateIndex);
61-
62-
List<fr.inria.diverse.trace.api.IStep> getStackForwardBeforeState(int stateIndex);
63-
64-
List<fr.inria.diverse.trace.api.IStep> getStackBackward(int stateIndex);
65-
66-
List<fr.inria.diverse.trace.api.IStep.StepEvent> getEventsForState(int stateIndex);
67-
68-
Map<IStep, List<IStep>> getStepsForStates(int startingState,int endingState);
62+
List<IStep> getStepsForStates(int startingState, int endingState);
6963

7064
}

trace/commons/plugins/fr.inria.diverse.trace.api/src/fr/inria/diverse/trace/api/impl/GenericStep.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
package fr.inria.diverse.trace.api.impl;
1212

1313
import java.util.HashMap;
14+
import java.util.List;
1415
import java.util.Map;
1516

1617
import fr.inria.diverse.trace.api.IStep;
@@ -23,14 +24,17 @@ public class GenericStep implements IStep {
2324
private final int endingIndex;
2425
private final int startingIndex;
2526
private final IStep parentStep;
27+
private final List<IStep> subSteps;
2628

27-
public GenericStep(String containingClassName, String operationName, int startingIndex, int endingState, IStep parentStep) {
29+
public GenericStep(String containingClassName, String operationName, int startingIndex,
30+
int endingState, IStep parentStep, List<IStep> subSteps) {
2831
this.parameters = new HashMap<String, Object>();
2932
this.operationName = operationName;
3033
this.containingClassName = containingClassName;
3134
this.startingIndex = startingIndex;
3235
this.endingIndex = endingState;
3336
this.parentStep = parentStep;
37+
this.subSteps = subSteps;
3438
}
3539

3640
@Override
@@ -68,4 +72,9 @@ public IStep getParentStep() {
6872
return parentStep;
6973
}
7074

75+
@Override
76+
public List<IStep> getSubSteps() {
77+
return subSteps;
78+
}
79+
7180
}

trace/commons/plugins/fr.inria.diverse.trace.api/src/fr/inria/diverse/trace/api/impl/LazyGenericStep.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
*******************************************************************************/
1111
package fr.inria.diverse.trace.api.impl;
1212

13+
import java.util.List;
1314
import java.util.Map;
1415
import java.util.function.Supplier;
1516

@@ -23,6 +24,7 @@ public class LazyGenericStep implements IStep {
2324
private int endingIndex;
2425
private int startingIndex;
2526
private IStep parentStep;
27+
private List<IStep> subSteps;
2628
private Supplier<IStep> supplier;
2729
private boolean resolved = false;
2830

@@ -38,6 +40,7 @@ private void resolve() {
3840
endingIndex = internalStep.getEndingIndex();
3941
startingIndex = internalStep.getStartingIndex();
4042
parentStep = internalStep.getParentStep();
43+
subSteps = internalStep.getSubSteps();
4144
resolved = true;
4245
supplier = null;
4346
}
@@ -90,6 +93,14 @@ public IStep getParentStep() {
9093
return parentStep;
9194
}
9295

96+
@Override
97+
public List<IStep> getSubSteps() {
98+
if (!resolved) {
99+
resolve();
100+
}
101+
return subSteps;
102+
}
103+
93104
@Override
94105
public void addParameter(String name, Object value) {
95106
if (!resolved) {

0 commit comments

Comments
 (0)