Skip to content

Commit

Permalink
Allow configuring targeted file extensions (#35)
Browse files Browse the repository at this point in the history
  • Loading branch information
InSyncWithFoo committed May 28, 2024
1 parent f7203a3 commit 639231b
Show file tree
Hide file tree
Showing 7 changed files with 53 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.insyncwithfoo.pyrightls.configuration

import com.insyncwithfoo.pyrightls.configuration.application.LogLevel
import com.insyncwithfoo.pyrightls.configuration.project.DelimitedFileExtensions
import com.insyncwithfoo.pyrightls.configuration.project.WorkspaceFolders
import org.jetbrains.annotations.SystemDependent
import com.insyncwithfoo.pyrightls.configuration.application.Configurations as ApplicationConfigurations
Expand All @@ -26,7 +27,8 @@ internal infix fun ApplicationConfigurations.mergeWith(other: ProjectConfigurati

projectExecutable = other.projectExecutable,
autoSuggestExecutable = other.autoSuggestExecutable,
workspaceFolders = other.workspaceFolders
workspaceFolders = other.workspaceFolders,
targetedFileExtensions = other.targetedFileExtensions
)


Expand All @@ -48,7 +50,8 @@ internal data class AllConfigurations(

val projectExecutable: @SystemDependent String?,
val autoSuggestExecutable: Boolean,
val workspaceFolders: WorkspaceFolders
val workspaceFolders: WorkspaceFolders,
val targetedFileExtensions: DelimitedFileExtensions?
) {
val executable: @SystemDependent String?
get() = when {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ internal fun <T : JComponent> Cell<T>.ensureComment() = this.apply {
}


internal fun Row.secondColumnPathInput() = textFieldWithBrowseButton().apply {
internal fun <T : JComponent> Cell<T>.asSecondColumnInput() = this.apply {
ensureComment()

gap(RightGap.SMALL)
Expand All @@ -39,6 +39,9 @@ internal fun Row.secondColumnPathInput() = textFieldWithBrowseButton().apply {
}


internal fun Row.secondColumnPathInput() = textFieldWithBrowseButton().asSecondColumnInput()


internal fun <T : TextFieldWithBrowseButton> Cell<T>.bindText(property: KMutableProperty0<String?>) =
bindText({ property.get().orEmpty() }, property::set)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.insyncwithfoo.pyrightls.configuration.project

import com.insyncwithfoo.pyrightls.configuration.Hint
import com.insyncwithfoo.pyrightls.configuration.asSecondColumnInput
import com.insyncwithfoo.pyrightls.configuration.bindText
import com.insyncwithfoo.pyrightls.configuration.displayPathHint
import com.insyncwithfoo.pyrightls.configuration.executablePathResolvingHint
Expand All @@ -14,11 +15,14 @@ import com.intellij.openapi.ui.ComboBox
import com.intellij.openapi.ui.TextFieldWithBrowseButton
import com.intellij.ui.SimpleListCellRenderer
import com.intellij.ui.components.JBCheckBox
import com.intellij.ui.components.fields.ExpandableTextField
import com.intellij.ui.dsl.builder.Cell
import com.intellij.ui.dsl.builder.Row
import com.intellij.ui.dsl.builder.bindItem
import com.intellij.ui.dsl.builder.bindSelected
import com.intellij.ui.dsl.builder.bindText
import com.intellij.ui.dsl.builder.panel
import com.intellij.ui.dsl.builder.toNonNullableProperty
import com.intellij.ui.dsl.builder.toNullableProperty


Expand All @@ -43,6 +47,14 @@ private fun Row.makeWorkspaceFoldersInput(block: Cell<ComboBox<WorkspaceFolders>
}


private fun Row.makeFileExtensionsInput(block: Cell<ExpandableTextField>.() -> Unit) {
val parser = DelimitedFileExtensions::split
val joiner = TargetedFileExtensions::join

expandableTextField(parser, joiner).asSecondColumnInput().apply(block)
}


internal fun Configurable.configurationPanel(state: Configurations) = panel {
// FIXME: The onInput() callbacks are too deeply nested.

Expand All @@ -66,6 +78,12 @@ internal fun Configurable.configurationPanel(state: Configurations) = panel {

@Suppress("DialogTitleCapitalization")
group(message("configurations.group.languageServer")) {
row(message("configurations.targetedFileExtensions.label")) {
makeFileExtensionsInput {
comment(message("configurations.targetedFileExtensions.comment"))
bindText(state::targetedFileExtensions.toNonNullableProperty(defaultValue = ""))
}
}
row(message("configurations.workspaceFolders.label")) {
makeWorkspaceFoldersInput { bindItem(state::workspaceFolders.toNullableProperty()) }
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,23 @@ import com.insyncwithfoo.pyrightls.message
import com.intellij.openapi.components.BaseState


internal typealias DelimitedFileExtensions = String
internal typealias TargetedFileExtensions = List<String>


internal const val fileExtensionsDelimiter = "|"


internal fun DelimitedFileExtensions.split(): MutableList<String> {
return this.split(fileExtensionsDelimiter).mapTo(mutableListOf()) { it.trim().lowercase() }
}


internal fun TargetedFileExtensions.join(): String {
return this.joinToString(fileExtensionsDelimiter) { it.trim().lowercase() }
}


internal enum class WorkspaceFolders(val label: String) {
PROJECT_BASE(message("configurations.workspaceFolders.projectBase")),
SOURCE_ROOTS(message("configurations.workspaceFolders.sourceRoots"));
Expand All @@ -14,4 +31,5 @@ internal class Configurations : BaseState() {
var projectExecutable by string(null)
var autoSuggestExecutable by property(true)
var workspaceFolders by enum(WorkspaceFolders.PROJECT_BASE)
var targetedFileExtensions by string("py")
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.insyncwithfoo.pyrightls.server

import com.insyncwithfoo.pyrightls.configuration.project.WorkspaceFolders
import com.insyncwithfoo.pyrightls.configuration.project.split
import com.insyncwithfoo.pyrightls.message
import com.insyncwithfoo.pyrightls.path
import com.insyncwithfoo.pyrightls.pyrightLSConfigurations
Expand Down Expand Up @@ -50,7 +51,8 @@ internal class PyrightLSDescriptor(project: Project, private val executable: Pat
LOGGER.info(configurations.toString())
}

override fun isSupportedFile(file: VirtualFile) = file.isSupported
override fun isSupportedFile(file: VirtualFile) =
file.extension in configurations.targetedFileExtensions.orEmpty().split()

override fun createCommandLine() =
GeneralCommandLine(executable.toString(), "--stdio").apply {
Expand Down
3 changes: 3 additions & 0 deletions src/main/resources/messages/pyrightls.properties
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ configurations.workspaceFolders.label = Workspace folders:
configurations.workspaceFolders.projectBase = Project base directories
configurations.workspaceFolders.sourceRoots = Source roots

configurations.targetedFileExtensions.label = Targeted file extensions:
configurations.targetedFileExtensions.comment = List of extensions of files on which the language server should be run.

configurations.hint.fileFound = File found
configurations.hint.fileNotExecutable = File is not executable
configurations.hint.fileNotFound = No file found at given path
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,14 @@ class ConfigurationFieldsTest : TestCase() {
fun `test defaults - project`() {
val configurations = ProjectConfigurations()

assertEquals(3, projectFields().size)
assertEquals(4, projectFields().size)

configurations.run {
assertEquals(null, projectExecutable)
assertEquals(true, autoSuggestExecutable)

assertEquals(WorkspaceFolders.PROJECT_BASE, workspaceFolders)
assertEquals("py", targetedFileExtensions)
}
}

Expand Down

0 comments on commit 639231b

Please sign in to comment.