diff options
author | WeidiDeng <[email protected]> | 2023-07-13 04:32:22 +0800 |
---|---|---|
committer | GitHub <[email protected]> | 2023-07-12 14:32:22 -0600 |
commit | bbe1952a59a196b7598c6488beb770ec38a70dfc (patch) | |
tree | 24b670b7a4c6c4293dda378a0def0f9706a9df1a /caddyconfig/caddyfile | |
parent | 0e2c7e1d35b287fc0e56d6db2951f791e09b5a37 (diff) | |
download | caddy-bbe1952a59a196b7598c6488beb770ec38a70dfc.tar.gz caddy-bbe1952a59a196b7598c6488beb770ec38a70dfc.zip |
caddyfile: Fix comparing if two tokens are on the same line (#5626)
* fix comparing if two tokens are on the same line
* compare tokens from copies when importing
Diffstat (limited to 'caddyconfig/caddyfile')
-rw-r--r-- | caddyconfig/caddyfile/dispenser.go | 28 | ||||
-rw-r--r-- | caddyconfig/caddyfile/lexer.go | 25 | ||||
-rw-r--r-- | caddyconfig/caddyfile/parse.go | 2 |
3 files changed, 30 insertions, 25 deletions
diff --git a/caddyconfig/caddyfile/dispenser.go b/caddyconfig/caddyfile/dispenser.go index 580de4a9b..6c33f4fe6 100644 --- a/caddyconfig/caddyfile/dispenser.go +++ b/caddyconfig/caddyfile/dispenser.go @@ -106,7 +106,7 @@ func (d *Dispenser) nextOnSameLine() bool { } curr := d.tokens[d.cursor] next := d.tokens[d.cursor+1] - if curr.File == next.File && curr.Line+curr.NumLineBreaks() == next.Line { + if !isNextOnNewLine(curr, next) { d.cursor++ return true } @@ -127,7 +127,7 @@ func (d *Dispenser) NextLine() bool { } curr := d.tokens[d.cursor] next := d.tokens[d.cursor+1] - if curr.File != next.File || curr.Line+curr.NumLineBreaks() < next.Line { + if isNextOnNewLine(curr, next) { d.cursor++ return true } @@ -464,17 +464,7 @@ func (d *Dispenser) isNewLine() bool { prev := d.tokens[d.cursor-1] curr := d.tokens[d.cursor] - - // If the previous token is from a different file, - // we can assume it's from a different line - if prev.File != curr.File { - return true - } - - // If the previous token (incl line breaks) ends - // on a line earlier than the current token, - // then the current token is on a new line - return prev.Line+prev.NumLineBreaks() < curr.Line + return isNextOnNewLine(prev, curr) } // isNextOnNewLine determines whether the current token is on a different @@ -490,15 +480,5 @@ func (d *Dispenser) isNextOnNewLine() bool { curr := d.tokens[d.cursor] next := d.tokens[d.cursor+1] - - // If the next token is from a different file, - // we can assume it's from a different line - if curr.File != next.File { - return true - } - - // If the current token (incl line breaks) ends - // on a line earlier than the next token, - // then the next token is on a new line - return curr.Line+curr.NumLineBreaks() < next.Line + return isNextOnNewLine(curr, next) } diff --git a/caddyconfig/caddyfile/lexer.go b/caddyconfig/caddyfile/lexer.go index d1fbfbb42..47aaa0314 100644 --- a/caddyconfig/caddyfile/lexer.go +++ b/caddyconfig/caddyfile/lexer.go @@ -338,3 +338,28 @@ func (t Token) NumLineBreaks() int { } var heredocMarkerRegexp = regexp.MustCompile("^[A-Za-z0-9_-]+$") + +// isNextOnNewLine tests whether t2 is on a different line from t1 +func isNextOnNewLine(t1, t2 Token) bool { + // If the second token is from a different file, + // we can assume it's from a different line + if t1.File != t2.File { + return true + } + + // If the second token is from a different import chain, + // we can assume it's from a different line + if len(t1.imports) != len(t2.imports) { + return true + } + for i, im := range t1.imports { + if im != t2.imports[i] { + return true + } + } + + // If the first token (incl line breaks) ends + // on a line earlier than the next token, + // then the second token is on a new line + return t1.Line+t1.NumLineBreaks() < t2.Line +} diff --git a/caddyconfig/caddyfile/parse.go b/caddyconfig/caddyfile/parse.go index 81181a473..0a1a9e7b1 100644 --- a/caddyconfig/caddyfile/parse.go +++ b/caddyconfig/caddyfile/parse.go @@ -464,7 +464,7 @@ func (p *parser) doImport(nesting int) error { // format, won't check for nesting correctness or any other error, that's what parser does. if !maybeSnippet && nesting == 0 { // first of the line - if i == 0 || importedTokens[i-1].File != token.File || importedTokens[i-1].Line+importedTokens[i-1].NumLineBreaks() < token.Line { + if i == 0 || isNextOnNewLine(tokensCopy[i-1], token) { index = 0 } else { index++ |