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 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 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 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 createSeverityToStringMap() { Map 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> 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 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..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 @@ -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; @@ -22,8 +24,7 @@ @Slf4j public class DesignerTextEditor implements EventListener { public static final List DIAGNOSTIC_FOR_QF = createDiagnosticListForQuickFix(); - public static final List FILTER_ACTION_QUICKFIX = createListFilterActionQuickFix(); - public static final String SEPARATOR = "\n"; + public static final List FILTER_ACTION_QUICKFIX = List.of("quickfix"); private final PhoenixCore core; @Getter @Setter @@ -37,7 +38,7 @@ public class DesignerTextEditor implements EventListener { private final List diagnostics = Collections.synchronizedList(new ArrayList<>()); @Getter @Setter - private int currentOffset = 0; + private Location selection = Location.empty(); public DesignerTextEditor(PhoenixCore core) { this.core = core; @@ -92,7 +93,7 @@ public void formatting() { @Override public void fixAll() { - LOGGER.debug("Событие: обработка квикфиксов"); + LOGGER.debug("Событие: применение quickfix"); if (!PhoenixAPI.isWindowsForm1S()) { return; } @@ -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; } @@ -151,17 +153,11 @@ private FormattingText getFormattingText() { } private static List createDiagnosticListForQuickFix() { - var list = new ArrayList(); + List list = new ArrayList<>(); list.add("CanonicalSpellingKeywords"); list.add("SpaceAtStartComment"); list.add("SemicolonPresence"); - return list; - } - - private static List createListFilterActionQuickFix() { - List onlyKind = new ArrayList<>(); - onlyKind.add("quickfix"); - return onlyKind; + return List.copyOf(list); } } 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; + } + +}