I converted my code to x/tools/go/packages
<https://pkg.go.dev/golang.org/x/tools@v0.1.7/go/packages> and while it did
solve the problem it's VERY slow in comparison.

I have a set of 21 tests operating on a single package which has at most
two very basic types, no imports and using go/parser
<https://pkg.go.dev/go/parser> they take 0.011s but with go/packages
<https://pkg.go.dev/golang.org/x/tools@v0.1.7/go/packages> that increases
to 3.548s a 300x slow down.

I'm setting a basic mode: packages.NeedName | packages.NeedSyntax

The package.Load call takes ~220ms whereas ast.NewPackage only takes 2.7µs.

As the resulting ast.File's are pretty much the same, I'm wondering if for
my use case packages.Load is doing way more than I need?

Another downside is for tests run in a temporary directory outside of the
package space package.Load fails with:
directory /tmp/tests76985775 outside available modules

I fixed it by calling ioutil.TempDir with "." but that's not ideal.

Thoughts?

On Tue, 12 Oct 2021 at 13:42, Steven Hartland <ste...@multiplay.co.uk>
wrote:

> Thanks David, much appreciated, I will have a look at both.
>
> When migrating from go/ast to go/types did you hit anything of note I
> should look out for?
>
> On Mon, 11 Oct 2021 at 17:06, David Finkel <david.fin...@gmail.com> wrote:
>
>>
>>
>> On Mon, Oct 11, 2021 at 5:48 AM Steven Hartland <ste...@multiplay.co.uk>
>> wrote:
>>
>>> If the ast.Files passed to ast.NewPackage includes built in types such
>>> as int it returns an error e.g.
>>> file1.go:5:6: undeclared name: int
>>>
>>> Is there a way to prevent that?
>>>
>>
>> Generally, I always add the `builtin` package to the list of packages I'm
>> parsing.
>> I wrote a little library for exactly this kind of package loading a few
>> years ago:
>> https://gitlab.com/dfinkel/goastpkg/-/blob/master/go_ast_parser.go
>> (https://pkg.go.dev/golang.spin-2.net/astpkg)
>>
>>>
>>> Playground example: https://play.golang.org/p/Yg30TTzoLHP
>>>
>>> My goal is to take multiple files, resolve inter file dependencies e.g.
>>> a type referencing another type in a different file and process the
>>> resulting ast.Files. So if there is a better way to achieve this I'm all
>>> ears.
>>>
>>
>> In general, I've stopped using the `go/ast` internal references as much
>> and have started using resolved `go/types` references as they're more
>> reliable and better-specified.
>> (golang.org/x/tools/go/packages
>> <https://pkg.go.dev/golang.org/x/tools@v0.1.7/go/packages> has a
>> LoadMode flag for generating `go/types.Info` (NeedTypesInfo
>> <https://pkg.go.dev/golang.org/x/tools@v0.1.7/go/packages#NeedTypesInfo>
>> ))
>>
>>>
>>>    Regards
>>>    Steve
>>>
>>> --
>>> 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.
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/golang-nuts/CAHEMsqbJoJxuo3c-mofMtzXXJhYCzV2skW2ZB3ZPY6WtA8%2BxHw%40mail.gmail.com
>>> <https://groups.google.com/d/msgid/golang-nuts/CAHEMsqbJoJxuo3c-mofMtzXXJhYCzV2skW2ZB3ZPY6WtA8%2BxHw%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>>

-- 
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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAHEMsqYMSBUfuOUvptv6UrvBFTwFxjOhJZ5sMN-omOx5ESL5hw%40mail.gmail.com.

Reply via email to