[intellij-sh] Fix typo in quick fix statistic
[idea/community.git] / plugins / sh / src / com / intellij / sh / shellcheck / QuickFixIntention.java
1 // 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.
2 package com.intellij.sh.shellcheck;
3
4 import com.intellij.codeInsight.intention.IntentionAction;
5 import com.intellij.openapi.editor.Document;
6 import com.intellij.openapi.editor.Editor;
7 import com.intellij.openapi.project.Project;
8 import com.intellij.psi.PsiFile;
9 import com.intellij.sh.statistics.ShFeatureUsagesCollector;
10 import com.intellij.util.IncorrectOperationException;
11 import org.jetbrains.annotations.NotNull;
12
13 import java.util.Comparator;
14 import java.util.stream.Stream;
15
16 public class QuickFixIntention implements IntentionAction {
17   private static final String FEATURE_ACTION_ID = "QuickFixUsed";
18   private final ShShellcheckExternalAnnotator.Fix fix;
19   private final long timestamp;
20   private final String message;
21
22   public QuickFixIntention(String message, ShShellcheckExternalAnnotator.Fix fix, long timestamp) {
23     this.timestamp = timestamp;
24     this.message = message;
25     this.fix = fix;
26   }
27
28   @NotNull
29   @Override
30   public String getFamilyName() {
31     return "Shell script";
32   }
33
34   @Override
35   public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) {
36     return timestamp == file.getModificationStamp();
37   }
38
39   @Override
40   public boolean startInWriteAction() {
41     return true;
42   }
43
44   @NotNull
45   @Override
46   public String getText() {
47     return message;
48   }
49
50   @Override
51   public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException {
52     class Replacement {
53       final String replacement;
54       final int startOffset;
55       final int endOffset;
56
57       Replacement(int startOffset, int endOffset, String replacement) {
58         this.replacement = replacement;
59         this.startOffset = startOffset;
60         this.endOffset = endOffset;
61       }
62     }
63     Document document = editor.getDocument();
64     Stream.of(fix.replacements)
65       .map(it -> {
66         int startOffset = calcOffset(document, it.line, it.column);
67         int endOffset = calcOffset(document, it.endLine, it.endColumn);
68         return new Replacement(startOffset, endOffset, it.replacement);
69       })
70       // applying replacements from right to left not to break offsets in document
71       .sorted(Comparator.comparingInt(it -> -it.endOffset))
72       .forEach(it -> document.replaceString(it.startOffset, it.endOffset, it.replacement));
73     ShFeatureUsagesCollector.logFeatureUsage(FEATURE_ACTION_ID);
74   }
75
76   private static int calcOffset(Document document, int line, int column) {
77     return ShShellcheckUtil.calcOffset(document.getCharsSequence(),
78                                        document.getLineStartOffset(line - 1),
79                                        column);
80   }
81 }