Kaynağa Gözat

支持修改断点、单步调试

mxd 4 yıl önce
ebeveyn
işleme
286934fbc2

+ 13 - 1
src/main/java/org/ssssssss/magicapi/config/WebUIController.java

@@ -26,6 +26,7 @@ import org.ssssssss.script.MagicScriptEngine;
 import org.ssssssss.script.ScriptClass;
 import org.ssssssss.script.exception.MagicScriptAssertException;
 import org.ssssssss.script.exception.MagicScriptException;
+import org.ssssssss.script.functions.ObjectConvertExtension;
 import org.ssssssss.script.parsing.Span;
 
 import javax.servlet.http.HttpServletRequest;
@@ -208,11 +209,22 @@ public class WebUIController {
 	 */
 	@RequestMapping("/continue")
 	@ResponseBody
-	public Object debugContinue(String id, HttpServletResponse response) throws IOException {
+	public Object debugContinue(String id, String breakpoints, String step, HttpServletResponse response) throws IOException {
 		MagicScriptDebugContext context = MagicScriptDebugContext.getDebugContext(id);
 		if (context == null) {
 			return new JsonBean<>(0, "debug session not found!", resultProvider.buildResult(0, "debug session not found!"));
 		}
+		if (breakpoints != null) {
+			List<Integer> lines = new ArrayList<>();
+			for (String line : breakpoints.split(",")) {
+				int value = ObjectConvertExtension.asInt(line, -1);
+				if (value != -1) {
+					lines.add(value);
+				}
+			}
+			context.setBreakpoints(lines);    //重新调整断点
+		}
+		context.setStepInto("1".equals(step));
 		try {
 			context.singal();    //等待语句执行到断点或执行完毕
 		} catch (InterruptedException e) {

+ 3 - 0
src/main/resources/magicapi-support/css/index.css

@@ -231,6 +231,9 @@ ul li {
 .button-run,.bottom-container .bottom-item-toolbar span.button-continue{
     color: #59A869;
 }
+.bottom-container .bottom-item-toolbar span.button-step-over:not(.disabled){
+    color: #389FD6 !important;
+}
 .select input{
     cursor: default;
     width: 100%;

+ 1 - 0
src/main/resources/magicapi-support/index.html

@@ -125,6 +125,7 @@
 				<div class="bottom-item-toolbar not-select">
 					<label>调试信息</label>
 					<span class="button-continue disabled" title="继续(F8)"><i class="iconfont icon-continue"></i></span>
+					<span class="button-step-over disabled" title="单步(F6)"><i class="iconfont icon-step-over"></i></span>
 					<span title="最小化" class="button-minimize"><i class="iconfont icon-minimize"></i></span>
 				</div>
 				<div class="bottom-item-body">

+ 27 - 16
src/main/resources/magicapi-support/js/index.js

@@ -236,7 +236,7 @@ var MagicEditor = {
         var _this = this;
         element.onload = element.onreadystatechange = function(){
             if(!this.readyState||this.readyState=='loaded'||this.readyState=='complete') {
-                _this.report('v0_3_2');
+                _this.report('v0_3_3');
             }
         }
 
@@ -512,18 +512,20 @@ var MagicEditor = {
     resetDebugContent : function(){
         $('.bottom-item-body table tbody').html('<tr><td colspan="3" align="center">no message.</td></tr>');
     },
-    doContinue : function(){
+    doContinue : function(step){
         if($('.button-continue').hasClass('disabled')){
             return;
         }
         if(this.debugSessionId){
             MagicEditor.resetDebugContent();
-            $('.button-continue').addClass('disabled');
+            $('.button-continue,.button-step-over').addClass('disabled');
             var _this = this;
             this.ajax({
                 url : 'continue',
                 data : {
-                    id : this.debugSessionId
+                    id : this.debugSessionId,
+                    breakpoints : _this.getBreakPoints().join(','),
+                    step : step ? '1' : '0'
                 },
                 success : function(data,json,xhr){
                     _this.convertResult(json.code,json.message,json,xhr);
@@ -593,6 +595,16 @@ var MagicEditor = {
             _this.appendLog(data.level,data.message,data.throwable);
         })
     },
+    getBreakPoints : function(){
+        var decorations = MagicEditor.scriptEditor.getModel().getAllDecorations();
+        var breakpoints = [];
+        for (var i=0,len =decorations.length;i<len;i++) {
+            if (decorations[i].options.linesDecorationsClassName === 'breakpoints') {
+                breakpoints.push(decorations[i].range.startLineNumber);
+            }
+        }
+        return breakpoints;
+    },
     doTest : function(){
         var _this = this;
         if($('.button-run').hasClass('disabled')){
@@ -615,18 +627,12 @@ var MagicEditor = {
         _this.createConsole(function(sessionId){
             _this.report('run');
             request.script = _this.scriptEditor.getValue();
-            var decorations = _this.scriptEditor.getModel().getAllDecorations();
-            var breakpoints = [];
-            for (var i=0,len =decorations.length;i<len;i++) {
-                if (decorations[i].options.linesDecorationsClassName === 'breakpoints') {
-                    breakpoints.push(decorations[i].range.startLineNumber);
-                }
-            }
+            var breakpoints = _this.getBreakPoints();
             request.breakpoints = breakpoints;
             request.sessionId = sessionId;
             _this.resetDebugContent();
             $('.button-run').addClass('disabled');
-            $('.button-continue').addClass('disabled');
+            $('.button-continue,.button-step-over').addClass('disabled');
             _this.ajax({
                 url : 'test',
                 data : JSON.stringify(request),
@@ -716,7 +722,7 @@ var MagicEditor = {
             MagicEditor.setStatusBar('脚本执行出错..');
             MagicEditor.report('script_error');
             $(".button-run").removeClass('disabled');
-            $('.button-continue').addClass('disabled');
+            $('.button-continue,.button-step-over').addClass('disabled');
             this.navigateTo(2);
             if (json.body) {
                 var line = json.body;
@@ -739,14 +745,14 @@ var MagicEditor = {
             ret = false;
         }else if(code === 1000){ // debug断点
             $(".button-run").addClass('disabled');
-            $('.button-continue').removeClass('disabled');
+            $('.button-continue,.button-step-over').removeClass('disabled');
             this.navigateTo(3);
             this.debugIn(message, json.body);
             return false;
         }
         MagicEditor.setStatusBar('脚本执行完毕');
         $(".button-run").removeClass('disabled');
-        $('.button-continue').addClass('disabled');
+        $('.button-continue,.button-step-over').addClass('disabled');
         this.navigateTo(2)
         var outputJson;
         var contentType = xhr&&xhr.getResponseHeader('ma-content-type');
@@ -820,6 +826,9 @@ var MagicEditor = {
             if(e.keyCode == 119){ //F8
                 _this.doContinue();
                 e.preventDefault();
+            }else if(e.keyCode == 117){ //F6
+                _this.doContinue(true);
+                e.preventDefault();
             }else if(e.keyCode == 81 && (e.metaKey || e.ctrlKey)){  //Ctrl + Q
                 _this.doTest();
                 e.preventDefault();
@@ -845,7 +854,7 @@ var MagicEditor = {
             url : 'https://img.shields.io/maven-central/v/org.ssssssss/magic-api.json',
             dataType : 'json',
             success : function(data){
-                if(data.value != 'v0.3.2'){
+                if(data.value != 'v0.3.3'){
                     if(ignoreVersion != data.value){
                         _this.createDialog({
                             title : '更新提示',
@@ -1069,6 +1078,8 @@ var MagicEditor = {
             _this.doSave();
         }).on('click','.button-continue',function(){
             _this.doContinue();
+        }).on('click','.button-step-over',function(){
+            _this.doContinue(true);
         }).on('click','.button-gitee',function(){
             MagicEditor.report('button-gitee');
             window.open('https://gitee.com/ssssssss-team/magic-api');