mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
terminal: ensure console filters are collected when processing text
It wasn't the case for early printed text sometimes. GitOrigin-RevId: 3fb99f174c8935976e21a6864e0fb024c290d40c
This commit is contained in:
committed by
intellij-monorepo-bot
parent
aa56dc465c
commit
a6cf900ac4
@@ -0,0 +1,60 @@
|
||||
// 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.
|
||||
package com.intellij.terminal;
|
||||
|
||||
import com.intellij.execution.filters.CompositeFilter;
|
||||
import com.intellij.execution.filters.Filter;
|
||||
import com.intellij.execution.impl.ConsoleViewUtil;
|
||||
import com.intellij.openapi.application.ReadAction;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
class CompositeFilterWrapper {
|
||||
|
||||
private final Project myProject;
|
||||
private final TerminalExecutionConsole myConsole;
|
||||
private final List<Filter> myFilters = new CopyOnWriteArrayList<>();
|
||||
private volatile CompositeFilter myCompositeFilter;
|
||||
private final AtomicBoolean myConsoleFilterProvidersAdded = new AtomicBoolean(false);
|
||||
|
||||
CompositeFilterWrapper(@NotNull Project project, @Nullable TerminalExecutionConsole console) {
|
||||
myProject = project;
|
||||
myConsole = console;
|
||||
}
|
||||
|
||||
void addFilter(@NotNull Filter filter) {
|
||||
myFilters.add(filter);
|
||||
myCompositeFilter = null;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private List<Filter> createCompositeFilters() {
|
||||
if (myProject.isDefault()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return ReadAction.compute(() -> {
|
||||
return ConsoleViewUtil.computeConsoleFilters(myProject, myConsole, GlobalSearchScope.allScope(myProject));
|
||||
});
|
||||
}
|
||||
|
||||
@NotNull
|
||||
CompositeFilter getCompositeFilter() {
|
||||
CompositeFilter filter = myCompositeFilter;
|
||||
if (filter != null) {
|
||||
return filter;
|
||||
}
|
||||
if (myConsoleFilterProvidersAdded.compareAndSet(false, true)) {
|
||||
myFilters.addAll(createCompositeFilters());
|
||||
}
|
||||
filter = new CompositeFilter(myProject, myFilters);
|
||||
filter.setForceUseAllFilters(true);
|
||||
myCompositeFilter = filter;
|
||||
return filter;
|
||||
}
|
||||
}
|
||||
@@ -15,10 +15,8 @@
|
||||
*/
|
||||
package com.intellij.terminal;
|
||||
|
||||
import com.intellij.execution.filters.CompositeFilter;
|
||||
import com.intellij.execution.filters.Filter;
|
||||
import com.intellij.execution.filters.HyperlinkInfo;
|
||||
import com.intellij.execution.impl.ConsoleViewUtil;
|
||||
import com.intellij.ide.DataManager;
|
||||
import com.intellij.openapi.Disposable;
|
||||
import com.intellij.openapi.DisposableWrapper;
|
||||
@@ -26,7 +24,6 @@ import com.intellij.openapi.actionSystem.DataContext;
|
||||
import com.intellij.openapi.actionSystem.DataKey;
|
||||
import com.intellij.openapi.actionSystem.DataProvider;
|
||||
import com.intellij.openapi.actionSystem.PlatformDataKeys;
|
||||
import com.intellij.openapi.application.ModalityState;
|
||||
import com.intellij.openapi.application.ReadAction;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl;
|
||||
@@ -36,11 +33,9 @@ import com.intellij.openapi.util.Disposer;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.openapi.wm.ToolWindow;
|
||||
import com.intellij.openapi.wm.impl.ToolWindowImpl;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.ui.SearchTextField;
|
||||
import com.intellij.ui.components.JBScrollBar;
|
||||
import com.intellij.ui.components.JBScrollPane;
|
||||
import com.intellij.util.concurrency.NonUrgentExecutor;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.ui.JBSwingUtilities;
|
||||
import com.intellij.util.ui.RegionPainter;
|
||||
@@ -66,7 +61,6 @@ import java.awt.*;
|
||||
import java.awt.event.ItemListener;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.awt.event.KeyListener;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class JBTerminalWidget extends JediTermWidget implements Disposable, DataProvider {
|
||||
@@ -75,7 +69,7 @@ public class JBTerminalWidget extends JediTermWidget implements Disposable, Data
|
||||
private static final Logger LOG = Logger.getInstance(JBTerminalWidget.class);
|
||||
|
||||
private final JBTerminalSystemSettingsProviderBase mySettingsProvider;
|
||||
private final CompositeFilter myCompositeFilter;
|
||||
private final CompositeFilterWrapper myCompositeFilterWrapper;
|
||||
private JBTerminalWidgetListener myListener;
|
||||
|
||||
private JBTerminalWidgetDisposableWrapper myDisposableWrapper;
|
||||
@@ -95,31 +89,17 @@ public class JBTerminalWidget extends JediTermWidget implements Disposable, Data
|
||||
@NotNull Disposable parent) {
|
||||
super(columns, lines, settingsProvider);
|
||||
mySettingsProvider = settingsProvider;
|
||||
myCompositeFilter = new CompositeFilter(project);
|
||||
myCompositeFilter.setForceUseAllFilters(true);
|
||||
myCompositeFilterWrapper = new CompositeFilterWrapper(project, console);
|
||||
addHyperlinkFilter(line -> runFilters(project, line));
|
||||
setName("terminal");
|
||||
myDisposableWrapper = new JBTerminalWidgetDisposableWrapper(this, parent);
|
||||
|
||||
ReadAction
|
||||
.nonBlocking(() -> calcCompositeFilter(project, console))
|
||||
.expireWith(myDisposableWrapper)
|
||||
.finishOnUiThread(ModalityState.any(), filters -> { filters.forEach(filter -> myCompositeFilter.addFilter(filter)); })
|
||||
.submit(NonUrgentExecutor.getInstance());
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static List<Filter> calcCompositeFilter(@NotNull Project project, @Nullable TerminalExecutionConsole console) {
|
||||
return project.isDefault()
|
||||
? Collections.emptyList()
|
||||
: ConsoleViewUtil.computeConsoleFilters(project, console, GlobalSearchScope.allScope(project));
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private LinkResult runFilters(@NotNull Project project, @NotNull String line) {
|
||||
Filter.Result r = ReadAction.compute(() -> {
|
||||
try {
|
||||
return myCompositeFilter.applyFilter(line, line.length());
|
||||
return myCompositeFilterWrapper.getCompositeFilter().applyFilter(line, line.length());
|
||||
}
|
||||
catch (ProcessCanceledException e) {
|
||||
if (LOG.isDebugEnabled()) {
|
||||
@@ -296,7 +276,7 @@ public class JBTerminalWidget extends JediTermWidget implements Disposable, Data
|
||||
}
|
||||
|
||||
public void addMessageFilter(@NotNull Filter filter) {
|
||||
myCompositeFilter.addFilter(filter);
|
||||
myCompositeFilterWrapper.addFilter(filter);
|
||||
}
|
||||
|
||||
public void start(TtyConnector connector) {
|
||||
|
||||
Reference in New Issue
Block a user