semicolon continuation
This commit is contained in:
parent
f8d83ee5b7
commit
e251d499d6
@ -1 +1 @@
|
||||
1.12.0 15
|
||||
1.12.0 51
|
||||
|
46
main.go
46
main.go
@ -85,11 +85,15 @@ func goInteractiveReadline(opt *Options, ctx expr.ExprContext, r io.Reader) {
|
||||
fmt.Print(intro)
|
||||
rl.SetPrompt(mainPrompt)
|
||||
for line, err := rl.ReadLine(); err == nil; line, err = rl.ReadLine() {
|
||||
if len(line) > 0 && line[len(line)-1] == '\\' {
|
||||
sb.WriteString(line[0 : len(line)-1])
|
||||
if continuation(&sb, line) {
|
||||
rl.SetPrompt(contPrompt)
|
||||
continue
|
||||
}
|
||||
// if len(line) > 0 && line[len(line)-1] == '\\' {
|
||||
// sb.WriteString(line[0 : len(line)-1])
|
||||
// rl.SetPrompt(contPrompt)
|
||||
// continue
|
||||
// }
|
||||
rl.SetPrompt(mainPrompt)
|
||||
sb.WriteString(line)
|
||||
source := strings.TrimSpace(sb.String())
|
||||
@ -116,11 +120,14 @@ func goInteractive(opt *Options, ctx expr.ExprContext, r io.Reader) {
|
||||
fmt.Print(mainPrompt)
|
||||
reader := bufio.NewReaderSize(r, 1024)
|
||||
for line, err := reader.ReadString('\n'); err == nil && line != "exit\n"; line, err = reader.ReadString('\n') {
|
||||
if strings.HasSuffix(line, "\\\n") {
|
||||
sb.WriteString(line[0 : len(line)-2])
|
||||
fmt.Print(contPrompt)
|
||||
if continuation(&sb, line) {
|
||||
continue
|
||||
}
|
||||
// if strings.HasSuffix(line, "\\\n") {
|
||||
// sb.WriteString(line[0 : len(line)-2])
|
||||
// fmt.Print(contPrompt)
|
||||
// continue
|
||||
// }
|
||||
sb.WriteString(line)
|
||||
source := strings.TrimSpace(sb.String())
|
||||
// fmt.Printf("source=%q\n", source)
|
||||
@ -140,12 +147,37 @@ func goInteractive(opt *Options, ctx expr.ExprContext, r io.Reader) {
|
||||
fmt.Println()
|
||||
}
|
||||
|
||||
func continuation(sb *strings.Builder, line string) (cont bool) {
|
||||
line = strings.TrimSpace(line)
|
||||
if strings.HasSuffix(line, "\\") {
|
||||
sb.WriteString(line[0 : len(line)-1])
|
||||
cont = true
|
||||
} else if strings.HasSuffix(line, ";") {
|
||||
sb.WriteString(line)
|
||||
cont = true
|
||||
} else if len(line) > 0 {
|
||||
if expr.StringEndsWithOperator(line) {
|
||||
sb.WriteString(line)
|
||||
cont = true
|
||||
} else {
|
||||
fullInput := sb.String() + line
|
||||
if strings.Count(fullInput, "(") > strings.Count(fullInput, ")") ||
|
||||
strings.Count(fullInput, "[") > strings.Count(fullInput, "]") ||
|
||||
strings.Count(fullInput, "{") > strings.Count(fullInput, "}") {
|
||||
sb.WriteString(line)
|
||||
cont = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func goBatch(opt *Options, ctx expr.ExprContext, r io.Reader) {
|
||||
var sb strings.Builder
|
||||
reader := bufio.NewReaderSize(r, 1024)
|
||||
for line, err := reader.ReadString('\n'); err == nil && line != "exit\n"; line, err = reader.ReadString('\n') {
|
||||
if strings.HasSuffix(line, "\\\n") {
|
||||
sb.WriteString(line[0 : len(line)-2])
|
||||
if continuation(&sb, line) {
|
||||
continue
|
||||
}
|
||||
sb.WriteString(line)
|
||||
|
Loading…
Reference in New Issue
Block a user