diff --git a/CHANGELOG.md b/CHANGELOG.md index dc49a4b3..cb38c155 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,11 @@ Changelog structure reference: ## [Unreleased] +### Added + +- LSP + - Configurable inlay hints file size limit to reduce IDE lag + ## [25.0.2] ### Fixed diff --git a/lsp/src/main/kotlin/com/falsepattern/zigbrains/lsp/ZigLanguageServerFactory.kt b/lsp/src/main/kotlin/com/falsepattern/zigbrains/lsp/ZigLanguageServerFactory.kt index 8cc3b328..08f226b0 100644 --- a/lsp/src/main/kotlin/com/falsepattern/zigbrains/lsp/ZigLanguageServerFactory.kt +++ b/lsp/src/main/kotlin/com/falsepattern/zigbrains/lsp/ZigLanguageServerFactory.kt @@ -68,7 +68,14 @@ class ZigLanguageServerFactory: LanguageServerFactory, LanguageServerEnablementS } features.inlayHintFeature = object: LSPInlayHintFeature() { override fun isEnabled(file: PsiFile): Boolean { - return project.zls?.settings?.inlayHints == true + val settings = project.zls?.settings ?: return false + if (!settings.inlayHints) + return false + val maxFileSizeKb = settings.inlayHintsMaxFileSizeKb + if (maxFileSizeKb == 0) + return true + val fileSizeKb = file.fileDocument.textLength / 1024 + return fileSizeKb <= maxFileSizeKb } } return features diff --git a/lsp/src/main/kotlin/com/falsepattern/zigbrains/lsp/settings/ZLSSettings.kt b/lsp/src/main/kotlin/com/falsepattern/zigbrains/lsp/settings/ZLSSettings.kt index 1c462864..e9ae1eb8 100644 --- a/lsp/src/main/kotlin/com/falsepattern/zigbrains/lsp/settings/ZLSSettings.kt +++ b/lsp/src/main/kotlin/com/falsepattern/zigbrains/lsp/settings/ZLSSettings.kt @@ -30,6 +30,7 @@ import org.jetbrains.annotations.NonNls data class ZLSSettings( @JvmField @Attribute val zlsConfigPath: @NonNls String = "", @JvmField @Attribute val inlayHints: Boolean = true, + @JvmField @Attribute val inlayHintsMaxFileSizeKb: Int = 128, @JvmField @Attribute val enable_snippets: Boolean = true, @JvmField @Attribute val enable_argument_placeholders: Boolean = true, @JvmField @Attribute val completion_label_details: Boolean = true, diff --git a/lsp/src/main/kotlin/com/falsepattern/zigbrains/lsp/settings/ZLSSettingsPanel.kt b/lsp/src/main/kotlin/com/falsepattern/zigbrains/lsp/settings/ZLSSettingsPanel.kt index 5daeb419..a70f5539 100644 --- a/lsp/src/main/kotlin/com/falsepattern/zigbrains/lsp/settings/ZLSSettingsPanel.kt +++ b/lsp/src/main/kotlin/com/falsepattern/zigbrains/lsp/settings/ZLSSettingsPanel.kt @@ -35,6 +35,9 @@ import com.intellij.ui.dsl.builder.AlignX import com.intellij.ui.dsl.builder.Panel import com.intellij.ui.dsl.builder.Row import org.jetbrains.annotations.PropertyKey +import javax.swing.text.AttributeSet +import javax.swing.text.DocumentFilter +import javax.swing.text.PlainDocument @Suppress("PrivatePropertyName") class ZLSSettingsPanel() : ImmutableElementPanel { @@ -44,6 +47,27 @@ class ZLSSettingsPanel() : ImmutableElementPanel { .withTitle(ZLSBundle.message("settings.zls-config-path.browse.title")) ).also { Disposer.register(this, it) } private val inlayHints = JBCheckBox() + private val inlayHintsMaxFileSize = ExtendableTextField(5).also { (it.document as PlainDocument).documentFilter = object: DocumentFilter() { + override fun insertString(fb: FilterBypass?, offset: Int, string: String?, attr: AttributeSet?) { + if (string != null && !string.isEmpty() && string.toIntOrNull() == null) { + return + } + super.insertString(fb, offset, string, attr) + } + + override fun replace( + fb: FilterBypass?, + offset: Int, + length: Int, + text: String?, + attrs: AttributeSet? + ) { + if (text != null && !text.isEmpty() && text.toIntOrNull() == null) { + return + } + super.replace(fb, offset, length, text, attrs) + } + } } private val enable_snippets = JBCheckBox() private val enable_argument_placeholders = JBCheckBox() private val completion_label_details = JBCheckBox() @@ -99,6 +123,13 @@ class ZLSSettingsPanel() : ImmutableElementPanel { "settings.inlay-hints-enable.label", "settings.inlay-hints-enable.tooltip" ) { cell(inlayHints) } + fancyRow( + "settings.inlay-hints-max-size.label", + "settings.inlay-hints-max-size.tooltip", + ) { + cell(inlayHintsMaxFileSize) + text(ZLSBundle.message("settings.inlay-hints-max-size.unit")) + } fancyRow( "settings.inlay_hints_show_variable_type_hints.label", "settings.inlay_hints_show_variable_type_hints.tooltip" @@ -174,6 +205,7 @@ class ZLSSettingsPanel() : ImmutableElementPanel { get() = ZLSSettings( zlsConfigPath.text, inlayHints.isSelected, + inlayHintsMaxFileSize.text.toIntOrNull() ?: 128, enable_snippets.isSelected, enable_argument_placeholders.isSelected, completion_label_details.isSelected, @@ -198,6 +230,7 @@ class ZLSSettingsPanel() : ImmutableElementPanel { set(value) { zlsConfigPath.text = value.zlsConfigPath inlayHints.isSelected = value.inlayHints + inlayHintsMaxFileSize.text = value.inlayHintsMaxFileSizeKb.toString() enable_snippets.isSelected = value.enable_snippets enable_argument_placeholders.isSelected = value.enable_argument_placeholders completion_label_details.isSelected = value.completion_label_details diff --git a/lsp/src/main/resources/zigbrains/lsp/Bundle.properties b/lsp/src/main/resources/zigbrains/lsp/Bundle.properties index 8a680305..33cdd251 100644 --- a/lsp/src/main/resources/zigbrains/lsp/Bundle.properties +++ b/lsp/src/main/resources/zigbrains/lsp/Bundle.properties @@ -4,6 +4,9 @@ settings.zls-config-path.browse.title=Path to the Custom ZLS Config File (Option settings.inlay-hints-group.label=Inlay Hints settings.inlay-hints-enable.label=Enable settings.inlay-hints-enable.tooltip=Toggle this to enable/disable all inlay hints +settings.inlay-hints-max-size.label=Maximum Size +settings.inlay-hints-max-size.tooltip=The maximum size of a zig file to show inlay hints for.\nInlay hints in very large files make the IDE lag.\nSet to 0 to disable. +settings.inlay-hints-max-size.unit=KB settings.enable_snippets.label=Enable snippets settings.enable_snippets.tooltip=Enables snippet completions when the client also supports them settings.enable_argument_placeholders.label=Enable argument placeholders