Skip to content

Commit

Permalink
Merge pull request #230 from mackong/fix_is_complete_request
Browse files Browse the repository at this point in the history
support is_complete_request
  • Loading branch information
cosmos72 authored Apr 13, 2021
2 parents 49b19d3 + 35242e9 commit a1c0fea
Showing 1 changed file with 47 additions and 0 deletions.
47 changes: 47 additions & 0 deletions kernel.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
"github.com/cosmos72/gomacro/base"
basereflect "github.com/cosmos72/gomacro/base/reflect"
interp "github.com/cosmos72/gomacro/fast"
mp "github.com/cosmos72/gomacro/go/parser"
"github.com/cosmos72/gomacro/xreflect"

// compile and link files generated in imports/
Expand Down Expand Up @@ -95,6 +96,12 @@ type shutdownReply struct {
Restart bool `json:"restart"`
}

// isCompleteReply holds information about the statement is complete or not, for is_complete_reply messages.
type isCompleteReply struct {
Status string `json:"status"`
Indent string `json:"indent"`
}

const (
kernelStarting = "starting"
kernelBusy = "busy"
Expand Down Expand Up @@ -326,6 +333,10 @@ func (kernel *Kernel) handleShellMsg(receipt msgReceipt) {
if err := sendKernelInfo(receipt); err != nil {
log.Fatal(err)
}
case "is_complete_request":
if err := kernel.handleIsCompleteRequest(receipt); err != nil {
log.Fatal(err)
}
case "complete_request":
if err := handleCompleteRequest(ir, receipt); err != nil {
log.Fatal(err)
Expand Down Expand Up @@ -362,6 +373,42 @@ func sendKernelInfo(receipt msgReceipt) error {
)
}

// checkComplete checks whether the `code` is complete or not.
func checkComplete(code string, ir *interp.Interp) (status, indent string) {
status, indent = "incomplete", ""

if len(code) == 0 {
return
}

var parser mp.Parser
g := ir.Comp
parser.Configure(g.ParserMode, g.MacroChar)
parser.Init(g.Fileset, g.Filepath, g.Line, []byte(code))

_, err := parser.Parse()
if err == nil {
status = "complete"
}
return
}

// handleIsCompleteRequest sends a is_complete_reply message.
func (kernel *Kernel) handleIsCompleteRequest(receipt msgReceipt) error {

// Extract the data from the request.
reqcontent := receipt.Msg.Content.(map[string]interface{})
code := reqcontent["code"].(string)
status, indent := checkComplete(code, kernel.ir)

return receipt.Reply("is_complete_reply",
isCompleteReply{
Status: status,
Indent: indent,
},
)
}

// handleExecuteRequest runs code from an execute_request method,
// and sends the various reply messages.
func (kernel *Kernel) handleExecuteRequest(receipt msgReceipt) error {
Expand Down

0 comments on commit a1c0fea

Please sign in to comment.