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) {
}