Skip to content

Commit a1c0fea

Browse files
authored
Merge pull request #230 from mackong/fix_is_complete_request
support is_complete_request
2 parents 49b19d3 + 35242e9 commit a1c0fea

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

kernel.go

+47
Original file line numberDiff line numberDiff line change
@@ -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+
98105
const (
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.
367414
func (kernel *Kernel) handleExecuteRequest(receipt msgReceipt) error {

0 commit comments

Comments
 (0)