blob: 1055dcd73341f7ce2d1598291d0c1fd16301086d [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package gotidy
import (
"fmt"
"go/scanner"
"go/token"
"strings"
)
var (
copyrightTemplate = strings.TrimSpace(`
// Copyright %d The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.`)
)
// AddCopyrightHeader inserts the Fuchsia copyright header into a file if no copyright
// header is present.
type AddCopyrightHeader struct {
Year int
}
func (t *AddCopyrightHeader) Tidy(input []byte) ([]byte, error) {
var s scanner.Scanner
fset := token.NewFileSet()
file := fset.AddFile("", fset.Base(), len(input)) // register file
s.Init(file, input, nil /* no error handler */, scanner.ScanComments)
for {
pos, tok, literal := s.Scan()
// We scanned the entire file without finding the header.
if tok == token.EOF {
return t.addCopyrightHeader(input)
}
// We moved past the start of the file. It's missing the header.
if tok == token.COMMENT && pos > 1 {
return t.addCopyrightHeader(input)
}
if tok == token.COMMENT {
// The file starts with a comment and it has the header
if strings.HasPrefix(strings.ToLower(literal), "// copyright") {
return input, nil
}
return t.addCopyrightHeader(input)
}
}
}
func (t *AddCopyrightHeader) addCopyrightHeader(input []byte) ([]byte, error) {
header := fmt.Sprintf(copyrightTemplate, t.Year)
return []byte(header + "\n\n" + string(input)), nil
}