File: typeparams_test.go

package info (click to toggle)
golang-golang-x-tools 1%3A0.5.0%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bookworm-backports
  • size: 16,592 kB
  • sloc: javascript: 2,011; asm: 1,635; sh: 192; yacc: 155; makefile: 52; ansic: 8
file content (68 lines) | stat: -rw-r--r-- 1,747 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// Copyright 2021 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.

//go:build go1.18
// +build go1.18

package typeparams_test

import (
	"go/ast"
	"go/importer"
	"go/parser"
	"go/token"
	"go/types"
	"strings"
	"testing"

	"golang.org/x/tools/internal/apidiff"
	"golang.org/x/tools/internal/testenv"
)

func TestAPIConsistency(t *testing.T) {
	testenv.NeedsGoBuild(t) // This is a lie. We actually need the source code.

	// The packages below exclude enabled_*.go, as typeparams.Enabled is
	// permitted to change between versions.
	old := typeCheck(t, []string{"common.go", "typeparams_go117.go"})
	new := typeCheck(t, []string{"common.go", "typeparams_go118.go"})

	report := apidiff.Changes(old, new)

	// Temporarily ignore API diff related to Environment, so that we can use a
	// transient alias in go/types to allow renaming this type without ever
	// breaking the x/tools builder.
	// TODO(rfindley): remove this
	var filteredChanges []apidiff.Change
	for _, change := range report.Changes {
		if strings.Contains(change.Message, "Environment") {
			continue
		}
		filteredChanges = append(filteredChanges, change)
	}
	report.Changes = filteredChanges
	if len(report.Changes) > 0 {
		t.Errorf("API diff:\n%s", report)
	}
}

func typeCheck(t *testing.T, filenames []string) *types.Package {
	fset := token.NewFileSet()
	var files []*ast.File
	for _, name := range filenames {
		f, err := parser.ParseFile(fset, name, nil, 0)
		if err != nil {
			t.Fatal(err)
		}
		files = append(files, f)
	}
	conf := types.Config{
		Importer: importer.Default(),
	}
	pkg, err := conf.Check("", fset, files, nil)
	if err != nil {
		t.Fatal(err)
	}
	return pkg
}