Java 类com.intellij.openapi.application.ex.ApplicationUtil 实例源码
项目:consulo
文件:PsiSearchHelperImpl.java
private void processVirtualFile(@Nonnull final VirtualFile vfile,
@Nonnull final ProgressIndicator progress,
@Nonnull final Processor<? super PsiFile> localProcessor,
@Nonnull final AtomicBoolean canceled) throws ApplicationUtil.CannotRunReadActionException {
final PsiFile file = ApplicationUtil.tryRunReadAction(() -> vfile.isValid() ? myManager.findFile(vfile) : null);
if (file != null && !(file instanceof PsiBinaryFile)) {
// load contents outside read action
if (FileDocumentManager.getInstance().getCachedDocument(vfile) == null) {
// cache bytes in vfs
try {
vfile.contentsToByteArray();
}
catch (IOException ignored) {
}
}
ApplicationUtil.tryRunReadAction(() -> {
final Project project = myManager.getProject();
if (project.isDisposed()) throw new ProcessCanceledException();
if (DumbService.isDumb(project)) throw ApplicationUtil.CannotRunReadActionException.create();
List<PsiFile> psiRoots = file.getViewProvider().getAllFiles();
Set<PsiFile> processed = new THashSet<>(psiRoots.size() * 2, (float)0.5);
for (final PsiFile psiRoot : psiRoots) {
progress.checkCanceled();
assert psiRoot != null : "One of the roots of file " + file + " is null. All roots: " + psiRoots + "; ViewProvider: " +
file.getViewProvider() + "; Virtual file: " + file.getViewProvider().getVirtualFile();
if (!processed.add(psiRoot)) continue;
if (!psiRoot.isValid()) {
continue;
}
if (!localProcessor.process(psiRoot)) {
canceled.set(true);
break;
}
}
});
}
}
项目:consulo
文件:ReadMostlyRWLock.java
/**
* Executes a {@code runnable} in an "impatient" mode.
* In this mode any attempt to grab read lock
* will fail (i.e. throw {@link ApplicationUtil.CannotRunReadActionException})
* if there is a pending write lock request.
*/
void executeByImpatientReader(@Nonnull Runnable runnable) throws ApplicationUtil.CannotRunReadActionException {
checkReadThreadAccess();
Reader status = R.get();
boolean old = status.impatientReads;
try {
status.impatientReads = true;
runnable.run();
}
finally {
status.impatientReads = old;
}
}
项目:consulo
文件:ApplicationImpl.java
/**
* Executes a {@code runnable} in an "impatient" mode.
* In this mode any attempt to call {@link #runReadAction(Runnable)}
* would fail (i.e. throw {@link ApplicationUtil.CannotRunReadActionException})
* if there is a pending write action.
*/
public void executeByImpatientReader(@Nonnull Runnable runnable) throws ApplicationUtil.CannotRunReadActionException {
if (isDispatchThread()) {
runnable.run();
}
else {
myLock.executeByImpatientReader(runnable);
}
}
项目:intellij-ce-playground
文件:PsiSearchHelperImpl.java
/**
* @param files to scan for references in this pass.
* @param totalSize the number of files to scan in both passes. Can be different from <code>files.size()</code> in case of
* two-pass scan, where we first scan files containing container name and then all the rest files.
* @param alreadyProcessedFiles the number of files scanned in previous pass.
* @return true if completed
*/
private boolean processPsiFileRoots(@NotNull List<VirtualFile> files,
final int totalSize,
int alreadyProcessedFiles,
@NotNull final ProgressIndicator progress,
@NotNull final Processor<? super PsiFile> localProcessor) {
myManager.startBatchFilesProcessingMode();
try {
final AtomicInteger counter = new AtomicInteger(alreadyProcessedFiles);
final AtomicBoolean canceled = new AtomicBoolean(false);
boolean completed = true;
while (true) {
List<VirtualFile> failedList = new SmartList<VirtualFile>();
final List<VirtualFile> failedFiles = Collections.synchronizedList(failedList);
final Processor<VirtualFile> processor = new Processor<VirtualFile>() {
@Override
public boolean process(final VirtualFile vfile) {
try {
TooManyUsagesStatus.getFrom(progress).pauseProcessingIfTooManyUsages();
processVirtualFile(vfile, progress, localProcessor, canceled, counter, totalSize);
}
catch (ApplicationUtil.CannotRunReadActionException action) {
failedFiles.add(vfile);
}
return !canceled.get();
}
};
if (ApplicationManager.getApplication().isWriteAccessAllowed() || ((ApplicationEx)ApplicationManager.getApplication()).isWriteActionPending()) {
// no point in processing in separate threads - they are doomed to fail to obtain read action anyway
completed &= ContainerUtil.process(files, processor);
}
else {
completed &= JobLauncher.getInstance().invokeConcurrentlyUnderProgress(files, progress, false, false, processor);
}
if (failedFiles.isEmpty()) {
break;
}
// we failed to run read action in job launcher thread
// run read action in our thread instead to wait for a write action to complete and resume parallel processing
DumbService.getInstance(myManager.getProject()).runReadActionInSmartMode(EmptyRunnable.getInstance());
files = failedList;
}
return completed;
}
finally {
myManager.finishBatchFilesProcessingMode();
}
}
项目:intellij-ce-playground
文件:PsiSearchHelperImpl.java
private void processVirtualFile(@NotNull final VirtualFile vfile,
@NotNull final ProgressIndicator progress,
@NotNull final Processor<? super PsiFile> localProcessor,
@NotNull final AtomicBoolean canceled,
@NotNull AtomicInteger counter,
int totalSize) throws ApplicationUtil.CannotRunReadActionException {
final PsiFile file = ApplicationUtil.tryRunReadAction(new Computable<PsiFile>() {
@Override
public PsiFile compute() {
return vfile.isValid() ? myManager.findFile(vfile) : null;
}
});
if (file != null && !(file instanceof PsiBinaryFile)) {
// load contents outside read action
if (FileDocumentManager.getInstance().getCachedDocument(vfile) == null) {
// cache bytes in vfs
try {
vfile.contentsToByteArray();
}
catch (IOException ignored) {
}
}
ApplicationUtil.tryRunReadAction(new Computable<Void>() {
@Override
public Void compute() {
final Project project = myManager.getProject();
if (project.isDisposed()) throw new ProcessCanceledException();
if (DumbService.isDumb(project)) throw new ApplicationUtil.CannotRunReadActionException();
List<PsiFile> psiRoots = file.getViewProvider().getAllFiles();
Set<PsiFile> processed = new THashSet<PsiFile>(psiRoots.size() * 2, (float)0.5);
for (final PsiFile psiRoot : psiRoots) {
progress.checkCanceled();
assert psiRoot != null : "One of the roots of file " + file + " is null. All roots: " + psiRoots + "; ViewProvider: " +
file.getViewProvider() + "; Virtual file: " + file.getViewProvider().getVirtualFile();
if (!processed.add(psiRoot)) continue;
if (!psiRoot.isValid()) {
continue;
}
if (!localProcessor.process(psiRoot)) {
canceled.set(true);
break;
}
}
return null;
}
});
}
if (progress.isRunning()) {
double fraction = (double)counter.incrementAndGet() / totalSize;
progress.setFraction(fraction);
}
}
项目:intellij-ce-playground
文件:LoadTextUtil.java
@NotNull
public static CharSequence loadText(@NotNull final VirtualFile file) {
if (file instanceof LightVirtualFile) {
return ((LightVirtualFile)file).getContent();
}
if (file.isDirectory()) {
throw new AssertionError("'" + file.getPresentableUrl() + "' is a directory");
}
FileType fileType = file.getFileType();
if (fileType.isBinary()) {
final BinaryFileDecompiler decompiler = BinaryFileTypeDecompilers.INSTANCE.forFileType(fileType);
if (decompiler != null) {
CharSequence text;
Application app = ApplicationManager.getApplication();
if (app != null && app.isDispatchThread() && !app.isWriteAccessAllowed() && !GraphicsEnvironment.isHeadless()) {
final Ref<CharSequence> result = Ref.create(ArrayUtil.EMPTY_CHAR_SEQUENCE);
final Ref<Throwable> error = Ref.create();
ProgressManager.getInstance().run(new Task.Modal(null, "Decompiling " + file.getName(), true) {
@Override
public void run(@NotNull ProgressIndicator indicator) {
indicator.setIndeterminate(true);
try {
result.set(ApplicationUtil.runWithCheckCanceled(new Callable<CharSequence>() {
@Override
public CharSequence call() {
return decompiler.decompile(file);
}
}, indicator));
}
catch (Throwable t) {
error.set(t);
}
}
});
ExceptionUtil.rethrowUnchecked(error.get());
text = result.get();
}
else {
text = decompiler.decompile(file);
}
StringUtil.assertValidSeparators(text);
return text;
}
throw new IllegalArgumentException("Attempt to load text for binary file which doesn't have a decompiler plugged in: " + file.getPresentableUrl() + ". File type: " + fileType.getName());
}
try {
byte[] bytes = file.contentsToByteArray();
return getTextByBinaryPresentation(bytes, file);
}
catch (IOException e) {
return ArrayUtil.EMPTY_CHAR_SEQUENCE;
}
}
项目:intellij-idea-plugin
文件:UIRegionImpl.java
@Override
public int getStartPosition()
{
return ApplicationUtil.tryRunReadAction(() -> selectionModel.getSelectionStart());
}
项目:intellij-idea-plugin
文件:UIRegionImpl.java
@Override
public int getEndPosition()
{
return ApplicationUtil.tryRunReadAction(() -> selectionModel.getSelectionEnd());
}
项目:intellij-idea-plugin
文件:UIRegionImpl.java
@Override
public Optional<String> getText()
{
String text = ApplicationUtil.tryRunReadAction(() -> selectionModel.getSelectedText());
return Optional.ofNullable(text);
}
项目:consulo
文件:PsiSearchHelperImpl.java
public static boolean processFilesConcurrentlyDespiteWriteActions(@Nonnull Project project,
@Nonnull List<VirtualFile> files,
@Nonnull final ProgressIndicator progress,
@Nonnull final Processor<VirtualFile> localProcessor) {
ApplicationEx app = (ApplicationEx)ApplicationManager.getApplication();
final AtomicBoolean canceled = new AtomicBoolean(false);
while (true) {
List<VirtualFile> failedList = new SmartList<>();
final List<VirtualFile> failedFiles = Collections.synchronizedList(failedList);
final Processor<VirtualFile> processor = vfile -> {
try {
boolean result = localProcessor.process(vfile);
if (!result) {
canceled.set(true);
}
return result;
}
catch (ApplicationUtil.CannotRunReadActionException action) {
failedFiles.add(vfile);
}
return !canceled.get();
};
boolean completed;
if (app.isWriteAccessAllowed() || app.isReadAccessAllowed() && app.isWriteActionPending()) {
// no point in processing in separate threads - they are doomed to fail to obtain read action anyway
completed = ContainerUtil.process(files, processor);
}
else if (app.isWriteActionPending()) {
completed = true;
// we don't have read action now so wait for write action to complete
failedFiles.addAll(files);
}
else {
// try to run parallel read actions but fail as soon as possible
completed = JobLauncher.getInstance().invokeConcurrentlyUnderProgress(files, progress, false, true, processor);
}
if (!completed) {
return false;
}
if (failedFiles.isEmpty()) {
break;
}
// we failed to run read action in job launcher thread
// run read action in our thread instead to wait for a write action to complete and resume parallel processing
DumbService.getInstance(project).runReadActionInSmartMode(EmptyRunnable.getInstance());
files = failedList;
}
return true;
}
项目:consulo
文件:ReadMostlyRWLock.java
private void throwIfImpatient(Reader status) {
// when client explicitly runs in non-cancelable block do not throw from within nested read actions
if (status.impatientReads && writeRequested && !ProgressManager.getInstance().isInNonCancelableSection() && CoreProgressManager.ENABLED) {
throw ApplicationUtil.CannotRunReadActionException.create();
}
}