cgo: fix line/column reporting in syntax error messages
Этот коммит содержится в:
родитель
bf9dab36f7
коммит
138add2b96
5 изменённых файлов: 29 добавлений и 13 удалений
22
cgo/cgo.go
22
cgo/cgo.go
|
@ -391,7 +391,10 @@ func Process(files []*ast.File, dir string, fset *token.FileSet, cflags []string
|
||||||
|
|
||||||
// Process all CGo imports.
|
// Process all CGo imports.
|
||||||
for _, genDecl := range statements {
|
for _, genDecl := range statements {
|
||||||
cgoComment := genDecl.Doc.Text()
|
if genDecl.Doc == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
cgoComment := getCommentText(genDecl.Doc)
|
||||||
|
|
||||||
pos := genDecl.Pos()
|
pos := genDecl.Pos()
|
||||||
if genDecl.Doc != nil {
|
if genDecl.Doc != nil {
|
||||||
|
@ -1402,3 +1405,20 @@ func renameFieldName(fieldList *ast.FieldList, name string) {
|
||||||
renameFieldName(fieldList, "_"+name)
|
renameFieldName(fieldList, "_"+name)
|
||||||
ident.Name = "_" + ident.Name
|
ident.Name = "_" + ident.Name
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// getCommentText returns the raw text of an *ast.CommentGroup. It is similar to
|
||||||
|
// the Text() method but differs in that it doesn't strip anything and tries to
|
||||||
|
// keep all offsets correct by adding spaces and newlines where necessary.
|
||||||
|
func getCommentText(g *ast.CommentGroup) string {
|
||||||
|
var text string
|
||||||
|
for _, comment := range g.List {
|
||||||
|
c := comment.Text
|
||||||
|
if c[1] == '/' { /* comment */
|
||||||
|
c = " " + c[2:]
|
||||||
|
} else { // comment
|
||||||
|
c = " " + c[2:len(c)-2]
|
||||||
|
}
|
||||||
|
text += c + "\n"
|
||||||
|
}
|
||||||
|
return text
|
||||||
|
}
|
||||||
|
|
|
@ -81,7 +81,7 @@ func (p *cgoPackage) parseFragment(fragment string, cflags []string, posFilename
|
||||||
defer C.free(unsafe.Pointer(filenameC))
|
defer C.free(unsafe.Pointer(filenameC))
|
||||||
|
|
||||||
// fix up error locations
|
// fix up error locations
|
||||||
fragment = fmt.Sprintf("# %d %#v\n", posLine+1, posFilename) + fragment
|
fragment = fmt.Sprintf("# %d %#v\n", posLine, posFilename) + fragment
|
||||||
|
|
||||||
fragmentC := C.CString(fragment)
|
fragmentC := C.CString(fragment)
|
||||||
defer C.free(unsafe.Pointer(fragmentC))
|
defer C.free(unsafe.Pointer(fragmentC))
|
||||||
|
|
11
cgo/testdata/basic.out.go
предоставленный
11
cgo/testdata/basic.out.go
предоставленный
|
@ -13,14 +13,3 @@ type C.uint32_t = uint32
|
||||||
type C.uint64_t = uint64
|
type C.uint64_t = uint64
|
||||||
type C.uint8_t = uint8
|
type C.uint8_t = uint8
|
||||||
type C.uintptr_t = uintptr
|
type C.uintptr_t = uintptr
|
||||||
type C.char uint8
|
|
||||||
type C.int int32
|
|
||||||
type C.long int32
|
|
||||||
type C.longlong int64
|
|
||||||
type C.schar int8
|
|
||||||
type C.short int16
|
|
||||||
type C.uchar uint8
|
|
||||||
type C.uint uint32
|
|
||||||
type C.ulong uint32
|
|
||||||
type C.ulonglong uint64
|
|
||||||
type C.ushort uint16
|
|
||||||
|
|
5
cgo/testdata/errors.go
предоставленный
5
cgo/testdata/errors.go
предоставленный
|
@ -14,6 +14,9 @@ typedef someType noType; // undefined type
|
||||||
#define SOME_CONST_2 6) // const not used (so no error)
|
#define SOME_CONST_2 6) // const not used (so no error)
|
||||||
#define SOME_CONST_3 1234 // const too large for byte
|
#define SOME_CONST_3 1234 // const too large for byte
|
||||||
*/
|
*/
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// #define SOME_CONST_4 8) // after some empty lines
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
// Make sure that errors for the following lines won't change with future
|
// Make sure that errors for the following lines won't change with future
|
||||||
|
@ -30,4 +33,6 @@ var (
|
||||||
_ = C.SOME_CONST_1
|
_ = C.SOME_CONST_1
|
||||||
|
|
||||||
_ byte = C.SOME_CONST_3
|
_ byte = C.SOME_CONST_3
|
||||||
|
|
||||||
|
_ = C.SOME_CONST_4
|
||||||
)
|
)
|
||||||
|
|
2
cgo/testdata/errors.out.go
предоставленный
2
cgo/testdata/errors.out.go
предоставленный
|
@ -2,12 +2,14 @@
|
||||||
// testdata/errors.go:4:2: warning: some warning
|
// testdata/errors.go:4:2: warning: some warning
|
||||||
// testdata/errors.go:11:9: error: unknown type name 'someType'
|
// testdata/errors.go:11:9: error: unknown type name 'someType'
|
||||||
// testdata/errors.go:13:23: unexpected token ), expected end of expression
|
// testdata/errors.go:13:23: unexpected token ), expected end of expression
|
||||||
|
// testdata/errors.go:19:26: unexpected token ), expected end of expression
|
||||||
|
|
||||||
// Type checking errors after CGo processing:
|
// Type checking errors after CGo processing:
|
||||||
// testdata/errors.go:102: cannot use 2 << 10 (untyped int constant 2048) as uint8 value in variable declaration (overflows)
|
// testdata/errors.go:102: cannot use 2 << 10 (untyped int constant 2048) as uint8 value in variable declaration (overflows)
|
||||||
// testdata/errors.go:105: unknown field z in struct literal
|
// testdata/errors.go:105: unknown field z in struct literal
|
||||||
// testdata/errors.go:108: undeclared name: C.SOME_CONST_1
|
// testdata/errors.go:108: undeclared name: C.SOME_CONST_1
|
||||||
// testdata/errors.go:110: cannot use C.SOME_CONST_3 (untyped int constant 1234) as byte value in variable declaration (overflows)
|
// testdata/errors.go:110: cannot use C.SOME_CONST_3 (untyped int constant 1234) as byte value in variable declaration (overflows)
|
||||||
|
// testdata/errors.go:112: undeclared name: C.SOME_CONST_4
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче