Coder Social home page Coder Social logo

tanvd / grazi Goto Github PK

View Code? Open in Web Editor NEW
36.0 7.0 0.0 1.19 MB

Grammar checking and more for IntelliJ IDEA

License: Apache License 2.0

Kotlin 90.38% Java 1.81% HTML 0.76% JavaScript 1.93% Python 1.96% Rust 1.88% TeX 1.28%
intellij-plugin intellij-idea spellcheck grammar-checker natural-language proofreading intellij proofreader

grazi's Introduction

Grazie Icon Grazie

Grazie has moved into IntelliJ Sources

New repository is https://github.com/JetBrains/intellij-community/tree/master/plugins/grazie

JetBrains Plugin Downloads

Grazie is an IntelliJ IDEA plugin providing local spell and grammar checking for Markdown, JavaDoc, Plain texts, and others.

It uses one of the leading proofreaders - LanguageTool under the hood, so it supports over 15 languages and provides the best performance and accuracy among free (and even non-free) alternatives.

What's inside

Grazie consists of two parts - grammar checker, backed by LanguageTool, and spellchecker backed by LanguageTool dictionaries and IDEA built-in spellcheck. When it is sensible, Grazie will use full checking pipeline (proofreading and spellchecking), but in some cases (e.g., in code) it will use just spellcheck.

Right now Grazie supports following natural language sources:

  • Java code - string literals, javadocs and language constructs (methods names etc.)
  • Kotlin code - string literals, kdoc and language constructs
  • Python code - string literals (formatted and non-formatted), python docs and language constructs
  • JavaScript code - string literals, docs and language constructs
  • Rust code - string literals, docs and language constructs
  • Latex - (via TeXiFy IDEA plugin) text, spellcheck
  • Markdown - all the text (for code Grazie will use spellcheck only)
  • Plaintext - all the text if extension is .txt, otherwise Grazie will use spellcheck only
  • XML - all the text elements
  • JSON - string literals
  • Properties - string literals
  • Comments - any comments in almost any code
  • Commit messages - commits made via standard IDEA VCS support

As for languages, Grazie supports (including dialects):

  • English (British, American, Canadian)
  • Russian
  • Persian
  • French
  • German (Germany, Austrian)
  • Polish
  • Italian
  • Dutch
  • Portuguese (Brazilian, Portugal)
  • Chinese
  • Greek
  • Japanese
  • Romanian
  • Slovak
  • Spanish
  • Ukrainian

Moreover, Grazie supports native language based inspections. It means that if you specify your native language, Grazie will provide you with additional inspections for the language you are writing on.

Dev versions

You can subscribe to development channel of Grazie plugin to get the latest updates (may be a bit unstable) automatically.

