Merge branch 'master' of git@git.labs.intellij.net:idea/community
authorEugene Kudelevsky <Eugene.Kudelevsky@jetbrains.com>
Wed, 10 Mar 2010 14:31:25 +0000 (17:31 +0300)
committerEugene Kudelevsky <Eugene.Kudelevsky@jetbrains.com>
Wed, 10 Mar 2010 14:31:25 +0000 (17:31 +0300)
75 files changed:
.idea/libraries/Eclipse.xml
java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java
java/debugger/impl/src/com/intellij/debugger/jdi/ThreadReferenceProxyImpl.java
java/execution/openapi/src/com/intellij/execution/filters/AuxiliaryCallsFolding.java
java/execution/openapi/src/com/intellij/execution/filters/ExceptionFilter.java
java/execution/openapi/src/com/intellij/execution/filters/ReflectionStackFrameFilter.java
java/java-impl/src/com/intellij/codeInsight/completion/simple/PsiMethodInsertHandler.java
java/java-impl/src/com/intellij/codeInsight/editorActions/CopyPasteReferenceProcessor.java
java/java-impl/src/com/intellij/codeInsight/editorActions/ReferenceTransferableData.java
java/java-impl/src/com/intellij/ide/projectView/impl/ClassesTreeStructureProvider.java
java/java-impl/src/com/intellij/ide/projectView/impl/nodes/ClassTreeNode.java
java/java-impl/src/com/intellij/psi/impl/compiled/ClsFileImpl.java
java/java-impl/src/com/intellij/psi/impl/file/JavaUpdateAddedFileProcessor.java
java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FilePathReferenceProvider.java
java/java-tests/testData/codeInsight/completion/normal/MethodWithLeftParTailTypeNoPairBrace.java [new file with mode: 0644]
java/java-tests/testData/codeInsight/completion/normal/MethodWithLeftParTailTypeNoPairBrace_after.java [new file with mode: 0644]
java/java-tests/testData/codeInsight/completion/normal/MethodWithLeftParTailTypeNoPairBrace_after2.java [new file with mode: 0644]
java/java-tests/testData/codeInsight/completion/normal/MethodWithLeftParTailType_after.java
java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.java
lib/org.eclipse.jdt.core_3.4.4.v_894_R34x.jar [deleted file]
lib/org.eclipse.jdt.core_3.5.2.v_981_R35x.jar [new file with mode: 0644]
lib/required_for_dist.txt
lib/src/org.eclipse.jdt.core.source_3.4.4.v_894_R34x.jar [deleted file]
lib/src/org.eclipse.jdt.core.source_3.5.2.v_981_R35x.jar [new file with mode: 0644]
platform/lang-api/src/com/intellij/codeInsight/completion/util/ParenthesesInsertHandler.java
platform/lang-impl/src/com/intellij/application/options/codeStyle/MultilanguageCodeStyleAbstractPanel.java
platform/lang-impl/src/com/intellij/codeInsight/editorActions/CopyPasteFoldingProcessor.java
platform/lang-impl/src/com/intellij/codeInsight/editorActions/FoldingTransferableData.java
platform/lang-impl/src/com/intellij/codeInsight/editorActions/PasteHandler.java
platform/lang-impl/src/com/intellij/codeInsight/editorActions/TextBlockTransferable.java
platform/lang-impl/src/com/intellij/codeInsight/folding/impl/FoldingUpdate.java
platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleImpl.java
platform/lang-impl/src/com/intellij/psi/formatter/PsiBasedFormattingModel.java
platform/lang-impl/src/com/intellij/util/fileIndex/AbstractFileIndex.java
platform/lang-impl/src/com/intellij/util/fileIndex/FileIndexRefreshCacheUpdater.java
platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndex.java
platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndexProjectHandler.java
platform/lang-impl/src/com/intellij/util/indexing/UnindexedFilesUpdater.java
platform/lvcs-impl/src/com/intellij/history/integration/EventDispatcher.java
platform/lvcs-impl/src/com/intellij/history/integration/LocalHistoryCacheUpdater.java
platform/platform-api/src/com/intellij/featureStatistics/FeatureStatisticsBundle.java
platform/platform-api/src/com/intellij/featureStatistics/FeatureStatisticsBundleProvider.java [new file with mode: 0644]
platform/platform-api/src/com/intellij/ide/caches/CacheUpdater.java
platform/platform-api/src/com/intellij/openapi/editor/EditorModificationUtil.java
platform/platform-api/src/com/intellij/openapi/editor/RawText.java
platform/platform-impl/src/com/intellij/internal/ToggleDumbModeAction.java
platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionManagerImpl.java
platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java
platform/platform-impl/src/com/intellij/openapi/project/CacheUpdateRunner.java
platform/platform-impl/src/com/intellij/openapi/project/CacheUpdateSession.java
platform/platform-impl/src/com/intellij/openapi/project/DumbServiceImpl.java
platform/platform-impl/src/com/intellij/openapi/wm/impl/IdeFrameImpl.java
platform/platform-resources-en/src/messages/IdeBundle.properties
platform/platform-resources-en/src/misc/registry.properties
platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml
platform/platform-resources/src/idea/Keymap_Default.xml
platform/xdebugger-api/src/com/intellij/xdebugger/breakpoints/XBreakpointManager.java
platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XBreakpointManagerImpl.java
platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XLineBreakpointImpl.java
plugins/devkit/src/dom/KeyboardShortcut.java
plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java
plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/controlFlow/impl/ControlFlowBuilder.java
plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyFileBaseImpl.java
plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/blocks/GrBlockImpl.java
plugins/groovy/test/org/jetbrains/plugins/groovy/lang/MissingReturnTest.java
plugins/groovy/test/org/jetbrains/plugins/groovy/lang/controlFlow/ControlFlowTest.java
plugins/groovy/testdata/groovy/completion/FinishMethodWithLParen_after.groovy
plugins/groovy/testdata/groovy/controlFlow/while1.test
plugins/groovy/testdata/groovy/controlFlow/while2.test
plugins/groovy/testdata/groovy/controlFlow/whileNonConstant.test [new file with mode: 0644]
plugins/groovy/testdata/groovy/refactoring/extractMethod/inter1.test
plugins/groovy/testdata/highlighting/missingReturn/EndlessLoop.groovy [new file with mode: 0644]
xml/dom-openapi/src/com/intellij/util/xml/model/impl/DomModelFactory.java
xml/dom-openapi/src/com/intellij/util/xml/model/impl/DomModelImpl.java
xml/impl/src/com/intellij/psi/formatter/xml/XmlTagBlock.java

index 5d0645c38f46c6130791418bd38e83ab0be597c9..09b7e2c73bd486edadec6d3e6759bda14cb7fdbc 100644 (file)
@@ -1,11 +1,11 @@
 <component name="libraryTable">
   <library name="Eclipse">
     <CLASSES>
-      <root url="jar://$PROJECT_DIR$/lib/org.eclipse.jdt.core_3.4.4.v_894_R34x.jar!/" />
+      <root url="jar://$PROJECT_DIR$/lib/org.eclipse.jdt.core_3.5.2.v_981_R35x.jar!/" />
     </CLASSES>
     <JAVADOC />
     <SOURCES>
-      <root url="jar://$PROJECT_DIR$/lib/src/org.eclipse.jdt.core.source_3.4.4.v_894_R34x.jar!/" />
+      <root url="jar://$PROJECT_DIR$/lib/src/org.eclipse.jdt.core.source_3.5.2.v_981_R35x.jar!/" />
     </SOURCES>
   </library>
 </component>
