Bug 553653: [Rhino] breakpoint on last line of include breaks debugger

Change-Id: Ib5f05f1702e31c8493043662cfad1047a37bb050
diff --git a/plugins/org.eclipse.ease.lang.javascript.rhino/src/org/eclipse/ease/lang/javascript/rhino/debugger/LineNumberDebugger.java b/plugins/org.eclipse.ease.lang.javascript.rhino/src/org/eclipse/ease/lang/javascript/rhino/debugger/LineNumberDebugger.java
index 989e6d8..9ecdb7a 100644
--- a/plugins/org.eclipse.ease.lang.javascript.rhino/src/org/eclipse/ease/lang/javascript/rhino/debugger/LineNumberDebugger.java
+++ b/plugins/org.eclipse.ease.lang.javascript.rhino/src/org/eclipse/ease/lang/javascript/rhino/debugger/LineNumberDebugger.java
@@ -19,7 +19,7 @@
 	}
 
 	@Override
-	protected void processLine(Script script, int lineNumber) {
+	protected void processLine(Script script, int lineNumber, boolean checkBreakpoints) {
 		// we do not want to check for breakpoints, etc
 	}
 }
diff --git a/plugins/org.eclipse.ease.lang.javascript.rhino/src/org/eclipse/ease/lang/javascript/rhino/debugger/RhinoDebugger.java b/plugins/org.eclipse.ease.lang.javascript.rhino/src/org/eclipse/ease/lang/javascript/rhino/debugger/RhinoDebugger.java
index 62da7aa..e85afb6 100644
--- a/plugins/org.eclipse.ease.lang.javascript.rhino/src/org/eclipse/ease/lang/javascript/rhino/debugger/RhinoDebugger.java
+++ b/plugins/org.eclipse.ease.lang.javascript.rhino/src/org/eclipse/ease/lang/javascript/rhino/debugger/RhinoDebugger.java
@@ -111,7 +111,7 @@
 			fScope = activation;
 
 			if (getScript() != null)
-				processLine(getScript(), getLineNumber());
+				processLine(getScript(), getLineNumber(), true);
 		}
 
 		@Override
@@ -119,7 +119,7 @@
 			setLineNumber(lineNumber);
 
 			if (getScript() != null)
-				processLine(getScript(), getLineNumber());
+				processLine(getScript(), getLineNumber(), true);
 		}
 
 		@Override
@@ -135,7 +135,7 @@
 			fScope = null;
 
 			if ((!byThrow) && (getScript() != null))
-				processLine(getScript(), getLineNumber());
+				processLine(getScript(), getLineNumber(), false);
 		}
 
 		@Override
diff --git a/plugins/org.eclipse.ease.lang.javascript.rhino/src/org/eclipse/ease/lang/javascript/rhino/debugger/RhinoDebuggerEngine.java b/plugins/org.eclipse.ease.lang.javascript.rhino/src/org/eclipse/ease/lang/javascript/rhino/debugger/RhinoDebuggerEngine.java
index ef4b9ed..3ebd88e 100644
--- a/plugins/org.eclipse.ease.lang.javascript.rhino/src/org/eclipse/ease/lang/javascript/rhino/debugger/RhinoDebuggerEngine.java
+++ b/plugins/org.eclipse.ease.lang.javascript.rhino/src/org/eclipse/ease/lang/javascript/rhino/debugger/RhinoDebuggerEngine.java
@@ -150,6 +150,8 @@
 
 	@Override
 	public void setupDebugger(final ILaunch launch, final boolean suspendOnStartup, final boolean suspendOnScriptLoad, final boolean showDynamicCode) {
+		removeExecutionListener(fDebugger);
+
 		final RhinoDebugTarget debugTarget = new RhinoDebugTarget(launch, suspendOnStartup, suspendOnScriptLoad, showDynamicCode);
 		launch.addDebugTarget(debugTarget);
 
diff --git a/plugins/org.eclipse.ease.lang.python/src/org/eclipse/ease/lang/python/debugger/PythonDebugger.java b/plugins/org.eclipse.ease.lang.python/src/org/eclipse/ease/lang/python/debugger/PythonDebugger.java
index daaf97c..bb73584 100644
--- a/plugins/org.eclipse.ease.lang.python/src/org/eclipse/ease/lang/python/debugger/PythonDebugger.java
+++ b/plugins/org.eclipse.ease.lang.python/src/org/eclipse/ease/lang/python/debugger/PythonDebugger.java
@@ -175,7 +175,7 @@
 					// do not evaluate breakpoints when returning from a function call
 					fBreakpointsDisabled = "return".equals(type) || "call".equals(type);
 
-					processLine(script, frame.getLineNumber());
+					processLine(script, frame.getLineNumber(), true);
 				}
 			}
 		}
@@ -230,6 +230,7 @@
 	 *
 	 * @return {@link IPythonScriptRegistry} or {@code null}.
 	 */
