blob: a274da1ddc5335bf0c2aaa51280725691ec8f3bd [file] [log] [blame]
// Copyright 2024 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.
package p
import (
"go/ast"
"math/big"
)
// case sel pkg have message (examples for general lookup)
// ---------------------------------------------------------------------------------------------------------
// ok x.Foo == Foo
// misspelled x.Foo == FoO type X has no field or method Foo, but does have field FoO
// misspelled x.Foo == foo type X has no field or method Foo, but does have field foo
// misspelled x.Foo == foO type X has no field or method Foo, but does have field foO
//
// misspelled x.foo == Foo type X has no field or method foo, but does have field Foo
// misspelled x.foo == FoO type X has no field or method foo, but does have field FoO
// ok x.foo == foo
// misspelled x.foo == foO type X has no field or method foo, but does have field foO
//
// ok x.Foo != Foo
// misspelled x.Foo != FoO type X has no field or method Foo, but does have field FoO
// unexported x.Foo != foo type X has no field or method Foo, but does have unexported field foo
// missing x.Foo != foO type X has no field or method Foo
//
// misspelled x.foo != Foo type X has no field or method foo, but does have field Foo
// missing x.foo != FoO type X has no field or method foo
// inaccessible x.foo != foo cannot refer to unexported field foo
// missing x.foo != foO type X has no field or method foo
type S struct {
Foo1 int
FoO2 int
foo3 int
foO4 int
}
func _() {
var x S
_ = x.Foo1 // OK
_ = x.Foo2 // ERROR "x.Foo2 undefined (type S has no field or method Foo2, but does have field FoO2)"
_ = x.Foo3 // ERROR "x.Foo3 undefined (type S has no field or method Foo3, but does have field foo3)"
_ = x.Foo4 // ERROR "x.Foo4 undefined (type S has no field or method Foo4, but does have field foO4)"
_ = x.foo1 // ERROR "x.foo1 undefined (type S has no field or method foo1, but does have field Foo1)"
_ = x.foo2 // ERROR "x.foo2 undefined (type S has no field or method foo2, but does have field FoO2)"
_ = x.foo3 // OK
_ = x.foo4 // ERROR "x.foo4 undefined (type S has no field or method foo4, but does have field foO4)"
}
func _() {
_ = S{Foo1: 0} // OK
_ = S{Foo2 /* ERROR "unknown field Foo2 in struct literal of type S, but does have FoO2" */ : 0}
_ = S{Foo3 /* ERROR "unknown field Foo3 in struct literal of type S, but does have foo3" */ : 0}
_ = S{Foo4 /* ERROR "unknown field Foo4 in struct literal of type S, but does have foO4" */ : 0}
_ = S{foo1 /* ERROR "unknown field foo1 in struct literal of type S, but does have Foo1" */ : 0}
_ = S{foo2 /* ERROR "unknown field foo2 in struct literal of type S, but does have FoO2" */ : 0}
_ = S{foo3: 0} // OK
_ = S{foo4 /* ERROR "unknown field foo4 in struct literal of type S, but does have foO4" */ : 0}
}
// The following tests follow the same pattern as above but operate on an imported type instead of S.
// Currently our testing framework doesn't make it easy to define an imported package for testing, so
// instead we use the big.Float and ast.File types as they provide a suitable mix of exported and un-
// exported fields and methods.
func _() {
var x *big.Float
_ = x.Neg // OK
_ = x.NeG // ERROR "x.NeG undefined (type *big.Float has no field or method NeG, but does have method Neg)"
_ = x.Form // ERROR "x.Form undefined (type *big.Float has no field or method Form, but does have unexported field form)"
_ = x.ForM // ERROR "x.ForM undefined (type *big.Float has no field or method ForM)"
_ = x.abs // ERROR "x.abs undefined (type *big.Float has no field or method abs, but does have method Abs)"
_ = x.abS // ERROR "x.abS undefined (type *big.Float has no field or method abS)"
_ = x.form // ERROR "x.form undefined (cannot refer to unexported field form)"
_ = x.forM // ERROR "x.forM undefined (type *big.Float has no field or method forM)"
}
func _() {
_ = ast.File{Name: nil} // OK
_ = ast.File{NamE /* ERROR "unknown field NamE in struct literal of type ast.File, but does have Name" */ : nil}
_ = big.Float{Form /* ERROR "unknown field Form in struct literal of type big.Float, but does have unexported form" */ : 0}
_ = big.Float{ForM /* ERROR "unknown field ForM in struct literal of type big.Float" */ : 0}
_ = ast.File{name /* ERROR "unknown field name in struct literal of type ast.File, but does have Name" */ : nil}
_ = ast.File{namE /* ERROR "unknown field namE in struct literal of type ast.File" */ : nil}
_ = big.Float{form /* ERROR "cannot refer to unexported field form in struct literal of type big.Float" */ : 0}
_ = big.Float{forM /* ERROR "unknown field forM in struct literal of type big.Float" */ : 0}
}