@@ -23,6 +23,7 @@ import (
2323 "github.com/cosmos72/gomacro/base"
2424 basereflect "github.com/cosmos72/gomacro/base/reflect"
2525 interp "github.com/cosmos72/gomacro/fast"
26+ mp "github.com/cosmos72/gomacro/go/parser"
2627 "github.com/cosmos72/gomacro/xreflect"
2728
2829 // compile and link files generated in imports/
@@ -95,6 +96,12 @@ type shutdownReply struct {
9596 Restart bool `json:"restart"`
9697}
9798
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+
98105const (
99106 kernelStarting = "starting"
100107 kernelBusy = "busy"
@@ -326,6 +333,10 @@ func (kernel *Kernel) handleShellMsg(receipt msgReceipt) {
326333 if err := sendKernelInfo (receipt ); err != nil {
327334 log .Fatal (err )
328335 }
336+ case "is_complete_request" :
337+ if err := kernel .handleIsCompleteRequest (receipt ); err != nil {
338+ log .Fatal (err )
339+ }
329340 case "complete_request" :
330341 if err := handleCompleteRequest (ir , receipt ); err != nil {
331342 log .Fatal (err )
@@ -362,6 +373,42 @@ func sendKernelInfo(receipt msgReceipt) error {
362373 )
363374}
364375
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+
365412// handleExecuteRequest runs code from an execute_request method,
366413// and sends the various reply messages.
367414func (kernel * Kernel ) handleExecuteRequest (receipt msgReceipt ) error {
0 commit comments