From f82787cd5388df495ed6469328a3018f576a4db4 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Wed, 2 Dec 2015 15:10:28 +0300 Subject: [PATCH 01/24] IDEA-145314 Task management: Edit task: pre-selected branch in the dialog is always master --- .../src/com/intellij/openapi/vcs/VcsTaskHandler.java | 8 +++++++- .../src/com/intellij/tasks/actions/EditTaskDialog.java | 4 +++- .../src/com/intellij/tasks/actions/OpenTaskDialog.java | 8 +------- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/VcsTaskHandler.java b/platform/vcs-api/src/com/intellij/openapi/vcs/VcsTaskHandler.java index dd1c12e1f150..5c3b87a84d52 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/VcsTaskHandler.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/VcsTaskHandler.java @@ -17,6 +17,7 @@ package com.intellij.openapi.vcs; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Condition; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; @@ -39,7 +40,7 @@ public abstract class VcsTaskHandler { return handlers.toArray(new VcsTaskHandler[handlers.size()]); } - public static class TaskInfo { + public static class TaskInfo implements Comparable { private final String myBranch; private final Collection myRepositories; @@ -61,6 +62,11 @@ public abstract class VcsTaskHandler { public String toString() { return getName(); } + + @Override + public int compareTo(TaskInfo o) { + return Comparing.compare(myBranch, o.myBranch); + } } private static final ExtensionPointName EXTENSION_POINT_NAME = ExtensionPointName.create("com.intellij.vcs.taskHandler"); diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/EditTaskDialog.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/EditTaskDialog.java index a6a4482880c7..a25adf3907a7 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/EditTaskDialog.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/EditTaskDialog.java @@ -35,6 +35,7 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; /** @@ -92,9 +93,10 @@ public class EditTaskDialog extends DialogWrapper { else { VcsTaskHandler.TaskInfo[] tasks = handlers[0].getAllExistingTasks(); ArrayList infos = new ArrayList(Arrays.asList(tasks)); + Collections.sort(infos); infos.add(null); myBranch.setModel(new CollectionComboBoxModel(infos)); - final List branches = task.getBranches(); + final List branches = task.getBranches(false); if (!branches.isEmpty()) { VcsTaskHandler.TaskInfo info = ContainerUtil.find(tasks, new Condition() { @Override diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/OpenTaskDialog.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/OpenTaskDialog.java index 7b92b0b4694f..771295b81787 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/OpenTaskDialog.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/OpenTaskDialog.java @@ -45,7 +45,6 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Arrays; import java.util.Collection; -import java.util.Comparator; /** * @author Dmitry Avdeev @@ -135,12 +134,7 @@ public class OpenTaskDialog extends DialogWrapper { VcsTaskHandler.TaskInfo[] tasks = handler.getAllExistingTasks(); if (tasks.length > 0) { myVcsTaskHandler = handler; - Arrays.sort(tasks, new Comparator() { - @Override - public int compare(VcsTaskHandler.TaskInfo o1, VcsTaskHandler.TaskInfo o2) { - return o1.getName().compareTo(o2.getName()); - } - }); + Arrays.sort(tasks); //noinspection unchecked myBranchFrom.setModel(new DefaultComboBoxModel(tasks)); myBranchFrom.setEnabled(true); From 3a89b61d9d5b13eec910ff259f678adee7650617 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Wed, 2 Dec 2015 15:27:51 +0300 Subject: [PATCH 02/24] make sure ChunkExtractor won't be called for binary files --- .../usageView/src/com/intellij/usages/ChunkExtractor.java | 1 + .../src/com/intellij/usages/UsageInfo2UsageAdapter.java | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/platform/usageView/src/com/intellij/usages/ChunkExtractor.java b/platform/usageView/src/com/intellij/usages/ChunkExtractor.java index fa6f6d785052..929f0486299d 100644 --- a/platform/usageView/src/com/intellij/usages/ChunkExtractor.java +++ b/platform/usageView/src/com/intellij/usages/ChunkExtractor.java @@ -116,6 +116,7 @@ public class ChunkExtractor { Project project = file.getProject(); myDocument = PsiDocumentManager.getInstance(project).getDocument(file); + LOG.assertTrue(myDocument != null); final FileType fileType = file.getFileType(); SyntaxHighlighter highlighter = SyntaxHighlighterFactory.getSyntaxHighlighter(fileType, project, file.getVirtualFile()); highlighter = highlighter == null ? new PlainSyntaxHighlighter() : highlighter; diff --git a/platform/usageView/src/com/intellij/usages/UsageInfo2UsageAdapter.java b/platform/usageView/src/com/intellij/usages/UsageInfo2UsageAdapter.java index f2e2fe1ddf41..db5aa7917890 100644 --- a/platform/usageView/src/com/intellij/usages/UsageInfo2UsageAdapter.java +++ b/platform/usageView/src/com/intellij/usages/UsageInfo2UsageAdapter.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -520,13 +520,12 @@ public class UsageInfo2UsageAdapter implements UsageInModule, PsiFile file = getPsiFile(); if (file != null) { - ChunkExtractor extractor = ChunkExtractor.getExtractor(file); Segment segment = getFirstSegment(); if (segment != null) { Document document = PsiDocumentManager.getInstance(getProject()).getDocument(file); - if (document != null) { + ChunkExtractor extractor = ChunkExtractor.getExtractor(file); SmartList chunks = new SmartList(); extractor.createTextChunks( this, From 6d600d1fd19283cb80551bbc991ed4ba6c80a788 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Wed, 2 Dec 2015 15:49:12 +0300 Subject: [PATCH 03/24] show leftovers in temp directory --- platform/testFramework/src/_FirstInSuiteTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/platform/testFramework/src/_FirstInSuiteTest.java b/platform/testFramework/src/_FirstInSuiteTest.java index a78918888ea5..54261d8d65fe 100644 --- a/platform/testFramework/src/_FirstInSuiteTest.java +++ b/platform/testFramework/src/_FirstInSuiteTest.java @@ -22,6 +22,7 @@ import junit.framework.TestCase; import javax.swing.*; import java.io.File; import java.nio.charset.Charset; +import java.util.Arrays; import java.util.List; /** @@ -75,7 +76,8 @@ public class _FirstInSuiteTest extends TestCase { Class.forName("com.sun.jna.Native"); String tempDirectory = FileUtilRt.getTempDirectory(); - System.out.println("FileUtil.getTempDirectory() = " + tempDirectory + " ("+new File(tempDirectory).list().length+" files)"); + String[] list = new File(tempDirectory).list(); + System.out.println("FileUtil.getTempDirectory() = " + tempDirectory + " (" + list.length + " files): " + Arrays.asList(list)); } // performance tests From 5bf50de260dd0dc7a578e655d0e67a0452a62f8d Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Wed, 2 Dec 2015 14:53:48 +0300 Subject: [PATCH 04/24] toString for FieldEvaluator --- .../engine/evaluation/expression/FieldEvaluator.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/FieldEvaluator.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/FieldEvaluator.java index faa4c8dc5151..6c9c1c8d3dc3 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/FieldEvaluator.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/FieldEvaluator.java @@ -214,6 +214,11 @@ public class FieldEvaluator implements Evaluator { return modifier; } + @Override + public String toString() { + return "field " + myFieldName; + } + private static final class FQNameClassFilter implements TargetClassFilter { private final String myQName; From a16b1ab566d366721faea3700479d834cd37eada Mon Sep 17 00:00:00 2001 From: irengrig Date: Tue, 1 Dec 2015 17:45:11 +0100 Subject: [PATCH 05/24] line comment action to work for es6 string templates as well --- .../codeInsight/generation/CommentByLineCommentHandler.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/generation/CommentByLineCommentHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/generation/CommentByLineCommentHandler.java index 533db0f46116..f04e1b22c488 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/generation/CommentByLineCommentHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/generation/CommentByLineCommentHandler.java @@ -74,9 +74,10 @@ public class CommentByLineCommentHandler extends MultiCaretCodeInsightActionHand PsiElement context = InjectedLanguageManager.getInstance(file.getProject()).getInjectionHost(file); - if (context != null && (context.textContains('\'') || context.textContains('\"') || context.textContains('/'))) { + if (context != null && (context.textContains('\'') || context.textContains('\"') || context.textContains('/') || context.textContains('`'))) { String s = context.getText(); - if (StringUtil.startsWith(s, "\"") || StringUtil.startsWith(s, "\'") || StringUtil.startsWith(s, "/")) { + if (StringUtil.startsWith(s, "\"") || StringUtil.startsWith(s, "\'") || StringUtil.startsWith(s, "/") + || StringUtil.startsWith(s, "`")) { file = context.getContainingFile(); editor = editor instanceof EditorWindow ? ((EditorWindow)editor).getDelegate() : editor; caret = caret instanceof InjectedCaret ? ((InjectedCaret)caret).getDelegate() : caret; From d61c41e7f922976cf37f7f8d9567bf418ac26102 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Mon, 30 Nov 2015 17:56:05 +0300 Subject: [PATCH 06/24] git: move method to DvcsUtil --- .../src/com/intellij/dvcs/DvcsUtil.java | 25 ++++++++++++++ plugins/git4idea/src/git4idea/GitUtil.java | 7 ++++ .../rebase/GitAbortRebaseProcess.java | 33 ++----------------- 3 files changed, 35 insertions(+), 30 deletions(-) diff --git a/platform/dvcs-impl/src/com/intellij/dvcs/DvcsUtil.java b/platform/dvcs-impl/src/com/intellij/dvcs/DvcsUtil.java index cbc87370f4e7..d64dee36916a 100644 --- a/platform/dvcs-impl/src/com/intellij/dvcs/DvcsUtil.java +++ b/platform/dvcs-impl/src/com/intellij/dvcs/DvcsUtil.java @@ -475,4 +475,29 @@ public class DvcsUtil { } }); } + + @NotNull + public static String joinShortNames(@NotNull Collection repositories) { + return joinWithAnd(ContainerUtil.map(repositories, new Function() { + @Override + public String fun(@NotNull Repository repository) { + return getShortRepositoryName(repository); + } + })); + } + + @NotNull + private static String joinWithAnd(@NotNull List strings) { + int size = strings.size(); + if (size == 0) return ""; + if (size == 1) return strings.get(0); + if (size == 2) return strings.get(0) + " and " + strings.get(1); + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < size - 2; i++) { + sb.append(strings.get(i)).append(", "); + } + sb.append(strings.get(size - 2)).append(" and ").append(strings.get(size - 1)); + return sb.toString(); + } } diff --git a/plugins/git4idea/src/git4idea/GitUtil.java b/plugins/git4idea/src/git4idea/GitUtil.java index 0fff546e0381..e251f9b40113 100644 --- a/plugins/git4idea/src/git4idea/GitUtil.java +++ b/plugins/git4idea/src/git4idea/GitUtil.java @@ -65,6 +65,7 @@ import java.io.UnsupportedEncodingException; import java.util.*; import static com.intellij.dvcs.DvcsUtil.getShortRepositoryName; +import static com.intellij.dvcs.DvcsUtil.joinShortNames; /** * Git utility/helper methods @@ -1025,4 +1026,10 @@ public class GitUtil { public static String mention(@NotNull GitRepository repository) { return getRepositoryManager(repository.getProject()).moreThanOneRoot() ? " in " + getShortRepositoryName(repository) : ""; } + + @NotNull + public static String mention(@NotNull Collection repositories) { + if (repositories.isEmpty()) return ""; + return " in " + joinShortNames(repositories); + } } diff --git a/plugins/git4idea/src/git4idea/rebase/GitAbortRebaseProcess.java b/plugins/git4idea/src/git4idea/rebase/GitAbortRebaseProcess.java index a8abc3591ed3..b8b70bd64939 100644 --- a/plugins/git4idea/src/git4idea/rebase/GitAbortRebaseProcess.java +++ b/plugins/git4idea/src/git4idea/rebase/GitAbortRebaseProcess.java @@ -26,7 +26,6 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Ref; import com.intellij.openapi.vcs.VcsNotifier; -import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import git4idea.DialogManager; import git4idea.GitPlatformFacade; @@ -41,7 +40,6 @@ import git4idea.util.GitFreezingProcess; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Collection; import java.util.List; import java.util.Map; @@ -82,7 +80,7 @@ class GitAbortRebaseProcess { void abortWithConfirmation() { LOG.debug("Abort rebase. " + (myRepositoryToAbort == null ? "Nothing to abort" : getShortRepositoryName(myRepositoryToAbort)) + - ". Roots to rollback: " + mention(myRepositoriesToRollback.keySet())); + ". Roots to rollback: " + DvcsUtil.joinShortNames(myRepositoriesToRollback.keySet())); final Ref ref = Ref.create(); ApplicationManager.getApplication().invokeAndWait(new Runnable() { @Override @@ -113,7 +111,7 @@ class GitAbortRebaseProcess { } else { String message = "Do you want just to abort rebase" + GitUtil.mention(myRepositoryToAbort) + ",\n" + - "or also rollback the successful rebase in " + mention(myRepositoriesToRollback.keySet()) + "?"; + "or also rollback the successful rebase" + GitUtil.mention(myRepositoriesToRollback.keySet()) + "?"; int choice = DialogManager.showYesNoCancelDialog(myProject, message, title, "Abort & Rollback", "Abort", getCancelButtonText(), getQuestionIcon()); if (choice == Messages.YES) { @@ -129,7 +127,7 @@ class GitAbortRebaseProcess { LOG.error(new Throwable()); } else { - String description = "Do you want rollback the successful rebase in " + mention(myRepositoriesToRollback.keySet()) + "?"; + String description = "Do you want rollback the successful rebase" + GitUtil.mention(myRepositoriesToRollback.keySet()) + "?"; int choice = DialogManager.showOkCancelDialog(myProject, description, title, "Rollback", getCancelButtonText(), getQuestionIcon()); if (choice == Messages.YES) { return AbortChoice.ROLLBACK_AND_ABORT; @@ -198,29 +196,4 @@ class GitAbortRebaseProcess { } markDirtyAndRefresh(false, true, false, toVirtualFileArray(getRootsFromRepositories(toRefresh))); } - - @NotNull - private static String mention(@NotNull Collection repositories) { - return joinWithAnd(ContainerUtil.map(repositories, new Function() { - @Override - public String fun(@NotNull GitRepository repository) { - return getShortRepositoryName(repository); - } - })); - } - - @NotNull - private static String joinWithAnd(@NotNull List strings) { - int size = strings.size(); - if (size == 0) return ""; - if (size == 1) return strings.get(0); - if (size == 2) return strings.get(0) + " and " + strings.get(1); - - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < size - 2; i++) { - sb.append(strings.get(i)).append(", "); - } - sb.append(strings.get(size - 2)).append(" and ").append(strings.get(size - 1)); - return sb.toString(); - } } From 27b05727bd2e8ec6a85c27a1e1c1cb0e33b17997 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Fri, 27 Nov 2015 14:59:33 +0300 Subject: [PATCH 07/24] IDEA-130991 git: checkout tag should work with synchronous branches --- .../git4idea/ui/branch/GitBranchPopup.java | 1 + .../ui/branch/GitBranchPopupActions.java | 31 ++++++++++++------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopup.java b/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopup.java index a5f77acc7f8d..f99aa34cb1fd 100644 --- a/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopup.java +++ b/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopup.java @@ -105,6 +105,7 @@ class GitBranchPopup extends DvcsBranchPopup { @NotNull AbstractRepositoryManager repositoryManager) { List allRepositories = repositoryManager.getRepositories(); popupGroup.add(new GitBranchPopupActions.GitNewBranchAction(myProject, allRepositories)); + popupGroup.add(new GitBranchPopupActions.CheckoutRevisionActions(myProject, allRepositories)); popupGroup.addAll(createRepositoriesActions()); diff --git a/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopupActions.java b/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopupActions.java index 2cc27bdaac12..326d43a6eb04 100644 --- a/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopupActions.java +++ b/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopupActions.java @@ -24,6 +24,8 @@ import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.util.Condition; +import com.intellij.util.containers.ContainerUtil; import git4idea.GitBranch; import git4idea.branch.GitBranchUtil; import git4idea.branch.GitBrancher; @@ -50,9 +52,10 @@ class GitBranchPopupActions { ActionGroup createActions(@Nullable DefaultActionGroup toInsert) { DefaultActionGroup popupGroup = new DefaultActionGroup(null, false); + List repositoryList = Collections.singletonList(myRepository); - popupGroup.addAction(new GitNewBranchAction(myProject,Collections.singletonList(myRepository))); - popupGroup.addAction(new CheckoutRevisionActions(myProject, myRepository)); + popupGroup.addAction(new GitNewBranchAction(myProject, repositoryList)); + popupGroup.addAction(new CheckoutRevisionActions(myProject, repositoryList)); if (toInsert != null) { popupGroup.addAll(toInsert); @@ -63,7 +66,7 @@ class GitBranchPopupActions { Collections.sort(localBranches); for (GitBranch localBranch : localBranches) { if (!localBranch.equals(myRepository.getCurrentBranch())) { // don't show current branch in the list - popupGroup.add(new LocalBranchActions(myProject, Collections.singletonList(myRepository), localBranch.getName(), myRepository)); + popupGroup.add(new LocalBranchActions(myProject, repositoryList, localBranch.getName(), myRepository)); } } @@ -71,7 +74,7 @@ class GitBranchPopupActions { List remoteBranches = new ArrayList(myRepository.getBranches().getRemoteBranches()); Collections.sort(remoteBranches); for (GitBranch remoteBranch : remoteBranches) { - popupGroup.add(new RemoteBranchActions(myProject, Collections.singletonList(myRepository), remoteBranch.getName(), myRepository)); + popupGroup.add(new RemoteBranchActions(myProject, repositoryList, remoteBranch.getName(), myRepository)); } return popupGroup; @@ -97,14 +100,14 @@ class GitBranchPopupActions { /** * Checkout manually entered tag or revision number. */ - private static class CheckoutRevisionActions extends DumbAwareAction { + public static class CheckoutRevisionActions extends DumbAwareAction { private final Project myProject; - private final GitRepository myRepository; + private final List myRepositories; - CheckoutRevisionActions(Project project, GitRepository repository) { - super("Checkout Tag or Revision"); + CheckoutRevisionActions(Project project, List repositories) { + super("Checkout Tag or Revision..."); myProject = project; - myRepository = repository; + myRepositories = repositories; } @Override public void actionPerformed(AnActionEvent e) { @@ -114,14 +117,20 @@ class GitBranchPopupActions { .showInputDialog(myProject, "Enter reference (branch, tag) name or commit hash", "Checkout", Messages.getQuestionIcon()); if (reference != null) { GitBrancher brancher = ServiceManager.getService(myProject, GitBrancher.class); - brancher.checkout(reference, true, Collections.singletonList(myRepository), null); + brancher.checkout(reference, true, myRepositories, null); reportUsage("git.branch.checkout.revision"); } } @Override public void update(AnActionEvent e) { - if (myRepository.isFresh()) { + boolean isFresh = ContainerUtil.and(myRepositories, new Condition() { + @Override + public boolean value(GitRepository repository) { + return repository.isFresh(); + } + }); + if (isFresh) { e.getPresentation().setEnabled(false); e.getPresentation().setDescription("Checkout is not possible before the first commit"); } From 3d626fbdcc681ba5c56cdd712b5051a019866825 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Tue, 1 Dec 2015 13:23:11 +0300 Subject: [PATCH 08/24] IDEA-130991 git: checkout tag or revision - do not fail if reference was not found in some repositories --- .../git4idea/branch/GitBranchOperation.java | 23 ++++++++++- .../src/git4idea/branch/GitBranchWorker.java | 4 +- .../git4idea/branch/GitCheckoutOperation.java | 41 +++++++++++++++++-- .../src/git4idea/commands/GitImpl.java | 1 + .../commands/GitSimpleEventDetector.java | 3 +- 5 files changed, 65 insertions(+), 7 deletions(-) diff --git a/plugins/git4idea/src/git4idea/branch/GitBranchOperation.java b/plugins/git4idea/src/git4idea/branch/GitBranchOperation.java index 6fb1881f36b1..7cec3e5cead3 100644 --- a/plugins/git4idea/src/git4idea/branch/GitBranchOperation.java +++ b/plugins/git4idea/src/git4idea/branch/GitBranchOperation.java @@ -59,6 +59,7 @@ abstract class GitBranchOperation { private final GitVcsSettings mySettings; @NotNull private final Collection mySuccessfulRepositories; + @NotNull private final Collection mySkippedRepositories; @NotNull private final Collection myRemainingRepositories; protected GitBranchOperation(@NotNull Project project, @NotNull GitPlatformFacade facade, @NotNull Git git, @@ -76,6 +77,7 @@ abstract class GitBranchOperation { } }); mySuccessfulRepositories = new ArrayList(); + mySkippedRepositories = new ArrayList(); myRemainingRepositories = new ArrayList(myRepositories); mySettings = myFacade.getSettings(myProject); } @@ -123,18 +125,37 @@ abstract class GitBranchOperation { } } + /** + * Marks repositories as successful, i.e. they won't be handled again. + */ + protected void markSkip(GitRepository... repositories) { + for (GitRepository repository : repositories) { + mySkippedRepositories.add(repository); + myRemainingRepositories.remove(repository); + } + } + /** * @return true if the operation has already succeeded in at least one of repositories. */ protected boolean wereSuccessful() { return !mySuccessfulRepositories.isEmpty(); } + + protected boolean wereSkipped() { + return !mySkippedRepositories.isEmpty(); + } @NotNull protected Collection getSuccessfulRepositories() { return mySuccessfulRepositories; } - + + @NotNull + protected Collection getSkippedRepositories() { + return mySkippedRepositories; + } + @NotNull protected String successfulRepositoriesJoined() { return GitUtil.joinToHtml(mySuccessfulRepositories); diff --git a/plugins/git4idea/src/git4idea/branch/GitBranchWorker.java b/plugins/git4idea/src/git4idea/branch/GitBranchWorker.java index 88a6c8088204..536547266c22 100644 --- a/plugins/git4idea/src/git4idea/branch/GitBranchWorker.java +++ b/plugins/git4idea/src/git4idea/branch/GitBranchWorker.java @@ -94,12 +94,12 @@ public final class GitBranchWorker { public void checkoutNewBranchStartingFrom(@NotNull String newBranchName, @NotNull String startPoint, @NotNull List repositories) { updateInfo(repositories); - new GitCheckoutOperation(myProject, myFacade, myGit, myUiHandler, repositories, startPoint, false, newBranchName).execute(); + new GitCheckoutOperation(myProject, myFacade, myGit, myUiHandler, repositories, startPoint, false, true, newBranchName).execute(); } public void checkout(@NotNull final String reference, boolean detach, @NotNull List repositories) { updateInfo(repositories); - new GitCheckoutOperation(myProject, myFacade, myGit, myUiHandler, repositories, reference, detach, null).execute(); + new GitCheckoutOperation(myProject, myFacade, myGit, myUiHandler, repositories, reference, detach, false, null).execute(); } diff --git a/plugins/git4idea/src/git4idea/branch/GitCheckoutOperation.java b/plugins/git4idea/src/git4idea/branch/GitCheckoutOperation.java index 85f386847d77..bce3218fb73e 100644 --- a/plugins/git4idea/src/git4idea/branch/GitCheckoutOperation.java +++ b/plugins/git4idea/src/git4idea/branch/GitCheckoutOperation.java @@ -16,6 +16,8 @@ package git4idea.branch; import com.intellij.dvcs.DvcsUtil; +import com.intellij.notification.Notification; +import com.intellij.notification.NotificationListener; import com.intellij.openapi.application.AccessToken; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; @@ -33,6 +35,7 @@ import git4idea.util.GitPreservingProcess; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import javax.swing.event.HyperlinkEvent; import java.util.Collection; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; @@ -54,6 +57,7 @@ class GitCheckoutOperation extends GitBranchOperation { @NotNull private final String myStartPointReference; private final boolean myDetach; + private final boolean myRefShouldBeValid; @Nullable private final String myNewBranch; GitCheckoutOperation(@NotNull Project project, @@ -63,10 +67,12 @@ class GitCheckoutOperation extends GitBranchOperation { @NotNull Collection repositories, @NotNull String startPointReference, boolean detach, + boolean refShouldBeValid, @Nullable String newBranch) { super(project, facade, git, uiHandler, repositories); myStartPointReference = startPointReference; myDetach = detach; + myRefShouldBeValid = refShouldBeValid; myNewBranch = newBranch; } @@ -83,11 +89,12 @@ class GitCheckoutOperation extends GitBranchOperation { GitLocalChangesWouldBeOverwrittenDetector localChangesDetector = new GitLocalChangesWouldBeOverwrittenDetector(root, GitLocalChangesWouldBeOverwrittenDetector.Operation.CHECKOUT); GitSimpleEventDetector unmergedFiles = new GitSimpleEventDetector(GitSimpleEventDetector.Event.UNMERGED_PREVENTING_CHECKOUT); + GitSimpleEventDetector unknownPathspec = new GitSimpleEventDetector(GitSimpleEventDetector.Event.INVALID_REFERENCE); GitUntrackedFilesOverwrittenByOperationDetector untrackedOverwrittenByCheckout = new GitUntrackedFilesOverwrittenByOperationDetector(root); GitCommandResult result = myGit.checkout(repository, myStartPointReference, myNewBranch, false, myDetach, - localChangesDetector, unmergedFiles, untrackedOverwrittenByCheckout); + localChangesDetector, unmergedFiles, unknownPathspec, untrackedOverwrittenByCheckout); if (result.success()) { refresh(repository); markSuccessful(repository); @@ -106,6 +113,9 @@ class GitCheckoutOperation extends GitBranchOperation { fatalUntrackedFilesError(repository.getRoot(), untrackedOverwrittenByCheckout.getRelativeFilePaths()); fatalErrorHappened = true; } + else if (!myRefShouldBeValid && unknownPathspec.hasHappened()) { + markSkip(repository); + } else { fatalError(getCommonErrorTitle(), result.getErrorOutputAsJoinedString()); fatalErrorHappened = true; @@ -117,8 +127,23 @@ class GitCheckoutOperation extends GitBranchOperation { } if (!fatalErrorHappened) { - notifySuccess(); - updateRecentBranch(); + if (wereSuccessful()) { + if (!wereSkipped()) { + notifySuccess(); + updateRecentBranch(); + } + else { + String message = getSuccessMessage(); + String mention = GitUtil.mention(getSuccessfulRepositories()); + VcsNotifier.getInstance(myProject).notifySuccess("", message + mention + " Rollback", + new RollbackOperationNotificationListener()); + updateRecentBranch(); + } + } + else { + LOG.assertTrue(!myRefShouldBeValid); + notifyError("Couldn't checkout " + myStartPointReference, "Revision doesn't exist"); + } } } @@ -261,4 +286,14 @@ class GitCheckoutOperation extends GitBranchOperation { repository.update(); } } + + private class RollbackOperationNotificationListener implements NotificationListener { + @Override + public void hyperlinkUpdate(@NotNull Notification notification, + @NotNull HyperlinkEvent event) { + if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED && event.getDescription().equalsIgnoreCase("rollback")) { + rollback(); + } + } + } } diff --git a/plugins/git4idea/src/git4idea/commands/GitImpl.java b/plugins/git4idea/src/git4idea/commands/GitImpl.java index ff3a48f4c0d3..4fa2b1ac02af 100644 --- a/plugins/git4idea/src/git4idea/commands/GitImpl.java +++ b/plugins/git4idea/src/git4idea/commands/GitImpl.java @@ -273,6 +273,7 @@ public class GitImpl implements Git { else { // checkout reference as new branch h.addParameters("-b", newBranch, reference); } + h.endOptions(); for (GitLineHandlerListener listener : listeners) { h.addLineListener(listener); } diff --git a/plugins/git4idea/src/git4idea/commands/GitSimpleEventDetector.java b/plugins/git4idea/src/git4idea/commands/GitSimpleEventDetector.java index 8a91f5e34247..b55c4a543285 100644 --- a/plugins/git4idea/src/git4idea/commands/GitSimpleEventDetector.java +++ b/plugins/git4idea/src/git4idea/commands/GitSimpleEventDetector.java @@ -35,7 +35,8 @@ public class GitSimpleEventDetector implements GitLineHandlerListener { BRANCH_NOT_FULLY_MERGED("is not fully merged"), MERGE_CONFLICT("Automatic merge failed; fix conflicts and then commit the result"), MERGE_CONFLICT_ON_UNSTASH("conflict"), - ALREADY_UP_TO_DATE("Already up-to-date"); + ALREADY_UP_TO_DATE("Already up-to-date"), + INVALID_REFERENCE("invalid reference:"); private final String myDetectionString; From 91ff90ecfa766159b3d573eaf0cf60684d8f3ba9 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Mon, 30 Nov 2015 18:49:47 +0300 Subject: [PATCH 09/24] git: better notification on partially successfull checkout do not mention all affected repositories - "in Project, lib, contrib and 55 others" --- .../src/com/intellij/dvcs/DvcsUtil.java | 25 +++++++++++++++---- plugins/git4idea/src/git4idea/GitUtil.java | 7 +++++- .../git4idea/branch/GitCheckoutOperation.java | 12 ++++++--- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/platform/dvcs-impl/src/com/intellij/dvcs/DvcsUtil.java b/platform/dvcs-impl/src/com/intellij/dvcs/DvcsUtil.java index d64dee36916a..aa170e89c909 100644 --- a/platform/dvcs-impl/src/com/intellij/dvcs/DvcsUtil.java +++ b/platform/dvcs-impl/src/com/intellij/dvcs/DvcsUtil.java @@ -478,26 +478,41 @@ public class DvcsUtil { @NotNull public static String joinShortNames(@NotNull Collection repositories) { + return joinShortNames(repositories, -1); + } + + @NotNull + public static String joinShortNames(@NotNull Collection repositories, int limit) { return joinWithAnd(ContainerUtil.map(repositories, new Function() { @Override public String fun(@NotNull Repository repository) { return getShortRepositoryName(repository); } - })); + }), limit); } @NotNull - private static String joinWithAnd(@NotNull List strings) { + private static String joinWithAnd(@NotNull List strings, int limit) { int size = strings.size(); if (size == 0) return ""; if (size == 1) return strings.get(0); if (size == 2) return strings.get(0) + " and " + strings.get(1); + boolean isLimited = limit >= 2 && limit < size; + int listCount = isLimited ? limit - 1 : size - 1; + StringBuilder sb = new StringBuilder(); - for (int i = 0; i < size - 2; i++) { - sb.append(strings.get(i)).append(", "); + for (int i = 0; i < listCount; i++) { + if (i != 0) sb.append(", "); + sb.append(strings.get(i)); + } + + if (isLimited) { + sb.append(" and ").append(size - limit + 1).append(" others"); + } + else { + sb.append(" and ").append(strings.get(size - 1)); } - sb.append(strings.get(size - 2)).append(" and ").append(strings.get(size - 1)); return sb.toString(); } } diff --git a/plugins/git4idea/src/git4idea/GitUtil.java b/plugins/git4idea/src/git4idea/GitUtil.java index e251f9b40113..0058a2e9c96c 100644 --- a/plugins/git4idea/src/git4idea/GitUtil.java +++ b/plugins/git4idea/src/git4idea/GitUtil.java @@ -1029,7 +1029,12 @@ public class GitUtil { @NotNull public static String mention(@NotNull Collection repositories) { + return mention(repositories, -1); + } + + @NotNull + public static String mention(@NotNull Collection repositories, int limit) { if (repositories.isEmpty()) return ""; - return " in " + joinShortNames(repositories); + return " in " + joinShortNames(repositories, limit); } } diff --git a/plugins/git4idea/src/git4idea/branch/GitCheckoutOperation.java b/plugins/git4idea/src/git4idea/branch/GitCheckoutOperation.java index bce3218fb73e..9cf1995cb5e0 100644 --- a/plugins/git4idea/src/git4idea/branch/GitCheckoutOperation.java +++ b/plugins/git4idea/src/git4idea/branch/GitCheckoutOperation.java @@ -133,16 +133,20 @@ class GitCheckoutOperation extends GitBranchOperation { updateRecentBranch(); } else { - String message = getSuccessMessage(); - String mention = GitUtil.mention(getSuccessfulRepositories()); - VcsNotifier.getInstance(myProject).notifySuccess("", message + mention + " Rollback", + String mentionSuccess = getSuccessMessage() + GitUtil.mention(getSuccessfulRepositories(), 4); + String mentionSkipped = wereSkipped() ? "
Revision not found" + GitUtil.mention(getSkippedRepositories(), 4) : ""; + + VcsNotifier.getInstance(myProject).notifySuccess("", + mentionSuccess + + mentionSkipped + + "
Rollback", new RollbackOperationNotificationListener()); updateRecentBranch(); } } else { LOG.assertTrue(!myRefShouldBeValid); - notifyError("Couldn't checkout " + myStartPointReference, "Revision doesn't exist"); + notifyError("Couldn't checkout " + myStartPointReference, "Revision not found" + GitUtil.mention(getSkippedRepositories(), 4)); } } } From 54d4709af7eb9b32c4c07ff89e560d540b28e0f1 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Wed, 2 Dec 2015 17:03:21 +0300 Subject: [PATCH 10/24] git: tests on "checkout tag or revision" --- .../git4idea/branch/GitBranchWorkerTest.java | 87 ++++++++++++++++++- 1 file changed, 85 insertions(+), 2 deletions(-) diff --git a/plugins/git4idea/tests/git4idea/branch/GitBranchWorkerTest.java b/plugins/git4idea/tests/git4idea/branch/GitBranchWorkerTest.java index 78719faddaf9..2169231e747c 100644 --- a/plugins/git4idea/tests/git4idea/branch/GitBranchWorkerTest.java +++ b/plugins/git4idea/tests/git4idea/branch/GitBranchWorkerTest.java @@ -218,6 +218,52 @@ public class GitBranchWorkerTest extends GitPlatformTest { assertCurrentBranch(myContrib, "master"); } + public void test_checkout_revision_checkout_branch_with_complete_success() { + branchWithCommit(myRepositories, "feature"); + + checkoutRevision("feature", new TestUiHandler()); + + assertDetachedState("feature"); + assertEquals("Notification about successful branch checkout is incorrect", "Checked out " + bcode("feature"), + myVcsNotifier.getLastNotification().getContent()); + } + + public void test_checkout_revision_checkout_ref_with_complete_success() { + branchWithCommit(myRepositories, "feature"); + + checkoutRevision("feature~1", new TestUiHandler()); + + assertDetachedState("master"); + assertEquals("Notification about successful branch checkout is incorrect", "Checked out " + bcode("feature~1"), + myVcsNotifier.getLastNotification().getContent()); + } + + public void test_checkout_revision_checkout_ref_with_complete_failure() { + branchWithCommit(myRepositories, "feature"); + + checkoutRevision("unknown_ref", new TestUiHandler()); + + assertCurrentBranch("master"); + assertCurrentRevision("master"); + assertEquals("Notification about successful branch checkout is incorrect", "Revision not found in project, community and contrib", + myVcsNotifier.getLastNotification().getContent()); + } + + public void test_checkout_revision_checkout_ref_with_partial_success() { + branchWithCommit(ContainerUtil.list(myCommunity, myContrib), "feature"); + + checkoutRevision("feature", new TestUiHandler()); + + assertCurrentBranch(myUltimate, "master"); + assertDetachedState(myCommunity, "feature"); + assertDetachedState(myContrib, "feature"); + + assertEquals("Notification about successful branch checkout is incorrect", + "Checked out " + bcode("feature") + " in community and contrib" + "
" + + "Revision not found in project" + "
Rollback", + myVcsNotifier.getLastNotification().getContent()); + } + public void test_checkout_with_untracked_files_overwritten_by_checkout_in_first_repo_should_show_notification() { test_untracked_files_overwritten_by_in_first_repo("checkout", 1); } @@ -807,14 +853,40 @@ public class GitBranchWorkerTest extends GitPlatformTest { assertCurrentBranch(myContrib, "master"); } + static private void assertDetachedState(GitRepository repository, String reference) { + assertCurrentRevision(repository, reference); + + String curBranch = getCurrentBranch(repository); + boolean isDetached = curBranch.contains("detached"); + assertTrue("Current branch is not detached in ${repository} - " + curBranch, isDetached); + } + static private void assertCurrentBranch(GitRepository repository, String name) { - String curBranch = ObjectUtils.assertNotNull(ContainerUtil.find(git(repository, "branch").split("\n"), new Condition() { + String curBranch = getCurrentBranch(repository); + assertEquals("Current branch is incorrect in ${repository}", name, curBranch); + } + + @NotNull + private static String getCurrentBranch(GitRepository repository) { + return ObjectUtils.assertNotNull(ContainerUtil.find(git(repository, "branch").split("\n"), new Condition() { @Override public boolean value(String s) { return s.contains("*"); } })).replace('*', ' ').trim(); - assertEquals("Current branch is incorrect in ${repository}", name, curBranch); + } + + static private void assertCurrentRevision(GitRepository repository, String reference) { + String expectedRef = git(repository, "rev-parse " + "HEAD"); + String currentRef = git(repository, "rev-parse " + reference); + + assertEquals("Current revision is incorrect in ${repository}", expectedRef, currentRef); + } + + private void assertDetachedState(String reference) { + for (GitRepository repository : myRepositories) { + assertDetachedState(repository, reference); + } } private void assertCurrentBranch(String name) { @@ -823,6 +895,12 @@ public class GitBranchWorkerTest extends GitPlatformTest { } } + private void assertCurrentRevision(String reference) { + for (GitRepository repository : myRepositories) { + assertCurrentRevision(repository, reference); + } + } + private void checkoutNewBranch(String name, GitBranchUiHandler uiHandler) { GitBranchWorker brancher = new GitBranchWorker(myProject, myPlatformFacade, myGit, uiHandler); brancher.checkoutNewBranch(name, myRepositories); @@ -833,6 +911,11 @@ public class GitBranchWorkerTest extends GitPlatformTest { brancher.checkout(name, false, myRepositories); } + private void checkoutRevision(String reference, GitBranchUiHandler uiHandler) { + GitBranchWorker brancher = new GitBranchWorker(myProject, myPlatformFacade, myGit, uiHandler); + brancher.checkout(reference, true, myRepositories); + } + private void mergeBranch(String name, GitBranchUiHandler uiHandler) { GitBranchWorker brancher = new GitBranchWorker(myProject, myPlatformFacade, myGit, uiHandler); brancher.merge(name, GitBrancher.DeleteOnMergeOption.PROPOSE, myRepositories); From ed920d107d3a3a9c713a5f6b159b2c6b1dc535bb Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 2 Dec 2015 15:29:07 +0100 Subject: [PATCH 11/24] standalone JPS: print locations of compiler errors to stdout --- .../src/org/jetbrains/jps/build/Standalone.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/jps/standalone-builder/src/org/jetbrains/jps/build/Standalone.java b/jps/standalone-builder/src/org/jetbrains/jps/build/Standalone.java index 6e26ae3469f3..9384277dcaea 100644 --- a/jps/standalone-builder/src/org/jetbrains/jps/build/Standalone.java +++ b/jps/standalone-builder/src/org/jetbrains/jps/build/Standalone.java @@ -29,6 +29,7 @@ import org.jetbrains.jps.incremental.Utils; import org.jetbrains.jps.incremental.artifacts.ArtifactBuildTargetType; import org.jetbrains.jps.incremental.fs.BuildFSState; import org.jetbrains.jps.incremental.messages.BuildMessage; +import org.jetbrains.jps.incremental.messages.CompilerMessage; import org.jetbrains.jps.model.JpsModel; import java.io.File; @@ -214,12 +215,20 @@ public class Standalone { @Override public void processMessage(BuildMessage msg) { - String messageText = msg.getMessageText(); + String messageText; + if (msg instanceof CompilerMessage) { + CompilerMessage compilerMessage = (CompilerMessage) msg; + messageText = compilerMessage.getSourcePath() + "(" + compilerMessage.getLine() + ":" + compilerMessage.getColumn() + "): " + msg.getMessageText(); + } + else { + messageText = msg.getMessageText(); + } if (messageText.isEmpty()) return; if (msg.getKind() == BuildMessage.Kind.ERROR) { System.err.println("Error: " + messageText); hasErrors = true; } + else if (msg.getKind() != BuildMessage.Kind.PROGRESS || !messageText.startsWith("Compiled") && !messageText.startsWith("Copying")) { System.out.println(messageText); } From 45ae9e75dd983b9a1343df1ddc99817bcbedad14 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 2 Dec 2015 11:27:32 +0100 Subject: [PATCH 12/24] redundant casts --- .../impl/source/resolve/graphInference/InferenceSession.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java index 63309983c0ba..4cfd4e328dcb 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java @@ -651,7 +651,7 @@ public class InferenceSession { final PsiSubstitutor substitutor = resolveSubset(Collections.singletonList(inferenceVariable), mySiteSubstitutor); final PsiType substitutedReturnType = substitutor.substitute(inferenceVariable.getParameter()); if (substitutedReturnType != null) { - addConstraint(new TypeCompatibilityConstraint(targetType, PsiUtil.captureToplevelWildcards(substitutedReturnType, (PsiExpression)myContext))); + addConstraint(new TypeCompatibilityConstraint(targetType, PsiUtil.captureToplevelWildcards(substitutedReturnType, myContext))); } } else { @@ -662,7 +662,7 @@ public class InferenceSession { LOG.assertTrue(returnType instanceof PsiClassType); PsiClassType substitutedCapture = (PsiClassType)returnType; if (!toplevel) { - substitutedCapture = (PsiClassType)PsiUtil.captureToplevelWildcards(returnType, (PsiExpression)myContext); + substitutedCapture = (PsiClassType)PsiUtil.captureToplevelWildcards(returnType, myContext); final PsiTypeParameter[] typeParameters = psiClass.getTypeParameters(); final InferenceVariable[] copy = initBounds(null, typeParameters); From e6162ed1fa2ceded9f4110a61ee1583e85accb5e Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 2 Dec 2015 11:49:25 +0100 Subject: [PATCH 13/24] testdata for IDEA-148361 --- .../genericsHighlighting8/IDEA148361.java | 28 +++++++++++++++++++ .../lambda/GenericsHighlighting8Test.java | 4 +++ 2 files changed, 32 insertions(+) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA148361.java diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA148361.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA148361.java new file mode 100644 index 000000000000..6c5f619ee6e5 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA148361.java @@ -0,0 +1,28 @@ + +import java.util.function.Consumer; + +class Foo { + static void add(Klass klass, E e, Consumer action) {} + + static void bar(Klass k, Method m) { + add(k, m, k::addMethod); + } +} + +interface Element {} +interface Method extends Element {} +interface Type { + > C addMethod(Method m); +} +interface Klass extends Type {} + +//simplified +class Foo1 { + static void bar(Type1 k) { + k.addMethod(); + } +} + +interface Type1 { + > C addMethod(); +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java index e62c6902b8a6..06880fa0a65b 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java @@ -885,4 +885,8 @@ public class GenericsHighlighting8Test extends LightDaemonAnalyzerTestCase { public void testIDEA148348() throws Exception { doTest(); } + + public void testIDEA148361() throws Exception { + doTest(); + } } From bb5f40c196a83f38371e33952113c73e5debe8d8 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 2 Dec 2015 11:54:23 +0100 Subject: [PATCH 14/24] testdata for IDEA-134059 --- .../genericsHighlighting8/IDEA134059.java | 24 +++++++++++++++++++ .../lambda/GenericsHighlighting8Test.java | 4 ++++ 2 files changed, 28 insertions(+) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA134059.java diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA134059.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA134059.java new file mode 100644 index 000000000000..e81cd5e4da03 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA134059.java @@ -0,0 +1,24 @@ + +import java.util.List; +import java.util.function.Function; + +import static java.util.Arrays.asList; + +class Test { + public static void bar(List parameters, Function function) + { + Iterable objects = transform(checkNotNull(parameters), function); + } + + public static T checkNotNull(T reference) { + return reference; + } + + public static List transform(final List fromIterable, final Function function) { + return null; + } + + { + List>> list = asList(asList(asList(1)), asList(asList(2))); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java index 06880fa0a65b..cde8dab3abd0 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java @@ -889,4 +889,8 @@ public class GenericsHighlighting8Test extends LightDaemonAnalyzerTestCase { public void testIDEA148361() throws Exception { doTest(); } + + public void testIDEA134059() throws Exception { + doTest(); + } } From 5ac3bde39832d1d46daa75a6567665c1317e18c5 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 2 Dec 2015 11:56:14 +0100 Subject: [PATCH 15/24] testdata for IDEA-148093 --- .../lambda/newMethodRef/IDEA148093.java | 21 +++++++++++++++++++ .../lambda/NewMethodRefHighlightingTest.java | 4 ++++ 2 files changed, 25 insertions(+) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA148093.java diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA148093.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA148093.java new file mode 100644 index 000000000000..bb3132e5b84e --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA148093.java @@ -0,0 +1,21 @@ + +abstract class WrapperOne { + public abstract WrapperOne reformChain(Reformer> reformer); +} +interface WrapperTwo {} +interface Reformer { + T reform(); +} +class ReformerClient { + public WrapperOne sampleChainA(WrapperOne p, Reformer> r) { + return p.reformChain(r::reform); + } + + public WrapperOne sampleChainB(WrapperOne p, Reformer> r) { + return p.reformChain(r::reform); + } + + public WrapperOne sampleChainC(WrapperOne p, Reformer> r) { + return p.reformChain(r); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java index 06c698c29546..0c1ab3a4f158 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java @@ -462,6 +462,10 @@ public class NewMethodRefHighlightingTest extends LightDaemonAnalyzerTestCase { doTest(); } + public void testIDEA148093() throws Exception { + doTest(); + } + private void doTest() { doTest(false); } From 6b52d3cd5647dd916d076f5137247376f38e0803 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 2 Dec 2015 12:02:56 +0100 Subject: [PATCH 16/24] javac option to dump bounds to remember --- .../codeInsight/daemon/lambda/GenericsHighlighting8Test.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java index cde8dab3abd0..edc6bfe33f01 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java @@ -28,6 +28,7 @@ import com.intellij.testFramework.IdeaTestUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +//javac option to dump bounds: -XDdumpInferenceGraphsTo= public class GenericsHighlighting8Test extends LightDaemonAnalyzerTestCase { @NonNls private static final String BASE_PATH = "/codeInsight/daemonCodeAnalyzer/genericsHighlighting8"; From 414454d4b707803681d3ca3711e581a1411c3cd9 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 2 Dec 2015 12:54:43 +0100 Subject: [PATCH 17/24] testdata for IDEA-139222 --- .../genericsHighlighting8/IDEA139222.java | 11 +++++++++++ .../daemon/lambda/GenericsHighlighting8Test.java | 4 ++++ 2 files changed, 15 insertions(+) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA139222.java diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA139222.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA139222.java new file mode 100644 index 000000000000..e6e4e01930ef --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA139222.java @@ -0,0 +1,11 @@ +class Test { + void bar() { + baz(foo(1, "")); + } + + T foo(T x, T y) { + return x; + } + + > void baz(S x) { } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java index edc6bfe33f01..60d649d9cb2d 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java @@ -894,4 +894,8 @@ public class GenericsHighlighting8Test extends LightDaemonAnalyzerTestCase { public void testIDEA134059() throws Exception { doTest(); } + + public void testIDEA139222() throws Exception { + doTest(); + } } From 43e825eef983752b0f5c255aa113e3222c624c6d Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 2 Dec 2015 14:01:13 +0100 Subject: [PATCH 18/24] testdata for IDEA-139156 --- .../genericsHighlighting8/IDEA139156.java | 9 +++++++++ .../daemon/lambda/GenericsHighlighting8Test.java | 4 ++++ 2 files changed, 13 insertions(+) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA139156.java diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA139156.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA139156.java new file mode 100644 index 000000000000..c542b16dbfea --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA139156.java @@ -0,0 +1,9 @@ +import java.util.List; + +interface A> { } + +class C { + List> foo(List>> x) { + return x; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java index 60d649d9cb2d..98121ad61c81 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java @@ -898,4 +898,8 @@ public class GenericsHighlighting8Test extends LightDaemonAnalyzerTestCase { public void testIDEA139222() throws Exception { doTest(); } + + public void testIDEA139156() throws Exception { + doTest(); + } } From 65d35615dfc383e9c31fb4058e53ead1657952bd Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 2 Dec 2015 14:06:19 +0100 Subject: [PATCH 19/24] testdata for IDEA-139169 --- .../genericsHighlighting8/IDEA139169.java | 10 ++++++++++ .../daemon/lambda/GenericsHighlighting8Test.java | 4 ++++ 2 files changed, 14 insertions(+) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA139169.java diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA139169.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA139169.java new file mode 100644 index 000000000000..130245fb2aab --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA139169.java @@ -0,0 +1,10 @@ + +import java.util.List; + +interface A & Cloneable> { } + +class C { + List>> foo(List> x) { + return x; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java index 98121ad61c81..d1e11a14e76b 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java @@ -902,4 +902,8 @@ public class GenericsHighlighting8Test extends LightDaemonAnalyzerTestCase { public void testIDEA139156() throws Exception { doTest(); } + + public void testIDEA139169() throws Exception { + doTest(); + } } From 2bb333cd43f1a34927576db384adf91a1ceb9fee Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 2 Dec 2015 14:10:24 +0100 Subject: [PATCH 20/24] testdata for IDEA-136325 --- .../lambda/newLambda/IDEA136325.java | 26 +++++++++++++++++++ .../lambda/NewLambdaHighlightingTest.java | 4 +++ 2 files changed, 30 insertions(+) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA136325.java diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA136325.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA136325.java new file mode 100644 index 000000000000..0785193d913f --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA136325.java @@ -0,0 +1,26 @@ +import java.util.LinkedList; +import java.util.List; + +class MyTest { + + private Test alist; + + + public Test getAlist() { + return alist = create(Test::new, alist); + } + + + private T create(CreateCallback callback, T defaultVal) { + if (defaultVal == null) { + return callback.create(); + } + return defaultVal; + } + + interface CreateCallback { + T create(); + } + + class Test {} +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java index 281ca8ba8621..2072bbc65931 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java @@ -236,6 +236,10 @@ public class NewLambdaHighlightingTest extends LightDaemonAnalyzerTestCase { doTest(); } + public void testIDEA136325() throws Exception { + doTest(); + } + private void doTest() { doTest(false); } From 8a1085dac496891eccca606a7ecbe99a5db9d937 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 2 Dec 2015 14:15:05 +0100 Subject: [PATCH 21/24] testdata for IDEA-131686 --- .../genericsHighlighting8/IDEA131686.java | 12 ++++++++++++ .../daemon/lambda/GenericsHighlighting8Test.java | 4 ++++ 2 files changed, 16 insertions(+) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA131686.java diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA131686.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA131686.java new file mode 100644 index 000000000000..3568b47d8af8 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA131686.java @@ -0,0 +1,12 @@ +interface Msg> {} + +class Conv> { + static > Conv createBar(A a) { + return null; + } + + @SuppressWarnings("unchecked") + static void test() { + Conv> conv = Conv.createBar((Msg) null); + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java index d1e11a14e76b..a7d9d0f6d996 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java @@ -906,4 +906,8 @@ public class GenericsHighlighting8Test extends LightDaemonAnalyzerTestCase { public void testIDEA139169() throws Exception { doTest(); } + + public void testIDEA131686() throws Exception { + doTest(); + } } From 2f82450d13481d840b16bdef33cc6eafd8081e6c Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 2 Dec 2015 15:18:04 +0100 Subject: [PATCH 22/24] test to ensure that capture's bound is corrected according to the used jdk/library --- .../multipleJdks/java7/p/WrongComparatorInUpperBound.java | 7 +++++++ .../multipleJdks/java8/p/WrongComparatorInUpperBound.java | 4 ++++ .../intellij/codeInsight/MultipleJdksHighlightingTest.java | 5 +++++ 3 files changed, 16 insertions(+) create mode 100644 java/java-tests/testData/codeInsight/multipleJdks/java7/p/WrongComparatorInUpperBound.java create mode 100644 java/java-tests/testData/codeInsight/multipleJdks/java8/p/WrongComparatorInUpperBound.java diff --git a/java/java-tests/testData/codeInsight/multipleJdks/java7/p/WrongComparatorInUpperBound.java b/java/java-tests/testData/codeInsight/multipleJdks/java7/p/WrongComparatorInUpperBound.java new file mode 100644 index 000000000000..15b9ce42d43e --- /dev/null +++ b/java/java-tests/testData/codeInsight/multipleJdks/java7/p/WrongComparatorInUpperBound.java @@ -0,0 +1,7 @@ +package p; +abstract class B { + void foo(A a) + { + a.get().reversed(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/multipleJdks/java8/p/WrongComparatorInUpperBound.java b/java/java-tests/testData/codeInsight/multipleJdks/java8/p/WrongComparatorInUpperBound.java new file mode 100644 index 000000000000..539059b5bb9f --- /dev/null +++ b/java/java-tests/testData/codeInsight/multipleJdks/java8/p/WrongComparatorInUpperBound.java @@ -0,0 +1,4 @@ +package p; +public abstract class A { + public abstract T get(); +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/MultipleJdksHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/MultipleJdksHighlightingTest.java index c814d4ce35f7..c869e634ceba 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/MultipleJdksHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/MultipleJdksHighlightingTest.java @@ -124,6 +124,11 @@ public class MultipleJdksHighlightingTest extends UsefulTestCase { doTestWithoutLibrary(); } + public void testWrongComparatorInUpperBound() throws Exception { + addDependencies_37_78(); + doTestWithoutLibrary(); + } + public void testGenericComparator() throws Exception { addDependencies_37_78(); doTestWithoutLibrary(); From dfe29a3a50f34abca3a14a0d47c2fe5129e90731 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 2 Dec 2015 15:31:27 +0100 Subject: [PATCH 23/24] getSuperTypes: reuse correctType and capture (following IDEA-CR-7195) --- .../impl/analysis/GenericsHighlightUtil.java | 7 ++----- .../com/intellij/psi/impl/PsiClassImplUtil.java | 2 +- .../intellij/psi/impl/PsiSuperMethodImplUtil.java | 15 +++++++-------- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java index 3dfb11a9c5e4..9ea3c44e6a6b 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java @@ -360,11 +360,8 @@ public class GenericsHighlightUtil { Map inheritedClasses, Set visited, TextRange textRange) { - final PsiClassType[] superTypes = aClass.getSuperTypes(); - for (PsiClassType superType : superTypes) { - superType = PsiClassImplUtil.correctType(superType, place.getResolveScope()); - if (superType == null) continue; - final PsiClassType.ClassResolveResult result = ((PsiClassType)PsiUtil.captureToplevelWildcards(superType, place)).resolveGenerics(); + final List superTypes = PsiClassImplUtil.getScopeCorrectedSuperTypes(aClass, place.getResolveScope()); + for (PsiClassType.ClassResolveResult result : superTypes) { final PsiClass superClass = result.getElement(); if (superClass == null || visited.contains(superClass)) continue; PsiSubstitutor superTypeSubstitutor = result.getSubstitutor(); diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/PsiClassImplUtil.java b/java/java-psi-impl/src/com/intellij/psi/impl/PsiClassImplUtil.java index 9c5aec2e2288..2c0a16d03ede 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/PsiClassImplUtil.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/PsiClassImplUtil.java @@ -732,7 +732,7 @@ public class PsiClassImplUtil { return new TypeCorrector(resolveScope).correctType(originalType); } - private static List getScopeCorrectedSuperTypes(final PsiClass aClass, GlobalSearchScope resolveScope) { + public static List getScopeCorrectedSuperTypes(final PsiClass aClass, GlobalSearchScope resolveScope) { Map> cache = CachedValuesManager.getCachedValue(aClass, new CachedValueProvider>>() { @Nullable diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/PsiSuperMethodImplUtil.java b/java/java-psi-impl/src/com/intellij/psi/impl/PsiSuperMethodImplUtil.java index 5f19f7b659ee..639d62dcf3c2 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/PsiSuperMethodImplUtil.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/PsiSuperMethodImplUtil.java @@ -46,7 +46,7 @@ public class PsiSuperMethodImplUtil { @NotNull @Override public Map fun(PsiClass dom) { - return buildMethodHierarchy(dom, null, PsiSubstitutor.EMPTY, true, new THashSet(), false, dom.getResolveScope(), dom); + return buildMethodHierarchy(dom, null, PsiSubstitutor.EMPTY, true, new THashSet(), false, dom.getResolveScope()); } }); private static final PsiCacheKey>, PsiClass> SIGNATURES_BY_NAME_KEY = PsiCacheKey @@ -57,7 +57,7 @@ public class PsiSuperMethodImplUtil { @Nullable @Override protected Map create(String methodName) { - return buildMethodHierarchy(psiClass, methodName, PsiSubstitutor.EMPTY, true, new THashSet(), false, psiClass.getResolveScope(), psiClass); + return buildMethodHierarchy(psiClass, methodName, PsiSubstitutor.EMPTY, true, new THashSet(), false, psiClass.getResolveScope()); } }; } @@ -133,7 +133,7 @@ public class PsiSuperMethodImplUtil { final boolean includePrivates, @NotNull final Set visited, boolean isInRawContext, - GlobalSearchScope resolveScope, PsiElement place) { + GlobalSearchScope resolveScope) { ProgressManager.checkCanceled(); Map result = new LinkedHashMap(); final Map> sameParameterErasureMethods = new THashMap>(MethodSignatureUtil.METHOD_PARAMETERS_ERASURE_EQUALITY); @@ -190,10 +190,9 @@ public class PsiSuperMethodImplUtil { map.put(signature, newH); } - for (PsiClassType superType : aClass.getSuperTypes()) { - superType = PsiClassImplUtil.correctType(superType, resolveScope); - if (superType == null) continue; //super class doesn't belong to resolve scope - PsiClassType.ClassResolveResult superTypeResolveResult = ((PsiClassType)PsiUtil.captureToplevelWildcards(superType, place)).resolveGenerics(); + final List superTypes = PsiClassImplUtil.getScopeCorrectedSuperTypes(aClass, resolveScope); + + for (PsiClassType.ClassResolveResult superTypeResolveResult : superTypes) { PsiClass superClass = superTypeResolveResult.getElement(); if (superClass == null) continue; if (!visited.add(superClass)) continue; // cyclic inheritance @@ -201,7 +200,7 @@ public class PsiSuperMethodImplUtil { PsiSubstitutor finalSubstitutor = obtainFinalSubstitutor(superClass, superSubstitutor, substitutor, isInRawContext); final boolean isInRawContextSuper = (isInRawContext || PsiUtil.isRawSubstitutor(superClass, superSubstitutor)) && superClass.getTypeParameters().length != 0; - Map superResult = buildMethodHierarchy(superClass, nameHint, finalSubstitutor, false, visited, isInRawContextSuper, resolveScope, place); + Map superResult = buildMethodHierarchy(superClass, nameHint, finalSubstitutor, false, visited, isInRawContextSuper, resolveScope); visited.remove(superClass); List> flattened = new ArrayList>(); From 89416b8aad1fa6b342c69cd0d471f3157da22cbb Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 2 Dec 2015 15:36:19 +0100 Subject: [PATCH 24/24] junit 3: pass file path if provided --- .../src/com/intellij/junit3/JUnit3IdeaTestRunner.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/plugins/junit_rt/src/com/intellij/junit3/JUnit3IdeaTestRunner.java b/plugins/junit_rt/src/com/intellij/junit3/JUnit3IdeaTestRunner.java index fca7187e2180..83c7ca118db2 100644 --- a/plugins/junit_rt/src/com/intellij/junit3/JUnit3IdeaTestRunner.java +++ b/plugins/junit_rt/src/com/intellij/junit3/JUnit3IdeaTestRunner.java @@ -21,7 +21,6 @@ import com.intellij.rt.execution.junit.segments.PacketProcessor; import junit.framework.*; import junit.textui.ResultPrinter; import junit.textui.TestRunner; -import org.junit.runner.notification.Failure; import java.io.PrintWriter; import java.io.StringWriter; @@ -190,7 +189,12 @@ public class JUnit3IdeaTestRunner extends TestRunner implements IdeaTestRunner { try { final String trace = getTrace(failure); ComparisonFailureData notification = null; - if (failure instanceof ComparisonFailure || failure.getClass().getName().equals("org.junit.ComparisonFailure")) { + if (failure instanceof FileComparisonFailure) { + final FileComparisonFailure comparisonFailure = (FileComparisonFailure)failure; + notification = new ComparisonFailureData(comparisonFailure.getExpected(), comparisonFailure.getActual(), + comparisonFailure.getFilePath(), comparisonFailure.getActualFilePath()); + } + else if (failure instanceof ComparisonFailure || failure.getClass().getName().equals("org.junit.ComparisonFailure")) { notification = new ComparisonFailureData(ComparisonDetailsExtractor.getExpected(failure), ComparisonDetailsExtractor.getActual(failure)); } ComparisonFailureData.registerSMAttributes(notification, trace, failure.getMessage(), attrs, failure);