magik-tools-0.12.0 released

June 14, 2026    SonarQube static code analysis magik-language-server magik-debug-adapter

Magik tools 0.12.0 has been released, followed shortly by a 0.12.1 bugfix release! This is a big one: new checks, a fair amount of new language server functionality, a reworked indenter, and a few breaking changes to watch for.

The biggest theme is that magik-tools no longer only looks at your .magik files. product.def, module.def, load_list.txt, and patch_list.txt are now parsed and checked as well. Depending on the state of these files in your codebase, this will most likely raise new issues, so review your results after upgrading. New checks cover missing descriptions/titles, names not matching directory names, syntax errors, and load-list entries that don’t exist. Note that in SonarQube, product.def and module.def share a language (SonarQube differentiates by extension), so their profiles are merged.

There are new magik checks too, including unnamed-procedure, system-command-use-simple-vector, and a few pragma-topic checks (mostly disabled by default). On the typed side there’s operator mismatch detection, invocation validation for methods and procedures, abstract-method-not-implemented, super-method-exists, and doc validation. The old method-only argument/return-doc checks have been replaced by callable-oriented ones, which is a breaking change (see below).

The language server gained a batch of LSP features: on-type formatting, the diagnostic pull model, document highlight, clickable document links in load-lists, code lens (run MUnit tests inline, add a product, load a module), linked editing for renaming locals, and go-to-definition for slots. There are also new “Extract to method / local procedure / local variable” code actions that infer parameters and return values automatically.

Support for variadic return and loop types to match _scatter and iterator semantics is also added. A trailing ... on a @return or @loop declares 0..1024 values of that type, and at a _scatter or multi-assignment call site the reasoner expands it into per-assignee types. And to record method uses that can’t be derived automatically (like object.perform()), there’s a new @invokes_method TypeDoc instruction:

_method object.example()
  _local method_name << :|example_method()|
  ## @invokes_method {user:other_object.example_method()}
  _local result << thing.perform(method_name)
_endmethod

The indenter has been reworked to be rule-based, split into a visual indenter and a block indenter. Indenting of a simple_vector assigned to a variable changed for consistency, so expect some formatting diffs there. A couple of other useful additions: delayed check running via magik.lint.runChecksOnChangeDelay and magik.lint.runChecksOnSave, and the check name is now included as a code on the diagnostic, which helps tools like Flycheck in Emacs.

Breaking changes to watch for:

  • product.def, module.def, load_list.txt, and patch_list.txt are now checked, which may surface new issues.
  • Typed checks were renamed (e.g. method-argument-count-matches-parameter-countinvocation-argument-count-matches-parameter-count, method-return-types-match-doccallable-return-types-match-doc). Update any quality profiles, suppressions, or automation referencing the old keys.
  • custom/reIndex and custom/munit/getTestItems moved to the workspace/executeCommand commands magik.reIndex and magik.munit.getTestItems.

As always, the full list of changes is in the change log, and please report any problems in the issue tracker.