mirror of
				https://github.com/caddyserver/caddy.git
				synced 2025-11-04 18:17:08 +08:00 
			
		
		
		
	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
This commit is contained in:
		@ -106,7 +106,7 @@ func (d *Dispenser) nextOnSameLine() bool {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	curr := d.tokens[d.cursor]
 | 
						curr := d.tokens[d.cursor]
 | 
				
			||||||
	next := d.tokens[d.cursor+1]
 | 
						next := d.tokens[d.cursor+1]
 | 
				
			||||||
	if curr.File == next.File && curr.Line+curr.NumLineBreaks() == next.Line {
 | 
						if !isNextOnNewLine(curr, next) {
 | 
				
			||||||
		d.cursor++
 | 
							d.cursor++
 | 
				
			||||||
		return true
 | 
							return true
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -127,7 +127,7 @@ func (d *Dispenser) NextLine() bool {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	curr := d.tokens[d.cursor]
 | 
						curr := d.tokens[d.cursor]
 | 
				
			||||||
	next := d.tokens[d.cursor+1]
 | 
						next := d.tokens[d.cursor+1]
 | 
				
			||||||
	if curr.File != next.File || curr.Line+curr.NumLineBreaks() < next.Line {
 | 
						if isNextOnNewLine(curr, next) {
 | 
				
			||||||
		d.cursor++
 | 
							d.cursor++
 | 
				
			||||||
		return true
 | 
							return true
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -464,17 +464,7 @@ func (d *Dispenser) isNewLine() bool {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	prev := d.tokens[d.cursor-1]
 | 
						prev := d.tokens[d.cursor-1]
 | 
				
			||||||
	curr := d.tokens[d.cursor]
 | 
						curr := d.tokens[d.cursor]
 | 
				
			||||||
 | 
						return isNextOnNewLine(prev, curr)
 | 
				
			||||||
	// 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
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// isNextOnNewLine determines whether the current token is on a different
 | 
					// isNextOnNewLine determines whether the current token is on a different
 | 
				
			||||||
@ -490,15 +480,5 @@ func (d *Dispenser) isNextOnNewLine() bool {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	curr := d.tokens[d.cursor]
 | 
						curr := d.tokens[d.cursor]
 | 
				
			||||||
	next := d.tokens[d.cursor+1]
 | 
						next := d.tokens[d.cursor+1]
 | 
				
			||||||
 | 
						return isNextOnNewLine(curr, next)
 | 
				
			||||||
	// 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
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -338,3 +338,28 @@ func (t Token) NumLineBreaks() int {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var heredocMarkerRegexp = regexp.MustCompile("^[A-Za-z0-9_-]+$")
 | 
					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
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -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.
 | 
							// format, won't check for nesting correctness or any other error, that's what parser does.
 | 
				
			||||||
		if !maybeSnippet && nesting == 0 {
 | 
							if !maybeSnippet && nesting == 0 {
 | 
				
			||||||
			// first of the line
 | 
								// 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
 | 
									index = 0
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				index++
 | 
									index++
 | 
				
			||||||
 | 
				
			|||||||
@ -277,3 +277,76 @@ func TestImportErrorLine(t *testing.T) {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestNestedImport(t *testing.T) {
 | 
				
			||||||
 | 
						for i, tc := range []struct {
 | 
				
			||||||
 | 
							input     string
 | 
				
			||||||
 | 
							errorFunc func(err error) bool
 | 
				
			||||||
 | 
						}{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								input: `(t1) {
 | 
				
			||||||
 | 
											respond {args[0]} {args[1]}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										
 | 
				
			||||||
 | 
										(t2) {
 | 
				
			||||||
 | 
											import t1 {args[0]} 202
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										
 | 
				
			||||||
 | 
										:8080 {
 | 
				
			||||||
 | 
											handle {
 | 
				
			||||||
 | 
												import t2 "foobar"
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}`,
 | 
				
			||||||
 | 
								errorFunc: func(err error) bool {
 | 
				
			||||||
 | 
									return err == nil
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								input: `(t1) {
 | 
				
			||||||
 | 
											respond {args[:]}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										
 | 
				
			||||||
 | 
										(t2) {
 | 
				
			||||||
 | 
											import t1 {args[0]} {args[1]}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										
 | 
				
			||||||
 | 
										:8080 {
 | 
				
			||||||
 | 
											handle {
 | 
				
			||||||
 | 
												import t2 "foobar" 202
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}`,
 | 
				
			||||||
 | 
								errorFunc: func(err error) bool {
 | 
				
			||||||
 | 
									return err == nil
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								input: `(t1) {
 | 
				
			||||||
 | 
											respond {args[0]} {args[1]}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										
 | 
				
			||||||
 | 
										(t2) {
 | 
				
			||||||
 | 
											import t1 {args[:]}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										
 | 
				
			||||||
 | 
										:8080 {
 | 
				
			||||||
 | 
											handle {
 | 
				
			||||||
 | 
												import t2 "foobar" 202
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}`,
 | 
				
			||||||
 | 
								errorFunc: func(err error) bool {
 | 
				
			||||||
 | 
									return err == nil
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						} {
 | 
				
			||||||
 | 
							adapter := caddyfile.Adapter{
 | 
				
			||||||
 | 
								ServerType: ServerType{},
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							_, _, err := adapter.Adapt([]byte(tc.input), nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if !tc.errorFunc(err) {
 | 
				
			||||||
 | 
								t.Errorf("Test %d error expectation failed, got %s", i, err)
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user