Compiler Warnings
Pluto offers optional compiler warnings for certain misbehaviors.
Warning Types
var-shadow
This is raised when a new local is created with the same name as an existing one.
pluto
local var = 5dolocal var = "hello"end
file.pluto:3: warning: duplicate local declaration [var-shadow]3 | local var = "hello"| ^^^^^^^^^^^^^^^^^^^ here: this shadows the initial declaration of 'var' on line 1.
global-shadow
This is raised when a new local is created with the same name as a global variable.
pluto
local table = {}
file.pluto:1: warning: duplicate global declaration [global-shadow]1 | local table = {}| ^^^^^^^^^^^^^^^^ here: this shadows the initial global definition of 'table'
To avoid excessive annoyance, this warning type is off by default. To enable it, scripters can use the compile-time configuration and integrators can define the PLUTO_WARN_GLOBAL_SHADOW
macro.
Furthermore, this only covers the globals 'table', 'string', and 'arg' by default. Integrators can overwrite the PLUTO_COMMON_GLOBAL_NAMES
macro to change this list.
field-shadow
This is raised when the same field is declared multiple times in a table constructor:
pluto
local t = {key = "fruit",value = "apple",value = "banana"}
file.pluto:4: warning: duplicate table field [field-shadow]4 | value = "banana"| ^^^^^^^^^^^^^^^^ here: this overwrites the value assigned to this field earlier
type-mismatch
This is raised when the type of an expression doesn't match the hinted type. See Type Hinting.
pluto
local var: number = 5var = "hello"
file.pluto:2: warning: variable type mismatch [type-mismatch]2 | var = "hello"| ^^^^^^^^^^^^^ here: 'var' type-hinted as 'number', but assigned a string value.
unreachable-code
This is raised when a block of code will never be ran.
pluto
for i = 1, 10 doif i == 5 thencontinueprint("message")endend
file.pluto:4: warning: unreachable code [unreachable-code]4 | print("message")| ^^^^^^^^^^^^^^^^ here: this code comes after an escaping 'continue' statement.
excessive-arguments
This is raised when too many arguments are given to a non-vararg function.
pluto
local function func(a, b, c)endfunc(1, 2, 3, 4)
file.pluto:5: warning: too many arguments [excessive-arguments]5 | func(1, 2, 3, 4)| ^^^^^^^^^^^^^^^^ here: expected 3 arguments, got 4.
bad-practice
This is raised when the code does something stupid but not quite stupid enough to cause an error.
pluto
pluto_use *
file.pluto:1: warning: 'pluto_use *' is a bad idea because future Pluto versions may add keywords that will break your script [bad-practice]1 | pluto_use *| ^^^^^^^^^^^ here: consider using 'pluto_use "0.8.0"' instead
possible-typo
This is raised when the code seems syntactically incorrect.
pluto
local magic const = 42
file.pluto:1: warning: Possibly mistyped attribute [possible-typo]1 | local magic const = 42| ^^^^^^^^^^^^^^^^^^^^^^ here: Did you mean '<const>'?
non-portable-code
This is raised when the code may not be considered valid by all Pluto environments due to compatibility mode.
pluto
new exception("Not implemented")
file.pluto:1: warning: non-portable keyword usage [non-portable-code]1 | new exception("Not implemented")| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ here: use 'pluto_new' instead, or 'pluto_use' this keyword: https://pluto.do/compat
To avoid excessive annoyance, this warning type is off by default. To enable it, scripters can use the compile-time configuration and integrators can define the PLUTO_WARN_NON_PORTABLE_CODE
macro.
non-portable-name
This is raised when a variable name is only valid due to compatibility mode.
pluto
local class = "fruit"
file.pluto:1: warning: 'class' is a non-portable name [non-portable-name]1 | local class = "fruit"| ^^^^^^^^^^^^^^^^^^^^^ here: use a different name, or use 'pluto_use' to disable this keyword: https://pluto.do/compat
To avoid excessive annoyance, this warning type is off by default. To enable it, scripters can use the compile-time configuration and integrators can define the PLUTO_WARN_NON_PORTABLE_NAME
macro.
non-portable-bytecode
This is raised when the code will not run in Lua environments (when compiling Pluto to bytecode).
pluto
print("h" in "hello")
file.pluto:1: warning: non-portable operator usage [non-portable-bytecode]1 | print("h" in "hello")| ^^^^^^^^^^^^^^^^^^^^^ here: this operator generates bytecode which is incompatible with Lua.
To avoid excessive annoyance, this warning type is off by default. To enable it, scripters can use the compile-time configuration and integrators can define the PLUTO_WARN_NON_PORTABLE_BYTECODE
macro.
unannotated-fallthrough
This is raised when there's a non-obvious fallthrough in a switch block:
pluto
local a = 1switch a docase 1:print("Case 1")case 2:print("Case 2")end
file.pluto:5: warning: possibly unwanted fallthrough [unannotated-fallthrough]5 | case 2:| ^^^^^^^ here: the case on line 3 flows into this case+ note: place `--@fallthrough` before this case if this is intended
As the warning points out, a @fallthrough
annotation can be used to label the fallthrough, in turn silencing the warning:
pluto
local a = 1switch a docase 1:print("Case 1")-- @fallthroughcase 2:print("Case 2")end
implicit-global
This is raised when the global
keyword is enabled and a global was declared without it. See Explicit Globals.
pluto
pluto_use globala = 1
file.pluto:3: warning: implicit global creation [implicit-global]3 | a = 1| ^^^^^ here: prefix this with 'global' to be explicit
discarded-return
This is raised when the return value of a function declared <nodiscard>
was discarded. See Nodiscard Functions.
pluto
local function add(a, b) <nodiscard>return a + bendadd(1, 2)
file.pluto:5: warning: discarding return value of function declared '<nodiscard>' [discarded-return]5 | add(1, 2)| ^^^^^^^^^ here
Compile-time Configuration
The state of each warning type can be changed during compile-time and exceptions for certain code can be made.
Changing Warning States
Warnings have 3 states: 'disable', 'enable', and 'error'. The 'error' state is a more aggressive version of 'enable' that causes compilation to fail if the warning type is raied.
To change the state of a warning, write a @pluto_warnings
comment with the state and warning type joined by a hyphen (-):
pluto
local var = 5do-- @pluto_warnings: disable-var-shadowlocal var = "hello"-- @pluto_warnings: enable-var-shadowend
For this, there is also the special type, 'all', which can be used e.g. to enable all warnings except for non-portable-bytecode:
pluto
-- @pluto_warnings: enable-all, disable-non-portable-bytecode
Disable Warnings On Line
To disable warnings on a specific line of code, simply put a comment on the line before it with @pluto_warnings: disable-next
.
pluto
local var = 5do-- @pluto_warnings: disable-nextlocal var = "hello"end