On Monday, 12 December 2016 12:22:51 UTC-5, Jan Mercl wrote:
>
> On Mon, Dec 12, 2016 at 6:20 PM <aleha...@gmail.com <javascript:>> wrote:
>
> > I realize that obviously the Go compiler does it, I was wondering if 
> there is a good API for that I can use, like the ast package?
>
> See https://golang.org/pkg/go/types/
>

You can use go/types directly if you just want to type-check a single file, 
but all but the most trivial Go programs import other packages.  You have 
three choices for how to handle import declarations:
(1) ignore them
(2) load type information for exported packages from .a files produced by 
the compiler
(3) load the entire program from source.

The vet command takes approach #1, which of course means that it has 
incomplete information.  To use approach #2, you need to use the 
go/importer package, and furthermore rely on all the relevant .a files 
being up to date (which they rarely are).  For approach #3, you need to use 
the golang.org/x/tools/go/loader package, which loads, parses, and 
type-checks all the source code for a multi-package program laid out 
according to 'go build' conventions.  Look at any of several tools in that 
repository for an example of how to put the pieces together.  For example, 
with no flags, ssadump simply type-checks the specified packages:

    $ go get golang.org/x/tools/cmd/ssadump
    $ cat a.go
    package main
    var x int = "string"
    $ ssadump a.go
    a.go:2:13: cannot convert "string" (untyped string constant) to int

There's an in-depth tutorial for the go/types package here: 
https://github.com/golang/example/tree/master/gotypes

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to