From 2f8a4728f5aa61423a6bc7e902c3ded6db909d0b Mon Sep 17 00:00:00 2001
From: Tymko Oleg <olegtymko@yandex.ru>
Date: Tue, 16 Feb 2021 00:48:16 +0700
Subject: [PATCH 1/2] =?UTF-8?q?feat:=20#123=20=D0=98=D0=B7=D0=BC=D0=B5?=
 =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B0=D0=BB=D0=B3=D0=BE=D1=80?=
 =?UTF-8?q?=D0=B8=D1=82=D0=BC=D0=B0=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B?=
 =?UTF-8?q?=20=D0=B2=D1=8B=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20?=
 =?UTF-8?q?=D1=82=D0=B5=D0=BA=D1=81=D1=82=D0=B0=20=D0=BF=D1=80=D0=B8=20?=
 =?UTF-8?q?=D0=B0=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7=D0=B5.=20=D0=A2=D0=B5?=
 =?UTF-8?q?=D0=BF=D0=B5=D1=80=D1=8C=20=D0=B0=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7?=
 =?UTF-8?q?=D0=B8=D1=80=D1=83=D0=B5=D1=82=D1=81=D1=8F=20=D0=B2=D0=B5=D1=81?=
 =?UTF-8?q?=D1=8C=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C.=20=D0=9F=D1=80?=
 =?UTF-8?q?=D0=B8=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=D0=B5=20=D0=BD=D0=B0=20?=
 =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BC=D1=83=20issues=20-=20=D1=80=D0=B0?=
 =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82=20=D1=84=D0=B8=D0=BB=D1=8C?=
 =?UTF-8?q?=D1=82=D1=80=20=D0=BF=D0=BE=20=D0=B2=D1=8B=D0=B4=D0=B5=D0=BB?=
 =?UTF-8?q?=D0=B5=D0=BD=D0=BD=D1=8B=D0=BC=20=D1=81=D1=82=D1=80=D0=BE=D0=BA?=
 =?UTF-8?q?=D0=B0=D0=BC.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../github/otymko/phoenixbsl/gui/MainGUI.java |  1 -
 .../phoenixbsl/gui/stage/IssuesStage.java     | 47 +++++++++----------
 .../otymko/phoenixbsl/logic/PhoenixAPI.java   | 16 +++----
 .../logic/designer/DesignerTextEditor.java    | 18 +++----
 .../phoenixbsl/logic/text/Constant.java       |  9 ++++
 .../phoenixbsl/logic/text/Location.java       | 17 +++++++
 .../phoenixbsl/logic/text/SourceText.java     | 11 +++++
 .../phoenixbsl/logic/utils/IssueHelper.java   | 34 ++++++++++++++
 .../phoenixbsl/logic/utils/TextUtil.java      | 17 +++++++
 9 files changed, 128 insertions(+), 42 deletions(-)
 create mode 100644 src/main/java/com/github/otymko/phoenixbsl/logic/text/Constant.java
 create mode 100644 src/main/java/com/github/otymko/phoenixbsl/logic/text/Location.java
 create mode 100644 src/main/java/com/github/otymko/phoenixbsl/logic/text/SourceText.java
 create mode 100644 src/main/java/com/github/otymko/phoenixbsl/logic/utils/IssueHelper.java
 create mode 100644 src/main/java/com/github/otymko/phoenixbsl/logic/utils/TextUtil.java

