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)