// 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. // To avoid a cyclic dependency with go/parser, this file is in a separate package. package ast_test import ( "bytes" "go/ast" "go/format" "go/parser" "go/token" "testing" ) const input = `package p type t1 struct{} type t2 struct{} func f1() {} func f1() {} func f2() {} func (*t1) f1() {} func (t1) f1() {} func (t1) f2() {} func (t2) f1() {} func (t2) f2() {} func (x *t2) f2() {} ` // Calling ast.MergePackageFiles with ast.FilterFuncDuplicates // keeps a duplicate entry with attached documentation in favor // of one without, and it favors duplicate entries appearing // later in the source over ones appearing earlier. This is why // (*t2).f2 is kept and t2.f2 is eliminated in this test case. // const golden = `package p type t1 struct{} type t2 struct{} func f1() {} func f2() {} func (t1) f1() {} func (t1) f2() {} func (t2) f1() {} func (x *t2) f2() {} ` func TestFilterDuplicates(t *testing.T) { // parse input fset := token.NewFileSet() file, err := parser.ParseFile(fset, "", input, 0) if err != nil { t.Fatal(err) } // create package files := map[string]*ast.File{"": file} pkg, err := ast.NewPackage(fset, files, nil, nil) if err != nil { t.Fatal(err) } // filter merged := ast.MergePackageFiles(pkg, ast.FilterFuncDuplicates) // pretty-print var buf bytes.Buffer if err := format.Node(&buf, fset, merged); err != nil { t.Fatal(err) } output := buf.String() if output != golden { t.Errorf("incorrect output:\n%s", output) } }