Just add dev channel (https://plugins.jetbrains.com/plugins/dev/list) in accordance with documentation

Setup

For local development and testing Gradle is used:

  • Import project as a Gradle project with IntelliJ IDEA (version 2018.3.+)
  • Run runIde task to run IntelliJ IDEA Community (downloaded by Gradle) with installed Grazie plugin from current build

Special thanks

Special thanks goes to:

  • Alexandra Pavlova (aka sunalex) for our beautiful icon
  • Alexandr Sadovnikov and Nikita Sokolov as one of initial developers of plugin

grazi's People

Contributors

akhvorov avatar alexkanerus avatar fatalll avatar faucct avatar tanvd avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

grazi's Issues

Question: How to switch between languages?

How to switch between languages?

My use-case:

  • I use PyCharm professional (latest).
  • I have enabled two languages: English (GB) and Dutch.
  • Doc-strings in Python files are written in English. Some HTML templates are in Dutch. Markdown documentation is written in both.
  • I want to check spelling for my templates (Dutch). I only get English suggestions.

What I expect:

  • To be able to define per type of file which languages shall it be checked against.
  • To be able to define per file which languages shall it be checked against.

Thanks in advance!

Configuration of Rules

Right now rule can be disabled, but it is not possible to enable it back.
We need to implement this functionality

Support Latex

There is a great plugin for latex support in IntelliJ - TeXiFy IDEA.
Would it be hard to implement support for latex in Grazi?
For now, it's only working in comments.

Support XML

XML is widely used by technical writers (one of our key audiences). It looks like it will be not very hard to implement support of it.

Move to Kotlin DSL for UI

Right now we are using Swing XMLs to describe configuration menu of plugin. This is the only part of Java code in project.
We need to move to Kotlin DSL from XML.

Prepare bundled dictionary with IT terms

Grazi is proofreader for programmers, so we need to add bundled dictionary with common used IT terms (like names of languages, common terms ("artifact", "jar", "CI"), etc.)

Broken spellcheck for languages except English

After the last update to Version 2019.2-3 Grazi does not recognize German language and marks all correctly written words as wrong. It then suggests English words for correction instead of German. German language is enabled in the settings, tried with both versions (German and Austrian). Also tried on a new Phpstorm installation. OS is Windows 7.

Support Rust

Need to introduce support of Rust literals and documentation

Support Go

Need to introduce support of Go: comments, string literals, GoDoc

UI freezes forever on a very large text file (plugin doesn't call `checkCanceled`)

I tried to edit a very large text file and the UI frozen forever (at least I managed to brew tea and did not wait any longer). I took some thread dumps: jstack.zip. The most interesting part is here:

Stacktrace
"JobScheduler FJ pool 0/3" #47 daemon prio=4 os_prio=0 cpu=433843,28ms elapsed=589,45s tid=0x00007fcae8109000 nid=0x3658 runnable  [0x00007fcaddcd6000]
   java.lang.Thread.State: RUNNABLE
	at tanvd.grazi.utils.StringUtilsKt$splitWithRanges$1.invoke(StringUtils.kt:47)
	at tanvd.grazi.utils.StringUtilsKt$splitWithRanges$1.invoke(StringUtils.kt)
	at tanvd.grazi.utils.UtilsKt.buildList(Utils.kt:50)
	at tanvd.grazi.utils.StringUtilsKt.splitWithRanges(StringUtils.kt:34)
	at tanvd.grazi.utils.StringUtilsKt.splitWithRanges$default(StringUtils.kt:34)
	at tanvd.grazi.utils.StringUtilsKt.splitWithRanges(StringUtils.kt:31)
	at tanvd.grazi.utils.StringUtilsKt.splitWithRanges$default(StringUtils.kt:31)
	at tanvd.grazi.grammar.GrammarEngine$getFixes$1.invoke(GrammarEngine.kt:33)
	at tanvd.grazi.grammar.GrammarEngine$getFixes$1.invoke(GrammarEngine.kt:10)
	at tanvd.grazi.utils.UtilsKt.buildSet(Utils.kt:56)
	at tanvd.grazi.grammar.GrammarEngine.getFixes(GrammarEngine.kt:22)
	at tanvd.grazi.grammar.GrammarEngine.getFixes$default(GrammarEngine.kt:22)
	at tanvd.grazi.grammar.SanitizingGrammarChecker.check(SanitizingGrammarChecker.kt:65)
	at tanvd.grazi.grammar.SanitizingGrammarChecker.check$default(SanitizingGrammarChecker.kt:25)
	at tanvd.grazi.ide.language.plain.PlainTextSupport$check$1.invoke(PlainTextSupport.kt:17)
	at tanvd.grazi.ide.language.plain.PlainTextSupport$check$1.invoke(PlainTextSupport.kt:11)
	at tanvd.grazi.utils.UtilsKt.buildSet(Utils.kt:56)
	at tanvd.grazi.ide.language.plain.PlainTextSupport.check(PlainTextSupport.kt:16)
	at tanvd.grazi.ide.language.LanguageSupport.getFixes(LanguageSupport.kt:15)
	at tanvd.grazi.ide.GraziInspection.checkFile(GraziInspection.kt:50)
	at com.intellij.codeInspection.LocalInspectionTool$1.visitFile(LocalInspectionTool.java:142)
	at com.intellij.psi.PsiElementVisitor.visitPlainTextFile(PsiElementVisitor.java:42)
	at com.intellij.psi.impl.source.PsiPlainTextFileImpl.accept(PsiPlainTextFileImpl.java:36)
	at com.intellij.codeInspection.InspectionEngine.acceptElements(InspectionEngine.java:75)
	at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.lambda$null$8(LocalInspectionsPass.java:321)
	at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass$$Lambda$3420/0x0000000102ba7c40.run(Unknown Source)
	at com.intellij.util.AstLoadingFilter.lambda$toComputable$2(AstLoadingFilter.java:169)
	at com.intellij.util.AstLoadingFilter$$Lambda$1902/0x0000000101d7a840.compute(Unknown Source)
	at com.intellij.util.AstLoadingFilter.disallowTreeLoading(AstLoadingFilter.java:127)
	at com.intellij.util.AstLoadingFilter.disallowTreeLoading(AstLoadingFilter.java:116)
	at com.intellij.util.AstLoadingFilter.disallowTreeLoading(AstLoadingFilter.java:111)
	at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.lambda$visitRestElementsAndCleanup$9(LocalInspectionsPass.java:320)
	at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass$$Lambda$3419/0x0000000102ba7840.process(Unknown Source)
	at com.intellij.concurrency.ApplierCompleter.execAndForkSubTasks(ApplierCompleter.java:133)
	at com.intellij.concurrency.ApplierCompleter.tryToExecAllList(ApplierCompleter.java:231)
	at com.intellij.concurrency.ApplierCompleter.execAndForkSubTasks(ApplierCompleter.java:159)
	at com.intellij.concurrency.ApplierCompleter.tryToExecAllList(ApplierCompleter.java:231)
	at com.intellij.concurrency.ApplierCompleter.execAndForkSubTasks(ApplierCompleter.java:159)
	at com.intellij.concurrency.ApplierCompleter$$Lambda$3283/0x0000000102754840.run(Unknown Source)
	at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:1100)

This code holds the read lock, so when someone will try to acquire the write lock, UI will be frozen until the read lock will be released.
Consider using ProgressManager.checkCanceled() in loops more often. If the problem is in code that you doesn't control, consider using BombedCharSequence.

Fix tags in KDoc

Right now @param, @return and others considered as a part of sentence in KDoc. It should be ignored.

Separate languages from plugin

We can decrease total size of plugin moving additional languages (all except English) out of the plugin.
Instead of it we should provide user with possibility to Download additional languages from menu, like it is done in DataGrip with DB drivers.

How to compile this project?

I had submitted a bug and bug had been fixed. But I don't know how to build this project, because I am a Maven user. Is there any build instruction document or ready-made nightly build package?

Feature request: Enable/disable rules for specific file types

In Python this is totally valid:

def my_check_func(key, value):
    """Description for my check function.

    Performs the following checks:

    - Describe what the first check is about.
    - Describe what the second check is about. Perhaps some
      more description.
    - And so on.
    """
        # Do something

Grazi would complain about special characters at the end of paragraph. Although this would
be totally appropriate in .md or .rst (or any other text file), for code (.py) things are slightly different. Agree?

Thus, it would be really great to be able to say "ignore the rule for .py files" (or any other file type) option.

Take into account injected languages

Currently, the inspection doesn't take into account injected language into string literals. That leads to false positive warnings on some syntax constructions.
For example, .. is the special syntax for ranges in Rust language. And if you inject it into string literal and type .., the plugin produces Punctuation: Use of two consecutive dots or commas warning although everything is fine
image

No tokens for range in typo

I have encountered the following exception when I use the latest Grazi in Pycharm 2019.3. Under this circumstance, the syntax parser will stop working. Hoping to solve it as soon as possible, thanks a lot.

java.lang.IllegalStateException: No tokens for range in typo
	at com.intellij.grazie.grammar.GrammarChecker.findTokensInTypoPatternRange(GrammarChecker.kt:92)
	at com.intellij.grazie.grammar.GrammarChecker.check(GrammarChecker.kt:105)
	at com.intellij.grazie.grammar.GrammarChecker.check(GrammarChecker.kt:68)
	at com.intellij.grazie.ide.GrazieInspection$buildVisitor$1.visitElement(GrazieInspection.kt:38)
	at com.intellij.psi.impl.PsiElementBase.accept(PsiElementBase.java:274)
	at com.jetbrains.python.psi.impl.PyBaseElementImpl.accept(PyBaseElementImpl.java:75)
	at com.intellij.codeInspection.InspectionEngine.acceptElements(InspectionEngine.java:77)
	at com.intellij.codeInspection.InspectionEngine.createVisitorAndAcceptElements(InspectionEngine.java:64)
	at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.runToolOnElements(LocalInspectionsPass.java:306)
	at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.lambda$null$3(LocalInspectionsPass.java:274)
	at com.intellij.util.AstLoadingFilter.forceAllowTreeLoading(AstLoadingFilter.java:154)
	at com.intellij.util.AstLoadingFilter.forceAllowTreeLoading(AstLoadingFilter.java:146)
	at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.lambda$null$4(LocalInspectionsPass.java:271)
	at com.intellij.util.AstLoadingFilter.disallowTreeLoading(AstLoadingFilter.java:125)
	at com.intellij.util.AstLoadingFilter.disallowTreeLoading(AstLoadingFilter.java:114)
	at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.lambda$visitPriorityElementsAndInit$5(LocalInspectionsPass.java:271)
	at com.intellij.concurrency.ApplierCompleter.execAndForkSubTasks(ApplierCompleter.java:148)
	at com.intellij.concurrency.ApplierCompleter.tryToExecAllList(ApplierCompleter.java:227)
	at com.intellij.concurrency.ApplierCompleter.execAndForkSubTasks(ApplierCompleter.java:155)
	at com.intellij.concurrency.ApplierCompleter.tryToExecAllList(ApplierCompleter.java:227)
	at com.intellij.concurrency.ApplierCompleter.execAndForkSubTasks(ApplierCompleter.java:155)
	at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:997)
	at com.intellij.concurrency.ApplierCompleter.lambda$wrapInReadActionAndIndicator$1(ApplierCompleter.java:105)
	at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:585)
	at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:531)
	at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:59)
	at com.intellij.concurrency.ApplierCompleter.wrapInReadActionAndIndicator(ApplierCompleter.java:116)
	at com.intellij.concurrency.ApplierCompleter.lambda$compute$0(ApplierCompleter.java:96)
	at com.intellij.openapi.application.impl.ReadMostlyRWLock.executeByImpatientReader(ReadMostlyRWLock.java:167)
	at com.intellij.openapi.application.impl.ApplicationImpl.executeByImpatientReader(ApplicationImpl.java:157)
	at com.intellij.concurrency.ApplierCompleter.compute(ApplierCompleter.java:96)
	at java.base/java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:746)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
	at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
	at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
	at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
	at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)

