From c4e1473104ad737d355f931018f60acbae672bcf Mon Sep 17 00:00:00 2001 From: Ilia Permiashkin Date: Wed, 13 Aug 2025 22:43:43 +0000 Subject: [PATCH] IJPL-190645 Enable text-level spellchecking for Java, XML, HTML, Plain-Text and Markdown Merge-request: IJ-MR-172291 Merged-by: Ilia Permiashkin GitOrigin-RevId: 0a9a50d89d614c56123cf64fdeeaeac87ae6a041 --- .../JavaSpellcheckingStrategy.java | 6 +++ .../ide/language/markdown/Spellcheck.md | 42 +++++++++---------- .../testData/ide/language/xml/Spellcheck.html | 2 +- .../inspections/spellchecker/Japanese.java | 4 +- .../MarkdownSpellcheckingStrategy.java | 22 ++++++---- .../inspections/SpellCheckingInspection.java | 12 ++++-- .../spellchecker/quickfixes/ChangeTo.kt | 12 +----- .../PlainTextSpellcheckingStrategy.kt | 8 +++- .../commentsWithMistakes/longTest.txt | 2 +- .../quickfixes/joinedWordsChangeTo.after.txt | 2 +- .../severalJoinedTyposChangeTo.after.txt | 2 +- .../typoInsideJoinedWordsChangeTo.after.txt | 2 +- .../xml/src/XmlSpellcheckingStrategy.java | 6 +++ 13 files changed, 72 insertions(+), 50 deletions(-) diff --git a/java/java-impl/src/com/intellij/spellchecker/JavaSpellcheckingStrategy.java b/java/java-impl/src/com/intellij/spellchecker/JavaSpellcheckingStrategy.java index 94b7c873fc18..4c195ab45679 100644 --- a/java/java-impl/src/com/intellij/spellchecker/JavaSpellcheckingStrategy.java +++ b/java/java-impl/src/com/intellij/spellchecker/JavaSpellcheckingStrategy.java @@ -4,6 +4,7 @@ package com.intellij.spellchecker; import com.intellij.codeInspection.SuppressManager; import com.intellij.codeInspection.util.ChronoUtil; import com.intellij.openapi.project.DumbAware; +import com.intellij.openapi.util.registry.Registry; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiLiteralExpression; import com.intellij.psi.PsiMethod; @@ -42,4 +43,9 @@ public final class JavaSpellcheckingStrategy extends SpellcheckingStrategy imple return super.getTokenizer(element); } + + @Override + public boolean useTextLevelSpellchecking() { + return Registry.is("spellchecker.grazie.enabled"); + } } diff --git a/plugins/grazie/src/test/testData/ide/language/markdown/Spellcheck.md b/plugins/grazie/src/test/testData/ide/language/markdown/Spellcheck.md index c1dabe073c94..969ec76be6c3 100644 --- a/plugins/grazie/src/test/testData/ide/language/markdown/Spellcheck.md +++ b/plugins/grazie/src/test/testData/ide/language/markdown/Spellcheck.md @@ -1,46 +1,46 @@ -**C**orrect, **Pro**blem, **Pr**oblem, **Co**rrect +**C**orrect, **Pro**blem, **Pr**oblem, **Co**rrect -bc5ebcd0_1a55_484d_aadc_198faeb50db0 +bc5ebcd0_1a55_484d_aadc_198faeb50db0 -password: VxBFMd9YCKjq6PBFG54FIY3V +password: VxBFMd9YCKjq6PBFG54FIY3V -PostgreSQL +PostgreSQL -cherry-picked from cafebabe3690498eecb45dfedba4 +cherry-picked from cafebabe3690498eecb45dfedba4 -Xlint Mindest- oder Regelstudienzeit, -Eignungs- und Sprachtests, -Hochschul- oder Fachhochschulreife, -Ausbildungs- oder Praxisaufstieg +Eignungs- und Sprachtests, +Hochschul- oder Fachhochschulreife, +Ausbildungs- oder Praxisaufstieg -/Users/Olga.Doroshko/Library/Java +/Users/Olga.Doroshko/Library/Java -----BEGIN PUBLIC KEY----- -MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALPwh7JEV7KNuZ0JGIoXz5XWv4bUkCMF -HTZ8ZG50urBdSMBZmtW75AdKHv5qvXt5Q+cb6N3FOqOhPVQjBM5+iAMCAwEAAQ== +MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALPwh7JEV7KNuZ0JGIoXz5XWv4bUkCMF +HTZ8ZG50urBdSMBZmtW75AdKHv5qvXt5Q+cb6N3FOqOhPVQjBM5+iAMCAwEAAQ== -----END PUBLIC KEY----- -----BEGIN RSA PRIVATE KEY----- -MIIBOgIBAAJBALPwh7JEV7KNuZ0JGIoXz5XWv4bUkCMFHTZ8ZG50urBdSMBZmtW7 -5AdKHv5qvXt5Q+cb6N3FOqOhPVQjBM5+iAMCAwEAAQJAD8dqv0gUVBbA6U62tuFD -PNU7qxD9rN3aW2xldlYV7XErHX8iWW+zA0M+aiOE+mOEotTYPF2+zMyW4mHkxNRj +MIIBOgIBAAJBALPwh7JEV7KNuZ0JGIoXz5XWv4bUkCMFHTZ8ZG50urBdSMBZmtW7 +5AdKHv5qvXt5Q+cb6N3FOqOhPVQjBM5+iAMCAwEAAQJAD8dqv0gUVBbA6U62tuFD +PNU7qxD9rN3aW2xldlYV7XErHX8iWW+zA0M+aiOE+mOEotTYPF2+zMyW4mHkxNRj cQIhAPO6KReZCUz3KgyJf88EO8z+2CkeRrbOkqU51daGS8VbAiEAuTPOQgAVe0WR -bQ26FQWwyoCR7uEehhXImzuvYRehWpsCIQCn52h+1YdHgVzFy7rhTvU8r03KgyjD -tzX0S0fNcPhUQQIgRF7dwimkIv4iKU+BM3AYbsvuhcMdvYId+yLaIHytdPECIATh -iIRnMZOGZTqZZ2Ku9wz2F1vKln97vth3FwbO2qgn +bQ26FQWwyoCR7uEehhXImzuvYRehWpsCIQCn52h+1YdHgVzFy7rhTvU8r03KgyjD +tzX0S0fNcPhUQQIgRF7dwimkIv4iKU+BM3AYbsvuhcMdvYId+yLaIHytdPECIATh +iIRnMZOGZTqZZ2Ku9wz2F1vKln97vth3FwbO2qgn -----END RSA PRIVATE KEY----- -LqAgHd9TFasfVYIgFxWHgoS1eq4xGvR+gSGZL0v8ZMk= -1QkUKfW9XDLO+YxZwQbL1Vnx5rUThCJHeX8ClcT1X6DeY+gQyukcHizHkS+6HR0nTxmQWknFj6D9z/U8kdXsEA== +LqAgHd9TFasfVYIgFxWHgoS1eq4xGvR+gSGZL0v8ZMk= +1QkUKfW9XDLO+YxZwQbL1Vnx5rUThCJHeX8ClcT1X6DeY+gQyukcHizHkS+6HR0nTxmQWknFj6D9z/U8kdXsEA== Random words: -- RESTful -- CAPM3 +- RESTful +- CAPM3 - iDRAC dafür // u + Unicode Combining Diaeresis Mark diff --git a/plugins/grazie/src/test/testData/ide/language/xml/Spellcheck.html b/plugins/grazie/src/test/testData/ide/language/xml/Spellcheck.html index e1ebfcc2702b..03c0eb4be70f 100644 --- a/plugins/grazie/src/test/testData/ide/language/xml/Spellcheck.html +++ b/plugins/grazie/src/test/testData/ide/language/xml/Spellcheck.html @@ -1 +1 @@ -amasons.com"/> \ No newline at end of file + \ No newline at end of file diff --git a/plugins/java-i18n/testData/inspections/spellchecker/Japanese.java b/plugins/java-i18n/testData/inspections/spellchecker/Japanese.java index 950ca38dd81f..a0ce223b59f0 100644 --- a/plugins/java-i18n/testData/inspections/spellchecker/Japanese.java +++ b/plugins/java-i18n/testData/inspections/spellchecker/Japanese.java @@ -1,7 +1,7 @@ -/** Half width Katakana variants (FF00 - FFEF) +/** Half width Katakana variants (FF00 - FFEF) * ワタシハジャバガスキデス。 */ -/** Full width ASCII variants (FF00 - FFEF) +/** Full width ASCII variants (FF00 - FFEF) * I LOVE JAVA */ /** Hiragana (3040 - 309F) diff --git a/plugins/markdown/spellchecker/src/main/kotlin/org/intellij/plugins/markdown/spellchecker/MarkdownSpellcheckingStrategy.java b/plugins/markdown/spellchecker/src/main/kotlin/org/intellij/plugins/markdown/spellchecker/MarkdownSpellcheckingStrategy.java index ca01af53dd12..92023669bf2a 100644 --- a/plugins/markdown/spellchecker/src/main/kotlin/org/intellij/plugins/markdown/spellchecker/MarkdownSpellcheckingStrategy.java +++ b/plugins/markdown/spellchecker/src/main/kotlin/org/intellij/plugins/markdown/spellchecker/MarkdownSpellcheckingStrategy.java @@ -2,6 +2,7 @@ package org.intellij.plugins.markdown.spellchecker; import com.intellij.lang.ASTNode; import com.intellij.openapi.project.DumbAware; +import com.intellij.openapi.util.registry.Registry; import com.intellij.psi.PsiElement; import com.intellij.psi.impl.source.tree.TreeUtil; import com.intellij.psi.tree.TokenSet; @@ -12,21 +13,28 @@ import org.intellij.plugins.markdown.lang.MarkdownTokenTypes; import org.jetbrains.annotations.NotNull; final class MarkdownSpellcheckingStrategy extends SpellcheckingStrategy implements DumbAware { - public static final TokenSet NO_SPELLCHECKING_TYPES = TokenSet.create(MarkdownElementTypes.CODE_BLOCK, - MarkdownElementTypes.CODE_FENCE, - MarkdownElementTypes.CODE_SPAN, - MarkdownElementTypes.LINK_DESTINATION); + public static final TokenSet NO_SPELLCHECKING_TYPES = TokenSet.create( + MarkdownElementTypes.CODE_BLOCK, + MarkdownElementTypes.CODE_FENCE, + MarkdownElementTypes.CODE_SPAN, + MarkdownElementTypes.LINK_DESTINATION + ); @Override public @NotNull Tokenizer getTokenizer(PsiElement element) { final ASTNode node = element.getNode(); if (node == null || node.getElementType() != MarkdownTokenTypes.TEXT) { - return SpellcheckingStrategy.EMPTY_TOKENIZER; + return EMPTY_TOKENIZER; } if (TreeUtil.findParent(node, NO_SPELLCHECKING_TYPES) != null) { - return SpellcheckingStrategy.EMPTY_TOKENIZER; + return EMPTY_TOKENIZER; } - return SpellcheckingStrategy.TEXT_TOKENIZER; + return TEXT_TOKENIZER; + } + + @Override + public boolean useTextLevelSpellchecking() { + return Registry.is("spellchecker.grazie.enabled"); } } diff --git a/spellchecker/src/com/intellij/spellchecker/inspections/SpellCheckingInspection.java b/spellchecker/src/com/intellij/spellchecker/inspections/SpellCheckingInspection.java index 2252adafb6fb..3fd29283a34b 100644 --- a/spellchecker/src/com/intellij/spellchecker/inspections/SpellCheckingInspection.java +++ b/spellchecker/src/com/intellij/spellchecker/inspections/SpellCheckingInspection.java @@ -24,7 +24,10 @@ import com.intellij.spellchecker.SpellCheckerManager; import com.intellij.spellchecker.grazie.diacritic.Diacritics; import com.intellij.spellchecker.inspections.SpellcheckingExtension.SpellCheckingResult; import com.intellij.spellchecker.inspections.SpellcheckingExtension.SpellingTypo; -import com.intellij.spellchecker.tokenizer.*; +import com.intellij.spellchecker.tokenizer.LanguageSpellchecking; +import com.intellij.spellchecker.tokenizer.SpellcheckingStrategy; +import com.intellij.spellchecker.tokenizer.SuppressibleSpellcheckingStrategy; +import com.intellij.spellchecker.tokenizer.TokenConsumer; import com.intellij.spellchecker.util.SpellCheckerBundle; import com.intellij.util.Consumer; import com.intellij.util.containers.CollectionFactory; @@ -94,6 +97,7 @@ public final class SpellCheckingInspection extends LocalInspectionTool implement return PsiElementVisitor.EMPTY_VISITOR; } var scopes = buildAllowedScopes(); + SpellCheckerManager manager = SpellCheckerManager.getInstance(holder.getProject()); return new PsiElementVisitor() { @Override public void visitElement(final @NotNull PsiElement element) { @@ -118,12 +122,13 @@ public final class SpellCheckingInspection extends LocalInspectionTool implement return; } - inspect(element, session, strategy, holder); + inspect(manager, element, session, strategy, holder); } }; } - private void inspect(@NotNull PsiElement element, + private void inspect(@NotNull SpellCheckerManager manager, + @NotNull PsiElement element, @NotNull LocalInspectionToolSession session, @NotNull SpellcheckingStrategy strategy, @NotNull ProblemsHolder holder) { @@ -137,7 +142,6 @@ public final class SpellCheckingInspection extends LocalInspectionTool implement ); if (result == SpellCheckingResult.Checked) return; - SpellCheckerManager manager = SpellCheckerManager.getInstance(holder.getProject()); Set scopes = buildAllowedScopes(); tokenize( strategy, element, diff --git a/spellchecker/src/com/intellij/spellchecker/quickfixes/ChangeTo.kt b/spellchecker/src/com/intellij/spellchecker/quickfixes/ChangeTo.kt index 1256dd70dd21..03d2be6f79ff 100644 --- a/spellchecker/src/com/intellij/spellchecker/quickfixes/ChangeTo.kt +++ b/spellchecker/src/com/intellij/spellchecker/quickfixes/ChangeTo.kt @@ -8,7 +8,6 @@ import com.intellij.codeInsight.intention.choice.ChoiceTitleIntentionAction import com.intellij.codeInsight.intention.choice.ChoiceVariantIntentionAction import com.intellij.codeInsight.intention.choice.DefaultIntentionActionWithChoice import com.intellij.codeInsight.intention.preview.IntentionPreviewUtils -import com.intellij.codeInspection.util.IntentionName import com.intellij.openapi.editor.Document import com.intellij.openapi.editor.Editor import com.intellij.openapi.editor.impl.DocumentMarkupModel @@ -27,19 +26,12 @@ import com.intellij.spellchecker.statistics.SpellcheckerRateTracker import com.intellij.spellchecker.util.SpellCheckerBundle import com.intellij.util.concurrency.ThreadingAssertions -internal class ChangeTo( +internal class ChangeTo @JvmOverloads constructor( typo: String, element: PsiElement, private val range: TextRange, - private val tracker: SpellcheckerRateTracker?, + private val tracker: SpellcheckerRateTracker? = null, ) : DefaultIntentionActionWithChoice, LazySuggestions(typo) { - // To prevent API breakage - constructor(typo: String, element: PsiElement, range: TextRange) : this( - typo, - element, - range, - null, - ) private val pointer = SmartPointerManager.getInstance(element.project).createSmartPsiElementPointer(element, element.containingFile) diff --git a/spellchecker/src/com/intellij/spellchecker/tokenizer/PlainTextSpellcheckingStrategy.kt b/spellchecker/src/com/intellij/spellchecker/tokenizer/PlainTextSpellcheckingStrategy.kt index 6c9dcf73705e..d5cbeb7b59b4 100644 --- a/spellchecker/src/com/intellij/spellchecker/tokenizer/PlainTextSpellcheckingStrategy.kt +++ b/spellchecker/src/com/intellij/spellchecker/tokenizer/PlainTextSpellcheckingStrategy.kt @@ -1,4 +1,10 @@ // 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.tokenizer -class PlainTextSpellcheckingStrategy: SpellcheckingStrategy() \ No newline at end of file +import com.intellij.openapi.util.registry.Registry + +class PlainTextSpellcheckingStrategy: SpellcheckingStrategy() { + override fun useTextLevelSpellchecking(): Boolean { + return Registry.`is`("spellchecker.grazie.enabled") + } +} \ No newline at end of file diff --git a/spellchecker/testData/inspection/commentsWithMistakes/longTest.txt b/spellchecker/testData/inspection/commentsWithMistakes/longTest.txt index 3b33878f7abb..8075aec1a506 100644 --- a/spellchecker/testData/inspection/commentsWithMistakes/longTest.txt +++ b/spellchecker/testData/inspection/commentsWithMistakes/longTest.txt @@ -1 +1 @@ -YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEK \ No newline at end of file +YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEK \ No newline at end of file diff --git a/spellchecker/testData/inspection/quickfixes/joinedWordsChangeTo.after.txt b/spellchecker/testData/inspection/quickfixes/joinedWordsChangeTo.after.txt index 97151ec9e1f8..105c9eae80d9 100644 --- a/spellchecker/testData/inspection/quickfixes/joinedWordsChangeTo.after.txt +++ b/spellchecker/testData/inspection/quickfixes/joinedWordsChangeTo.after.txt @@ -1 +1 @@ -someСorrectWordsAndTypo \ No newline at end of file +someCorrectWordsAndTypo \ No newline at end of file diff --git a/spellchecker/testData/inspection/quickfixes/severalJoinedTyposChangeTo.after.txt b/spellchecker/testData/inspection/quickfixes/severalJoinedTyposChangeTo.after.txt index 891c2b1828da..36d1ca86105a 100644 --- a/spellchecker/testData/inspection/quickfixes/severalJoinedTyposChangeTo.after.txt +++ b/spellchecker/testData/inspection/quickfixes/severalJoinedTyposChangeTo.after.txt @@ -1 +1 @@ -SoomeTypoJooinedTogeether \ No newline at end of file +SomeTypoJoinedTogether \ No newline at end of file diff --git a/spellchecker/testData/inspection/quickfixes/typoInsideJoinedWordsChangeTo.after.txt b/spellchecker/testData/inspection/quickfixes/typoInsideJoinedWordsChangeTo.after.txt index d718102a5279..8638c0b0029d 100644 --- a/spellchecker/testData/inspection/quickfixes/typoInsideJoinedWordsChangeTo.after.txt +++ b/spellchecker/testData/inspection/quickfixes/typoInsideJoinedWordsChangeTo.after.txt @@ -1 +1 @@ -someTypoAndСorrectWords \ No newline at end of file +someTypoAndCorrectWords \ No newline at end of file diff --git a/spellchecker/xml/src/XmlSpellcheckingStrategy.java b/spellchecker/xml/src/XmlSpellcheckingStrategy.java index 912eb48bb139..61e44926aebe 100644 --- a/spellchecker/xml/src/XmlSpellcheckingStrategy.java +++ b/spellchecker/xml/src/XmlSpellcheckingStrategy.java @@ -4,6 +4,7 @@ package com.intellij.spellchecker.xml; import com.intellij.codeInspection.SuppressQuickFix; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.impl.source.tree.LeafPsiElement; @@ -94,6 +95,11 @@ public class XmlSpellcheckingStrategy extends SuppressibleSpellcheckingStrategy return file == null || file.getLanguage() instanceof TemplateLanguage; } + @Override + public boolean useTextLevelSpellchecking() { + return Registry.is("spellchecker.grazie.enabled"); + } + @Override protected boolean isLiteral(@NotNull PsiElement element) { return element instanceof XmlAttributeValue || element instanceof XmlText;