godot

My Godot tool script produces "Attempt to call a method on a placeholder instance." in editor, game runs fine when executed


In my Godot project I have a UI panel that displays data derived from a Resource. To be able to see how it looks immediately in the editor, I tagged it with @tool. But I started seeing errors like this:

Invalid call. Nonexistent function ...

The errors came whenever I tried to call the members of a custom object I fished from the scene. I decided to try with a development version, and the error became this:

Invalid call. Nonexistent function ... Attempt to call a method on a placeholder instance.

What is going on?


Solution

  • I ran git blame on the line where the Attempt to call a method on a placeholder instance.-message was recently added. It led me to this commit https://github.com/godotengine/godot/commit/2d8f6c1b1d984222d1690f8afd504faed9f303be. The commit message says:

    GDScript: Fix message when calling non-tool function in tool mode.

    So the problem was that I was invoking code from a script without the @tool-attribute when running the tool script. (In my case, a member function on a child panel of the main panel.) I added the tool attribute to the child panel and the error went away. It seems the attribute needs to be applied transitively to all code invoked at editor time. I suppose that makes sense.