diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java index a3d85d0c301f..94c0b8b66563 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java @@ -153,54 +153,55 @@ public class ControlFlowAnalyzer extends JavaElementVisitor { return; } - lExpr.accept(this); - IElementType op = expression.getOperationTokenType(); PsiType type = expression.getType(); boolean isBoolean = PsiType.BOOLEAN.equals(type); if (op == JavaTokenType.EQ) { + lExpr.accept(this); rExpr.accept(this); generateBoxingUnboxingInstructionFor(rExpr, type); } else if (op == JavaTokenType.ANDEQ) { if (isBoolean) { - generateNonLazyExpression(true, lExpr, rExpr, type); + generateBooleanAssignmentExpression(true, lExpr, rExpr, type); } else { - generateDefaultBinOp(lExpr, rExpr, type); + generateDefaultAssignmentBinOp(lExpr, rExpr, type); } } else if (op == JavaTokenType.OREQ) { if (isBoolean) { - generateNonLazyExpression(false, lExpr, rExpr, type); + generateBooleanAssignmentExpression(false, lExpr, rExpr, type); } else { - generateDefaultBinOp(lExpr, rExpr, type); + generateDefaultAssignmentBinOp(lExpr, rExpr, type); } } else if (op == JavaTokenType.XOREQ) { if (isBoolean) { - generateXorExpression(expression, new PsiExpression[]{lExpr, rExpr}, type); + generateXorExpression(expression, new PsiExpression[]{lExpr, rExpr}, type, true); } else { - generateDefaultBinOp(lExpr, rExpr, type); + generateDefaultAssignmentBinOp(lExpr, rExpr, type); } } else if (op == JavaTokenType.PLUSEQ && type != null && type.equalsToText(JAVA_LANG_STRING)) { lExpr.accept(this); + addInstruction(new DupInstruction()); rExpr.accept(this); addInstruction(new BinopInstruction(JavaTokenType.PLUS, null, lExpr.getProject())); } else { - generateDefaultBinOp(lExpr, rExpr, type); + generateDefaultAssignmentBinOp(lExpr, rExpr, type); } addInstruction(new AssignInstruction(rExpr)); finishElement(expression); } - private void generateDefaultBinOp(PsiExpression lExpr, PsiExpression rExpr, final PsiType exprType) { + private void generateDefaultAssignmentBinOp(PsiExpression lExpr, PsiExpression rExpr, final PsiType exprType) { lExpr.accept(this); + addInstruction(new DupInstruction()); generateBoxingUnboxingInstructionFor(lExpr,exprType); rExpr.accept(this); generateBoxingUnboxingInstructionFor(rExpr, exprType); @@ -1062,7 +1063,7 @@ public class ControlFlowAnalyzer extends JavaElementVisitor { generateOrExpression(operands, type, true); } else if (op == JavaTokenType.XOR && PsiType.BOOLEAN.equals(type)) { - generateXorExpression(expression, operands, type); + generateXorExpression(expression, operands, type, false); } else if (op == JavaTokenType.AND && PsiType.BOOLEAN.equals(type)) { generateAndExpression(operands, type, false); @@ -1153,9 +1154,12 @@ public class ControlFlowAnalyzer extends JavaElementVisitor { } } - private void generateXorExpression(PsiExpression expression, PsiExpression[] operands, final PsiType exprType) { + private void generateXorExpression(PsiExpression expression, PsiExpression[] operands, final PsiType exprType, boolean forAssignment) { PsiExpression operand = operands[0]; operand.accept(this); + if (forAssignment) { + addInstruction(new DupInstruction()); + } generateBoxingUnboxingInstructionFor(operand, exprType); for (int i = 1; i < operands.length; i++) { operand = operands[i]; @@ -1187,7 +1191,11 @@ public class ControlFlowAnalyzer extends JavaElementVisitor { } } - private void generateNonLazyExpression(boolean and, PsiExpression lExpression, PsiExpression rExpression, PsiType exprType) { + private void generateBooleanAssignmentExpression(boolean and, PsiExpression lExpression, PsiExpression rExpression, PsiType exprType) { + lExpression.accept(this); + addInstruction(new DupInstruction()); + generateBoxingUnboxingInstructionFor(lExpression, exprType); + rExpression.accept(this); generateBoxingUnboxingInstructionFor(rExpression, exprType); @@ -1414,14 +1422,14 @@ public class ControlFlowAnalyzer extends JavaElementVisitor { if (contracts.size() > 1) { addInstruction(new DupInstruction(args.length, contracts.size() - 1)); } - for (MethodContract contract : contracts) { - handleContract(expression, contract); + for (int i = 0; i < contracts.size(); i++) { + handleContract(expression, contracts.get(i), contracts.size() - 1 - i); } pushUnknownReturnValue(expression); // goto here if all contracts are false return true; } - private void handleContract(PsiMethodCallExpression expression, MethodContract contract) { + private void handleContract(PsiMethodCallExpression expression, MethodContract contract, int remainingContracts) { PsiExpression[] args = expression.getArgumentList().getExpressions(); final ControlFlow.ControlFlowOffset exitPoint = getEndOffset(expression); @@ -1448,6 +1456,10 @@ public class ControlFlowAnalyzer extends JavaElementVisitor { continueCheckingContract.setOffset(myCurrentFlow.getInstructionCount()); } + for (int j = 0; j < remainingContracts * args.length; j++) { + addInstruction(new PopInstruction()); + } + // if contract is true switch (contract.returnValue) { case ANY_VALUE: diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ContractSeveralClauses.java b/java/java-tests/testData/inspection/dataFlow/fixture/ContractSeveralClauses.java index 554e979d56cd..f201cf432f1c 100644 --- a/java/java-tests/testData/inspection/dataFlow/fixture/ContractSeveralClauses.java +++ b/java/java-tests/testData/inspection/dataFlow/fixture/ContractSeveralClauses.java @@ -1,4 +1,5 @@ import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.Nullable; public class Foo { @@ -6,8 +7,21 @@ public class Foo { return escapeStr(s, escaper); } + String foo2(Object escaper, @Nullable String s) { + return escapeStr(s, escaper); + } + + void foo3(@Nullable String s) { + foo2(this, escapeStr(s)); + } + @Contract("null,_->null;!null,_->!null") String escapeStr(String s, Object o) { return s; } + + @Contract("null->null;!null->!null") + String escapeStr(String s) { + return s; + } } \ No newline at end of file diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/NotEqualsTypo.java b/java/java-tests/testData/inspection/dataFlow/fixture/NotEqualsTypo.java new file mode 100644 index 000000000000..17413ddae617 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/NotEqualsTypo.java @@ -0,0 +1,12 @@ +class Some { + boolean foo(Object first, Object second) { + boolean isEqual = true; + + if (first != null || second -= null) { + return isEqual; + } + + return isEqual; + } + +} diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java index 3ce3fe86fa6a..7e0362713496 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java @@ -301,5 +301,7 @@ public class DataFlowInspectionTest extends LightCodeInsightFixtureTestCase { public void testDontMakeUnrelatedVariableFalseWhenMerging() { doTest(); } public void testDontLoseInequalityInformation() { doTest(); } + public void testNotEqualsTypo() { doTest(); } + public void _testNullCheckBeforeInstanceof() { doTest(); } // http://youtrack.jetbrains.com/issue/IDEA-113220 } diff --git a/platform/platform-impl/src/com/intellij/execution/impl/EditorHyperlinkSupport.java b/platform/platform-impl/src/com/intellij/execution/impl/EditorHyperlinkSupport.java index 334dae2ac886..1973cb3d8075 100644 --- a/platform/platform-impl/src/com/intellij/execution/impl/EditorHyperlinkSupport.java +++ b/platform/platform-impl/src/com/intellij/execution/impl/EditorHyperlinkSupport.java @@ -329,6 +329,10 @@ public class EditorHyperlinkSupport { Collection sortedHighlighters, final int delta, final Consumer action) { + if (sortedHighlighters.isEmpty()) { + return null; + } + final List ranges = new ArrayList(sortedHighlighters); int i; for (i = 0; i < ranges.size(); i++) { @@ -337,7 +341,8 @@ public class EditorHyperlinkSupport { break; } } - int newIndex = i > 0 ? i % ranges.size() : 0; + i = i % ranges.size(); + int newIndex = i; while (newIndex < ranges.size() && newIndex >= 0) { newIndex = (newIndex + delta + ranges.size()) % ranges.size(); final RangeHighlighter next = ranges.get(newIndex); diff --git a/platform/platform-impl/src/com/intellij/openapi/project/CacheUpdateRunner.java b/platform/platform-impl/src/com/intellij/openapi/project/CacheUpdateRunner.java index b39319773c1d..de6634e15935 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/CacheUpdateRunner.java +++ b/platform/platform-impl/src/com/intellij/openapi/project/CacheUpdateRunner.java @@ -87,12 +87,7 @@ class CacheUpdateRunner { int percent = (int)(processed.size() * 100 / total); indicator.setText("Indexing... " + percent + "%"); if (ApplicationManager.getApplication().isInternal()) { - if (virtualFile.isValid()) { - indicator.setText2(virtualFile.getPresentableUrl()); - } - else { - indicator.setText2(""); - } + indicator.setText2(virtualFile.getPresentableUrl()); } } } diff --git a/platform/usageView/src/com/intellij/usages/impl/rules/DirectoryGroupingRule.java b/platform/usageView/src/com/intellij/usages/impl/rules/DirectoryGroupingRule.java index 38081a2b951c..17302e0fa7bf 100644 --- a/platform/usageView/src/com/intellij/usages/impl/rules/DirectoryGroupingRule.java +++ b/platform/usageView/src/com/intellij/usages/impl/rules/DirectoryGroupingRule.java @@ -100,12 +100,7 @@ public class DirectoryGroupingRule implements UsageGroupingRule { @NotNull public String getText(UsageView view) { String relativePath = VfsUtilCore.getRelativePath(myDir, myProject.getBaseDir(), File.separatorChar); - if (relativePath != null) { - return relativePath; - } - String url = myDir.getPresentableUrl(); - - return url != null ? url : ""; + return relativePath != null ? relativePath : myDir.getPresentableUrl(); } @Override diff --git a/plugins/git4idea/src/git4idea/GitUtil.java b/plugins/git4idea/src/git4idea/GitUtil.java index 6e49379f91d0..7204f61aa0ab 100644 --- a/plugins/git4idea/src/git4idea/GitUtil.java +++ b/plugins/git4idea/src/git4idea/GitUtil.java @@ -79,12 +79,6 @@ public class GitUtil { if (o2 == null) { return 1; } - if (o1.getPresentableUrl() == null) { - return -1; - } - if (o2.getPresentableUrl() == null) { - return 1; - } return o1.getPresentableUrl().compareTo(o2.getPresentableUrl()); } }; diff --git a/plugins/git4idea/src/git4idea/util/GitUIUtil.java b/plugins/git4idea/src/git4idea/util/GitUIUtil.java index 1f9c3ff8330b..ae44f756a8cd 100644 --- a/plugins/git4idea/src/git4idea/util/GitUIUtil.java +++ b/plugins/git4idea/src/git4idea/util/GitUIUtil.java @@ -155,7 +155,7 @@ public class GitUIUtil { return new ListCellRendererWrapper() { @Override public void customize(final JList list, final VirtualFile file, final int index, final boolean selected, final boolean hasFocus) { - setText(file == null || !file.isValid() ? "(invalid)" : file.getPresentableUrl()); + setText(file == null ? "(invalid)" : file.getPresentableUrl()); } }; } diff --git a/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GroovycOSProcessHandler.java b/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GroovycOSProcessHandler.java index 47b7fe58c4d9..bb43051223e1 100644 --- a/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GroovycOSProcessHandler.java +++ b/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GroovycOSProcessHandler.java @@ -58,7 +58,7 @@ public class GroovycOSProcessHandler extends BaseOSProcessHandler { super.notifyTextAvailable(text, outputType); if (LOG.isDebugEnabled()) { - LOG.debug("Received from groovyc: " + text); + LOG.debug("Received from groovyc " + outputType + ": " + text); } if (outputType == ProcessOutputTypes.SYSTEM) { @@ -197,14 +197,17 @@ public class GroovycOSProcessHandler extends BaseOSProcessHandler { public boolean shouldRetry() { if (getProcess().exitValue() != 0) { + LOG.debug("Non-zero exit code"); return true; } for (CompilerMessage message : compilerMessages) { if (message.getKind() == BuildMessage.Kind.ERROR) { + LOG.debug("Error message: " + message); return true; } } if (getStdErr().length() > 0) { + LOG.debug("Non-empty stderr: '" + getStdErr() + "'"); return true; } return false; diff --git a/plugins/groovy/rt/src/org/jetbrains/groovy/compiler/rt/DependentGroovycRunner.java b/plugins/groovy/rt/src/org/jetbrains/groovy/compiler/rt/DependentGroovycRunner.java index d340342538a7..835c91d2d153 100644 --- a/plugins/groovy/rt/src/org/jetbrains/groovy/compiler/rt/DependentGroovycRunner.java +++ b/plugins/groovy/rt/src/org/jetbrains/groovy/compiler/rt/DependentGroovycRunner.java @@ -188,13 +188,7 @@ public class DependentGroovycRunner { continue; } - unit.addSource(new SourceUnit(file, unit.getConfiguration(), unit.getClassLoader(), unit.getErrorCollector()) { - public void parse() throws CompilationFailedException { - System.out.println(GroovyRtConstants.PRESENTABLE_MESSAGE + "Parsing " + file.getName() + "..."); - super.parse(); - System.out.println(GroovyRtConstants.CLEAR_PRESENTABLE); - } - }); + unit.addSource(new SourceUnit(file, unit.getConfiguration(), unit.getClassLoader(), unit.getErrorCollector())); } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenResumeAction.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenResumeAction.java index 25f10123db68..c9718cd45119 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenResumeAction.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenResumeAction.java @@ -297,7 +297,9 @@ public class MavenResumeAction extends AnAction { goals.add(myResumeModuleId); } - myRunner.execute(new ExecutionEnvironmentBuilder(myEnvironment).setContentToReuse(null).build()); + runConfiguration.getRunnerParameters().setGoals(goals); + + myRunner.execute(new ExecutionEnvironmentBuilder(myEnvironment).setContentToReuse(null).setRunProfile(runConfiguration).build()); } catch (RunCanceledByUserException ignore) { }