[grazie] IJPL-200544 Migrate GrazieSpellCheckerEngine, grazie and hunspell dictionaries to grazie module

Merge-request: IJ-MR-176956
Merged-by: Ilia Permiashkin <ilia.permiashkin@jetbrains.com>

GitOrigin-RevId: 58c7d2896724ac1be5e999b22ccf98d5e16a74a4
This commit is contained in:
Ilia Permiashkin
2025-09-30 18:25:47 +00:00
committed by intellij-monorepo-bot
parent 230d39a7ca
commit 87f783e802
36 changed files with 78 additions and 74 deletions
+1
View File
@@ -157,6 +157,7 @@ jvm_library(
"//xml/impl",
"//platform/syntax/syntax-scripts:scripts",
"@lib//:byte-buddy",
"//plugins/grazie/src:core",
],
exports = [
"//plugins/java-i18n",
+1
View File
@@ -129,5 +129,6 @@
<orderEntry type="module" module-name="intellij.xml.impl" scope="TEST" />
<orderEntry type="module" module-name="intellij.platform.syntax.scripts" scope="TEST" />
<orderEntry type="library" scope="TEST" name="byte-buddy" level="project" />
<orderEntry type="module" module-name="intellij.grazie.core" scope="TEST" />
</component>
</module>
@@ -1 +1 @@
NegativeArraySizeException negativeArraySizeException;
NegativeArraySizeException option;
@@ -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 {
@@ -49,6 +49,7 @@
<applicationService serviceImplementation="com.intellij.grazie.GrazieConfig"/>
<backgroundPostStartupActivity implementation="com.intellij.grazie.ide.notification.GrazieNotificationComponent"/>
<postStartupActivity implementation="com.intellij.grazie.spellcheck.engine.GrazieSpellCheckerEngine$SpellerLoadActivity"/>
<!-- getDisplayName is overridden in GrazieInspection itself! Placeholder is required to suppress validation. -->
<localInspection bundle="messages.GrazieBundle" groupKey="grazie.group.name" enabledByDefault="true" shortName="GrazieInspectionRunner"
@@ -74,6 +75,9 @@
language=""
implementationClass="com.intellij.grazie.spellcheck.GrazieSpellCheckingInspection"/>
<projectService serviceImplementation="com.intellij.grazie.spellcheck.engine.GrazieSpellCheckerEngine"
serviceInterface="com.intellij.spellchecker.engine.SpellCheckerEngine"/>
<applicationConfigurable parentId="editor" instance="com.intellij.grazie.ide.ui.proofreading.ProofreadConfigurable" id="proofread"
key="configurable.group.proofread.settings.display.name" bundle="messages.OptionsBundle"/>
@@ -88,6 +92,7 @@
<statistics.notificationIdsHolder implementation="com.intellij.grazie.ide.notification.GrazieNotificationIds"/>
<spellchecker.dictionary.runtimeDictionaryProvider implementation="com.intellij.grazie.spellcheck.GrazieDictionaryProvider"/>
<spellchecker.dictionary.customDictionaryProvider implementation="com.intellij.grazie.spellcheck.hunspell.HunspellDictionaryProvider"/>
<notificationGroup id="Proofreading missing languages information" displayType="STICKY_BALLOON" bundle="messages.GrazieBundle"
key="grazie.notification.missing-languages.group"/>
@@ -103,6 +108,7 @@
<severitiesProvider implementation="com.intellij.grazie.ide.TextProblemSeverities"/>
<spellchecker.lifecycle implementation="com.intellij.grazie.spellcheck.GrazieSpellcheckerLifecycle"/>
<nameSuggestionProvider id="SpellcheckingSuggestionProvider" implementation="com.intellij.grazie.spellcheck.suggestion.SpellcheckingNameSuggestionProvider" order="first"/>
<registryKey key="spellchecker.grazie.enabled" defaultValue="true" description="Enables Grazie text-level spellchecking"/>
<registryKey key="grazie.skip.precommit.checks"
+1
View File
@@ -77,6 +77,7 @@ jvm_library(
"//platform/util/text-matching",
"//libraries/grpc",
"//platform/util/jdom",
"@lib//:caffeine",
],
exports = [
"@lib//:grazie-core-org-jetbrains-intellij-deps-languagetool-languagetool-core",
@@ -412,5 +412,6 @@
<orderEntry type="module" module-name="intellij.platform.util.text.matching" />
<orderEntry type="module" module-name="intellij.libraries.grpc" />
<orderEntry type="module" module-name="intellij.platform.util.jdom" />
<orderEntry type="library" name="caffeine" level="project" />
</component>
</module>
@@ -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
@@ -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<String> 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;
@@ -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<GrazieSpellCheckerEngine>().getSpeller() ?: return null
val speller = GrazieSpellCheckerEngine.getInstance(project).getSpeller() ?: return null
val enabledLanguages = GrazieConfig.get().enabledLanguages.mapNotNull { it.withVariant }
val validPhrasesTexts = ConcurrentHashMap<CharSequence, List<ai.grazie.rules.tree.TextRange>>()
@@ -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
@@ -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.*
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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<SpellcheckerLifecycle> = 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<SpellCheckerEngine>() 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<RuleDictionary> = getReplacingRules()
internal class SpellerLoadActivity : ProjectActivity {
init {
@@ -78,7 +84,7 @@ class GrazieSpellCheckerEngine(
}
override suspend fun execute(project: Project) {
project.serviceAsync<GrazieSpellCheckerEngine>().initializeSpeller(project)
getInstance(project).initializeSpeller(project)
project.serviceAsync<SpellCheckerManager>()
// 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<SuggestionRequest, List<String>> { request ->
val speller = speller!!
@@ -111,7 +123,6 @@ class GrazieSpellCheckerEngine(
@Volatile
private var speller: Speller? = null
private val replacingRules: Set<RuleDictionary> = getReplacingRules()
@ApiStatus.Internal
fun initializeSpeller(project: Project) {
@@ -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
@@ -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
@@ -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,
@@ -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<String>): SuggestedNameInfo? {
val name = getName(element) ?: return null
if (name.contains(CompletionUtilCore.DUMMY_IDENTIFIER_TRIMMED) || name.length < minimalWordLength) return null
val engine = element.project.service<GrazieSpellCheckerEngine>()
val engine = GrazieSpellCheckerEngine.getInstance(element.project)
val speller = engine.getSpeller() ?: return null
if (!speller.isMisspelled(name)) return null
@@ -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<GrazieSpellCheckerEngine>().dropSuggestionCache()
GrazieSpellCheckerEngine.getInstance(project).dropSuggestionCache()
}.start()
}
}
@@ -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<GrazieSpellCheckerEngine>().dropSuggestionCache()
GrazieSpellCheckerEngine.getInstance(project).dropSuggestionCache()
}.start()
}
@@ -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<GrazieSpellCheckerEngine>().dropSuggestionCache()
GrazieSpellCheckerEngine.getInstance(project).dropSuggestionCache()
}.start()
}
}
@@ -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<GrazieSpellCheckerEngine>().dropSuggestionCache()
GrazieSpellCheckerEngine.getInstance(project).dropSuggestionCache()
}.start()
}
}
@@ -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
@@ -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
-4
View File
@@ -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",
-2
View File
@@ -27,7 +27,6 @@
<orderEntry type="module" module-name="intellij.platform.refactoring" />
<orderEntry type="library" name="Guava" level="project" />
<orderEntry type="module" module-name="intellij.platform.statistics" />
<orderEntry type="module" module-name="intellij.libraries.ai.grazie.spell.gec.engine.local" />
<orderEntry type="module-library">
<library name="java-string-similarity" type="repository">
<properties include-transitive-deps="false" maven-id="info.debatty:java-string-similarity:2.0.0">
@@ -55,7 +54,6 @@
<orderEntry type="library" scope="TEST" name="kotlin-test" level="project" />
<orderEntry type="library" scope="TEST" name="kotlin-test-junit" level="project" />
<orderEntry type="library" name="kotlinx-coroutines-core" level="project" />
<orderEntry type="library" name="caffeine" level="project" />
<orderEntry type="module" module-name="intellij.tools.ide.metrics.benchmark" scope="TEST" />
<orderEntry type="module" module-name="intellij.relaxng" scope="TEST" />
</component>
@@ -25,9 +25,6 @@
serviceImplementation="com.intellij.spellchecker.ui.SpellCheckingEditorCustomizationProviderImpl"
overrides="true"/>
<fileType name="Dictionary" implementationClass="com.intellij.spellchecker.DictionaryFileType" extensions="dic"/>
<postStartupActivity implementation="com.intellij.spellchecker.grazie.GrazieSpellCheckerEngine$SpellerLoadActivity"/>
<nameSuggestionProvider id="SpellcheckingSuggestionProvider" implementation="com.intellij.spellchecker.quickfixes.SpellcheckingNameSuggestionProvider" order="first"/>
<severitiesProvider implementation="com.intellij.spellchecker.SpellCheckerSeveritiesProvider"/>
<spellchecker.support language="TEXT" implementationClass="com.intellij.spellchecker.tokenizer.VmOptionsSpellcheckingStrategy"/>
@@ -35,7 +32,6 @@
<spellchecker.support language="TEXT" implementationClass="com.intellij.spellchecker.tokenizer.SpellcheckingStrategy"/>
<spellchecker.bundledDictionaryProvider implementation="com.intellij.spellchecker.DefaultBundledDictionariesProvider"/>
<spellchecker.dictionary.customDictionaryProvider implementation="com.intellij.spellchecker.hunspell.HunspellDictionaryProvider"/>
<spellchecker.dictionaryLayersProvider implementation="com.intellij.spellchecker.PlatformSettingsDictionaryLayersProvider" order="first"/>
<registryKey key="spellchecker.corrections.limit" defaultValue="3" description="Spellchecker corrections limit" restartRequired="false"/>
@@ -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<GrazieSpellCheckerEngine>().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<GrazieSpellCheckerEngine>()
val spellChecker = project.service<SpellCheckerEngine>()
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)
}
@@ -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<SpellcheckerLifecycle> = ExtensionPointName("com.intellij.spellchecker.lifecycle")
}
@@ -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 {
@@ -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)