Changelog of Noctule#

This is the detailed changelog of Noctule.

1.8.0#

  • Added: Add a new “Format on Save” action to format a Swift file on save with either swiftformat or with swift format bundled with the current Swift toolchain. The settings can be enabled at Preferences > Tools > Actions on Save. Detailed settings can be configured at Preferences > Languages & Frameworks > Swift (Noctule) > Format on Save.
  • Added: Swift’s .swift-format files are now associated with the JSON file type.
  • Fixed: Exception ClassNotFoundException: swift.lang.SwiftFileTypeOverrider if Noctule was installed alongside the Kotlin Multiplatform plugin.
  • Updated: Because local, non-roamable settings were added for the “Format on save” support, the notification about the Noctule plugin license may be shown again once.

1.7.0#

  • Added: Syntax highlighting and semantic highlighting have been reworked with new default colors, new settings and improved test coverage. This fixes several issues with highlighting. Color scheme settings like “Function call” were not visible because they did not have a default color assigned. Several existing color scheme settings were not properly applied to Swift syntax elements. Several semantic highlighting elements assigned via SourceKit LSP were not properly rendered.
  • Fixed: Properly handle Swift installed via scoop on Windows.
  • Fixed: Noctule can now be installed at the same time as the JetBrains Kotlin Multiplatform plugin, which also provides a Swift file type. If both plugins are installed, then .swift and .swiftinterface file extensions are mapped to Noctule’s Swift support. Previously, a popup appeared during IDE startup to turn off one of the two plugins.
  • Added: swift is now available as a code fence id in Markdown files. The change of the language ID requires additional integration with Markdown.
  • Added: Live template contexts for Swift.
  • Added: Live templates for Swift to quickly insert declarations and statements.
  • Added: Postfix template completion. Basic templates like iter, while, wrapInString and more are provided. The code insight is not yet smart enough to hide templates which are not applicable in the current context.
  • Added: Typing the beginning of a multiline string literal (e.g. #""") now inserts a matching closing quote ("""#).
  • Fixed: Improve parsing of enum declarations.
  • Fixed: Improved parsing of incomplete declarations, statements and expressions.
  • Fixed: Improved formatting and alignment of multiline string literals.
  • Fixed: Parsing and formatting of interpolations inside multiline strings with extended delimiters.
  • Fixed: Formatting of negated compilation conditions, e.g. #if !os(Windows).
  • Fixed: Formatting of operators in compilation conditions, e.g. #if swift(<6.0).
  • Fixed: Formatting produced incorrect results when only formatting a part of a Swift file.
  • Fixed: Typing an expression with a left parenthesis inside a string interpolation did not insert the matching right parenthesis, for example, in """some \(value)"""".
  • Fixed: Improved formatting DocC comments before a declaration.
  • Fixed: Formatting of optional chaining expressions.
  • Fixed: Handling of language injection in multi-line strings.

Changes in the LSP Library#

  • Fix: The LSP server was not properly notified about changes to watched files.
  • Fix: Editor highlighting based on textDocument/diagnostic was not updated after the server sent workspace/diagnostic/refresh.

1.6.0#

  • Added: The handling of Swift toolchains has been reimplemented and improved. You may have to reconfigure your toolchains settings. The following sources are used to locate Swift toolchains:
    • All installed versions of XCode (on macOS)
    • Installations managed by swiftly (on macOS and Linux)
    • Installations inside C:\Users\User\AppData\Local\Programs\Swift\Toolchains (on Windows)
    • swift in $PATH (all platforms)
    • User-defined Swift toolchains managed in the settings (all platforms)
  • Added: New project wizard to create a new project or module with the Swift package manager.
  • Added: Support nested workspace folders. All Package.swift files inside the project are now used to determine the available Swift Packages.
  • Added: New run configuration to execute swift run commands. The configuration offers a user interface to choose the Swift Package. It allows overriding the Swift toolchain and the Swift SDK.
  • Added: Made most of Swift Package Manager’s settings configurable. The options are currently used to initialize sourcekit-lsp and for the swift run run configuration.
  • Added: Setting can now be configured for each detected Swift PM directory, i.e., for directories which contain a Package.swift file. The settings are available at Preferences > Build, Execution, Deployment > Swift > Directory Settings.
  • Added: New toolwindow “Swift Server Logs” to show the log messages of the sourcekit-lsp server.
  • Added: On Windows, if a project is opened from the WSL filesystem, then it’s now possible to launch the Swift LSP server inside WSL while editing the files in the IDE running on the Windows host.
  • Added: The structure view now displays sticky lines.
  • Fixed: The structure is working better now for Swift files.
  • Update: Build against the 2025.3 release.
  • Fixed: Exception after opening the Swift code style settings.
  • Fixed: Call and type hierarchies are now shown for the element under the caret, not for the underlying definition. This follows VSCode’s implementation and improves compatibility with the LSP spec.
  • Fixed: Support #if os(Android) value in the parser.
  • Fixed: Support #if arch(wasm32) value in the parser.
  • Fixed: Parsing of private nonisolated(unsafe) var ....
  • Fixed: Parsing of line comments right after a compiler #if directive.
  • Fixed: Parsing of isolated parameter modifier, SE-0313.
  • Fixed: Parsing of modifiers like consuming in function type arguments, e.g. func something(x: ((consuming String) -> String)) {...}.
  • Fixed: Parsing of #if case ...#endif inside enum declarations.
  • Fixed: Parsing of a trailing comma in a function call expression.
  • Fixed: Parsing of #if canImport(Darwin, _version: "54") ....
  • Fixed: Parsing of protocol composition types.
  • Fixed: Parsing of final actor ... declaration.
  • Fixed: Parsing of compiler control statements inside protocol declarations.
  • Fixed: Parsing of if expressions with a let condition.
  • Fixed: Parsing of func something<X: ~Copyable>() {}.
  • Fixed: Parsing of consuming func c() ....
  • Fixed: Parsing of async function type.
  • Fixed: Parsing of borrowing get.
  • Fixed: Parsing of async let.

Changes in the LSP Library#

  • Feature: API to customize document symbols and the structure view.
  • Feature: Allow opening the LSP console tool window before a server is launched.
  • Feature: Allow showing files outside the project in the “Go to implementations” popup if returned by an LSP server.
  • Feature: LSP clients can now customize which code actions are shown as intentions.
  • Feature: Render related file information of diagnostics.
  • Feature: Show previews for LSP intentions. For example, the changes to a file can now be previewed before applying them.
  • Feature: Support “Go to declaration”, based on LSP request textDocument/declaration. The action is shown in the Navigate menu. It’s only visible if there is at least one LSP server supporting the feature.
  • Feature: Support client configuration request and workspace/didChangeConfiguration notification with new API.
  • Feature: WorkspaceFolderService to allow plugins updating custom workspace folders.
  • Fixed: “Go to implementations” was sometimes showing an incomplete list for files with PSI.
  • Fixed: API compatibility with 2025.3.
  • Fixed: Allow clients to open and handle LightVirtualFile types.
  • Fixed: Code actions shown as intentions are now requested from the server with the known diagnostics in the request.
  • Fixed: Don’t send a VersionedTextDocumentIdentifier with a request for pull diagnostics.
  • Fixed: Exception about missing read access in the structure view
  • Fixed: Exception when fetching diagnostics from an LSP server.
  • Fixed: Follow more VSCode when requesting code actions for diagnostics shown in the editor.
  • Fixed: Glob patterns were not matching Windows file paths.
  • Fixed: Go to symbol cache is cleared after refresh requests send from LSP server to client.
  • Fixed: Handle exception Error handling [documentColor] No language service for ....
  • Fixed: Handling file changes on Windows.
  • Fixed: Improved matching of relative glob patterns.
  • Fixed: Link navigation was broken.
  • Fixed: Make “Find Usages” on references work with more language servers. Previously, the search started from the definitions and some servers don’t support unopened files with the references request.
  • Fixed: Navigation in the LSP server console was not always working.
  • Fixed: Pass the editor position to the LSP’s “Call hierarchy” and “Type hierarchy” requests and not the resolved definition at the editor position. LSP needs the source position, IntelliJ uses the resolved definition by default.
  • Fixed: Position encoding for lines or characters, which are out of bounds.
  • Fixed: Refresh editor highlighting after a change of LSP server status.
  • Fixed: Send rootUri and rootPath with the initialize request if there are multiple, but nested workspace folders.
  • Fixed: Several fixes to glob matching and URI windows path handling.
  • Fixed: Show “Caller hierarchy” by default and not “Callee hierarchy”.
  • Fixed: Sometimes, intentations displayed title null.
  • Fixed: The name of items shown in “go to supertype” was always unknown type.
  • Fixed: URIs were not working properly on Windows.
  • Fixed: show class, interface, enum, struct in “go to symbol”
  • Fixed: sourcekit-lsp wasn’t fully working on Windows. Completions were not shown.
  • Updated: Drop use of deprecated API.

1.4.2#

  • Added: Settings to configure some aspects of the underlying sourcekit-lsp: Workspace type, SwiftPM configuration.
  • Added: Support “if case” syntax of Swift 6.2.
  • Added: Support raw identifiers of Swift 6.2.
  • Added: Parsing of integer generics of Swift 6.2, e.g. struct Sized<let size: Int> {...}.
  • Added: Parsing of InlineArray Type Sugar of Swift 6.2, e.g. let x: [5 of Int] = .init(repeating: 99).
  • Fixed: The sourcekit-lsp server is now started with its working directory set to the project root. This change allows sourcekit-lsp to detect a .buildServer.json file to enable BSP support, e.g. with a setup made by xcode-build-server.
  • Fixed: Parsing of platform version strings and swift version strings, e.g. #if swift(<6.2.0).
  • Fixed: Parsing of protocol composition types, e.g. struct A: P1 & P2.
  • Fixed: Parsing of references to the Any type, e.g. struct My<T: Any> {}.
  • Fixed: Formatting of boxed protocol types, e.g. let x: any Numeric = 123.
  • Fixed: Formatting of protocol composition types.
  • Fixed: Parsing and formatting of identifier types with spaces, e.g. A . B . C.
  • Fixed: Improved parsing of incomplete subscript declarations.
  • Fixed: Parsing of let package = ....

Changes in the LSP Library#

  • Fixed: Files managed by an LSP server could not be renamed anymore in the project view.

1.4.1#

  • Added: Support for JetBrains 2025.3 EAP IDEs.

1.4.0#

  • Added: Native formatter for Swift files. A native formatter provides a much better editing experience. All syntax should be supported, but there are lacking formatting options. Please report any issues you encounter and any missing formatting option you need.
  • Added: Basic code style settings for the native formatter.
  • Fixed: Reparsing a swift file after incremental updates in the editor was broken.
  • Fixed: Several parsing errors and problems.
  • Fixed: Parsing of repeat ... while.
  • Fixed: Parsing of platform version strings.
  • Fixed: Parsing of case patters of switch statements.
  • Fixed: Sync parsing of inout parameters with the Swift grammar.
  • Fixed: Added missing parsing of parameter modifiers ‘consuming’ and ‘borrowing’.
  • Fixed: Parsing of throws clauses, e.g. func x() throws(Error) { ... }.
  • Fixed: Parsing of new package declaration modifier.
  • Fixed: Parsing of ‘willSet’ and ‘didSet’ blocks of variable declarations. Previously, this was parsed as a closure.
  • Fixed: Add platform names ‘visionOS’ and ‘visionOSApplicationExtension’ to the parser.
  • Fixed: Add operating system name ‘visionOS’ to the parser.
  • Updated: Sync parsing with Swift 6.2 language specification

1.3.4#

  • Updated: Support 2025.2 and drop support for 2024.2.

1.3.3#

  • Updated: Several improvements and fixes to the underlying LSP support.
  • Fixed: Exception annotator: dev.j_a.ide.lsp.features.semanticToken.LanguageServerSemanticTokenAnnotator loading semantic tokens from an LSP server.
  • Fixed: Exception Range must be inside element being annotated: (0,391); but got: (391,393) for semantic token annotations.
  • Fixed: Exception Attempt to unregister unmanaged DocumentUri ... after an editor is closed.
  • Fixed: Log uncaught exceptions of the LSP support as errors, otherwise they would only be logged to STDOUT.
  • Fixed: Handle response errors of LSP completion requests.
  • Fixed: Change a completion snippet with a single placeholder name = ${1:} into a snippet with a tabstop: name = $0. This is a common snippet, but it does not feel natural in a JetBrains IDE to insert a single, empty live-template for a code completion.

1.3.1#

  • 2025.1 support: Build against 2025.1 beta.
  • Fixed NullPointerException when opening the view main menu.
  • Fixed exception Must not execute inside read action, which was thrown if the mouse was used to navigate to a type definition.
  • Fixed exception about missing class LanguageServerSymbolTypeProvider.
  • Fixed exception about slow operation.

1.3.0#

  • Added: Rewritten LSP client implementation for a more complete LSP integration and fewer problems of the integration of code completions, find usages, rename refactoring, quick documentation and other features.
  • Added: Support formatting by sourcekit-lsp with the new LSP client implementation. By default, the few available settings are based on the IDE’s code style. You can customize formatting by creating a .swift-format file like this file.
  • Added: Setting to enable the experimental background indexing of the Swift 6.x toolchain. It’s enabled by default.
  • Fixed: Parsing of typealias Handler = @Sendable (Notification) -> Bool. Previously, (Notification) was incorrectly parsed as if it belonged to @Sendable.
  • Updated: Dropped compatibility with 2024.1

1.2.1#

  • Fixed: Exception java.lang.IllegalStateException: SSMSW when opening Swift files.

1.2.0#

  • Added: Compatibility with 2024.3.
  • Fixed: Exception IndexNotReadyException caused by our navigation bar extension.
  • Fixed: Exception “Intention Description Dir URL is null”.
  • Updated: Bundled library version of OpenTelemetry.

1.1.0#

  • Added: Compatibility with 2024.2
  • Removed: Dropped compatibility with 2023.2 and 2023.3
  • Updated: Error reports are not sent to https://metrics.j-a.dev using OpenTelemetry.

1.0.0#

  • Added: Support call hierarchy.
  • Fixed #28: Several parsing errors of valid Swift code.
  • Fixed #32: Parsing of key path expressions.
  • Added: Switch to Freemium. All features are still free to use, please show your appreciation by purchasing a license at a symbolic price of USD 1 / month. Share your thoughts. The updated version “1.0” was a requirement of the freemium model.

0.21.0#

  • Added: Compatibility with 2024.1 eap.
  • Added: Initial support for “Go to implementation”.
  • Added: Initial support for “Go to type definition”.
  • Added: LSP support for progress notifications. Progress of the LSP server is show as background tasks in the status bar.
  • Fixed: In the type hierarchy, show an icon for extensions (which are not natively supported by LSP).
  • Fixed: Several bug fixes in the underlying LSP support library.

0.20.0#

  • Improved: Language server integration of sourcekit-lsp.
  • Added: Highlighting of references in the current document, which is available without a full swift build of the current project.
  • Fixed: Completion snippets with literal braces ({ or }) and line feeds were not properly supported.

0.19.0#

  • Added: Compatibility with 2023.3 EAP

0.18.0#

  • Fixed #23: Parsing of property wrappers with parameters.
  • Fixed #24: Await with assignment to existing variable not working.

0.17.0#

  • Fixed #21: Parsing of optional types.
  • Fixed #22: Parsing of opaque types.

0.16.0#

  • Improve rendering of Swift declarations in popups, e.g. when multiple types are shown by “Go to supertype”.
  • Exception for action “Go to supertype”.

0.15.0#

  • Fixed “go to definition” for function argument names, e.g. for myArg in myFunction(myArg: "value").
  • Only activate LSP support for Swift files.
  • Fixed NullPointerException “Cannot invoke “com.intellij.openapi.util.TextRange.getStartOffset()” because the return value of “com.intellij.psi.PsiElement.getTextRange()” is null”.
  • Fixes to the Swift parser, it’s now capable to parse all Swift source code of sourcekit-lsp.

0.14.0#

  • Improvements to the Swift parser

0.13.0#

  • Improvements to the Swift parser and lexer

0.12.0#

  • Improve Unicode support of sourcekit-lsp integration.

0.11.0#

  • Initial support for inlay hints provided by sourcekit-lsp.
  • Inlay hint settings for “type” and “parameter” inlay hints.
  • Don’t attempt to launch the sourcekit-lsp server if the toolchain path is not configured.
  • Don’t block the UI when launching the sourcekit-lsp language server.
  • Limit number of failed launches of sourcekit-lsp.
  • Notify sourcekit-lsp about changes of content roots.

0.10.0#

  • Initial support for CodeActions offered by sourcekit-lsp for its diagnostics.

0.9.0#

  • Display diagnostics sent by sourcekit-lsp.
  • To help with debugging, send crash reports with log of messages exchanged with sourcekit-lsp.
  • Various bug fixes

0.8.0#

  • Improved support for snippets inserted by sourcekit-lsp’s code completions. Nested snippet and snippet variables are not yet supported (and most likely not used by sourcekit-lsp).

0.7.0#

  • Added semantic highlighting, based on Apple’s sourcekit-lsp. Things like static method call, enum member and class name are now highlighted.
  • Updated some of the icons.
  • Several improvements to the parser.

0.6.0#

  • Implement “Go to supertype” for Swift.
  • Provide items in “Go to class” and “Go to symbol” even before the first Swift file was opened.
  • Improve caching of sourcekit-lsp data to reliably provide up-to-date data for references, etc.
  • Avoid deadlock when editing Swift files.

0.5.0#

  • Improve “Find usages”: references are now also found even if their file were not opened in the current session. For now, running swift build for up-to-date results (via sourcekit-lsp) is needed.

0.4.0#

  • Initial implementation of “Go to class” and “Go to symbol”
  • Initial implementation of type hierarchy for Swift
  • Improvements to “Go to declaration”

0.3.0#

  • Improved LSP support for sourcekit-lsp.
  • Better error reporting if the sourcekit-lsp LSP server crashed.
  • Fixed folding of indented line comments and /// line comments.
  • Properly activate Swift LSP when the plugin dynamically loaded (i.e. without a restart of your IDE).
  • Several improvements to the parser

0.2.2#

  • Several improvements to the parser

0.2.1#

  • Send LSP request textDocument/didOpen only for Swift files
  • Several improvements to the parser
  • Several improvements to the rename refactoring and to find usages

0.2.0#

  • Find usages, highlighting of references, rename refactoring
  • Render (Swift) code blocks, which are embedded in quick documentation, with syntax highlighting based on the IDE’s color settings.
  • Fix rendering of Swift quick documentation. Previously, the rendering of headings and code blocks was broken.

0.1.0#

  • Setting to configure the Swift toolchain to use.
  • Automatic detection of the system’s toolchain. If the CLion Swift plugin was previously used in a project, then CLion’s toolchain path setting is used to set up the Swift toolchain path setting of this plugin.
  • Swift code completions using the installed Swift toolchain. It’s based on Apple SourceKit’s sourcekit-lsp and has been tested on Linux and macOS. Support for Windows is implemented, but it not fully functional yet.
  • Initial support for quick documentation. The rendering is still very rough and will be improved in the next versions.
  • Added file templates for Swift declarations of protocol, actor, enum and extension.

0.0.7#

  • Fix several issues with lexer and parser
  • Support shebang comments, e.g. #!/usr/bin/swift, in Swift file
  • Performance improvements for lexer and parser

0.0.6#

  • Support language injection for single-line and multi-line string literals
  • Fix parsing of multiline strings
  • Fix several issues with lexer and parser

0.0.5#

  • Support spellchecking in string literals and comments
  • Support multiline todo items in Swift files.
  • Create new line comment when enter is pressed in the middle of a line comment.
  • Added error reporter for exceptions caused by the Swift plugin.

0.0.4#

  • File templates for Swift files, classes and structs
  • Code folding for imports, blocks of code, line comments and multiline comments. It follows the settings for default folding for options “imports”, “multiline comments” and “method bodies”.
  • Code folding settings at Preferences... > Editor > General > Code Folding.

0.0.2#

  • Initial release!
  • Parser and lexer
  • Structure view
  • Basic syntax highlighting
  • Color schema settings