Long read actions cause UI freezes

It looks like this: a UI thread wants to perform a modification, but can't acquire the write lock because a background thread is performing some long activity under a read lock.

"AWT-EventQueue-0 2019.3#IU-193.SNAPSHOT IDEA, eap:true, os:Linux 5.0.0-16-generic, java-version:JetBrains s.r.o 11.0.3+12-b304.2 2019.3#IU-193.SNAPSHOT IDEA, eap:true, os:Linux 5.0.0-16-generic, java-version:JetBrains s.r.o 11.0.3+12-b304.2" prio=0 tid=0x0 nid=0x0 waiting on condition
     java.lang.Thread.State: TIMED_WAITING
 on com.intellij.openapi.application.impl.ReadMostlyRWLock@6a13e25c
	at [email protected]/jdk.internal.misc.Unsafe.park(Native Method)
	at [email protected]/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:234)
	at com.intellij.openapi.application.impl.ReadMostlyRWLock.writeLock(ReadMostlyRWLock.java:216)
	at com.intellij.openapi.application.impl.ApplicationImpl.startWrite(ApplicationImpl.java:1170)
	at com.intellij.openapi.application.impl.ApplicationImpl.runWriteAction(ApplicationImpl.java:994)
	at com.intellij.codeInsight.actions.MultiCaretCodeInsightAction.lambda$actionPerformedImpl$1(MultiCaretCodeInsightAction.java:50)
	at com.intellij.codeInsight.actions.MultiCaretCodeInsightAction$$Lambda$7733/0x0000000101f84c40.run(Unknown Source)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:220)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:178)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:168)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:154)
	at com.intellij.codeInsight.actions.MultiCaretCodeInsightAction.actionPerformedImpl(MultiCaretCodeInsightAction.java:50)
	at com.intellij.codeInsight.actions.MultiCaretCodeInsightAction.actionPerformed(MultiCaretCodeInsightAction.java:46)
	at com.intellij.openapi.actionSystem.ex.ActionUtil$1.run(ActionUtil.java:265)
	at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAware(ActionUtil.java:282)
	at com.intellij.openapi.keymap.impl.IdeKeyEventDispatcher$1.performAction(IdeKeyEventDispatcher.java:590)
	at com.intellij.openapi.keymap.impl.IdeKeyEventDispatcher.lambda$processAction$3(IdeKeyEventDispatcher.java:643)
	at com.intellij.openapi.keymap.impl.IdeKeyEventDispatcher$$Lambda$4092/0x0000000102d2f040.run(Unknown Source)
	at com.intellij.openapi.application.TransactionGuardImpl.performUserActivity(TransactionGuardImpl.java:192)
	at com.intellij.openapi.keymap.impl.IdeKeyEventDispatcher.processAction(IdeKeyEventDispatcher.java:642)
	at com.intellij.openapi.keymap.impl.IdeKeyEventDispatcher.processActionOrWaitSecondStroke(IdeKeyEventDispatcher.java:508)
	at com.intellij.openapi.keymap.impl.IdeKeyEventDispatcher.inInitState(IdeKeyEventDispatcher.java:463)
	at com.intellij.openapi.keymap.impl.IdeKeyEventDispatcher.dispatchKeyEvent(IdeKeyEventDispatcher.java:212)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:705)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:396)
	at com.intellij.ide.IdeEventQueue$$Lambda$813/0x0000000100dbdc40.compute(Unknown Source)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:704)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:395)
	at [email protected]/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at [email protected]/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at [email protected]/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at [email protected]/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at [email protected]/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at [email protected]/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

