Merge remote-tracking branch 'origin/master'

This commit is contained in:
Anna Kozlova
2014-05-30 23:37:20 +04:00
8 changed files with 43 additions and 29 deletions
@@ -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);
@@ -0,0 +1,7 @@
public class Foo {
int foo(Object fact) {
return 42 * fa<caret>x
}
}
@@ -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
@@ -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)));