Changelog of Noctule#

This is the detailed changelog of Noctule.

3.1.2#

Swift Project Support#

  • Fixed: Exception “Cannot suspend until constraints are satisfied while holding the read lock” was reported when the run actions were updated for a Swift test file.
  • Fixed: After a file changed on disk, the IDE could read the content of files with an unknown file extension to detect their type, which slowed down the IDE and could fail with an out-of-memory error. File types are now detected by file name only.

Xcode Project Support#

  • Fixed: An Xcode project file containing a reference to a missing element, e.g. in the children of a group, caused an error when the plugin looked up the file of an element. Such references are now ignored.

SwiftFormat and SwiftLint#

  • Fixed #109: A single .swiftlint.yml file in a project was not passed to SwiftLint, so linting in the editor used SwiftLint’s default settings instead of the settings of the configuration file.
  • Fixed: Nested .swiftlint.yml files, which are linked with parent_config or child_config, are now passed to SwiftLint again. The settings of the nested configuration files are applied.
  • Changed: The search for the .swiftlint.yml files of a file is now cached. Previously, the directories above every linted file were scanned again for each run of SwiftLint.
  • Fixed: A swiftlint executable found in $PATH was used even if a different executable was configured at “Settings > Languages & Frameworks > Swift (Noctule)”. The configured executable now takes precedence, $PATH is only searched if no executable is configured.
  • Added: The version of the SwiftLint executable in use is now written to the IDE’s log to help with debugging user problems.
  • Added: If SwiftLint fails, e.g. because of an invalid .swiftlint.yml file, then a notification with the error message is now shown. Previously such a failure looked exactly like a file without violations, because the editor was left without a single warning.
  • Added: A .swiftlint.yml file located above the directories of the project, e.g. if a Swift package was opened below the directory holding its configuration, is now reported with a notification. Such a file is not applied by SwiftLint, and this used to happen without any explanation.

Swift language support#

  • Fixed: The Swift lexer and parser has been optimized to be faster and to use less memory.
  • Fixed: Deeply nested syntax such as Foo<Bar<Baz<...>>> or [[[String]]] could freeze the editor for seconds; they are now parsed in constant time per level.
  • Fixed: A case of an enum with a raw value type, e.g. enum Planet: Int, was treated as a case of a union style enum when it was guarded by an #if, unlike the cases around it.
  • Fixed: Every member access, e.g. foo.bar, first checked for .init and .self by parsing the dot and rolling it back, and every call’s argument clause was first parsed as the argument names of a compound function name, e.g. the (_:with:) of insert(_:with:), and rolled back at the first argument. Both are now decided by a look-ahead which does no parsing work.
  • Fixed: Editing inside a nested array or dictionary literal could freeze the editor.

Objective-C language support#

  • Fixed: The Objective-C lexer and parser has been optimized to be faster and to use less memory.
  • Fixed: A call statement, e.g. XCTAssertEqual(a, b);, was consumed whole — block literal arguments included — while the parser checked whether its name was a leading expansion macro, and was thrown away and parsed again. The check now looks at the tokens without parsing, which speeds up files with many calls, test files in particular.

3.1.1#

Swift Project Support#

  • Fixed #107: Importing a Swift Package Manager project failed with “… no suitable Swift toolchain was found”.
  • Fixed: Several other problems related to importing a Swift Package Manager project were fixed. If the package description could not be retrieved with “swift package describe”, then the import now displays a message and proceeds instead of failing silently with an partially imported project.

Swift language support#

  • Fixed: A method reference keeping an argument label named after a keyword, e.g. rows(for:), self.rows(for:) or super.observe(for:in:), was reported as a syntax error, and the error cascaded into unrelated errors for the rest of the file.

Swift code style and formatter#

  • Fixed: Reformatting put a space into a method reference written behind a dot, e.g. model.rows(for:) became model.rows (for:), and it kept whatever was written between two argument labels.

Objective-C language support#

  • Fixed: An enum with preprocessor directives between its constants, e.g. the #define EPOLLIN EPOLLIN lines of <sys/epoll.h> or an #if guard around a single constant, was reported as a syntax error, and the error cascaded into the rest of the file.

Misc#

  • Changed: Telemetry now includes a boolean flag if Noctule has a license or not. As always, any telemetry is optional, off by default, anonymous, and requires an opt-in. It’ll help the development if you turned it on, though.

3.1.0#

