plugin: spell checker f0r 2025

This commit is contained in:
Sergey Chernov 2025-12-03 12:48:06 +01:00
parent 2e17297355
commit d285335e1c
5 changed files with 22 additions and 22 deletions

Binary file not shown.

Binary file not shown.

View File

@ -4,6 +4,7 @@ import lyng.io.fs
import lyng.stdlib
val files = Path("../..").list().toList()
// most long is longest?
val longestNameLength = files.maxOf { it.name.length }

View File

@ -129,22 +129,10 @@ class LyngGrazieAnnotator : ExternalAnnotator<LyngGrazieAnnotator.Input, LyngGra
}
log.info("LyngGrazieAnnotator.apply: used=${chosenEntry ?: "<none>"}, totalFindings=$totalReturned, painting=${findings.size}")
// Guarded fallback: if Grazie returned nothing but we clearly have fragments, try legacy spellchecker via reflection
if (findings.isEmpty() && fragments.isNotEmpty()) {
val added = fallbackWithLegacySpellcheckerIfAvailable(file, fragments, holder)
log.info("LyngGrazieAnnotator.apply: fallback painted=$added (0 means no legacy and heuristic may have painted separately)")
// Ensure at least one visible mark for diagnostics: paint a small WARNING at the first fragment range
try {
val first = fragments.first().second
val diagRange = TextRange(first.startOffset, (first.startOffset + 2).coerceAtMost(first.endOffset))
val ab = holder.newAnnotation(HighlightSeverity.INFORMATION, "[LyngSpell] active").range(diagRange)
applyTypoStyleIfRequested(file, ab)
ab.create()
log.info("LyngGrazieAnnotator.apply: painted diagnostic marker at ${diagRange.startOffset}..${diagRange.endOffset}")
} catch (_: Throwable) {
// ignore
}
}
// IMPORTANT: Do NOT fallback to the tiny bundled vocabulary on modern IDEs.
// If Grazie/Natural Languages processing returned nothing, we simply exit here
// to avoid low‑quality results from the legacy dictionary.
if (findings.isEmpty()) return
for (f in findings) {
val ab = holder.newAnnotation(HighlightSeverity.INFORMATION, f.message).range(f.range)

View File

@ -36,6 +36,8 @@ class LyngFormatterSettingsConfigurable(private val project: Project) : Configur
private var grazieIdsAsCommentsCb: JCheckBox? = null
private var grazieLiteralsAsCommentsCb: JCheckBox? = null
private var debugShowSpellFeedCb: JCheckBox? = null
private var showTyposGreenCb: JCheckBox? = null
private var offerQuickFixesCb: JCheckBox? = null
override fun getDisplayName(): String = "Lyng Formatter"
@ -53,6 +55,8 @@ class LyngFormatterSettingsConfigurable(private val project: Project) : Configur
grazieIdsAsCommentsCb = JCheckBox("Natural Languages/Grazie: treat identifiers as comments (forces spelling checks in 2024.3)")
grazieLiteralsAsCommentsCb = JCheckBox("Natural Languages/Grazie: treat string literals as comments when literals are not processed")
debugShowSpellFeedCb = JCheckBox("Debug: show spell-feed ranges (weak warnings)")
showTyposGreenCb = JCheckBox("Show Lyng typos with green underline (TYPO styling)")
offerQuickFixesCb = JCheckBox("Offer Lyng typo quick fixes (Replace…, Add to dictionary) without Spell Checker")
// Tooltips / short help
spacingCb?.toolTipText = "Applies minimal, safe spacing (e.g., around commas/operators, control-flow parens)."
@ -65,6 +69,8 @@ class LyngFormatterSettingsConfigurable(private val project: Project) : Configur
grazieIdsAsCommentsCb?.toolTipText = "Grazie-only fallback: route identifiers as COMMENTS domain so Grazie applies spelling in 2024.3."
grazieLiteralsAsCommentsCb?.toolTipText = "Grazie-only fallback: when Grammar doesn't process literals, route strings as COMMENTS so they are checked."
debugShowSpellFeedCb?.toolTipText = "Show the exact ranges we feed to spellcheckers (ids/comments/strings) as weak warnings."
showTyposGreenCb?.toolTipText = "Render Lyng typos using the platform's green TYPO underline instead of generic warnings."
offerQuickFixesCb?.toolTipText = "Provide lightweight Replace… and Add to dictionary quick-fixes without requiring the legacy Spell Checker."
p.add(spacingCb)
p.add(wrappingCb)
p.add(reindentClosedBlockCb)
@ -76,6 +82,8 @@ class LyngFormatterSettingsConfigurable(private val project: Project) : Configur
p.add(grazieIdsAsCommentsCb)
p.add(grazieLiteralsAsCommentsCb)
p.add(debugShowSpellFeedCb)
p.add(showTyposGreenCb)
p.add(offerQuickFixesCb)
panel = p
reset()
return p
@ -93,7 +101,9 @@ class LyngFormatterSettingsConfigurable(private val project: Project) : Configur
grazieChecksIdentifiersCb?.isSelected != s.grazieChecksIdentifiers ||
grazieIdsAsCommentsCb?.isSelected != s.grazieTreatIdentifiersAsComments ||
grazieLiteralsAsCommentsCb?.isSelected != s.grazieTreatLiteralsAsComments ||
debugShowSpellFeedCb?.isSelected != s.debugShowSpellFeed
debugShowSpellFeedCb?.isSelected != s.debugShowSpellFeed ||
showTyposGreenCb?.isSelected != s.showTyposWithGreenUnderline ||
offerQuickFixesCb?.isSelected != s.offerLyngTypoQuickFixes
}
override fun apply() {
@ -109,6 +119,8 @@ class LyngFormatterSettingsConfigurable(private val project: Project) : Configur
s.grazieTreatIdentifiersAsComments = grazieIdsAsCommentsCb?.isSelected == true
s.grazieTreatLiteralsAsComments = grazieLiteralsAsCommentsCb?.isSelected == true
s.debugShowSpellFeed = debugShowSpellFeedCb?.isSelected == true
s.showTyposWithGreenUnderline = showTyposGreenCb?.isSelected == true
s.offerLyngTypoQuickFixes = offerQuickFixesCb?.isSelected == true
}
override fun reset() {
@ -124,5 +136,7 @@ class LyngFormatterSettingsConfigurable(private val project: Project) : Configur
grazieIdsAsCommentsCb?.isSelected = s.grazieTreatIdentifiersAsComments
grazieLiteralsAsCommentsCb?.isSelected = s.grazieTreatLiteralsAsComments
debugShowSpellFeedCb?.isSelected = s.debugShowSpellFeed
showTyposGreenCb?.isSelected = s.showTyposWithGreenUnderline
offerQuickFixesCb?.isSelected = s.offerLyngTypoQuickFixes
}
}