mirror of
https://github.com/dutchcoders/transfer.sh.git
synced 2024-12-11 13:20:19 +01:00
82 lines
2.5 KiB
Go
82 lines
2.5 KiB
Go
|
// Copyright 2013 The Go Authors. All rights reserved.
|
||
|
//
|
||
|
// Use of this source code is governed by a BSD-style
|
||
|
// license that can be found in the LICENSE file or at
|
||
|
// https://developers.google.com/open-source/licenses/bsd.
|
||
|
|
||
|
package doc
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"go/ast"
|
||
|
"go/token"
|
||
|
"strconv"
|
||
|
"strings"
|
||
|
|
||
|
"github.com/golang/gddo/gosrc"
|
||
|
)
|
||
|
|
||
|
// This list of deprecated exports is used to find code that has not been
|
||
|
// updated for Go 1.
|
||
|
var deprecatedExports = map[string][]string{
|
||
|
`"bytes"`: {"Add"},
|
||
|
`"crypto/aes"`: {"Cipher"},
|
||
|
`"crypto/hmac"`: {"NewSHA1", "NewSHA256"},
|
||
|
`"crypto/rand"`: {"Seed"},
|
||
|
`"encoding/json"`: {"MarshalForHTML"},
|
||
|
`"encoding/xml"`: {"Marshaler", "NewParser", "Parser"},
|
||
|
`"html"`: {"NewTokenizer", "Parse"},
|
||
|
`"image"`: {"Color", "NRGBAColor", "RGBAColor"},
|
||
|
`"io"`: {"Copyn"},
|
||
|
`"log"`: {"Exitf"},
|
||
|
`"math"`: {"Fabs", "Fmax", "Fmod"},
|
||
|
`"os"`: {"Envs", "Error", "Getenverror", "NewError", "Time", "UnixSignal", "Wait"},
|
||
|
`"reflect"`: {"MapValue", "Typeof"},
|
||
|
`"runtime"`: {"UpdateMemStats"},
|
||
|
`"strconv"`: {"Atob", "Atof32", "Atof64", "AtofN", "Atoi64", "Atoui", "Atoui64", "Btoui64", "Ftoa64", "Itoa64", "Uitoa", "Uitoa64"},
|
||
|
`"time"`: {"LocalTime", "Nanoseconds", "NanosecondsToLocalTime", "Seconds", "SecondsToLocalTime", "SecondsToUTC"},
|
||
|
`"unicode/utf8"`: {"NewString"},
|
||
|
}
|
||
|
|
||
|
type vetVisitor struct {
|
||
|
errors map[string]token.Pos
|
||
|
}
|
||
|
|
||
|
func (v *vetVisitor) Visit(n ast.Node) ast.Visitor {
|
||
|
if sel, ok := n.(*ast.SelectorExpr); ok {
|
||
|
if x, _ := sel.X.(*ast.Ident); x != nil {
|
||
|
if obj := x.Obj; obj != nil && obj.Kind == ast.Pkg {
|
||
|
if spec, _ := obj.Decl.(*ast.ImportSpec); spec != nil {
|
||
|
for _, name := range deprecatedExports[spec.Path.Value] {
|
||
|
if name == sel.Sel.Name {
|
||
|
v.errors[fmt.Sprintf("%s.%s not found", spec.Path.Value, sel.Sel.Name)] = n.Pos()
|
||
|
return nil
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return v
|
||
|
}
|
||
|
|
||
|
func (b *builder) vetPackage(pkg *Package, apkg *ast.Package) {
|
||
|
errors := make(map[string]token.Pos)
|
||
|
for _, file := range apkg.Files {
|
||
|
for _, is := range file.Imports {
|
||
|
importPath, _ := strconv.Unquote(is.Path.Value)
|
||
|
if !gosrc.IsValidPath(importPath) &&
|
||
|
!strings.HasPrefix(importPath, "exp/") &&
|
||
|
!strings.HasPrefix(importPath, "appengine") {
|
||
|
errors[fmt.Sprintf("Unrecognized import path %q", importPath)] = is.Pos()
|
||
|
}
|
||
|
}
|
||
|
v := vetVisitor{errors: errors}
|
||
|
ast.Walk(&v, file)
|
||
|
}
|
||
|
for message, pos := range errors {
|
||
|
pkg.Errors = append(pkg.Errors,
|
||
|
fmt.Sprintf("%s (%s)", message, b.fset.Position(pos)))
|
||
|
}
|
||
|
}
|