mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
Merge remote-tracking branch 'origin/master'
This commit is contained in:
@@ -465,8 +465,10 @@ public class JavaCompletionData extends JavaAwareCompletionData {
|
||||
result.addElement(TailTypeDecorator.withTail(createKeyword(position, PsiKeyword.NEW), TailType.INSERT_SPACE));
|
||||
result.addElement(createKeyword(position, PsiKeyword.NULL));
|
||||
}
|
||||
result.addElement(createKeyword(position, PsiKeyword.TRUE));
|
||||
result.addElement(createKeyword(position, PsiKeyword.FALSE));
|
||||
if (mayExpectBoolean(parameters)) {
|
||||
result.addElement(createKeyword(position, PsiKeyword.TRUE));
|
||||
result.addElement(createKeyword(position, PsiKeyword.FALSE));
|
||||
}
|
||||
}
|
||||
|
||||
PsiFile file = position.getContainingFile();
|
||||
@@ -527,6 +529,14 @@ public class JavaCompletionData extends JavaAwareCompletionData {
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean mayExpectBoolean(CompletionParameters parameters) {
|
||||
for (ExpectedTypeInfo info : JavaSmartCompletionContributor.getExpectedTypes(parameters)) {
|
||||
PsiType type = info.getType();
|
||||
if (type instanceof PsiClassType || type == PsiType.BOOLEAN) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static boolean isExpressionPosition(PsiElement position) {
|
||||
return EXPR_KEYWORDS.accepts(position) ||
|
||||
psiElement().insideStarting(psiElement(PsiClassObjectAccessExpression.class)).accepts(position);
|
||||
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
public class Foo {
|
||||
|
||||
int foo(Object fact) {
|
||||
return 42 * fa<caret>x
|
||||
}
|
||||
}
|
||||
|
||||
+4
@@ -629,6 +629,10 @@ interface TxANotAnno {}
|
||||
checkPreferredItems 0, 'value'
|
||||
}
|
||||
|
||||
public void testNoBooleansInMultiplication() {
|
||||
checkPreferredItems 0, 'fact'
|
||||
}
|
||||
|
||||
public void testGlobalStaticMemberStats() {
|
||||
configureNoCompletion(getTestName(false) + ".java")
|
||||
myFixture.complete(CompletionType.BASIC, 2)
|
||||
|
||||
@@ -23,20 +23,17 @@ import com.intellij.openapi.fileTypes.FileType;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.reference.SoftReference;
|
||||
import com.intellij.util.Function;
|
||||
import com.intellij.util.containers.WeakFactoryMap;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.lang.ref.Reference;
|
||||
|
||||
public class MockFileDocumentManagerImpl extends FileDocumentManager {
|
||||
private static final Key<VirtualFile> MOCK_VIRTUAL_FILE_KEY = Key.create("MockVirtualFile");
|
||||
private final Function<CharSequence, Document> myFactory;
|
||||
@Nullable private final Key<Reference<Document>> myCachedDocumentKey;
|
||||
@Nullable private final Key<Document> myCachedDocumentKey;
|
||||
|
||||
public MockFileDocumentManagerImpl(Function<CharSequence, Document> factory, @Nullable Key<Reference<Document>> cachedDocumentKey) {
|
||||
public MockFileDocumentManagerImpl(Function<CharSequence, Document> factory, @Nullable Key<Document> cachedDocumentKey) {
|
||||
myFactory = factory;
|
||||
myCachedDocumentKey = cachedDocumentKey;
|
||||
}
|
||||
@@ -66,8 +63,7 @@ public class MockFileDocumentManagerImpl extends FileDocumentManager {
|
||||
@Override
|
||||
public Document getCachedDocument(@NotNull VirtualFile file) {
|
||||
if (myCachedDocumentKey != null) {
|
||||
Reference<Document> reference = file.getUserData(myCachedDocumentKey);
|
||||
return SoftReference.dereference(reference);
|
||||
return file.getUserData(myCachedDocumentKey);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -1310,7 +1310,10 @@ public class FileBasedIndexImpl extends FileBasedIndex {
|
||||
|
||||
@NotNull
|
||||
private Set<Document> getUnsavedDocuments() {
|
||||
return new THashSet<Document>(Arrays.asList(myFileDocumentManager.getUnsavedDocuments()));
|
||||
Document[] documents = myFileDocumentManager.getUnsavedDocuments();
|
||||
if (documents.length == 0) return Collections.emptySet();
|
||||
if (documents.length == 1) return Collections.singleton(documents[0]);
|
||||
return new THashSet<Document>(Arrays.asList(documents));
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
+9
-13
@@ -67,6 +67,7 @@ import com.intellij.util.Function;
|
||||
import com.intellij.util.PairProcessor;
|
||||
import com.intellij.util.ThrowableRunnable;
|
||||
import com.intellij.util.containers.ConcurrentHashSet;
|
||||
import com.intellij.util.containers.ConcurrentWeakValueHashMap;
|
||||
import com.intellij.util.messages.MessageBus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -76,9 +77,6 @@ import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.io.IOException;
|
||||
import java.lang.ref.Reference;
|
||||
import java.lang.ref.SoftReference;
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.lang.reflect.InvocationHandler;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Proxy;
|
||||
@@ -90,11 +88,12 @@ public class FileDocumentManagerImpl extends FileDocumentManager implements Virt
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.fileEditor.impl.FileDocumentManagerImpl");
|
||||
|
||||
private static final Key<String> LINE_SEPARATOR_KEY = Key.create("LINE_SEPARATOR_KEY");
|
||||
public static final Key<Reference<Document>> DOCUMENT_KEY = Key.create("DOCUMENT_KEY");
|
||||
public static final Key<Document> HARD_REF_TO_DOCUMENT_KEY = Key.create("HARD_REF_TO_DOCUMENT_KEY");
|
||||
private static final Key<VirtualFile> FILE_KEY = Key.create("FILE_KEY");
|
||||
private static final Key<Boolean> MUST_RECOMPUTE_FILE_TYPE = Key.create("Must recompute file type");
|
||||
|
||||
private final Set<Document> myUnsavedDocuments = new ConcurrentHashSet<Document>();
|
||||
private final Map<VirtualFile, Document> myDocuments = new ConcurrentWeakValueHashMap<VirtualFile, Document>();
|
||||
|
||||
private final MessageBus myBus;
|
||||
|
||||
@@ -174,7 +173,7 @@ public class FileDocumentManagerImpl extends FileDocumentManager implements Virt
|
||||
document.setModificationStamp(file.getModificationStamp());
|
||||
final FileType fileType = file.getFileType();
|
||||
document.setReadOnly(!file.isWritable() || fileType.isBinary());
|
||||
file.putUserData(DOCUMENT_KEY, new WeakReference<Document>(document));
|
||||
myDocuments.put(file, document);
|
||||
document.putUserData(FILE_KEY, file);
|
||||
|
||||
if (!(file instanceof LightVirtualFile || file.getFileSystem() instanceof DummyFileSystem)) {
|
||||
@@ -223,17 +222,13 @@ public class FileDocumentManagerImpl extends FileDocumentManager implements Virt
|
||||
@Override
|
||||
@Nullable
|
||||
public Document getCachedDocument(@NotNull VirtualFile file) {
|
||||
return com.intellij.reference.SoftReference.dereference(file.getUserData(DOCUMENT_KEY));
|
||||
Document hard = file.getUserData(HARD_REF_TO_DOCUMENT_KEY);
|
||||
return hard != null ? hard : myDocuments.get(file);
|
||||
}
|
||||
|
||||
public static void registerDocument(@NotNull final Document document, @NotNull VirtualFile virtualFile) {
|
||||
synchronized (lock) {
|
||||
virtualFile.putUserData(DOCUMENT_KEY, new SoftReference<Document>(document) {
|
||||
@Override
|
||||
public Document get() {
|
||||
return document;
|
||||
}
|
||||
});
|
||||
virtualFile.putUserData(HARD_REF_TO_DOCUMENT_KEY, document);
|
||||
document.putUserData(FILE_KEY, virtualFile);
|
||||
}
|
||||
}
|
||||
@@ -550,7 +545,8 @@ public class FileDocumentManagerImpl extends FileDocumentManager implements Virt
|
||||
if (document != null) {
|
||||
// a file is linked to a document - chances are it is an "unknown text file" now
|
||||
if (isBinaryWithoutDecompiler(file)) {
|
||||
file.putUserData(DOCUMENT_KEY, null);
|
||||
myDocuments.remove(file);
|
||||
file.putUserData(HARD_REF_TO_DOCUMENT_KEY, null);
|
||||
document.putUserData(FILE_KEY, null);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,7 +23,6 @@ import com.intellij.openapi.editor.Document;
|
||||
import com.intellij.openapi.editor.impl.DocumentImpl;
|
||||
import com.intellij.openapi.editor.impl.event.DocumentEventImpl;
|
||||
import com.intellij.openapi.fileEditor.FileDocumentManager;
|
||||
import com.intellij.openapi.fileEditor.impl.FileDocumentManagerImpl;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.project.ex.ProjectManagerEx;
|
||||
import com.intellij.openapi.vfs.LocalFileSystem;
|
||||
@@ -34,12 +33,12 @@ import com.intellij.psi.impl.source.PsiFileImpl;
|
||||
import com.intellij.testFramework.LeakHunter;
|
||||
import com.intellij.testFramework.LightVirtualFile;
|
||||
import com.intellij.testFramework.PlatformLangTestCase;
|
||||
import com.intellij.testFramework.PlatformTestUtil;
|
||||
import com.intellij.util.Processor;
|
||||
import com.intellij.util.concurrency.Semaphore;
|
||||
import com.intellij.util.ui.UIUtil;
|
||||
|
||||
import java.io.File;
|
||||
import java.lang.ref.Reference;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
public class PsiDocumentManagerImplTest extends PlatformLangTestCase {
|
||||
@@ -94,11 +93,10 @@ public class PsiDocumentManagerImplTest extends PlatformLangTestCase {
|
||||
});
|
||||
//Class.forName("com.intellij.util.ProfilingUtil").getDeclaredMethod("forceCaptureMemorySnapshot").invoke(null);
|
||||
|
||||
Reference<Document> reference = vFile.getUserData(FileDocumentManagerImpl.DOCUMENT_KEY);
|
||||
assertNotNull(reference);
|
||||
for (int i=0;i<1000;i++) {
|
||||
PlatformTestUtil.tryGcSoftlyReachableObjects();
|
||||
UIUtil.dispatchAllInvocationEvents();
|
||||
if (reference.get() == null) break;
|
||||
if (documentManager.getCachedDocument(getPsiManager().findFile(vFile)) == null) break;
|
||||
System.gc();
|
||||
}
|
||||
assertNull(documentManager.getCachedDocument(getPsiManager().findFile(vFile)));
|
||||
|
||||
@@ -111,7 +111,7 @@ public abstract class ParsingTestCase extends PlatformLiteFixture {
|
||||
public Document fun(CharSequence charSequence) {
|
||||
return editorFactory.createDocument(charSequence);
|
||||
}
|
||||
}, FileDocumentManagerImpl.DOCUMENT_KEY));
|
||||
}, FileDocumentManagerImpl.HARD_REF_TO_DOCUMENT_KEY));
|
||||
registerComponentInstance(appContainer, PsiDocumentManager.class, new MockPsiDocumentManager());
|
||||
myLanguage = myLanguage == null && myDefinitions.length > 0? myDefinitions[0].getFileNodeType().getLanguage() : myLanguage;
|
||||
registerComponentInstance(appContainer, FileTypeManager.class, new MockFileTypeManager(new MockLanguageFileType(myLanguage, myFileExt)));
|
||||
|
||||
Reference in New Issue
Block a user