mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-10-01 09:03:31 +07:00
Merge remote branch 'origin/master'
This commit is contained in:
@@ -16,11 +16,15 @@
|
||||
package com.intellij.compiler.impl.javaCompiler.api;
|
||||
|
||||
import com.intellij.openapi.util.io.FileUtil;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import javax.tools.JavaFileObject;
|
||||
import javax.tools.SimpleJavaFileObject;
|
||||
import java.io.*;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
|
||||
/**
|
||||
* User: cdr
|
||||
@@ -31,12 +35,33 @@ class JavaIoFile extends SimpleJavaFileObject {
|
||||
@Nullable
|
||||
private final String myEncoding;
|
||||
|
||||
JavaIoFile(File file, Kind kind, @Nullable String encoding) {
|
||||
super(file.toURI(), kind);
|
||||
JavaIoFile(@NotNull File file, @NotNull Kind kind, @Nullable String encoding) {
|
||||
super(convertToURI(file.getPath()), kind);
|
||||
myFile = file;
|
||||
myEncoding = encoding;
|
||||
}
|
||||
|
||||
// File.toURI() asks for File.isDirectory which is too expensive
|
||||
@NotNull
|
||||
private static URI convertToURI(@NotNull String path) {
|
||||
if (File.separatorChar != '/') {
|
||||
path = path.replace(File.separatorChar, '/');
|
||||
}
|
||||
if (!StringUtil.startsWithChar(path, '/')) {
|
||||
path = "/" + path;
|
||||
}
|
||||
|
||||
if (path.startsWith("//")) {
|
||||
path = "//" + path;
|
||||
}
|
||||
try {
|
||||
return new URI("file", null, path, null);
|
||||
}
|
||||
catch (URISyntaxException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
|
||||
return FileUtil.loadFile(myFile, myEncoding);
|
||||
|
||||
+2
-1
@@ -123,7 +123,8 @@ class MyFileManager implements StandardJavaFileManager {
|
||||
if (kind == JavaFileObject.Kind.SOURCE && child.getFileSystem() instanceof JarFileSystem) continue; //for some reasdon javac looks for java files inside jar
|
||||
|
||||
// use VFS to read content inside .jar
|
||||
JavaFileObject fileObject = !child.getPath().contains("!/") ? new JavaIoFile(new File(child.getPath()), kind, myEncoding) : new JavaVirtualFile(child, kind);
|
||||
String childPath = child.getPath();
|
||||
JavaFileObject fileObject = !childPath.contains("!/") ? new JavaIoFile(new File(childPath), kind, myEncoding) : new JavaVirtualFile(child, kind);
|
||||
results.add(fileObject);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,8 +66,8 @@ public class DebuggerTreeBase extends DnDAwareTree implements Disposable {
|
||||
return DebuggerTreeBase.this.createToolTip(e);
|
||||
}
|
||||
|
||||
public MouseEvent createTooltipEvent(MouseEvent candiateEvent) {
|
||||
return DebuggerTreeBase.this.createTooltipEvent(candiateEvent);
|
||||
public MouseEvent createTooltipEvent(MouseEvent candidateEvent) {
|
||||
return DebuggerTreeBase.this.createTooltipEvent(candidateEvent);
|
||||
}
|
||||
|
||||
public boolean isFocusOwner() {
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
package com.intellij.debugger.ui.impl;
|
||||
|
||||
import com.intellij.debugger.settings.DebuggerSettings;
|
||||
import com.intellij.ide.FrameStateListener;
|
||||
import com.intellij.ide.FrameStateManager;
|
||||
import com.intellij.openapi.Disposable;
|
||||
import com.intellij.openapi.actionSystem.AnAction;
|
||||
import com.intellij.openapi.actionSystem.AnActionEvent;
|
||||
@@ -23,7 +25,6 @@ import com.intellij.openapi.actionSystem.CustomShortcutSet;
|
||||
import com.intellij.openapi.keymap.KeymapUtil;
|
||||
import com.intellij.openapi.util.Disposer;
|
||||
import com.intellij.openapi.util.registry.Registry;
|
||||
import com.intellij.openapi.util.registry.RegistryValue;
|
||||
import com.intellij.openapi.wm.IdeGlassPane;
|
||||
import com.intellij.openapi.wm.IdeGlassPaneUtil;
|
||||
import com.intellij.util.Alarm;
|
||||
@@ -45,13 +46,12 @@ public class TipManager implements Disposable, PopupMenuListener {
|
||||
private volatile boolean myIsDisposed = false;
|
||||
private boolean myPopupShown;
|
||||
private MyAwtPreprocessor myHideCanceller;
|
||||
private RegistryValue myTooltipProperty;
|
||||
|
||||
private MouseEvent myLastMouseEvent;
|
||||
|
||||
public interface TipFactory {
|
||||
JComponent createToolTip (MouseEvent e);
|
||||
MouseEvent createTooltipEvent(MouseEvent candiateEvent);
|
||||
MouseEvent createTooltipEvent(MouseEvent candidateEvent);
|
||||
boolean isFocusOwner();
|
||||
}
|
||||
|
||||
@@ -99,6 +99,18 @@ public class TipManager implements Disposable, PopupMenuListener {
|
||||
}
|
||||
}
|
||||
|
||||
private class MyFrameStateListener implements FrameStateListener {
|
||||
@Override
|
||||
public void onFrameDeactivated() {
|
||||
hideTooltip(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFrameActivated() {
|
||||
//Do nothing
|
||||
}
|
||||
}
|
||||
|
||||
public JPopupMenu registerPopup(JPopupMenu menu) {
|
||||
menu.addPopupMenuListener(this);
|
||||
return menu;
|
||||
@@ -243,6 +255,7 @@ public class TipManager implements Disposable, PopupMenuListener {
|
||||
private final JComponent myComponent;
|
||||
private MouseListener myMouseListener = new MyMouseListener();
|
||||
private MouseMotionListener myMouseMotionListener = new MyMouseMotionListener();
|
||||
private FrameStateListener myFrameStateListener = new MyFrameStateListener();
|
||||
|
||||
private final Alarm myShowAlarm = new Alarm();
|
||||
private final Alarm myHideAlarm = new Alarm();
|
||||
@@ -294,7 +307,8 @@ public class TipManager implements Disposable, PopupMenuListener {
|
||||
myGP.addMouseMotionPreprocessor(myMouseMotionListener, this);
|
||||
|
||||
myHideCanceller = new MyAwtPreprocessor();
|
||||
Toolkit.getDefaultToolkit().addAWTEventListener(myHideCanceller, MouseEvent.MOUSE_MOTION_EVENT_MASK | KeyEvent.KEY_EVENT_MASK | MouseEvent.MOUSE_EVENT_MASK);
|
||||
Toolkit.getDefaultToolkit().addAWTEventListener(myHideCanceller, AWTEvent.MOUSE_MOTION_EVENT_MASK | AWTEvent.KEY_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK);
|
||||
FrameStateManager.getInstance().addListener(myFrameStateListener);
|
||||
}
|
||||
|
||||
public void dispose() {
|
||||
@@ -308,6 +322,8 @@ public class TipManager implements Disposable, PopupMenuListener {
|
||||
myShowAlarm.cancelAllRequests();
|
||||
myMouseListener = null;
|
||||
myMouseMotionListener = null;
|
||||
FrameStateManager.getInstance().removeListener(myFrameStateListener);
|
||||
myFrameStateListener = null;
|
||||
}
|
||||
|
||||
private class MyAwtPreprocessor implements AWTEventListener {
|
||||
|
||||
@@ -16,13 +16,12 @@
|
||||
package com.intellij.execution.junit;
|
||||
|
||||
import com.intellij.execution.ExecutionException;
|
||||
import com.intellij.execution.configurations.CommandLineBuilder;
|
||||
import com.intellij.execution.configurations.GeneralCommandLine;
|
||||
import com.intellij.execution.configurations.JavaParameters;
|
||||
import com.intellij.execution.junit2.segments.Extractor;
|
||||
import com.intellij.execution.process.OSProcessHandler;
|
||||
import com.intellij.execution.process.ProcessTerminatedListener;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Disposer;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.io.Reader;
|
||||
import java.nio.charset.Charset;
|
||||
@@ -35,17 +34,19 @@ public class JUnitProcessHandler extends OSProcessHandler {
|
||||
private final Extractor myErr;
|
||||
private final Charset myCharset;
|
||||
|
||||
public JUnitProcessHandler(final Process process, final String commandLine, final Charset charset) {
|
||||
public JUnitProcessHandler(@NotNull Process process, final String commandLine, @NotNull Charset charset) {
|
||||
super(process, commandLine);
|
||||
myOut = new Extractor(getProcess().getInputStream(), charset);
|
||||
myErr = new Extractor(getProcess().getErrorStream(), charset);
|
||||
myCharset = charset;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Reader createProcessOutReader() {
|
||||
return myOut.createReader();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Reader createProcessErrReader() {
|
||||
return myErr.createReader();
|
||||
}
|
||||
@@ -58,22 +59,29 @@ public class JUnitProcessHandler extends OSProcessHandler {
|
||||
return myOut;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Charset getCharset() {
|
||||
return myCharset;
|
||||
}
|
||||
|
||||
public static JUnitProcessHandler runJava(final JavaParameters javaParameters) throws ExecutionException {
|
||||
return runJava(javaParameters, null);
|
||||
}
|
||||
|
||||
public static JUnitProcessHandler runJava(final JavaParameters javaParameters, final Project project) throws ExecutionException {
|
||||
return runCommandLine(CommandLineBuilder.createFromJavaParameters(javaParameters, project, true));
|
||||
}
|
||||
|
||||
public static JUnitProcessHandler runCommandLine(final GeneralCommandLine commandLine) throws ExecutionException {
|
||||
final JUnitProcessHandler processHandler = new JUnitProcessHandler(commandLine.createProcess(), commandLine.getCommandLineString(),
|
||||
commandLine.getCharset());
|
||||
ProcessTerminatedListener.attach(processHandler);
|
||||
return processHandler;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void notifyProcessTerminated(int exitCode) {
|
||||
super.notifyProcessTerminated(exitCode);
|
||||
Disposer.dispose(myOut);
|
||||
Disposer.dispose(myErr);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void notifyProcessDetached() {
|
||||
super.notifyProcessDetached();
|
||||
Disposer.dispose(myOut);
|
||||
Disposer.dispose(myErr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ import com.intellij.rt.execution.junit.segments.Packet;
|
||||
import com.intellij.rt.execution.junit.segments.PacketProcessor;
|
||||
import com.intellij.rt.execution.junit.segments.SegmentedStream;
|
||||
import com.intellij.util.StringBuilderSpinAllocator;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
@@ -31,10 +32,11 @@ public class SegmentedInputStream extends InputStream {
|
||||
private PacketProcessor myEventsDispatcher;
|
||||
private int myStartupPassed = 0;
|
||||
|
||||
public SegmentedInputStream(final InputStream sourceStream, final Charset charset) {
|
||||
public SegmentedInputStream(@NotNull InputStream sourceStream, @NotNull Charset charset) {
|
||||
mySourceStream = new PushReader(new BufferedReader(new InputStreamReader(sourceStream, charset)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int read() throws IOException {
|
||||
if (myStartupPassed < SegmentedStream.STARTUP_MESSAGE.length()) {
|
||||
return rawRead();
|
||||
@@ -86,9 +88,9 @@ public class SegmentedInputStream extends InputStream {
|
||||
}
|
||||
|
||||
private char[] readMarker() throws IOException {
|
||||
int nextRead = '0';
|
||||
final StringBuilder buffer = StringBuilderSpinAllocator.alloc();
|
||||
try {
|
||||
int nextRead = '0';
|
||||
while (nextRead != ' ' && nextRead != SegmentedStream.SPECIAL_SYMBOL) {
|
||||
buffer.append((char)nextRead);
|
||||
nextRead = readNext();
|
||||
@@ -108,10 +110,12 @@ public class SegmentedInputStream extends InputStream {
|
||||
return mySourceStream.next();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int available() throws IOException {
|
||||
return mySourceStream.ready() ? 1 : 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() throws IOException {
|
||||
mySourceStream.close();
|
||||
}
|
||||
@@ -126,10 +130,11 @@ public class SegmentedInputStream extends InputStream {
|
||||
i++;
|
||||
chr = chars[i];
|
||||
if (chr != Packet.ourSpecialSymbol) {
|
||||
final StringBuffer codeBuffer = new StringBuffer(Packet.CODE_LENGTH);
|
||||
final StringBuilder codeBuffer = new StringBuilder(Packet.CODE_LENGTH);
|
||||
codeBuffer.append(chr);
|
||||
for (int j = 1; j < Packet.CODE_LENGTH; j++)
|
||||
codeBuffer.append(chars[i+j]);
|
||||
for (int j = 1; j < Packet.CODE_LENGTH; j++) {
|
||||
codeBuffer.append(chars[i + j]);
|
||||
}
|
||||
i += Packet.CODE_LENGTH - 1;
|
||||
decodedChar = (char)Integer.parseInt(codeBuffer.toString());
|
||||
}
|
||||
|
||||
@@ -18,10 +18,12 @@ package com.intellij.execution.junit2.segments;
|
||||
import com.intellij.execution.junit.SegmentedInputStreamReader;
|
||||
import com.intellij.execution.junit2.SegmentedInputStream;
|
||||
import com.intellij.execution.testframework.Printable;
|
||||
import com.intellij.openapi.Disposable;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.rt.execution.junit.segments.PacketProcessor;
|
||||
import com.intellij.util.ui.update.MergingUpdateQueue;
|
||||
import com.intellij.util.ui.update.Update;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.io.Reader;
|
||||
@@ -30,24 +32,29 @@ import java.nio.charset.Charset;
|
||||
/**
|
||||
* @author dyoma
|
||||
*/
|
||||
public class Extractor {
|
||||
public class Extractor implements Disposable {
|
||||
private DeferredActionsQueue myFulfilledWorkGate = null;
|
||||
private final SegmentedInputStream myStream;
|
||||
private OutputPacketProcessor myEventsDispatcher;
|
||||
private static final Logger LOG = Logger.getInstance("#" + Extractor.class.getName());
|
||||
private MergingUpdateQueue myQueue = new MergingUpdateQueue("Test Extractor", 20, true, MergingUpdateQueue.ANY_COMPONENT);
|
||||
private final MergingUpdateQueue myQueue = new MergingUpdateQueue("Test Extractor", 20, true, MergingUpdateQueue.ANY_COMPONENT, this);
|
||||
|
||||
public Extractor(final InputStream stream, final Charset charset) {
|
||||
public Extractor(@NotNull InputStream stream, @NotNull Charset charset) {
|
||||
myStream = new SegmentedInputStream(stream, charset);
|
||||
myQueue.setPassThrough(false);//should be updated in awt thread
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dispose() {
|
||||
}
|
||||
|
||||
public void setDispatchListener(final DispatchListener listener) {
|
||||
myFulfilledWorkGate.setDispactchListener(listener);
|
||||
}
|
||||
|
||||
public void setPacketDispatcher(final PacketProcessor packetProcessor, final DeferredActionsQueue queue) {
|
||||
myFulfilledWorkGate = new DeferredActionsQueue() { //todo make it all later
|
||||
@Override
|
||||
public void addLast(final Runnable runnable) {
|
||||
myQueue.queue(new Update(runnable) {
|
||||
@Override
|
||||
@@ -57,13 +64,16 @@ public class Extractor {
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDispactchListener(final DispatchListener listener) {
|
||||
queue.setDispactchListener(listener);
|
||||
}
|
||||
};
|
||||
myEventsDispatcher = new OutputPacketProcessor() {
|
||||
@Override
|
||||
public void processPacket(final String packet) {
|
||||
myFulfilledWorkGate.addLast(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
packetProcessor.processPacket(packet);
|
||||
}
|
||||
@@ -74,6 +84,7 @@ public class Extractor {
|
||||
public void processOutput(final Printable printable) {
|
||||
LOG.assertTrue(packetProcessor instanceof OutputPacketProcessor);
|
||||
myFulfilledWorkGate.addLast(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
((OutputPacketProcessor)packetProcessor).processOutput(printable);
|
||||
}
|
||||
|
||||
@@ -516,16 +516,18 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
|
||||
@NotNull
|
||||
DisposableIterator<T> overlappingIterator(final int startOffset, final int endOffset) {
|
||||
ProperTextRange.assertProperRange(startOffset, endOffset, "");
|
||||
|
||||
l.readLock().lock();
|
||||
|
||||
final IntervalNode<T> firstOverlap = findMinOverlappingWith(getRoot(), new TextRangeInterval(startOffset, endOffset), modCount, 0);
|
||||
if (firstOverlap == null) {
|
||||
l.readLock().unlock();
|
||||
return DisposableIterator.EMPTY;
|
||||
}
|
||||
final int firstOverlapDelta = firstOverlap.computeDeltaUpToRoot();
|
||||
final int firstOverlapStart = firstOverlap.intervalStart() + firstOverlapDelta;
|
||||
final int modCountBefore = modCount;
|
||||
|
||||
l.readLock().lock();
|
||||
|
||||
return new DisposableIterator<T>() {
|
||||
private IntervalNode<T> currentNode = firstOverlap;
|
||||
private int deltaUpToRootExclusive = firstOverlapDelta-firstOverlap.delta;
|
||||
|
||||
@@ -68,7 +68,6 @@ public class OSProcessHandler extends BaseOSProcessHandler {
|
||||
/**
|
||||
* Kill whole process tree.
|
||||
* @param process Process
|
||||
* @param forceKill If failed to kill process tree - try to kill it using Java API
|
||||
* @return True if process tree has been successfully killed.
|
||||
*/
|
||||
protected boolean killProcessTree(final Process process) {
|
||||
|
||||
+17
-15
@@ -19,11 +19,11 @@
|
||||
*/
|
||||
package com.intellij.openapi.vfs.newvfs;
|
||||
|
||||
import com.intellij.openapi.util.io.FileUtil;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.openapi.vfs.VirtualFileListener;
|
||||
import com.intellij.openapi.vfs.VirtualFileManager;
|
||||
import com.intellij.openapi.vfs.VirtualFileSystem;
|
||||
import org.intellij.lang.annotations.MagicConstant;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -45,10 +45,12 @@ public abstract class NewVirtualFileSystem extends VirtualFileSystem implements
|
||||
return path;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void refreshWithoutFileWatcher(final boolean asynchronous) {
|
||||
refresh(asynchronous);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isReadOnly() {
|
||||
return true;
|
||||
}
|
||||
@@ -70,6 +72,7 @@ public abstract class NewVirtualFileSystem extends VirtualFileSystem implements
|
||||
|
||||
protected abstract String extractRootPath(@NotNull String path);
|
||||
|
||||
@Override
|
||||
public void addVirtualFileListener(@NotNull final VirtualFileListener listener) {
|
||||
synchronized (myListenerWrappers) {
|
||||
VirtualFileListener wrapper = new VirtualFileFilteringListener(listener, this);
|
||||
@@ -78,6 +81,7 @@ public abstract class NewVirtualFileSystem extends VirtualFileSystem implements
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeVirtualFileListener(@NotNull final VirtualFileListener listener) {
|
||||
synchronized (myListenerWrappers) {
|
||||
final VirtualFileListener wrapper = myListenerWrappers.remove(listener);
|
||||
@@ -89,12 +93,18 @@ public abstract class NewVirtualFileSystem extends VirtualFileSystem implements
|
||||
|
||||
public abstract int getRank();
|
||||
|
||||
@Override
|
||||
public abstract VirtualFile copyFile(final Object requestor, @NotNull final VirtualFile file, @NotNull final VirtualFile newParent, @NotNull final String copyName) throws IOException;
|
||||
@Override
|
||||
@NotNull
|
||||
public abstract VirtualFile createChildDirectory(final Object requestor, @NotNull final VirtualFile parent, @NotNull final String dir) throws IOException;
|
||||
@Override
|
||||
public abstract VirtualFile createChildFile(final Object requestor, @NotNull final VirtualFile parent, @NotNull final String file) throws IOException;
|
||||
@Override
|
||||
public abstract void deleteFile(final Object requestor, @NotNull final VirtualFile file) throws IOException;
|
||||
@Override
|
||||
public abstract void moveFile(final Object requestor, @NotNull final VirtualFile file, @NotNull final VirtualFile newParent) throws IOException;
|
||||
@Override
|
||||
public abstract void renameFile(final Object requestor, @NotNull final VirtualFile file, @NotNull final String newName) throws IOException;
|
||||
|
||||
public boolean markNewFilesAsDirty() {
|
||||
@@ -105,14 +115,6 @@ public abstract class NewVirtualFileSystem extends VirtualFileSystem implements
|
||||
return file.getName();
|
||||
}
|
||||
|
||||
public static final int BA_EXISTS = 0x01;
|
||||
public static final int BA_REGULAR = 0x02;
|
||||
public static final int BA_DIRECTORY = 0x04;
|
||||
public static final int BA_HIDDEN = 0x08;
|
||||
|
||||
@MagicConstant(flags = {BA_EXISTS, BA_REGULAR, BA_DIRECTORY, BA_HIDDEN})
|
||||
public @interface FileBooleanAttributes {}
|
||||
|
||||
/**
|
||||
* Queries the file about several attributes at once, and returns them ORed together.
|
||||
* This method is typically faster than several methods calls querying corresponding file attributes one by one.
|
||||
@@ -122,10 +124,10 @@ public abstract class NewVirtualFileSystem extends VirtualFileSystem implements
|
||||
* Each attribute is an int constant from this class.
|
||||
* Following attributes are defined:
|
||||
* <ul>
|
||||
* <li>{@link #BA_EXISTS} is set if {@link java.io.File#exists()} returns true</li>
|
||||
* <li>{@link #BA_DIRECTORY} is set if {@link java.io.File#isDirectory()} returns true</li>
|
||||
* <li>{@link #BA_HIDDEN} is set if {@link java.io.File#isHidden()} returns true</li>
|
||||
* <li>{@link #BA_REGULAR} is set if {@link java.io.File#isFile()} returns true</li>
|
||||
* <li>{@link com.intellij.openapi.util.io.FileUtil#BA_EXISTS} is set if {@link java.io.File#exists()} returns true</li>
|
||||
* <li>{@link com.intellij.openapi.util.io.FileUtil#BA_DIRECTORY} is set if {@link java.io.File#isDirectory()} returns true</li>
|
||||
* <li>{@link com.intellij.openapi.util.io.FileUtil#BA_HIDDEN} is set if {@link java.io.File#isHidden()} returns true</li>
|
||||
* <li>{@link com.intellij.openapi.util.io.FileUtil#BA_REGULAR} is set if {@link java.io.File#isFile()} returns true</li>
|
||||
* </ul>
|
||||
* Attributes can be bitwise ORed together to query several file attributes at once.
|
||||
* <code>-1</code> as an argument value will query all attributes.
|
||||
@@ -146,6 +148,6 @@ public abstract class NewVirtualFileSystem extends VirtualFileSystem implements
|
||||
* boolean isDirectory = (attributes & BA_DIRECTORY) != 0;
|
||||
* }}</pre>
|
||||
*/
|
||||
@FileBooleanAttributes
|
||||
public abstract int getBooleanAttributes(@NotNull final VirtualFile file, @FileBooleanAttributes int flags);
|
||||
@FileUtil.FileBooleanAttributes
|
||||
public abstract int getBooleanAttributes(@NotNull final VirtualFile file, @FileUtil.FileBooleanAttributes int flags);
|
||||
}
|
||||
|
||||
@@ -46,10 +46,10 @@ public class MergingUpdateQueue implements Runnable, Disposable, Activatable {
|
||||
|
||||
private volatile boolean myFlushing;
|
||||
|
||||
private String myName;
|
||||
private final String myName;
|
||||
private int myMergingTimeSpan;
|
||||
private JComponent myModalityStateComponent;
|
||||
private boolean myExecuteInDispatchThread;
|
||||
private final boolean myExecuteInDispatchThread;
|
||||
private boolean myPassThrough;
|
||||
private boolean myDisposed;
|
||||
|
||||
@@ -163,6 +163,7 @@ public class MergingUpdateQueue implements Runnable, Disposable, Activatable {
|
||||
restartTimer();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void hideNotify() {
|
||||
if (!myActive) {
|
||||
return;
|
||||
@@ -175,6 +176,7 @@ public class MergingUpdateQueue implements Runnable, Disposable, Activatable {
|
||||
clearWaiter();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showNotify() {
|
||||
if (myActive) {
|
||||
return;
|
||||
@@ -202,6 +204,7 @@ public class MergingUpdateQueue implements Runnable, Disposable, Activatable {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
if (mySuspended) return;
|
||||
flush();
|
||||
@@ -227,6 +230,7 @@ public class MergingUpdateQueue implements Runnable, Disposable, Activatable {
|
||||
|
||||
myFlushing = true;
|
||||
final Runnable toRun = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
final Update[] all;
|
||||
@@ -289,6 +293,7 @@ public class MergingUpdateQueue implements Runnable, Disposable, Activatable {
|
||||
|
||||
if (each.executeInWriteAction()) {
|
||||
ApplicationManager.getApplication().runWriteAction(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
execute(each);
|
||||
}
|
||||
@@ -381,6 +386,7 @@ public class MergingUpdateQueue implements Runnable, Disposable, Activatable {
|
||||
return myActive;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dispose() {
|
||||
myDisposed = true;
|
||||
myActive = false;
|
||||
|
||||
@@ -130,7 +130,9 @@ public class IdeTooltipManager implements ApplicationComponent, AWTEventListener
|
||||
hideCurrent(me, null, null);
|
||||
}
|
||||
} else if (me.getID() == MouseEvent.MOUSE_MOVED) {
|
||||
if (me.getComponent() == myCurrentComponent || me.getComponent() == myQueuedComponent) {
|
||||
if (c instanceof JComponent && ((JComponent)c).getToolTipText(me) == null) {
|
||||
hideCurrent(me, null, null);//There is no tooltip here, let's proceed it as MOUSE_EXITED
|
||||
} else if (me.getComponent() == myCurrentComponent || me.getComponent() == myQueuedComponent) {
|
||||
if (myCurrentTipUi != null && myCurrentTipUi.wasFadedIn()) {
|
||||
if (hideCurrent(me, null, null)) {
|
||||
maybeShowFor(c, me);
|
||||
@@ -174,6 +176,17 @@ public class IdeTooltipManager implements ApplicationComponent, AWTEventListener
|
||||
boolean centerStrict = Boolean.TRUE.equals(comp.getClientProperty(UIUtil.CENTER_TOOLTIP_STRICT));
|
||||
int shift = centerStrict ? 0 : (centerDefault ? 4 : 0);
|
||||
|
||||
// Balloon may appear exactly above useful content, such behavior is rather annoying.
|
||||
if (c instanceof JTree) {
|
||||
javax.swing.tree.TreePath path = ((JTree)c).getClosestPathForLocation(me.getX(), me.getY());
|
||||
if (path != null) {
|
||||
Rectangle pathBounds = ((JTree)c).getPathBounds(path);
|
||||
if (pathBounds != null && pathBounds.y + 4 < me.getY()) {
|
||||
shift += me.getY() - pathBounds.y - 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
queueShow(comp, me, centerStrict || centerDefault, shift, -shift, -shift);
|
||||
}
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@ package com.intellij.openapi.vfs.ex.temp;
|
||||
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.util.io.BufferExposingByteArrayInputStream;
|
||||
import com.intellij.openapi.util.io.FileUtil;
|
||||
import com.intellij.openapi.vfs.VfsUtilCore;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.openapi.vfs.newvfs.ManagingFS;
|
||||
@@ -369,9 +370,9 @@ public class TempFileSystem extends NewVirtualFileSystem {
|
||||
@Override
|
||||
public int getBooleanAttributes(@NotNull VirtualFile file, int flags) {
|
||||
FSItem item = convert(file);
|
||||
int isDir = item instanceof FSDir ? BA_DIRECTORY : 0;
|
||||
int exists = item == null ? 0 : BA_EXISTS;
|
||||
int regular = isDir == 0 ? BA_REGULAR : 0;
|
||||
int isDir = item instanceof FSDir ? FileUtil.BA_DIRECTORY : 0;
|
||||
int exists = item == null ? 0 : FileUtil.BA_EXISTS;
|
||||
int regular = isDir == 0 ? FileUtil.BA_REGULAR : 0;
|
||||
return isDir | exists | regular;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -368,16 +368,16 @@ public class JarFileSystemImpl extends JarFileSystem implements ApplicationCompo
|
||||
public int getBooleanAttributes(@NotNull VirtualFile file, int flags) {
|
||||
int exists = 0;
|
||||
JarHandler handler = getHandler(file);
|
||||
if ((flags & BA_EXISTS) != 0) {
|
||||
exists = handler.exists(file) ? BA_EXISTS : 0;
|
||||
if ((flags & FileUtil.BA_EXISTS) != 0) {
|
||||
exists = handler.exists(file) ? FileUtil.BA_EXISTS : 0;
|
||||
}
|
||||
int isDir = 0;
|
||||
if ((flags & BA_DIRECTORY) != 0) {
|
||||
isDir = handler.isDirectory(file) ? BA_DIRECTORY : 0;
|
||||
if ((flags & FileUtil.BA_DIRECTORY) != 0) {
|
||||
isDir = handler.isDirectory(file) ? FileUtil.BA_DIRECTORY : 0;
|
||||
}
|
||||
int regular = 0;
|
||||
if ((flags & BA_REGULAR) != 0) {
|
||||
regular = isDir == 0 ? BA_REGULAR : 0;
|
||||
if ((flags & FileUtil.BA_REGULAR) != 0) {
|
||||
regular = isDir == 0 ? FileUtil.BA_REGULAR : 0;
|
||||
}
|
||||
return exists | isDir | regular;
|
||||
}
|
||||
|
||||
+9
-56
@@ -35,12 +35,10 @@ import com.intellij.util.Processor;
|
||||
import com.intellij.util.ThrowableConsumer;
|
||||
import com.intellij.util.io.SafeFileOutputStream;
|
||||
import com.intellij.util.io.fs.IFile;
|
||||
import org.intellij.lang.annotations.MagicConstant;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.io.*;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
@@ -137,44 +135,13 @@ public abstract class LocalFileSystemBase extends LocalFileSystem {
|
||||
return new File(path);
|
||||
}
|
||||
|
||||
private static final Method JAVA_IO_FILESYSTEM_GET_BOOLEAN_ATTRIBUTES_METHOD;
|
||||
private static final Object/* java.io.FileSystem */ JAVA_IO_FILESYSTEM;
|
||||
// copied from FileSystem
|
||||
|
||||
static {
|
||||
Object fs;
|
||||
Method getBooleanAttributes;
|
||||
try {
|
||||
Class<?> fsClass = Class.forName("java.io.FileSystem");
|
||||
Method getFileSystem = fsClass.getMethod("getFileSystem");
|
||||
getFileSystem.setAccessible(true);
|
||||
fs = getFileSystem.invoke(null);
|
||||
getBooleanAttributes = fsClass.getDeclaredMethod("getBooleanAttributes", File.class);
|
||||
if (fs == null || getBooleanAttributes == null) {
|
||||
fs = null;
|
||||
getBooleanAttributes = null;
|
||||
}
|
||||
else {
|
||||
getBooleanAttributes.setAccessible(true);
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
fs = null;
|
||||
getBooleanAttributes = null;
|
||||
}
|
||||
JAVA_IO_FILESYSTEM = fs;
|
||||
JAVA_IO_FILESYSTEM_GET_BOOLEAN_ATTRIBUTES_METHOD = getBooleanAttributes;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@NotNull
|
||||
private static File convertToIOFileAndCheck(@NotNull final VirtualFile file) throws FileNotFoundException {
|
||||
final File ioFile = convertToIOFile(file);
|
||||
|
||||
int intFlags = getBooleanAttributes(ioFile);
|
||||
int intFlags = FileUtil.getBooleanAttributes(ioFile);
|
||||
if (intFlags != -1) {
|
||||
if ((intFlags & BA_EXISTS) != 0 && (intFlags & BA_REGULAR) == 0) {
|
||||
if ((intFlags & FileUtil.BA_EXISTS) != 0 && (intFlags & FileUtil.BA_REGULAR) == 0) {
|
||||
throw new FileNotFoundException("Not a file: " + ioFile);
|
||||
}
|
||||
return ioFile;
|
||||
@@ -186,20 +153,6 @@ public abstract class LocalFileSystemBase extends LocalFileSystem {
|
||||
return ioFile;
|
||||
}
|
||||
|
||||
// todo[r.sh] use NIO2 API after migration to JDK 7
|
||||
// returns -1 if could not get attributes
|
||||
@MagicConstant(flags = {BA_EXISTS, BA_REGULAR, BA_DIRECTORY, BA_HIDDEN})
|
||||
private static int getBooleanAttributes(@NotNull File f) {
|
||||
if (JAVA_IO_FILESYSTEM_GET_BOOLEAN_ATTRIBUTES_METHOD != null) {
|
||||
try {
|
||||
Object flags = JAVA_IO_FILESYSTEM_GET_BOOLEAN_ATTRIBUTES_METHOD.invoke(JAVA_IO_FILESYSTEM, f);
|
||||
return ((Integer)flags).intValue();
|
||||
}
|
||||
catch (Exception ignored) { }
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean exists(@NotNull final VirtualFile fileOrDirectory) {
|
||||
String path = fileOrDirectory.getPath();
|
||||
@@ -246,9 +199,9 @@ public abstract class LocalFileSystemBase extends LocalFileSystem {
|
||||
}
|
||||
|
||||
private static boolean isSpecialFile(@NotNull File ioFile) {
|
||||
int flags = getBooleanAttributes(ioFile);
|
||||
int flags = FileUtil.getBooleanAttributes(ioFile);
|
||||
if (flags != -1) {
|
||||
return (flags & (BA_REGULAR | BA_DIRECTORY | BA_EXISTS)) == (~BA_REGULAR & ~BA_DIRECTORY & BA_EXISTS);
|
||||
return (flags & (FileUtil.BA_REGULAR | FileUtil.BA_DIRECTORY | FileUtil.BA_EXISTS)) == (~FileUtil.BA_REGULAR & ~FileUtil.BA_DIRECTORY & FileUtil.BA_EXISTS);
|
||||
}
|
||||
return !ioFile.isFile() && !ioFile.isDirectory() && ioFile.exists();
|
||||
}
|
||||
@@ -774,12 +727,12 @@ public abstract class LocalFileSystemBase extends LocalFileSystem {
|
||||
|
||||
@Override
|
||||
public int getBooleanAttributes(@NotNull VirtualFile file, int flags) {
|
||||
int attributes = getBooleanAttributes(convertToIOFile(file));
|
||||
int attributes = FileUtil.getBooleanAttributes(convertToIOFile(file));
|
||||
if (attributes != -1) return attributes & flags;
|
||||
return ((flags & BA_EXISTS) != 0 && exists(file) ? BA_EXISTS : 0) |
|
||||
((flags & BA_DIRECTORY) != 0 && isDirectory(file) ? BA_DIRECTORY : 0) |
|
||||
((flags & BA_REGULAR) != 0 && !isSpecialFile(file) ? BA_REGULAR : 0) |
|
||||
((flags & BA_HIDDEN) != 0 && convertToIOFile(file).isHidden() ? BA_HIDDEN : 0)
|
||||
return ((flags & FileUtil.BA_EXISTS) != 0 && exists(file) ? FileUtil.BA_EXISTS : 0) |
|
||||
((flags & FileUtil.BA_DIRECTORY) != 0 && isDirectory(file) ? FileUtil.BA_DIRECTORY : 0) |
|
||||
((flags & FileUtil.BA_REGULAR) != 0 && !isSpecialFile(file) ? FileUtil.BA_REGULAR : 0) |
|
||||
((flags & FileUtil.BA_HIDDEN) != 0 && convertToIOFile(file).isHidden() ? FileUtil.BA_HIDDEN : 0)
|
||||
;
|
||||
}
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
*/
|
||||
package com.intellij.openapi.vfs.impl.win32;
|
||||
|
||||
import com.intellij.openapi.vfs.newvfs.NewVirtualFileSystem;
|
||||
import com.intellij.openapi.util.io.FileUtil;
|
||||
import com.intellij.util.ArrayUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -109,21 +109,21 @@ public class Win32Kernel {
|
||||
return info;
|
||||
}
|
||||
|
||||
@NewVirtualFileSystem.FileBooleanAttributes
|
||||
public int getBooleanAttributes(@NotNull String path, @NewVirtualFileSystem.FileBooleanAttributes int flags) {
|
||||
@FileUtil.FileBooleanAttributes
|
||||
public int getBooleanAttributes(@NotNull String path, @FileUtil.FileBooleanAttributes int flags) {
|
||||
FileInfo info = doGetInfo(path);
|
||||
int result = 0;
|
||||
if ((flags & NewVirtualFileSystem.BA_EXISTS) != 0) {
|
||||
result |= info == null ? 0 : NewVirtualFileSystem.BA_EXISTS;
|
||||
if ((flags & FileUtil.BA_EXISTS) != 0) {
|
||||
result |= info == null ? 0 : FileUtil.BA_EXISTS;
|
||||
}
|
||||
if ((flags & NewVirtualFileSystem.BA_DIRECTORY) != 0) {
|
||||
result |= info == null || (info.attributes & FILE_ATTRIBUTE_DIRECTORY) == 0 ? 0 : NewVirtualFileSystem.BA_DIRECTORY;
|
||||
if ((flags & FileUtil.BA_DIRECTORY) != 0) {
|
||||
result |= info == null || (info.attributes & FILE_ATTRIBUTE_DIRECTORY) == 0 ? 0 : FileUtil.BA_DIRECTORY;
|
||||
}
|
||||
if ((flags & NewVirtualFileSystem.BA_REGULAR) != 0) {
|
||||
result |= info == null || (info.attributes & (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_DEVICE | FILE_ATTRIBUTE_REPARSE_POINT)) != 0 ? 0 : NewVirtualFileSystem.BA_REGULAR;
|
||||
if ((flags & FileUtil.BA_REGULAR) != 0) {
|
||||
result |= info == null || (info.attributes & (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_DEVICE | FILE_ATTRIBUTE_REPARSE_POINT)) != 0 ? 0 : FileUtil.BA_REGULAR;
|
||||
}
|
||||
if ((flags & NewVirtualFileSystem.BA_HIDDEN) != 0) {
|
||||
result |= info == null || (info.attributes & FILE_ATTRIBUTE_HIDDEN) == 0 ? 0 : NewVirtualFileSystem.BA_HIDDEN;
|
||||
if ((flags & FileUtil.BA_HIDDEN) != 0) {
|
||||
result |= info == null || (info.attributes & FILE_ATTRIBUTE_HIDDEN) == 0 ? 0 : FileUtil.BA_HIDDEN;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
+3
-3
@@ -321,10 +321,10 @@ public class VirtualDirectoryImpl extends VirtualFileSystemEntry {
|
||||
private VirtualFileSystemEntry createAndFindChildWithEventFire(@NotNull String name) {
|
||||
final NewVirtualFileSystem delegate = getFileSystem();
|
||||
VirtualFile fake = new FakeVirtualFile(this, name);
|
||||
int attributes = delegate.getBooleanAttributes(fake, NewVirtualFileSystem.BA_EXISTS | NewVirtualFileSystem.BA_DIRECTORY);
|
||||
if ((attributes & NewVirtualFileSystem.BA_EXISTS) != 0) {
|
||||
int attributes = delegate.getBooleanAttributes(fake, FileUtil.BA_EXISTS | FileUtil.BA_DIRECTORY);
|
||||
if ((attributes & FileUtil.BA_EXISTS) != 0) {
|
||||
final String realName = delegate.getCanonicallyCasedName(fake);
|
||||
boolean isDir = (attributes & NewVirtualFileSystem.BA_DIRECTORY) != 0;
|
||||
boolean isDir = (attributes & FileUtil.BA_DIRECTORY) != 0;
|
||||
VFileCreateEvent event = new VFileCreateEvent(null, this, realName, isDir, true);
|
||||
RefreshQueue.getInstance().processSingleEvent(event);
|
||||
return findChild(realName);
|
||||
|
||||
+1
-1
@@ -145,7 +145,7 @@ public abstract class VirtualFileSystemEntry extends NewVirtualFile {
|
||||
return pattern.regionMatches(ignoreCase, length, suffix, 0, suffix.length());
|
||||
}
|
||||
|
||||
private Object rawName() {
|
||||
protected Object rawName() {
|
||||
return myName;
|
||||
}
|
||||
|
||||
|
||||
+42
-24
@@ -292,7 +292,7 @@ public class PersistentFS extends ManagingFS implements ApplicationComponent {
|
||||
final int parentId,
|
||||
@NotNull VirtualFile file,
|
||||
@NotNull NewVirtualFileSystem delegate,
|
||||
@NewVirtualFileSystem.FileBooleanAttributes int attributes) {
|
||||
@FileUtil.FileBooleanAttributes int attributes) {
|
||||
String name = file.getName();
|
||||
|
||||
if (!name.isEmpty() && namesEqual(delegate, name, FSRecords.getName(id))) return false; // TODO: Handle root attributes change.
|
||||
@@ -308,11 +308,11 @@ public class PersistentFS extends ManagingFS implements ApplicationComponent {
|
||||
|
||||
FSRecords.setTimestamp(id, delegate.getTimeStamp(file));
|
||||
|
||||
boolean isDir = (attributes & NewVirtualFileSystem.BA_DIRECTORY) != 0;
|
||||
boolean isDir = (attributes & FileUtil.BA_DIRECTORY) != 0;
|
||||
FSRecords.setLength(id, isDir ? -1L : delegate.getLength(file));
|
||||
|
||||
boolean isSpecial = (attributes & (NewVirtualFileSystem.BA_REGULAR | NewVirtualFileSystem.BA_DIRECTORY | NewVirtualFileSystem.BA_EXISTS)) ==
|
||||
NewVirtualFileSystem.BA_EXISTS;
|
||||
boolean isSpecial = (attributes & (FileUtil.BA_REGULAR | FileUtil.BA_DIRECTORY | FileUtil.BA_EXISTS)) ==
|
||||
FileUtil.BA_EXISTS;
|
||||
FSRecords.setFlags(id, (isDir ? IS_DIRECTORY_FLAG : 0) |
|
||||
(delegate.isWritable(file) ? 0 : IS_READ_ONLY) |
|
||||
(delegate.isSymLink(file) ? IS_SYMLINK : 0) |
|
||||
@@ -408,7 +408,7 @@ public class PersistentFS extends ManagingFS implements ApplicationComponent {
|
||||
|
||||
VirtualFile fake = new FakeVirtualFile(parent, childName);
|
||||
int attributes = delegate.getBooleanAttributes(fake, -1);
|
||||
if ((attributes & NewVirtualFileSystem.BA_EXISTS) != 0) {
|
||||
if ((attributes & FileUtil.BA_EXISTS) != 0) {
|
||||
int child = createAndCopyRecord(delegate, fake, parentId, attributes);
|
||||
FSRecords.updateList(parentId, ArrayUtil.append(children, child));
|
||||
return child;
|
||||
@@ -673,6 +673,7 @@ public class PersistentFS extends ManagingFS implements ApplicationComponent {
|
||||
}
|
||||
};
|
||||
|
||||
@NotNull
|
||||
private static List<? extends VFileEvent> validateEvents(@NotNull List<? extends VFileEvent> events) {
|
||||
final List<EventWrapper> deletionEvents = Lists.newArrayList();
|
||||
for (int i = 0, size = events.size(); i < size; i++) {
|
||||
@@ -756,25 +757,22 @@ public class PersistentFS extends ManagingFS implements ApplicationComponent {
|
||||
};
|
||||
}
|
||||
else {
|
||||
root = new VirtualDirectoryImpl(basePath, null, fs, rootId) {
|
||||
@NotNull
|
||||
@Override
|
||||
public String getName() {
|
||||
final String name = super.getName();
|
||||
|
||||
// TODO: HACK!!! Get to simpler solution.
|
||||
if (getFileSystem() instanceof JarFileSystem) {
|
||||
String jarName = name.substring(0, name.length() - JarFileSystem.JAR_SEPARATOR.length());
|
||||
return jarName.substring(jarName.lastIndexOf('/') + 1);
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
};
|
||||
if (fs instanceof JarFileSystem) {
|
||||
// optimization: for jar roots do not store base path in the myName field, use local FS file's getPath()
|
||||
String parentPath = basePath.substring(0, basePath.indexOf(JarFileSystem.JAR_SEPARATOR));
|
||||
final VirtualFile parentLocalFile = LocalFileSystem.getInstance().findFileByPath(parentPath);
|
||||
if (parentLocalFile == null) return null;
|
||||
root = new JarRoot(fs, rootId, parentLocalFile);
|
||||
}
|
||||
else {
|
||||
root = new VirtualDirectoryImpl(basePath, null, fs, rootId);
|
||||
}
|
||||
}
|
||||
if (!fs.exists(root)) {
|
||||
return null;
|
||||
}
|
||||
if (!fs.exists(root)) return null;
|
||||
|
||||
int attributes = NewVirtualFileSystem.BA_DIRECTORY | NewVirtualFileSystem.BA_EXISTS;
|
||||
int attributes = FileUtil.BA_DIRECTORY | FileUtil.BA_EXISTS;
|
||||
boolean newRoot = copyRecordFromDelegateFS(rootId, 0, root, fs, attributes);
|
||||
if (!newRoot) {
|
||||
if (fs.getTimeStamp(root) != FSRecords.getTimestamp(rootId)) {
|
||||
@@ -964,7 +962,7 @@ public class PersistentFS extends ManagingFS implements ApplicationComponent {
|
||||
final NewVirtualFileSystem delegate = getDelegate(parent);
|
||||
VirtualFile fake = new FakeVirtualFile(parent, name);
|
||||
int attributes = delegate.getBooleanAttributes(fake, -1);
|
||||
if ((attributes & NewVirtualFileSystem.BA_EXISTS) != 0) {
|
||||
if ((attributes & FileUtil.BA_EXISTS) != 0) {
|
||||
final int parentId = getFileId(parent);
|
||||
int childId = createAndCopyRecord(delegate, fake, parentId, attributes);
|
||||
appendIdToParentList(parentId, childId);
|
||||
@@ -973,7 +971,7 @@ public class PersistentFS extends ManagingFS implements ApplicationComponent {
|
||||
}
|
||||
}
|
||||
|
||||
private static int createAndCopyRecord(@NotNull NewVirtualFileSystem delegateSystem, @NotNull VirtualFile delegateFile, int parentId, @NewVirtualFileSystem.FileBooleanAttributes int attributes) {
|
||||
private static int createAndCopyRecord(@NotNull NewVirtualFileSystem delegateSystem, @NotNull VirtualFile delegateFile, int parentId, @FileUtil.FileBooleanAttributes int attributes) {
|
||||
int childId = FSRecords.createRecord();
|
||||
copyRecordFromDelegateFS(childId, parentId, delegateFile, delegateSystem, attributes);
|
||||
return childId;
|
||||
@@ -1140,4 +1138,24 @@ public class PersistentFS extends ManagingFS implements ApplicationComponent {
|
||||
}
|
||||
return delegate;
|
||||
}
|
||||
|
||||
private static class JarRoot extends VirtualDirectoryImpl {
|
||||
private final VirtualFile myParentLocalFile;
|
||||
|
||||
public JarRoot(@NotNull NewVirtualFileSystem fs, int rootId, @NotNull VirtualFile parentLocalFile) {
|
||||
super("", null, fs, rootId);
|
||||
myParentLocalFile = parentLocalFile;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public String getName() {
|
||||
return myParentLocalFile.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Object rawName() {
|
||||
return myParentLocalFile.getPath() + JarFileSystem.JAR_SEPARATOR;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+12
-13
@@ -17,6 +17,7 @@ package com.intellij.openapi.vfs.newvfs.persistent;
|
||||
|
||||
import com.intellij.openapi.util.Comparing;
|
||||
import com.intellij.openapi.util.SystemInfo;
|
||||
import com.intellij.openapi.util.io.FileUtil;
|
||||
import com.intellij.openapi.vfs.VfsUtil;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.openapi.vfs.newvfs.ManagingFS;
|
||||
@@ -32,8 +33,6 @@ import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import static com.intellij.openapi.vfs.newvfs.NewVirtualFileSystem.*;
|
||||
|
||||
/**
|
||||
* @author max
|
||||
*/
|
||||
@@ -53,14 +52,14 @@ public class RefreshWorker {
|
||||
public void scan() {
|
||||
final NewVirtualFile root = (NewVirtualFile)myRefreshRoot;
|
||||
NewVirtualFileSystem delegate = root.getFileSystem();
|
||||
final int rootAttributes = delegate.getBooleanAttributes(root, BA_EXISTS | BA_DIRECTORY);
|
||||
final int rootAttributes = delegate.getBooleanAttributes(root, FileUtil.BA_EXISTS | FileUtil.BA_DIRECTORY);
|
||||
|
||||
if (root.isDirty() && (rootAttributes & BA_EXISTS) == 0) {
|
||||
if (root.isDirty() && (rootAttributes & FileUtil.BA_EXISTS) == 0) {
|
||||
scheduleDeletion(root);
|
||||
root.markClean();
|
||||
}
|
||||
else {
|
||||
if ((rootAttributes & BA_DIRECTORY) != 0) {
|
||||
if ((rootAttributes & FileUtil.BA_DIRECTORY) != 0) {
|
||||
delegate = PersistentFS.replaceWithNativeFS(delegate);
|
||||
}
|
||||
|
||||
@@ -106,7 +105,7 @@ public class RefreshWorker {
|
||||
else {
|
||||
for (VirtualFile child : file.getCachedChildren()) {
|
||||
final int childAttributes = delegate.getBooleanAttributes(child, -1);
|
||||
if ((childAttributes & BA_EXISTS) != 0) {
|
||||
if ((childAttributes & FileUtil.BA_EXISTS) != 0) {
|
||||
scheduleChildRefresh(file, child, delegate, childAttributes);
|
||||
}
|
||||
else {
|
||||
@@ -119,9 +118,9 @@ public class RefreshWorker {
|
||||
if (name.isEmpty()) continue;
|
||||
|
||||
final VirtualFile fake = new FakeVirtualFile(file, name);
|
||||
final int attributes = delegate.getBooleanAttributes(fake, BA_EXISTS | BA_DIRECTORY);
|
||||
if ((attributes & BA_EXISTS) != 0) {
|
||||
final boolean isDir = (attributes & BA_DIRECTORY) != 0;
|
||||
final int attributes = delegate.getBooleanAttributes(fake, FileUtil.BA_EXISTS | FileUtil.BA_DIRECTORY);
|
||||
if ((attributes & FileUtil.BA_EXISTS) != 0) {
|
||||
final boolean isDir = (attributes & FileUtil.BA_DIRECTORY) != 0;
|
||||
scheduleCreation(file, name, isDir);
|
||||
}
|
||||
}
|
||||
@@ -150,20 +149,20 @@ public class RefreshWorker {
|
||||
}
|
||||
}
|
||||
|
||||
private static final int SPECIAL_MASK = BA_REGULAR | BA_DIRECTORY | BA_EXISTS;
|
||||
private static final int SPECIAL_MASK = FileUtil.BA_REGULAR | FileUtil.BA_DIRECTORY | FileUtil.BA_EXISTS;
|
||||
|
||||
// todo[r.sh] compare link targets for files too
|
||||
private void scheduleChildRefresh(@NotNull VirtualFileSystemEntry parent,
|
||||
@NotNull VirtualFile child,
|
||||
@NotNull NewVirtualFileSystem delegate,
|
||||
@FileBooleanAttributes int childAttributes) {
|
||||
@FileUtil.FileBooleanAttributes int childAttributes) {
|
||||
final boolean currentIsDirectory = child.isDirectory();
|
||||
final boolean currentIsSymlink = child.isSymLink();
|
||||
final boolean currentIsSpecial = child.isSpecialFile();
|
||||
final String currentLinkTarget = child instanceof SymlinkDirectory ? ((SymlinkDirectory)child).getTargetPath() : null;
|
||||
final boolean upToDateIsDirectory = (childAttributes & BA_DIRECTORY) != 0;
|
||||
final boolean upToDateIsDirectory = (childAttributes & FileUtil.BA_DIRECTORY) != 0;
|
||||
final boolean upToDateIsSymlink = delegate.isSymLink(child);
|
||||
final boolean upToDateIsSpecial = (childAttributes & SPECIAL_MASK) == BA_EXISTS;
|
||||
final boolean upToDateIsSpecial = (childAttributes & SPECIAL_MASK) == FileUtil.BA_EXISTS;
|
||||
final String upToDateLinkTarget = currentLinkTarget != null ? delegate.resolveSymLink(child) : null;
|
||||
|
||||
if (currentIsDirectory != upToDateIsDirectory ||
|
||||
|
||||
@@ -51,19 +51,23 @@ public class BaseOSProcessHandler extends ProcessHandler {
|
||||
return ExecutorServiceHolder.ourThreadExecutorsService.submit(task);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Process getProcess() {
|
||||
return myProcess;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startNotify() {
|
||||
if (myCommandLine != null) {
|
||||
notifyTextAvailable(myCommandLine + '\n', ProcessOutputTypes.SYSTEM);
|
||||
}
|
||||
|
||||
addProcessListener(new ProcessAdapter() {
|
||||
@Override
|
||||
public void startNotified(final ProcessEvent event) {
|
||||
try {
|
||||
final OutputReader stdoutReader = new OutputReader(createProcessOutReader()) {
|
||||
@Override
|
||||
protected void onTextAvailable(@NotNull String text) {
|
||||
notifyTextAvailable(text, ProcessOutputTypes.STDOUT);
|
||||
}
|
||||
@@ -75,6 +79,7 @@ public class BaseOSProcessHandler extends ProcessHandler {
|
||||
};
|
||||
|
||||
final OutputReader stderrReader = new OutputReader(createProcessErrReader()) {
|
||||
@Override
|
||||
protected void onTextAvailable(@NotNull String text) {
|
||||
notifyTextAvailable(text, ProcessOutputTypes.STDERR);
|
||||
}
|
||||
@@ -135,6 +140,7 @@ public class BaseOSProcessHandler extends ProcessHandler {
|
||||
return new InputStreamReader(streamToRead, charset);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void destroyProcessImpl() {
|
||||
try {
|
||||
closeStreams();
|
||||
@@ -148,8 +154,10 @@ public class BaseOSProcessHandler extends ProcessHandler {
|
||||
getProcess().destroy();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void detachProcessImpl() {
|
||||
final Runnable runnable = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
closeStreams();
|
||||
|
||||
@@ -170,10 +178,12 @@ public class BaseOSProcessHandler extends ProcessHandler {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean detachIsDefault() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public OutputStream getProcessInput() {
|
||||
return myProcess.getOutputStream();
|
||||
}
|
||||
@@ -194,6 +204,7 @@ public class BaseOSProcessHandler extends ProcessHandler {
|
||||
|
||||
private static ThreadPoolExecutor createServiceImpl() {
|
||||
return new ThreadPoolExecutor(10, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(), new ThreadFactory() {
|
||||
@Override
|
||||
@SuppressWarnings({"HardCodedStringLiteral"})
|
||||
public Thread newThread(Runnable r) {
|
||||
return new Thread(r, "OSProcessHandler pooled thread");
|
||||
@@ -213,6 +224,7 @@ public class BaseOSProcessHandler extends ProcessHandler {
|
||||
|
||||
public ProcessWaitFor(final Process process) {
|
||||
myWaitForThreadFuture = executeOnPooledThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
int exitCode = 0;
|
||||
try {
|
||||
|
||||
@@ -28,6 +28,7 @@ import com.intellij.util.SystemProperties;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.containers.Stack;
|
||||
import com.intellij.util.io.URLUtil;
|
||||
import org.intellij.lang.annotations.MagicConstant;
|
||||
import org.intellij.lang.annotations.RegExp;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -57,6 +58,8 @@ public class FileUtil {
|
||||
private static final long CHANNELS_COPYING_LIMIT = 5L * MEGABYTE;
|
||||
private static String ourCanonicalTempPathCache = null;
|
||||
private static final int MAX_FILE_DELETE_ATTEMPTS = 10;
|
||||
public static final Method JAVA_IO_FILESYSTEM_GET_BOOLEAN_ATTRIBUTES_METHOD;
|
||||
public static final Object/* java.io.FileSystem */ JAVA_IO_FILESYSTEM;
|
||||
|
||||
@Nullable
|
||||
public static String getRelativePath(File base, File file) {
|
||||
@@ -613,7 +616,10 @@ public class FileUtil {
|
||||
String parentDirPath = file.getParent();
|
||||
if (parentDirPath != null) {
|
||||
final File parentFile = new File(parentDirPath);
|
||||
return parentFile.exists() && parentFile.isDirectory() || parentFile.mkdirs();
|
||||
int attributes = getBooleanAttributes(file);
|
||||
boolean ok = attributes != -1 && (attributes & (BA_EXISTS | BA_DIRECTORY)) == (BA_EXISTS | BA_DIRECTORY)
|
||||
|| parentFile.exists() && parentFile.isDirectory();
|
||||
return ok || parentFile.mkdirs();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
@@ -1327,4 +1333,53 @@ public class FileUtil {
|
||||
}
|
||||
return firstLine.contains(marker);
|
||||
}
|
||||
|
||||
// copied from FileSystem: they are package local there
|
||||
public static final int BA_EXISTS = 0x01;
|
||||
public static final int BA_REGULAR = 0x02;
|
||||
public static final int BA_DIRECTORY = 0x04;
|
||||
public static final int BA_HIDDEN = 0x08;
|
||||
|
||||
// todo[r.sh] use NIO2 API after migration to JDK 7
|
||||
// returns -1 if could not get attributes
|
||||
@MagicConstant(flags = {BA_EXISTS, BA_REGULAR, BA_DIRECTORY, BA_HIDDEN})
|
||||
public static int getBooleanAttributes(@NotNull File f) {
|
||||
if (JAVA_IO_FILESYSTEM_GET_BOOLEAN_ATTRIBUTES_METHOD != null) {
|
||||
try {
|
||||
Object flags = JAVA_IO_FILESYSTEM_GET_BOOLEAN_ATTRIBUTES_METHOD.invoke(JAVA_IO_FILESYSTEM, f);
|
||||
return ((Integer)flags).intValue();
|
||||
}
|
||||
catch (Exception ignored) { }
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
@MagicConstant(flags = {BA_EXISTS, BA_REGULAR, BA_DIRECTORY, BA_HIDDEN})
|
||||
public @interface FileBooleanAttributes {}
|
||||
|
||||
|
||||
static {
|
||||
Object fs;
|
||||
Method getBooleanAttributes;
|
||||
try {
|
||||
Class<?> fsClass = Class.forName("java.io.FileSystem");
|
||||
Method getFileSystem = fsClass.getMethod("getFileSystem");
|
||||
getFileSystem.setAccessible(true);
|
||||
fs = getFileSystem.invoke(null);
|
||||
getBooleanAttributes = fsClass.getDeclaredMethod("getBooleanAttributes", File.class);
|
||||
if (fs == null || getBooleanAttributes == null) {
|
||||
fs = null;
|
||||
getBooleanAttributes = null;
|
||||
}
|
||||
else {
|
||||
getBooleanAttributes.setAccessible(true);
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
fs = null;
|
||||
getBooleanAttributes = null;
|
||||
}
|
||||
JAVA_IO_FILESYSTEM = fs;
|
||||
JAVA_IO_FILESYSTEM_GET_BOOLEAN_ATTRIBUTES_METHOD = getBooleanAttributes;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -122,10 +122,12 @@ public abstract class TestObject implements JavaCommandLine {
|
||||
|
||||
public abstract String suggestActionName();
|
||||
|
||||
@Override
|
||||
public RunnerSettings getRunnerSettings() {
|
||||
return myRunnerSettings;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConfigurationPerRunnerSettings getConfigurationSettings() {
|
||||
return myConfigurationSettings;
|
||||
}
|
||||
@@ -145,6 +147,7 @@ public abstract class TestObject implements JavaCommandLine {
|
||||
}
|
||||
|
||||
private static final TestObject NOT_CONFIGURED = new TestObject(null, null, null, null) {
|
||||
@Override
|
||||
public RefactoringElementListener getListener(final PsiElement element, final JUnitConfiguration configuration) {
|
||||
return null;
|
||||
}
|
||||
@@ -233,6 +236,7 @@ public abstract class TestObject implements JavaCommandLine {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public JavaParameters getJavaParameters() throws ExecutionException {
|
||||
if (myJavaParameters == null) {
|
||||
myJavaParameters = new JavaParameters();
|
||||
@@ -246,6 +250,7 @@ public abstract class TestObject implements JavaCommandLine {
|
||||
return myJavaParameters;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ExecutionResult execute(final Executor executor, @NotNull final ProgramRunner runner) throws ExecutionException {
|
||||
final JUnitProcessHandler handler = createHandler();
|
||||
final RunnerSettings runnerSettings = getRunnerSettings();
|
||||
@@ -269,6 +274,7 @@ public abstract class TestObject implements JavaCommandLine {
|
||||
if (model != null) {
|
||||
handler.getOut().setDispatchListener(model.getNotifier());
|
||||
Disposer.register(model, new Disposable() {
|
||||
@Override
|
||||
public void dispose() {
|
||||
handler.getOut().setDispatchListener(DispatchListener.DEAF);
|
||||
}
|
||||
@@ -293,16 +299,19 @@ public abstract class TestObject implements JavaCommandLine {
|
||||
FileUtil.delete(myListenersFile);
|
||||
}
|
||||
IJSwingUtilities.invoke(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
unboundOutputRoot.flush();
|
||||
packetsReceiver.checkTerminated();
|
||||
final JUnitRunningModel model = packetsReceiver.getModel();
|
||||
notifyByBalloon(model, consoleProperties);
|
||||
|
||||
if (ApplicationManager.getApplication().isUnitTestMode()) {
|
||||
Disposer.dispose(consoleView);
|
||||
try {
|
||||
unboundOutputRoot.flush();
|
||||
packetsReceiver.checkTerminated();
|
||||
final JUnitRunningModel model = packetsReceiver.getModel();
|
||||
notifyByBalloon(model, consoleProperties);
|
||||
}
|
||||
finally {
|
||||
if (ApplicationManager.getApplication().isUnitTestMode()) {
|
||||
Disposer.dispose(consoleView);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -312,6 +321,7 @@ public abstract class TestObject implements JavaCommandLine {
|
||||
final String text = event.getText();
|
||||
final ConsoleViewContentType consoleViewType = ConsoleViewContentType.getConsoleViewType(outputType);
|
||||
final Printable printable = new Printable() {
|
||||
@Override
|
||||
public void printOn(final Printer printer) {
|
||||
printer.print(text, consoleViewType);
|
||||
}
|
||||
@@ -335,6 +345,7 @@ public abstract class TestObject implements JavaCommandLine {
|
||||
final RerunFailedTestsAction rerunFailedTestsAction = new RerunFailedTestsAction(consoleView.getComponent());
|
||||
rerunFailedTestsAction.init(consoleProperties, myRunnerSettings, myConfigurationSettings);
|
||||
rerunFailedTestsAction.setModelProvider(new Getter<TestFrameworkRunningModel>() {
|
||||
@Override
|
||||
public TestFrameworkRunningModel get() {
|
||||
return packetsReceiver.getModel();
|
||||
}
|
||||
|
||||
@@ -59,11 +59,13 @@ import java.util.StringTokenizer;
|
||||
public final class Form2ByteCodeCompiler implements ClassInstrumentingCompiler {
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.uiDesigner.make.Form2ByteCodeCompiler");
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public String getDescription() {
|
||||
return UIDesignerBundle.message("component.gui.designer.form.to.bytecode.compiler");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean validateConfiguration(CompileScope scope) {
|
||||
return true;
|
||||
}
|
||||
@@ -83,6 +85,7 @@ public final class Form2ByteCodeCompiler implements ClassInstrumentingCompiler {
|
||||
return new URLClassLoader(urls.toArray(new URL[urls.size()]), null);
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public ProcessingItem[] getProcessingItems(final CompileContext context) {
|
||||
final Project project = context.getProject();
|
||||
@@ -93,6 +96,7 @@ public final class Form2ByteCodeCompiler implements ClassInstrumentingCompiler {
|
||||
final ArrayList<ProcessingItem> items = new ArrayList<ProcessingItem>();
|
||||
|
||||
ApplicationManager.getApplication().runReadAction(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
final CompileScope scope = context.getCompileScope();
|
||||
final CompileScope projectScope = context.getProjectCompileScope();
|
||||
@@ -257,6 +261,7 @@ public final class Form2ByteCodeCompiler implements ClassInstrumentingCompiler {
|
||||
return outerQualifiedName.replace('.','/') + _className.substring(outerQualifiedName.length()).replace('.','$');
|
||||
}
|
||||
|
||||
@Override
|
||||
public ProcessingItem[] process(final CompileContext context, final ProcessingItem[] items) {
|
||||
final ArrayList<ProcessingItem> compiledItems = new ArrayList<ProcessingItem>();
|
||||
|
||||
@@ -298,21 +303,23 @@ public final class Form2ByteCodeCompiler implements ClassInstrumentingCompiler {
|
||||
final VirtualFile formFile = item.getFormFile();
|
||||
context.getProgressIndicator().setText2(formFile.getPresentableUrl());
|
||||
|
||||
final Document doc = ApplicationManager.getApplication().runReadAction(new Computable<Document>() {
|
||||
public Document compute() {
|
||||
final String text = ApplicationManager.getApplication().runReadAction(new Computable<String>() {
|
||||
@Override
|
||||
public String compute() {
|
||||
if (!belongsToCompileScope(context, formFile, item.getClassToBindFQname())) {
|
||||
return null;
|
||||
}
|
||||
return FileDocumentManager.getInstance().getDocument(formFile);
|
||||
Document document = FileDocumentManager.getInstance().getDocument(formFile);
|
||||
return document == null ? null : document.getText();
|
||||
}
|
||||
});
|
||||
if (doc == null) {
|
||||
if (text == null) {
|
||||
continue; // does not belong to current scope
|
||||
}
|
||||
|
||||
final LwRootContainer rootContainer;
|
||||
try {
|
||||
rootContainer = Utils.getRootContainer(doc.getText(), new CompiledClassPropertiesProvider(loader));
|
||||
rootContainer = Utils.getRootContainer(text, new CompiledClassPropertiesProvider(loader));
|
||||
}
|
||||
catch (Exception e) {
|
||||
addMessage(context, UIDesignerBundle.message("error.cannot.process.form.file", e), formFile, CompilerMessageCategory.ERROR);
|
||||
@@ -326,6 +333,7 @@ public final class Form2ByteCodeCompiler implements ClassInstrumentingCompiler {
|
||||
new PsiNestedFormLoader(module), false,
|
||||
new PsiClassWriter(module));
|
||||
ApplicationManager.getApplication().runReadAction(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
codeGenerator.patchFile(classFile);
|
||||
}
|
||||
@@ -371,6 +379,7 @@ public final class Form2ByteCodeCompiler implements ClassInstrumentingCompiler {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ValidityState createValidityState(final DataInput in) throws IOException {
|
||||
return TimestampValidityState.load(in);
|
||||
}
|
||||
@@ -406,6 +415,7 @@ public final class Form2ByteCodeCompiler implements ClassInstrumentingCompiler {
|
||||
myState = new TimestampValidityState(formFile.getTimeStamp());
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public VirtualFile getFile() {
|
||||
return myClassFile;
|
||||
@@ -419,6 +429,7 @@ public final class Form2ByteCodeCompiler implements ClassInstrumentingCompiler {
|
||||
return myClassToBindFQname;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ValidityState getValidityState() {
|
||||
return myState;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user