diff --git a/java/idea-ui/src/com/intellij/ide/util/projectWizard/ExistingModuleLoader.java b/java/idea-ui/src/com/intellij/ide/util/projectWizard/ExistingModuleLoader.java index cc651af9fbcf..a57c8a6e0877 100644 --- a/java/idea-ui/src/com/intellij/ide/util/projectWizard/ExistingModuleLoader.java +++ b/java/idea-ui/src/com/intellij/ide/util/projectWizard/ExistingModuleLoader.java @@ -51,7 +51,7 @@ public class ExistingModuleLoader extends ModuleBuilder { private static final Logger LOG = Logger.getInstance("#com.intellij.ide.util.projectWizard.ExistingModuleLoader"); @NotNull - public Module createModule(ModifiableModuleModel moduleModel) + public Module createModule(@NotNull ModifiableModuleModel moduleModel) throws InvalidDataException, IOException, ModuleWithNameAlreadyExists, JDOMException, ConfigurationException { LOG.assertTrue(getName() != null); diff --git a/java/java-impl/src/com/intellij/codeInsight/navigation/JavaMethodNavigationOffsetProvider.java b/java/java-impl/src/com/intellij/codeInsight/navigation/JavaMethodNavigationOffsetProvider.java index 62d7bc1b2b03..ee84ce5c6c4a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/navigation/JavaMethodNavigationOffsetProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/navigation/JavaMethodNavigationOffsetProvider.java @@ -24,6 +24,7 @@ import java.util.ArrayList; * @author yole */ public class JavaMethodNavigationOffsetProvider implements MethodNavigationOffsetProvider { + @Override @Nullable public int[] getMethodNavigationOffsets(final PsiFile file, final int caretOffset) { if (file instanceof PsiJavaFile) { diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/OrderEntryTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/OrderEntryTest.java index d77be017306f..3a6ca8cc358a 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/OrderEntryTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/OrderEntryTest.java @@ -37,7 +37,7 @@ public class OrderEntryTest extends DaemonAnalyzerTestCase { VirtualFile projectFile = tempProjectRootDir.findChild("orderEntry.ipr"); myProject = ProjectManagerEx.getInstanceEx().loadProject(projectFile.getPath()); - ProjectManagerEx.getInstanceEx().setCurrentTestProject(myProject); + ProjectManagerEx.getInstanceEx().openTestProject(myProject); ModuleManagerImpl mm = (ModuleManagerImpl)ModuleManager.getInstance(myProject); mm.projectOpened(); setUpJdk(); diff --git a/java/java-tests/testSrc/com/intellij/navigation/GotoImplementationTest.java b/java/java-tests/testSrc/com/intellij/navigation/GotoImplementationTest.java index b63f3672a9aa..d36f9ead9e07 100644 --- a/java/java-tests/testSrc/com/intellij/navigation/GotoImplementationTest.java +++ b/java/java-tests/testSrc/com/intellij/navigation/GotoImplementationTest.java @@ -42,7 +42,7 @@ public class GotoImplementationTest extends CodeInsightTestCase { myProject = ProjectManagerEx.getInstanceEx().loadProject(projectFile.getPath()); simulateProjectOpen(); - ProjectManagerEx.getInstanceEx().setCurrentTestProject(myProject); + ProjectManagerEx.getInstanceEx().openTestProject(myProject); } @Override diff --git a/java/java-tests/testSrc/com/intellij/psi/search/UpdateCacheTest.java b/java/java-tests/testSrc/com/intellij/psi/search/UpdateCacheTest.java index 0b9b648d8507..e39f43603064 100644 --- a/java/java-tests/testSrc/com/intellij/psi/search/UpdateCacheTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/search/UpdateCacheTest.java @@ -80,7 +80,7 @@ public class UpdateCacheTest extends PsiTestCase{ setUpJdk(); - myProjectManager.setCurrentTestProject(myProject); + myProjectManager.openTestProject(myProject); runStartupActivities(); } @@ -175,7 +175,7 @@ public class UpdateCacheTest extends PsiTestCase{ ((InjectedLanguageManagerImpl)InjectedLanguageManager.getInstance(getProject())).pushInjectors(); setUpModule(); setUpJdk(); - ProjectManagerEx.getInstanceEx().setCurrentTestProject(myProject); + ProjectManagerEx.getInstanceEx().openTestProject(myProject); runStartupActivities(); PsiTestUtil.addSourceContentToRoots(getModule(), content); diff --git a/java/testFramework/src/com/intellij/psi/AbstractReparseTestCase.java b/java/testFramework/src/com/intellij/psi/AbstractReparseTestCase.java new file mode 100644 index 000000000000..43bf6ccc20ec --- /dev/null +++ b/java/testFramework/src/com/intellij/psi/AbstractReparseTestCase.java @@ -0,0 +1,105 @@ +package com.intellij.psi; + +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.command.CommandProcessor; +import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.fileTypes.FileType; +import com.intellij.psi.impl.DebugUtil; +import com.intellij.psi.impl.source.SourceTreeToPsiMap; +import com.intellij.psi.text.BlockSupport; +import com.intellij.testFramework.PsiTestCase; +import com.intellij.util.IncorrectOperationException; +import org.jetbrains.annotations.NonNls; + +/** + * @author maxim + */ +public abstract class AbstractReparseTestCase extends PsiTestCase { + protected FileType myFileType; + protected PsiFile myDummyFile; + private int myInsertOffset; + + protected void setFileType(final FileType fileType) { + myFileType = fileType; + } + + protected void insert(@NonNls final String s) throws IncorrectOperationException { + CommandProcessor.getInstance().executeCommand(getProject(), new Runnable() { + @Override + public void run() { + ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override + public void run() { + String oldText = myDummyFile.getText(); + String expectedNewText = oldText.substring(0, myInsertOffset) + s + oldText.substring(myInsertOffset); + + try { + doReparse(s, expectedNewText, 0); + } + catch (IncorrectOperationException e) { + LOG.error(e); + } + myInsertOffset += s.length(); + } + }); + } + }, "asd", null); + } + + protected void moveEditPointLeft(int count) { + myInsertOffset -= count; + } + + protected void moveEditPointRight(int count) { + myInsertOffset += count; + } + + protected void setEditPoint(int pos) { + myInsertOffset = pos; + } + + protected void remove(int count) throws IncorrectOperationException { + String oldText = myDummyFile.getText(); + String expectedNewText = oldText.substring(0, myInsertOffset-count) + oldText.substring(myInsertOffset); + + doReparse("", expectedNewText, count); + myInsertOffset -= count; + } + + protected void doReparse(final String s, final String expectedNewText, final int length) throws IncorrectOperationException { + CommandProcessor.getInstance().executeCommand(getProject(), new Runnable() { + @Override + public void run() { + ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override + public void run() { + BlockSupport blockSupport = ServiceManager.getService(myProject, BlockSupport.class); + try { + blockSupport.reparseRange(myDummyFile, myInsertOffset - length, myInsertOffset, s); + String foundStructure = DebugUtil.treeToString(SourceTreeToPsiMap.psiElementToTree(myDummyFile), false); + final PsiFile psiFile = createDummyFile(getName() + "." + myFileType.getDefaultExtension(), expectedNewText); + String expectedStructure = DebugUtil.treeToString(SourceTreeToPsiMap.psiElementToTree(psiFile), false); + if (!expectedStructure.equals(foundStructure)) { + System.out.println("expected: "); + System.out.println(expectedStructure); + System.out.println("found: "); + System.out.println(foundStructure); + assertEquals(expectedStructure, foundStructure); + } + + assertEquals("Reparse tree should be equal to the document",expectedNewText,myDummyFile.getText()); + } + catch (IncorrectOperationException e) { + LOG.error(e); + } + } + }); + } + }, "asd", null); + } + + protected void prepareFile(@NonNls String prefix, @NonNls String suffix) throws IncorrectOperationException { + myDummyFile = createDummyFile(getName() + "." + myFileType.getDefaultExtension(), prefix + suffix); + myInsertOffset = prefix.length(); + } +} diff --git a/platform/lang-api/src/com/intellij/ide/util/projectWizard/ModuleBuilder.java b/platform/lang-api/src/com/intellij/ide/util/projectWizard/ModuleBuilder.java index 97e7ed4e17a5..3ca4caeb6121 100644 --- a/platform/lang-api/src/com/intellij/ide/util/projectWizard/ModuleBuilder.java +++ b/platform/lang-api/src/com/intellij/ide/util/projectWizard/ModuleBuilder.java @@ -155,7 +155,7 @@ public abstract class ModuleBuilder extends ProjectBuilder{ } @NotNull - public Module createModule(ModifiableModuleModel moduleModel) + public Module createModule(@NotNull ModifiableModuleModel moduleModel) throws InvalidDataException, IOException, ModuleWithNameAlreadyExists, JDOMException, ConfigurationException { LOG.assertTrue(myName != null); LOG.assertTrue(myModuleFilePath != null); @@ -182,26 +182,24 @@ public abstract class ModuleBuilder extends ProjectBuilder{ public abstract ModuleType getModuleType(); @NotNull - public Module createAndCommitIfNeeded(final Project project, ModifiableModuleModel model, boolean runFromProjectWizard) throws - InvalidDataException, - ConfigurationException, - IOException, - JDOMException, - ModuleWithNameAlreadyExists{ + public Module createAndCommitIfNeeded(@NotNull Project project, @Nullable ModifiableModuleModel model, boolean runFromProjectWizard) + throws InvalidDataException, ConfigurationException, IOException, JDOMException, ModuleWithNameAlreadyExists { final ModifiableModuleModel moduleModel = model != null ? model : ModuleManager.getInstance(project).getModifiableModel(); final Module module = createModule(moduleModel); if (model == null) moduleModel.commit(); if (runFromProjectWizard) { StartupManager.getInstance(module.getProject()).runWhenProjectIsInitialized(new DumbAwareRunnable() { - public void run() { - ApplicationManager.getApplication().runWriteAction(new Runnable() { - public void run() { - onModuleInitialized(module); - } - }); - } - }); + @Override + public void run() { + ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override + public void run() { + onModuleInitialized(module); + } + }); + } + }); } else { onModuleInitialized(module); @@ -222,13 +220,14 @@ public abstract class ModuleBuilder extends ProjectBuilder{ return true; } + @Override @Nullable public List commit(final Project project, final ModifiableModuleModel model, final ModulesProvider modulesProvider) { final Module module = commitModule(project, model); return module != null ? Collections.singletonList(module) : null; } - public Module commitModule(final Project project, final ModifiableModuleModel model) { + public Module commitModule(@NotNull final Project project, final ModifiableModuleModel model) { final Ref result = new Ref(); if (canCreateModule()) { if (myName == null) { @@ -238,6 +237,7 @@ public abstract class ModuleBuilder extends ProjectBuilder{ myModuleFilePath = project.getBaseDir().getPath() + File.separator + myName + ModuleFileType.DOT_DEFAULT_EXTENSION; } Exception ex = ApplicationManager.getApplication().runWriteAction(new Computable() { + @Override public Exception compute() { try { result.set(createAndCommitIfNeeded(project, model, true)); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/navigation/MethodUpDownUtil.java b/platform/lang-impl/src/com/intellij/codeInsight/navigation/MethodUpDownUtil.java index e52cd1698496..a4b2e80d854c 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/navigation/MethodUpDownUtil.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/navigation/MethodUpDownUtil.java @@ -51,7 +51,9 @@ public class MethodUpDownUtil { public static int[] offsetsFromElements(final Collection array) { TIntArrayList offsets = new TIntArrayList(array.size()); for (PsiElement element : array) { - offsets.add(element.getTextOffset()); + int offset = element.getTextOffset(); + assert offset >= 0 : element + "; offset: " + offset; + offsets.add(offset); } offsets.sort(); return offsets.toNativeArray(); diff --git a/platform/lang-impl/src/com/intellij/refactoring/actions/ChangeSignatureAction.java b/platform/lang-impl/src/com/intellij/refactoring/actions/ChangeSignatureAction.java index 1a845cf7c1c3..0d049d9a0c6f 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/actions/ChangeSignatureAction.java +++ b/platform/lang-impl/src/com/intellij/refactoring/actions/ChangeSignatureAction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2010 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,10 +23,7 @@ import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.ScrollType; import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiDocumentManager; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiReference; +import com.intellij.psi.*; import com.intellij.refactoring.RefactoringActionHandler; import com.intellij.refactoring.changeSignature.ChangeSignatureHandler; import org.jetbrains.annotations.NotNull; @@ -73,9 +70,14 @@ public class ChangeSignatureAction extends BaseRefactoringAction { final PsiElement targetMember = fileHandler.findTargetMember(element); if (targetMember != null) return targetMember; } - final PsiReference reference = element.getReference(); - if (reference == null) return null; - return reference.resolve(); + PsiReference reference = element.getReference(); + if (reference == null && element instanceof PsiNameIdentifierOwner) { + return element; + } + if (reference != null) { + return reference.resolve(); + } + return null; } @Override diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffPanelImpl.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffPanelImpl.java index bd943bce6e3f..6c32190fcc02 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffPanelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffPanelImpl.java @@ -363,7 +363,7 @@ public class DiffPanelImpl implements DiffPanelEx, ContentChangeListener, TwoSid } public boolean hasDifferences() { - return getLineBlocks().getCount() > 0; + return getLineBlocks().getCount() > 0 || myNotCalculateDiffPanel != null; } public JComponent getPreferredFocusedComponent() { diff --git a/platform/platform-impl/src/com/intellij/openapi/project/ex/ProjectManagerEx.java b/platform/platform-impl/src/com/intellij/openapi/project/ex/ProjectManagerEx.java index d971eb44a2f7..ed2959ea53a1 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/ex/ProjectManagerEx.java +++ b/platform/platform-impl/src/com/intellij/openapi/project/ex/ProjectManagerEx.java @@ -51,12 +51,10 @@ public abstract class ProjectManagerEx extends ProjectManager { public abstract void blockReloadingProjectOnExternalChanges(); public abstract void unblockReloadingProjectOnExternalChanges(); - @Nullable @TestOnly - public abstract Project getCurrentTestProject(); - + public abstract void openTestProject(@NotNull Project project); @TestOnly - public abstract void setCurrentTestProject(@Nullable Project project); + public abstract void closeTestProject(@NotNull Project project); // returns true on success public abstract boolean closeAndDispose(@NotNull Project project); diff --git a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java index 32886b248d1f..9bbb47458da0 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java @@ -64,6 +64,7 @@ import com.intellij.util.io.fs.IFile; import com.intellij.util.messages.MessageBus; import com.intellij.util.messages.MessageBusConnection; import com.intellij.util.ui.UIUtil; +import gnu.trove.THashSet; import gnu.trove.TObjectLongHashMap; import org.jdom.Element; import org.jdom.JDOMException; @@ -95,7 +96,7 @@ public class ProjectManagerImpl extends ProjectManagerEx implements NamedJDOMExt private Project[] myOpenProjectsArrayCache = {}; private final List myListeners = ContainerUtil.createEmptyCOWList(); - private Project myCurrentTestProject = null; + private final Set myTestProjects = new THashSet(); private final Map mySavedCopies = new HashMap(); private final TObjectLongHashMap mySavedTimestamps = new TObjectLongHashMap(); @@ -382,10 +383,7 @@ public class ProjectManagerImpl extends ProjectManagerEx implements NamedJDOMExt LOG.error("Open projects cache corrupted. Open projects: "+myOpenProjects+"; cache: "+Arrays.asList(myOpenProjectsArrayCache)); } if (ApplicationManager.getApplication().isUnitTestMode()) { - Project currentTestProject = myCurrentTestProject; - if (currentTestProject != null && !currentTestProject.isDisposed()) { - return ArrayUtil.append(myOpenProjectsArrayCache, currentTestProject); - } + return ArrayUtil.mergeArrays(myOpenProjectsArrayCache, myTestProjects.toArray(new Project[myTestProjects.size()])); } return myOpenProjectsArrayCache; } @@ -393,10 +391,7 @@ public class ProjectManagerImpl extends ProjectManagerEx implements NamedJDOMExt @Override public boolean isProjectOpened(Project project) { - if (ApplicationManager.getApplication().isUnitTestMode() && myCurrentTestProject != null) { - return project == myCurrentTestProject || myOpenProjects.contains(project); - } - return myOpenProjects.contains(project); + return ApplicationManager.getApplication().isUnitTestMode() && myTestProjects.contains(project) || myOpenProjects.contains(project); } @Override @@ -799,16 +794,29 @@ public class ProjectManagerImpl extends ProjectManagerEx implements NamedJDOMExt } @Override - public void setCurrentTestProject(@Nullable final Project project) { + public void openTestProject(@NotNull final Project project) { assert ApplicationManager.getApplication().isUnitTestMode(); - myCurrentTestProject = project; + myTestProjects.add(project); } @Override - @Nullable - public Project getCurrentTestProject() { + public void closeTestProject(@NotNull Project project) { assert ApplicationManager.getApplication().isUnitTestMode(); - return myCurrentTestProject; + myTestProjects.remove(project); + } + + @TestOnly + public void assertTestProjectsClosed() { + assert ApplicationManager.getApplication().isUnitTestMode(); + if (!myTestProjects.isEmpty()) { + try { + Project project = myTestProjects.iterator().next(); + throw new AssertionError("Test project is not disposed: " + project); + } + finally { + myTestProjects.clear(); + } + } } @Override @@ -993,7 +1001,7 @@ public class ProjectManagerImpl extends ProjectManagerEx implements NamedJDOMExt myOpenProjects.remove(project); cacheOpenProjects(); } - myCurrentTestProject = null; + myTestProjects.remove(project); myChangedProjectFiles.remove(project); diff --git a/platform/platform-impl/src/com/intellij/ui/EditorTextField.java b/platform/platform-impl/src/com/intellij/ui/EditorTextField.java index 1731856fc0e5..1721fa49f67b 100644 --- a/platform/platform-impl/src/com/intellij/ui/EditorTextField.java +++ b/platform/platform-impl/src/com/intellij/ui/EditorTextField.java @@ -52,6 +52,7 @@ import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.KeyEvent; import java.util.ArrayList; +import java.util.List; /** * @author max @@ -67,7 +68,7 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener, private EditorEx myEditor = null; private Component myNextFocusable = null; private boolean myWholeTextSelected = false; - private final ArrayList myDocumentListeners = new ArrayList(); + private final List myDocumentListeners = new ArrayList(); private boolean myIsListenerInstalled = false; private boolean myIsViewer; private boolean myIsSupplementary; @@ -77,12 +78,11 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener, private boolean myEnsureWillComputePreferredSize; private Dimension myPassivePreferredSize; private CharSequence myHintText; - private boolean myPaintSelection; private boolean myIsRendererWithSelection = false; private Color myRendererBg; private Color myRendererFg; private int myPreferredWidth = -1; - private ArrayList mySettingsProviders = new ArrayList(); + private final List mySettingsProviders = new ArrayList(); public EditorTextField() { this(""); @@ -116,10 +116,12 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener, setFocusable(true); // dsl: this is a weird way of doing things.... addFocusListener(new FocusListener() { + @Override public void focusGained(FocusEvent e) { requestFocus(); } + @Override public void focusLost(FocusEvent e) { } }); @@ -146,6 +148,7 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener, setDocument(myDocument); // reinit editor. } + @Override public String getText() { return myDocument.getText(); } @@ -159,6 +162,7 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener, } } + @Override public JComponent getComponent() { return this; } @@ -173,12 +177,14 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener, uninstallDocumentListener(false); } + @Override public void beforeDocumentChange(DocumentEvent event) { for (DocumentListener documentListener : myDocumentListeners) { documentListener.beforeDocumentChange(event); } } + @Override public void documentChanged(DocumentEvent event) { for (DocumentListener documentListener : myDocumentListeners) { documentListener.documentChanged(event); @@ -189,6 +195,7 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener, return myProject; } + @Override public Document getDocument() { return myDocument; } @@ -241,8 +248,10 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener, public void setText(final String text) { ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override public void run() { CommandProcessor.getInstance().executeCommand(getProject(), new Runnable() { + @Override public void run() { myDocument.replaceString(0, myDocument.getTextLength(), text); if (myEditor != null) { @@ -293,6 +302,7 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener, return myEditor.getCaretModel(); } + @Override public boolean isFocusOwner() { if (myEditor != null) { return IJSwingUtilities.hasFocus(myEditor.getContentComponent()); @@ -311,6 +321,7 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener, remove(editor.getComponent()); final Application application = ApplicationManager.getApplication(); final Runnable runnable = new Runnable() { + @Override public void run() { if (!editor.isDisposed()) { EditorFactory.getInstance().releaseEditor(editor); @@ -325,6 +336,7 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener, } } + @Override public void addNotify() { releaseEditor(); @@ -350,6 +362,7 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener, add(component, BorderLayout.CENTER); } + @Override public void removeNotify() { super.removeNotify(); releaseEditor(); @@ -374,6 +387,7 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener, }); } + @Override public void setFont(Font font) { super.setFont(font); if (myEditor != null) { @@ -443,15 +457,11 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener, final EditorFactory factory = EditorFactory.getInstance(); EditorEx editor; - if (!myIsViewer) { - editor = myProject != null - ? (EditorEx)factory.createEditor(myDocument, myProject) - : (EditorEx)factory.createEditor(myDocument); + if (myIsViewer) { + editor = myProject == null ? (EditorEx)factory.createViewer(myDocument) : (EditorEx)factory.createViewer(myDocument, myProject); } else { - editor = myProject != null - ? (EditorEx)factory.createViewer(myDocument, myProject) - : (EditorEx)factory.createViewer(myDocument); + editor = myProject == null ? (EditorEx)factory.createEditor(myDocument) : (EditorEx)factory.createEditor(myDocument, myProject); } final EditorSettings settings = editor.getSettings(); @@ -539,8 +549,8 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener, protected void updateBorder(@NotNull final EditorEx editor) { if (editor.isOneLineMode() - && (!Boolean.TRUE.equals(getClientProperty("JComboBox.isTableCellEditor")) - && (SwingUtilities.getAncestorOfClass(JTable.class, this) == null || Boolean.TRUE.equals(getClientProperty("JBListTable.isTableCellEditor"))))) { + && !Boolean.TRUE.equals(getClientProperty("JComboBox.isTableCellEditor")) + && (SwingUtilities.getAncestorOfClass(JTable.class, this) == null || Boolean.TRUE.equals(getClientProperty("JBListTable.isTableCellEditor")))) { final Container parent = getParent(); if (parent instanceof JTable || parent instanceof CellRendererPane) return; @@ -575,6 +585,7 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener, return true; } + @Override public void setEnabled(boolean enabled) { if (isEnabled() != enabled) { super.setEnabled(enabled); @@ -606,6 +617,7 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener, super.addImpl(comp, constraints, index); } + @Override public Dimension getPreferredSize() { if (super.isPreferredSizeSet()) { return super.getPreferredSize(); @@ -668,12 +680,14 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener, myPreferredWidth = preferredWidth; } + @Override public Component getNextFocusableComponent() { if (myEditor == null && myNextFocusable == null) return super.getNextFocusableComponent(); if (myEditor == null) return myNextFocusable; return myEditor.getContentComponent().getNextFocusableComponent(); } + @Override public void setNextFocusableComponent(Component aComponent) { if (myEditor != null) { myEditor.getContentComponent().setNextFocusableComponent(aComponent); @@ -683,13 +697,15 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener, } + @Override protected boolean processKeyBinding(KeyStroke ks, KeyEvent e, int condition, boolean pressed) { - if (e.isConsumed() || (myEditor != null && !myEditor.processKeyTyped(e))) { + if (e.isConsumed() || myEditor != null && !myEditor.processKeyTyped(e)) { return super.processKeyBinding(ks, e, condition, pressed); } return true; } + @Override public void requestFocus() { if (myEditor != null) { myEditor.getContentComponent().requestFocus(); @@ -700,6 +716,7 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener, } } + @Override public boolean requestFocusInWindow() { if (myEditor != null) { final boolean b = myEditor.getContentComponent().requestFocusInWindow(); @@ -726,6 +743,7 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener, return myEditor == null ? this : myEditor.getContentComponent(); } + @Override public Object getData(String dataId) { if (myEditor != null && myEditor.isRendererMode()) return null; @@ -745,10 +763,6 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener, myEnsureWillComputePreferredSize = true; } - public void setPaintSelection(boolean b) { - myPaintSelection = b; - } - public void setAsRendererWithSelection(Color backgroundColor, Color foregroundColor) { myIsRendererWithSelection = true; myRendererBg = backgroundColor; diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/FileWatcherTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/FileWatcherTest.java index 0d65d499a8dd..07f23d257541 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/FileWatcherTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/FileWatcherTest.java @@ -351,7 +351,7 @@ public class FileWatcherTest extends PlatformLangTestCase { } */ - public void testSubst() throws Exception { + public void _testSubst() throws Exception { if (!SystemInfo.isWindows) { System.out.println("Ignored: Windows required"); return; diff --git a/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java b/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java index 72a4258cb213..83d230c03b29 100644 --- a/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java +++ b/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java @@ -71,7 +71,7 @@ import com.intellij.openapi.util.ShutDownTracker; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.LocalFileSystem; -import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.openapi.vfs.encoding.EncodingManager; @@ -92,7 +92,6 @@ import com.intellij.util.IncorrectOperationException; import com.intellij.util.LocalTimeCounter; import com.intellij.util.containers.CollectionFactory; import com.intellij.util.indexing.FileBasedIndex; -import com.intellij.util.indexing.FileBasedIndexImpl; import com.intellij.util.indexing.IndexableFileSet; import com.intellij.util.messages.MessageBusConnection; import com.intellij.util.ui.UIUtil; @@ -234,7 +233,7 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da throw new RuntimeException(e); } - ((FileBasedIndexImpl)FileBasedIndex.getInstance()).registerIndexableSet(new IndexableFileSet() { + FileBasedIndex.getInstance().registerIndexableSet(new IndexableFileSet() { @Override public boolean isInSet(@NotNull final VirtualFile file) { return ourSourceRoot != null && file.getFileSystem() == ourSourceRoot.getFileSystem() && ourProject.isOpen(); @@ -335,7 +334,7 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da ((ProjectImpl)ourProject).setTemporarilyDisposed(false); ProjectManagerEx projectManagerEx = ProjectManagerEx.getInstanceEx(); - projectManagerEx.setCurrentTestProject(ourProject); + projectManagerEx.openTestProject(ourProject); ((PsiDocumentManagerImpl)PsiDocumentManager.getInstance(getProject())).clearUncommitedDocuments(); @@ -404,8 +403,7 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da catch (Exception e) { } - assertTrue("open: "+getProject().isOpen()+"; disposed:"+getProject().isDisposed()+"; startup passed:"+ passed+"; testProjectIsOurProject:"+(getProject() == projectManagerEx - .getCurrentTestProject())+"; all open projects: "+ + assertTrue("open: "+getProject().isOpen()+"; disposed:"+getProject().isDisposed()+"; startup passed:"+ passed+"; all open projects: "+ Arrays.asList(ProjectManager.getInstance().getOpenProjects()), getProject().isInitialized()); CodeStyleSettingsManager.getInstance(getProject()).setTemporarySettings(new CodeStyleSettings()); @@ -461,7 +459,7 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da } } - public static void doTearDown(final Project project, IdeaTestApplication application, boolean checkForEditors) throws Exception { + public static void doTearDown(@NotNull final Project project, IdeaTestApplication application, boolean checkForEditors) throws Exception { DocumentCommitThread.getInstance().clearQueue(); CodeStyleSettingsManager.getInstance(project).dropTemporarySettings(); checkAllTimersAreDisposed(); @@ -526,7 +524,7 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da TemplateDataLanguageMappings.getInstance(project).cleanupForNextTest(); - ProjectManagerEx.getInstanceEx().setCurrentTestProject(null); + ProjectManagerEx.getInstanceEx().closeTestProject(project); application.setDataProvider(null); ourTestCase = null; ((PsiManagerImpl)PsiManager.getInstance(project)).cleanupForNextTest(); @@ -705,7 +703,7 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da ApplicationManager.getApplication().assertWriteAccessAllowed(); ((ProjectImpl)ourProject).setTemporarilyDisposed(false); final VirtualFile projFile = ((ProjectEx)ourProject).getStateStore().getProjectFile(); - final File projectFile = projFile == null ? null : VfsUtil.virtualToIoFile(projFile); + final File projectFile = projFile == null ? null : VfsUtilCore.virtualToIoFile(projFile); if (!ourProject.isDisposed()) Disposer.dispose(ourProject); if (projectFile != null) { diff --git a/platform/testFramework/src/com/intellij/testFramework/PlatformTestCase.java b/platform/testFramework/src/com/intellij/testFramework/PlatformTestCase.java index 354c47885495..797d9063ca27 100644 --- a/platform/testFramework/src/com/intellij/testFramework/PlatformTestCase.java +++ b/platform/testFramework/src/com/intellij/testFramework/PlatformTestCase.java @@ -44,6 +44,7 @@ import com.intellij.openapi.module.ModuleType; import com.intellij.openapi.module.impl.ModuleManagerImpl; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ex.ProjectManagerEx; +import com.intellij.openapi.project.impl.ProjectManagerImpl; import com.intellij.openapi.project.impl.TooManyProjectLeakedException; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.ModifiableRootModel; @@ -180,11 +181,11 @@ public abstract class PlatformTestCase extends UsefulTestCase implements DataPro myThreadTracker = new ThreadTracker(); setUpProject(); - ProjectManagerEx.getInstanceEx().setCurrentTestProject(myProject); storeSettings(); ourTestCase = this; if (myProject != null) { + ProjectManagerEx.getInstanceEx().openTestProject(myProject); CodeStyleSettingsManager.getInstance(myProject).setTemporarySettings(new CodeStyleSettings()); ((InjectedLanguageManagerImpl)InjectedLanguageManager.getInstance(myProject)).pushInjectors(); } @@ -212,7 +213,7 @@ public abstract class PlatformTestCase extends UsefulTestCase implements DataPro File projectFile = getIprFile(); myProject = createProject(projectFile, getClass().getName() + "." + getName()); - myProjectManager.setCurrentTestProject(myProject); + myProjectManager.openTestProject(myProject); LocalFileSystem.getInstance().refreshIoFiles(myFilesToDelete); setUpModule(); @@ -482,8 +483,9 @@ public abstract class PlatformTestCase extends UsefulTestCase implements DataPro public void run() { Disposer.dispose(myProject); ProjectManagerEx projectManager = ProjectManagerEx.getInstanceEx(); - if (projectManager != null) { - projectManager.setCurrentTestProject(null); + if (projectManager instanceof ProjectManagerImpl) { + projectManager.closeTestProject(myProject); + ((ProjectManagerImpl)projectManager).assertTestProjectsClosed(); } } }); diff --git a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/HeavyIdeaTestFixtureImpl.java b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/HeavyIdeaTestFixtureImpl.java index 2b8d9be8c609..dcc3571cc2eb 100644 --- a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/HeavyIdeaTestFixtureImpl.java +++ b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/HeavyIdeaTestFixtureImpl.java @@ -162,7 +162,7 @@ class HeavyIdeaTestFixtureImpl extends BaseFixture implements HeavyIdeaTestFixtu sm.startCacheUpdate(); sm.runPostStartupActivities(); - ProjectManagerEx.getInstanceEx().setCurrentTestProject(myProject); + ProjectManagerEx.getInstanceEx().openTestProject(myProject); ((PsiDocumentManagerImpl)PsiDocumentManager.getInstance(myProject)).clearUncommitedDocuments(); } }.execute().throwException(); diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/impl/VcsDescriptor.java b/platform/vcs-api/src/com/intellij/openapi/vcs/impl/VcsDescriptor.java index aee403b937d9..56167f373ad0 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/impl/VcsDescriptor.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/impl/VcsDescriptor.java @@ -15,31 +15,57 @@ */ package com.intellij.openapi.vcs.impl; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.util.Computable; import com.intellij.openapi.vcs.VcsBundle; import com.intellij.openapi.vfs.VirtualFile; public class VcsDescriptor implements Comparable { private final String myName; + private final boolean myCrawlUpToCheckUnderVcs; private final String myDisplayName; private final String myAdministrativePattern; private boolean myIsNone; - public VcsDescriptor(String administrativePattern, String displayName, String name) { + public VcsDescriptor(String administrativePattern, String displayName, String name, boolean crawlUpToCheckUnderVcs) { myAdministrativePattern = administrativePattern; myDisplayName = displayName; myName = name; + myCrawlUpToCheckUnderVcs = crawlUpToCheckUnderVcs; } public boolean probablyUnderVcs(final VirtualFile file) { if (file == null || (! file.isDirectory()) || (! file.isValid())) return false; if (myAdministrativePattern == null) return false; - final String[] patterns = myAdministrativePattern.split(","); - for (String pattern : patterns) { - final VirtualFile child = file.findChild(pattern.trim()); - if (child != null) return true; - } - return false; + return ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public Boolean compute() { + if (checkFileForBeingAdministrative(file)) return true; + if (myCrawlUpToCheckUnderVcs) { + VirtualFile current = file.getParent(); + while (current != null) { + if (checkFileForBeingAdministrative(current)) return true; + current = current.getParent(); + } + } + return false; + } + }); + } + + private boolean checkFileForBeingAdministrative(final VirtualFile file) { + return ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public Boolean compute() { + final String[] patterns = myAdministrativePattern.split(","); + for (String pattern : patterns) { + final VirtualFile child = file.findChild(pattern.trim()); + if (child != null) return true; + } + return false; + } + }); } public String getDisplayName() { @@ -72,7 +98,7 @@ public class VcsDescriptor implements Comparable { } public static VcsDescriptor createFictive() { - final VcsDescriptor vcsDescriptor = new VcsDescriptor(null, VcsBundle.message("none.vcs.presentation"), null); + final VcsDescriptor vcsDescriptor = new VcsDescriptor(null, VcsBundle.message("none.vcs.presentation"), null, false); vcsDescriptor.myIsNone = true; return vcsDescriptor; } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/ZipperUpdater.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/ZipperUpdater.java index 0ab7a86c4e6f..6f2d851b1677 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/ZipperUpdater.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/ZipperUpdater.java @@ -25,6 +25,7 @@ public class ZipperUpdater { private boolean myRaised; private final Object myLock = new Object(); private final int myDelay; + private boolean myIsEmpty; public ZipperUpdater(final int delay, Disposable parentDisposable) { this(delay, Alarm.ThreadToUse.SHARED_THREAD, parentDisposable); @@ -32,6 +33,7 @@ public class ZipperUpdater { public ZipperUpdater(final int delay, final Alarm.ThreadToUse threadToUse, Disposable parentDisposable) { myDelay = delay; + myIsEmpty = true; myAlarm = new Alarm(threadToUse, parentDisposable); } @@ -44,6 +46,7 @@ public class ZipperUpdater { if (myAlarm.isDisposed()) return; final boolean wasRaised = myRaised; myRaised = true; + myIsEmpty = false; if (! wasRaised) { myAlarm.addRequest(new Runnable() { public void run() { @@ -52,12 +55,21 @@ public class ZipperUpdater { myRaised = false; } runnable.run(); + synchronized (myLock) { + myIsEmpty = ! myRaised; + } } }, urgent ? 0 : myDelay); } } } + public boolean isEmpty() { + synchronized (myLock) { + return myIsEmpty; + } + } + public void stop() { myAlarm.cancelAllRequests(); } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/ApplyPatchDifferentiatedDialog.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/ApplyPatchDifferentiatedDialog.java index 22610770973a..04c44c55c76a 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/ApplyPatchDifferentiatedDialog.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/ApplyPatchDifferentiatedDialog.java @@ -148,7 +148,7 @@ public class ApplyPatchDifferentiatedDialog extends DialogWrapper { myPatchFile.getTextField().getDocument().addDocumentListener(new DocumentAdapter() { protected void textChanged(DocumentEvent e) { setPathFileChangeDefault(); - myLoadQueue.queue(myUpdater); + queueRequest(); } }); @@ -191,7 +191,7 @@ public class ApplyPatchDifferentiatedDialog extends DialogWrapper { public void contentsChanged(VirtualFileEvent event) { if (myRecentPathFileChange.get() != null && myRecentPathFileChange.get().getVf() != null && myRecentPathFileChange.get().getVf().equals(event.getFile())) { - myLoadQueue.queue(myUpdater); + queueRequest(); } } }; @@ -206,6 +206,11 @@ public class ApplyPatchDifferentiatedDialog extends DialogWrapper { } } + private void queueRequest() { + paintBusy(true); + myLoadQueue.queue(myUpdater); + } + private void init(List patches, final LocalChangeList localChangeList) { final List matchedPathes = new AutoMatchIterator(myProject).execute(patches); @@ -284,7 +289,7 @@ public class ApplyPatchDifferentiatedDialog extends DialogWrapper { public void init(final VirtualFile patchFile) { myPatchFile.setText(patchFile.getPresentableUrl()); myRecentPathFileChange.set(new FilePresentation(patchFile)); - myLoadQueue.queue(myUpdater); + queueRequest(); } private class MyUpdater implements Runnable { @@ -309,6 +314,7 @@ public class ApplyPatchDifferentiatedDialog extends DialogWrapper { myPatches.addAll(matchedPathes); myReader = patchReader; updateTree(true); + paintBusy(false); } }); } @@ -368,6 +374,7 @@ public class ApplyPatchDifferentiatedDialog extends DialogWrapper { myChangesTreeList.setChangesToDisplay(Collections.emptyList()); myChangesTreeList.repaint(); myContainBasedChanges = false; + paintBusy(false); } @Override @@ -410,7 +417,7 @@ public class ApplyPatchDifferentiatedDialog extends DialogWrapper { group.add(new AnAction("Refresh", "Refresh", AllIcons.Actions.Sync) { @Override public void actionPerformed(AnActionEvent e) { - myLoadQueue.queue(myUpdater); + queueRequest(); } }); } @@ -445,6 +452,14 @@ public class ApplyPatchDifferentiatedDialog extends DialogWrapper { return myCenterPanel; } + private void paintBusy(final boolean requestPut) { + if (requestPut) { + myChangesTreeList.setPaintBusy(true); + } else { + myChangesTreeList.setPaintBusy(! myLoadQueue.isEmpty()); + } + } + private static class MyChangeTreeList extends ChangesTreeList { private MyChangeTreeList(Project project, Collection initiallyIncluded, @@ -536,6 +551,9 @@ public class ApplyPatchDifferentiatedDialog extends DialogWrapper { myChangesTreeList.setChangesToDisplay(changes); myChangesTreeList.setIncludedChanges(included); + if (doInitCheck) { + myChangesTreeList.expandAll(); + } myChangesTreeList.repaint(); if ((! doInitCheck) && patchesToSelect != null) { final List toSelect = new ArrayList(patchesToSelect.size()); diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesTreeList.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesTreeList.java index b1c7775b6e51..15411a551394 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesTreeList.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesTreeList.java @@ -927,4 +927,9 @@ public abstract class ChangesTreeList extends JPanel { public void setAlwaysExpandList(boolean alwaysExpandList) { myAlwaysExpandList = alwaysExpandList; } + + public void setPaintBusy(final boolean value) { + myTree.setPaintBusy(value); + myList.setPaintBusy(value); + } } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/configurable/VcsMappingConfigurationDialog.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/configurable/VcsMappingConfigurationDialog.java index 3a06bebec303..5d58c8b8e928 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/configurable/VcsMappingConfigurationDialog.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/configurable/VcsMappingConfigurationDialog.java @@ -20,6 +20,8 @@ import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.UnnamedConfigurable; +import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.*; import com.intellij.openapi.util.io.FileUtil; @@ -31,6 +33,8 @@ import com.intellij.openapi.vcs.impl.DefaultVcsRootPolicy; import com.intellij.openapi.vcs.impl.VcsDescriptor; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.components.JBLabel; +import com.intellij.util.continuation.ModalityIgnorantBackgroundableTask; +import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.awt.*; @@ -197,20 +201,40 @@ public class VcsMappingConfigurationDialog extends DialogWrapper { super.onFileChoosen(chosenFile); final VcsDescriptor wrapper = (VcsDescriptor) myVCSComboBox.getSelectedItem(); if (oldText.length() == 0 && (wrapper == null || wrapper.isNone())) { - VcsDescriptor probableVcs = null; - for(VcsDescriptor vcs: myVcses.values()) { - if (vcs.probablyUnderVcs(chosenFile)) { - if (probableVcs != null) { - probableVcs = null; - break; + final ModalityIgnorantBackgroundableTask task = + new ModalityIgnorantBackgroundableTask(myProject, "Looking for VCS administrative area, false") { + VcsDescriptor probableVcs = null; + + @Override + protected void doInAwtIfFail(Exception e) { } - probableVcs = vcs; - } - } - if (probableVcs != null) { - // todo none - myVCSComboBox.setSelectedItem(probableVcs); - } + + @Override + protected void doInAwtIfCancel() { + } + + @Override + protected void doInAwtIfSuccess() { + if (probableVcs != null) { + // todo none + myVCSComboBox.setSelectedItem(probableVcs); + } + } + + @Override + protected void runImpl(@NotNull ProgressIndicator indicator) { + for (VcsDescriptor vcs : myVcses.values()) { + if (vcs.probablyUnderVcs(chosenFile)) { + if (probableVcs != null) { + probableVcs = null; + break; + } + probableVcs = vcs; + } + } + } + }; + ProgressManager.getInstance().run(task); } } } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/VcsEP.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/VcsEP.java index 775947e8592a..7eda8accaa93 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/VcsEP.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/VcsEP.java @@ -43,6 +43,8 @@ public class VcsEP extends AbstractExtensionPointBean { public String displayName; @Attribute("administrativeAreaName") public String administrativeAreaName; + @Attribute("crawlUpToCheckUnderVcs") + public boolean crawlUpToCheckUnderVcs; private AbstractVcs myVcs; @@ -69,6 +71,6 @@ public class VcsEP extends AbstractExtensionPointBean { } public VcsDescriptor createDescriptor() { - return new VcsDescriptor(administrativeAreaName, displayName, name); + return new VcsDescriptor(administrativeAreaName, displayName, name, crawlUpToCheckUnderVcs); } } diff --git a/plugins/git4idea/src/git4idea/GitBranch.java b/plugins/git4idea/src/git4idea/GitBranch.java index 074835767cf5..c17cbb76a972 100644 --- a/plugins/git4idea/src/git4idea/GitBranch.java +++ b/plugins/git4idea/src/git4idea/GitBranch.java @@ -253,6 +253,7 @@ public class GitBranch extends GitReference { final String prefix = "ref: refs/heads/"; return head.startsWith(prefix) ? new GitBranch(head.substring(prefix.length()), true, false) : null; } catch (IOException e) { + LOG.info(e); return null; } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyBlock.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyBlock.java index 32184b90452c..8225b524b6c5 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyBlock.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyBlock.java @@ -111,6 +111,10 @@ public class GroovyBlock implements Block, GroovyElementTypes, ASTBlock { try { mySubBlocks = new GroovyBlockGenerator(this).generateSubBlocks(); } + catch (AssertionError e) { + final PsiFile file = myNode.getPsi().getContainingFile(); + LogMessageEx.error(LOG, "Formatting failed for file " + file.getName(), file.getText()); + } catch (RuntimeException e) { final PsiFile file = myNode.getPsi().getContainingFile(); LogMessageEx.error(LOG, "Formatting failed for file " + file.getName(), file.getText()); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/GroovyPsiElementFactory.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/GroovyPsiElementFactory.java index eb0128dacecb..4c9e7f7037c8 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/GroovyPsiElementFactory.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/GroovyPsiElementFactory.java @@ -54,7 +54,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.types.GrTypeElement; */ public abstract class GroovyPsiElementFactory implements JVMElementFactory { - @NonNls public static final String DUMMY_FILE_NAME = "DUMMY__"; + @NonNls public static final String DUMMY_FILE_NAME = "DUMMY__1234567890_DUMMYYYYYY___"; public abstract GrCodeReferenceElement createCodeReferenceElementFromClass(PsiClass aClass); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/GrConstructorInvocationImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/GrConstructorInvocationImpl.java index e6c630bef390..be38a735e959 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/GrConstructorInvocationImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/GrConstructorInvocationImpl.java @@ -18,7 +18,6 @@ package org.jetbrains.plugins.groovy.lang.psi.impl.statements; import com.intellij.lang.ASTNode; import com.intellij.psi.*; import com.intellij.psi.tree.TokenSet; -import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.TypeConversionUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -28,7 +27,6 @@ import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrConstructorInvocation; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrThisSuperReferenceExpression; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition; import org.jetbrains.plugins.groovy.lang.psi.impl.GroovyResolveResultImpl; import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.GrCallImpl; @@ -78,7 +76,7 @@ public class GrConstructorInvocationImpl extends GrCallImpl implements GrConstru if (isThisCall()) { substitutor = PsiSubstitutor.EMPTY; } else { - GrTypeDefinition enclosing = getEnclosingClass(); + PsiClass enclosing = PsiUtil.getContextClass(this); assert enclosing != null; substitutor = TypeConversionUtil.getSuperClassSubstitutor(clazz, enclosing, PsiSubstitutor.EMPTY); } @@ -110,17 +108,13 @@ public class GrConstructorInvocationImpl extends GrCallImpl implements GrConstru @Nullable public PsiClass getDelegatedClass() { - GrTypeDefinition typeDefinition = getEnclosingClass(); + PsiClass typeDefinition = PsiUtil.getContextClass(this); if (typeDefinition != null) { return isThisCall() ? typeDefinition : typeDefinition.getSuperClass(); } return null; } - private GrTypeDefinition getEnclosingClass() { - return PsiTreeUtil.getParentOfType(this, GrTypeDefinition.class); - } - @NotNull public String getCanonicalText() { return getText(); //TODO diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java index 1c920224e894..7f5c771938c8 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java @@ -570,7 +570,7 @@ public class PsiUtil { @Nullable public static PsiClass getContextClass(PsiElement context) { while (context != null) { - if (context instanceof PsiClass) { + if (context instanceof PsiClass && !isInDummyFile(context)) { return (PsiClass)context; } else if (context instanceof GroovyFileBase && context.isPhysical()) { @@ -582,6 +582,14 @@ public class PsiUtil { return null; } + private static boolean isInDummyFile(PsiElement context) { + PsiFile file = context.getContainingFile(); + if (file == null) return false; + + String name = file.getName(); + return name.startsWith(GroovyPsiElementFactory.DUMMY_FILE_NAME); + } + @Nullable public static GroovyPsiElement getFileOrClassContext(PsiElement context) { while (context != null) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ArgumentListGenerator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ArgumentListGenerator.java index 8620f5902d26..3f1010dd1b86 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ArgumentListGenerator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ArgumentListGenerator.java @@ -17,6 +17,7 @@ package org.jetbrains.plugins.groovy.refactoring.convertToJava; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.NullUtils; import com.intellij.psi.PsiArrayType; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiSubstitutor; @@ -63,7 +64,7 @@ class ArgumentListGenerator { } final PsiSubstitutor substitutor = signature == null ? PsiSubstitutor.EMPTY : signature.getSubstitutor(); - if (argInfos == null) { + if (argInfos == null || NullUtils.hasNull(argInfos)) { generateSimple(exprs, namedArgs, clArgs, context, substitutor); return; } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ClassGenerator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ClassGenerator.java index ceda991f2c1d..b950b4cc9486 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ClassGenerator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ClassGenerator.java @@ -118,8 +118,9 @@ public class ClassGenerator { } if (enumConstants.length > 0) { //text.removeFromTheEnd(1).append(";\n"); - text.delete(text.length()-1, text.length()).append(";\n"); + text.delete(text.length() - 1, text.length()); } + text.append(";\n"); } writeAllMethods(text, classItemGenerator.collectMethods(typeDefinition, isClassDef), typeDefinition); diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy index 42bf94b12d2f..2a835f46e23e 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy @@ -908,7 +908,7 @@ class Fopppp { class Instantiation {} ''' myFixture.completeBasic() - assert myFixture.lookupElementStrings[0] == 'instanceof' + assertEquals 'instanceof', myFixture.lookupElementStrings[0] } public void testForFinal() { @@ -1003,7 +1003,7 @@ while(true) { myFixture.configureByText "a.groovy", "def foo(stryng) { println str }" myFixture.completeBasic() - assert myFixture.lookupElementStrings[0] == 'stryng' + assertEquals 'stryng', myFixture.lookupElementStrings[0] } private def caseSensitiveNone() { @@ -1077,13 +1077,13 @@ class X { public void testInitializerMatters() throws Exception { myFixture.configureByText("a.groovy", "class Foo {{ String fx = getFoo(); }; String getFoo() {}; }"); myFixture.completeBasic() - assert myFixture.lookupElementStrings == ["foo"] + assertOrderedEquals(myFixture.lookupElementStrings, ["foo"]) } public void testFieldInitializerMatters() throws Exception { myFixture.configureByText("a.groovy", "class Foo { String fx = getFoo(); String getFoo() {}; }"); myFixture.completeBasic() - assert myFixture.lookupElementStrings == ["foo"] + assertOrderedEquals(myFixture.lookupElementStrings, ["foo"]) } public void testAccessStaticViaInstanceSecond() throws Exception { @@ -1096,7 +1096,7 @@ public class KeyVO { myFixture.complete(CompletionType.BASIC, 1) assert !myFixture.lookupElementStrings myFixture.complete(CompletionType.BASIC, 2) - assert myFixture.lookupElementStrings == ["foo"] + assertOrderedEquals(myFixture.lookupElementStrings, ["foo"]) } public void testNoRepeatingModifiers() { @@ -1118,11 +1118,11 @@ public class KeyVO { myFixture.addClass("package bar; public class Util { public static void bar() {} }") myFixture.configureByText 'a.groovy', 'Util.' myFixture.completeBasic() - assert myFixture.lookupElementStrings[0..1] == ['Util.bar', 'Util.foo'] + assertOrderedEquals myFixture.lookupElementStrings[0..1] , ['Util.bar', 'Util.foo'] def presentation = LookupElementPresentation.renderElement(myFixture.lookupElements[0]) - assert 'Util.bar' == presentation.itemText - assert '() (bar)' == presentation.tailText + assertEquals 'Util.bar', presentation.itemText + assertEquals '() (bar)', presentation.tailText assert !presentation.tailGrayed myFixture.type 'f\n' diff --git a/plugins/groovy/testdata/refactoring/convertGroovyToJava/file/hash.groovy b/plugins/groovy/testdata/refactoring/convertGroovyToJava/file/hash.groovy index aee07196dbe0..1e7d79bd2cba 100644 --- a/plugins/groovy/testdata/refactoring/convertGroovyToJava/file/hash.groovy +++ b/plugins/groovy/testdata/refactoring/convertGroovyToJava/file/hash.groovy @@ -1,5 +1,6 @@ class BigInteger { BigInteger(int i, byte[] arr) {} + String toString(int radix) {""} } class NoSuchAlgorithmException extends Exception {} diff --git a/plugins/groovy/testdata/refactoring/convertGroovyToJava/file/hash.java b/plugins/groovy/testdata/refactoring/convertGroovyToJava/file/hash.java index e7b10c48e8bc..a333176b0dd7 100644 --- a/plugins/groovy/testdata/refactoring/convertGroovyToJava/file/hash.java +++ b/plugins/groovy/testdata/refactoring/convertGroovyToJava/file/hash.java @@ -1,6 +1,10 @@ public class BigInteger extends groovy.lang.GroovyObjectSupport implements groovy.lang.GroovyObject { public BigInteger(int i, java.lang.Byte[] arr) { } +public java.lang.String toString(int radix) { +return ""; +} + } public class NoSuchAlgorithmException extends java.lang.Exception implements groovy.lang.GroovyObject { } diff --git a/plugins/svn4idea/lib/svnkit-javahl.jar b/plugins/svn4idea/lib/svnkit-javahl.jar index 7eee9c01f890..088881d41099 100644 Binary files a/plugins/svn4idea/lib/svnkit-javahl.jar and b/plugins/svn4idea/lib/svnkit-javahl.jar differ diff --git a/plugins/svn4idea/lib/svnkit-javahl16.zip b/plugins/svn4idea/lib/svnkit-javahl16.zip index 6b2fa287ec89..26b8d1313933 100644 Binary files a/plugins/svn4idea/lib/svnkit-javahl16.zip and b/plugins/svn4idea/lib/svnkit-javahl16.zip differ diff --git a/plugins/svn4idea/lib/svnkit.jar b/plugins/svn4idea/lib/svnkit.jar index bcfbd9ed6c8e..4d6c54ac7243 100644 Binary files a/plugins/svn4idea/lib/svnkit.jar and b/plugins/svn4idea/lib/svnkit.jar differ diff --git a/plugins/svn4idea/lib/svnkitsrc.zip b/plugins/svn4idea/lib/svnkitsrc.zip index 79ac0e437b6a..2e9466e3b316 100644 Binary files a/plugins/svn4idea/lib/svnkitsrc.zip and b/plugins/svn4idea/lib/svnkitsrc.zip differ diff --git a/plugins/svn4idea/src/META-INF/plugin.xml b/plugins/svn4idea/src/META-INF/plugin.xml index a9b27e678deb..12bde03814e6 100644 --- a/plugins/svn4idea/src/META-INF/plugin.xml +++ b/plugins/svn4idea/src/META-INF/plugin.xml @@ -132,7 +132,7 @@ - + diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/IdeaSubversionConfigurationDirectory.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/IdeaSubversionConfigurationDirectory.java index c9176f2b7961..1947ca03a902 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/IdeaSubversionConfigurationDirectory.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/IdeaSubversionConfigurationDirectory.java @@ -15,7 +15,6 @@ */ package org.jetbrains.idea.svn; -import com.intellij.openapi.util.SystemInfo; import org.tmatesoft.svn.core.wc.SVNWCUtil; import java.io.File; @@ -26,9 +25,6 @@ public class IdeaSubversionConfigurationDirectory { public static String getPath() { final File standard = SVNWCUtil.getDefaultConfigurationDirectory(); - if (SystemInfo.isWindows) { - return standard.getAbsolutePath(); - } - return standard.getParent() + File.separator + standard.getName() + "_IDEA"; + return standard.getAbsolutePath(); } } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/history/FirstInBranch.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/history/FirstInBranch.java index 4e03b8a87246..81c410f2c0fd 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/history/FirstInBranch.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/history/FirstInBranch.java @@ -80,9 +80,11 @@ public class FirstInBranch implements Runnable { final SVNLogClient logClient = ApplicationManager.getApplication().runReadAction(new Computable() { @Override public SVNLogClient compute() { + if (myVcs.getProject().isDisposed()) return null; return myVcs.createLogClient(); } }); + if (logClient == null) return; final long start1 = getStart(logClient, branchURL); if (start1 > 0) { final SVNRevision start1Rev = SVNRevision.create(start1); diff --git a/xml/impl/src/com/intellij/codeInsight/navigation/XmlMethodNavigationOffsetProvider.java b/xml/impl/src/com/intellij/codeInsight/navigation/XmlMethodNavigationOffsetProvider.java index d7eb4a73a1e0..136ddf84a97e 100644 --- a/xml/impl/src/com/intellij/codeInsight/navigation/XmlMethodNavigationOffsetProvider.java +++ b/xml/impl/src/com/intellij/codeInsight/navigation/XmlMethodNavigationOffsetProvider.java @@ -27,6 +27,7 @@ import java.util.ArrayList; * @author yole */ public class XmlMethodNavigationOffsetProvider implements MethodNavigationOffsetProvider { + @Override public int[] getMethodNavigationOffsets(final PsiFile file, final int caretOffset) { if (file instanceof XmlFile) { PsiElement element = file;