diff options
author | Bas van Kervel <bas@ethdev.com> | 2016-06-08 18:17:38 +0800 |
---|---|---|
committer | Bas van Kervel <bas@ethdev.com> | 2016-06-08 20:21:52 +0800 |
commit | dbcdf83ed8aca3f0b84d67b944fff2f3a8bc7769 (patch) | |
tree | 7cb07d719fd687d419ac838cccc2ca01f0b14b5a /console/console.go | |
parent | fdd61b83ffe1ac0e3ef0621acbd92dd61df9910d (diff) | |
download | go-tangerine-dbcdf83ed8aca3f0b84d67b944fff2f3a8bc7769.tar.gz go-tangerine-dbcdf83ed8aca3f0b84d67b944fff2f3a8bc7769.tar.zst go-tangerine-dbcdf83ed8aca3f0b84d67b944fff2f3a8bc7769.zip |
console: ignore round and curly brackets in strings when determining indentation level
Diffstat (limited to 'console/console.go')
-rw-r--r-- | console/console.go | 47 |
1 files changed, 45 insertions, 2 deletions
diff --git a/console/console.go b/console/console.go index baa9cf545..9cff8c876 100644 --- a/console/console.go +++ b/console/console.go @@ -330,11 +330,11 @@ func (c *Console) Interactive() { // Append the line to the input and check for multi-line interpretation input += line + "\n" - indents = strings.Count(input, "{") + strings.Count(input, "(") - strings.Count(input, "}") - strings.Count(input, ")") + indents = countIndents(input) if indents <= 0 { prompt = c.prompt } else { - prompt = strings.Repeat("..", indents*2) + " " + prompt = strings.Repeat(".", indents*3) + " " } // If all the needed lines are present, save the command and run if indents <= 0 { @@ -353,6 +353,49 @@ func (c *Console) Interactive() { } } +// countIndents returns the number of identations for the given input. +// In case of invalid input such as var a = } the result can be negative. +func countIndents(input string) int { + var ( + indents = 0 + inString = false + strOpenChar = ' ' // keep track of the string open char to allow var str = "I'm ...."; + charEscaped = false // keep track if the previous char was the '\' char, allow var str = "abc\"def"; + ) + + for _, c := range input { + switch c { + case '\\': + // indicate next char as escaped when in string and previous char isn't escaping this backslash + if !charEscaped && inString { + charEscaped = true + } + case '\'', '"': + if inString && !charEscaped && strOpenChar == c { // end string + inString = false + } else if !inString && !charEscaped { // begin string + inString = true + strOpenChar = c + } + charEscaped = false + case '{', '(': + if !inString { // ignore brackets when in string, allow var str = "a{"; without indenting + indents++ + } + charEscaped = false + case '}', ')': + if !inString { + indents-- + } + charEscaped = false + default: + charEscaped = false + } + } + + return indents +} + // Execute runs the JavaScript file specified as the argument. func (c *Console) Execute(path string) error { return c.jsre.Exec(path) |