"JobScheduler FJ pool 1/7" prio=0 tid=0x0 nid=0x0 runnable
     java.lang.Thread.State: RUNNABLE

	at [email protected]/java.lang.Class.getSuperclass(Native Method)
	at [email protected]/java.util.EnumMap.isValidKey(EnumMap.java:316)
	at [email protected]/java.util.EnumMap.get(EnumMap.java:243)
	at morfologik.stemming.DictionaryMetadata.isConvertingCase(DictionaryMetadata.java:138)
	at morfologik.speller.Speller.areEqual(Speller.java:601)
	at morfologik.speller.Speller.ed(Speller.java:562)
	at morfologik.speller.Speller.cuted(Speller.java:635)
	at morfologik.speller.Speller.findRepl(Speller.java:517)
	at morfologik.speller.Speller.findRepl(Speller.java:523)
	at morfologik.speller.Speller.findRepl(Speller.java:523)
	at morfologik.speller.Speller.findRepl(Speller.java:523)
	at morfologik.speller.Speller.findRepl(Speller.java:523)
	at morfologik.speller.Speller.findReplacementCandidates(Speller.java:430)
	at morfologik.speller.Speller.findReplacements(Speller.java:357)
	at org.languagetool.rules.spelling.morfologik.MorfologikSpeller.getSuggestions(MorfologikSpeller.java:103)
	at org.languagetool.rules.spelling.morfologik.MorfologikMultiSpeller.getSuggestionsFromSpellers(MorfologikMultiSpeller.java:212)
	at org.languagetool.rules.spelling.morfologik.MorfologikMultiSpeller.getSuggestionsFromDefaultDicts(MorfologikMultiSpeller.java:246)
	at org.languagetool.rules.spelling.morfologik.MorfologikSpellerRule.getRuleMatches(MorfologikSpellerRule.java:243)
	at org.languagetool.rules.en.AbstractEnglishSpellerRule.getRuleMatches(AbstractEnglishSpellerRule.java:99)
	at org.languagetool.rules.spelling.morfologik.MorfologikSpellerRule.match(MorfologikSpellerRule.java:146)
	at org.languagetool.JLanguageTool.checkAnalyzedSentence(JLanguageTool.java:814)
	at org.languagetool.JLanguageTool$TextCheckCallable.getOtherRuleMatches(JLanguageTool.java:1255)
	at org.languagetool.JLanguageTool$TextCheckCallable.call(JLanguageTool.java:1189)
	at org.languagetool.JLanguageTool$TextCheckCallable.call(JLanguageTool.java:1152)
	at org.languagetool.JLanguageTool.performCheck(JLanguageTool.java:782)
	at org.languagetool.JLanguageTool.check(JLanguageTool.java:726)
	at org.languagetool.JLanguageTool.check(JLanguageTool.java:702)
	at org.languagetool.JLanguageTool.check(JLanguageTool.java:693)
	at org.languagetool.JLanguageTool.check(JLanguageTool.java:652)
	at org.languagetool.JLanguageTool.check(JLanguageTool.java:636)
	at tanvd.grazi.grammar.GrammarEngine$getFixesSmall$1$allFixes$1.invoke(GrammarEngine.kt:50)
	at tanvd.grazi.grammar.GrammarEngine$getFixesSmall$1$allFixes$1.invoke(GrammarEngine.kt:10)
	at tanvd.grazi.utils.UtilsKt.tryRun(Utils.kt:14)
	at tanvd.grazi.grammar.GrammarEngine$getFixesSmall$1.invoke(GrammarEngine.kt:50)
	at tanvd.grazi.grammar.GrammarEngine$getFixesSmall$1.invoke(GrammarEngine.kt:10)
	at tanvd.grazi.utils.UtilsKt.buildSet(Utils.kt:56)
	at tanvd.grazi.grammar.GrammarEngine.getFixesSmall(GrammarEngine.kt:45)
	at tanvd.grazi.grammar.GrammarEngine.access$getFixesSmall(GrammarEngine.kt:10)
	at tanvd.grazi.grammar.GrammarEngine$getFixes$1.invoke(GrammarEngine.kt:37)
	at tanvd.grazi.grammar.GrammarEngine$getFixes$1.invoke(GrammarEngine.kt:10)
	at tanvd.grazi.utils.UtilsKt.buildSet(Utils.kt:56)
	at tanvd.grazi.grammar.GrammarEngine.getFixes(GrammarEngine.kt:22)
	at tanvd.grazi.grammar.GrammarEngine.getFixes$default(GrammarEngine.kt:22)
	at tanvd.grazi.grammar.SanitizingGrammarChecker.check(SanitizingGrammarChecker.kt:65)
	at tanvd.grazi.grammar.SanitizingGrammarChecker.check$default(SanitizingGrammarChecker.kt:25)
	at tanvd.grazi.grammar.SanitizingGrammarChecker.check(SanitizingGrammarChecker.kt:23)
	at tanvd.grazi.grammar.SanitizingGrammarChecker.check$default(SanitizingGrammarChecker.kt:23)
	at tanvd.grazi.ide.language.CommentsSupport$check$1.invoke(CommentsSupport.kt:19)
	at tanvd.grazi.ide.language.CommentsSupport$check$1.invoke(CommentsSupport.kt:12)
	at tanvd.grazi.utils.UtilsKt.buildSet(Utils.kt:56)
	at tanvd.grazi.ide.language.CommentsSupport.check(CommentsSupport.kt:17)
	at tanvd.grazi.ide.language.LanguageSupport.getFixes(LanguageSupport.kt:15)
	at tanvd.grazi.ide.GraziInspection.checkFile(GraziInspection.kt:50)
	at com.intellij.codeInspection.LocalInspectionTool$1.visitFile(LocalInspectionTool.java:142)
	at org.jetbrains.kotlin.psi.KtFile.accept(KtFile.kt:227)
	at com.intellij.codeInspection.InspectionEngine.acceptElements(InspectionEngine.java:75)
	at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.lambda$null$8(LocalInspectionsPass.java:321)
	at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass$$Lambda$3847/0x0000000102b54840.run(Unknown Source)
	at com.intellij.util.AstLoadingFilter.lambda$toComputable$2(AstLoadingFilter.java:169)
	at com.intellij.util.AstLoadingFilter$$Lambda$3504/0x0000000102676440.compute(Unknown Source)
	at com.intellij.util.AstLoadingFilter.disallowTreeLoading(AstLoadingFilter.java:127)
	at com.intellij.util.AstLoadingFilter.disallowTreeLoading(AstLoadingFilter.java:116)
	at com.intellij.util.AstLoadingFilter.disallowTreeLoading(AstLoadingFilter.java:111)
	at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.lambda$visitRestElementsAndCleanup$9(LocalInspectionsPass.java:320)
	at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass$$Lambda$3846/0x0000000102b55440.process(Unknown Source)
	at com.intellij.concurrency.ApplierCompleter.execAndForkSubTasks(ApplierCompleter.java:133)
	at com.intellij.concurrency.ApplierCompleter.tryToExecAllList(ApplierCompleter.java:231)
	at com.intellij.concurrency.ApplierCompleter.execAndForkSubTasks(ApplierCompleter.java:159)
	at com.intellij.concurrency.ApplierCompleter.tryToExecAllList(ApplierCompleter.java:231)
	at com.intellij.concurrency.ApplierCompleter.execAndForkSubTasks(ApplierCompleter.java:159)
	at com.intellij.concurrency.ApplierCompleter$$Lambda$3429/0x0000000102616040.run(Unknown Source)
	at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:1103)
	at com.intellij.concurrency.ApplierCompleter.lambda$wrapInReadActionAndIndicator$1(ApplierCompleter.java:105)
	at com.intellij.concurrency.ApplierCompleter$$Lambda$3431/0x0000000102615840.run(Unknown Source)
	at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:591)
	at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:537)
	at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:59)
	at com.intellij.concurrency.ApplierCompleter.wrapInReadActionAndIndicator(ApplierCompleter.java:116)
	at com.intellij.concurrency.ApplierCompleter.lambda$compute$0(ApplierCompleter.java:96)
	at com.intellij.concurrency.ApplierCompleter$$Lambda$3428/0x0000000102616c40.run(Unknown Source)
	at com.intellij.openapi.application.impl.ReadMostlyRWLock.executeByImpatientReader(ReadMostlyRWLock.java:164)
	at com.intellij.openapi.application.impl.ApplicationImpl.executeByImpatientReader(ApplicationImpl.java:207)
	at com.intellij.concurrency.ApplierCompleter.compute(ApplierCompleter.java:96)
	at [email protected]/java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:746)
	at [email protected]/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
	at [email protected]/java.util.concurrent.ForkJoinPool$WorkQueue.helpCC(ForkJoinPool.java:1115)
	at [email protected]/java.util.concurrent.ForkJoinPool.awaitJoin(ForkJoinPool.java:1687)
	at [email protected]/java.util.concurrent.ForkJoinTask.get(ForkJoinTask.java:1039)
	at com.intellij.concurrency.JobLauncherImpl.invokeConcurrentlyUnderProgress(JobLauncherImpl.java:58)
	at com.intellij.concurrency.JobLauncher.invokeConcurrentlyUnderProgress(JobLauncher.java:58)
	at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.visitRestElementsAndCleanup(LocalInspectionsPass.java:333)
	at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.inspect(LocalInspectionsPass.java:203)
	at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.collectInformationWithProgress(LocalInspectionsPass.java:119)
	at com.intellij.codeInsight.daemon.impl.ProgressableTextEditorHighlightingPass.doCollectInformation(ProgressableTextEditorHighlightingPass.java:84)
	at com.intellij.codeHighlighting.TextEditorHighlightingPass.collectInformation(TextEditorHighlightingPass.java:55)
	at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.lambda$null$1(PassExecutorService.java:429)
	at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass$$Lambda$3004/0x000000010233a040.run(Unknown Source)
	at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:1108)
	at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.lambda$doRun$2(PassExecutorService.java:422)
	at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass$$Lambda$2996/0x000000010233c040.run(Unknown Source)
	at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:591)
	at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:537)
	at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:59)
	at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.doRun(PassExecutorService.java:421)
	at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.lambda$run$0(PassExecutorService.java:397)
	at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass$$Lambda$2994/0x000000010233c840.run(Unknown Source)
	at com.intellij.openapi.application.impl.ReadMostlyRWLock.executeByImpatientReader(ReadMostlyRWLock.java:164)
	at com.intellij.openapi.application.impl.ApplicationImpl.executeByImpatientReader(ApplicationImpl.java:207)
	at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.run(PassExecutorService.java:395)
	at com.intellij.concurrency.JobLauncherImpl$VoidForkJoinTask$1.exec(JobLauncherImpl.java:161)
	at [email protected]/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
	at [email protected]/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
	at [email protected]/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
	at [email protected]/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
	at [email protected]/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)

