From 35062d25e4f947fb6cd27d04e54c6a40a89da99f Mon Sep 17 00:00:00 2001 From: Ilia Permiashkin Date: Mon, 30 Jun 2025 16:26:41 +0000 Subject: [PATCH] IJPL-192715 Incorrectly spelled words are considered aliens even though they're not Merge-request: IJ-MR-167371 Merged-by: Ilia Permiashkin GitOrigin-RevId: 0ed8649c3df9d9c2e71159ec74399550a036c6ae --- lib/BUILD.bazel | 40 +++++++++++++++ lib/MODULE.bazel | 42 ++++++++++++++++ plugins/grazie/src/test/BUILD.bazel | 2 + .../grazie/src/test/intellij.grazie.tests.iml | 50 +++++++++++++++++++ .../com/intellij/grazie/GrazieTestBase.kt | 37 +++++++------- .../grazie/ide/language/JavaSupportTest.kt | 2 + .../testData/ide/language/java/Comments.java | 8 +++ .../grazie/dictionary/WordListAdapter.kt | 2 +- 8 files changed, 165 insertions(+), 18 deletions(-) diff --git a/lib/BUILD.bazel b/lib/BUILD.bazel index 6336e8fea519..b3e10bb558ff 100644 --- a/lib/BUILD.bazel +++ b/lib/BUILD.bazel @@ -1705,6 +1705,46 @@ jvm_import( visibility = ["//visibility:public"] ) +java_library( + name = "grazie-tests-jetbrains-intellij-deps-languagetool-language-be", + exports = [ + ":language-be-6_5_0_12_http_import", + ":linguistics_grammardb_spell_languagetool-1_0_2_http_import", + ], + visibility = ["//visibility:public"] +) + +jvm_import( + name = "language-be-6_5_0_12_http_import", + jar = "@language-be-6_5_0_12_http//file", + source_jar = "@language-be-6_5_0_12-sources_http//file" +) + +jvm_import( + name = "linguistics_grammardb_spell_languagetool-1_0_2_http_import", + jar = "@linguistics_grammardb_spell_languagetool-1_0_2_http//file" +) + +java_library( + name = "grazie-tests-jetbrains-intellij-deps-languagetool-language-uk", + exports = [ + ":language-uk-6_5_0_12_http_import", + ":morfologik-ukrainian-lt-6_5_2_http_import", + ], + visibility = ["//visibility:public"] +) + +jvm_import( + name = "language-uk-6_5_0_12_http_import", + jar = "@language-uk-6_5_0_12_http//file", + source_jar = "@language-uk-6_5_0_12-sources_http//file" +) + +jvm_import( + name = "morfologik-ukrainian-lt-6_5_2_http_import", + jar = "@morfologik-ukrainian-lt-6_5_2_http//file" +) + java_library( name = "grazie-tests-org-jetbrains-intellij-deps-languagetool-language-de", exports = [ diff --git a/lib/MODULE.bazel b/lib/MODULE.bazel index 0c9cd38d1cd1..9ab7b86135c3 100644 --- a/lib/MODULE.bazel +++ b/lib/MODULE.bazel @@ -2203,6 +2203,48 @@ http_file( downloaded_file_path = "uom-lib-common-1.1-sources.jar" ) +http_file( + name = "language-be-6_5_0_12_http", + url = "https://cache-redirector.jetbrains.com/packages.jetbrains.team/maven/p/ij/intellij-dependencies/org/jetbrains/intellij/deps/languagetool/language-be/6.5.0.12/language-be-6.5.0.12.jar", + sha256 = "bd1887ce9a41765b30098c4e1de1b7fb44f85a2753c38e9ab6f809c5462904a8", + downloaded_file_path = "language-be-6.5.0.12.jar" +) + +http_file( + name = "linguistics_grammardb_spell_languagetool-1_0_2_http", + url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/io/github/belarus/linguistics.grammardb.spell.languagetool/1.0.2/linguistics.grammardb.spell.languagetool-1.0.2.jar", + sha256 = "1d1a55e905faa9740d648144cf05c4a460f0f26416d2ee01157bad0877be31c2", + downloaded_file_path = "linguistics.grammardb.spell.languagetool-1.0.2.jar" +) + +http_file( + name = "language-be-6_5_0_12-sources_http", + url = "https://cache-redirector.jetbrains.com/packages.jetbrains.team/maven/p/ij/intellij-dependencies/org/jetbrains/intellij/deps/languagetool/language-be/6.5.0.12/language-be-6.5.0.12-sources.jar", + sha256 = "a179feba0e4ba6af0d30494c4c06a1a7b60553027259fc95af876b3b77bc001c", + downloaded_file_path = "language-be-6.5.0.12-sources.jar" +) + +http_file( + name = "language-uk-6_5_0_12_http", + url = "https://cache-redirector.jetbrains.com/packages.jetbrains.team/maven/p/ij/intellij-dependencies/org/jetbrains/intellij/deps/languagetool/language-uk/6.5.0.12/language-uk-6.5.0.12.jar", + sha256 = "d1d6335aa10c9a109d64b9eb05128e5993fb2f88549f446b9b2b91a728a95da2", + downloaded_file_path = "language-uk-6.5.0.12.jar" +) + +http_file( + name = "morfologik-ukrainian-lt-6_5_2_http", + url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/ua/net/nlp/morfologik-ukrainian-lt/6.5.2/morfologik-ukrainian-lt-6.5.2.jar", + sha256 = "6f720beda15abe1c3517d2105043e33da3786dcc92a6803e42f1b246de6af3ac", + downloaded_file_path = "morfologik-ukrainian-lt-6.5.2.jar" +) + +http_file( + name = "language-uk-6_5_0_12-sources_http", + url = "https://cache-redirector.jetbrains.com/packages.jetbrains.team/maven/p/ij/intellij-dependencies/org/jetbrains/intellij/deps/languagetool/language-uk/6.5.0.12/language-uk-6.5.0.12-sources.jar", + sha256 = "872e8c9852e6b17ecfdf57942731122abdd04fdb1c0c17e67943afcd1b9bb3ab", + downloaded_file_path = "language-uk-6.5.0.12-sources.jar" +) + http_file( name = "language-de-6_5_0_12_http", url = "https://cache-redirector.jetbrains.com/packages.jetbrains.team/maven/p/ij/intellij-dependencies/org/jetbrains/intellij/deps/languagetool/language-de/6.5.0.12/language-de-6.5.0.12.jar", diff --git a/plugins/grazie/src/test/BUILD.bazel b/plugins/grazie/src/test/BUILD.bazel index 1a76b845f33f..89295c1e6ef4 100644 --- a/plugins/grazie/src/test/BUILD.bazel +++ b/plugins/grazie/src/test/BUILD.bazel @@ -32,6 +32,8 @@ jvm_library( "@lib//:grazie-tests-org-jetbrains-intellij-deps-languagetool-language-ru", "@lib//:grazie-tests-org-jetbrains-intellij-deps-languagetool-language-de", "@lib//:grazie-tests-org-jetbrains-intellij-deps-languagetool-language-it", + "@lib//:grazie-tests-jetbrains-intellij-deps-languagetool-language-uk", + "@lib//:grazie-tests-jetbrains-intellij-deps-languagetool-language-be", "@lib//:grazie-tests-org-jetbrains-intellij-deps-languagetool-language-pt", "//libraries/ai.grazie.spell.gec.engine.local", "@lib//:grazie-tests-org-languagetool-portuguese-pos-dict", diff --git a/plugins/grazie/src/test/intellij.grazie.tests.iml b/plugins/grazie/src/test/intellij.grazie.tests.iml index 86af10c7bf8f..f8f36e006b11 100644 --- a/plugins/grazie/src/test/intellij.grazie.tests.iml +++ b/plugins/grazie/src/test/intellij.grazie.tests.iml @@ -150,6 +150,56 @@ + + + + + + d1d6335aa10c9a109d64b9eb05128e5993fb2f88549f446b9b2b91a728a95da2 + + + 6f720beda15abe1c3517d2105043e33da3786dcc92a6803e42f1b246de6af3ac + + + + + + + + + + + + + + + + + + + + + + bd1887ce9a41765b30098c4e1de1b7fb44f85a2753c38e9ab6f809c5462904a8 + + + 1d1a55e905faa9740d648144cf05c4a460f0f26416d2ee01157bad0877be31c2 + + + + + + + + + + + + + + + + diff --git a/plugins/grazie/src/test/kotlin/com/intellij/grazie/GrazieTestBase.kt b/plugins/grazie/src/test/kotlin/com/intellij/grazie/GrazieTestBase.kt index 507301bd4716..3dbcd9a8bae6 100644 --- a/plugins/grazie/src/test/kotlin/com/intellij/grazie/GrazieTestBase.kt +++ b/plugins/grazie/src/test/kotlin/com/intellij/grazie/GrazieTestBase.kt @@ -41,23 +41,7 @@ abstract class GrazieTestBase : BasePlatformTestCase() { super.setUp() myFixture.enableInspections(*inspectionTools) - GrazieConfig.update { state -> - val checkingContext = state.checkingContext.copy( - isCheckInStringLiteralsEnabled = true, - isCheckInCommentsEnabled = true, - isCheckInDocumentationEnabled = true, - enabledLanguages = additionalEnabledContextLanguages.map { it.id }.toSet(), - ) - state.copy( - enabledLanguages = enabledLanguages, - userEnabledRules = enabledRules + additionalEnabledRules, - checkingContext = checkingContext - ) - } - - service().awaitConfiguration() - - PlatformTestUtil.dispatchAllEventsInIdeEventQueue() + configureGrazieSettings() val newExtensions = TextChecker.allCheckers().map { if (it is LanguageToolChecker) LanguageToolChecker.TestChecker() else it } ExtensionTestUtil.maskExtensions(ExtensionPointName("com.intellij.grazie.textChecker"), newExtensions, testRootDisposable) @@ -77,6 +61,25 @@ abstract class GrazieTestBase : BasePlatformTestCase() { } } + protected fun configureGrazieSettings(enabledLanguages: Set = GrazieTestBase.enabledLanguages) { + GrazieConfig.update { state -> + val checkingContext = state.checkingContext.copy( + isCheckInStringLiteralsEnabled = true, + isCheckInCommentsEnabled = true, + isCheckInDocumentationEnabled = true, + enabledLanguages = additionalEnabledContextLanguages.map { it.id }.toSet(), + ) + state.copy( + enabledLanguages = enabledLanguages, + userEnabledRules = enabledRules + additionalEnabledRules, + checkingContext = checkingContext + ) + } + + service().awaitConfiguration() + PlatformTestUtil.dispatchAllEventsInIdeEventQueue() + } + protected open fun runHighlightTestForFile(file: String) { myFixture.configureByFile(file) myFixture.checkHighlighting(true, false, false) diff --git a/plugins/grazie/src/test/kotlin/com/intellij/grazie/ide/language/JavaSupportTest.kt b/plugins/grazie/src/test/kotlin/com/intellij/grazie/ide/language/JavaSupportTest.kt index ca682f6d0b8c..662422db3a13 100644 --- a/plugins/grazie/src/test/kotlin/com/intellij/grazie/ide/language/JavaSupportTest.kt +++ b/plugins/grazie/src/test/kotlin/com/intellij/grazie/ide/language/JavaSupportTest.kt @@ -2,6 +2,7 @@ package com.intellij.grazie.ide.language import com.intellij.grazie.GrazieTestBase +import com.intellij.grazie.jlanguage.Lang import com.intellij.testFramework.LightProjectDescriptor import com.intellij.tools.ide.metrics.benchmark.Benchmark import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase @@ -27,6 +28,7 @@ class JavaSupportTest : GrazieTestBase() { } fun `test grammar check in comments`() { + configureGrazieSettings(setOf(Lang.AMERICAN_ENGLISH, Lang.GERMANY_GERMAN, Lang.UKRAINIAN, Lang.BELARUSIAN)) runHighlightTestForFile("ide/language/java/Comments.java") } diff --git a/plugins/grazie/src/test/testData/ide/language/java/Comments.java b/plugins/grazie/src/test/testData/ide/language/java/Comments.java index e6bdd5051fb0..46da9fd502ac 100644 --- a/plugins/grazie/src/test/testData/ide/language/java/Comments.java +++ b/plugins/grazie/src/test/testData/ide/language/java/Comments.java @@ -99,4 +99,12 @@ class ForMultiLanguageSupport { // print(f' // print(f') // print(f' world') + + // Українська. У мене хороші будинки. + // Граматична помилка: Поверталися на висхідну позицію. + // Друкувати словом: У мене хороші будінки. + + // Беларускі. У мяне добры дом. + // Граматычная памылка: А па факту атрымалася, што сіл няма. + // Памылка друку ў word: У мяне добры домн. } diff --git a/spellchecker/src/com/intellij/spellchecker/grazie/dictionary/WordListAdapter.kt b/spellchecker/src/com/intellij/spellchecker/grazie/dictionary/WordListAdapter.kt index fae09efb02ef..41fd17fc4670 100644 --- a/spellchecker/src/com/intellij/spellchecker/grazie/dictionary/WordListAdapter.kt +++ b/spellchecker/src/com/intellij/spellchecker/grazie/dictionary/WordListAdapter.kt @@ -6,7 +6,7 @@ import ai.grazie.spell.lists.WordList internal class WordListAdapter : WordList, EditableWordListAdapter() { fun isAlien(word: String): Boolean { - return !dictionaries.values.any { it.contains(word) ?: false } && !aggregator.contains(word) + return dictionaries.values.all { it.contains(word) == null } && !aggregator.contains(word) } override fun contains(word: String, caseSensitive: Boolean): Boolean {