diff --git a/src/main/java/com/github/otymko/phoenixbsl/gui/MainGUI.java b/src/main/java/com/github/otymko/phoenixbsl/gui/MainGUI.java
index 3cdae10..6ca0858 100644
--- a/src/main/java/com/github/otymko/phoenixbsl/gui/MainGUI.java
+++ b/src/main/java/com/github/otymko/phoenixbsl/gui/MainGUI.java
@@ -41,7 +41,6 @@ public void showIssuesStage() {
 
   @Override
   public void updateIssues(List<Diagnostic> diagnostics) {
-    issuesStage.lineOffset = PhoenixCore.getInstance().getTextEditor().getCurrentOffset();
     showIssuesStageImpl();
     Platform.runLater(() -> issuesStage.updateIssues(diagnostics));
   }
diff --git a/src/main/java/com/github/otymko/phoenixbsl/gui/stage/IssuesStage.java b/src/main/java/com/github/otymko/phoenixbsl/gui/stage/IssuesStage.java
index cbdc60c..5aef095 100644
--- a/src/main/java/com/github/otymko/phoenixbsl/gui/stage/IssuesStage.java
+++ b/src/main/java/com/github/otymko/phoenixbsl/gui/stage/IssuesStage.java
@@ -3,6 +3,7 @@
 import com.github.otymko.phoenixbsl.PhoenixCore;
 import com.github.otymko.phoenixbsl.gui.controller.IssueStageController;
 import com.github.otymko.phoenixbsl.logic.PhoenixAPI;
+import com.github.otymko.phoenixbsl.logic.utils.IssueHelper;
 import com.github.otymko.phoenixbsl.model.Issue;
 import com.github.otymko.phoenixbsl.model.ProjectSetting;
 import com.jfoenix.assets.JFoenixResources;
@@ -59,8 +60,6 @@ public class IssuesStage extends Stage {
   private final ComboBox<ProjectSetting> project;
   private final TextField search;
 
-  public int lineOffset = 0;
-
   private int countError = 0;
   private int countWarning = 0;
   private int countInfo = 0;
@@ -203,33 +202,21 @@ public IssuesStage(Stage ownerStage) {
   }
 
   public void updateIssues(List<Diagnostic> diagnostics) {
+    var textEditor = PhoenixCore.getInstance().getTextEditor();
+    var selection = textEditor.getSelection();
+
     countError = 0;
     countWarning = 0;
     countInfo = 0;
-
     issues.clear();
-    diagnostics.forEach(diagnostic -> {
-      var range = diagnostic.getRange();
-      var position = range.getStart();
-      var startLine = position.getLine() + 1 + lineOffset;
-
-      Issue issue = new Issue();
-
-      issue.setSource(PhoenixAPI.getValueSourceByString(diagnostic.getSource()));
-      issue.setDescription(diagnostic.getMessage());
-      issue.setStartLine(startLine);
-      issue.setLocation(String.valueOf(startLine));
-      issue.setSeverity(diagnostic.getSeverity());
-      issues.add(issue);
-
-      if (diagnostic.getSeverity() == DiagnosticSeverity.Error) {
-        countError++;
-      } else if (diagnostic.getSeverity() == DiagnosticSeverity.Warning) {
-        countWarning++;
-      } else {
-        countInfo++;
-      }
-    });
+
+    diagnostics.stream()
+      .filter(diagnostic -> IssueHelper.checkDiagnosticBySelection(diagnostic, selection))
+      .forEach(diagnostic -> {
+        var issue = IssueHelper.createIssue(diagnostic);
+        issues.add(issue);
+        calcCounters(diagnostic);
+      });
 
     FXCollections.sort(issues, Comparator.comparingInt(Issue::getStartLine));
     updateIndicators();
@@ -255,6 +242,16 @@ private void updateIndicators() {
     labelInfo.setText("Инфо: " + countInfo);
   }
 
+  private void calcCounters(Diagnostic diagnostic) {
+    if (diagnostic.getSeverity() == DiagnosticSeverity.Error) {
+      countError++;
+    } else if (diagnostic.getSeverity() == DiagnosticSeverity.Warning) {
+      countWarning++;
+    } else {
+      countInfo++;
+    }
+  }
+
   private static Map<DiagnosticSeverity, String> createSeverityToStringMap() {
     Map<DiagnosticSeverity, String> map = new EnumMap<>(DiagnosticSeverity.class);
     map.put(DiagnosticSeverity.Error, "Ошибка");
diff --git a/src/main/java/com/github/otymko/phoenixbsl/logic/PhoenixAPI.java b/src/main/java/com/github/otymko/phoenixbsl/logic/PhoenixAPI.java
index d852b24..948097a 100644
--- a/src/main/java/com/github/otymko/phoenixbsl/logic/PhoenixAPI.java
+++ b/src/main/java/com/github/otymko/phoenixbsl/logic/PhoenixAPI.java
@@ -1,7 +1,9 @@
 package com.github.otymko.phoenixbsl.logic;
 
+import com.github.otymko.phoenixbsl.logic.text.SourceText;
 import com.github.otymko.phoenixbsl.logic.designer.DesignerTextEditor;
 import com.github.otymko.phoenixbsl.logic.service.SonarLintService;
+import com.github.otymko.phoenixbsl.logic.text.Constant;
 import com.sun.jna.platform.win32.WinDef;
 import lombok.experimental.UtilityClass;
 import lombok.extern.slf4j.Slf4j;
@@ -19,7 +21,6 @@
 @Slf4j
 @UtilityClass
 public class PhoenixAPI {
-  private final String FUN_SYMBOL = "☻"; // 9787
   private final CustomRobot robot = new CustomRobot();
   private final CustomTextTransfer textTransfer = new CustomTextTransfer();
 
@@ -66,23 +67,22 @@ public void goToLineOnForm(int line) {
     robot.pressKey(KeyEvent.VK_ENTER);
   }
 
-  public int getCurrentLineNumber() {
-
+  public SourceText getSourceText() {
     var line = 0;
     robot.Alt(KeyEvent.VK_NUMPAD2);
     var textAll = getTextAll();
     robot.Ctrl(KeyEvent.VK_Z);
-    String[] arrStr = textAll.split("\n");
+    String[] arrStr = textAll.split(Constant.SEPARATOR);
     var count = 0;
     for (var element : arrStr) {
       count++;
-      if (element.contains(FUN_SYMBOL)) {
+      if (element.contains(Constant.FUN_SYMBOL)) {
         line = count - 1;
         break;
       }
     }
     LOGGER.debug("Current line offset: " + line);
-    return line;
+    return new SourceText(textAll, line);
   }
 
   public String getTextAll() {
@@ -122,14 +122,14 @@ public void showMessageDialog(String message) {
   }
 
   public String applyFixForText(String textForQF, List<Either<Command, CodeAction>> codeActions) {
-    var strings = textForQF.split(DesignerTextEditor.SEPARATOR);
+    var strings = textForQF.split(Constant.SEPARATOR);
     try {
       applyAllQuickFixes(codeActions, strings);
     } catch (ArrayIndexOutOfBoundsException e) {
       LOGGER.error("При применении fix all к тексту модуля возникли ошибки", e);
       return null;
     }
-    return String.join(DesignerTextEditor.SEPARATOR, strings);
+    return String.join(Constant.SEPARATOR, strings);
   }
 
   public void clearListBySource(List<Diagnostic> diagnostics, String source) {
diff --git a/src/main/java/com/github/otymko/phoenixbsl/logic/designer/DesignerTextEditor.java b/src/main/java/com/github/otymko/phoenixbsl/logic/designer/DesignerTextEditor.java
index 339014a..bee7548 100644
--- a/src/main/java/com/github/otymko/phoenixbsl/logic/designer/DesignerTextEditor.java
+++ b/src/main/java/com/github/otymko/phoenixbsl/logic/designer/DesignerTextEditor.java
@@ -5,6 +5,8 @@
 import com.github.otymko.phoenixbsl.logic.PhoenixUser32;
 import com.github.otymko.phoenixbsl.logic.event.EventListener;
 import com.github.otymko.phoenixbsl.logic.event.EventManager;
+import com.github.otymko.phoenixbsl.logic.text.Location;
+import com.github.otymko.phoenixbsl.logic.utils.TextUtil;
 import com.sun.jna.platform.win32.WinDef;
 import lombok.Getter;
 import lombok.Setter;
@@ -23,7 +25,6 @@
 public class DesignerTextEditor implements EventListener {
   public static final List<String> DIAGNOSTIC_FOR_QF = createDiagnosticListForQuickFix();
   public static final List<String> FILTER_ACTION_QUICKFIX = createListFilterActionQuickFix();
-  public static final String SEPARATOR = "\n";
   private final PhoenixCore core;
   @Getter
   @Setter
@@ -37,7 +38,7 @@ public class DesignerTextEditor implements EventListener {
   private final List<Diagnostic> diagnostics = Collections.synchronizedList(new ArrayList<>());
   @Getter
   @Setter
-  private int currentOffset = 0;
+  private Location selection = Location.empty();
 
   public DesignerTextEditor(PhoenixCore core) {
     this.core = core;
@@ -124,16 +125,17 @@ public void updateFocusForm() {
   }
 
   private String getTextFormDesigner() {
-    setCurrentOffset(0);
-    var textForCheck = "";
     var textModuleSelected = PhoenixAPI.getTextSelected();
+    var sourceText = PhoenixAPI.getSourceText();
+    var textForCheck = sourceText.getContent();
+
     if (textModuleSelected.length() > 0) {
-      // получем номер строки
-      textForCheck = textModuleSelected;
-      setCurrentOffset(PhoenixAPI.getCurrentLineNumber());
+      setSelection(new Location(sourceText.getOffset() + 1,
+        sourceText.getOffset() + TextUtil.numberOfLinesInText(textModuleSelected)));
     } else {
-      textForCheck = PhoenixAPI.getTextAll();
+      setSelection(Location.empty());
     }
+    textForCheck = TextUtil.pasteSelectionInText(textForCheck, textModuleSelected);
     return textForCheck;
   }
 
diff --git a/src/main/java/com/github/otymko/phoenixbsl/logic/text/Constant.java b/src/main/java/com/github/otymko/phoenixbsl/logic/text/Constant.java
new file mode 100644
index 0000000..54ca42b
--- /dev/null
+++ b/src/main/java/com/github/otymko/phoenixbsl/logic/text/Constant.java
@@ -0,0 +1,9 @@
+package com.github.otymko.phoenixbsl.logic.text;
+
+import lombok.experimental.UtilityClass;
+
+@UtilityClass
+public class Constant {
+  public final String SEPARATOR = "\n";
+  public final String FUN_SYMBOL = "☻"; // 9787
+}
diff --git a/src/main/java/com/github/otymko/phoenixbsl/logic/text/Location.java b/src/main/java/com/github/otymko/phoenixbsl/logic/text/Location.java
new file mode 100644
index 0000000..e40ce39
--- /dev/null
+++ b/src/main/java/com/github/otymko/phoenixbsl/logic/text/Location.java
@@ -0,0 +1,17 @@
+package com.github.otymko.phoenixbsl.logic.text;
+
+import lombok.RequiredArgsConstructor;
+import lombok.Value;
+
+@Value
+@RequiredArgsConstructor
+public class Location {
+  private static final Location EMPTY = new Location(0, 0);
+
+  int startLine;
+  int endLine;
+
+  public static Location empty() {
+    return EMPTY;
+  }
+}
diff --git a/src/main/java/com/github/otymko/phoenixbsl/logic/text/SourceText.java b/src/main/java/com/github/otymko/phoenixbsl/logic/text/SourceText.java
new file mode 100644
index 0000000..594af77
--- /dev/null
+++ b/src/main/java/com/github/otymko/phoenixbsl/logic/text/SourceText.java
@@ -0,0 +1,11 @@
+package com.github.otymko.phoenixbsl.logic.text;
+
+import lombok.RequiredArgsConstructor;
+import lombok.Value;
+
+@Value
+@RequiredArgsConstructor
+public class SourceText {
+  String content;
+  int offset;
+}
diff --git a/src/main/java/com/github/otymko/phoenixbsl/logic/utils/IssueHelper.java b/src/main/java/com/github/otymko/phoenixbsl/logic/utils/IssueHelper.java
new file mode 100644
index 0000000..34cc062
--- /dev/null
+++ b/src/main/java/com/github/otymko/phoenixbsl/logic/utils/IssueHelper.java
@@ -0,0 +1,34 @@
+package com.github.otymko.phoenixbsl.logic.utils;
+
+import com.github.otymko.phoenixbsl.logic.PhoenixAPI;
+import com.github.otymko.phoenixbsl.logic.text.Location;
+import com.github.otymko.phoenixbsl.model.Issue;
+import lombok.experimental.UtilityClass;
+import org.eclipse.lsp4j.Diagnostic;
+
+@UtilityClass
+public class IssueHelper {
+
+  public boolean checkDiagnosticBySelection(Diagnostic diagnostic, Location selection) {
+    if (selection == Location.empty()) {
+      return true;
+    }
+    return diagnostic.getRange().getStart().getLine() >= selection.getStartLine()
+      && diagnostic.getRange().getEnd().getLine() <= selection.getEndLine();
+  }
+
+  public Issue createIssue(Diagnostic diagnostic) {
+    var range = diagnostic.getRange();
+    var position = range.getStart();
+    var startLine = position.getLine() + 1;
+
+    var issue = new Issue();
+    issue.setSource(PhoenixAPI.getValueSourceByString(diagnostic.getSource()));
+    issue.setDescription(diagnostic.getMessage());
+    issue.setStartLine(startLine);
+    issue.setLocation(String.valueOf(startLine));
+    issue.setSeverity(diagnostic.getSeverity());
+    return issue;
+  }
+
+}
diff --git a/src/main/java/com/github/otymko/phoenixbsl/logic/utils/TextUtil.java b/src/main/java/com/github/otymko/phoenixbsl/logic/utils/TextUtil.java
new file mode 100644
index 0000000..b0d6169
--- /dev/null
+++ b/src/main/java/com/github/otymko/phoenixbsl/logic/utils/TextUtil.java
@@ -0,0 +1,17 @@
+package com.github.otymko.phoenixbsl.logic.utils;
+
+import com.github.otymko.phoenixbsl.logic.text.Constant;
+import lombok.experimental.UtilityClass;
+
+@UtilityClass
+public class TextUtil {
+
+  public String pasteSelectionInText(String text, String selection) {
+    return text.replace(Constant.FUN_SYMBOL, selection);
+  }
+
+  public int numberOfLinesInText(String text) {
+    return text.split(Constant.SEPARATOR).length;
+  }
+
+}

From 7bce520b7565c2b313d767d9d0f461136d105c70 Mon Sep 17 00:00:00 2001
From: Tymko Oleg <olegtymko@yandex.ru>
Date: Tue, 16 Feb 2021 00:56:59 +0700
Subject: [PATCH 2/2] =?UTF-8?q?refactor:=20#123=20=D0=A3=D0=B7=D0=BE=D1=80?=
 =?UTF-8?q?=D1=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../logic/designer/DesignerTextEditor.java         | 14 ++++----------
 1 file changed, 4 insertions(+), 10 deletions(-)

diff --git a/src/main/java/com/github/otymko/phoenixbsl/logic/designer/DesignerTextEditor.java b/src/main/java/com/github/otymko/phoenixbsl/logic/designer/DesignerTextEditor.java
index bee7548..dc2dd43 100644
--- a/src/main/java/com/github/otymko/phoenixbsl/logic/designer/DesignerTextEditor.java
+++ b/src/main/java/com/github/otymko/phoenixbsl/logic/designer/DesignerTextEditor.java
@@ -24,7 +24,7 @@
 @Slf4j
 public class DesignerTextEditor implements EventListener {
   public static final List<String> DIAGNOSTIC_FOR_QF = createDiagnosticListForQuickFix();
-  public static final List<String> FILTER_ACTION_QUICKFIX = createListFilterActionQuickFix();
+  public static final List<String> FILTER_ACTION_QUICKFIX = List.of("quickfix");
   private final PhoenixCore core;
   @Getter
   @Setter
@@ -93,7 +93,7 @@ public void formatting() {
 
   @Override
   public void fixAll() {
-    LOGGER.debug("Событие: обработка квикфиксов");
+    LOGGER.debug("Событие: применение quickfix");
     if (!PhoenixAPI.isWindowsForm1S()) {
       return;
     }
@@ -153,17 +153,11 @@ private FormattingText getFormattingText() {
   }
 
   private static List<String> createDiagnosticListForQuickFix() {
-    var list = new ArrayList<String>();
+    List<String> list = new ArrayList<>();
     list.add("CanonicalSpellingKeywords");
     list.add("SpaceAtStartComment");
     list.add("SemicolonPresence");
-    return list;
-  }
-
-  private static List<String> createListFilterActionQuickFix() {
-    List<String> onlyKind = new ArrayList<>();
-    onlyKind.add("quickfix");
-    return onlyKind;
+    return List.copyOf(list);
   }
 
 }