\ No newline at end of file
index ae6252e4407f35f761054871b8329bd21e8281c9..be293f4b6c95c905538748e4db8c80d0152b96c5 100644 (file)
@@ -398,7 +398,7 @@ public class EvaluatorBuilderImpl implements EvaluatorBuilder {
     }
 
     private static boolean isBinaryNumericPromotionApplicable(PsiType lType, PsiType rType, IElementType opType) {
-      if (lType == null && rType == null) {
+      if (lType == null || rType == null) {
         return false;
       }
       if (opType == JavaTokenType.EQEQ || opType == JavaTokenType.NE) {
index 93c87145dd1d657bac64238eb9720ed17cae7b70..25d08bb6373226aafd12773b90fe9126c623b633 100644 (file)
@@ -240,7 +240,11 @@ public final class ThreadReferenceProxyImpl extends ObjectReferenceProxyImpl imp
         return null;
       }
       checkFrames(threadReference);
-      return myFramesFromBottom.get(frameCount() - i  - 1);
+      final int frameCount = frameCount();
+      if (frameCount == 0) {
+        return null;
+      }
+      return myFramesFromBottom.get(frameCount - i  - 1);
     }
     catch (ObjectCollectedException e) {
       return null;
index 5240ad7b7add9b5847960650b3226208ded4ec61..83df6698588d368159ab2df0249dd3c5733d624a 100644 (file)
@@ -13,12 +13,12 @@ public class AuxiliaryCallsFolding extends ConsoleFolding {
   @Override
   public boolean shouldFoldLine(String line) {
     final Trinity<String, String, TextRange> pair = ExceptionFilter.parseExceptionLine(line);
-    return pair != null && shouldFold(pair.first);
+    return pair != null && shouldFold(pair.first, pair.second);
   }
 
-  private static boolean shouldFold(String className) {
+  private static boolean shouldFold(String className, String methodName) {
     for (StackFrameFilter provider : StackFrameFilter.EP_NAME.getExtensions()) {
-      if (provider.isAuxiliaryFrame(className, "")) {
+      if (provider.isAuxiliaryFrame(className, methodName)) {
         return true;
       }
     }
index 6b05b21f3fa60eef290edfc3323e6424dc66abe9..bce070511d3d04e41abfb27af4d1f3816dd8a4f6 100644 (file)
@@ -74,13 +74,12 @@ public class ExceptionFilter implements Filter, DumbAware {
     if (lastDotIndex < 0 || lastDotIndex < atIndex) return null;
     String className = line.substring(atIndex + AT.length() + 1, lastDotIndex).trim();
 
-    //String methodName = text.substring(lastDotIndex + 1, lparenthIndex).trim();
+    String methodName = line.substring(lastDotIndex + 1, lparenthIndex).trim();
 
     final int rparenthIndex = line.indexOf(')', lparenthIndex);
     if (rparenthIndex < 0) return null;
 
-    final String fileAndLine = line.substring(lparenthIndex + 1, rparenthIndex).trim();
-    return Trinity.create(className, fileAndLine, new TextRange(lparenthIndex, rparenthIndex));
+    return Trinity.create(className, methodName, new TextRange(lparenthIndex, rparenthIndex));
   }
 
   public Result applyFilter(final String line, final int textEndOffset) {
@@ -95,7 +94,9 @@ public class ExceptionFilter implements Filter, DumbAware {
       className = className.substring(0, dollarIndex);
     }
 
-    final String fileAndLine = info.second;
+    final int lparenthIndex = info.third.getStartOffset();
+    final int rparenthIndex = info.third.getEndOffset();
+    final String fileAndLine = line.substring(lparenthIndex + 1, rparenthIndex).trim();
 
     final int colonIndex = fileAndLine.lastIndexOf(':');
     if (colonIndex < 0) return null;
@@ -118,8 +119,9 @@ public class ExceptionFilter implements Filter, DumbAware {
       */
 
       final int textStartOffset = textEndOffset - line.length();
-      final int highlightStartOffset = textStartOffset + info.third.getStartOffset() + 1;
-      final int highlightEndOffset = textStartOffset + info.third.getEndOffset();
+
+      final int highlightStartOffset = textStartOffset + lparenthIndex + 1;
+      final int highlightEndOffset = textStartOffset + rparenthIndex;
       VirtualFile virtualFile = file.getVirtualFile();
       final OpenFileHyperlinkInfo linkInfo = new OpenFileHyperlinkInfo(myProject, virtualFile, lineNumber - 1);
       TextAttributes attributes = HYPERLINK_ATTRIBUTES.clone();
index ed60d87c0b4d0066c9cd6dddac3c2f91a82d5a8a..3cd61a5d95f8a0d8f36e68924285d90d27014d61 100644 (file)
@@ -5,6 +5,13 @@ package com.intellij.execution.filters;
  */
 public class ReflectionStackFrameFilter extends StackFrameFilter {
   public boolean isAuxiliaryFrame(String className, String methodName) {
+    if (className.equals("java.lang.reflect.Method") && methodName.equals("invoke")) {
+      return true;
+    }
+    if (className.equals("java.lang.reflect.Constructor") && methodName.equals("newInstance")) {
+      return true;
+    }
+
     return className.startsWith("sun.reflect.");
   }
 }
index 0f9f5f2bdf3934df8e4385c443db056728595e00..928ddc97fe211381b2318cb93cc21f30c34b1f08 100644 (file)
@@ -53,24 +53,26 @@ public class PsiMethodInsertHandler implements InsertHandler<LookupItem<PsiMetho
     final TailType tailType = getTailType(item, context);
     final Document document = editor.getDocument();
     final PsiFile file = context.getFile();
+    final int offset = editor.getCaretModel().getOffset();
 
     context.setAddCompletionChar(false);
 
     final LookupElement[] allItems = context.getElements();
-    boolean signatureSelected = allItems.length > 1 || item.getUserData(LookupItem.FORCE_SHOW_SIGNATURE_ATTR) != null;
+    final boolean overloadsMatter = allItems.length == 1 && item.getUserData(LookupItem.FORCE_SHOW_SIGNATURE_ATTR) == null;
 
-    int offset = editor.getCaretModel().getOffset();
+    final boolean hasParams = MethodParenthesesHandler.hasParams(item, allItems, overloadsMatter, myMethod);
     final boolean needLeftParenth = isToInsertParenth(file.findElementAt(context.getStartOffset()));
-    final boolean hasParams = MethodParenthesesHandler.hasParams(item, allItems, !signatureSelected, myMethod);
+    final boolean needRightParenth = shouldInsertRParenth(completionChar, tailType, hasParams);
+
     if (needLeftParenth) {
       final CodeStyleSettings styleSettings = CodeStyleSettingsManager.getSettings(context.getProject());
-      new MethodParenthesesHandler(myMethod, !signatureSelected,
+      new MethodParenthesesHandler(myMethod, overloadsMatter,
                                            styleSettings.SPACE_BEFORE_METHOD_CALL_PARENTHESES,
                                            styleSettings.SPACE_WITHIN_METHOD_CALL_PARENTHESES && hasParams,
-                                           shouldInsertRightParenthesis(tailType)
+                                           needRightParenth
       ).handleInsert(context, item);
     }
-    
+
     insertExplicitTypeParams(item, document, offset, file);
 
     final PsiType type = myMethod.getReturnType();
@@ -86,14 +88,25 @@ public class PsiMethodInsertHandler implements InsertHandler<LookupItem<PsiMetho
 
     if (needLeftParenth && hasParams) {
       // Invoke parameters popup
-      AutoPopupController.getInstance(myMethod.getProject()).autoPopupParameterInfo(editor, signatureSelected ? myMethod : null);
+      AutoPopupController.getInstance(myMethod.getProject()).autoPopupParameterInfo(editor, overloadsMatter ? null : myMethod);
+    }
+    if (tailType == TailType.SMART_COMPLETION || needLeftParenth && needRightParenth) {
+      tailType.processTail(editor, context.getTailOffset());
     }
-    tailType.processTail(editor, context.getTailOffset());
     editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE);
   }
 
-  protected static boolean shouldInsertRightParenthesis(TailType tailType) {
-    return tailType != TailType.SMART_COMPLETION;
+  private boolean shouldInsertRParenth(char completionChar, TailType tailType, boolean hasParams) {
+    if (tailType == TailType.SMART_COMPLETION) {
+      return false;
+    }
+
+    if (completionChar == '(' && !hasParams) {
+      //it's highly probable that the user will type ')' next and it may not be overwritten if the flag is off
+      return CodeInsightSettings.getInstance().AUTOINSERT_PAIR_BRACKET;
+    }
+
+    return true;
   }
 
   @NotNull
index 3f70ed37a9e4593d2cbe3429a54e9a06b63e1320..051a12d73b188951c4a0a77d14fc05a889d04411 100644 (file)
@@ -30,6 +30,7 @@ import com.intellij.util.ArrayUtil;
 import com.intellij.util.IncorrectOperationException;
 import org.jetbrains.annotations.Nullable;
 
+import java.awt.datatransfer.DataFlavor;
 import java.awt.datatransfer.Transferable;
 import java.awt.datatransfer.UnsupportedFlavorException;
 import java.io.IOException;
@@ -89,7 +90,10 @@ public class CopyPasteReferenceProcessor implements CopyPastePostProcessor {
     ReferenceTransferableData referenceData = null;
     if (CodeInsightSettings.getInstance().ADD_IMPORTS_ON_PASTE != CodeInsightSettings.NO) {
       try {
-        referenceData = (ReferenceTransferableData)content.getTransferData(ReferenceTransferableData.ReferenceData.FLAVOR);
+        final DataFlavor flavor = ReferenceTransferableData.ReferenceData.getDataFlavor();
+        if (flavor != null) {
+          referenceData = (ReferenceTransferableData)content.getTransferData(flavor);
+        }
       }
       catch (UnsupportedFlavorException ignored) {
       }
index a3dfd6de3e833f13f9dd6abe6d023b74a9930c9e..d5fe437974e3f16b58045c21e20c96bc8e15095e 100644 (file)
@@ -15,7 +15,6 @@
  */
 package com.intellij.codeInsight.editorActions;
 
-import com.intellij.codeInsight.CodeInsightBundle;
 import org.jetbrains.annotations.NonNls;
 
 import java.awt.datatransfer.DataFlavor;
@@ -32,7 +31,7 @@ public class ReferenceTransferableData implements TextBlockTransferableData, Clo
   }
 
   public DataFlavor getFlavor() {
-    return ReferenceData.FLAVOR;
+    return ReferenceData.getDataFlavor();
   }
 
   public int getOffsetCount() {
@@ -68,8 +67,7 @@ public class ReferenceTransferableData implements TextBlockTransferableData, Clo
   }
 
   public static class ReferenceData implements Cloneable, Serializable {
-    public static final @NonNls DataFlavor FLAVOR = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType+";class="+ReferenceData.class.getName(),
-                                                                   CodeInsightBundle.message("paste.dataflavor.referencedata"));
+    public static @NonNls DataFlavor ourFlavor;
 
     public int startOffset;
     public int endOffset;
@@ -91,5 +89,18 @@ public class ReferenceTransferableData implements TextBlockTransferableData, Clo
         throw new RuntimeException();
       }
     }
+
+    public static DataFlavor getDataFlavor() {
+      if (ourFlavor != null) {
+        return ourFlavor;
+      }
+      try {
+        ourFlavor = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType + ";class=" + ReferenceData.class.getName(), "ReferenceData");
+      }
+      catch (NoClassDefFoundError e) {
+        return null;
+      }
+      return ourFlavor;
+    }
   }
 }
index bb6fe4ca9b226177a6502f2fca25c9ab93ed9daa..36c8b865010a0cab753b014eb1e3bc670830111c 100644 (file)
@@ -81,12 +81,10 @@ public class ClassesTreeStructureProvider implements SelectableTreeStructureProv
 
     PsiElement current = element;
     while (current != null) {
-      if (current instanceof PsiFileSystemItem) {
-        break;
-      }
-      if (isTopLevelClass(current, baseRootFile)) {
-        break;
-      }
+
+      if (isSelectable(current)) break;
+      if (isTopLevelClass(current, baseRootFile)) break;
+
       current = current.getParent();
     }
 
@@ -96,7 +94,18 @@ public class ClassesTreeStructureProvider implements SelectableTreeStructureProv
         current = classes[0];
       }
     }
-    return current instanceof PsiClass ? current : baseRootFile;
+
+    return current != null ? current : baseRootFile;
+  }
+
+  private boolean isSelectable(PsiElement element) {
+    if (element instanceof PsiFileSystemItem) return true;
+
+    if (element instanceof PsiField || element instanceof PsiClass || element instanceof PsiMethod) {
+      return !(element.getParent() instanceof PsiAnonymousClass) && !(element instanceof PsiAnonymousClass);
+    }
+
+    return false;
   }
 
   @Nullable
@@ -113,6 +122,11 @@ public class ClassesTreeStructureProvider implements SelectableTreeStructureProv
     if (!(element instanceof PsiClass)) {
       return false;
     }
+
+    if (element instanceof PsiAnonymousClass) {
+      return false;
+    }
+
     final PsiFile parentFile = parentFileOf((PsiClass)element);
                                         // do not select JspClass
     return parentFile != null && parentFile.getLanguage() == baseRootFile.getLanguage();
index e2795b94224935745202cf63ef53c0ce4f85ade8..865af940522a37268cd084bb677d376275e7c8bd 100644 (file)
@@ -159,13 +159,16 @@ public class ClassTreeNode extends BasePsiMemberNode<PsiClass>{
     return super.canRepresent(element) || canRepresent(getValue(), element);
   }
 
-  private static boolean canRepresent(final PsiClass psiClass, final Object element) {
+  private boolean canRepresent(final PsiClass psiClass, final Object element) {
     final PsiFile parentFile = parentFileOf(psiClass);
     if (parentFile != null && (parentFile == element || parentFile.getVirtualFile() == element)) return true;
-    if (element instanceof PsiElement) {
-      PsiFile elementFile = ((PsiElement)element).getContainingFile();
-      if (elementFile != null && parentFile != null) {
-        return elementFile.equals(parentFile);
+
+    if (!getSettings().isShowMembers()) {
+      if (element instanceof PsiElement) {
+        PsiFile elementFile = ((PsiElement)element).getContainingFile();
+        if (elementFile != null && parentFile != null) {
+          return elementFile.equals(parentFile);
+        }
       }
     }
 
index 360d33225dd1c6cf784392655d2346ddd9879ee6..fd9ae54733c016a5ec9b22f251abc2a1baeae91b 100644 (file)
@@ -225,17 +225,14 @@ public class ClsFileImpl extends ClsRepositoryPsiElement<PsiClassHolderFileStub>
       }
 
       PsiClass[] classes = getClasses();
-      if (classes.length == 1) {
-        if (!JavaPsiFacade.getInstance(getProject()).getNameHelper().isIdentifier(classes[0].getName())) {
-          return; // Can happen for package-info.class, or classes compiled from languages, that support different class naming scheme, like Scala.
-        }
-      }
-
-      PsiClass[] mirrorClasses = ((PsiJavaFile)mirrorFile).getClasses();
-      LOG.assertTrue(classes.length == mirrorClasses.length);
-      if (classes.length == mirrorClasses.length) {
-        for (int i = 0; i < classes.length; i++) {
-          ((ClsElementImpl)classes[i]).setMirror((TreeElement)SourceTreeToPsiMap.psiElementToTree(mirrorClasses[i]));
+      // Can happen for package-info.class, or classes compiled from languages, that support different class naming scheme, like Scala.
+      if (classes.length != 1 || JavaPsiFacade.getInstance(getProject()).getNameHelper().isIdentifier(classes[0].getName())) {
+        PsiClass[] mirrorClasses = ((PsiJavaFile)mirrorFile).getClasses();
+        LOG.assertTrue(classes.length == mirrorClasses.length);
+        if (classes.length == mirrorClasses.length) {
+          for (int i = 0; i < classes.length; i++) {
+            ((ClsElementImpl)classes[i]).setMirror((TreeElement)SourceTreeToPsiMap.psiElementToTree(mirrorClasses[i]));
+          }
         }
       }
     }
index 6e57f8b484a42049cf046de0bbccd50189a1a426..30d1020decd3af786b14f6ce5d731877ff72c0ba 100644 (file)
@@ -16,7 +16,6 @@
 package com.intellij.psi.impl.file;
 
 import com.intellij.psi.*;
-import com.intellij.psi.util.PsiUtilBase;
 import com.intellij.util.IncorrectOperationException;
 
 /**
@@ -30,7 +29,7 @@ public class JavaUpdateAddedFileProcessor extends UpdateAddedFileProcessor {
   }
 
   public void update(final PsiFile element, PsiFile originalElement) throws IncorrectOperationException {
-    if (PsiUtilBase.getTemplateLanguageFile(element) != element.getContainingFile()) return;
+    if (element.getViewProvider().getLanguages().size() > 1) return;
 
     PsiDirectory dir = element.getContainingDirectory();
     if (dir == null) return;
index 24a264bc7b08b0960a4a662be5f4c46a1d151820..c01e91f944b53f6bfb2fb3c93e385d79591151d5 100644 (file)
@@ -22,9 +22,7 @@ import com.intellij.openapi.roots.OrderRootType;
 import com.intellij.openapi.util.Condition;
 import com.intellij.openapi.util.TextRange;
 import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.openapi.vfs.VirtualFileManager;
 import com.intellij.psi.*;
-import com.intellij.psi.PsiReferenceProvider;
 import com.intellij.util.ProcessingContext;
 import org.jetbrains.annotations.NotNull;
 
@@ -112,14 +110,11 @@ public class FilePathReferenceProvider extends PsiReferenceProvider {
     List<PsiFileSystemItem> result = new ArrayList<PsiFileSystemItem>();
     final PsiManager psiManager = PsiManager.getInstance(thisModule.getProject());
     if (includingClasses) {
-      String[] libraryUrls = moduleRootManager.getUrls(OrderRootType.CLASSES);
-      for (String libraryUrl : libraryUrls) {
-        VirtualFile libFile = VirtualFileManager.getInstance().findFileByUrl(libraryUrl);
-        if (libFile != null) {
-          PsiDirectory directory = psiManager.findDirectory(libFile);
-          if (directory != null) {
-            result.add(directory);
-          }
+      VirtualFile[] libraryUrls = moduleRootManager.getFiles(OrderRootType.CLASSES);
+      for (VirtualFile file : libraryUrls) {
+        PsiDirectory directory = psiManager.findDirectory(file);
+        if (directory != null) {
+          result.add(directory);
         }
       }
     }
diff --git a/java/java-tests/testData/codeInsight/completion/normal/MethodWithLeftParTailTypeNoPairBrace.java b/java/java-tests/testData/codeInsight/completion/normal/MethodWithLeftParTailTypeNoPairBrace.java
new file mode 100644 (file)
index 0000000..0403bf2
--- /dev/null
@@ -0,0 +1,8 @@
+class MyClass {
+
+void foo() {}
+
+{
+  fo<caret>
+}
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/completion/normal/MethodWithLeftParTailTypeNoPairBrace_after.java b/java/java-tests/testData/codeInsight/completion/normal/MethodWithLeftParTailTypeNoPairBrace_after.java
new file mode 100644 (file)
index 0000000..c976d92
--- /dev/null
@@ -0,0 +1,8 @@
+class MyClass {
+
+void foo() {}
+
+{
+  foo(<caret>
+}
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/completion/normal/MethodWithLeftParTailTypeNoPairBrace_after2.java b/java/java-tests/testData/codeInsight/completion/normal/MethodWithLeftParTailTypeNoPairBrace_after2.java
new file mode 100644 (file)
index 0000000..b7841df
--- /dev/null
@@ -0,0 +1,8 @@
+class MyClass {
+
+void foo() {}
+
+{
+  foo();<caret>
+}
+}
\ No newline at end of file
index b7841df3ff15746dcf4544d9e80001a321fc673e..7680812e2f7c088c86bb840c658c6e1c642be7aa 100644 (file)
@@ -3,6 +3,6 @@ class MyClass {
 void foo() {}
 
 {
-  foo();<caret>
+  foo(<caret>);
 }
 }
\ No newline at end of file
index c0103a0adde72c4ca78ce63d729bde680c708979..f6a2431c26d6e06ebb86f46549fe2bcbcc118ddf 100644 (file)
@@ -308,6 +308,25 @@ public class NormalCompletionTest extends LightCompletionTestCase {
     checkResultByFile("/codeInsight/completion/normal/MethodWithLeftParTailType2_after.java");
   }
 
+  public void testMethodWithLeftParTailTypeNoPairBrace() throws Exception {
+    final boolean old = CodeInsightSettings.getInstance().AUTOINSERT_PAIR_BRACKET;
+    CodeInsightSettings.getInstance().AUTOINSERT_PAIR_BRACKET = false;
+
+    try {
+      configureByFile("/codeInsight/completion/normal/" + getTestName(false) + ".java");
+      selectItem(myItems[0], '(');
+      checkResultByFile("/codeInsight/completion/normal/" + getTestName(false) + "_after.java");
+
+      //no tail type should work the normal way
+      configureByFile("/codeInsight/completion/normal/" + getTestName(false) + ".java");
+      selectItem(myItems[0]);
+      checkResultByFile("/codeInsight/completion/normal/" + getTestName(false) + "_after2.java");
+    }
+    finally {
+      CodeInsightSettings.getInstance().AUTOINSERT_PAIR_BRACKET = old;
+    }
+  }
+
   public void testExcessSpaceInTypeCast() throws Throwable {
    configureByFile("/codeInsight/completion/normal/" + getTestName(false) + ".java");
    selectItem(myItems[0]);
diff --git a/lib/org.eclipse.jdt.core_3.4.4.v_894_R34x.jar b/lib/org.eclipse.jdt.core_3.4.4.v_894_R34x.jar
deleted file mode 100644 (file)
index 1cd6ea2..0000000
Binary files a/lib/org.eclipse.jdt.core_3.4.4.v_894_R34x.jar and /dev/null differ
diff --git a/lib/org.eclipse.jdt.core_3.5.2.v_981_R35x.jar b/lib/org.eclipse.jdt.core_3.5.2.v_981_R35x.jar
new file mode 100644 (file)
index 0000000..2a0df2b
Binary files /dev/null and b/lib/org.eclipse.jdt.core_3.5.2.v_981_R35x.jar differ
index 358ef44e8b4ce96c8152b1feb0e0dffac32356d0..46f2f1505ef0fbf3bd181531637e763602cff8c3 100644 (file)
@@ -26,7 +26,7 @@ junit-4.6.jar
 log4j.jar
 microba.jar
 nanoxml-2.2.3.jar
-org.eclipse.jdt.core_3.4.4.v_894_R34x.jar
+org.eclipse.jdt.core_3.5.2.v_981_R35x.jar
 oromatcher.jar
 picocontainer.jar
 resolver.jar
diff --git a/lib/src/org.eclipse.jdt.core.source_3.4.4.v_894_R34x.jar b/lib/src/org.eclipse.jdt.core.source_3.4.4.v_894_R34x.jar
deleted file mode 100644 (file)
index 39669a4..0000000
Binary files a/lib/src/org.eclipse.jdt.core.source_3.4.4.v_894_R34x.jar and /dev/null differ
diff --git a/lib/src/org.eclipse.jdt.core.source_3.5.2.v_981_R35x.jar b/lib/src/org.eclipse.jdt.core.source_3.5.2.v_981_R35x.jar
new file mode 100644 (file)
index 0000000..dc46492
Binary files /dev/null and b/lib/src/org.eclipse.jdt.core.source_3.5.2.v_981_R35x.jar differ
index 939c63455152e9746d58a16eb2671c5b0e560142..c958c6e5b525796b4e5172554a9f183dc19ca8a2 100644 (file)
@@ -72,9 +72,9 @@ public abstract class ParenthesesInsertHandler<T extends LookupElement> implemen
     final Document document = editor.getDocument();
     PsiElement element = findNextToken(context);
 
-    final boolean hasParams = placeCaretInsideParentheses(context, item);
-
     final char completionChar = context.getCompletionChar();
+    final boolean putCaretInside = completionChar == '(' || placeCaretInsideParentheses(context, item);
+
     if (completionChar == '(') {
       context.setAddCompletionChar(false);
     }
@@ -99,7 +99,7 @@ public abstract class ParenthesesInsertHandler<T extends LookupElement> implemen
       if (isToken(last, ")")) {
         int rparenthOffset = last.getTextRange().getStartOffset();
         context.setTailOffset(rparenthOffset + 1);
-        if (!hasParams) {
+        if (!putCaretInside) {
           for (int i = lparenthOffset + 1; i < rparenthOffset; i++) {
             if (!Character.isWhitespace(document.getCharsSequence().charAt(i))) {
               return;
@@ -132,7 +132,7 @@ public abstract class ParenthesesInsertHandler<T extends LookupElement> implemen
       tailOffset = TailType.insertChar(editor, tailOffset, ' ');
     }
     document.insertString(tailOffset, ")");
-    editor.getCaretModel().moveToOffset(hasParams ? caret : context.getTailOffset());
+    editor.getCaretModel().moveToOffset(putCaretInside ? caret : context.getTailOffset());
   }
 
   @Nullable
index 4652052bc886ab532afdb1a3f71a4cd64463f300..cb909247c8e71f1cb8acc4e6823a5b68bc21790c 100644 (file)
@@ -30,8 +30,6 @@ import com.intellij.openapi.fileTypes.LanguageFileType;
 import com.intellij.openapi.fileTypes.StdFileTypes;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.project.ProjectManager;
-import com.intellij.openapi.project.ex.ProjectManagerEx;
-import com.intellij.openapi.util.Disposer;
 import com.intellij.psi.PsiDocumentManager;
 import com.intellij.psi.PsiFile;
 import com.intellij.psi.PsiFileFactory;
@@ -48,7 +46,6 @@ import javax.swing.event.AncestorListener;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
 import java.awt.*;
-import java.io.File;
 
 /**
  * Base class for code style settings panels supporting multiple programming languages.
@@ -59,19 +56,11 @@ public abstract class MultilanguageCodeStyleAbstractPanel extends CodeStyleAbstr
 
   private static Language myLanguage;
   private static final Logger LOG = Logger.getInstance("#com.intellij.application.options.codeStyle.MultilanguageCodeStyleAbstractPanel");
-  private static Project mySettingsProject;
-  private static int myInstanceCount;
   private int myLangSelectionIndex;
   private JTabbedPane tabbedPane;
 
   protected MultilanguageCodeStyleAbstractPanel(CodeStyleSettings settings) {
     super(settings);
-    initProject();
-  }
-
-  private synchronized static void initProject() {
-    createSettingsProject();
-    myInstanceCount++;
   }
 
   /**
@@ -153,41 +142,6 @@ public abstract class MultilanguageCodeStyleAbstractPanel extends CodeStyleAbstr
     return psiFile;
   }
 
-  @Override
-  protected final synchronized Project getCurrentProject() {
-    return mySettingsProject;
-  }
-
-  @Override
-  public void dispose() {
-    myInstanceCount--;
-    if (myInstanceCount == 0) {
-      disposeSettingsProject();
-    }
-    super.dispose();
-  }
-
-  /**
-   * A physical settings project is created to ensure that all formatters in preview panels work correctly.
-   */
-  private synchronized static void createSettingsProject() {
-    if (mySettingsProject != null) return;
-    try {
-      File tempFile = File.createTempFile("idea-", "-settings.tmp");
-      tempFile.deleteOnExit();
-      mySettingsProject = ProjectManagerEx.getInstanceEx().newProject("settings.tmp", tempFile.getPath(), true, false);
-    }
-    catch (Exception e) {
-      LOG.error(e);
-    }
-  }
-
-  private synchronized static void disposeSettingsProject() {
-    if (mySettingsProject == null) return;
-    Disposer.dispose(mySettingsProject);
-    mySettingsProject = null;
-  }
-
   protected static JPanel createPreviewPanel() {
     JPanel panel = new JPanel(new BorderLayout());
     panel.setBorder(IdeBorderFactory.createTitledBorder("Preview"));
index 9636cfc40ea8fc5c6f0ddfbffdd64116ceff3962..350f8550566bf11118fda45beef9c413bce632c5 100644 (file)
@@ -24,6 +24,7 @@ import com.intellij.psi.PsiFile;
 import com.intellij.codeInsight.folding.CodeFoldingManager;
 import org.jetbrains.annotations.Nullable;
 
+import java.awt.datatransfer.DataFlavor;
 import java.awt.datatransfer.Transferable;
 import java.awt.datatransfer.UnsupportedFlavorException;
 import java.util.ArrayList;
@@ -59,8 +60,10 @@ public class CopyPasteFoldingProcessor implements CopyPastePostProcessor {
   public TextBlockTransferableData extractTransferableData(final Transferable content) {
     FoldingTransferableData foldingData = null;
     try {
-      foldingData =
-      (FoldingTransferableData)content.getTransferData(FoldingTransferableData.FoldingData.FLAVOR);
+      final DataFlavor flavor = FoldingTransferableData.FoldingData.getDataFlavor();
+      if (flavor != null) {
+        foldingData = (FoldingTransferableData)content.getTransferData(flavor);
+      }
     }
     catch (UnsupportedFlavorException e) {
     }
index 20791b4c4ffcd2861c38179a0525730676a018af..6225bae2f458f090a2e77d9e7465a0e805ed277f 100644 (file)
@@ -16,7 +16,6 @@
 
 package com.intellij.codeInsight.editorActions;
 
-import com.intellij.codeInsight.CodeInsightBundle;
 import org.jetbrains.annotations.NonNls;
 
 import java.awt.datatransfer.DataFlavor;
@@ -30,7 +29,7 @@ public class FoldingTransferableData implements TextBlockTransferableData, Seria
   }
 
   public DataFlavor getFlavor() {
-    return FoldingData.FLAVOR;
+    return FoldingData.getDataFlavor();
   }
 
   public int getOffsetCount() {
@@ -66,8 +65,7 @@ public class FoldingTransferableData implements TextBlockTransferableData, Seria
   }
 
   public static class FoldingData implements Cloneable, Serializable {
-    public static final @NonNls DataFlavor FLAVOR = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType + ";class=" + FoldingData.class.getName(),
-                                                                   CodeInsightBundle.message("paste.data.flavor.folding"));
+    private static @NonNls DataFlavor ourFlavor;
 
     public int startOffset;
     public int endOffset;
@@ -87,5 +85,18 @@ public class FoldingTransferableData implements TextBlockTransferableData, Seria
         throw new RuntimeException();
       }
     }
+
+    public static DataFlavor getDataFlavor() {
+      if (ourFlavor != null) {
+        return ourFlavor;
+      }
+      try {
+        ourFlavor = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType + ";class=" + FoldingData.class.getName(), "FoldingData");
+      }
+      catch (NoClassDefFoundError e) {
+        return null;
+      }
+      return ourFlavor;
+    }
   }
 }
index 1d06ad27857a0aa7248b6ed1322cdb658683c8ae..6e056a425b7c3ce041db7755c0560148a4a5df61 100644 (file)
@@ -45,8 +45,6 @@ import com.intellij.util.text.CharArrayUtil;
 
 import java.awt.datatransfer.DataFlavor;
 import java.awt.datatransfer.Transferable;
-import java.awt.datatransfer.UnsupportedFlavorException;
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Map;
@@ -153,14 +151,7 @@ public class PasteHandler extends EditorActionHandler {
         );
       }
 
-      RawText rawText = null;
-      try {
-        rawText = (RawText)content.getTransferData(RawText.FLAVOR);
-      }
-      catch (UnsupportedFlavorException e) {
-      }
-      catch (IOException e) {
-      }
+      RawText rawText = RawText.fromTransferable(content);
 
       String newText = text;
       for(CopyPastePreProcessor preProcessor: Extensions.getExtensions(CopyPastePreProcessor.EP_NAME)) {
index 4fc8a411f46194b1c4e61e8a5842faac66cef029..3b8f1904dcd13a375c316e03b0bf5167c27e54df 100644 (file)
@@ -17,6 +17,7 @@
 package com.intellij.codeInsight.editorActions;
 
 import com.intellij.openapi.editor.RawText;
+import com.intellij.openapi.util.Comparing;
 import com.intellij.openapi.util.text.StringUtil;
 
 import java.awt.datatransfer.DataFlavor;
@@ -41,9 +42,16 @@ class TextBlockTransferable implements Transferable {
     myRawText = rawText;
 
     List<DataFlavor> dataFlavors = new ArrayList<DataFlavor>();
-    Collections.addAll(dataFlavors, DataFlavor.stringFlavor, DataFlavor.plainTextFlavor, RawText.FLAVOR);
+    Collections.addAll(dataFlavors, DataFlavor.stringFlavor, DataFlavor.plainTextFlavor);
+    final DataFlavor flavor = RawText.getDataFlavor();
+    if (flavor != null) {
+      dataFlavors.add(flavor);
+    }
     for(TextBlockTransferableData data: extraData) {
-      dataFlavors.add(data.getFlavor());
+      final DataFlavor blockFlavor = data.getFlavor();
+      if (blockFlavor != null) {
+        dataFlavors.add(blockFlavor);
+      }
     }
     myTransferDataFlavors = dataFlavors.toArray(new DataFlavor[dataFlavors.size()]);
   }
@@ -65,11 +73,11 @@ class TextBlockTransferable implements Transferable {
   public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
     try {
       for(TextBlockTransferableData data: myExtraData) {
-        if (data.getFlavor().equals(flavor)) {
+        if (Comparing.equal(data.getFlavor(), flavor)) {
           return data;
         }
       }
-      if (RawText.FLAVOR.equals(flavor)) {
+      if (Comparing.equal(RawText.getDataFlavor(), flavor)) {
         return myRawText;
       }
       else if (DataFlavor.stringFlavor.equals(flavor)) {
index a194063ab64888578fb60d0f37638965aa19b90b..266cf04b32fd8af2396fe82519405b44e9b3b5fe 100644 (file)
@@ -68,7 +68,7 @@ public class FoldingUpdate {
     
     return CachedValuesManager.getManager(project).getCachedValue(editor, CODE_FOLDING_KEY, new CachedValueProvider<Runnable>() {
       public Result<Runnable> compute() {
-
+        PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument());
         return getUpdateResult(file, document, quick, project, editor, applyDefaultState);
       }
     }, false);
index b81b574e84acc0727ad7c7241defa52e71cadaab..c299ce3522a30e3193af741c5d6bb8fe8c9be634 100644 (file)
@@ -34,10 +34,7 @@ import com.intellij.openapi.editor.highlighter.HighlighterIterator;
 import com.intellij.openapi.editor.impl.DocumentImpl;
 import com.intellij.openapi.editor.impl.EditorFactoryImpl;
 import com.intellij.openapi.editor.impl.EditorImpl;
-import com.intellij.openapi.editor.markup.HighlighterLayer;
-import com.intellij.openapi.editor.markup.HighlighterTargetArea;
-import com.intellij.openapi.editor.markup.MarkupModel;
-import com.intellij.openapi.editor.markup.RangeHighlighter;
+import com.intellij.openapi.editor.markup.*;
 import com.intellij.openapi.fileEditor.FileEditor;
 import com.intellij.openapi.fileEditor.FileEditorManager;
 import com.intellij.openapi.fileEditor.OpenFileDescriptor;
@@ -258,19 +255,18 @@ public class LanguageConsoleImpl implements Disposable, TypeSafeDataProvider {
     this.myTitle = title;
   }
 
-  public void addToHistory(final String text, final ConsoleViewContentType contentType) {
-    final boolean scrollToEnd = shouldScrollHistoryToEnd();
+  public void addToHistory(final String text, final TextAttributes attributes) {
     final Document history = myHistoryViewer.getDocument();
     final MarkupModel markupModel = history.getMarkupModel(myProject);
     final int offset = history.getTextLength();
     history.insertString(offset, text);
-    if (!text.endsWith("\n")) history.insertString(history.getTextLength(), "\n");
-    markupModel.addRangeHighlighter(offset, history.getTextLength(), HighlighterLayer.SYNTAX, contentType.getAttributes(),
+    markupModel.addRangeHighlighter(offset,
+                                    history.getTextLength(),
+                                    HighlighterLayer.SYNTAX,
+                                    attributes,
                                     HighlighterTargetArea.EXACT_RANGE);
-    queueUiUpdate(scrollToEnd);
   }
 
-
   public String addCurrentToHistory(final TextRange textRange, final boolean erase) {
     final Ref<String> ref = Ref.create("");
     final boolean scrollToEnd = shouldScrollHistoryToEnd();
@@ -286,7 +282,7 @@ public class LanguageConsoleImpl implements Disposable, TypeSafeDataProvider {
     return ref.get();
   }
 
-  private boolean shouldScrollHistoryToEnd() {
+  public boolean shouldScrollHistoryToEnd() {
     final Rectangle visibleArea = myHistoryViewer.getScrollingModel().getVisibleArea();
     final int lineNum = (visibleArea.y + visibleArea.height + myHistoryViewer.getLineHeight()) / myHistoryViewer.getLineHeight();
     final int lineCount = myHistoryViewer.getDocument().getLineCount();
@@ -344,7 +340,7 @@ public class LanguageConsoleImpl implements Disposable, TypeSafeDataProvider {
     return myPanel;
   }
 
-  private void queueUiUpdate(final boolean forceScrollToEnd) {
+  public void queueUiUpdate(final boolean forceScrollToEnd) {
     myForceScrollToEnd.compareAndSet(false, forceScrollToEnd);
     myUpdateQueue.queue(new Update("UpdateUi") {
       public void run() {
index 50f6a9775e443c2c6c76cf5a690d1eff0a40a593..d2a7e8deb3467ed8d27ff34429c1d57cb0948b9b 100644 (file)
@@ -20,6 +20,7 @@ import com.intellij.formatting.Block;
 import com.intellij.formatting.FormattingDocumentModel;
 import com.intellij.formatting.FormattingModel;
 import com.intellij.lang.ASTNode;
+import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.TextRange;
 import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.psi.PsiElement;
@@ -109,8 +110,10 @@ public class PsiBasedFormattingModel implements FormattingModel {
   @Nullable
   protected ASTNode findElementAt(final int offset) {
     PsiFile containingFile = myASTNode.getPsi().getContainingFile();
-    assert !PsiDocumentManager.getInstance(containingFile.getProject()).isUncommited(myDocumentModel.getDocument());
-    PsiElement psiElement = InjectedLanguageUtil.findInjectedElementNoCommitWithOffset(containingFile, offset);
+    Project project = containingFile.getProject();
+    assert !PsiDocumentManager.getInstance(project).isUncommited(myDocumentModel.getDocument());
+    // TODO:default project can not be used for injections, because latter might wants (unavailable) indices
+    PsiElement psiElement = project.isDefault() ? null :InjectedLanguageUtil.findInjectedElementNoCommitWithOffset(containingFile, offset);
     if (psiElement == null) psiElement = containingFile.findElementAt(offset);
     if (psiElement == null) return null;
     return psiElement.getNode();
index ab91bfbb14c4de3735e95905652ec0cd5254fc05..c6d83e13535e86bfb033fe8f0cd7da0272ecf41f 100644 (file)
@@ -344,6 +344,10 @@ public abstract class AbstractFileIndex<IndexEntry extends FileIndexEntry> imple
       return AbstractFileIndex.this.queryNeededFiles(myIncludeChangedFiles, myFileTypesToRefresh);
     }
 
+    public int getNumberOfPendingUpdateJobs() {
+      return 0;
+    }
+
     public void processFile(FileContent fileContent) {
       updateIndexEntry(fileContent.getVirtualFile());
     }
index e9c5350a9c806f9b3ef19d002e4d0a3e33b729ad..a535a7b86742cdad432ee84170763b3d0f02a982 100644 (file)
@@ -66,6 +66,10 @@ public class FileIndexRefreshCacheUpdater extends VirtualFileAdapter implements
     }
   }
 
+  public int getNumberOfPendingUpdateJobs() {
+    return 0;
+  }
+
   public VirtualFile[] queryNeededFiles() {
     return VfsUtil.toVirtualFileArray(myChangedFiles);
   }
index 6474a292f85afaea65bb0076dff612ed3ca964fa..61dbf0e6387977396170f7316790da12967fbe0f 100644 (file)
@@ -1190,6 +1190,10 @@ private boolean indexUnsavedDocument(final Document document, final ID<?, ?> req
     return pair != null? pair.getSecond() : null;
   }
 
+  public int getNumberOfPendingInvalidations() {
+    return myChangedFilesCollector.getNumberOfPendingInvalidations();
+  }
+
   public Collection<VirtualFile> getFilesToUpdate(final Project project) {
     final ProjectFileIndex projectIndex = ProjectRootManager.getInstance(project).getFileIndex();
     return ContainerUtil.findAll(myChangedFilesCollector.getAllFilesToUpdate(), new Condition<VirtualFile>() {
@@ -1533,6 +1537,16 @@ private boolean indexUnsavedDocument(final Document document, final ID<?, ?> req
       }
     }
 
+    public int getNumberOfPendingInvalidations() {
+      r.lock();
+      try {
+        return myFutureInvalidations.size();
+      }
+      finally {
+        r.unlock();
+      }
+    }
+
     public void ensureAllInvalidateTasksCompleted() {
       final int size;
       r.lock();
index ef34fb6b0ce65a1970aed3a5ee4225cb410ec087..4dcee4416e012f25e71c79d72174bdd6f96e6517 100644 (file)
@@ -97,6 +97,10 @@ public class FileBasedIndexProjectHandler extends AbstractProjectComponent imple
   }
 
   private class RefreshCacheUpdater implements CacheUpdater {
+    public int getNumberOfPendingUpdateJobs() {
+      return myIndex.getNumberOfPendingInvalidations();
+    }
+
     public VirtualFile[] queryNeededFiles() {
       Collection<VirtualFile> files = myIndex.getFilesToUpdate(myProject);
       return VfsUtil.toVirtualFileArray(files);
index 27077909ab544c40a94fa459b0a10b921efc4719..5bfa6425d65b721bdfe326e93ac4fa984c01e187 100644 (file)
@@ -19,7 +19,7 @@ package com.intellij.util.indexing;
 import com.intellij.ide.caches.CacheUpdater;
 import com.intellij.ide.caches.FileContent;
 import com.intellij.openapi.project.Project;
-import com.intellij.openapi.roots.*;
+import com.intellij.openapi.roots.CollectingContentIterator;
 import com.intellij.openapi.vfs.VfsUtil;
 import com.intellij.openapi.vfs.VirtualFile;
 
@@ -38,6 +38,10 @@ public class UnindexedFilesUpdater implements CacheUpdater {
     myProject = project;
   }
 
+  public int getNumberOfPendingUpdateJobs() {
+    return myIndex.getNumberOfPendingInvalidations();
+  }
+
   public VirtualFile[] queryNeededFiles() {
     CollectingContentIterator finder = myIndex.createContentIterator();
     FileBasedIndex.iterateIndexableFiles(finder, myProject);
index 6e44cd76cf788c170255b1bfb16a985a73485266..f0d596c800a65c0147c57fe5bfeea5042ecb6024 100644 (file)
@@ -20,8 +20,8 @@ import com.intellij.history.core.LocalVcs;
 import com.intellij.history.core.Paths;
 import com.intellij.history.core.tree.Entry;
 import com.intellij.history.utils.LocalHistoryLog;
-import com.intellij.ide.caches.FileContent;
 import com.intellij.ide.caches.CacheUpdater;
+import com.intellij.ide.caches.FileContent;
 import com.intellij.openapi.command.CommandEvent;
 import com.intellij.openapi.command.CommandListener;
 import com.intellij.openapi.vfs.*;
@@ -59,6 +59,10 @@ public class EventDispatcher extends VirtualFileAdapter implements VirtualFileMa
     return myRefreshDepth > 0;
   }
 
+  public int getNumberOfPendingUpdateJobs() {
+    return 0;
+  }
+
   public VirtualFile[] queryNeededFiles() {
     return getOrInitProcessor().queryNeededFiles();
   }
index 41e15a368b47e7d4385512f187343eda88d119e8..63266d6e6bea87cbf5705842ee9e208c77d58088 100644 (file)
@@ -26,7 +26,10 @@ import com.intellij.openapi.vfs.VfsUtil;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.util.containers.ContainerUtil;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
 
 public class LocalHistoryCacheUpdater implements CacheUpdater {
   private final LocalVcs myVcs;
@@ -82,6 +85,10 @@ public class LocalHistoryCacheUpdater implements CacheUpdater {
     myProcessor.processFile(c);
   }
 
+  public int getNumberOfPendingUpdateJobs() {
+    return 0;
+  }
+
   public void updatingDone() {
     myVcs.endChangeSet(myChangeSetName);
     myVfsRoots = null;
index 7b9be9667ce27052d9f74fafab70ace36b0927c4..ec2ea0b7fe58a2631adaa03932051f569f646c8d 100644 (file)
@@ -35,10 +35,19 @@ public class FeatureStatisticsBundle {
   }
 
   public static String message(@PropertyKey(resourceBundle = BUNDLE)String key, Object... params) {
-    return CommonBundle.message(getBundle(), key, params);
+    return CommonBundle.message(getBundle(key), key, params);
   }
 
-  private static ResourceBundle getBundle() {
+  private static ResourceBundle getBundle(final String key) {
+    // bundles provided by plugins
+    for (FeatureStatisticsBundleProvider provider : FeatureStatisticsBundleProvider.EP_NAME.getExtensions()) {
+      final ResourceBundle bundle = provider.getBundleFor(key);
+      if (bundle != null) {
+        return bundle;
+      }
+    }
+
+    // default bundle
     ResourceBundle bundle = null;
     if (ourBundle != null) bundle = ourBundle.get();
     if (bundle == null) {
diff --git a/platform/platform-api/src/com/intellij/featureStatistics/FeatureStatisticsBundleProvider.java b/platform/platform-api/src/com/intellij/featureStatistics/FeatureStatisticsBundleProvider.java
new file mode 100644 (file)
index 0000000..a8e53b1
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2000-2010 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.featureStatistics;
+
+import com.intellij.openapi.extensions.ExtensionPointName;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.ResourceBundle;
+
+/**
+ * @author Roman.Chernyatchik
+ */
+public interface FeatureStatisticsBundleProvider {
+  ExtensionPointName<FeatureStatisticsBundleProvider> EP_NAME = new ExtensionPointName<FeatureStatisticsBundleProvider>("com.intellij.featureStatBundle");
+
+  @Nullable
+  ResourceBundle getBundleFor(String key);  
+}
index 8fd1aae440f5e1d404062fa0b1eda18b9896427a..68cece670ad2cb77acc132af3aa7d7357167f235 100644 (file)
@@ -19,8 +19,13 @@ package com.intellij.ide.caches;
 import com.intellij.openapi.vfs.VirtualFile;
 
 public interface CacheUpdater {
+  int getNumberOfPendingUpdateJobs();
+
   VirtualFile[] queryNeededFiles();
+
   void processFile(FileContent fileContent);
+
   void updatingDone();
+
   void canceled();
 }
index f3f2231e5dbd378748dcb3b584470caea5e3110f..db72cbb5091ea156d0fd15d1d44e570e8a066540 100644 (file)
@@ -141,17 +141,7 @@ public class EditorModificationUtil {
   }
 
   private static String getStringContent(final Transferable content) throws UnsupportedFlavorException, IOException {
-    RawText raw = null;
-    try {
-      raw = (RawText)content.getTransferData(RawText.FLAVOR);
-    }
-    catch (UnsupportedFlavorException e) {
-      // OK. raw will be null and we'll get plain string
-    }
-    catch (IOException e) {
-      // OK. raw will be null and we'll get plain string
-    }
-
+    RawText raw = RawText.fromTransferable(content);
     String s;
     if (raw != null) {
       s = raw.rawText;
index f94ade31ef3159d803a98da8c38a6888aa394efe..4c070ff737e9122eb6e6f879613a418fc7173f22 100644 (file)
 package com.intellij.openapi.editor;
 
 import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.Nullable;
 
 import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.io.IOException;
 import java.io.Serializable;
 
 public class RawText implements Cloneable, Serializable {
-  public static final @NonNls DataFlavor FLAVOR = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType + ";class=" + RawText.class.getName(),
-                                                                 "Raw Text");
+  public static @NonNls DataFlavor ourFlavor;
   public String rawText;
 
   public RawText(final String rawText) {
@@ -44,4 +47,35 @@ public class RawText implements Cloneable, Serializable {
       throw new RuntimeException();
     }
   }
+
+  public static DataFlavor getDataFlavor() {
+    if (ourFlavor != null) {
+      return ourFlavor;
+    }
+    try {
+      ourFlavor = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType + ";class=" + RawText.class.getName(), "Raw Text");
+    }
+    catch (NoClassDefFoundError e) {
+      return null;
+    }
+    return ourFlavor;
+  }
+
+  @Nullable
+  public static RawText fromTransferable(Transferable content) {
+    RawText raw = null;
+    final DataFlavor flavor = getDataFlavor();
+    if (flavor != null) {
+      try {
+        raw = (RawText)content.getTransferData(flavor);
+      }
+      catch (UnsupportedFlavorException e) {
+        // OK. raw will be null and we'll get plain string
+      }
+      catch (IOException e) {
+        // OK. raw will be null and we'll get plain string
+      }
+    }
+    return raw;
+  }
 }
\ No newline at end of file
index 7ab71dad99809be6dad2ce9aa948d65a3cfee881..51c59a3eb1ccc94a9a9c125cc1e797ee14a4c238 100644 (file)
@@ -44,6 +44,10 @@ public class ToggleDumbModeAction extends AnAction implements DumbAware {
       if (project == null) return;
 
       CacheUpdater updater = new CacheUpdater() {
+        public int getNumberOfPendingUpdateJobs() {
+          return 0;
+        }
+
         public VirtualFile[] queryNeededFiles() {
           while (myDumb) {
             try {
index c68bc2655ecce363db48f9a7470565ec320aeefd..097b2800a0d454047949cdf058d50ee911d17516 100644 (file)
@@ -107,6 +107,7 @@ public final class ActionManagerImpl extends ActionManagerEx implements Applicat
   @NonNls public static final String RELATIVE_TO_ACTION_ATTR_NAME = "relative-to-action";
   @NonNls public static final String FIRST_KEYSTROKE_ATTR_NAME = "first-keystroke";
   @NonNls public static final String SECOND_KEYSTROKE_ATTR_NAME = "second-keystroke";
+  @NonNls public static final String REMOVE_SHORTCUT_ATTR_NAME = "remove";
   @NonNls public static final String KEYMAP_ATTR_NAME = "keymap";
   @NonNls public static final String KEYSTROKE_ATTR_NAME = "keystroke";
   @NonNls public static final String REF_ATTR_NAME = "ref";
@@ -739,8 +740,13 @@ public final class ActionManagerImpl extends ActionManagerEx implements Applicat
       reportActionError(pluginId, "keymap \"" + keymapName + "\" not found");
       return;
     }
-
-    keymap.addShortcut(actionId, new KeyboardShortcut(firstKeyStroke, secondKeyStroke));
+    final String removeOption = element.getAttributeValue(REMOVE_SHORTCUT_ATTR_NAME);
+    final KeyboardShortcut shortcut = new KeyboardShortcut(firstKeyStroke, secondKeyStroke);
+    if (Boolean.valueOf(removeOption)) {
+      keymap.removeShortcut(actionId, shortcut);
+    } else {
+      keymap.addShortcut(actionId, shortcut);
+    }
   }
 
   private static void processMouseShortcutNode(Element element, String actionId, PluginId pluginId) {
@@ -769,7 +775,12 @@ public final class ActionManagerImpl extends ActionManagerEx implements Applicat
       return;
     }
 
-    keymap.addShortcut(actionId, shortcut);
+    final String removeOption = element.getAttributeValue(REMOVE_SHORTCUT_ATTR_NAME);
+    if (Boolean.valueOf(removeOption)) {
+      keymap.removeShortcut(actionId, shortcut);
+    } else {
+      keymap.addShortcut(actionId, shortcut);
+    }
   }
 
   @Nullable
index 9e534f14beec943c185fba8e98fee96d4de96f3f..3a8cdaeda71a215b205838d612a198e3ce94d7c9 100644 (file)
@@ -2300,7 +2300,9 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
     CharSequence chars = myDocument.getCharsNoThreadCheck();
     int nonWhitespaceOffset = CharArrayUtil.shiftForward(chars, lineStart, " \t");
     if (nonWhitespaceOffset < lineEnd) {
-      return calcColumnNumber(nonWhitespaceOffset, line) / getIndentSize();
+      final int columnNumber = calcColumnNumber(nonWhitespaceOffset, line);
+      final int indentSize = getIndentSize();
+      return indentSize != 0 ? columnNumber / indentSize : columnNumber;
     }
     else {
       int upIndent = goUp ? getIndents(line - 1, true, false) : 100;
index cf9747ebd39f931f8bc0a728e981ee56f9245798..9c388e9bbe0e0137c05a284c34c297ae336334f4 100644 (file)
@@ -49,6 +49,13 @@ class CacheUpdateRunner {
     return mySession.getFilesToUpdate().size();
   }
 
+  public int getNumberOfPendingUpdateJobs(ProgressIndicator indicator) {
+    if (mySession == null) {
+      mySession = new CacheUpdateSession(myUpdaters, indicator);
+    }
+    return mySession.getNumberOfPendingUpdateJobs();
+  }
+
   public void processFiles(final ProgressIndicator indicator, boolean processInReadAction) {
     try {
       indicator.checkCanceled();
index 7c48de132107e002f0bc413ad4aa741ad0541d05..565cc27e79e05ee29cca2e8fe077cec896093c71 100644 (file)
@@ -31,6 +31,7 @@ public class CacheUpdateSession {
   private static final Logger LOG = Logger.getInstance("#" + CacheUpdateSession.class.getName());
   private static final Key<Boolean> FAILED_TO_INDEX = Key.create(CacheUpdateSession.class.getSimpleName() + ".FAILED_TO_INDEX");
   private final Collection<VirtualFile> myFilesToUpdate;
+  private final int myJobsToDo;
   private final List<Pair<CacheUpdater, Collection<VirtualFile>>> myUpdatersWithFiles =
     new ArrayList<Pair<CacheUpdater, Collection<VirtualFile>>>();
 
@@ -39,9 +40,11 @@ public class CacheUpdateSession {
 
     myFilesToUpdate = new LinkedHashSet<VirtualFile>();
     try {
+      int jobsCount = 0;
       for (CacheUpdater each : updaters) {
         indicator.checkCanceled();
         try {
+          jobsCount += each.getNumberOfPendingUpdateJobs();
           List<VirtualFile> updaterFiles = Arrays.asList(each.queryNeededFiles());
           processedUpdaters.add(each);
           myFilesToUpdate.addAll(updaterFiles);
@@ -54,6 +57,7 @@ public class CacheUpdateSession {
           LOG.error(e);
         }
       }
+      myJobsToDo = jobsCount;
     }
     catch (ProcessCanceledException e) {
       for (CacheUpdater each : processedUpdaters) {
@@ -63,6 +67,10 @@ public class CacheUpdateSession {
     }
   }
 
+  public int getNumberOfPendingUpdateJobs() {
+    return myJobsToDo;
+  }
+  
   public Collection<VirtualFile> getFilesToUpdate() {
     return myFilesToUpdate;
   }
index b2b1c86543bc64376850d55bb84facbe0ebd75f8..1d6fb06e5439d027b6f233d77d0ea0d7edf131e8 100644 (file)
@@ -111,8 +111,9 @@ public class DumbServiceImpl extends DumbService {
       }
       try {
         final int size = runner.queryNeededFiles(indicator);
-        if (size < 50) {
-          // if not that many files found, process them on the spot, avoiding entering dumb mode
+        if ((size + runner.getNumberOfPendingUpdateJobs(indicator)) < 50) {
+          // If not that many files found, process them on the spot, avoiding entering dumb mode
+          // Consider number of pending tasks as well, becase they may take noticeable time to process even if the number of files is small
           if (size > 0) {
             runner.processFiles(indicator, false);
           }
index 437798bfb9127b1bc1127693d182ca04bca30b5c..46ab77865013f1db1efdf8d534f4c669036d7c56 100644 (file)
@@ -33,6 +33,7 @@ import com.intellij.openapi.keymap.KeymapManager;
 import com.intellij.openapi.project.DumbAwareRunnable;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.project.ProjectManager;
+import com.intellij.openapi.util.registry.Registry;
 import com.intellij.openapi.wm.IdeFrame;
 import com.intellij.openapi.wm.ex.LayoutFocusTraversalPolicyExt;
 import com.intellij.openapi.wm.ex.StatusBarEx;
@@ -84,6 +85,32 @@ public class IdeFrameImpl extends JFrame implements IdeFrame, DataProvider {
     new MnemonicHelper().register(this);
 
     myBalloonLayout = new BalloonLayout(myRootPane.getLayeredPane(), new Insets(8, 8, 8, 8));
+
+    if (!Registry.is("ide.windowSystem.focusAppOnStartup") && !isThereActiveFrame()) {
+      setFocusableWindowState(false);
+    }
+
+  }
+
+  private boolean isThereActiveFrame() {
+    Frame[] all = Frame.getFrames();
+    for (Frame each : all) {
+      if (each.isActive()) {
+        return true;
+      }
+    }
+
+    return false;
+  }
+
+  @Override
+  public void show() {
+    super.show();
+    SwingUtilities.invokeLater(new Runnable() {
+      public void run() {
+        setFocusableWindowState(true);
+      }
+    });
   }
 
   /**
index 760d9d8a0a3adafd055c654d16fae571ee214208..e45a14fc682fde58a6e3c1a225682a1b92efe939 100644 (file)
@@ -304,11 +304,15 @@ error.saving.license.data=Error saving license data.\n{0}
 title.unable.to.save.data=Unable to Save Data
 link.click.here.to.license.server.info=More info
 link.purchase.commercial.license=To purchase a commercial license, please visit
+license.panel.current.license.description=The license will expire on {0,date,MMMM dd, yyyy}
+license.panel.autodescovered.license.server.tile=Default license server
+license.panel.buildit.evaluation.expires.in=Remains {0} day(s)
 editbox.license.user.name=User name:
 editbox.license.license.key=License key:
 radio.license.server.address=Enter license &server address
 radio.license.data=Enter license &data
 radio.evaluate=&Evaluate for free for 30 days
+radio.default.license.server=&Default License Server
 action.activate.tool.window=Activate {0} window
 action.change.splitter.orientations=Change Splitter O_rientations
 error.checkforupdates.connection.failed=Connection failed. Please check your network connection and try again.
index 3e416e34df5556f663d21922073adc72c19d30bb..07c58ae7873f39a5c83dc289caec114b057271ed 100644 (file)
@@ -30,6 +30,7 @@ ide.consumeKnownToolkitBugs=true
 
 ide.windowSystem.hScrollChars=15
 ide.windowSystem.vScrollChars=5
+ide.windowSystem.focusAppOnStartup=true
 
 ide.tree.yeildingUiUpdate=true
 ide.tree.showBusyIndicator=true
index 13eb178f63104daf716361cc4f1304a825a6b69d..164d627090bbd342d64694181ea0e61fe32ebb47 100644 (file)
 
   <extensionPoint name="writingAccessProvider" area="IDEA_PROJECT" interface="com.intellij.openapi.vcs.readOnlyHandler.WritingAccessProvider"/>
   <extensionPoint name="editorNotificationProvider" area="IDEA_PROJECT" interface="com.intellij.ui.EditorNotifications$Provider"/>
+  <extensionPoint name="featureStatBundle" interface="com.intellij.featureStatistics.FeatureStatisticsBundleProvider"/>
 </extensionPoints>
index 3451eaea818c9d3e6251fd6177974b6f4f57c586..da2b2722d6846e62232b0b44b87b94fe81c07955 100644 (file)
   <action id="Console.Hibernate.Properties"><keyboard-shortcut first-keystroke="alt ENTER"/></action>
   <action id="Console.Hibernate.Close"><keyboard-shortcut first-keystroke="control alt shift F4"/></action>
   <action id="Console.Hibernate.Terminate"><keyboard-shortcut first-keystroke="control alt shift DELETE"/></action>
+
+  <action id="Console.Python.Execute"><keyboard-shortcut first-keystroke="control ENTER"/></action>
 </keymap>
 </component>
index 116e6bf01ce32f098544253aef917e6ec6ecc3ab..75b8e47bf94bcb871303a1d60a70d0ba6ee2e9b8 100644 (file)
@@ -21,6 +21,7 @@ import com.intellij.openapi.vfs.VirtualFile;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
+import javax.swing.*;
 import java.util.Collection;
 
 /**
@@ -62,4 +63,6 @@ public interface XBreakpointManager {
   void addBreakpointListener(@NotNull XBreakpointListener<XBreakpoint<?>> listener);
   void removeBreakpointListener(@NotNull XBreakpointListener<XBreakpoint<?>> listener);
   void addBreakpointListener(@NotNull XBreakpointListener<XBreakpoint<?>> listener, @NotNull Disposable parentDisposable);
+
+  void updateBreakpointPresentation(@NotNull XLineBreakpoint<?> breakpoint, @Nullable Icon icon, @Nullable String errorMessage);
 }
index c1c257f9307d078f8a97a57a3d2135d154a82875..ccae800efd12846930b3e6823b2ef8a05d04a48c 100644 (file)
@@ -34,6 +34,7 @@ import com.intellij.xdebugger.impl.XDebuggerManagerImpl;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
+import javax.swing.*;
 import java.util.*;
 
 /**
@@ -230,6 +231,14 @@ public class XBreakpointManagerImpl implements XBreakpointManager, PersistentSta
     myAllBreakpointsDispatcher.addListener(listener, parentDisposable);
   }
 
+  public void updateBreakpointPresentation(@NotNull XLineBreakpoint<?> breakpoint, @Nullable Icon icon, @Nullable String errorMessage) {
+    final CustomizedBreakpointPresentation presentation = new CustomizedBreakpointPresentation();
+    presentation.setErrorMessage(errorMessage);
+    presentation.setIcon(icon);
+    ((XLineBreakpointImpl)breakpoint).setCustomizedPresentation(presentation);
+    myLineBreakpointManager.queueBreakpointUpdate(breakpoint);
+  }
+
   public BreakpointManagerState getState() {
     myDependentBreakpointManager.saveState();
     BreakpointManagerState state = new BreakpointManagerState();
index c22575755bfcf769c329d2cdee79d4a952865f49..72460c7fff04f0f4412a1bff58a17bb8351d9a1b 100644 (file)
@@ -58,6 +58,7 @@ public class XLineBreakpointImpl<P extends XBreakpointProperties> extends XBreak
   private XSourcePosition mySourcePosition;
   @NonNls private static final String BR_NBSP = "<br>&nbsp;";
   private boolean myDisposed;
+  private CustomizedBreakpointPresentation myCustomizedPresentation;
 
   public XLineBreakpointImpl(final XLineBreakpointType<P> type, XBreakpointManagerImpl breakpointManager, String url, int line, final @Nullable P properties) {
     super(type, breakpointManager, properties, new LineBreakpointState<P>(true, type.getId(), url, line));
@@ -141,15 +142,15 @@ public class XLineBreakpointImpl<P extends XBreakpointProperties> extends XBreak
         }
       }
     }
+    if (myCustomizedPresentation != null) {
+      final Icon icon = myCustomizedPresentation.getIcon();
+      if (icon != null) {
+        return icon;
+      }
+    }
     return myType.getEnabledIcon();
   }
 
-  @Nullable
-  private CustomizedBreakpointPresentation getCustomizedPresentation() {
-    final XDebugSessionImpl currentSession = getBreakpointManager().getDebuggerManager().getCurrentSession();
-    return currentSession != null ? currentSession.getBreakpointPresentation(this) : null;
-  }
-
   public int getLine() {
     return myState.getLine();
   }
@@ -270,8 +271,15 @@ public class XLineBreakpointImpl<P extends XBreakpointProperties> extends XBreak
 
   @Nullable
   private String getErrorMessage() {
-    CustomizedBreakpointPresentation presentation = getCustomizedPresentation();
-    return presentation != null ? presentation.getErrorMessage() : null;
+    final XDebugSessionImpl currentSession = getBreakpointManager().getDebuggerManager().getCurrentSession();
+    if (currentSession != null) {
+      CustomizedBreakpointPresentation presentation = currentSession.getBreakpointPresentation(this);
+      if (presentation != null) {
+        final String message = presentation.getErrorMessage();
+        if (message != null) return message;
+      }
+    }
+    return myCustomizedPresentation != null ? myCustomizedPresentation.getErrorMessage() : null;
   }
 
   public void updatePosition() {
@@ -289,6 +297,10 @@ public class XLineBreakpointImpl<P extends XBreakpointProperties> extends XBreak
     }
   }
 
+  public void setCustomizedPresentation(CustomizedBreakpointPresentation presentation) {
+    myCustomizedPresentation = presentation;
+  }
+
   @Tag("line-breakpoint")
   public static class LineBreakpointState<P extends XBreakpointProperties> extends XBreakpointBase.BreakpointState<XLineBreakpoint<P>, P, XLineBreakpointType<P>> {
     private String myFileUrl;
index 4034a113ce070150b6cd629ca586f3f366a66585..71829d0b011a33e9d475ed250162f867c583902e 100644 (file)
@@ -67,4 +67,13 @@ public interface KeyboardShortcut extends DomElement {
        GenericAttributeValue<String> getSecondKeystroke();
 
 
+        /**
+         * Returns the value of the remove child.
+         * Attribute remove option
+         * @return the value of the remove child.
+         */
+        @NotNull
+        GenericAttributeValue<String> getRemove();
+
+
 }
index fd9960457e280ad8f432c143d30f5154b9150ca9..8a211acfc8eebb0b4be82ae02b167fba462170da 100644 (file)
@@ -68,6 +68,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.*;
 import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrLiteral;
 import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.path.GrMethodCallExpression;
 import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.*;
+import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrAccessorMethod;
 import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMember;
 import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod;
 import org.jetbrains.plugins.groovy.lang.psi.api.toplevel.imports.GrImportStatement;
@@ -1124,7 +1125,7 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator {
     boolean isStatic = member.hasModifierProperty(GrModifier.STATIC);
     Annotation annotation = holder.createInfoAnnotation(refExpr.getReferenceNameElement(), null);
 
-    if (member instanceof PsiField ) {
+    if (member instanceof PsiField || member instanceof GrAccessorMethod) {
       annotation.setTextAttributes(isStatic ? DefaultHighlighter.STATIC_FIELD : DefaultHighlighter.INSTANCE_FIELD);
       return;
     }
index 3eff8f0b667b2cc2533170c34f160e659948d9d7..0702fc30acdb1261f9f8e92bdd45d162e48cf205 100644 (file)
  */
 package org.jetbrains.plugins.groovy.lang.psi.controlFlow.impl;
 
+import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.Pair;
 import com.intellij.psi.JavaPsiFacade;
+import com.intellij.psi.PsiConstantEvaluationHelper;
 import com.intellij.psi.PsiElement;
 import com.intellij.psi.PsiType;
 import com.intellij.psi.tree.IElementType;
@@ -51,6 +53,12 @@ public class ControlFlowBuilder extends GroovyRecursiveElementVisitor {
   private List<InstructionImpl> myInstructions;
 
   private Stack<InstructionImpl> myProcessingStack;
+  private PsiConstantEvaluationHelper myConstantEvaluator;
+
+  public ControlFlowBuilder(Project project) {
+    myConstantEvaluator = JavaPsiFacade.getInstance(project).getConstantEvaluationHelper();
+
+  }
 
   private class ExceptionInfo {
     GrCatchClause myClause;
@@ -485,7 +493,10 @@ public class ControlFlowBuilder extends GroovyRecursiveElementVisitor {
     if (condition != null) {
       condition.accept(this);
     }
-    addPendingEdge(whileStatement, myHead); //break
+    final boolean endless = Boolean.TRUE.equals(myConstantEvaluator.computeConstantExpression(condition));
+    if (!endless) {
+      addPendingEdge(whileStatement, myHead); //break
+    }
     final GrCondition body = whileStatement.getBody();
     if (body != null) {
       body.accept(this);
index 2e2246893e74bb2204cdbd177f047d452f6b0c5f..1577d8611e015b52445d56e1e021c207deec2dd3 100644 (file)
@@ -177,7 +177,7 @@ public abstract class GroovyFileBaseImpl extends PsiFileBase implements GroovyFi
 
   public Instruction[] getControlFlow() {
     if (myControlFlow == null) {
-      myControlFlow = new ControlFlowBuilder().buildControlFlow(this, null, null);
+      myControlFlow = new ControlFlowBuilder(getProject()).buildControlFlow(this, null, null);
     }
 
     return myControlFlow;
index 921542e897b01b3fe4ff9ecb6431258fde9e5a20..e35d332bdab7341e49c20ce2378244815681811d 100644 (file)
@@ -49,7 +49,7 @@ public abstract class GrBlockImpl extends GroovyPsiElementImpl implements GrCode
 
   public Instruction[] getControlFlow() {
     if (myControlFlow == null) {
-      myControlFlow = new ControlFlowBuilder().buildControlFlow(this, null, null);
+      myControlFlow = new ControlFlowBuilder(getProject()).buildControlFlow(this, null, null);
     }
 
     return myControlFlow;
index 62e41e0863e96836299dacdfd9e39b7140e62531..6d0696852f6bddd3723a0f7ab070831be9f69484 100644 (file)
@@ -33,6 +33,7 @@ public class MissingReturnTest extends LightCodeInsightFixtureTestCase {
   public void testMissingReturnOvertReturnType() throws Throwable {doTest();}
   public void testMissingReturnFromClosure() throws Throwable {doTest();}
   public void testReturnsWithoutValue() throws Throwable {doTest();}
+  public void testEndlessLoop() throws Throwable {doTest();}
 
   private void doTest() throws Exception {
     myFixture.enableInspections(new MissingReturnInspection());
index f4f314a4884d5d7167876ce7741a776870def2ed..0454648a1d1860e79a2ffef9e40c6701c3e807e3 100644 (file)
@@ -44,6 +44,7 @@ public class ControlFlowTest extends LightCodeInsightFixtureTestCase {
   public void testTry7() throws Throwable { doTest(); }
   public void testWhile1() throws Throwable { doTest(); }
   public void testWhile2() throws Throwable { doTest(); }
+  public void testWhileNonConstant() throws Throwable { doTest(); }
   public void testIfInstanceofElse() throws Throwable { doTest(); }
 
   private static String dumpControlFlow(Instruction[] instructions) {
@@ -66,7 +67,7 @@ public class ControlFlowTest extends LightCodeInsightFixtureTestCase {
     final PsiElement start = file.findElementAt(model.hasSelection() ? model.getSelectionStart() : 0);
     final PsiElement end = file.findElementAt(model.hasSelection() ? model.getSelectionEnd() - 1 : file.getTextLength() - 1);
     final GrControlFlowOwner owner = PsiTreeUtil.getParentOfType(PsiTreeUtil.findCommonParent(start, end), GrControlFlowOwner.class, false);
-    final Instruction[] instructions = new ControlFlowBuilder().buildControlFlow(owner, null, null);
+    final Instruction[] instructions = new ControlFlowBuilder(getProject()).buildControlFlow(owner, null, null);
     final String cf = dumpControlFlow(instructions);
     assertEquals(input.get(1).trim(), cf.trim());
   }
index 0ace8f68f796611f9fa91b45c126d4b6ee9dadf6..529a0ccf047b0f755ac2172af147f6416a760d88 100644 (file)
@@ -3,4 +3,4 @@ class Foo {
   def bar
 }
 
-new Foo().getBar()<caret>
+new Foo().getBar(<caret>)
index 323c64ef13eb3377c03742fa21464e063b4f6e89..f0cd07908070a379668ef3143f5410821375f821 100644 (file)
@@ -6,7 +6,7 @@ while (true) {
 -----
 0(1) element: null
 1(2) WRITE i
-2(3,7) element: WHILE statement
+2(3) element: WHILE statement
 3(4,5) element: IF statement
 4(7) READ i
 5(6) READ i
index 4464fd5ef1b710aaba8a67d642b666cfafa4e7b8..e3542ab03ed1b6fd31b661d962e35287f6bc046c 100644 (file)
@@ -6,7 +6,7 @@ while (true) {
 -----
 0(1) element: null
 1(2) WRITE i
-2(3,7) element: WHILE statement
+2(3) element: WHILE statement
 3(4,5) element: IF statement
 4(2) READ i
 5(6) READ i
diff --git a/plugins/groovy/testdata/groovy/controlFlow/whileNonConstant.test b/plugins/groovy/testdata/groovy/controlFlow/whileNonConstant.test
new file mode 100644 (file)
index 0000000..3f12668
--- /dev/null
@@ -0,0 +1,15 @@
+i = 0
+while (condition()) {
+   if (i > 10) break
+   i++
+}
+-----
+0(1) element: null
+1(2) WRITE i
+2(3) element: WHILE statement
+3(4,8) READ condition
+4(5,6) element: IF statement
+5(8) READ i
+6(7) READ i
+7(2) WRITE i
+8() element: null
\ No newline at end of file
index 2732a393f9d10d830a1499b05b888c1ed224d0a6..e079d4bdc59d875158cee0ad2cf78198addacce5 100644 (file)
@@ -12,9 +12,10 @@ def i = 6
 println i
 -----
 def i = 6
-i = <caret>testMethod(i)
+i = testMethod()
 
-private int testMethod(int i) {
+private int testMethod() {
+  int i
   while (true) {
     println "preved"
     i = 42
diff --git a/plugins/groovy/testdata/highlighting/missingReturn/EndlessLoop.groovy b/plugins/groovy/testdata/highlighting/missingReturn/EndlessLoop.groovy
new file mode 100644 (file)
index 0000000..7e19ff8
--- /dev/null
@@ -0,0 +1,5 @@
+def foo() {
+  while (true) {
+    return 239
+  }
+}
\ No newline at end of file
index bda38ed13487693e1852b62b80df2ad42f164d48..5f5f4dd6690fabd6fe97b75d8302c6bbb2197c5b 100644 (file)
@@ -41,9 +41,8 @@ public abstract class DomModelFactory<T extends DomElement, M extends DomModel<T
   }
 
   protected Module getModelScope(final XmlFile file) {
-    final Module module = ModuleUtil.findModuleForPsiElement(file);
 
-    return module;
+    return ModuleUtil.findModuleForPsiElement(file);
   }
 
   @NotNull
index b50aa26da0abe595b4c965fe1d6c9123caf82a48..79fd0c024e0b048e2e777ce612298eeb028dde10 100644 (file)
 
 package com.intellij.util.xml.model.impl;
 
+import com.intellij.openapi.project.Project;
 import com.intellij.psi.xml.XmlFile;
-import com.intellij.util.xml.DomElement;
-import com.intellij.util.xml.DomFileElement;
-import com.intellij.util.xml.MergedObject;
-import com.intellij.util.xml.DomUtil;
+import com.intellij.util.NullableFunction;
+import com.intellij.util.containers.ContainerUtil;
+import com.intellij.util.xml.*;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.Collections;
@@ -34,24 +34,42 @@ public class DomModelImpl<T extends DomElement> {
 
   protected final DomFileElement<T> myMergedModel;
   protected final Set<XmlFile> myConfigFiles;
+  private Class<T> myClass;
+  private Project myProject;
 
   /**
    * Using this method may result in a large memory usage, since it will keep all the DOM and PSI for all the config files
    * @return
    */
   @Deprecated
-  public DomModelImpl(@NotNull T mergedModel, @NotNull Set<XmlFile> configFiles) {
+  public DomModelImpl(T mergedModel, @NotNull Set<XmlFile> configFiles) {
     myMergedModel = DomUtil.getFileElement(mergedModel);
     myConfigFiles = configFiles;
   }
 
-  public DomModelImpl(@NotNull DomFileElement<T> mergedModel, @NotNull Set<XmlFile> configFiles) {
+  public DomModelImpl(DomFileElement<T> mergedModel, @NotNull Set<XmlFile> configFiles) {
     myMergedModel = DomUtil.getFileElement(mergedModel);
     myConfigFiles = configFiles;
   }
 
+  public DomModelImpl(@NotNull Set<XmlFile> configFiles, Class<T> clazz, Project project) {
+    myProject = project;
+    myMergedModel = null;
+    myConfigFiles = configFiles;
+    myClass = clazz;
+  }
+
   @NotNull
   public T getMergedModel() {
+    if (myMergedModel == null) {
+      final DomManager domManager = DomManager.getDomManager(myProject);
+      return domManager.createModelMerger().mergeModels(myClass, ContainerUtil.mapNotNull(myConfigFiles, new NullableFunction<XmlFile, T>() {
+        public T fun(XmlFile xmlFile) {
+          DomFileElement<T> fileElement = domManager.getFileElement(xmlFile, myClass);
+          return fileElement == null ? null : fileElement.getRootElement();
+        }
+      }));
+    }
     return myMergedModel.getRootElement();
   }
 
@@ -62,6 +80,13 @@ public class DomModelImpl<T extends DomElement> {
 
   @NotNull
   public List<DomFileElement<T>> getRoots() {
+    if (myMergedModel == null) {
+      return ContainerUtil.mapNotNull(myConfigFiles, new NullableFunction<XmlFile, DomFileElement<T>>() {
+        public DomFileElement<T> fun(XmlFile xmlFile) {
+          return DomManager.getDomManager(xmlFile.getProject()).getFileElement(xmlFile, myClass);
+        }
+      });
+    }
     return myMergedModel instanceof MergedObject ? ((MergedObject) myMergedModel).getImplementations() : Collections.singletonList(myMergedModel);
   }
 
index 6655e9ad7c34c24e35f231ce7b55509e2ec42398..f703da01066a9aa99ef31146e2d8b4c7d5ae0482 100644 (file)
@@ -372,7 +372,8 @@ public class XmlTagBlock extends AbstractXmlBlock{
 
   private boolean isAfterAttribute(final int newChildIndex) {
     List<Block> subBlocks = getSubBlocks();
-    Block prevBlock = subBlocks.get(newChildIndex - 1);
+    int index = newChildIndex - 1;
+    Block prevBlock = index < subBlocks.size() ? subBlocks.get(index):null;
     return prevBlock instanceof SyntheticBlock && ((SyntheticBlock)prevBlock).endsWithAttribute();
   }
 }