65 lines
1.2 KiB
Go
65 lines
1.2 KiB
Go
package parser
|
|
|
|
import (
|
|
"errors"
|
|
)
|
|
|
|
type diagnoser func(Node) ([]Diagnostic, error)
|
|
|
|
// Diagnostic for template file.
|
|
type Diagnostic struct {
|
|
Message string
|
|
Range Range
|
|
}
|
|
|
|
func walkTemplate(t TemplateFile, f func(Node) bool) {
|
|
for _, n := range t.Nodes {
|
|
hn, ok := n.(HTMLTemplate)
|
|
if !ok {
|
|
continue
|
|
}
|
|
walkNodes(hn.Children, f)
|
|
}
|
|
}
|
|
func walkNodes(t []Node, f func(Node) bool) {
|
|
for _, n := range t {
|
|
if !f(n) {
|
|
continue
|
|
}
|
|
if h, ok := n.(CompositeNode); ok {
|
|
walkNodes(h.ChildNodes(), f)
|
|
}
|
|
}
|
|
}
|
|
|
|
var diagnosers = []diagnoser{
|
|
useOfLegacyCallSyntaxDiagnoser,
|
|
}
|
|
|
|
func Diagnose(t TemplateFile) ([]Diagnostic, error) {
|
|
var diags []Diagnostic
|
|
var errs error
|
|
walkTemplate(t, func(n Node) bool {
|
|
for _, d := range diagnosers {
|
|
diag, err := d(n)
|
|
if err != nil {
|
|
errs = errors.Join(errs, err)
|
|
return false
|
|
}
|
|
diags = append(diags, diag...)
|
|
}
|
|
return true
|
|
})
|
|
return diags, errs
|
|
}
|
|
|
|
func useOfLegacyCallSyntaxDiagnoser(n Node) ([]Diagnostic, error) {
|
|
if c, ok := n.(CallTemplateExpression); ok {
|
|
return []Diagnostic{{
|
|
Message: "`{! foo }` syntax is deprecated. Use `@foo` syntax instead. Run `templ fmt .` to fix all instances.",
|
|
Range: c.Expression.Range,
|
|
}}, nil
|
|
}
|
|
return nil, nil
|
|
}
|