Support commit messages

Commit messages (written with default IDEA git plugin) should be supported (as IDEA typo checker do)

Support C/C++

Spell checking and grammar in C/C++ comments is not fully supported (seems to be only supported for English, not for other languages):

image

CLion 2019.2 Build #CL-192.5728.100 July 23, 2019
Grazi (2019.2-4.stable)

Suppress mistakes surrounding unsupported tokens

There are a lot of situations when we have sentences including some non-natural language parts (for example: You can take a look at class grazi.class). We should suppress errors surrounding those parts, cause we cannot deduce what is the real mistakes, and what is not.

[Rust] Readability: paragraph over 80 words

The Readability: paragraph over 80 words is always triggered inside a rust-doc comment as soon as the comment has more than 80 words, regardless of the amounts of empty lines between between the paragraphs inside the comment.

Example

/// Do something useful.
/// 
/// This must not be called if you want to ensure that the program itself
/// doesn't do something useful. In case you still feel like calling the
/// function, we wish you best luck but please ensure to encapsulate the
/// call with at least 5 empty lines in front and afterwards.
/// 
/// # Example
/// 
/// ```no_run
/// let _ = my_cool_function();
/// ```
/// 
/// # Safety
/// 
/// This function is going to trigger undefined behavior in any case, but hey
/// we don't care.

It seems like the leading /// prefix is recognized as part of the content and therefore prevents the Grazi to recognize the paragraph split.

Implement update information banner

We implement a lot of updates, which may require users attention (like adding spellchecking, which should be enabled). So we need to notify user about updates with popup.

Support Python

Need to support: Python literal strings, Python docs, Python constructs spellcheck (analogue with kotlin/java support)

Use CloudConfig to syncronize user dictionaries

JetBrains provides a shared settings service, which is capable of synchronizing settings of plugins between different installations of IDE.
We can use it to synchronize not only Grazi settings, but also user dictionary.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.