+	@Override
 	public IPythonScriptRegistry getScriptRegistry() {
 		final IScriptRegistry scriptRegistry = super.getScriptRegistry();
 		if (scriptRegistry instanceof IPythonScriptRegistry) {
diff --git a/plugins/org.eclipse.ease/src/org/eclipse/ease/debugging/AbstractEaseDebugger.java b/plugins/org.eclipse.ease/src/org/eclipse/ease/debugging/AbstractEaseDebugger.java
index a9dcb6f..cdac561 100644
--- a/plugins/org.eclipse.ease/src/org/eclipse/ease/debugging/AbstractEaseDebugger.java
+++ b/plugins/org.eclipse.ease/src/org/eclipse/ease/debugging/AbstractEaseDebugger.java
@@ -469,7 +469,7 @@
 	 * @param script
 	 * @param lineNumber
 	 */
-	protected void processLine(final Script script, final int lineNumber) {
+	protected void processLine(final Script script, final int lineNumber, boolean checkBreakpoints) {
 
 		if (!isTrackedScript(script))
 			return;
@@ -485,9 +485,11 @@
 		final Object thread = getThread();
 
 		// check breakpoints
-		if (isActiveBreakpoint(script, lineNumber)) {
-			suspend(new SuspendedEvent(DebugEvent.BREAKPOINT, thread, getStacktrace()));
-			return;
+		if (checkBreakpoints) {
+			if (isActiveBreakpoint(script, lineNumber)) {
+				suspend(new SuspendedEvent(DebugEvent.BREAKPOINT, thread, getStacktrace()));
+				return;
+			}
 		}
 
 		// no breakpoint, check for step events
diff --git a/tests/org.eclipse.ease.lang.python.py4j.test/src/org/eclipse/ease/lang/python/py4j/Py4jDebugTest.java b/tests/org.eclipse.ease.lang.python.py4j.test/src/org/eclipse/ease/lang/python/py4j/Py4jDebugTest.java
index 67e943b..6c496bf 100644
--- a/tests/org.eclipse.ease.lang.python.py4j.test/src/org/eclipse/ease/lang/python/py4j/Py4jDebugTest.java
+++ b/tests/org.eclipse.ease.lang.python.py4j.test/src/org/eclipse/ease/lang/python/py4j/Py4jDebugTest.java
@@ -68,4 +68,11 @@
 	public void stepIntoIncludeCommand() throws CoreException {
 		// TODO see https://bugs.eclipse.org/bugs/show_bug.cgi?id=553619
 	}
+
+	@Override
+	@Test
+	@Ignore
+	public void resumeOnLastIncludeLine() throws CoreException {
+		// TODO see https://bugs.eclipse.org/bugs/show_bug.cgi?id=553652
+	}
 }
diff --git a/tests/org.eclipse.ease.testhelper/resources/DebugTest/include.js b/tests/org.eclipse.ease.testhelper/resources/DebugTest/include.js
index 1ac445f..718bbcd 100644
--- a/tests/org.eclipse.ease.testhelper/resources/DebugTest/include.js
+++ b/tests/org.eclipse.ease.testhelper/resources/DebugTest/include.js
@@ -4,4 +4,4 @@
 	print("include function called");
 }
 
-print("Include file processed");
\ No newline at end of file
+print("Include file processed");  // include-last-line-hook
\ No newline at end of file
diff --git a/tests/org.eclipse.ease.testhelper/resources/DebugTest/include.py b/tests/org.eclipse.ease.testhelper/resources/DebugTest/include.py
index c990ab3..0386a3d 100644
--- a/tests/org.eclipse.ease.testhelper/resources/DebugTest/include.py
+++ b/tests/org.eclipse.ease.testhelper/resources/DebugTest/include.py
@@ -3,4 +3,4 @@
 def includedFoo():
     print("include function called")
 
-print("include file processed")
+print("include file processed")  # include-last-line-hook
diff --git a/tests/org.eclipse.ease.testhelper/src/org/eclipse/ease/testhelper/AbstractDebugTest.java b/tests/org.eclipse.ease.testhelper/src/org/eclipse/ease/testhelper/AbstractDebugTest.java
index 5a15f67..91eed32 100644
--- a/tests/org.eclipse.ease.testhelper/src/org/eclipse/ease/testhelper/AbstractDebugTest.java
+++ b/tests/org.eclipse.ease.testhelper/src/org/eclipse/ease/testhelper/AbstractDebugTest.java
@@ -402,6 +402,23 @@
 		assertEquals(2, suspendedEvents);
 	}
 
+	@Test(timeout = TEST_TIMEOUT)
+	public void resumeOnLastIncludeLine() throws CoreException {
+		setBreakpoint(getFile(INCLUDE_SCRIPT), getLineNumber(INCLUDE_SCRIPT, "include-last-line-hook"));
+		assertEquals(1, getBreakpoints().length);
+
+		fScriptEngine.executeAsync(getFile(MAIN_SCRIPT));
+		final int suspendedEvents = runUntilTerminated(fScriptEngine, () -> {
+			final IStackFrame[] stackFrames = getStackFrames();
+			assertEquals(2, stackFrames.length);
+			assertEquals(getLineNumber(INCLUDE_SCRIPT, "include-last-line-hook"), getTopmostStackFrame().getLineNumber());
+
+			getThread().resume();
+		});
+
+		assertEquals(1, suspendedEvents);
+	}
+
 	// ---------- resume tests ------------------------------------------------------------------
 
 	public void resumeTestTemplate(IDebugElementProvider elementProvider) throws CoreException, IOException {