diff --git a/build/conf/mac/Contents/Info.plist b/build/conf/mac/Contents/Info.plist
index fe7797ee1356..267beb392154 100644
--- a/build/conf/mac/Contents/Info.plist
+++ b/build/conf/mac/Contents/Info.plist
@@ -51,6 +51,9 @@
CFBundleHelpBookFolder
@@help_id@@.help
+ NSHighResolutionCapable
+
+
LSArchitecturePriority
x86_64
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/DebuggerTreeRenderer.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/DebuggerTreeRenderer.java
index 6864ab88c519..9952f2c093f3 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/DebuggerTreeRenderer.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/DebuggerTreeRenderer.java
@@ -199,11 +199,11 @@ public class DebuggerTreeRenderer extends ColoredTreeCellRenderer {
final String errorMessage = exception.getMessage();
if(valueLabel.endsWith(errorMessage)) {
- descriptorText.append(valueLabel.substring(0, valueLabel.length() - errorMessage.length()), DEFAULT_ATTRIBUTES);
+ appendValueTextWithEscapesRendering(descriptorText, valueLabel.substring(0, valueLabel.length() - errorMessage.length()), DEFAULT_ATTRIBUTES);
descriptorText.append(errorMessage, XDebuggerUIConstants.EXCEPTION_ATTRIBUTES);
}
else {
- descriptorText.append(valueLabel, valueDescriptor.isDirty() ? XDebuggerUIConstants.CHANGED_VALUE_ATTRIBUTES : DEFAULT_ATTRIBUTES);
+ appendValueTextWithEscapesRendering(descriptorText, valueLabel, valueDescriptor.isDirty() ? XDebuggerUIConstants.CHANGED_VALUE_ATTRIBUTES : DEFAULT_ATTRIBUTES);
descriptorText.append(errorMessage, XDebuggerUIConstants.EXCEPTION_ATTRIBUTES);
}
}
@@ -212,7 +212,7 @@ public class DebuggerTreeRenderer extends ColoredTreeCellRenderer {
descriptorText.append(XDebuggerUIConstants.COLLECTING_DATA_MESSAGE, XDebuggerUIConstants.COLLECTING_DATA_HIGHLIGHT_ATTRIBUTES);
}
else {
- descriptorText.append(valueLabel, valueDescriptor.isDirty() ? XDebuggerUIConstants.CHANGED_VALUE_ATTRIBUTES : DEFAULT_ATTRIBUTES);
+ appendValueTextWithEscapesRendering(descriptorText, valueLabel, valueDescriptor.isDirty() ? XDebuggerUIConstants.CHANGED_VALUE_ATTRIBUTES : DEFAULT_ATTRIBUTES);
}
}
}
@@ -225,6 +225,42 @@ public class DebuggerTreeRenderer extends ColoredTreeCellRenderer {
return descriptorText;
}
+ private static void appendValueTextWithEscapesRendering(SimpleColoredText descriptorText, String valueText, final SimpleTextAttributes attribs) {
+ final SimpleTextAttributes boldAttribs = attribs.derive(SimpleTextAttributes.STYLE_BOLD, null, null, null);
+ final StringBuilder buf = new StringBuilder();
+ boolean slashFound = false;
+ for (int idx= 0; idx < valueText.length(); idx++) {
+ final char ch = valueText.charAt(idx);
+ if (slashFound) {
+ slashFound = false;
+ if (ch == '\\' || ch == '\"' || ch == 'b'|| ch == 't'|| ch == 'n'|| ch == 'f'|| ch == 'r' ) {
+ if (buf.length() > 0) {
+ descriptorText.append(buf.toString(), attribs);
+ buf.setLength(0);
+ }
+ if (ch != '\\' && ch != '\"') {
+ descriptorText.append("\\", boldAttribs);
+ }
+ descriptorText.append(String.valueOf(ch), boldAttribs);
+ }
+ else {
+ buf.append('\\').append(ch);
+ }
+ }
+ else {
+ if (ch == '\\') {
+ slashFound = true;
+ }
+ else {
+ buf.append(ch);
+ }
+ }
+ }
+ if (buf.length() > 0) {
+ descriptorText.append(buf.toString(), attribs);
+ }
+ }
+
private static String[] breakString(String source, String substr) {
if (substr != null && substr.length() > 0) {
int index = Math.max(source.indexOf(substr), 0);
diff --git a/platform/platform-impl/src/com/intellij/openapi/command/impl/UndoManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/command/impl/UndoManagerImpl.java
index e777c042a507..23e4930f59dc 100644
--- a/platform/platform-impl/src/com/intellij/openapi/command/impl/UndoManagerImpl.java
+++ b/platform/platform-impl/src/com/intellij/openapi/command/impl/UndoManagerImpl.java
@@ -277,7 +277,6 @@ public class UndoManagerImpl extends UndoManager implements ProjectComponent, Ap
final DocumentReference[] refs = new DocumentReference[]{DocumentReferenceManager.getInstance().create(file)};
if (myCurrentMerger.hasChangesOf(refs[0])) return;
- System.out.println("adding action for " + file);
myCurrentMerger.addAction(new BasicUndoableAction() {
@Override
public void undo() throws UnexpectedUndoException {
diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/performance/ManualArrayCopyInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/performance/ManualArrayCopyInspection.java
index 80953c044bc1..f01ef60ca5d5 100644
--- a/plugins/InspectionGadgets/src/com/siyeh/ig/performance/ManualArrayCopyInspection.java
+++ b/plugins/InspectionGadgets/src/com/siyeh/ig/performance/ManualArrayCopyInspection.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers
+ * Copyright 2003-2012 Dave Griffith, Bas Leijdekkers
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -72,18 +72,16 @@ public class ManualArrayCopyInspection extends BaseInspection {
this.decrement = decrement;
}
+ @Override
@NotNull
public String getName() {
- return InspectionGadgetsBundle.message(
- "manual.array.copy.replace.quickfix");
+ return InspectionGadgetsBundle.message("manual.array.copy.replace.quickfix");
}
@Override
- public void doFix(Project project, ProblemDescriptor descriptor)
- throws IncorrectOperationException {
+ public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException {
final PsiElement forElement = descriptor.getPsiElement();
- final PsiForStatement forStatement =
- (PsiForStatement)forElement.getParent();
+ final PsiForStatement forStatement = (PsiForStatement)forElement.getParent();
final String newExpression = buildSystemArrayCopyText(forStatement);
if (newExpression == null) {
return;
@@ -92,20 +90,15 @@ public class ManualArrayCopyInspection extends BaseInspection {
}
@Nullable
- private String buildSystemArrayCopyText(PsiForStatement forStatement)
- throws IncorrectOperationException {
+ private String buildSystemArrayCopyText(PsiForStatement forStatement) throws IncorrectOperationException {
final PsiExpression condition = forStatement.getCondition();
- final PsiBinaryExpression binaryExpression =
- (PsiBinaryExpression)ParenthesesUtils.stripParentheses(
- condition);
+ final PsiBinaryExpression binaryExpression = (PsiBinaryExpression)ParenthesesUtils.stripParentheses(condition);
if (binaryExpression == null) {
return null;
}
- final IElementType tokenType =
- binaryExpression.getOperationTokenType();
+ final IElementType tokenType = binaryExpression.getOperationTokenType();
final PsiExpression limit;
- if (decrement ^ JavaTokenType.LT.equals(tokenType) ||
- JavaTokenType.LE.equals(tokenType)) {
+ if (decrement ^ JavaTokenType.LT.equals(tokenType) || JavaTokenType.LE.equals(tokenType)) {
limit = binaryExpression.getROperand();
}
else {
@@ -114,18 +107,15 @@ public class ManualArrayCopyInspection extends BaseInspection {
if (limit == null) {
return null;
}
- final PsiStatement initialization =
- forStatement.getInitialization();
+ final PsiStatement initialization = forStatement.getInitialization();
if (initialization == null) {
return null;
}
if (!(initialization instanceof PsiDeclarationStatement)) {
return null;
}
- final PsiDeclarationStatement declaration =
- (PsiDeclarationStatement)initialization;
- final PsiElement[] declaredElements =
- declaration.getDeclaredElements();
+ final PsiDeclarationStatement declaration = (PsiDeclarationStatement)initialization;
+ final PsiElement[] declaredElements = declaration.getDeclaredElements();
if (declaredElements.length != 1) {
return null;
}
@@ -137,33 +127,28 @@ public class ManualArrayCopyInspection extends BaseInspection {
final String lengthText;
final PsiExpression initializer = variable.getInitializer();
if (decrement) {
- lengthText = buildLengthText(initializer, limit, false);
+ lengthText = buildLengthText(initializer, limit, JavaTokenType.LE.equals(tokenType) || JavaTokenType.GE.equals(tokenType));
}
else {
- lengthText = buildLengthText(limit, initializer,
- JavaTokenType.LE.equals(tokenType) ||
- JavaTokenType.GE.equals(tokenType));
+ lengthText = buildLengthText(limit, initializer, JavaTokenType.LE.equals(tokenType) || JavaTokenType.GE.equals(tokenType));
}
if (lengthText == null) {
return null;
}
- final PsiArrayAccessExpression lhs =
- getLhsArrayAccessExpression(forStatement);
+ final PsiArrayAccessExpression lhs = getLhsArrayAccessExpression(forStatement);
if (lhs == null) {
return null;
}
final PsiExpression lArray = lhs.getArrayExpression();
final String toArrayText = lArray.getText();
- final PsiArrayAccessExpression rhs =
- getRhsArrayAccessExpression(forStatement);
+ final PsiArrayAccessExpression rhs = getRhsArrayAccessExpression(forStatement);
if (rhs == null) {
return null;
}
final PsiExpression rArray = rhs.getArrayExpression();
final String fromArrayText = rArray.getText();
final PsiExpression rhsIndexExpression = rhs.getIndexExpression();
- final PsiExpression strippedRhsIndexExpression =
- ParenthesesUtils.stripParentheses(rhsIndexExpression);
+ final PsiExpression strippedRhsIndexExpression = ParenthesesUtils.stripParentheses(rhsIndexExpression);
final PsiExpression limitExpression;
if (decrement) {
limitExpression = limit;
@@ -171,19 +156,12 @@ public class ManualArrayCopyInspection extends BaseInspection {
else {
limitExpression = initializer;
}
- final String fromOffsetText =
- buildOffsetText(strippedRhsIndexExpression, variable,
- limitExpression, decrement &&
- (JavaTokenType.LT.equals(tokenType) ||
- JavaTokenType.GT.equals(tokenType)));
+ final String fromOffsetText = buildOffsetText(strippedRhsIndexExpression, variable, limitExpression, decrement &&
+ (JavaTokenType.LT.equals(tokenType) || JavaTokenType.GT.equals(tokenType)));
final PsiExpression lhsIndexExpression = lhs.getIndexExpression();
- final PsiExpression strippedLhsIndexExpression =
- ParenthesesUtils.stripParentheses(lhsIndexExpression);
- final String toOffsetText =
- buildOffsetText(strippedLhsIndexExpression, variable,
- limitExpression, decrement &&
- (JavaTokenType.LT.equals(tokenType) ||
- JavaTokenType.GT.equals(tokenType)));
+ final PsiExpression strippedLhsIndexExpression = ParenthesesUtils.stripParentheses(lhsIndexExpression);
+ final String toOffsetText = buildOffsetText(strippedLhsIndexExpression, variable,
+ limitExpression, decrement && (JavaTokenType.LT.equals(tokenType) || JavaTokenType.GT.equals(tokenType)));
@NonNls final StringBuilder buffer = new StringBuilder(60);
buffer.append("System.arraycopy(");
buffer.append(fromArrayText);
@@ -199,6 +177,7 @@ public class ManualArrayCopyInspection extends BaseInspection {
return buffer.toString();
}
+ @Nullable
private static PsiArrayAccessExpression getLhsArrayAccessExpression(
PsiForStatement forStatement) {
PsiStatement body = forStatement.getBody();
@@ -240,6 +219,7 @@ public class ManualArrayCopyInspection extends BaseInspection {
return (PsiArrayAccessExpression)deparenthesizedExpression;
}
+ @Nullable
private static PsiArrayAccessExpression getRhsArrayAccessExpression(
PsiForStatement forStatement) {
PsiStatement body = forStatement.getBody();
@@ -297,9 +277,7 @@ public class ManualArrayCopyInspection extends BaseInspection {
@NonNls
@Nullable
- private static String buildLengthText(PsiExpression max,
- PsiExpression min,
- boolean plusOne) {
+ private static String buildLengthText(PsiExpression max, PsiExpression min, boolean plusOne) {
max = ParenthesesUtils.stripParentheses(max);
if (max == null) {
return null;
@@ -308,10 +286,9 @@ public class ManualArrayCopyInspection extends BaseInspection {
if (min == null) {
return buildExpressionText(max, plusOne, false);
}
- final Object constant =
- ExpressionUtils.computeConstantExpression(min);
- if (constant instanceof Number) {
- final Number minNumber = (Number)constant;
+ final Object minConstant = ExpressionUtils.computeConstantExpression(min);
+ if (minConstant instanceof Number) {
+ final Number minNumber = (Number)minConstant;
final int minValue;
if (plusOne) {
minValue = minNumber.intValue() - 1;
@@ -319,14 +296,20 @@ public class ManualArrayCopyInspection extends BaseInspection {
else {
minValue = minNumber.intValue();
}
- final String maxText =
- buildExpressionText(max, false, false);
+ if (minValue == 0) {
+ return buildExpressionText(max, false, false);
+ }
+ if (max instanceof PsiLiteralExpression) {
+ final Object maxConstant = ExpressionUtils.computeConstantExpression(max);
+ if (maxConstant instanceof Number) {
+ final Number number = (Number)maxConstant;
+ return String.valueOf(number.intValue() - minValue);
+ }
+ }
+ final String maxText = buildExpressionText(max, false, false);
if (minValue > 0) {
return maxText + '-' + minValue;
}
- else if (minValue == 0) {
- return maxText;
- }
else {
return maxText + '+' + -minValue;
}
@@ -343,39 +326,31 @@ public class ManualArrayCopyInspection extends BaseInspection {
return maxText + '-' + minText;
}
- private static String buildExpressionText(PsiExpression expression,
- boolean plusOne,
- boolean parenthesize) {
+ private static String buildExpressionText(PsiExpression expression, boolean plusOne, boolean parenthesize) {
if (!plusOne) {
- final int precedence =
- ParenthesesUtils.getPrecedence(expression);
+ final int precedence = ParenthesesUtils.getPrecedence(expression);
if (precedence > ParenthesesUtils.ADDITIVE_PRECEDENCE) {
return '(' + expression.getText() + ')';
}
else {
- if (parenthesize && precedence >=
- ParenthesesUtils.ADDITIVE_PRECEDENCE) {
+ if (parenthesize && precedence >= ParenthesesUtils.ADDITIVE_PRECEDENCE) {
return '(' + expression.getText() + ')';
}
return expression.getText();
}
}
if (expression instanceof PsiBinaryExpression) {
- final PsiBinaryExpression binaryExpression =
- (PsiBinaryExpression)expression;
- final IElementType tokenType =
- binaryExpression.getOperationTokenType();
+ final PsiBinaryExpression binaryExpression = (PsiBinaryExpression)expression;
+ final IElementType tokenType = binaryExpression.getOperationTokenType();
if (tokenType == JavaTokenType.MINUS) {
- final PsiExpression rhs =
- binaryExpression.getROperand();
+ final PsiExpression rhs = binaryExpression.getROperand();
if (ExpressionUtils.isOne(rhs)) {
return binaryExpression.getLOperand().getText();
}
}
}
else if (expression instanceof PsiLiteralExpression) {
- final PsiLiteralExpression literalExpression =
- (PsiLiteralExpression)expression;
+ final PsiLiteralExpression literalExpression = (PsiLiteralExpression)expression;
final Object value = literalExpression.getValue();
if (value instanceof Integer) {
final Integer integer = (Integer)value;
diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/performance/replace_with_system_arraycopy/Decrement.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/performance/replace_with_system_arraycopy/Decrement.after.java
new file mode 100644
index 000000000000..8f20bd3539e6
--- /dev/null
+++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/performance/replace_with_system_arraycopy/Decrement.after.java
@@ -0,0 +1,7 @@
+package com.siyeh.igfixes.performance.replace_with_system_arraycopy;
+
+class Decrement {
+ void foo(int[] a, int[] b) {
+ System.arraycopy(a, 0, b, 0, 2);
+ }
+}
\ No newline at end of file
diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/performance/replace_with_system_arraycopy/Decrement.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/performance/replace_with_system_arraycopy/Decrement.java
new file mode 100644
index 000000000000..7ab369e16516
--- /dev/null
+++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/performance/replace_with_system_arraycopy/Decrement.java
@@ -0,0 +1,9 @@
+package com.siyeh.igfixes.performance.replace_with_system_arraycopy;
+
+class Decrement {
+ void foo(int[] a, int[] b) {
+ for (int i = 1; i >= 0; i--) {
+ b[i] = a[i];
+ }
+ }
+}
\ No newline at end of file
diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/performance/replace_with_system_arraycopy/Simple.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/performance/replace_with_system_arraycopy/Simple.after.java
new file mode 100644
index 000000000000..fb1921f60a1f
--- /dev/null
+++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/performance/replace_with_system_arraycopy/Simple.after.java
@@ -0,0 +1,7 @@
+package com.siyeh.igfixes.performance.replace_with_system_arraycopy;
+
+class Simple {
+ void foo(String[] source, Object[] target) {
+ System.arraycopy(source, 0, target, 0, 5);
+ }
+}
\ No newline at end of file
diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/performance/replace_with_system_arraycopy/Simple.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/performance/replace_with_system_arraycopy/Simple.java
new file mode 100644
index 000000000000..9ad83104ed83
--- /dev/null
+++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/performance/replace_with_system_arraycopy/Simple.java
@@ -0,0 +1,9 @@
+package com.siyeh.igfixes.performance.replace_with_system_arraycopy;
+
+class Simple {
+ void foo(String[] source, Object[] target) {
+ for (int k = 0; k < 5; k++) { // can be converted to System.arraycopy()
+ target[k] = source[k];
+ }
+ }
+}
\ No newline at end of file
diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/performance/ManualArrayCopyFixTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/performance/ManualArrayCopyFixTest.java
new file mode 100644
index 000000000000..fee9dd5bb28f
--- /dev/null
+++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/performance/ManualArrayCopyFixTest.java
@@ -0,0 +1,19 @@
+package com.siyeh.ig.fixes.performance;
+
+import com.siyeh.InspectionGadgetsBundle;
+import com.siyeh.ig.IGQuickFixesTestCase;
+import com.siyeh.ig.performance.ManualArrayCopyInspection;
+
+public class ManualArrayCopyFixTest extends IGQuickFixesTestCase {
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ myFixture.enableInspections(new ManualArrayCopyInspection());
+ myRelativePath = "performance/replace_with_system_arraycopy";
+ myDefaultHint = InspectionGadgetsBundle.message("manual.array.copy.replace.quickfix");
+ }
+
+ public void testSimple() { doTest(); }
+ public void testDecrement() { doTest(); }
+}
\ No newline at end of file