diff --git a/java/java-tests/BUILD.bazel b/java/java-tests/BUILD.bazel
index b21153bbb1d2..981a8e0a7423 100644
--- a/java/java-tests/BUILD.bazel
+++ b/java/java-tests/BUILD.bazel
@@ -157,6 +157,7 @@ jvm_library(
"//xml/impl",
"//platform/syntax/syntax-scripts:scripts",
"@lib//:byte-buddy",
+ "//plugins/grazie/src:core",
],
exports = [
"//plugins/java-i18n",
diff --git a/java/java-tests/intellij.java.tests.iml b/java/java-tests/intellij.java.tests.iml
index 6e254b5bdf84..f715006835b8 100644
--- a/java/java-tests/intellij.java.tests.iml
+++ b/java/java-tests/intellij.java.tests.iml
@@ -129,5 +129,6 @@
+
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/renameField/afterFieldOnlyInImplicitClass.java b/java/java-tests/testData/refactoring/renameField/afterFieldOnlyInImplicitClass.java
index 2e4b3e1855dd..0563779d6be6 100644
--- a/java/java-tests/testData/refactoring/renameField/afterFieldOnlyInImplicitClass.java
+++ b/java/java-tests/testData/refactoring/renameField/afterFieldOnlyInImplicitClass.java
@@ -1 +1 @@
-NegativeArraySizeException negativeArraySizeException;
+NegativeArraySizeException option;
diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/RenameFieldTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/RenameFieldTest.java
index 1a927137ea61..fd359756e1b7 100644
--- a/java/java-tests/testSrc/com/intellij/java/refactoring/RenameFieldTest.java
+++ b/java/java-tests/testSrc/com/intellij/java/refactoring/RenameFieldTest.java
@@ -6,18 +6,22 @@ import com.intellij.application.options.CodeStyle;
import com.intellij.codeInsight.TargetElementUtil;
import com.intellij.codeInsight.template.impl.TemplateManagerImpl;
import com.intellij.codeInsight.template.impl.TemplateState;
+import com.intellij.grazie.spellcheck.suggestion.SpellcheckingNameSuggestionProvider;
import com.intellij.lang.java.JavaLanguage;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.ex.EditorEx;
+import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.pom.java.JavaFeature;
import com.intellij.psi.PsiElement;
import com.intellij.refactoring.rename.*;
import com.intellij.refactoring.rename.inplace.MemberInplaceRenameHandler;
import com.intellij.refactoring.rename.naming.AutomaticRenamerFactory;
+import com.intellij.testFramework.ExtensionTestUtil;
import com.intellij.testFramework.IdeaTestUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
+import java.util.ArrayList;
import java.util.List;
public class RenameFieldTest extends LightRefactoringTestCase {
diff --git a/plugins/grazie/resources/META-INF/plugin.xml b/plugins/grazie/resources/META-INF/plugin.xml
index 4482cc1360ed..e1c859cb1376 100644
--- a/plugins/grazie/resources/META-INF/plugin.xml
+++ b/plugins/grazie/resources/META-INF/plugin.xml
@@ -49,6 +49,7 @@
+
+
+
@@ -88,6 +92,7 @@
+
@@ -103,6 +108,7 @@
+
+
\ No newline at end of file
diff --git a/plugins/grazie/src/main/kotlin/com/intellij/grazie/jlanguage/Lang.kt b/plugins/grazie/src/main/kotlin/com/intellij/grazie/jlanguage/Lang.kt
index 3125c0affbb3..f98c40265ad6 100644
--- a/plugins/grazie/src/main/kotlin/com/intellij/grazie/jlanguage/Lang.kt
+++ b/plugins/grazie/src/main/kotlin/com/intellij/grazie/jlanguage/Lang.kt
@@ -11,9 +11,9 @@ import com.intellij.grazie.remote.GrazieRemote
import com.intellij.grazie.remote.HunspellDescriptor
import com.intellij.grazie.remote.LanguageToolDescriptor
import com.intellij.grazie.remote.RemoteLangDescriptor
+import com.intellij.grazie.spellcheck.engine.GrazieSpellCheckerEngine
+import com.intellij.grazie.spellcheck.hunspell.HunspellDictionary
import com.intellij.openapi.util.NlsSafe
-import com.intellij.spellchecker.grazie.GrazieSpellCheckerEngine
-import com.intellij.spellchecker.hunspell.HunspellDictionary
import org.jetbrains.annotations.NonNls
import org.languagetool.Language
import org.languagetool.language.English
diff --git a/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/GrazieSpellCheckingInspection.java b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/GrazieSpellCheckingInspection.java
index 864cdb087567..d0d0ba462e1b 100644
--- a/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/GrazieSpellCheckingInspection.java
+++ b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/GrazieSpellCheckingInspection.java
@@ -6,6 +6,8 @@ import com.intellij.codeHighlighting.HighlightDisplayLevel;
import com.intellij.codeInspection.*;
import com.intellij.codeInspection.options.OptPane;
import com.intellij.grazie.GrazieConfig;
+import com.intellij.grazie.spellcheck.diacritic.Diacritics;
+import com.intellij.grazie.spellcheck.engine.GrazieSpellCheckerEngine;
import com.intellij.lang.LanguageNamesValidation;
import com.intellij.lang.injection.InjectedLanguageManager;
import com.intellij.lang.refactoring.NamesValidator;
@@ -20,8 +22,6 @@ import com.intellij.psi.util.CachedValuesManager;
import com.intellij.refactoring.rename.RenameUtil;
import com.intellij.spellchecker.SpellCheckerManager;
import com.intellij.spellchecker.SpellCheckerSeveritiesProvider;
-import com.intellij.spellchecker.grazie.GrazieSpellCheckerEngine;
-import com.intellij.spellchecker.grazie.diacritic.Diacritics;
import com.intellij.spellchecker.inspections.SpellCheckingInspection;
import com.intellij.spellchecker.inspections.Splitter;
import com.intellij.spellchecker.settings.SpellCheckerSettings;
@@ -302,7 +302,7 @@ public final class GrazieSpellCheckingInspection extends SpellCheckingInspection
List paths = SpellCheckerSettings.getInstance(project).getCustomDictionariesPaths();
if (paths != null && !paths.isEmpty()) {
- GrazieSpellCheckerEngine engine = project.getService(GrazieSpellCheckerEngine.class);
+ GrazieSpellCheckerEngine engine = GrazieSpellCheckerEngine.getInstance(project);
return !ContainerUtil.exists(paths, dictionaryName -> engine.isDictionaryLoad(dictionaryName));
}
return true;
diff --git a/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/GrazieTextLevelSpellCheckingExtension.kt b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/GrazieTextLevelSpellCheckingExtension.kt
index 71053a959133..937fe850a64b 100644
--- a/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/GrazieTextLevelSpellCheckingExtension.kt
+++ b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/GrazieTextLevelSpellCheckingExtension.kt
@@ -11,6 +11,7 @@ import ai.grazie.spell.text.Typo
import com.intellij.codeInspection.LocalInspectionToolSession
import com.intellij.grazie.GrazieConfig
import com.intellij.grazie.ide.inspection.grammar.GrazieInspection.Companion.sortByPriority
+import com.intellij.grazie.spellcheck.engine.GrazieSpellCheckerEngine
import com.intellij.grazie.text.TextContent
import com.intellij.grazie.text.TextExtractor
import com.intellij.openapi.components.service
@@ -21,7 +22,6 @@ import com.intellij.openapi.util.TextRange
import com.intellij.openapi.util.getOrCreateUserData
import com.intellij.openapi.util.text.StringUtil.BombedCharSequence
import com.intellij.psi.PsiElement
-import com.intellij.spellchecker.grazie.GrazieSpellCheckerEngine
import com.intellij.spellchecker.inspections.IdentifierSplitter.MINIMAL_TYPO_LENGTH
import com.intellij.spellchecker.tokenizer.SpellcheckingStrategy
import com.intellij.util.containers.ContainerUtil
@@ -64,7 +64,7 @@ object GrazieTextLevelSpellCheckingExtension {
}
private fun getTextSpeller(project: Project): TextSpeller? {
- val speller = project.service().getSpeller() ?: return null
+ val speller = GrazieSpellCheckerEngine.getInstance(project).getSpeller() ?: return null
val enabledLanguages = GrazieConfig.get().enabledLanguages.mapNotNull { it.withVariant }
val validPhrasesTexts = ConcurrentHashMap>()
diff --git a/spellchecker/src/com/intellij/spellchecker/grazie/async/AsyncUtils.kt b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/async/AsyncUtils.kt
similarity index 97%
rename from spellchecker/src/com/intellij/spellchecker/grazie/async/AsyncUtils.kt
rename to plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/async/AsyncUtils.kt
index b516a691b9e7..47edcf4d45b4 100644
--- a/spellchecker/src/com/intellij/spellchecker/grazie/async/AsyncUtils.kt
+++ b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/async/AsyncUtils.kt
@@ -1,5 +1,5 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
-package com.intellij.spellchecker.grazie.async
+package com.intellij.grazie.spellcheck.async
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer
import com.intellij.openapi.application.Application
diff --git a/spellchecker/src/com/intellij/spellchecker/grazie/async/WordListLoader.kt b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/async/WordListLoader.kt
similarity index 96%
rename from spellchecker/src/com/intellij/spellchecker/grazie/async/WordListLoader.kt
rename to plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/async/WordListLoader.kt
index c0b5c124bdf0..5644c796e6fd 100644
--- a/spellchecker/src/com/intellij/spellchecker/grazie/async/WordListLoader.kt
+++ b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/async/WordListLoader.kt
@@ -1,7 +1,8 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
-package com.intellij.spellchecker.grazie.async
+package com.intellij.grazie.spellcheck.async
import ai.grazie.spell.lists.WordList
+import com.intellij.grazie.spellcheck.dictionary.SimpleWordList
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.application.EDT
import com.intellij.openapi.diagnostic.debug
@@ -10,7 +11,6 @@ import com.intellij.openapi.progress.ProgressManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.startup.StartupManager
import com.intellij.spellchecker.dictionary.Loader
-import com.intellij.spellchecker.grazie.dictionary.SimpleWordList
import com.intellij.util.containers.CollectionFactory
import com.intellij.util.containers.ContainerUtil
import kotlinx.coroutines.*
diff --git a/spellchecker/src/com/intellij/spellchecker/grazie/diacritic/Diacritics.kt b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/diacritic/Diacritics.kt
similarity index 95%
rename from spellchecker/src/com/intellij/spellchecker/grazie/diacritic/Diacritics.kt
rename to plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/diacritic/Diacritics.kt
index 6345412330fd..f8a569f88458 100644
--- a/spellchecker/src/com/intellij/spellchecker/grazie/diacritic/Diacritics.kt
+++ b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/diacritic/Diacritics.kt
@@ -1,5 +1,5 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
-package com.intellij.spellchecker.grazie.diacritic
+package com.intellij.grazie.spellcheck.diacritic
import ai.grazie.nlp.utils.normalization.StripAccentsNormalizer
import com.intellij.util.io.IOUtil
diff --git a/spellchecker/src/com/intellij/spellchecker/grazie/dictionary/EditableAggregatedWordList.kt b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/dictionary/EditableAggregatedWordList.kt
similarity index 94%
rename from spellchecker/src/com/intellij/spellchecker/grazie/dictionary/EditableAggregatedWordList.kt
rename to plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/dictionary/EditableAggregatedWordList.kt
index 7b99cec48c42..6b11918ddade 100644
--- a/spellchecker/src/com/intellij/spellchecker/grazie/dictionary/EditableAggregatedWordList.kt
+++ b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/dictionary/EditableAggregatedWordList.kt
@@ -1,7 +1,7 @@
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
@file:Suppress("ReplacePutWithAssignment")
-package com.intellij.spellchecker.grazie.dictionary
+package com.intellij.grazie.spellcheck.dictionary
import ai.grazie.spell.lists.WordList
import java.util.concurrent.ConcurrentHashMap
diff --git a/spellchecker/src/com/intellij/spellchecker/grazie/dictionary/EditableWordListAdapter.kt b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/dictionary/EditableWordListAdapter.kt
similarity index 95%
rename from spellchecker/src/com/intellij/spellchecker/grazie/dictionary/EditableWordListAdapter.kt
rename to plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/dictionary/EditableWordListAdapter.kt
index fe5ee2924a87..911554551d37 100644
--- a/spellchecker/src/com/intellij/spellchecker/grazie/dictionary/EditableWordListAdapter.kt
+++ b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/dictionary/EditableWordListAdapter.kt
@@ -1,5 +1,5 @@
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
-package com.intellij.spellchecker.grazie.dictionary
+package com.intellij.grazie.spellcheck.dictionary
import ai.grazie.spell.lists.WordList
import com.intellij.spellchecker.dictionary.Dictionary
diff --git a/spellchecker/src/com/intellij/spellchecker/grazie/dictionary/ExtendedWordListWithFrequency.kt b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/dictionary/ExtendedWordListWithFrequency.kt
similarity index 94%
rename from spellchecker/src/com/intellij/spellchecker/grazie/dictionary/ExtendedWordListWithFrequency.kt
rename to plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/dictionary/ExtendedWordListWithFrequency.kt
index 835d7ad6823d..8b1c9f6521e0 100644
--- a/spellchecker/src/com/intellij/spellchecker/grazie/dictionary/ExtendedWordListWithFrequency.kt
+++ b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/dictionary/ExtendedWordListWithFrequency.kt
@@ -1,5 +1,5 @@
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
-package com.intellij.spellchecker.grazie.dictionary
+package com.intellij.grazie.spellcheck.dictionary
import ai.grazie.spell.lists.WordListWithFrequency
diff --git a/spellchecker/src/com/intellij/spellchecker/grazie/dictionary/SimpleWordList.kt b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/dictionary/SimpleWordList.kt
similarity index 96%
rename from spellchecker/src/com/intellij/spellchecker/grazie/dictionary/SimpleWordList.kt
rename to plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/dictionary/SimpleWordList.kt
index c647822c4298..82cd711d2777 100644
--- a/spellchecker/src/com/intellij/spellchecker/grazie/dictionary/SimpleWordList.kt
+++ b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/dictionary/SimpleWordList.kt
@@ -1,5 +1,5 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
-package com.intellij.spellchecker.grazie.dictionary
+package com.intellij.grazie.spellcheck.dictionary
import ai.grazie.nlp.similarity.Levenshtein
import ai.grazie.spell.lists.WordList
diff --git a/spellchecker/src/com/intellij/spellchecker/grazie/dictionary/WordListAdapter.kt b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/dictionary/WordListAdapter.kt
similarity index 97%
rename from spellchecker/src/com/intellij/spellchecker/grazie/dictionary/WordListAdapter.kt
rename to plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/dictionary/WordListAdapter.kt
index a19aef78cf00..4bc7d0634471 100644
--- a/spellchecker/src/com/intellij/spellchecker/grazie/dictionary/WordListAdapter.kt
+++ b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/dictionary/WordListAdapter.kt
@@ -1,5 +1,5 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
-package com.intellij.spellchecker.grazie.dictionary
+package com.intellij.grazie.spellcheck.dictionary
import ai.grazie.nlp.similarity.Levenshtein
import ai.grazie.spell.lists.WordList
diff --git a/spellchecker/src/com/intellij/spellchecker/grazie/GrazieSpellCheckerEngine.kt b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/engine/GrazieSpellCheckerEngine.kt
similarity index 88%
rename from spellchecker/src/com/intellij/spellchecker/grazie/GrazieSpellCheckerEngine.kt
rename to plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/engine/GrazieSpellCheckerEngine.kt
index ba3e8505aac7..7786b82552b8 100644
--- a/spellchecker/src/com/intellij/spellchecker/grazie/GrazieSpellCheckerEngine.kt
+++ b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/engine/GrazieSpellCheckerEngine.kt
@@ -1,7 +1,7 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
@file:OptIn(ExperimentalCoroutinesApi::class)
-package com.intellij.spellchecker.grazie
+package com.intellij.grazie.spellcheck.engine
import ai.grazie.nlp.langs.Language
import ai.grazie.nlp.langs.LanguageISO
@@ -16,12 +16,18 @@ import ai.grazie.spell.language.LanguageModel
import ai.grazie.spell.suggestion.filter.feature.RadiusSuggestionFilter
import ai.grazie.utils.mpp.Resources
import com.github.benmanes.caffeine.cache.Caffeine
+import com.intellij.grazie.spellcheck.async.WordListLoader
+import com.intellij.grazie.spellcheck.dictionary.ExtendedWordListWithFrequency
+import com.intellij.grazie.spellcheck.dictionary.WordListAdapter
+import com.intellij.grazie.spellcheck.hunspell.HunspellDictionary
+import com.intellij.grazie.spellcheck.ranker.DiacriticSuggestionRanker
import com.intellij.openapi.Disposable
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.application.readAction
-import com.intellij.openapi.components.Service
+import com.intellij.openapi.components.service
import com.intellij.openapi.components.serviceAsync
import com.intellij.openapi.extensions.ExtensionNotApplicableException
+import com.intellij.openapi.extensions.ExtensionPointName
import com.intellij.openapi.project.Project
import com.intellij.openapi.startup.ProjectActivity
import com.intellij.openapi.util.io.FileUtil
@@ -32,11 +38,7 @@ import com.intellij.spellchecker.dictionary.Loader
import com.intellij.spellchecker.engine.SpellCheckerEngine
import com.intellij.spellchecker.engine.SpellCheckerEngineListener
import com.intellij.spellchecker.engine.Transformation
-import com.intellij.spellchecker.grazie.async.WordListLoader
-import com.intellij.spellchecker.grazie.dictionary.ExtendedWordListWithFrequency
-import com.intellij.spellchecker.grazie.dictionary.WordListAdapter
-import com.intellij.spellchecker.grazie.ranker.DiacriticSuggestionRanker
-import com.intellij.spellchecker.hunspell.HunspellDictionary
+import com.intellij.spellchecker.grazie.SpellcheckerLifecycle
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.cancel
@@ -45,14 +47,17 @@ import org.jetbrains.annotations.ApiStatus
import org.jetbrains.annotations.TestOnly
private const val MAX_WORD_LENGTH = 32
+internal val LIFECYCLE_EP_NAME: ExtensionPointName = ExtensionPointName("com.intellij.spellchecker.lifecycle")
-@Service(Service.Level.PROJECT)
class GrazieSpellCheckerEngine(
project: Project,
private val coroutineScope: CoroutineScope,
) : SpellCheckerEngine, Disposable {
companion object {
+ @JvmStatic
+ fun getInstance(project: Project): GrazieSpellCheckerEngine = project.service() as GrazieSpellCheckerEngine
+
val enDictionary: HunspellDictionary by lazy {
val dic = Resources.text("/dictionary/en.dic")
val aff = Resources.text("/dictionary/en.aff")
@@ -67,6 +72,7 @@ class GrazieSpellCheckerEngine(
private val loader = WordListLoader(project, coroutineScope)
private val adapter = WordListAdapter()
+ private val replacingRules: Set = getReplacingRules()
internal class SpellerLoadActivity : ProjectActivity {
init {
@@ -78,7 +84,7 @@ class GrazieSpellCheckerEngine(
}
override suspend fun execute(project: Project) {
- project.serviceAsync().initializeSpeller(project)
+ getInstance(project).initializeSpeller(project)
project.serviceAsync()
// heavy classloading to avoid freezes from FJP thread starvation
@@ -88,6 +94,12 @@ class GrazieSpellCheckerEngine(
}
}
+ init {
+ if (ApplicationManager.getApplication().isUnitTestMode) {
+ initializeSpeller(project)
+ }
+ }
+
@OptIn(ExperimentalCoroutinesApi::class)
private val suggestionCache = Caffeine.newBuilder().maximumSize(1024).build> { request ->
val speller = speller!!
@@ -111,7 +123,6 @@ class GrazieSpellCheckerEngine(
@Volatile
private var speller: Speller? = null
- private val replacingRules: Set = getReplacingRules()
@ApiStatus.Internal
fun initializeSpeller(project: Project) {
diff --git a/spellchecker/src/com/intellij/spellchecker/hunspell/HunspellDictionary.kt b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/hunspell/HunspellDictionary.kt
similarity index 98%
rename from spellchecker/src/com/intellij/spellchecker/hunspell/HunspellDictionary.kt
rename to plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/hunspell/HunspellDictionary.kt
index 76b9beebb289..22bdc4605211 100644
--- a/spellchecker/src/com/intellij/spellchecker/hunspell/HunspellDictionary.kt
+++ b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/hunspell/HunspellDictionary.kt
@@ -1,5 +1,5 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
-package com.intellij.spellchecker.hunspell
+package com.intellij.grazie.spellcheck.hunspell
import ai.grazie.nlp.langs.Language
import ai.grazie.nlp.langs.LanguageISO
diff --git a/spellchecker/src/com/intellij/spellchecker/hunspell/HunspellDictionaryProvider.kt b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/hunspell/HunspellDictionaryProvider.kt
similarity index 98%
rename from spellchecker/src/com/intellij/spellchecker/hunspell/HunspellDictionaryProvider.kt
rename to plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/hunspell/HunspellDictionaryProvider.kt
index b9cbf3be3bf8..a04797160d34 100644
--- a/spellchecker/src/com/intellij/spellchecker/hunspell/HunspellDictionaryProvider.kt
+++ b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/hunspell/HunspellDictionaryProvider.kt
@@ -1,5 +1,5 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
-package com.intellij.spellchecker.hunspell
+package com.intellij.grazie.spellcheck.hunspell
import com.intellij.ide.plugins.PluginManagerCore
import com.intellij.openapi.extensions.PluginId
diff --git a/spellchecker/src/com/intellij/spellchecker/grazie/ranker/DiacriticSuggestionRanker.kt b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/ranker/DiacriticSuggestionRanker.kt
similarity index 87%
rename from spellchecker/src/com/intellij/spellchecker/grazie/ranker/DiacriticSuggestionRanker.kt
rename to plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/ranker/DiacriticSuggestionRanker.kt
index 65e2600e5e4e..369797df1224 100644
--- a/spellchecker/src/com/intellij/spellchecker/grazie/ranker/DiacriticSuggestionRanker.kt
+++ b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/ranker/DiacriticSuggestionRanker.kt
@@ -1,9 +1,9 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
-package com.intellij.spellchecker.grazie.ranker
+package com.intellij.grazie.spellcheck.ranker
import ai.grazie.spell.suggestion.ranker.SuggestionRanker
import ai.grazie.utils.LinkedSet
-import com.intellij.spellchecker.grazie.diacritic.Diacritics
+import com.intellij.grazie.spellcheck.diacritic.Diacritics
class DiacriticSuggestionRanker(
private val fallbackSuggestionRanker: SuggestionRanker,
diff --git a/spellchecker/src/com/intellij/spellchecker/quickfixes/SpellcheckingNameSuggestionProvider.kt b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/suggestion/SpellcheckingNameSuggestionProvider.kt
similarity index 76%
rename from spellchecker/src/com/intellij/spellchecker/quickfixes/SpellcheckingNameSuggestionProvider.kt
rename to plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/suggestion/SpellcheckingNameSuggestionProvider.kt
index f2f2f9744a53..c9ff5f3eb137 100644
--- a/spellchecker/src/com/intellij/spellchecker/quickfixes/SpellcheckingNameSuggestionProvider.kt
+++ b/plugins/grazie/src/main/kotlin/com/intellij/grazie/spellcheck/suggestion/SpellcheckingNameSuggestionProvider.kt
@@ -1,23 +1,24 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
-package com.intellij.spellchecker.quickfixes
+package com.intellij.grazie.spellcheck.suggestion
-import com.intellij.openapi.components.service
+import com.intellij.codeInsight.completion.CompletionUtilCore
+import com.intellij.grazie.spellcheck.engine.GrazieSpellCheckerEngine
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiNamedElement
import com.intellij.psi.codeStyle.SuggestedNameInfo
import com.intellij.refactoring.rename.NameSuggestionProvider
import com.intellij.refactoring.rename.RenameUtil
-import com.intellij.spellchecker.SpellCheckerManager
-import com.intellij.spellchecker.grazie.GrazieSpellCheckerEngine
class SpellcheckingNameSuggestionProvider : NameSuggestionProvider {
private val suggestionLimit = 3
+ private val minimalWordLength = 4
override fun getSuggestedNames(element: PsiElement, context: PsiElement?, result: MutableSet): SuggestedNameInfo? {
val name = getName(element) ?: return null
+ if (name.contains(CompletionUtilCore.DUMMY_IDENTIFIER_TRIMMED) || name.length < minimalWordLength) return null
- val engine = element.project.service()
+ val engine = GrazieSpellCheckerEngine.getInstance(element.project)
val speller = engine.getSpeller() ?: return null
if (!speller.isMisspelled(name)) return null
diff --git a/plugins/grazie/src/test/kotlin/com/intellij/grazie/ide/language/JSONSupportTest.kt b/plugins/grazie/src/test/kotlin/com/intellij/grazie/ide/language/JSONSupportTest.kt
index 96296c430653..cd309fa227d0 100644
--- a/plugins/grazie/src/test/kotlin/com/intellij/grazie/ide/language/JSONSupportTest.kt
+++ b/plugins/grazie/src/test/kotlin/com/intellij/grazie/ide/language/JSONSupportTest.kt
@@ -3,8 +3,8 @@ package com.intellij.grazie.ide.language
import com.intellij.grazie.GrazieTestBase
import com.intellij.grazie.jlanguage.Lang
+import com.intellij.grazie.spellcheck.engine.GrazieSpellCheckerEngine
import com.intellij.openapi.components.service
-import com.intellij.spellchecker.grazie.GrazieSpellCheckerEngine
import com.intellij.tools.ide.metrics.benchmark.Benchmark
class JSONSupportTest : GrazieTestBase() {
@@ -21,7 +21,7 @@ class JSONSupportTest : GrazieTestBase() {
runHighlightTestForFile("ide/language/json/i18n.json")
}.setup {
psiManager.dropPsiCaches()
- project.service().dropSuggestionCache()
+ GrazieSpellCheckerEngine.getInstance(project).dropSuggestionCache()
}.start()
}
}
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 97d5361f2df8..3b4158ee6fa1 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
@@ -1,16 +1,14 @@
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.grazie.ide.language
-import com.intellij.grazie.GrazieConfig
import com.intellij.grazie.GrazieTestBase
import com.intellij.grazie.jlanguage.Lang
-import com.intellij.grazie.utils.TextStyleDomain
+import com.intellij.grazie.spellcheck.engine.GrazieSpellCheckerEngine
import com.intellij.openapi.components.service
import com.intellij.openapi.util.Disposer
import com.intellij.spellchecker.ProjectDictionaryLayer
import com.intellij.spellchecker.SpellCheckerManager
import com.intellij.spellchecker.dictionary.Loader
-import com.intellij.spellchecker.grazie.GrazieSpellCheckerEngine
import com.intellij.spellchecker.settings.SpellCheckerSettings
import com.intellij.testFramework.LightProjectDescriptor
import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase
@@ -212,7 +210,7 @@ class JavaSupportTest : GrazieTestBase() {
runHighlightTestForFile("ide/language/java/Dictionary.java")
}.setup {
psiManager.dropPsiCaches()
- project.service().dropSuggestionCache()
+ GrazieSpellCheckerEngine.getInstance(project).dropSuggestionCache()
}.start()
}
diff --git a/plugins/grazie/src/test/kotlin/com/intellij/grazie/ide/language/PropertiesSupportTest.kt b/plugins/grazie/src/test/kotlin/com/intellij/grazie/ide/language/PropertiesSupportTest.kt
index 9e3b313abfab..8d16b2362583 100644
--- a/plugins/grazie/src/test/kotlin/com/intellij/grazie/ide/language/PropertiesSupportTest.kt
+++ b/plugins/grazie/src/test/kotlin/com/intellij/grazie/ide/language/PropertiesSupportTest.kt
@@ -3,9 +3,9 @@ package com.intellij.grazie.ide.language
import com.intellij.grazie.GrazieTestBase
import com.intellij.grazie.jlanguage.Lang
+import com.intellij.grazie.spellcheck.engine.GrazieSpellCheckerEngine
import com.intellij.openapi.components.service
import com.intellij.openapi.vfs.encoding.EncodingProjectManager
-import com.intellij.spellchecker.grazie.GrazieSpellCheckerEngine
import com.intellij.tools.ide.metrics.benchmark.Benchmark
import java.nio.charset.StandardCharsets
@@ -56,7 +56,7 @@ class PropertiesSupportTest : GrazieTestBase() {
runHighlightTestForFile("ide/language/properties/i18n.properties")
}.setup {
psiManager.dropPsiCaches()
- project.service().dropSuggestionCache()
+ GrazieSpellCheckerEngine.getInstance(project).dropSuggestionCache()
}.start()
}
}
diff --git a/plugins/grazie/src/test/kotlin/com/intellij/grazie/ide/language/YamlSupportTest.kt b/plugins/grazie/src/test/kotlin/com/intellij/grazie/ide/language/YamlSupportTest.kt
index 6c0e271385f3..01b0f379ab15 100644
--- a/plugins/grazie/src/test/kotlin/com/intellij/grazie/ide/language/YamlSupportTest.kt
+++ b/plugins/grazie/src/test/kotlin/com/intellij/grazie/ide/language/YamlSupportTest.kt
@@ -3,10 +3,10 @@ package com.intellij.grazie.ide.language
import com.intellij.grazie.GrazieTestBase
import com.intellij.grazie.jlanguage.Lang
+import com.intellij.grazie.spellcheck.engine.GrazieSpellCheckerEngine
import com.intellij.grazie.text.TextContent
import com.intellij.grazie.text.TextExtractor
import com.intellij.openapi.components.service
-import com.intellij.spellchecker.grazie.GrazieSpellCheckerEngine
import com.intellij.tools.ide.metrics.benchmark.Benchmark
class YamlSupportTest : GrazieTestBase() {
@@ -27,7 +27,7 @@ class YamlSupportTest : GrazieTestBase() {
runHighlightTestForFile("ide/language/yaml/i18n.yaml")
}.setup {
psiManager.dropPsiCaches()
- project.service().dropSuggestionCache()
+ GrazieSpellCheckerEngine.getInstance(project).dropSuggestionCache()
}.start()
}
}
diff --git a/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/inspections/tests/AbstractK2LocalInspectionTest.kt b/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/inspections/tests/AbstractK2LocalInspectionTest.kt
index ef4471a94dce..c9d788196347 100644
--- a/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/inspections/tests/AbstractK2LocalInspectionTest.kt
+++ b/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/inspections/tests/AbstractK2LocalInspectionTest.kt
@@ -8,12 +8,11 @@ import com.intellij.platform.ide.progress.runWithModalProgressBlocking
import com.intellij.psi.util.PsiUtilCore
import com.intellij.testFramework.common.runAll
import com.intellij.testFramework.replaceService
-import com.intellij.testFramework.utils.vfs.getPsiFile
import kotlinx.coroutines.CoroutineScope
import org.jetbrains.kotlin.idea.base.test.IgnoreTests
import org.jetbrains.kotlin.idea.base.test.k2FileName
-import org.jetbrains.kotlin.idea.core.script.k2.configurations.ScriptConfigurationWithSdk
import org.jetbrains.kotlin.idea.core.script.k2.configurations.DefaultScriptConfigurationHandler
+import org.jetbrains.kotlin.idea.core.script.k2.configurations.ScriptConfigurationWithSdk
import org.jetbrains.kotlin.idea.core.script.k2.configurations.getConfigurationResolver
import org.jetbrains.kotlin.idea.core.script.v1.alwaysVirtualFile
import org.jetbrains.kotlin.idea.fir.K2DirectiveBasedActionUtils
@@ -24,7 +23,6 @@ import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescrip
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
import org.jetbrains.kotlin.scripting.definitions.findScriptDefinition
-import org.jetbrains.kotlin.test.services.EnvironmentBasedStandardLibrariesPathProvider.getFile
import java.io.File
import java.nio.file.Path
import kotlin.coroutines.EmptyCoroutineContext
diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/refactoring/AbstractNameSuggestionProviderTest.kt b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/refactoring/AbstractNameSuggestionProviderTest.kt
index 299d5a0b9a9c..ac517c3e62b2 100644
--- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/refactoring/AbstractNameSuggestionProviderTest.kt
+++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/refactoring/AbstractNameSuggestionProviderTest.kt
@@ -3,6 +3,7 @@
package org.jetbrains.kotlin.idea.refactoring
import com.intellij.codeInsight.TargetElementUtil
+import com.intellij.grazie.spellcheck.suggestion.SpellcheckingNameSuggestionProvider
import com.intellij.openapi.actionSystem.ex.ActionUtil
import com.intellij.psi.PsiElement
import com.intellij.refactoring.rename.NameSuggestionProvider
diff --git a/spellchecker/BUILD.bazel b/spellchecker/BUILD.bazel
index 5c5cf12d82c8..2288e5539810 100644
--- a/spellchecker/BUILD.bazel
+++ b/spellchecker/BUILD.bazel
@@ -42,7 +42,6 @@ jvm_library(
"//platform/refactoring",
"@lib//:guava",
"//platform/statistics",
- "//libraries/ai.grazie.spell.gec.engine.local",
"@lib//:spellchecker-java-string-similarity",
"//platform/core-ui",
"//libraries/lucene.common",
@@ -51,7 +50,6 @@ jvm_library(
"//platform/util/jdom",
"@lib//:kotlin-stdlib",
"@lib//:kotlinx-coroutines-core",
- "@lib//:caffeine",
],
runtime_deps = ["//platform/backend"]
)
@@ -79,7 +77,6 @@ jvm_library(
"@lib//:guava",
"//platform/statistics",
"//platform/statistics:statistics_test_lib",
- "//libraries/ai.grazie.spell.gec.engine.local",
"@lib//:spellchecker-java-string-similarity",
"//platform/core-ui",
"//libraries/lucene.common",
@@ -91,7 +88,6 @@ jvm_library(
"@lib//:kotlin-test",
"@lib//:kotlin-test-junit",
"@lib//:kotlinx-coroutines-core",
- "@lib//:caffeine",
"//tools/intellij.tools.ide.metrics.benchmark:ide-metrics-benchmark",
"//tools/intellij.tools.ide.metrics.benchmark:ide-metrics-benchmark_test_lib",
"//xml/relaxng",
diff --git a/spellchecker/intellij.spellchecker.iml b/spellchecker/intellij.spellchecker.iml
index 2ef2f14e0c7c..16a47b36b172 100644
--- a/spellchecker/intellij.spellchecker.iml
+++ b/spellchecker/intellij.spellchecker.iml
@@ -27,7 +27,6 @@
-
@@ -55,7 +54,6 @@
-
diff --git a/spellchecker/resources/intellij.spellchecker.xml b/spellchecker/resources/intellij.spellchecker.xml
index 68b60c87b7f6..d0dcbc4d3e42 100644
--- a/spellchecker/resources/intellij.spellchecker.xml
+++ b/spellchecker/resources/intellij.spellchecker.xml
@@ -25,9 +25,6 @@
serviceImplementation="com.intellij.spellchecker.ui.SpellCheckingEditorCustomizationProviderImpl"
overrides="true"/>
-
-
-
@@ -35,7 +32,6 @@
-
diff --git a/spellchecker/src/com/intellij/spellchecker/SpellCheckerManager.kt b/spellchecker/src/com/intellij/spellchecker/SpellCheckerManager.kt
index 0834da5e1d6b..189adf86a75e 100644
--- a/spellchecker/src/com/intellij/spellchecker/SpellCheckerManager.kt
+++ b/spellchecker/src/com/intellij/spellchecker/SpellCheckerManager.kt
@@ -3,7 +3,6 @@
package com.intellij.spellchecker
-import ai.grazie.utils.isLowercase
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer
import com.intellij.ide.SaveAndSyncHandler
import com.intellij.openapi.Disposable
@@ -34,7 +33,6 @@ import com.intellij.spellchecker.SpellCheckerManager.Companion.restartInspection
import com.intellij.spellchecker.dictionary.*
import com.intellij.spellchecker.engine.SpellCheckerEngine
import com.intellij.spellchecker.engine.SuggestionProvider
-import com.intellij.spellchecker.grazie.GrazieSpellCheckerEngine
import com.intellij.spellchecker.grazie.GrazieSuggestionProvider
import com.intellij.spellchecker.settings.SpellCheckerSettings
import com.intellij.spellchecker.state.AppDictionaryState
@@ -78,10 +76,6 @@ class SpellCheckerManager @Internal constructor(@Internal val project: Project,
private var suggestionProvider: SuggestionProvider? = null
init {
- if (ApplicationManager.getApplication().isUnitTestMode) {
- project.service().initializeSpeller(project)
- }
-
fullConfigurationReload()
LocalFileSystem.getInstance().addVirtualFileListener(CustomDictFileListener(project = project, manager = this), this)
@@ -124,7 +118,7 @@ class SpellCheckerManager @Internal constructor(@Internal val project: Project,
}
fun fullConfigurationReload() {
- val spellChecker = project.service()
+ val spellChecker = project.service()
this.spellChecker = spellChecker
suggestionProvider = GrazieSuggestionProvider(spellChecker)
fillEngineDictionary(spellChecker)
@@ -262,7 +256,7 @@ class SpellCheckerManager @Internal constructor(@Internal val project: Project,
}
private fun transform(word: String): String? {
- if (StringUtil.decapitalize(word).isLowercase()) return word
+ if (StringUtil.isLowerCase(StringUtil.decapitalize(word))) return word
return spellChecker!!.transformation.transform(word)
}
diff --git a/spellchecker/src/com/intellij/spellchecker/grazie/SpellcheckerLifecycle.kt b/spellchecker/src/com/intellij/spellchecker/grazie/SpellcheckerLifecycle.kt
index c8d9b0ba7aee..4327e3bc440f 100644
--- a/spellchecker/src/com/intellij/spellchecker/grazie/SpellcheckerLifecycle.kt
+++ b/spellchecker/src/com/intellij/spellchecker/grazie/SpellcheckerLifecycle.kt
@@ -1,13 +1,10 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.spellchecker.grazie
-import com.intellij.openapi.extensions.ExtensionPointName
import com.intellij.openapi.project.Project
import org.jetbrains.annotations.ApiStatus
@ApiStatus.Experimental
interface SpellcheckerLifecycle {
suspend fun preload(project: Project)
-}
-
-internal val LIFECYCLE_EP_NAME: ExtensionPointName = ExtensionPointName("com.intellij.spellchecker.lifecycle")
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/spellchecker/src/com/intellij/spellchecker/quickfixes/RenameTo.java b/spellchecker/src/com/intellij/spellchecker/quickfixes/RenameTo.java
index 0c77a5e979a9..39c00a28d124 100644
--- a/spellchecker/src/com/intellij/spellchecker/quickfixes/RenameTo.java
+++ b/spellchecker/src/com/intellij/spellchecker/quickfixes/RenameTo.java
@@ -27,8 +27,8 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
-import java.util.*;
-import java.util.stream.Collectors;
+import java.util.ArrayList;
+import java.util.List;
public class RenameTo extends IntentionAndQuickFixAction implements Iconable, EventTrackingIntentionAction {
diff --git a/spellchecker/src/com/intellij/spellchecker/util/SpellCheckerBundle.kt b/spellchecker/src/com/intellij/spellchecker/util/SpellCheckerBundle.kt
index 5843c26eba36..74985664c20a 100644
--- a/spellchecker/src/com/intellij/spellchecker/util/SpellCheckerBundle.kt
+++ b/spellchecker/src/com/intellij/spellchecker/util/SpellCheckerBundle.kt
@@ -9,7 +9,7 @@ import java.util.function.Supplier
private const val BUNDLE: @NonNls String = "messages.SpellCheckerBundle"
-internal object SpellCheckerBundle : DynamicBundle(BUNDLE) {
+object SpellCheckerBundle : DynamicBundle(BUNDLE) {
@JvmStatic
fun message(key: @PropertyKey(resourceBundle = BUNDLE) String, vararg params: Any): @Nls String {
return getMessage(key, *params)