Swift code style and formatter#

  • Added: Many new options to the Swift code formatter.
  • Added: Indent size, tab size and line length of the Swift code style are read from the active formatter’s configuration (.swift-format, .swiftformat, .swiftlint.yml) or from the Xcode project. The source is configurable in the “General” tab at “Settings > Editor > Code Style > Swift (Noctule)”.
  • Added: Xcode project text settings (indent width, tab width, tabs or spaces) are applied to non-Swift files, e.g. Objective-C. Turn it off with “Enable Xcode project code style support” at “Settings > Editor > Code Style”.
  • Fixed: The “Chained method indent” setting was missing from “Settings > Editor > Code Style > Swift (Noctule) > Tabs and Indents”, so the indentation of wrapped chained calls, e.g. .filter() and .map() on lines of their own, was stuck at 8 spaces.
  • Fixed: Reformatting put a space in front of ! and ? where Swift does not allow one, e.g. spawnResultBox!.take() became spawnResultBox !.take(). Forced values and other postfix operators, try!, as!, a failable init? and key paths keep their spacing now.
  • Fixed: Reformatting broke #warning("...") and #error("...") apart, into # warning and the message on the next line.
  • Fixed: A ! or ? written after a tab, or at the start of a line, was read as a postfix operator, so a tab-indented file could change its meaning when it was reformatted with spaces.
  • Added: Swift 6.4 grammar support for the “borrow” and “mutate” accessors of a computed property or subscript (SE-0507), including the “yielding” variants and the var element: E { borrow mutate } form of a protocol requirement.
  • Changed: A trailing ? or ! behind a some or any type now applies to the whole type, i.e. any P? is (any P)? (SE-0521).
  • Fixed: Reformatting broke a generic operator function, e.g. func <-> <Base>(…), by removing the space in front of its generic parameters, which made the < part of the operator’s name.
  • Fixed: Reformatting inserted a blank line between a comment and the declaration written below it, e.g. between // something and func something(). A comment on a line of its own now stays attached to the element below it, and a comment trailing a declaration keeps its line.
  • Fixed: Pressing Enter inside a switch indented the new line one level too deep, e.g. behind the closing brace of an if written in a case. A new line now continues the case it belongs to, follows the “Indent ‘case’ branches” setting below the brace of a switch, and lines up with the arguments of a call or the parameters of a declaration when it is opened in such a list.
  • Fixed: “Join Lines” inserted a semicolon into a statement written over several lines, e.g. between the calls of a chain like a.b() and .c(), which broke the code. A semicolon is now only added between two statements which follow each other.
  • Fixed: The formatter configuration source picked in “Settings > Editor > Code Style > Swift (Noctule) > Code style” was not kept: the code style still used the value the tab was opened with.
  • Fixed: Pressing Enter inside a chain of calls, e.g. behind Stack {} or .padding() of a SwiftUI view, indented the new line far to the right instead of keeping it with the calls around it. A new line now lines up with the call which follows it.
  • Fixed: The braces of a switch without cases, e.g. switch value { } while it is being written, were read as a closure passed to the expression it switches over. The body of a switch is now always its own, which also fixes the indentation of a line opened right after switch value {.
  • Fixed: The “Chained method calls” wrapping setting also broke up plain member accesses, e.g. model.owner.address.city or Foundation.Date.now. It now only applies to chains of at least two calls.
  • Fixed: Four Swift constructs were reported as syntax errors: a closure parameter with an argument label, e.g. { (_ granted: Bool) in }; an operator declaration with generic parameters, e.g. func <-> <Base>(…); two divisions on one line, e.g. self.init(red: r/255, green: g/255), which were read as a regular expression literal; and an enum case pattern named after a keyword, e.g. if case .import(let data) = action.

Swift language support#

  • Fixed: A subscript call without arguments, e.g. x[] of a type declaring subscript(), was a syntax error.
  • Fixed: Renaming an element to a keyword, e.g. class, now creates a backtick-escaped raw identifier, and string literals created from text escape quotes and backslashes.
  • Fixed: The Swift test run configuration and its run line markers could use stale positions right after typing.
  • Fixed: The spellchecker reported Swift keywords and common terms of Swift development as typos, e.g. deinit, fileprivate, associatedtype, precedencegroup and file types like xcconfig or xcframework.

SwiftFormat and SwiftLint#

  • Changed: swiftformat --ruleinfo is cached for the whole application, so several open projects no longer run it separately.
  • Fixed: The lookup of a .swiftformat configuration file could pick up files outside of the project. It is now limited to the project base directories.
  • Fixed: “Format on Save” and “Reformat with SwiftFormat” reported unable to find swiftformat executable when the tool is missing. A notification with the actual problem is shown instead.
  • Fixed: “Fix all with SwiftLint” did nothing when the swiftlint executable could not be found. A notification is now shown.
  • Fixed: The IDE could run out of memory while a command line tool, e.g. SwiftFormat or SwiftLint, was analyzing a file. A tool which returns an unexpectedly large amount of output is now stopped and its result is ignored.

Xcode projects#

  • Added: Sources of Xcode test targets are marked as test source roots.
  • Added: Running and starting simulators are marked with the green live indicator in the Xcode simulators tool window.
  • Changed: Faster resolution of file paths and of values derived from the project model, e.g. build settings, in large Xcode projects.
  • Changed: A burst of workspace events, e.g. during a refresh or when a .sourcekit-lsp/config.json changes, triggers a single debounced refresh instead of one per event.
  • Fixed: “Build and Launch with Xcode” silently did nothing when the scheme or destination selection was missing. An error notification is now shown.
  • Fixed: An Xcode workspace referencing projects outside of its own root directory, e.g. ../Other/Other.xcodeproj, only registered the workspace root as content root.
  • Fixed: A localized resource, e.g. a storyboard or .strings file in a *.lproj directory, did not resolve to a file.
  • Fixed: A broken project.pbxproj, e.g. truncated or with unexpanded {{placeholder}} values, and a contents.xcworkspacedata with invalid XML were reported as startup errors. Such projects and workspace files are now skipped.
  • Fixed: An untidy TARGETED_DEVICE_FAMILY, e.g. 1, 2 or a trailing comma, failed with a NumberFormatException.
  • Fixed: Reading system_profiler hardware data failed without chip_type or model_number, e.g. on Intel Macs.
  • Fixed: An Xcode installation found by more than one detector was reported several times.
  • Fixed: Importing a project did not exclude build artifacts, e.g. .build, from indexing.
  • Fixed: Xcode installations with a name other than Xcode.app or Xcode-<version>.app were not detected, e.g. a beta at /Applications/Xcode-27.0.0-Beta.5.app.
  • Fixed: xcode-build-server was not executed with the configured Xcode toolchain, but with the system’s default Xcode toolchain.
  • Fixed: Noctule will prompt the user if an Xcode toolchain is not yet fully set up for first time use, for example, when the license has not been accepted yet or if components need to be downloaded by Xcode.
  • Changed: Listing simulators and devices of an Xcode installation with an unaccepted license agreement now explains how to accept it, instead of only showing the exit code of the failed command.

Building#

  • Fixed: The build view showed no result status. It now shows “Successfully built” or “Build failed” when the build finishes.
  • Fixed: Relative file paths in build output were not turned into links.
  • Fixed: A build step could be lost when several sub-processes finished at the same time, and a detached build process kept the build view in memory.

General#

  • Added: Noctule raises an error if it detects a common crack of JetBrains plugins. If you’re seeing such errors but don’t use such cracks, please report this.
  • Changed: Telemetry data is sanitized before it is sent. File system paths are replaced with a placeholder, keeping only the file name.
  • Fixed: An invalid telemetry endpoint URL in NOCTULE_OTEL_URL was used unvalidated. An invalid value now falls back to the default endpoint.
  • Fixed: The machine-local application settings, e.g. the paths of the swiftformat, swiftlint and xcode-build-server executables, were included in Settings Sync.
  • Fixed: Error No console tab found for tabId in remote development.
  • Fixed: Error file is deleted, can't be loaded when files were deleted, e.g. by a branch switch, while build directories were collected.
  • Fixed: The workspace configuration service could hold up other work while it updated its state.
  • Fixed: Memory leak of the console editors of the Noctule Log tool window.
  • Fixed: Memory leak in the language server telemetry when a request never received a response, e.g. after a server crash or restart.

3.0.1#

  • Fixed: The Swift parser recursed up to 1,000 levels deep at every position where an expression was expected but absent, e.g. in incomplete code. This wasted a lot of CPU time during reparsing and reformatting, and could freeze the IDE. The cause was the unmatchable grammar rule for SE-0308 postfix #if member expressions, which was removed; postfix #if blocks are still parsed as conditional compilation blocks, as before.

Changes of 3.0.0#

  • Added: Support for Objective-C.
    This feature requires an active license or trial.
    Full support for Objective-C needs either an Xcode project with xcode-build-server or a compile_commands.json file paired with Noctule’s project support for compilation databases should provide meaningful results, too.
  • Added: Built-in Objective-C formatter. It’s offering most of AppCode’s / CLion’s code style settings for Objective-C.
  • Added: Objective-C string literals are language injection hosts, so "...", @"..." and L"..." can hold another language. Escape sequences are decoded for the injected fragment and written back escaped, and adjacent literals, which C concatenates, are treated as a single piece of text.
  • Added: Text pasted into an Objective-C string literal is escaped, and text copied out of one is unescaped. It can be turned off at “Settings > Editor > General > Smart Keys > Objective-C (Noctule)”.
  • Added: The Objective-C formatter aligns adjacent string literals on their opening quote, so that a string written over several lines reads as one block. “Align adjacent string literals” of the Wrapping and Braces settings turns it off.
  • Added: Typing a quote in Objective-C closes the string literal, and Enter inside one splits it into two adjacent literals aligned on their opening quote. A line break cannot appear inside a literal of C, and adjacent literals are concatenated, so the two halves are the string the literal held before.
  • Added: “Join Lines” merges two adjacent Objective-C string literals back into one, undoing what the Enter key split. It leaves them alone where merging would change the string, i.e. where the @ or L of the second literal carries its type, or where a numeric escape would swallow the digits behind it.
  • Added: Support for the Copyright plugin. Copyright profiles configured at “Settings > Editor > Copyright” are applied to Swift and Objective-C files.
  • Added: Objective-C documentation comments, i.e. ///, //!, /** */ and /*! */, are recognized as such.
  • Added: Swift documentation comments, i.e. /// and /** */, are recognized as such (#103).
  • Added: Swift grammar support for language features which were not parsed before.
    • Parameter packs: each T, repeat each T, pack iteration and packs in generic types (SE-0393, SE-0398, SE-0399, SE-0408).
    • Module selectors, e.g. Swift::print("hi") (SE-0491).
    • consume and unsafe expression operators (SE-0366, SE-0458).
    • Freestanding declaration macros in type bodies, e.g. #myMacro inside a struct (SE-0397).
    • Init accessors of computed properties (SE-0400).
    • nonisolated on type and protocol declarations and on conformances (SE-0449, SE-0470).
    • isolated and nonisolated deinitializers (SE-0371).
    • sending parameters and results (SE-0430).
    • Conditional compilation with hasFeature(...) and hasAttribute(...), including attributes wrapped in #if (SE-0362, SE-0367).
    • #unavailable(...) conditions (SE-0290).
    • for try await and for unsafe loops (SE-0298, SE-0458).
    • some ~Copyable and any ~Copyable (SE-0427).
    • class subscript declarations (SE-0254).
    • Attributes on closure parameters, e.g. { (@Clamped value: Int) in } (SE-0293).
    • Multi-character operator names in operator declarations, e.g. infix operator <=> (SE-0077).
    • #selector(getter:) and #selector(setter:) (SE-0064).
    • Keyword labels of trailing closures, e.g. ifelse(c) { } else: { } (SE-0279).
    • Raw identifiers as parameter names and argument labels (SE-0451).
  • Improved: enum bodies are now reparsed incrementally while typing, like the other type bodies.
  • Fixed: Restarting SourceKit LSP did not use an updated toolchain setting.
  • Fixed: Error recovery of the Swift parser.
  • Fixed: Error recovery of the Objective-C parser.
  • Fixed: unowned(safe) and unowned(unsafe) capture specifiers in closure capture lists were not parsed.
  • Fixed: Using actor or macro as a variable name, e.g. actor.run() or macro = 1, was parsed as a broken declaration instead of an expression.
  • Fixed: Swift is now parsed case-sensitively. Identifiers which only differ in case from a contextual keyword were parsed as that keyword, e.g. a parameter of type Isolated was parsed as the isolated parameter modifier.
  • Fixed: any P.Type is the existential metatype any (P.Type), it was parsed as (any P).Type (SE-0335).
  • Fixed: distributed is now part of the actor declaration instead of a separate expression in front of it (SE-0336).
  • Fixed: Extended regular expression literals with more than one delimiter, e.g. ##/.../##, ended too early (SE-0354).
  • Fixed: A hash-prefixed keyword is no longer separated from its argument clause by the formatter, e.g. #selector (getter: x) is formatted as #selector(getter: x).

3.0.0#

  • Added: Support for Objective-C.
    This feature requires an active license or trial.
    Full support for Objective-C needs either an Xcode project with xcode-build-server or a compile_commands.json file paired with Noctule’s project support for compilation databases should provide meaningful results, too.
  • Added: Built-in Objective-C formatter. It’s offering most of AppCode’s / CLion’s code style settings for Objective-C.
  • Added: Objective-C string literals are language injection hosts, so "...", @"..." and L"..." can hold another language. Escape sequences are decoded for the injected fragment and written back escaped, and adjacent literals, which C concatenates, are treated as a single piece of text.
  • Added: Text pasted into an Objective-C string literal is escaped, and text copied out of one is unescaped. It can be turned off at “Settings > Editor > General > Smart Keys > Objective-C (Noctule)”.
  • Added: The Objective-C formatter aligns adjacent string literals on their opening quote, so that a string written over several lines reads as one block. “Align adjacent string literals” of the Wrapping and Braces settings turns it off.
  • Added: Typing a quote in Objective-C closes the string literal, and Enter inside one splits it into two adjacent literals aligned on their opening quote. A line break cannot appear inside a literal of C, and adjacent literals are concatenated, so the two halves are the string the literal held before.
  • Added: “Join Lines” merges two adjacent Objective-C string literals back into one, undoing what the Enter key split. It leaves them alone where merging would change the string, i.e. where the @ or L of the second literal carries its type, or where a numeric escape would swallow the digits behind it.
  • Added: Support for the Copyright plugin. Copyright profiles configured at “Settings > Editor > Copyright” are applied to Swift and Objective-C files.
  • Added: Objective-C documentation comments, i.e. ///, //!, /** */ and /*! */, are recognized as such.
  • Added: Swift documentation comments, i.e. /// and /** */, are recognized as such (#103).
  • Added: Swift grammar support for language features which were not parsed before.
    • Parameter packs: each T, repeat each T, pack iteration and packs in generic types (SE-0393, SE-0398, SE-0399, SE-0408).
    • Module selectors, e.g. Swift::print("hi") (SE-0491).
    • consume and unsafe expression operators (SE-0366, SE-0458).
    • Freestanding declaration macros in type bodies, e.g. #myMacro inside a struct (SE-0397).
    • Init accessors of computed properties (SE-0400).
    • nonisolated on type and protocol declarations and on conformances (SE-0449, SE-0470).
    • isolated and nonisolated deinitializers (SE-0371).
    • sending parameters and results (SE-0430).
    • Conditional compilation with hasFeature(...) and hasAttribute(...), including attributes wrapped in #if (SE-0362, SE-0367).
    • #unavailable(...) conditions (SE-0290).
    • for try await and for unsafe loops (SE-0298, SE-0458).
    • some ~Copyable and any ~Copyable (SE-0427).
    • class subscript declarations (SE-0254).
    • Attributes on closure parameters, e.g. { (@Clamped value: Int) in } (SE-0293).
    • Multi-character operator names in operator declarations, e.g. infix operator <=> (SE-0077).
    • #selector(getter:) and #selector(setter:) (SE-0064).
    • Keyword labels of trailing closures, e.g. ifelse(c) { } else: { } (SE-0279).
    • Raw identifiers as parameter names and argument labels (SE-0451).
  • Improved: enum bodies are now reparsed incrementally while typing, like the other type bodies.
  • Fixed: Restarting SourceKit LSP did not use an updated toolchain setting.
  • Fixed: Error recovery of the Swift parser.
  • Fixed: Error recovery of the Objective-C parser.
  • Fixed: unowned(safe) and unowned(unsafe) capture specifiers in closure capture lists were not parsed.
  • Fixed: Using actor or macro as a variable name, e.g. actor.run() or macro = 1, was parsed as a broken declaration instead of an expression.
  • Fixed: Swift is now parsed case-sensitively. Identifiers which only differ in case from a contextual keyword were parsed as that keyword, e.g. a parameter of type Isolated was parsed as the isolated parameter modifier.
  • Fixed: any P.Type is the existential metatype any (P.Type), it was parsed as (any P).Type (SE-0335).
  • Fixed: distributed is now part of the actor declaration instead of a separate expression in front of it (SE-0336).
  • Fixed: Extended regular expression literals with more than one delimiter, e.g. ##/.../##, ended too early (SE-0354).
  • Fixed: A hash-prefixed keyword is no longer separated from its argument clause by the formatter, e.g. #selector (getter: x) is formatted as #selector(getter: x).

2.1.1#

  • Fixed #57: A project with several nested Xcode or SPM workspaces did not work correctly. If you make changes to the workspace configuration, you have to reopen the project for now to activate the changes. This will be solved in another update.
  • Fixed: Workspace directories passed to SourceKit LSP now have a stable sort order.
  • Fixed: Setting “migratedAutodetectionSetting” was stored in project setting file noctule.xml, which caused unnecessary changes in version control. The setting was migrated to workspace.xml, which is not shared by VCS.
  • Fixed: Sometimes, diagnostics were not refreshed in the editor after SourceKit LSP fully initialized. Registry key noctule.lsp.publishDiagnostics.enabled allows to turn push diagnostics on to allow SourceKit LSP to trigger a refresh in the editor. If turned off for now (just like before) until the impact is clearer. The registry is available at Help > Find Action > Registry and then just type noctule to find the key.
  • Fixed: Exception Invalid XML value at position: 17:7: In: Scheme/buildAction Error: 17:7 - Fields [parallelizeBuildables, buildImplicitDependencies] are required for type with serial name 'BuildAction', but they were missing.
  • Fixed: Exception Incomplete XCode project directory: project.pbxproj while collecting schemes from an Xcode workspace or project.

Changes in the LSP Library#

  • Fixed: Declare missing client refreshSupport = true of SemanticTokensWorkspaceClientCapabilities.

2.1.0#

2.0 is a new major version. Please refer to the release announcement to learn more about it.

Version 2.1.0 adds a few more features and stabilizes Noctule’s Xcode support. A new trial is available with 2.1.x.

  • Updated: Build against the 2026.2 release.
  • Added: Loading of Xcode destinations is much faster now. Xcode projects with many schemes will be fully available after seconds and not minutes. If Noctule displays a different list than Xcode, please report a bug.
  • Added: Provide a generated JSON schema for .swift-format files. The file configures the options of the Swift toolchain’s swift format command.
  • Added: Improved support for SwiftFormat
    • Added: Show warnings and errors of SwiftFormat (via swiftformat --lint) in Swift files. A “Reformat with SwiftFormat” quick fix allows quickly applying the changes proposed by SwiftFormat.
    • Added: The settings to configure SwiftFormat were moved from the “Format on Save” entry to the top-level of Preferences > Languages & Frameworks > Swift (Noctule).
    • Added: Support for .swiftformat configuration files:
      • New file type “SwiftFormat Configuration” for .swiftformat files. *.swiftformat files are recognized as the same file type, for example to configure additional configuration files in your project. You can add your own extensions in the settings, of course.
      • Basic syntax highlighting.
      • References to unknown options and rule names are highlighted as warnings.
      • Code completion in the editor for --option references and for rule reference passed to --enable and others.
      • Quick documentation in the editor for --option references and for rule reference passed to --enable and others.
  • Added: Better support for Property List files (*.plist)
    • Binary property list files are now better supported. *.xcuserstate is now marked as a binary file.
    • A new table-based viewer is available now for Plist files. It’s shown for binary, text-based and XML-based property lists. For now, it only supports viewing. Editing may be added later if there’s demand. The viewer is a paid feature and is only available with an active license or trial.
  • Fixed: The Xcode project view did not show all items.
  • Fixed: Autodetection of new projects is now behind a user setting. The setting will be turned off automatically for projects imported from the Xcode .xcodeproj or .xcworkspace directories or from a Package.swift file. A notification is shown for existing projects to tell about the new setting. This change improves the load time of projects and also prevents Noctule from loading dependencies of the main project as subprojects.
  • Fixed: Selected destinations were not always restored.
  • Fixed: Launching a simulator sometimes failed with “Failed to load Xcode build settings”.
  • Fixed: Opening a fresh clone of an Xcode project (without a project.xcworkspace directory created by Xcode or xcodebuild) failed.
  • Fixed: Alternative toolchains installed with xcodes were not detected.
  • Fixed: Noctule’s new “Autodetect Swift workspaces” is now also turned off for projects imported from a directory (with or without Noctule).
  • Fixed: If an Xcode project was opened in an IDE with both Noctule and Kotlin Multiplatform installed, the dialog to let you choose the import type displayed “Noctule project project”. It now displays a more helpful “Noctule (Xcode, SPM, BSP, Compilation database)” label.

2.0.5#

2.0 is a new major version. Please refer to the release announcement to learn more about it.

  • Added: New action “Copy simulator ID” in the context menu of simulator devices in the Xcode simulators tool window.
  • Added: New action “Create run configuration…” in the context menu of a simulator device in the Xcode simulators tool window.
  • Fixed: Auto-created schemes were not properly shown in the user interface. Additionally, because a wrong fallback was used, the destinations were shown empty in Xcode projects with only auto-created schemes.
  • Fixed: “Deploy to simulator” sometimes failed with the error “Failed to load build settings”.
  • Fixed: The “choose destination” action of the Xcode run configuration editor is now fetching destinations from Xcode if they are not available yet. This allows editing Xcode run configurations for Xode projects or workspaces outside the current IDE project.
  • Fixed: Schemes shown in the dropdown box in Xcode run configuration settings were not sorted with Xcode’s sort order.
  • Fixed: Preselect a default Xcode project in new Xcode run configurations.
  • Fixed: The “isShown” property of Xcode schemes was not always read, which caused that hidden schemes were shown in the scheme dropdown in the main toolbar.
  • Fixed: In the “Xcode simulator” run configuration, the dialog to choose a destination incorrectly displayed not only simulator devices.

2.0.4#

2.0 is a new major version. Please refer to the release announcement to learn more about it.

  • Fixed: OutOfMemory exceptions like Java heap space when parsing or opening large Xcode projects.
  • Fixed: Parsing of old-style .plist files was improved.
  • Fixed: Guard against deeply nested structures in the PList parser used for Xcode project files.
  • Updated: Build against the latest 2026.2 eap.

Changes in the LSP library#

  • Fixed: Exception must not be called, because we implement ChooseByNameContributorEx2.

2.0.3#

2.0 is a new major version. Please refer to the release announcement to learn more about it.

  • Fixed: Exceptions were reported for the parsing of presumably large Xcode projects. The parsing of Xcode projects has been reimplemented for a more memory-friendly and hopefully faster parsing.
  • Fixed: Escaped string content was not supported in PList and Xcode project files.
  • Fixed: Several exceptions when opening a directory of a Flutter project.
  • Fixed: One more cause of exception Failed to extract Xcode property value ....
  • Updated: The bundled SwiftLint JSON schema was improved and updated.
  • Added: Show a notification about the required license for .swiftlint.yml files. Support for SwiftLint is part of the paid features.

2.0.2#

2.0 is a new major version. Please refer to the release announcement to learn more about it.

  • Fixed: Exception For input string: "undefined" parsing an Xcode project file.
  • Fixed: Exception Cannot invoke "swift.....getEmptyText()" because the return value of "swift....getTree()" is null.
  • Fixed: Provide searchable options with the plugin to allow a user to search for Noctule’s settings in the preferences.
  • Added: Add the JVM’s -Xmx value (as megabytes) to the telemetry attributes to allow better debugging of “Java heap space” exceptions while parsing an Xcode project. The attribute is sent with error reports and with telemetry (if enabled by the user).
  • Added: Send a telemetry event (if enabled by the user) after a rename operation inside a Swift file.

Changes in the LSP library#

  • Fixed: Exception “Attempt to take write-intent lock was prevented …” attempting to show an error message.

2.0.1#

2.0 is a new major version. Please refer to the release announcement to learn more about it.

  • Fixed: Exception “InvalidXcodeProjectFileTypeException” opening or parsing an Xcode project. This was caused to large project.pbxproj files. It’s now possible to open such Xcode projects with Noctule.
  • Fixed: Exception ID 'qw' is already taken by action 'null ()' (swift.qw).

2.0.0#

Most Important Changes#

  • Initial support for Xcode development with xcode-build-server integration, build support with xcodebuild, run configurations for building and deploying to a simulator, a tool window to manage simulators, a new project view for Xcode projects and more.
  • Support for JetBrains Remote development. This allows, for example, executing the IDE backend on a Mac and the frontend on your preferred platform. All features, including managing Xcode simulators, are supported in remote development mode.

Breaking changes#

  • 2.0 prepares for stable settings. You may have to reconfigure your toolchain, custom settings for Swift workspace directories, and perhaps a few more settings of Noctule. Most users won’t have any customized directory settings, though.
  • 2025.3 and later are supported now. Support for earlier versions was dropped.

Planned Features#

The following features are not yet available but are planned for the next releases:

  • Xcode test support for the integrated test runner
  • Debugging support to integrate with the existing run configurations
  • Better code insight for Swift files
  • Improvements to SwiftLint support
  • Improvements to Xcode support

Language Features#

  • Support for “View > Type Info”.
  • Support for “Navigate > Type Declaration” and “View > Quick Type Definition” with a Swift 6.4 toolchain or later.
  • Navigation, find usages and similar features were not working inside *.swiftinterface files of Swift base libraries.
  • The Swift lexer has been made incremental again, which should improve performance and editor responsiveness.

Xcode Support#

  • Support to detect and open new projects from project.xcworkspace/ or project.xcodeproj/ directories.
  • Support building a project or workspace with actions of the “Build” menu.
  • Integration with “xcode-build-server” to integrate Xcode projects with SourceKit LSP.
  • Run configurations to execute xcodebuild and to deploy an application to a simulator.
  • Dropdowns similar to Xcode’s UI are shown in the main toolbar to allow choosing the current scheme and destination for your development. xcode-build-server and also Xcode’s own command line tooling are built around schemes and destinations.
  • Tool window “Xcode simulators” showing the available simulators. Actions like “Boot” or “Shutdown” are available on items shown in the tree.

Build Improvements#

  • The build output is now shown in the IDE’s own “Build” tool window. Previously, Noctule’s build output was shown in a separate “Noctule Logs” tool window.
  • Building with “xcodebuild” is integrating now with the “Build” menu actions.

Detailed Changelog#

  • Added: A user-friendly dialog for set up Noctule at first launch. It also is available from the main menu at Help > Configure Noctule.
  • Added: Support “View > Type Info” for Swift files.
  • Added: Support “Navigate > Type Declaration” for Swift files. The underlying feature is available with a recent development build of Swift 6.4 or the final release of Swift 6.4 when it’s available.
  • Added: Support “View > Quick Type Definition”, also available with a recent development snapshot of Swift 6.4 or later.
  • Added: In an Xcode project or workspace, xcode-build-server is now set up automatically if no buildServer.json file exists. The setup includes a build step with the currently selected scheme and invocation of the installed xcode-build-server command to create the configuration file. Noctule uses Apple’s SourceKit LSP and xcode-build-server to integrate the former with Xcode.
  • Updated: Locations where Noctule stores its settings. You may have to update some of Noctule’s settings. Unfortunately, this was necessary to prepare for long-term compatibility of the settings.
  • Fixed: Xcode projects, which have their project data in a subdirectory, can now be opened by Noctule. Nested project data is created by tools like Tuist, for example. Noctule now locates the top-level directory of such projects and opens it instead of the immediate parent directory of the project-name.xcodeproj/ directory.
  • Fixed: The SourceKit LSP server was not always launched when the IDE was executed in remote-development mode and a *.swift file was opened.
  • Fixed: Change to hopefully load Xcode destinations faster.
  • Fixed: Minor changes for possible performance improvements and less potential blocking of the UI.
  • Fixed: Don’t reload destinations after unrelated changes to the workspace settings.
  • Feature: Initial support and integration with Xcode projects. For now, support relies on xcode-build-server.
    You can now open a directory containing an Xcode workspace (*.xcworkspace/) or project (*.xcodeproj/) and Noctule will automatically set up the JetBrains project. Because Xcode projects need to be built and run on a Mac, Noctule has to be used on macOS.
    If you open an Xcode project, the main toolbar will show dropdowns to choose a scheme and destination. Xcode CLI tooling heavily depends on schemes, targets and destinations, and Noctule has to follow for the best integration. The destinations can take a long time to load, but they are cached to make them available immediately after opening a project. The caching will be improved in the future.
    You can use Tools > Noctule > Initialize xcode-build-server to build a project with xcodebuild and to create the xcode-build-server configuration (buildServer.json). This action uses the selected scheme and destinations to build the project.
    Further settings are available at Build, Execution, Deployment > Noctule, the Swift IDE, where you can configure the default settings and per-directory settings.
  • Feature: New toolwindow “Xcode simulator”, which is available on macOS and displays a tree of available Xcode simulators. You can group the tree by state (running/stopped/…), platform (iOS, macOS, …) and family (iOS 18.0, …). A context menu allows to perform basic operations like “Boot” or “Shutdown” on a simulator. The toolwindow is available in remote development mode.
  • Feature: Improve integration with remote development (i.e., when IDE frontend and backend running on different machines). The status bar widget is now displayed as if it was local, and the editor should be a bit snappier now. Many of the existing features were updated to work better with remote development.
  • Updated: Drop support for 2025.2. Unfortunately, this was required to implement support for the extended remote development support.
  • Feature: New run configuration type “Xcode build” to build an Xcode project with xcodebuild.
  • Feature: New run configuration type “Xcode simulator” to build and deploy an Xcode application to a simulator.
  • Feature: Integrate the “Project > Build…” actions with Xcode projects. Settings Build, Execution, Deployment > Noctule, the Swift IDE > Run swift build or xcodebuild for project build tasks needs to be enabled. The setting is automatically enabled if you open a Swift Package Manager or Xcode project for the first time.
  • Feature: Project view “Xcode workspace”. It’s available in the drop-down of the Project view, where you can choose the type (“Project”, “Packages”, “Project files”, …). This new view type displays the structure of the Xcode workspaces and projects found in the current JetBrains IDE project. The structure is read from the Xcode project.pbxproj project files and is similar to what Xcode would show. The project view is available on all platforms, not just on macOS.
  • Feature: Logs shown in the “Noctule Logs” toolwindow now work in remote development mode. This supports the server log and the log of build output.
  • Feature: “Go to reference” and “Find usages” on ID strings in project.pbxproj files. This was added to help working with Xcode project files and hopefully is useful for the occasional navigation inside project files.
  • Feature: Added lexer, parser and basic syntax highlighting for *.strings files.
  • Feature: Assign *.entitlements, *.xcscheme, *.intentdefinition to the XML file type.
  • Feature: Assign *.storekit, *.xcstrings to the JSON file type.
  • Feature: Unbundle OpenTelemetry libraries from the plugin and implement a simple, self-contained API to send logs and traces.
  • Feature: The OpenTelemetry HTTP endpoint used by Noctule can be configured by the environment variable “NOCTULE_OTEL_URL”. You can set it to a value like http://localhost:4318 if you would like to see what’s sent. An empty value turns off telemetry, regardless of plugin settings.
  • Updated: The plugin’s description and presentation on the Marketplace is more complete and up to date now.
  • Fixed: Test line markers were not launching the test run configuration if the IDE is running in split-mode (remote development).
  • Fixed: Navigation, find usages and more was broken inside in-memory sourcekit-lsp:// files, which are used for files inside base libraries.
  • Fixed: sourcekit-lsp sometimes crashed if the custom tests request was sent for in-memory sourcekit-lsp:// files.
  • Fixed: The Swift lexer was not working incrementally. The underlying problem, which prevents incremental lexing, has been fixed, and lexing/highlighting in large files should be more responsive again.

Changes in the LSP library#

  • Fixed: Better handling of static registration options for requests with dynamic registration. Also improves performance.
  • Fixed: Bug in static options processing.
  • Fixed: Documentation in split-mode was not shown.
  • Fixed: Exception about logged ControlFlowException.
  • Fixed: Exception after an LSP server tried to unregister a missing capability.
  • Fixed: Exception trying to navigate to a .swiftmodule file.
  • Fixed: Incorrect JSON was shown for the initializeIfNeeded request in the LSP server console.
  • Fixed: Provide API to skip didOpen/didClose for a file.
  • Fixed: Exception “Too many non-blocking read actions submitted at once”

2.0.0-eap11#

  • Fixed: Exception Failed to extract value from Xcode project, property: ... targets.
  • Fixed: Don’t show promotion and license notifications multiple times.

2.0.0-eap10#

  • Updated: As a preparation for 2.0, several features were made available only with a paid license: SwiftLint support, support for “format on save”, Xcode support, test runner. As mentioned for the past two years at several locations, Noctule was always planned as a freemium or paid plugin. But until now every feature was available for free.
  • Added: If a Swift file is saved with “format on save” turned off, show a notification to tell the user about the available feature. Without a license, it offers to manage the license. With a valid license, it lets the user choose the formatter for “format on save”.
  • Fixed: Exception ReadConstraint.inSmartMode() can't be used in LightEdit mode.

2.0.0-eap9#

  • Fixed: Better presentation of declarations for “Show Definition”.
  • Fixed: Imported module structure was not persistent and was reset after reopening a project.
  • Fixed: Selecting an Xcode destination did not work.
  • Fixed: Popups were not closed after choosing scheme or destination.
  • Fixed: “Find Usages” now highlights text snippets of the result as bold in the same way as in other languages.

Changes in the LSP library#

  • Fixed: Exception “Too many non-blocking read actions submitted at once”

2.0.0-eap8#

  • Added: Show build output of Noctule’s build support in the IDE’s build tool window. Previously, Noctule logged build output into its own tool window, which is unexpected.
  • Added: If telemetry is enabled, then exceptions and freezes detected by the IDE are automatically reported with 2026.1.3 or later. The minimum version of 2026.1 was updated to 2026.1.3.
  • Fixed: Exception Failed to extract value from Xcode project, property: ConstructorParamSpec(propertyName=targets ...) loading an Xcode project.
  • Changed: Noctule’s log toolwindow is hidden the sidebar by default now, because the build log is now shown in the IDE’s dedicated build tool window. You can find it in the “…” popup of the secondary tool windows in the left sidebar or at “Tools > Noctule > Show Log Tool Window”.

2.0.0-eap7#

  • Added: Create a better module structure for Xcode projects, which reference directories or files outside the Xcode project.
  • Added: Choose default schemes after opening an Xcode project.
  • Added: Choose default destinations after opening an Xcode project.
  • Fixed: Freeze with the 2026.2 eap 262.7581.18 if the IDE was opened with opened editors at startup.
  • Fixed: Better diagnostics for exception “Missing value or unexpected type for key …” when opening an Xcode project.
  • Fixed: Exception Null is not allowed for parameter defaultConfigurationName ... parsing an Xcode project.
  • Fixed: Exception Field 'deviceTypeIdentifier' is required for type ... parsing an Xcode project.
  • Fixed: Exception Failed to create instance of XCSwiftPackageProductDependency ... parsing an Xcode project.
  • Fixed: Fewer memory allocations parsing an Xcode project. May fix Java heap space exceptions.
  • Fixed: Exception StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 when pasting Swift code.
  • Fixed: Exception NoSuchElementException: Char sequence contains no character matching the predicate for .plist files.

Changes in the LSP library#

  • Fixed: Exception “Access from Event Dispatch Thread (EDT) is not allowed”.
  • Fixed: Exception “ConcurrentModificationException” while preparing the status bar popup.

2.0.0-eap6#

  • Fixed: NullPointerException which could have made the Xcode support unavailable.
  • Fixed: Potential freeze when toolchains are detected to prepare the launch of a SourceKit LSP server.
  • Updated: Better debug logging if a *.pbxproj file is detected with the wrong file type.

2.0.0-eap5#

  • Fixed: Log errors raised while loading Xcode destinations for a project.
  • Fixed: Improve support for the structure of Xcode projects generated by Tuist.

2.0.0-eap4#

  • Fixed: Drop use of internal API and prepare for the release for 2026.2 eap.

2.0.0-eap3#

  • Added: In an Xcode project or workspace, xcode-build-server is now set up automatically if no buildServer.json file exists. The setup includes a build step with the currently selected scheme and invocation of the installed xcode-build-server command to create the configuration file. Noctule uses Apple’s SourceKit LSP and xcode-build-server to integrate the former with Xcode.
  • Updated: Locations where Noctule stores its settings. You may have to update some of Noctule’s settings. Unfortunately, this was necessary to prepare for long-term compatibility of the settings.
  • Fixed: Xcode projects, which have their project data in a subdirectory, can now be opened by Noctule. Nested project data is created by tools like Tuist, for example. Noctule now locates the top-level directory of such projects and opens it instead of the immediate parent directory of the project-name.xcodeproj/ directory.
  • Fixed: The SourceKit LSP server was not always launched when the IDE was executed in remote-development mode and a *.swift file was opened.

2.0.0-eap2#

  • Added: A user-friendly dialog for set up Noctule at first launch. It also is available from the main menu at Help > Configure Noctule.
  • Added: Support “View > Type Info” for Swift files.
  • Added: Support “Navigate > Type Declaration” for Swift files. The underlying feature is available with a recent development build of Swift 6.4 or the final release of Swift 6.4 when it’s available.
  • Added: Support “View > Quick Type Definition”, also available with a recent development snapshot of Swift 6.4 or later.
  • Fixed: Change to hopefully load Xcode destinations faster.
  • Fixed: Minor changes for possible performance improvements and less potential blocking of the UI.
  • Fixed: Don’t reload destinations after unrelated changes to the workspace settings.

2.0.0-eap1#

  • Feature: Initial support and integration with Xcode projects. For now, support relies on xcode-build-server.
    You can now open a directory containing an Xcode workspace (*.xcworkspace/) or project (*.xcodeproj/) and Noctule will automatically set up the JetBrains project. Because Xcode projects need to be built and run on a Mac, Noctule has to be used on macOS.
    If you open an Xcode project, the main toolbar will show dropdowns to choose a scheme and destination. Xcode CLI tooling heavily depends on schemes, targets and destinations, and Noctule has to follow for the best integration. The destinations can take a long time to load, but they are cached to make them available immediately after opening a project. The caching will be improved in the future.
    You can use Tools > Noctule > Initialize xcode-build-server to build a project with xcodebuild and to create the xcode-build-server configuration (buildServer.json). This action uses the selected scheme and destinations to build the project.
    Further settings are available at Build, Execution, Deployment > Noctule, the Swift IDE, where you can configure the default settings and per-directory settings.
  • Feature: New toolwindow “Xcode simulator”, which is available on macOS and displays a tree of available Xcode simulators. You can group the tree by state (running/stopped/…), platform (iOS, macOS, …) and family (iOS 18.0, …). A context menu allows to perform basic operations like “Boot” or “Shutdown” on a simulator. The toolwindow is available in remote development mode.
  • Feature: Improve integration with remote development (i.e., when IDE frontend and backend running on different machines). The status bar widget is now displayed as if it was local, and the editor should be a bit snappier now. Many of the existing features were updated to work better with remote development.
  • Updated: Drop support for 2025.2. Unfortunately, this was required to implement support for the extended remote development support.
  • Feature: New run configuration type “Xcode build” to build an Xcode project with xcodebuild.
  • Feature: New run configuration type “Xcode simulator” to build and deploy an Xcode application to a simulator.
  • Feature: Integrate the “Project > Build…” actions with Xcode projects. Settings Build, Execution, Deployment > Noctule, the Swift IDE > Run swift build or xcodebuild for project build tasks needs to be enabled. The setting is automatically enabled if you open a Swift Package Manager or Xcode project for the first time.
  • Feature: Project view “Xcode workspace”. It’s available in the drop-down of the Project view, where you can choose the type (“Project”, “Packages”, “Project files”, …). This new view type displays the structure of the Xcode workspaces and projects found in the current JetBrains IDE project. The structure is read from the Xcode project.pbxproj project files and is similar to what Xcode would show. The project view is available on all platforms, not just on macOS.
  • Feature: Logs shown in the “Noctule Logs” toolwindow now work in remote development mode. This supports the server log and the log of build output.
  • Feature: “Go to reference” and “Find usages” on ID strings in project.pbxproj files. This was added to help working with Xcode project files and hopefully is useful for the occasional navigation inside project files.
  • Feature: Added lexer, parser and basic syntax highlighting for *.strings files.
  • Feature: Assign *.entitlements, *.xcscheme, *.intentdefinition to the XML file type.
  • Feature: Assign *.storekit, *.xcstrings to the JSON file type.
  • Feature: Unbundle OpenTelemetry libraries from the plugin and implement a simple, self-contained API to send logs and traces.
  • Feature: The OpenTelemetry HTTP endpoint used by Noctule can be configured by the environment variable “NOCTULE_OTEL_URL”. You can set it to a value like http://localhost:4318 if you would like to see what’s sent. An empty value turns off telemetry, regardless of plugin settings.
  • Updated: The plugin’s description and presentation on the Marketplace is more complete and up to date now.
  • Fixed: Test line markers were not launching the test run configuration if the IDE is running in split-mode (remote development).
  • Fixed: Navigation, find usages and more was broken inside in-memory sourcekit-lsp:// files, which are used for files inside base libraries.
  • Fixed: sourcekit-lsp sometimes crashed if the custom tests request was sent for in-memory sourcekit-lsp:// files.
  • Fixed: The Swift lexer was not working incrementally. The underlying problem, which prevents incremental lexing, has been fixed and lexing/highlighting in large files should be more reponsive again.

Changes in the LSP library#

  • Fixed: Better handling of static registration options for requests with dynamic registration. Also improves performance.
  • Fixed: Bug in static options processing.
  • Fixed: Documentation in split-mode was not shown.
  • Fixed: Exception about logged ControlFlowException.
  • Fixed: Exception after an LSP server tried to unregister a missing capability.
  • Fixed: Exception trying to navigate to a .swiftmodule file.
  • Fixed: Incorrect JSON was shown for the initializeIfNeeded request in the LSP server console.
  • Fixed: Provide API to skip didOpen/didClose for a file.

1.12.0#

  • Updated: Drop support for 2025.1. This is a preparation to improve the support and performance of remote development, for example to run the UI on Windows while the IDE’s backend is running on macOS. This is also needed for a cleaner and future-proof internal structure of the Noctule plugin. Very likely, support for 2025.2 will be dropped soon, too. If you’re still using 2025.1 or 2025.2, and you’re unable to switch to 2025.3, please let me know.
  • Updated: Build against latest 2026.1 eap.
  • Feature: Use swiftly list --format json if available with a newer version of Swiftly. If unavailable, fall back to swiftly list.
  • Feature: Store the Swiftly default toolchain without a selector to avoid unnecessary changes to the settings if the default toolchain is updated.
  • Feature: Support building of Xcode projects via Build > Build/Rebuild Project, Build > Build/Rebuild Module. Additional actions Build > Build/Rebuild Xcode project are also available and rely on the currently selected scheme.
  • Fixed: On macOS, detect Xcode toolchains over Swiftly and other providers.
  • Fixed: If swift in $PATH has the same version as swift provided by swiftly or other providers, show both and don’t hide one of the two.
  • Fixed: In “Format on Save” with the Swift toolchain engine, don’t use swift format --assume-filename current_file.swift - because Swift 6.0 and Swift 6.1 report an error if --assume-filename is used.
  • Fixed: Don’t pass configurations to SwiftLint if the located configuration files define a parent or child configuration.
  • Fixed: Parsing of identifier patterns and expression patterns, which were sometimes not handled correctly, e.g. case x<=10: in a switch statement.
  • Fixed: Parsing of distributed actor and distributed func declarations, #77
  • Fixed: Parsing of nonisolated(nonsending), #79.
  • Fixed: Parsing of trailing closures reusing names of keywords, e.g. await #expect { ... } throws: { ... }.
  • Fixed: Parsing of member expressions using true or false, e.g. something(param: EnhancedBool.true).
  • Fixed: Contextual keywords distributed, isolated, nonisolated, borrowing, nonsending were not properly highlighted.
  • Fixed: Highlighting of macro references (#expect ...).

Changes in the LSP library#

  • Added: Show LSP server diagnostics in batch inspections (Code > Inspect Code...).
  • Fixed: Incorrect reference to DAP CompletionItem in the sources.

1.11.1#

  • Added: Basic support for text-based plist files (*.plist, *.pbxproj): Parsing, basic syntax highlighting, brace matching, code folding.
  • Added: Assign *.xctestplan files to the JSON file type.
  • Added: The “Fix all” quick fix for SwiftLint violations is now only displayed if the underlying violation is correctable according to swiftlint rules.
  • Added: Bundle an auto-generated JSON schema file for .swiflint.yml files and automatically assign it to the configuration files in the IDE.
  • Updated: Build the release for 2026.1 against the latest EAP.
  • Added: Added settings for --enable-swift-testing, --enable-xctest and --sanitize=... to the “Swift Package Test” run configuration.
  • Fixed: Parsing of @path.Attribute().
  • Fixed: Parsing of implicit member expression reusing keywords (.else), #75.
  • Fixed: Keyword else was not highlighted as such.
  • Fixed: Exception PluginException: Range must be inside element being annotated: (7939,7944); but got: (7945,7961) and similar when highlighting incomplete declarations (actor, macro, enum).
  • Fixed: SwiftLint violations on empty lines were not displayed in the editor.
  • Fixed: The “Fix all” quick fix for SwiftLint violations was not working properly.
  • Fixed: SwiftLint highlighting was not working properly for nested configuration files, #76.

1.11.0#

  • Added: Experimental support for SwiftLint. Violations found by swiftlint lint are displayed in the editor. By default, SwiftLint is only executed if a .swiftlint.yml file is found in the context of the edited file. The settings can be configured at Preferences > Language & Frameworks > Noctule. They support turning off SwiftLint or to always run SwiftLint, regardless of a .swiftlint.yml file. The SwiftLint binary is searched in $PATH by default, but can also be configured manually in the settings.
  • Added: “Format on Save” support for SwiftLint. This integration executes swiftlint lint --fix --format for the current file.
  • Fixed: Project build actions “Build Project” and “Build Module” were always executed by Noctule, even if no Swift package exists in the project, #73. Now, the project build actions are only executed by Noctule (swift build) if the new setting Run Swift build for project build tasks is enabled. The setting is available at Preferences > Build, Execution, Deployment > Noctule. By default, the setting is turned off for existing projects and enabled for new projects created with “New Project > Swift Package”.
  • Fixed: Parsing of references to methods, e.g. something(arg:).
  • Fixed: “Build Swift Package” did not work reliably for nested Swift packages.
  • Fixed: The wizard did not allow applying the dialog of “New Module -> Swift Package”.
  • Fixed: The selected toolchain of the “New Swift Package” wizard was not saved correctly.

1.10.2#

  • Added: Folding for multi-line function call expressions.
  • Added: Folding for multi-line array literals.
  • Added: Folding for multi-line closure expressions, #70.
  • Added: Make multi-line trailing closures sticky, #70.
  • Added: Make an extension declaration sticky in the editor.
  • Fixed: Parsing of extension A where Self: B & C.
  • Fixed: Parsing of register(type: (action: () async -> Void, name: String).self), #72.
  • Fixed: Resources allocated for the settings configurables were not released properly.

1.10.1#

  • Fixed: The search for .build folders blocked the IDE for large projects, #71.
  • Fixed: The test runner was not handling test files with top-level tests (without a test suite) correctly.

1.10.0#

  • Added: Support “Editor > General > Appearance > Highlight only current declaration” for Swift files (aka “Focus Mode”).
  • Added: Automatically exclude Swift package folders .build and .index-build from indexing. These folders may be large, contain only build output and indexing them may slow down the IDE.
  • Added: Integrate with “Build -> Build Project/Module”, “Build -> Rebuild Project/Module” actions. For now, the output of these build commands is shown in the Noctule tool window. For a “Build” action, all Swift packages contained in the project or module are searched and built with swift build. Each swift build command is executed with the package-specific build settings, if there are any. The workspace-global settings are applied as a fallback. A “Rebuild” command executes swift package clean for all Swift packages before the swift build commands are executed.
  • Added: Two new actions “Build Swift Package X” and “Rebuild Swift Package X” to the main “Build” menu and to “Tools > Noctule”. The “Build” menu is only available in some JetBrains products, for example in IntelliJ IDEA and CLion.
  • Added: Run configuration to execute swift test with a test runner user interface.
  • Added: Test runner user interface attached to the swift test run configuration. It supports parameterized tests, ignored tests and more. For now, only the Swift Testing tests are supported. Tests based on XCTest are not yet supported, but this feature is planned to be implemented.
  • Added: Show run icon line markers next to test methods in an editor.
  • Added: New run configuration to execute a swift build command. This complements the run configurations for swift run and swift test.
  • Added: Noctule’s run configurations now provide a “Run before” step to build. Before, there was no setting to skip a build. You may have to add the setting to existing run configurations to keep build as part of swift run or swift test commands. This task is added by default to new run configurations. If you remove it, then swift run and swift test commands will not build the project before running an application or tests.
  • Added: Highlight file paths shown in the Noctule server log and the Noctule build log and make then clickable to navigate to the file. This is helpful to quickly open a file at the location of an error or warning.
  • Fixed: Show the top-level package first in the combobox to choose a Swift package.
  • Fixed: Parsing of extension [String] {} and similar syntax, #66.
  • Fixed: Parsing of (() async throws -> Void).self, #68.
  • Fixed: Parsing of identifiers named “any”, e.g. case .any or let any = 42.
  • Fixed: Formatting of tokens inside attributes was broken, for example @SomeAttribute([a,b,c]).
  • Fixed: File-level comments are now collapsed if the corresponding setting of the IDE is enabled.

Changes in the LSP library#

  • Updated: Wait up to 2 minutes for an LSP server to initialize or terminate. Previously, the timeout was 10 seconds, but with LSP servers like sourcekit-lsp it can take longer than that.
  • Updated: Change the default to allow the initializeIfNeeded request to show progress in the client.
  • Updated: Moved a few classes (cache manager, PositionEncoding) into the open API.
  • Fixed: Dynamic registrations by an LSP server where sometimes not processed correctly.
  • Fixed: Show LSP servers, which are being initialized, in the status bar widget.

1.9.1#

  • Added: Code vision context is shown for types, functions, methods, initializers and deinitializers. The context displays the author retrieved from the version control system if the feature is enabled in the IDE.
  • Added: Support “Join lines”. This inserts a semicolon if two separate statements are joined.
  • Added: Typing #" now inserts #" to complete the string literal.
  • Fixed: Injection handling after undo in the host editor.
  • Fixed: Exception NoSuchFileException: C:\Users\User\AppData\Local\Programs\Swift\Toolchains.
  • Fixed: Parse #""""""# as a plain string with content """" and not as an incomplete multiline string literal.
  • Fixed: Typing #""" to insert a new multi-line string was not working correctly.

Changes in the LSP Library#

  • Fixed: Exception You cannot get swift.lang.toolchain.SwiftToolchainService before component store is initialized and similar exceptions.
  • Fixed: Line feeds in labels of LSP intentions are now shown escaped. Previously, the line feed was stripped by the IDE.

1.9.0#

  • Added: Support 2026.1 EAP.
  • Removed: Dropped support for 2024.3.
  • Fixed: Injection into single-line and multi-line string literals is working better now. Language comments like // language=JSON before a string are now used to automatically detect the language to inject. “Edit Fragment…” is also available now in the context menu of a string literal. Special characters entered in a fragment editor are automatically escaped.
  • Added: Text pasted into simple or multi-line string literals is now escaped.
  • Added: Text copied from simple or multi-line string literals is now unescaped.
  • Added: Smart key settings for Swift with setting “Escape text on page in string literals”. The settings are available now at Editor > General > Smart Keys > Swift.
  • Fixed: Parsing of trailing commas was not complete.
  • Fixed: Parsing of attributes in closure expressions, for example Task { @MainActor in print("I'm running on the main actor") }.
  • Updated: The online documentation at noctule.dev was expanded with information about language injections, navigation, minor editor features and more. The website is work in progress.

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 for working with Objective-C string literals, i.e. "...", @"..." and L"...".
    • They are language injection hosts, with escape sequences decoded for the injected fragment and written back escaped. Adjacent literals, which C concatenates, are treated as a single piece of text.
    • Pasted text is escaped and copied text is unescaped. It can be turned off at Settings | Editor | General | Smart Keys | Objective-C (Noctule).
    • Typing a quote closes the literal, and Enter splits it into two adjacent literals, which C concatenates into the original string. “Join Lines” merges them back into one, unless merging would change the string.
    • The formatter aligns adjacent literals on their opening quote, so that a string written over several lines reads as one block. “Align adjacent string literals” of the Wrapping and Braces settings turns it off.
  • Fixed: Error recovery of the Swift and Objective-C parsers.
    Code which cannot be parsed, e.g. while it is being typed, used to end the enclosing construct at its opening token: a stray token at the top level, inside a { ... } block, a type body, an @interface, an @implementation, a switch, a parameter list, an instance variable list or a struct dropped everything after it out of the syntax tree, which lost highlighting, navigation and formatting for the rest of the file. The affected constructs now skip what they cannot parse and keep their closing }, @end or ;, so only the faulty part is marked as an error. Both formatters are now verified against code with syntax errors, too.
  • Changed: The members of type bodies, i.e. of struct, class, actor, extension, protocol and enum, and expressions without a prefix operator no longer have a wrapper element in the syntax tree.
    This removes one tree level from almost every expression and makes the tree smaller and faster to work with; formatting is unchanged.
  • Fixed: Several cases which the Swift parser handled incorrectly.
    • Swift is now parsed case-sensitively. Identifiers which only differ in case from a contextual keyword were parsed as that keyword, e.g. a parameter of type Isolated was parsed as the isolated parameter modifier.
    • Using actor or macro as a variable name, e.g. actor.run() or macro = 1, was parsed as a broken declaration instead of an expression.
    • unowned(safe) and unowned(unsafe) capture specifiers in closure capture lists were not parsed.
    • any P.Type is the existential metatype any (P.Type), it was parsed as (any P).Type (SE-0335).
    • distributed is now part of the actor declaration instead of a separate expression in front of it (SE-0336).
    • Extended regular expression literals with more than one delimiter, e.g. ##/.../##, ended too early (SE-0354).
  • 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