diff --git a/plugins/toml/json/src/main/kotlin/org/toml/ide/json/TomlJsonSchemaCompletionContributor.kt b/plugins/toml/json/src/main/kotlin/org/toml/ide/json/TomlJsonSchemaCompletionContributor.kt index 95ff334381eb..58526fc5c217 100644 --- a/plugins/toml/json/src/main/kotlin/org/toml/ide/json/TomlJsonSchemaCompletionContributor.kt +++ b/plugins/toml/json/src/main/kotlin/org/toml/ide/json/TomlJsonSchemaCompletionContributor.kt @@ -39,6 +39,7 @@ import org.toml.lang.psi.ext.kind class TomlJsonSchemaCompletionContributor : CompletionContributor() { override fun fillCompletionVariants(parameters: CompletionParameters, result: CompletionResultSet) { if (!TomlExperiments.isJsonSchemaEnabled) return + if (!TomlJsonSchemaCompletionFileFilter.shouldCompleteInFile(parameters.originalFile)) return val position = parameters.position val jsonSchemaService = JsonSchemaService.Impl.get(position.project) diff --git a/plugins/toml/json/src/main/kotlin/org/toml/ide/json/TomlJsonSchemaCompletionFileFilter.kt b/plugins/toml/json/src/main/kotlin/org/toml/ide/json/TomlJsonSchemaCompletionFileFilter.kt new file mode 100644 index 000000000000..7c65415a3091 --- /dev/null +++ b/plugins/toml/json/src/main/kotlin/org/toml/ide/json/TomlJsonSchemaCompletionFileFilter.kt @@ -0,0 +1,14 @@ +package org.toml.ide.json + +import com.intellij.openapi.extensions.ExtensionPointName +import com.intellij.psi.PsiFile + +interface TomlJsonSchemaCompletionFileFilter { + companion object { + val EP_NAME = ExtensionPointName.create("org.toml.ide.json.tomlJsonSchemaCompletionFileFilter") + + fun shouldCompleteInFile(file: PsiFile): Boolean = EP_NAME.extensionsIfPointIsRegistered.all { it.shouldCompleteInFile(file) } + } + + fun shouldCompleteInFile(file: PsiFile): Boolean +} \ No newline at end of file diff --git a/plugins/toml/json/src/main/resources/intellij.toml.json.xml b/plugins/toml/json/src/main/resources/intellij.toml.json.xml index c648265135af..094d7af5c4b9 100644 --- a/plugins/toml/json/src/main/resources/intellij.toml.json.xml +++ b/plugins/toml/json/src/main/resources/intellij.toml.json.xml @@ -3,6 +3,13 @@ + + + + diff --git a/plugins/toml/tests/src/test/kotlin/org/toml/ide/completion/TomlCompletionFixture.kt b/plugins/toml/tests/src/test/kotlin/org/toml/ide/completion/TomlCompletionFixture.kt index b97537ae72be..a77d05e40b37 100644 --- a/plugins/toml/tests/src/test/kotlin/org/toml/ide/completion/TomlCompletionFixture.kt +++ b/plugins/toml/tests/src/test/kotlin/org/toml/ide/completion/TomlCompletionFixture.kt @@ -34,6 +34,16 @@ class TomlCompletionFixture( doNotContainsCompletion(variants, render) } + fun checkNotContainsCompletions( + code: String, + ) = withNoAutoCompletion { + myFixture.configureByText(defaultFileName, code.trimIndent()) + val lookups = myFixture.completeBasic() + if (lookups.isNotEmpty()) { + error("Expected completions to be empty") + } + } + fun checkCompletionList( variants: List, code: String, diff --git a/plugins/toml/tests/src/test/kotlin/org/toml/ide/json/TomlJsonSchemaCompletionFileFilterTest.kt b/plugins/toml/tests/src/test/kotlin/org/toml/ide/json/TomlJsonSchemaCompletionFileFilterTest.kt new file mode 100644 index 000000000000..42275f6d63e6 --- /dev/null +++ b/plugins/toml/tests/src/test/kotlin/org/toml/ide/json/TomlJsonSchemaCompletionFileFilterTest.kt @@ -0,0 +1,34 @@ +package org.toml.ide.json + +import com.intellij.psi.PsiFile +import com.intellij.testFramework.ExtensionTestUtil + +class TomlJsonSchemaCompletionFileFilterTest : TomlJsonSchemaCompletionTestBase() { + fun `test no completion for file when filtered out`() { + ExtensionTestUtil.maskExtensions(TomlJsonSchemaCompletionFileFilter.EP_NAME, listOf(TestFileFilterExclude()), testRootDisposable) + + checkNotContainsCompletions(""" + + """) + } + + fun `test complete if filter is not valid for this file`() { + ExtensionTestUtil.maskExtensions(TomlJsonSchemaCompletionFileFilter.EP_NAME, listOf(TestFileFilterDoNotExclude()), testRootDisposable) + + checkContainsCompletion(setOf("dependencies"), """ + dep + """) + } +} + +private class TestFileFilterExclude: TomlJsonSchemaCompletionFileFilter { + override fun shouldCompleteInFile(file: PsiFile): Boolean { + return file.name != "Cargo.toml" + } +} + +private class TestFileFilterDoNotExclude: TomlJsonSchemaCompletionFileFilter { + override fun shouldCompleteInFile(file: PsiFile): Boolean { + return file.name != "Foo.toml" + } +} \ No newline at end of file diff --git a/plugins/toml/tests/src/test/kotlin/org/toml/ide/json/TomlJsonSchemaCompletionTestBase.kt b/plugins/toml/tests/src/test/kotlin/org/toml/ide/json/TomlJsonSchemaCompletionTestBase.kt index ff1bb1a0bc14..79f4f3eea62e 100644 --- a/plugins/toml/tests/src/test/kotlin/org/toml/ide/json/TomlJsonSchemaCompletionTestBase.kt +++ b/plugins/toml/tests/src/test/kotlin/org/toml/ide/json/TomlJsonSchemaCompletionTestBase.kt @@ -30,6 +30,10 @@ abstract class TomlJsonSchemaCompletionTestBase : TomlJsonSchemaTestBase() { render: LookupElement.() -> String = { lookupString } ) = completionFixture.checkNotContainsCompletion(variants, code, render) + fun checkNotContainsCompletions( + @Language("TOML") code: String, + ) = completionFixture.checkNotContainsCompletions(code) + fun doSingleCompletion( @Language("TOML") before: String, @Language("TOML") after: String