@@ -23,6 +23,7 @@ import (
23
23
"github.com/cosmos72/gomacro/base"
24
24
basereflect "github.com/cosmos72/gomacro/base/reflect"
25
25
interp "github.com/cosmos72/gomacro/fast"
26
+ mp "github.com/cosmos72/gomacro/go/parser"
26
27
"github.com/cosmos72/gomacro/xreflect"
27
28
28
29
// compile and link files generated in imports/
@@ -95,6 +96,12 @@ type shutdownReply struct {
95
96
Restart bool `json:"restart"`
96
97
}
97
98
99
+ // isCompleteReply holds information about the statement is complete or not, for is_complete_reply messages.
100
+ type isCompleteReply struct {
101
+ Status string `json:"status"`
102
+ Indent string `json:"indent"`
103
+ }
104
+
98
105
const (
99
106
kernelStarting = "starting"
100
107
kernelBusy = "busy"
@@ -326,6 +333,10 @@ func (kernel *Kernel) handleShellMsg(receipt msgReceipt) {
326
333
if err := sendKernelInfo (receipt ); err != nil {
327
334
log .Fatal (err )
328
335
}
336
+ case "is_complete_request" :
337
+ if err := kernel .handleIsCompleteRequest (receipt ); err != nil {
338
+ log .Fatal (err )
339
+ }
329
340
case "complete_request" :
330
341
if err := handleCompleteRequest (ir , receipt ); err != nil {
331
342
log .Fatal (err )
@@ -362,6 +373,42 @@ func sendKernelInfo(receipt msgReceipt) error {
362
373
)
363
374
}
364
375
376
+ // checkComplete checks whether the `code` is complete or not.
377
+ func checkComplete (code string , ir * interp.Interp ) (status , indent string ) {
378
+ status , indent = "incomplete" , ""
379
+
380
+ if len (code ) == 0 {
381
+ return
382
+ }
383
+
384
+ var parser mp.Parser
385
+ g := ir .Comp
386
+ parser .Configure (g .ParserMode , g .MacroChar )
387
+ parser .Init (g .Fileset , g .Filepath , g .Line , []byte (code ))
388
+
389
+ _ , err := parser .Parse ()
390
+ if err == nil {
391
+ status = "complete"
392
+ }
393
+ return
394
+ }
395
+
396
+ // handleIsCompleteRequest sends a is_complete_reply message.
397
+ func (kernel * Kernel ) handleIsCompleteRequest (receipt msgReceipt ) error {
398
+
399
+ // Extract the data from the request.
400
+ reqcontent := receipt .Msg .Content .(map [string ]interface {})
401
+ code := reqcontent ["code" ].(string )
402
+ status , indent := checkComplete (code , kernel .ir )
403
+
404
+ return receipt .Reply ("is_complete_reply" ,
405
+ isCompleteReply {
406
+ Status : status ,
407
+ Indent : indent ,
408
+ },
409
+ )
410
+ }
411
+
365
412
// handleExecuteRequest runs code from an execute_request method,
366
413
// and sends the various reply messages.
367
414
func (kernel * Kernel ) handleExecuteRequest (receipt msgReceipt ) error {
0 commit comments