Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@

## [Unreleased]

## [0.5.9]
### Changed
- Added a max lines feature to exclude big files
- Added a max problems per line feature

## [0.5.8]
### Fixed
- Fixed settings not opening with non default locales
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ pluginGroup = org.OverEngineer
pluginName = InlineProblems
pluginRepositoryUrl = https://github.com/OverEngineer/InlineProblems
# SemVer format -> https://semver.org
pluginVersion = 0.5.8
pluginVersion = 0.5.9

# Supported build number ranges and IntelliJ Platform versions -> https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html
pluginSinceBuild = 212.5
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import org.overengineer.inlineproblems.entities.enums.Listener;
import org.overengineer.inlineproblems.listeners.HighlightProblemListener;
import org.overengineer.inlineproblems.settings.SettingsState;
import org.overengineer.inlineproblems.utils.FileNameUtil;
import org.overengineer.inlineproblems.utils.FileUtil;

import java.util.ArrayList;
import java.util.Arrays;
Expand Down Expand Up @@ -92,16 +92,20 @@
FileEditorManager fileEditorManager = FileEditorManager.getInstance(project);
for (var editor : fileEditorManager.getAllEditors()) {

if (editor.getFile() == null || FileNameUtil.ignoreFile(editor.getFile().getName())) {
if (editor instanceof TextEditor) {
var textEditor = (TextEditor) editor;

if (
editor.getFile() == null ||
FileUtil.ignoreFile(editor.getFile().getName(), textEditor.getEditor().getDocument().getLineCount())
) {
continue;
}

if (editor instanceof TextEditor) {
var textEditor = (TextEditor) editor;
problems.addAll(getProblemsInEditor(textEditor));
}
problems.addAll(getProblemsInEditor(textEditor));
}
}
}

