diff --git a/java/compiler/impl/testSrc/com/intellij/compiler/BaseCompilerTestCase.java b/java/compiler/impl/testSrc/com/intellij/compiler/BaseCompilerTestCase.java index a59768c07bf2..15e9c44a01cf 100644 --- a/java/compiler/impl/testSrc/com/intellij/compiler/BaseCompilerTestCase.java +++ b/java/compiler/impl/testSrc/com/intellij/compiler/BaseCompilerTestCase.java @@ -265,7 +265,6 @@ public abstract class BaseCompilerTestCase extends ModuleTestCase { }; myProject.save(); CompilerTestUtil.saveApplicationSettings(); - CompilerTestUtil.scanSourceRootsToRecompile(myProject); action.run(callback); } }); diff --git a/java/java-impl/src/com/intellij/psi/formatter/java/AbstractJavaBlock.java b/java/java-impl/src/com/intellij/psi/formatter/java/AbstractJavaBlock.java index f97eabe69e0b..b929654852f6 100644 --- a/java/java-impl/src/com/intellij/psi/formatter/java/AbstractJavaBlock.java +++ b/java/java-impl/src/com/intellij/psi/formatter/java/AbstractJavaBlock.java @@ -30,7 +30,7 @@ import com.intellij.psi.formatter.common.AbstractBlock; import com.intellij.psi.formatter.java.wrap.JavaWrapManager; import com.intellij.psi.formatter.java.wrap.ReservedWrapsProvider; import com.intellij.psi.impl.source.SourceTreeToPsiMap; -import com.intellij.psi.impl.source.codeStyle.*; +import com.intellij.psi.impl.source.codeStyle.ShiftIndentInsideHelper; import com.intellij.psi.impl.source.tree.*; import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; import com.intellij.psi.impl.source.tree.java.ClassElement; @@ -41,10 +41,12 @@ import com.intellij.util.text.CharArrayUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; import static com.intellij.psi.formatter.java.JavaFormatterUtil.getWrapType; -import static com.intellij.psi.formatter.java.MultipleFieldDeclarationHelper.*; +import static com.intellij.psi.formatter.java.MultipleFieldDeclarationHelper.findLastFieldInGroup; public abstract class AbstractJavaBlock extends AbstractBlock implements JavaBlock, ReservedWrapsProvider { @@ -436,9 +438,8 @@ public abstract class AbstractJavaBlock extends AbstractBlock implements JavaBlo myIsAfterClassKeyword = true; } if (childType == JavaElementType.METHOD_CALL_EXPRESSION) { - result.add(createMethodCallExpressionBlock(child, - arrangeChildWrap(child, defaultWrap), - arrangeChildAlignment(child, alignmentStrategy), childIndent)); + Alignment alignment = shouldAlignChild(child) ? alignmentStrategy.getAlignment(childType) : null; + result.add(createMethodCallExpressionBlock(child, arrangeChildWrap(child, defaultWrap), alignment, childIndent)); } else { IElementType nodeType = myNode.getElementType(); @@ -505,7 +506,11 @@ public abstract class AbstractJavaBlock extends AbstractBlock implements JavaBlo result.add(new SimpleJavaBlock(child, defaultWrap, alignmentStrategy, childIndent, mySettings, myJavaSettings)); } else { - AlignmentStrategy alignmentStrategyToUse = AlignmentStrategy.wrap(arrangeChildAlignment(child, alignmentStrategy)); + Alignment alignment = alignmentStrategy.getAlignment(childType); + AlignmentStrategy alignmentStrategyToUse = shouldAlignChild(child) + ? AlignmentStrategy.wrap(alignment) + : AlignmentStrategy.getNullStrategy(); + if (myAlignmentStrategy.getAlignment(nodeType, childType) != null && (nodeType == JavaElementType.IMPLEMENTS_LIST || nodeType == JavaElementType.CLASS)) { alignmentStrategyToUse = myAlignmentStrategy; @@ -646,54 +651,52 @@ public abstract class AbstractJavaBlock extends AbstractBlock implements JavaBlo } } - @Nullable - private Alignment arrangeChildAlignment(@NotNull final ASTNode child, @NotNull final AlignmentStrategy alignmentStrategy) { + private boolean shouldAlignChild(@NotNull final ASTNode child) { int role = getChildRole(child); final IElementType nodeType = myNode.getElementType(); - Alignment defaultAlignment = alignmentStrategy.getAlignment(child.getElementType()); if (nodeType == JavaElementType.FOR_STATEMENT) { if (role == ChildRole.FOR_INITIALIZATION || role == ChildRole.CONDITION || role == ChildRole.FOR_UPDATE) { - return defaultAlignment; + return true; } - return null; + return false; } else if (nodeType == JavaElementType.EXTENDS_LIST || nodeType == JavaElementType.IMPLEMENTS_LIST) { if (role == ChildRole.REFERENCE_IN_LIST || role == ChildRole.IMPLEMENTS_KEYWORD) { - return defaultAlignment; + return true; } - return null; + return false; } else if (nodeType == JavaElementType.THROWS_LIST) { if (role == ChildRole.REFERENCE_IN_LIST) { - return defaultAlignment; + return true; } - return null; + return false; } else if (nodeType == JavaElementType.CLASS) { - if (role == ChildRole.CLASS_OR_INTERFACE_KEYWORD) return defaultAlignment; - if (myIsAfterClassKeyword) return null; - if (role == ChildRole.MODIFIER_LIST) return defaultAlignment; - return null; + if (role == ChildRole.CLASS_OR_INTERFACE_KEYWORD) return true; + if (myIsAfterClassKeyword) return false; + if (role == ChildRole.MODIFIER_LIST) return true; + return false; } else if (JavaElementType.FIELD == nodeType) { - return getVariableDeclarationSubElementAlignment(child); + return shouldAlignFieldInColumns(child); } else if (nodeType == JavaElementType.METHOD) { - if (role == ChildRole.MODIFIER_LIST) return defaultAlignment; - if (role == ChildRole.TYPE_PARAMETER_LIST) return defaultAlignment; - if (role == ChildRole.TYPE) return defaultAlignment; - if (role == ChildRole.NAME) return defaultAlignment; - if (role == ChildRole.THROWS_LIST && mySettings.ALIGN_THROWS_KEYWORD) return defaultAlignment; - return null; + if (role == ChildRole.MODIFIER_LIST) return true; + if (role == ChildRole.TYPE_PARAMETER_LIST) return true; + if (role == ChildRole.TYPE) return true; + if (role == ChildRole.NAME) return true; + if (role == ChildRole.THROWS_LIST && mySettings.ALIGN_THROWS_KEYWORD) return true; + return false; } else if (nodeType == JavaElementType.ASSIGNMENT_EXPRESSION) { - if (role == ChildRole.LOPERAND) return defaultAlignment; + if (role == ChildRole.LOPERAND) return true; if (role == ChildRole.ROPERAND && child.getElementType() == JavaElementType.ASSIGNMENT_EXPRESSION) { - return defaultAlignment; + return true; } - return null; + return false; } else if (child.getElementType() == JavaTokenType.END_OF_LINE_COMMENT) { @@ -704,9 +707,9 @@ public abstract class AbstractJavaBlock extends AbstractBlock implements JavaBlo CharSequence prevChars; if (previous != null && previous.getElementType() == TokenType.WHITE_SPACE && (prevChars = previous.getChars()).length() > 0 && prevChars.charAt(prevChars.length() - 1) == '\n') { - return null; + return false; } - return defaultAlignment; + return true; } else if (nodeType == JavaElementType.MODIFIER_LIST) { @@ -714,13 +717,13 @@ public abstract class AbstractJavaBlock extends AbstractBlock implements JavaBlo // that the list is aligned. We want to apply alignment rule only to the first element then. ASTNode previous = child.getTreePrev(); if (previous == null || previous.getTreeParent() != myNode) { - return defaultAlignment; + return true; } - return null; + return false; } else { - return defaultAlignment; + return true; } } @@ -737,12 +740,12 @@ public abstract class AbstractJavaBlock extends AbstractBlock implements JavaBlo * @see CodeStyleSettings#ALIGN_GROUP_FIELD_DECLARATIONS */ @Nullable - private Alignment getVariableDeclarationSubElementAlignment(@NotNull ASTNode child) { + private boolean shouldAlignFieldInColumns(@NotNull ASTNode child) { // The whole idea of variable declarations alignment is that complete declaration blocks which children are to be aligned hold // reference to the same AlignmentStrategy object, hence, reuse the same Alignment objects. So, there is no point in checking // if it's necessary to align sub-blocks if shared strategy is not defined. if (!mySettings.ALIGN_GROUP_FIELD_DECLARATIONS) { - return null; + return false; } IElementType childType = child.getElementType(); @@ -751,10 +754,10 @@ public abstract class AbstractJavaBlock extends AbstractBlock implements JavaBlo // should be aligned then. ASTNode previousNode = FormatterUtil.getPreviousNonWhitespaceSibling(child); if (childType == JavaTokenType.IDENTIFIER && (previousNode == null || previousNode.getElementType() == JavaTokenType.COMMA)) { - return null; + return false; } - return myAlignmentStrategy.getAlignment(childType); + return true; } @Nullable diff --git a/java/java-impl/src/com/intellij/psi/formatter/java/SimpleJavaBlock.java b/java/java-impl/src/com/intellij/psi/formatter/java/SimpleJavaBlock.java index 3733b156a671..d53c81fb8433 100644 --- a/java/java-impl/src/com/intellij/psi/formatter/java/SimpleJavaBlock.java +++ b/java/java-impl/src/com/intellij/psi/formatter/java/SimpleJavaBlock.java @@ -29,7 +29,6 @@ import com.intellij.psi.impl.source.tree.StdTokenSets; import com.intellij.psi.tree.IElementType; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -64,21 +63,22 @@ public class SimpleJavaBlock extends AbstractJavaBlock { myCurrentIndent = null; processHeadCommentsAndWhiteSpaces(result); - myReservedAlignment = createChildAlignment(); - myReservedAlignment2 = createChildAlignment2(myReservedAlignment); + calculateReservedAlignments(); + Wrap childWrap = createChildWrap(); processRemainingChildren(result, childWrap); return result; } - @Nullable - protected Alignment createChildAlignment2(@Nullable Alignment base) { - final IElementType nodeType = myNode.getElementType(); - if (nodeType == JavaElementType.CONDITIONAL_EXPRESSION) { - return base == null ? createAlignment(mySettings.ALIGN_MULTILINE_TERNARY_OPERATION, null) : createAlignment(base, mySettings.ALIGN_MULTILINE_TERNARY_OPERATION, null); + private void calculateReservedAlignments() { + myReservedAlignment = createChildAlignment(); + + IElementType nodeType = myNode.getElementType(); + if (nodeType == JavaElementType.CONDITIONAL_EXPRESSION && mySettings.ALIGN_MULTILINE_TERNARY_OPERATION) { + myReservedAlignment2 = myReservedAlignment != null ? Alignment.createChildAlignment(myReservedAlignment) + : Alignment.createAlignment(); } - return null; } private void processRemainingChildren(List result, Wrap childWrap) { @@ -86,6 +86,12 @@ public class SimpleJavaBlock extends AbstractJavaBlock { if (isNotEmptyNode(myCurrentChild)) { final ASTNode astNode = myCurrentChild; AlignmentStrategy alignmentStrategyToUse = AlignmentStrategy.wrap(chooseAlignment(myReservedAlignment, myReservedAlignment2, myCurrentChild)); + + if (myNode.getElementType() == JavaElementType.FIELD) { + alignmentStrategyToUse = myAlignmentStrategy; + } + + myCurrentChild = processChild(result, astNode, alignmentStrategyToUse, childWrap, myCurrentIndent, myCurrentOffset); if (astNode != myCurrentChild && myCurrentChild != null) { myCurrentOffset = myCurrentChild.getTextRange().getStartOffset(); @@ -124,7 +130,7 @@ public class SimpleJavaBlock extends AbstractJavaBlock { } } - private boolean isNotEmptyNode(@NotNull ASTNode child) { + private static boolean isNotEmptyNode(@NotNull ASTNode child) { return !FormatterUtil.containsWhiteSpacesOnly(child) && child.getTextLength() > 0; } diff --git a/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableDialog.java b/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableDialog.java index 350422dd436b..9523408a3a49 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableDialog.java @@ -104,7 +104,7 @@ class IntroduceVariableDialog extends DialogWrapper implements IntroduceVariable } public boolean isDeclareFinal() { - return myCbFinal.isEnabled() && myCbFinalState; + return myCbFinal.isSelected(); } public boolean isReplaceLValues() { @@ -264,7 +264,7 @@ class IntroduceVariableDialog extends DialogWrapper implements IntroduceVariable myNameSuggestionsManager.nameSelected(); myTypeSelectorManager.typeSelected(getSelectedType()); if (myCbFinal.isEnabled()) { - JavaRefactoringSettings.getInstance().INTRODUCE_LOCAL_CREATE_FINALS = myCbFinalState; + JavaRefactoringSettings.getInstance().INTRODUCE_LOCAL_CREATE_FINALS = myCbFinal.isSelected(); } super.doOKAction(); } diff --git a/java/java-psi-api/src/com/intellij/psi/PsiCapturedWildcardType.java b/java/java-psi-api/src/com/intellij/psi/PsiCapturedWildcardType.java index c94709ee164a..c3fe6c7775ac 100644 --- a/java/java-psi-api/src/com/intellij/psi/PsiCapturedWildcardType.java +++ b/java/java-psi-api/src/com/intellij/psi/PsiCapturedWildcardType.java @@ -77,7 +77,7 @@ public class PsiCapturedWildcardType extends PsiType.Stub { return false; } - if (myContext instanceof PsiReferenceExpression && !Comparing.equal(myParameter, captured.myParameter)) { + if ((myContext instanceof PsiReferenceExpression || myContext instanceof PsiMethodCallExpression) && !Comparing.equal(myParameter, captured.myParameter)) { return false; } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/PsiSubstitutorImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/PsiSubstitutorImpl.java index 48a41cbafc8f..0bfa3befdbc7 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/PsiSubstitutorImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/PsiSubstitutorImpl.java @@ -344,7 +344,23 @@ public class PsiSubstitutorImpl implements PsiSubstitutor { } } if (alreadyFound) continue;*/ - final PsiType substituted = substituteInternal(original); + PsiType substituted; + if (original instanceof PsiWildcardType) { + substituted = substituteInternal(original); + if (substituted instanceof PsiCapturedWildcardType) { + substituted = PsiCapturedWildcardType.create(((PsiCapturedWildcardType)substituted).getWildcard(), ((PsiCapturedWildcardType)substituted).getContext(), param); + } + else if (substituted instanceof PsiWildcardType) { + PsiType bound = ((PsiWildcardType)substituted).getBound(); + if (bound instanceof PsiCapturedWildcardType) { + bound = PsiCapturedWildcardType.create(((PsiCapturedWildcardType)bound).getWildcard(), ((PsiCapturedWildcardType)bound).getContext(), param); + substituted = ((PsiWildcardType)substituted).isExtends() ? PsiWildcardType.createExtends(((PsiWildcardType)substituted).getManager(), bound) + : PsiWildcardType.createSuper(((PsiWildcardType)substituted).getManager(), bound); + } + } + } else { + substituted = substituteInternal(original); + } //if (substituted == null) return false; substMap.put(param, substituted); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/DistinguishWildcardCapturesAlsoByMethodCalls.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/DistinguishWildcardCapturesAlsoByMethodCalls.java new file mode 100644 index 000000000000..26ebaf47df1f --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/DistinguishWildcardCapturesAlsoByMethodCalls.java @@ -0,0 +1,8 @@ +class B {} +abstract class A { + void baz(B a) {} + abstract B foo(); + void bar(A a) { + baz(a.foo()); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/SubstituteTypeParameterOfCapturedWildcardOnSubstitution.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/SubstituteTypeParameterOfCapturedWildcardOnSubstitution.java new file mode 100644 index 000000000000..6bd8b7a192cf --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/SubstituteTypeParameterOfCapturedWildcardOnSubstitution.java @@ -0,0 +1,34 @@ +class B {} +abstract class A { + void baz5(B a) {} + abstract B foo5(); + void bar5(A a) { + baz5(a.foo5()); + } + + void baz7(B a) {} + abstract B foo7(); + void bar7(A a) { + baz7(a.foo7()); + } + + void baz9(B a) {} + abstract B foo9(); + void bar9(A a) { + baz9(a.foo9()); + } + + + void baz14(B a) {} + abstract B foo14(); + void bar14(A a) { + baz14(a.foo14()); + } + + + void baz24(B a) {} + abstract B foo24(); + void bar24(A a) { + baz24(a.foo24()); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java index 663f674e813b..bb377400bd06 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java @@ -442,6 +442,14 @@ public class GenericsHighlightingTest extends LightDaemonAnalyzerTestCase { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); } + public void testDistinguishWildcardCapturesAlsoByMethodCalls() throws Exception { + doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); + } + + public void testSubstituteTypeParameterOfCapturedWildcardOnSubstitution() throws Exception { + doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); + } + public void testJavaUtilCollections_NoVerify() throws Exception { PsiClass collectionsClass = getJavaFacade().findClass("java.util.Collections", GlobalSearchScope.moduleWithLibrariesScope(getModule())); assertNotNull(collectionsClass); diff --git a/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterAlignmentTest.java b/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterAlignmentTest.java index 8068d31d0681..915fc39b99db 100644 --- a/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterAlignmentTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterAlignmentTest.java @@ -407,4 +407,18 @@ public class JavaFormatterAlignmentTest extends AbstractJavaFormatterTest { getSettings().RIGHT_MARGIN = 75; doMethodTest(before, before); } + + public void testAlignMethodCalls_PassedAsParameters_InMethodCall() { + getSettings().ALIGN_MULTILINE_PARAMETERS_IN_CALLS = true; + + doMethodTest( + "test(call1(),\n" + + " call2(),\n" + + " call3());\n", + "test(call1(),\n" + + " call2(),\n" + + " call3());\n" + ); + } + } diff --git a/java/testFramework/src/com/intellij/compiler/CompilerTestUtil.java b/java/testFramework/src/com/intellij/compiler/CompilerTestUtil.java index 6a4f22189e32..aac45eac8e03 100644 --- a/java/testFramework/src/com/intellij/compiler/CompilerTestUtil.java +++ b/java/testFramework/src/com/intellij/compiler/CompilerTestUtil.java @@ -19,7 +19,6 @@ import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.projectRoots.impl.JavaAwareProjectJdkTableImpl; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.ModuleRootModificationUtil; -import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.JDOMExternalizable; import com.intellij.openapi.util.JDOMUtil; import com.intellij.openapi.util.NamedJDOMExternalizable; @@ -29,9 +28,9 @@ import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess; import com.intellij.util.SystemProperties; +import junit.framework.AssertionFailedError; import org.jdom.Element; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes; import org.jetbrains.jps.model.serialization.JDomSerializationUtil; import org.junit.Assert; @@ -54,11 +53,10 @@ public class CompilerTestUtil { compilerConfiguration.setDefaultCompiler(compilerConfiguration.getJavacCompiler()); } + /** + * @deprecated not needed anymore + */ public static void scanSourceRootsToRecompile(Project project) { - // need this to emulate project opening - final List roots = ProjectRootManager.getInstance(project).getModuleSourceRoots(JavaModuleSourceRootTypes.SOURCES); - // todo: forced source roots scan is not needed? - //TranslatingCompilerFilesMonitor.getInstance().scanSourceContent(new TranslatingCompilerFilesMonitor.ProjectRef(project), roots, roots.size(), true); } public static void saveApplicationSettings() { @@ -73,9 +71,9 @@ public class CompilerTestUtil { State state = StoreUtil.getStateSpec(appComponent.getClass()); if (state != null) { componentName = state.name(); - Storage lastStorage = state.storages()[state.storages().length - 1]; + Storage storageToWrite = findNonDeprecated(state.storages()); StateStorageManager storageManager = ((ApplicationImpl)ApplicationManager.getApplication()).getStateStore().getStateStorageManager(); - file = new File(storageManager.expandMacros(lastStorage.file())); + file = new File(storageManager.expandMacros(storageToWrite.file())); } else if (appComponent instanceof ExportableApplicationComponent && appComponent instanceof NamedJDOMExternalizable) { componentName = ((ExportableApplicationComponent)appComponent).getComponentName(); @@ -123,6 +121,15 @@ public class CompilerTestUtil { } } + private static Storage findNonDeprecated(Storage[] storages) { + for (Storage storage : storages) { + if (!storage.deprecated()) { + return storage; + } + } + throw new AssertionFailedError("All storages are deprecated"); + } + public static void enableExternalCompiler() { new WriteAction() { @Override diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/FSOperations.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/FSOperations.java index 979ae3d68004..f20963439f49 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/FSOperations.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/FSOperations.java @@ -17,6 +17,7 @@ package org.jetbrains.jps.incremental; import com.intellij.openapi.util.io.FileSystemUtil; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.util.containers.ContainerUtil; import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -151,7 +152,7 @@ public class FSOperations { for (final BuildTarget target : targetChunk.getTargets()) { if (target instanceof ModuleBuildTarget) { final Set deps = getDependentModulesRecursively(((ModuleBuildTarget)target).getModule(), classpathKind); - if (Utils.intersects(deps, modules)) { + if (ContainerUtil.intersects(deps, modules)) { for (BuildTarget buildTarget : targetChunk.getTargets()) { if (buildTarget instanceof ModuleBuildTarget) { dirtyTargets.add((ModuleBuildTarget)buildTarget); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/Utils.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/Utils.java index f99ced20ef71..4f0938f61ee6 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/Utils.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/Utils.java @@ -22,14 +22,15 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.PathUtilRt; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.builders.BuildTarget; -import org.jetbrains.jps.model.module.JpsModule; import org.jetbrains.jps.model.serialization.JpsProjectLoader; import org.jetbrains.jps.model.serialization.PathMacroUtil; import java.io.File; import java.net.URI; import java.net.URISyntaxException; -import java.util.*; +import java.util.Collection; +import java.util.Locale; +import java.util.Map; /** * @author Eugene Zhuravlev @@ -122,13 +123,6 @@ public class Utils { return new File(toURI(path)); } - public static boolean intersects(Set set1, Set set2) { - if (set1.size() < set2.size()) { - return new HashSet(set1).removeAll(set2); - } - return new HashSet(set2).removeAll(set1); - } - public static boolean errorsDetected(CompileContext context) { return ERRORS_DETECTED_KEY.get(context, Boolean.FALSE); } diff --git a/jps/standalone-builder/src/org/jetbrains/jps/gant/JpsGantProjectBuilder.java b/jps/standalone-builder/src/org/jetbrains/jps/gant/JpsGantProjectBuilder.java index db384a5f3024..02774834b943 100644 --- a/jps/standalone-builder/src/org/jetbrains/jps/gant/JpsGantProjectBuilder.java +++ b/jps/standalone-builder/src/org/jetbrains/jps/gant/JpsGantProjectBuilder.java @@ -340,7 +340,7 @@ public class JpsGantProjectBuilder { String.valueOf(sources)); if (!myBuildIncrementally && sources > 0) { myBuildInfoPrinter.printStatisticsMessage(JpsGantProjectBuilder.this, "Compilation time per file for '" + message.getBuilderName() + "', ms", - String.format("%.2f", (double)message.getElapsedTimeMs() / sources)); + String.format(Locale.US, "%.2f", (double)message.getElapsedTimeMs() / sources)); } } else if (!text.isEmpty()) { diff --git a/platform/lang-impl/src/com/intellij/ide/fileTemplates/FileTemplateManager.java b/platform/lang-impl/src/com/intellij/ide/fileTemplates/FileTemplateManager.java index bf323cd66407..576a22766485 100644 --- a/platform/lang-impl/src/com/intellij/ide/fileTemplates/FileTemplateManager.java +++ b/platform/lang-impl/src/com/intellij/ide/fileTemplates/FileTemplateManager.java @@ -22,6 +22,7 @@ import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.util.Key; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Collection; import java.util.Properties; @@ -68,7 +69,10 @@ public abstract class FileTemplateManager{ public abstract void setCurrentScheme(@NotNull FileTemplatesScheme scheme); - @NotNull + /** + * @return Project scheme, or null if manager is created for default project. + */ + @Nullable public abstract FileTemplatesScheme getProjectScheme(); public abstract FileTemplate[] getTemplates(String category); diff --git a/platform/lang-impl/src/com/intellij/ide/fileTemplates/impl/ChangeSchemaCombo.java b/platform/lang-impl/src/com/intellij/ide/fileTemplates/impl/ChangeSchemaCombo.java index 2386d8d612ed..4bb603ca6f66 100644 --- a/platform/lang-impl/src/com/intellij/ide/fileTemplates/impl/ChangeSchemaCombo.java +++ b/platform/lang-impl/src/com/intellij/ide/fileTemplates/impl/ChangeSchemaCombo.java @@ -46,8 +46,12 @@ public class ChangeSchemaCombo extends ComboBoxAction implements DumbAware { @NotNull @Override protected DefaultActionGroup createPopupActionGroup(JComponent button) { - return new DefaultActionGroup(new ChangeSchemaAction(FileTemplatesScheme.DEFAULT), - new ChangeSchemaAction(myConfigurable.getManager().getProjectScheme())); + DefaultActionGroup group = new DefaultActionGroup(new ChangeSchemaAction(FileTemplatesScheme.DEFAULT)); + FileTemplatesScheme scheme = myConfigurable.getManager().getProjectScheme(); + if (scheme != null) { + group.add(new ChangeSchemaAction(scheme)); + } + return group; } @Override @@ -64,7 +68,7 @@ public class ChangeSchemaCombo extends ComboBoxAction implements DumbAware { private final FileTemplatesScheme myScheme; - public ChangeSchemaAction(FileTemplatesScheme scheme) { + public ChangeSchemaAction(@NotNull FileTemplatesScheme scheme) { super(scheme.getName()); myScheme = scheme; } diff --git a/platform/lang-impl/src/com/intellij/ide/fileTemplates/impl/FileTemplateManagerImpl.java b/platform/lang-impl/src/com/intellij/ide/fileTemplates/impl/FileTemplateManagerImpl.java index ca5db04eee29..c9d91ac81f9e 100644 --- a/platform/lang-impl/src/com/intellij/ide/fileTemplates/impl/FileTemplateManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/ide/fileTemplates/impl/FileTemplateManagerImpl.java @@ -66,6 +66,7 @@ public class FileTemplateManagerImpl extends FileTemplateManager implements Pers private final FileTypeManagerEx myTypeManager; private final Project myProject; + @Nullable private final FileTemplatesScheme myProjectScheme; private FileTemplatesScheme myScheme = FileTemplatesScheme.DEFAULT; @@ -88,17 +89,16 @@ public class FileTemplateManagerImpl extends FileTemplateManager implements Pers final Project project) { myTypeManager = typeManager; myProject = project; - ExportableFileTemplateSettings templateSettings = ExportableFileTemplateSettings.getInstance(); - assert templateSettings != null : "Can not instantiate " + ExportableFileTemplateSettings.class.getName(); + FileTemplatesLoader loader = new FileTemplatesLoader(typeManager); - myInternalTemplatesManager = templateSettings.getInternalTemplatesManager(); - myDefaultTemplatesManager = templateSettings.getDefaultTemplatesManager(); - myPatternsManager = templateSettings.getPatternsManager(); - myCodeTemplatesManager = templateSettings.getCodeTemplatesManager(); - myJ2eeTemplatesManager = templateSettings.getJ2eeTemplatesManager(); - myAllManagers = templateSettings.getAllManagers(); - myDefaultTemplateDescription = templateSettings.getDefaultTemplateDescription(); - myDefaultIncludeDescription = templateSettings.getDefaultIncludeDescription(); + myInternalTemplatesManager = loader.getInternalTemplatesManager(); + myDefaultTemplatesManager = loader.getDefaultTemplatesManager(); + myPatternsManager = loader.getPatternsManager(); + myCodeTemplatesManager = loader.getCodeTemplatesManager(); + myJ2eeTemplatesManager = loader.getJ2eeTemplatesManager(); + myAllManagers = loader.getAllManagers(); + myDefaultTemplateDescription = loader.getDefaultTemplateDescription(); + myDefaultIncludeDescription = loader.getDefaultIncludeDescription(); if (ApplicationManager.getApplication().isUnitTestMode()) { for (String tname : Arrays.asList("Class", "AnnotationType", "Enum", "Interface")) { @@ -113,7 +113,7 @@ public class FileTemplateManagerImpl extends FileTemplateManager implements Pers } } - myProjectScheme = new FileTemplatesScheme("Project") { + myProjectScheme = project.isDefault() ? null : new FileTemplatesScheme("Project") { @NotNull @Override public String getTemplatesDir() { @@ -143,7 +143,6 @@ public class FileTemplateManagerImpl extends FileTemplateManager implements Pers } } - @NotNull @Override public FileTemplatesScheme getProjectScheme() { return myProjectScheme; @@ -434,7 +433,7 @@ public class FileTemplateManagerImpl extends FileTemplateManager implements Pers @Override public void loadState(State state) { XmlSerializerUtil.copyBean(state, myState); - setCurrentScheme(myProjectScheme.getName().equals(state.SCHEME) ? myProjectScheme : FileTemplatesScheme.DEFAULT); + setCurrentScheme(myProjectScheme != null && myProjectScheme.getName().equals(state.SCHEME) ? myProjectScheme : FileTemplatesScheme.DEFAULT); } public static class State { diff --git a/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndexImpl.java b/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndexImpl.java index 4ed9341ae882..ef9431c85693 100644 --- a/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndexImpl.java +++ b/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndexImpl.java @@ -2560,12 +2560,12 @@ public class FileBasedIndexImpl extends FileBasedIndex { } for (VirtualFile root : IndexableSetContributor.getRootsToIndex(provider)) { if (visitedRoots.add(root)) { - iterateRecursively(root, processor, indicator, visitedRoots); + iterateRecursively(root, processor, indicator, visitedRoots, null); } } for (VirtualFile root : IndexableSetContributor.getProjectRootsToIndex(provider, project)) { if (visitedRoots.add(root)) { - iterateRecursively(root, processor, indicator, visitedRoots); + iterateRecursively(root, processor, indicator, visitedRoots, null); } } } @@ -2588,7 +2588,7 @@ public class FileBasedIndexImpl extends FileBasedIndex { for (VirtualFile[] roots : new VirtualFile[][]{libSources, libClasses}) { for (VirtualFile root : roots) { if (visitedRoots.add(root)) { - iterateRecursively(root, processor, indicator, null); + iterateRecursively(root, processor, indicator, null, projectFileIndex); } } } @@ -2601,8 +2601,8 @@ public class FileBasedIndexImpl extends FileBasedIndex { private static void iterateRecursively(@Nullable final VirtualFile root, @NotNull final ContentIterator processor, @Nullable final ProgressIndicator indicator, - @Nullable final Set visitedRoots - ) { + @Nullable final Set visitedRoots, + @Nullable final ProjectFileIndex projectFileIndex) { if (root == null) { return; } @@ -2613,6 +2613,9 @@ public class FileBasedIndexImpl extends FileBasedIndex { if (visitedRoots != null && !root.equals(file) && file.isDirectory() && !visitedRoots.add(file)) { return false; // avoid visiting files more than once, e.g. additional indexed roots intersect sometimes } + if (projectFileIndex != null && projectFileIndex.isExcluded(file)) { + return false; + } if (indicator != null) indicator.checkCanceled(); processor.processFile(file); diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/InstalledPluginsManagerMain.java b/platform/platform-impl/src/com/intellij/ide/plugins/InstalledPluginsManagerMain.java index 60a7dbdff3be..2b74ee5f3f44 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/InstalledPluginsManagerMain.java +++ b/platform/platform-impl/src/com/intellij/ide/plugins/InstalledPluginsManagerMain.java @@ -31,6 +31,7 @@ import com.intellij.openapi.fileChooser.FileChooser; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.options.ex.SingleConfigurableEditor; import com.intellij.openapi.project.DumbAware; +import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.ui.ex.MessagesEx; import com.intellij.openapi.updateSettings.impl.PluginDownloader; @@ -415,7 +416,7 @@ public class InstalledPluginsManagerMain extends PluginManagerMain { protected DefaultActionGroup createPopupActionGroup(JComponent button) { final DefaultActionGroup gr = new DefaultActionGroup(); for (final String enabledValue : InstalledPluginsTableModel.ENABLED_VALUES) { - gr.add(new AnAction(enabledValue) { + gr.add(new DumbAwareAction(enabledValue) { @Override public void actionPerformed(AnActionEvent e) { final IdeaPluginDescriptor[] selection = pluginTable.getSelectedObjects(); diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/sorters/AbstractSortByAction.java b/platform/platform-impl/src/com/intellij/ide/plugins/sorters/AbstractSortByAction.java index b858a3025e1f..e817f6ad823b 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/sorters/AbstractSortByAction.java +++ b/platform/platform-impl/src/com/intellij/ide/plugins/sorters/AbstractSortByAction.java @@ -43,6 +43,11 @@ public abstract class AbstractSortByAction extends ToggleAction { return isSelected(); } + @Override + public boolean isDumbAware() { + return true; + } + @Override public final void setSelected(AnActionEvent e, boolean state) { IdeaPluginDescriptor[] selected = myTable.getSelectedObjects(); diff --git a/platform/platform-resources-en/src/tips/SearchEverywhere.html b/platform/platform-resources-en/src/tips/SearchEverywhere.html index 5e6dd153fd58..3df6387790bd 100644 --- a/platform/platform-resources-en/src/tips/SearchEverywhere.html +++ b/platform/platform-resources-en/src/tips/SearchEverywhere.html @@ -4,7 +4,8 @@

-Searches through classes, files, tool windows, actions, settings, and symbols by double pressing + &productName; allows you to search through the classes, + files, tool windows, actions, settings, and symbols of your project by double pressing the Shift key.

\ No newline at end of file diff --git a/platform/platform-tests/testSrc/com/intellij/ide/LightFileTemplatesTest.java b/platform/platform-tests/testSrc/com/intellij/ide/LightFileTemplatesTest.java index d719f94d34ef..a1601aa5f82b 100644 --- a/platform/platform-tests/testSrc/com/intellij/ide/LightFileTemplatesTest.java +++ b/platform/platform-tests/testSrc/com/intellij/ide/LightFileTemplatesTest.java @@ -16,10 +16,13 @@ package com.intellij.ide; import com.intellij.ide.fileTemplates.FileTemplate; +import com.intellij.ide.fileTemplates.FileTemplateManager; import com.intellij.ide.fileTemplates.FileTemplatesScheme; import com.intellij.ide.fileTemplates.impl.AllFileTemplatesConfigurable; import com.intellij.ide.fileTemplates.impl.BundledFileTemplate; import com.intellij.ide.fileTemplates.impl.FileTemplateManagerImpl; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.project.ProjectManager; import com.intellij.testFramework.LightPlatformTestCase; import com.intellij.testFramework.PlatformTestCase; @@ -50,6 +53,11 @@ public class LightFileTemplatesTest extends LightPlatformTestCase { assertEquals("good bye", myTemplateManager.getTemplate(TEST_TEMPLATE_TXT).getText()); } + public void testDefaultProject() throws Exception { + Project defaultProject = ProjectManager.getInstance().getDefaultProject(); + assertNull(FileTemplateManager.getInstance(defaultProject).getProjectScheme()); + } + public void testConfigurable() throws Exception { AllFileTemplatesConfigurable configurable = new AllFileTemplatesConfigurable(getProject()); try { diff --git a/platform/util/src/com/intellij/util/containers/ContainerUtil.java b/platform/util/src/com/intellij/util/containers/ContainerUtil.java index 6a84988ab2c0..5219508663e0 100644 --- a/platform/util/src/com/intellij/util/containers/ContainerUtil.java +++ b/platform/util/src/com/intellij/util/containers/ContainerUtil.java @@ -1422,10 +1422,18 @@ public class ContainerUtil extends ContainerUtilRt { @Contract(pure=true) public static boolean intersects(@NotNull Collection collection1, @NotNull Collection collection2) { - for (T t : collection1) { - //noinspection SuspiciousMethodCalls - if (collection2.contains(t)) { - return true; + if (collection1.size() <= collection2.size()) { + for (T t : collection1) { + if (collection2.contains(t)) { + return true; + } + } + } + else { + for (T t : collection2) { + if (collection1.contains(t)) { + return true; + } } } return false; diff --git a/plugins/terminal/resources/icons/OpenTerminal_13x13@2x.png b/plugins/terminal/resources/icons/OpenTerminal_13x13@2x.png new file mode 100644 index 000000000000..de3cf3c60ac8 Binary files /dev/null and b/plugins/terminal/resources/icons/OpenTerminal_13x13@2x.png differ