Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

On OSX / VSCode, "Go to Definition" not working for me #163

Closed
joeblew99 opened this issue Dec 29, 2016 · 28 comments
Closed

On OSX / VSCode, "Go to Definition" not working for me #163

joeblew99 opened this issue Dec 29, 2016 · 28 comments

Comments

@joeblew99
Copy link

joeblew99 commented Dec 29, 2016

i am using VSCode on OSX.

i remember reading something about how to get QT golang to work with finding references.
I use VSCode, and when i right click on an object and choose "Go to Definition", nothing happens.
Mhh... Would be nice and make it quicker for me :)

i have the full QT 5.7 installed, rather than using brew.
I think that is one of the prerequisites to have "go to definition" to work ?

Any ideas ?

#90 ?

@joeblew99 joeblew99 changed the title VSCODE and "Go to Definition" not working for me :( On OSX / VSCOD, "Go to Definition" not working for me Dec 29, 2016
@joeblew99 joeblew99 changed the title On OSX / VSCOD, "Go to Definition" not working for me On OSX / VSCode, "Go to Definition" not working for me Dec 29, 2016
@joeblew99
Copy link
Author

It seems that the golang extension for VSCode does "Go to Definition" (using gogetdoc or godef+godoc)

@jordanorelli
Copy link
Contributor

I have this problem, too, but I don't think this is specific to VSCode. I'm using VSCode on Windows and Vim on OSX and I have this problem in both. Both rely on gocode internally, which presumably is choking on the size of the generated code. This isn't specific to this project; I've seen this with other projects, too.

Generally when I'm having this problem, I use "godoc" on the command line. E.g., "godoc github.com/therecipe/qt".

@therecipe
Copy link
Owner

therecipe commented Dec 29, 2016

Yes, code-autocompletion (and so probably definition lookup as well) is a bit buggy in some editors/IDEs.

The auto-completion issues for IntelliJ Idea and Neovim can be solved by editing the plugin settings, like it's documented here: https://github.com/therecipe/qt#code-editor-settings-for-code-completion

So I suspect, that the plugin(s) in VSCode simply timeout while waiting for godef, godoc or gocode

Another idea, would be to use QT_STUB to get smaller *.a archives from go install, so that the tools can work faster and therefore the plugins don't timeout.

But that's just speculation.

@akamensky
Copy link
Contributor

akamensky commented Dec 30, 2016

@therecipe BTW, for IDEA the Custom VM Options is no longer valid... It freezes and chokes very often and indexing breaks half-way through. My settings on IDEA that worked perfectly fine are:

-Xms128m
-Xmx4000m
-XX:ReservedCodeCacheSize=512m
-XX:+UseCompressedOops

That is of course assuming the host has enough RAM. My current host has 8 GB, works quite okay without freezing etc.

@therecipe
Copy link
Owner

@akamensky
Thanks for the info :)
I will update the readme.

@joeblew99
Copy link
Author

I dont want to change to IDEA, and prefer VSCode. I will ask the maintinaer of the go extension to have a look at it.

@joeblew99
Copy link
Author

@therecipe can you see if this is a good idea ?
rogpeppe/godef#50 (comment)

@therecipe
Copy link
Owner

therecipe commented Jan 2, 2017

@joeblew99
It's probably a good workaround, but the potential big problem I see is that there would be like 30% more generated Go code. Beside the problems to get this working with qtmoc and qtminimal.
This makes go install probably even slower and also bumps the 8gb ram usage to 9gb maybe 10gb during the setup (for the widgets package).

edit: also there seems to be an open pr that solves this issue in godef rogpeppe/godef#44

@joeblew99
Copy link
Author

Thanks for the reply.
The golang plugin for VSCode was updated yesterday, so i tried this again.

Now i get typeahead as i type, showing the function call, but not showing the signature variables.
So its slightly better.

For example:
var window = widgets.NewQMainWindow(nil, 0)
window.AcceptDrops()

When i type window., i get the list of functions.

But after i choose AcceptsDrops, i dont get any of the values its expects to be passed in.
Also if i hover over the AcceptsDrops, to try to see the values it expects it just says loading and does nothing.

rogpeppe/godef#44 has been marked as fixed and closed.

what should we do ?
We could raise an issue over at godef asking to try out therecipe/qt so they can reproduce it.

@therecipe
Copy link
Owner

maybe your example is a bit unfortunately selected as acceptDrops doesn't has parameters
http://doc.qt.io/qt-5/qwidget.html#acceptDrops-prop

does it work for widgets.NewQMainWindow?

what should we do ?
We could raise an issue over at godef asking to try out therecipe/qt so they can reproduce it.

As I said in the other issue, I'm currently working on reducing the binding code.
I was able to reduce the (go) code by 75% for the "widgets" package, so maybe that solves the code-generation / godef / gocode issues.

Thats why I would like to wait until this is done, to see if it maybe solves this and the other (probably related) issues.
If it however doesn't work after that, then we probably have no other chance than opening an issue over there.

@therecipe
Copy link
Owner