problemManager.updateFromNewActiveProblems(problems);
}
Expand All @@ -112,7 +116,10 @@
* millisecond if the HighlightProblemListener is used.
*/
public void scanForProblemsManuallyInTextEditor(TextEditor textEditor) {
if (textEditor.getFile() == null || FileNameUtil.ignoreFile(textEditor.getFile().getName())) {
if (
textEditor.getFile() == null ||
FileUtil.ignoreFile(textEditor.getFile().getName(), textEditor.getEditor().getDocument().getLineCount())
) {
return;
}

Expand Down Expand Up @@ -168,7 +175,7 @@

InlineProblem newProblem = new InlineProblem(
document.getLineNumber(highlightInfo.getStartOffset()),
textEditor.getFile().getPath(),

Check warning on line 178 in src/main/java/org/overengineer/inlineproblems/DocumentMarkupModelScanner.java

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Nullability and data flow problems

Method invocation `getPath` may produce `NullPointerException`

Check warning on line 178 in src/main/java/org/overengineer/inlineproblems/DocumentMarkupModelScanner.java

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Nullability and data flow problems

Method invocation `getPath` may produce `NullPointerException`
highlightInfo,
textEditor,
h,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import org.overengineer.inlineproblems.listeners.HighlightProblemListener;
import org.overengineer.inlineproblems.listeners.MarkupModelProblemListener;
import org.overengineer.inlineproblems.settings.SettingsState;
import org.overengineer.inlineproblems.utils.FileNameUtil;
import org.overengineer.inlineproblems.utils.FileUtil;


public class ListenerManager {
Expand Down Expand Up @@ -40,12 +40,15 @@ public void installMarkupModelListenerOnAllProjects() {
for (var project : manager.getOpenProjects()) {
FileEditorManager fileEditorManager = FileEditorManager.getInstance(project);
for (var editor : fileEditorManager.getAllEditors()) {

if (editor.getFile() == null || FileNameUtil.ignoreFile(editor.getFile().getName())) {
continue;
}

if (editor instanceof TextEditor) {
var textEditor = (TextEditor) editor;
if (
editor.getFile() == null ||
FileUtil.ignoreFile(editor.getFile().getName(), textEditor.getEditor().getDocument().getLineCount())
) {
continue;
}

MarkupModelProblemListener.setup((TextEditor) editor);
logger.debug("Installing MarkupModelListener");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
if (!Collections.synchronizedList(activeProblems).remove(problem)) {
logger.warn("Removal of problem failed, resetting");
resetForEditor(problem.getTextEditor().getEditor());
return;

Check warning on line 43 in src/main/java/org/overengineer/inlineproblems/ProblemManager.java

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unnecessary 'return' statement

`return` is unnecessary as the last statement in a 'void' method

Check warning on line 43 in src/main/java/org/overengineer/inlineproblems/ProblemManager.java

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unnecessary 'return' statement

`return` is unnecessary as the last statement in a 'void' method
}
}

Expand All @@ -64,6 +64,12 @@
removeProblem(p);
});

// Limit problems per line
int maxProblemsPerLine = settingsState.getMaxProblemsPerLine();
if (maxProblemsPerLine > 0 && problemsInLine.size() > maxProblemsPerLine) {
problemsInLine.subList(maxProblemsPerLine, problemsInLine.size()).clear();
}

/* This only works when using a method reference, if we move the code from the addProblemPrivate func into a lambda
* it does not work like expected, that is because there are differences in the evaluation and the way it is called */
problemsInLine.forEach(this::addProblemPrivate);
Expand Down Expand Up @@ -124,7 +130,7 @@

for (int additionalSeverity : settingsState.getAdditionalInfoSeverities()) {
if (additionalSeverity == severity) {
problem.setSeverity(HighlightSeverity.INFO.myVal);

Check warning on line 133 in src/main/java/org/overengineer/inlineproblems/ProblemManager.java

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Deprecated API usage

'INFO' is deprecated

Check warning on line 133 in src/main/java/org/overengineer/inlineproblems/ProblemManager.java

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Deprecated API usage

'INFO' is deprecated
return;
}
}
Expand Down Expand Up @@ -182,7 +188,7 @@
Map<String, InlineProblem> filteredMap = new HashMap<>();

for (InlineProblem problem : newProblems) {
String key = problem.getTextEditor().getFile().getPath() + problem.getLine();

Check warning on line 191 in src/main/java/org/overengineer/inlineproblems/ProblemManager.java

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Nullability and data flow problems

Method invocation `getPath` may produce `NullPointerException`

Check warning on line 191 in src/main/java/org/overengineer/inlineproblems/ProblemManager.java

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Nullability and data flow problems

Method invocation `getPath` may produce `NullPointerException`

if (filteredMap.containsKey(key)) {
if (filteredMap.get(key).getSeverity() < problem.getSeverity()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import org.jetbrains.annotations.NotNull;
import org.overengineer.inlineproblems.entities.enums.Listener;
import org.overengineer.inlineproblems.settings.SettingsState;
import org.overengineer.inlineproblems.utils.FileNameUtil;
import org.overengineer.inlineproblems.utils.FileUtil;

import java.util.Arrays;

Expand All @@ -24,13 +24,15 @@ public void fileOpenedSync(
if (settingsState.getEnabledListener() != Listener.MARKUP_MODEL_LISTENER)
return;

if (FileNameUtil.ignoreFile(file.getName())) {
// Precheck only file name, later we check the line count only
if (FileUtil.ignoreFile(file.getName(), -1)) {
return;
}

Arrays.stream(editors.first)
.filter(e -> e instanceof TextEditor)
.map(e -> (TextEditor)e)
.forEach(MarkupModelProblemListener::setup);
.filter(e -> e instanceof TextEditor)
.map(e -> (TextEditor) e)
.filter(tE -> !FileUtil.ignoreFile(null, tE.getEditor().getDocument().getLineCount()))
.forEach(MarkupModelProblemListener::setup);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import org.overengineer.inlineproblems.DocumentMarkupModelScanner;
import org.overengineer.inlineproblems.entities.enums.Listener;
import org.overengineer.inlineproblems.settings.SettingsState;
import org.overengineer.inlineproblems.utils.FileNameUtil;
import org.overengineer.inlineproblems.utils.FileUtil;


public class HighlightProblemListener implements HighlightInfoFilter {
Expand All @@ -29,7 +29,8 @@
if (file == null || !file.isValid())
return true;

if (FileNameUtil.ignoreFile(file.getName())) {
// Only check file name here, the line count is checked in the scanForProblemsManuallyInTextEditor call
if (FileUtil.ignoreFile(file.getName(), -1)) {
return true;
}

Expand All @@ -48,7 +49,7 @@
return;

FileEditor editor = FileEditorManager.getInstance(file.getProject()).getSelectedEditor(file.getVirtualFile());
if (editor == null) {
if (editor == null || !(editor instanceof TextEditor)) {

Check warning on line 52 in src/main/java/org/overengineer/inlineproblems/listeners/HighlightProblemListener.java

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Condition is covered by further condition

Condition 'editor == null' covered by subsequent condition '!(editor instanceof TextEditor)'

Check warning on line 52 in src/main/java/org/overengineer/inlineproblems/listeners/HighlightProblemListener.java

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Condition is covered by further condition

Condition 'editor == null' covered by subsequent condition '!(editor instanceof TextEditor)'
return;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@ public class SettingsComponent {
private final JBCheckBox enableXmlUnescaping = new JBCheckBox(SettingsBundle.message("settings.enableXmlUnescaping"));
private final JFormattedTextField inlayFontSizeDeltaText;
private final JFormattedTextField manualScannerDelay;
private final JFormattedTextField maxProblemsPerLine;
private final JFormattedTextField maxFileLines;
private final JBCheckBox fillProblemLabels = new JBCheckBox(SettingsBundle.message("settings.fillProblemLabels"));
private final JBCheckBox boldProblemLabels = new JBCheckBox(SettingsBundle.message("settings.boldProblemLabels"));
private final JBCheckBox italicProblemLabels = new JBCheckBox(SettingsBundle.message("settings.italicProblemLabels"));
Expand Down Expand Up @@ -135,9 +137,15 @@ public SettingsComponent() {
inlayFontSizeDeltaText = new JFormattedTextField(numberFormatter);
inlayFontSizeDeltaText.setText(Integer.toString(settingsState.getInlayFontSizeDelta()));

maxProblemsPerLine = new JFormattedTextField(numberFormatter);
maxProblemsPerLine.setText(Integer.toString(settingsState.getMaxProblemsPerLine()));

manualScannerDelay = new JFormattedTextField(numberFormatter);
manualScannerDelay.setText(Integer.toString(settingsState.getManualScannerDelay()));

maxFileLines = new JFormattedTextField(numberFormatter);
maxFileLines.setText(Integer.toString(settingsState.getMaxFileLines()));

fillProblemLabels.setSelected(settingsState.isFillProblemLabels());
boldProblemLabels.setSelected(settingsState.isBoldProblemLabels());
italicProblemLabels.setSelected(settingsState.isItalicProblemLabels());
Expand Down Expand Up @@ -186,6 +194,10 @@ public SettingsComponent() {
.addTooltip(SettingsBundle.message("settings.problemFilterListTooltip"))
.addLabeledComponent(new JLabel(SettingsBundle.message("settings.fileExtensionBlacklistLabel")), fileExtensionBlacklist)
.addTooltip(SettingsBundle.message("settings.fileExtensionBlacklistTooltip"))
.addLabeledComponent(new JBLabel(SettingsBundle.message("settings.maxProblemsPerLineLabel")), maxProblemsPerLine)
.addTooltip(SettingsBundle.message("settings.maxProblemsPerLineTooltip"))
.addLabeledComponent(new JLabel(SettingsBundle.message("settings.maxFileLinesLabel")), maxFileLines)
.addTooltip(SettingsBundle.message("settings.maxFileLinesTooltip"))
.addSeparator()
.addComponent(new JBLabel(SettingsBundle.message("settings.submenu.colors")))
.addComponent(showErrors)
Expand Down Expand Up @@ -644,4 +656,30 @@ public int getManualScannerDelay() {
public void setManualScannerDelay(int delay) {
manualScannerDelay.setText(Integer.toString(Math.max(10, delay)));
}

public int getMaxProblemsPerLine() {
try {
return Math.max(Integer.parseInt(maxProblemsPerLine.getText()), 0);
}
catch (NumberFormatException e) {
return 0;
}
}

public void setMaxProblemsPerLine(int max) {
maxProblemsPerLine.setText(Integer.toString(Math.max(0, max)));
}

public int getMaxFileLines() {
try {
return Math.max(Integer.parseInt(maxFileLines.getText()), 0);
}
catch (NumberFormatException e) {
return 0;
}
}

public void setMaxFileLines(int lines) {
maxFileLines.setText(Integer.toString(Math.max(0, lines)));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
}

@Override
@NlsContexts.ConfigurableName

Check warning on line 24 in src/main/java/org/overengineer/inlineproblems/settings/SettingsConfigurable.java

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unstable API Usage

'com.intellij.openapi.util.NlsContexts' is marked unstable with @ApiStatus.Experimental

Check warning on line 24 in src/main/java/org/overengineer/inlineproblems/settings/SettingsConfigurable.java

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unstable API Usage

'com.intellij.openapi.util.NlsContexts.ConfigurableName' is declared in unstable class 'com.intellij.openapi.util.NlsContexts' marked with @ApiStatus.Experimental

Check warning on line 24 in src/main/java/org/overengineer/inlineproblems/settings/SettingsConfigurable.java

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unstable API Usage

'com.intellij.openapi.util.NlsContexts' is marked unstable with @ApiStatus.Experimental

Check warning on line 24 in src/main/java/org/overengineer/inlineproblems/settings/SettingsConfigurable.java

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unstable API Usage

'com.intellij.openapi.util.NlsContexts.ConfigurableName' is declared in unstable class 'com.intellij.openapi.util.NlsContexts' marked with @ApiStatus.Experimental
public String getDisplayName() {
return "InlineProblems";
}
Expand All @@ -48,6 +48,7 @@
state.isRoundedCornerBoxes() == settingsComponent.isRoundedCornerBoxes() &&
state.isUseEditorFont() == settingsComponent.isUseEditorFont() &&
state.isShowOnlyHighestSeverityPerLine() == settingsComponent.isShowOnlyHighestSeverityPerLine() &&
state.getMaxProblemsPerLine() == settingsComponent.getMaxProblemsPerLine() &&
state.isEnableHtmlStripping() == settingsComponent.isEnableHtmlStripping() &&
state.isEnableXmlUnescaping() == settingsComponent.isEnableXmlUnescaping() &&
state.getInlayFontSizeDelta() == settingsComponent.getInlayFontSizeDelta() &&
Expand Down Expand Up @@ -89,6 +90,7 @@

state.getProblemFilterList().equals(settingsComponent.getProblemFilterList()) &&
state.getFileExtensionBlacklist().equals(settingsComponent.getFileExtensionBlacklist()) &&
state.getMaxFileLines() == settingsComponent.getMaxFileLines() &&

state.getAdditionalInfoSeveritiesAsString().equals(settingsComponent.getAdditionalInfoSeverities()) &&
state.getAdditionalWarningSeveritiesAsString().equals(settingsComponent.getAdditionalWarningSeverities()) &&
Expand All @@ -106,6 +108,7 @@
boolean listenerChanged = state.getEnabledListener() != settingsComponent.getEnabledListener();
boolean fileExtensionBlacklistChanged = !Objects.equals(state.getFileExtensionBlacklist(), settingsComponent.getFileExtensionBlacklist());
boolean manualScannerDelayChanged = state.getManualScannerDelay() != settingsComponent.getManualScannerDelay();
boolean maxFileLinesChanged = state.getMaxFileLines() != settingsComponent.getMaxFileLines();

state.setShowErrors(settingsComponent.isShowErrors());
state.setHighlightErrors(settingsComponent.isHighlightErrors());
Expand Down Expand Up @@ -143,6 +146,7 @@
state.setRoundedCornerBoxes(settingsComponent.isRoundedCornerBoxes());
state.setUseEditorFont(settingsComponent.isUseEditorFont());
state.setShowOnlyHighestSeverityPerLine(settingsComponent.isShowOnlyHighestSeverityPerLine());
state.setMaxProblemsPerLine(settingsComponent.getMaxProblemsPerLine());
state.setEnableHtmlStripping(settingsComponent.isEnableHtmlStripping());
state.setEnableXmlUnescaping(settingsComponent.isEnableXmlUnescaping());
state.setInlayFontSizeDelta(settingsComponent.getInlayFontSizeDelta());
Expand All @@ -155,6 +159,7 @@
state.setManualScannerDelay(settingsComponent.getManualScannerDelay());
state.setProblemFilterList(settingsComponent.getProblemFilterList());
state.setFileExtensionBlacklist(settingsComponent.getFileExtensionBlacklist());
state.setMaxFileLines(settingsComponent.getMaxFileLines());

state.setAdditionalInfoSeverities(settingsComponent.getAdditionalInfoSeveritiesList());
state.setAdditionalWarningSeverities(settingsComponent.getAdditionalWarningSeveritiesList());
Expand All @@ -167,8 +172,8 @@

listenerManager.resetAndRescan();

// When the blacklist changes we need to re-apply all MarkupModelProblemListeners
if (fileExtensionBlacklistChanged && state.getEnabledListener() == Listener.MARKUP_MODEL_LISTENER) {
// When the blacklist or maxFileLines changes we need to re-apply all MarkupModelProblemListeners
if ((fileExtensionBlacklistChanged || maxFileLinesChanged) && state.getEnabledListener() == Listener.MARKUP_MODEL_LISTENER) {
listenerManager.resetMarkupModelProblemListeners();
}

Expand Down Expand Up @@ -217,6 +222,7 @@
settingsComponent.setRoundedCornerBoxes(state.isRoundedCornerBoxes());
settingsComponent.setUseEditorFont(state.isUseEditorFont());
settingsComponent.setShowOnlyHighestSeverityPerLine(state.isShowOnlyHighestSeverityPerLine());
settingsComponent.setMaxProblemsPerLine(state.getMaxProblemsPerLine());
settingsComponent.setEnableHtmlStripping(state.isEnableHtmlStripping());
settingsComponent.setEnableXmlUnescaping(state.isEnableXmlUnescaping());
settingsComponent.setInlayFontSizeDelta(state.getInlayFontSizeDelta());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@
private int enabledListener = Listener.MARKUP_MODEL_LISTENER;
private String problemFilterList = "todo;fixme;open in browser";
private String fileExtensionBlacklist = "";
private int maxFileLines = 0;

private List<Integer> additionalErrorSeverities = new ArrayList<>();
private List<Integer> additionalWarningSeverities = new ArrayList<>();
Expand All @@ -109,6 +110,7 @@
private boolean showOnlyHighestSeverityPerLine = false;
private boolean enableHtmlStripping = true;
private boolean enableXmlUnescaping = true;
private int maxProblemsPerLine = 20;

// migration booleans
private boolean highlightProblemListenerDeprecateMigrationDone = false;
Expand Down Expand Up @@ -141,7 +143,7 @@
List<String> newFilterListEntries = List.of("Consider unknown contexts non-blocking");
for (String entry : newFilterListEntries) {
if (!problemFilterList.contains(entry)) {
problemFilterList += ";" + entry;

Check warning on line 146 in src/main/java/org/overengineer/inlineproblems/settings/SettingsState.java

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

String concatenation in loop

String concatenation `+=` in loop

Check warning on line 146 in src/main/java/org/overengineer/inlineproblems/settings/SettingsState.java

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

String concatenation in loop

String concatenation `+=` in loop
}
}

Expand Down

This file was deleted.

37 changes: 37 additions & 0 deletions src/main/java/org/overengineer/inlineproblems/utils/FileUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package org.overengineer.inlineproblems.utils;

import org.overengineer.inlineproblems.settings.SettingsState;

public class FileUtil {

/**
* Returns true if the file should be ignored, current checks involve the file name and the line count
* @param fileName can be null to ignore
* @param lineCount can be -1 to ignore
* @return true if the file should be ignored, false otherwise
*/
public static boolean ignoreFile(String fileName, int lineCount) {
boolean ignore = false;
var settings = SettingsState.getInstance();

if (fileName != null) {
for (var e : settings.getFileExtensionBlacklist().split(";")) {
if (e.isBlank() || e.isEmpty() || e.equals(";")) continue;

Check warning on line 19 in src/main/java/org/overengineer/inlineproblems/utils/FileUtil.java

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Constant values

Condition `e.isEmpty()` is always `false`

Check warning on line 19 in src/main/java/org/overengineer/inlineproblems/utils/FileUtil.java

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Constant values

Condition `e.isEmpty()` is always `false`
if (fileName.endsWith(e)) {
ignore = true;
break;
}
}
}

if (lineCount >= 0) {
var maxFileLines = settings.getMaxFileLines();

if (maxFileLines >= 0 && lineCount >= maxFileLines) {
ignore = true;
}
}

return ignore;
}
}
4 changes: 4 additions & 0 deletions src/main/resources/messages/SettingsBundle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ settings.problemFilterListLabel=Problem filter list
settings.problemFilterListTooltip=Semicolon separated list of problem text beginnings that will not be handled
settings.fileExtensionBlacklistLabel=File extension blacklist
settings.fileExtensionBlacklistTooltip=Semicolon separated list of file extensions to ignore (like ".java;.md")
settings.maxFileLinesLabel=Maximum file lines
settings.maxFileLinesTooltip=Skip files with more lines than this value (0 = unlimited)
settings.submenu.colors=Colors
settings.errorTextColor=Error text color:
settings.errorLabelBorderColor=Error label border color:
Expand All @@ -51,6 +53,8 @@ settings.additionalSeveritiesInfoDesc=Semicolon separated list of additional inf
settings.forceProblemsInOneLine=Force problems in the same line even if they are too long to fit
settings.useEditorFont=Use editor font instead of tooltip font
settings.showOnlyHighestPerLine=Show only the problem with the highest severity per line
settings.maxProblemsPerLineLabel=Max problems per line (0 = unlimited)
settings.maxProblemsPerLineTooltip=Limits the number of problems shown per line. Set to 0 for unlimited.
settings.enableHtmlStripping=Enable stripping of HTML in the messages
settings.enableXmlUnescaping=Enable unescaping of XML in the messages
settings.enableClickableContext=Enable clickable inline problems for IDE context actions
Expand Down
Loading
Loading