made the changes to the code-generator yesterday and now there should be a lot less Go code.
could you try it again with the latest version?

you can also set QT_VERSION=5.7.0 and QT_DIR=path/to/Qt5.7.0, if you don't want to update to 5.8 yet. (as the update to 5.8 happened in the meantime as well)

@joeblew99
Copy link
Author

joeblew99 commented Feb 22, 2017

i just did a clean install of 5.8 qt and the repo.

is now worse then before :(

for example:
github.com/therecipe/qt/internal/examples/grpc/hello_world/hello_world.go

package main

import (
	"os"

	"github.com/therecipe/qt/core"
	"github.com/therecipe/qt/gui"
	"github.com/therecipe/qt/quick"
)

//go:generate qtmoc
type HelloClientRPC struct {
	core.QObject

	_ func(string) []*core.QVariant `slot:"sayHello"`
	_ func() error                  `slot:"shutdown"`
}

type HelloClientFactory struct {
	core.QObject

	_ func(addr string) *HelloClientRPC `slot:"newClient"`
}

func main() {
	go serve()

	gui.NewQGuiApplication(len(os.Args), os.Args)

hovering over gui, showing the import overlay as it should.
clicking over gui -->go to definition, goes to the import at the top as it should.

hovering over gui.NewQGuiApplication, does nothing
clicking over gui.NewQGuiApplication -->go to definition works, does nothing.

typing gui.NewQAccessibleEvent, does bring up the functions list. But on choosing one, no function signature help happen.

Hope i have explained it enough ?

@therecipe
Copy link
Owner

therecipe commented Feb 22, 2017

Did you use rogpeppe/godef with rogpeppe/godef#44 or some fork?

@joeblew99
Copy link
Author

yes i think its using the master of rogpeppe/godef.

When you install the standand VSCode golang plugin it installs about 10 golang binaries.
godef is one of them.

i am pretty sure its using the master version of godef. Here is the source code that kicks it off:
https://github.com/Microsoft/vscode-go/blob/master/src/goInstallTools.ts

I tried deleting all my binary files in the golang bin, and the VSCode plugin asked to redownload it using:
go get -v github.com/rogpeppe/godef

So i am not doing anything different from everyones install.
I am have a pretty standard VSCode Prefs:

// Place your settings in this file to overwrite the default settings
{
    "editor.tabSize": 4,
    "editor.insertSpaces": false,
    "editor.detectIndentation": true,
    "go.buildOnSave": true,
    "go.lintOnSave": true,
    "go.vetOnSave": true,
    //"go.formatTool": "goreturns",
    "go.gocodeAutoBuild": false,
    // "files.autoSave": "onFocusChange",
    "files.autoSave": "onFocusChange",
    "files.autoSaveDelay": 1000,
    "git.confirmSync": false,
	"git.autorefresh": true,
	"vsicons.projectDetection.autoReload": true,
	"[go]": {
		
	}
}

After VSCode gets all the golang binaries installed i have:

/Users/apple/workspace/go/bin
x-MacBook-Pro:bin apple$ ls -al
total 157064
drwxr-xr-x  16 apple  staff       544 Feb 26 14:21 .
drwxr-xr-x   6 apple  staff       204 Oct 10 13:54 ..
-rw-r--r--@  1 apple  staff      6148 Feb 26 13:22 .DS_Store
-rwxr-xr-x   1 apple  staff   3103776 Feb 26 13:46 bolt
-rwxr-xr-x   1 apple  staff  10461508 Feb 26 13:47 glide
-rwxr-xr-x   1 apple  staff   2856160 Feb 26 14:20 go-outline
-rwxr-xr-x   1 apple  staff   3534208 Feb 26 14:20 go-symbols
-rwxr-xr-x   1 apple  staff  10413876 Feb 26 14:20 gocode
-rwxr-xr-x   1 apple  staff   5463296 Feb 26 14:21 godef
-rwxr-xr-x   1 apple  staff   5124448 Feb 26 14:21 golint
-rwxr-xr-x   1 apple  staff   1888080 Feb 26 14:20 gopkgs
-rwxr-xr-x   1 apple  staff   5407408 Feb 26 14:21 gorename
-rwxr-xr-x   1 apple  staff   5732432 Feb 26 14:21 goreturns
-rwxr-xr-x   1 apple  staff   7004912 Feb 26 14:21 gotests
-rwxr-xr-x   1 apple  staff   8147472 Feb 26 14:21 guru
-rwxr-xr-x   1 apple  staff  11240676 Feb 26 13:46 ponzu

@therecipe
Copy link
Owner

yes, they are using the (broken) master, using rogpeppe/godef#44 however

diff --git a/go/parser/parser.go b/go/parser/parser.go
index b6bfef7..69e4cfe 100644
--- a/go/parser/parser.go
+++ b/go/parser/parser.go
@@ -1967,6 +1967,9 @@ func parseImportSpec(p *parser, doc *ast.CommentGroup, decl *ast.GenDecl, _ int)
 		if declIdent == nil {
 			filename := p.fset.Position(path.Pos()).Filename
 			name, err := p.pathToName(litToString(path), filepath.Dir(filename))
+			if litToString(path) == "C" {
+				name = "C"
+			}
 			if name == "" {
 				p.error(path.Pos(), fmt.Sprintf("cannot find identifier for package %q: %v", litToString(path), err))
 			} else {

made "go to definition" work for me.

I also got the function list somewhat working by:

  1. typing gui.NewQ
  2. hitting "enter"
  3. hitting "remove" until the Q suffix gets removed
  4. hitting Q

and the input parameter help seems to work as well.

So, there is definitely something wrong with how vsc makes the code-completion work.
I would guess, there is a timeout and because there is to much code in core, gui, widgets the plugin will just stop, because it can't complete the request in the desired timeframe.
That would explain why it's still working for smaller packages such as network, dbus, nfc, ...

After further investigation is seems that the file size limit is somewhere between 1.2mb and 1.5mb.
As multimedia is working with 1.2mb, but core (1.5mb), gui (1.7mb) and widgets (2.9mb) are not working.

@joeblew99
Copy link
Author

thanks for looking into this deeper.

Geez so crappy of vscode.

I think that i need to change to another IDE.

What do you use ?

@jeanlucmongrain
Copy link
Contributor

Intellij community edition + golang plug-in

@joeblew99
Copy link
Author

ok ta.

I am going to ry the new
https://www.jetbrains.com/go/download/

Will report back ...

@therecipe
Copy link
Owner

I'm currently using Atom + go-plus ("go to definition" isn't working there for me as well, even with the patched godef).
So I will probably go back to sublime text.

@joeblew99
Copy link
Author

i tried out gogland.

https://www.jetbrains.com/go/download/
works very well !

Setup it fast.
Takes about 30 minutes to parse everything in the GOPATH to build an index.
Until thats done, nothing really works.

The Intellisense is much much better.
Did not have a problem with the c code.

It picked up lots of warnings in the code.

On the widgets.go file it blew up the intellisense buffer, giving a warning.
I think there is a setting to expand that, but have not found that yet.

Really curious what you think... I really think its worth a shot

@therecipe
Copy link
Owner

Tested Gogland as well, and it works so far.

What I observed is, that the code-competition works without the need to install the packages with "go install", which is really nice. The other editors seems to use gocode and therefore depend on the *.a files created during "go install"

But the "go to definition" function, even though it works out of the box, is way slower for me then with vsc. And the code competition for the "widgets" package seems to be broken as well, but I got it working by using the IntelliJ Idea settings from: https://github.com/therecipe/qt#code-editor-settings-for-code-completion

@joeblew99
Copy link
Author

I tested LiteIDE, which is a golang IDE written in QT.

Its really nice actually.

  • fast to install
  • fast to run
  • code completion works well
  • nice tooling around it

I just had to tell is my goroot in the menu:
"View" --> "Edit Current Environment".

I use homebrew to install go, and so all i had to do was give it the exact same thing i have in my .bash_profile:

# native compiler drawin amd64

# installed using: "brew install go"
GOROOT=/usr/local/opt/go/libexec
GOPATH=$HOME/workspace/go

PATH=$PATH:$GOROOT/bin
PATH=$PATH:$GOPATH/bin



#GOROOT=/usr/local/opt/go/libexec
#GOBIN=
#GOARCH=amd64
#GOOS=darwin
#CGO_ENABLED=1

#PATH=$GOROOT/bin:$PATH

LITEIDE_GDB=/usr/local/bin/gdb
LITEIDE_MAKE=make
LITEIDE_TERM=/usr/bin/open
LITEIDE_TERMARGS=-a Terminal
LITEIDE_EXEC=/usr/X11R6/bin/xterm
LITEIDE_EXECOPT=-e

So far its the fastest IDE i have used by far.
Very easy on the eyes, and really nice tabs, and lots of extras that are smartly mapped ot the many go tools out there.

I would recommend trying it.

Also its works on all OS's.

@therecipe
Copy link
Owner

Yeah, I already have had experience with that one :)
And it was great overall, but there was an exausting bug when I used it (2 years ago or so) that made it crash, when you pressed the wrong key combination.
Sadly I can't exactly recall what it was, but it had something todo with ctrl or cmd on mac. And so I switched, but these things are probably sorted out by now, so I will maybe switch back.

@joeblew99
Copy link
Author

joeblew99 commented Mar 8, 2017 via email

@therecipe
Copy link
Owner

:D I will give it a try

@joeblew99
Copy link
Author

@therecipe
Did you have time to try out lideIDE ?

Curious what you think ? For me its been clear sailing for everything and much more productive

@therecipe
Copy link
Owner

Yes, I had time to test it.
It works great and as you said, you directly feel that it's way faster than the rest.

I will try to use it from time to time and maybe fully switch at some points, but currently I'm (too) used to Atom and its git integration. So I will need some time to acclimatize with LiteIDE.

@joeblew99
Copy link
Author

ok. This was originally about VSCOde and got highjacked along the way by me.
I will close it, as my solution was to not use vscode anymore :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants