diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java b/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java index 50cf45f8e259..f576711e12b2 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java @@ -169,7 +169,13 @@ public class JavaValue extends XNamedValue implements NodeDescriptorProvider, XV @Override public void contextAction() throws Exception { - callback.evaluated(myValueDescriptor.getValueText()); + final ValueDescriptorImpl fullValueDescriptor = myValueDescriptor.getFullValueDescriptor(); + fullValueDescriptor.updateRepresentation(myEvaluationContext, new DescriptorLabelListener() { + @Override + public void labelChanged() { + callback.evaluated(fullValueDescriptor.getValueText()); + } + }); } }); } diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/JavaValueModifier.java b/java/debugger/impl/src/com/intellij/debugger/engine/JavaValueModifier.java index 5aa037191c17..0b482acd4ea9 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/JavaValueModifier.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/JavaValueModifier.java @@ -42,7 +42,6 @@ import com.intellij.util.IJSwingUtilities; import com.intellij.xdebugger.frame.XValueModifier; import com.sun.jdi.*; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -59,17 +58,30 @@ public class JavaValueModifier extends XValueModifier { myJavaValue = javaValue; } - @Nullable @Override - public String getInitialValueEditorText() { - Value value = myJavaValue.getDescriptor().getValue(); + public void calculateInitialValueEditorText(final XInitialValueCallback callback) { + final Value value = myJavaValue.getDescriptor().getValue(); if (value instanceof PrimitiveValue) { - return myJavaValue.getValueString(); + callback.setValue(myJavaValue.getValueString()); } else if (value instanceof StringReference) { - return StringUtil.wrapWithDoubleQuote(DebuggerUtils.translateStringValue(myJavaValue.getValueString())); + final EvaluationContextImpl evaluationContext = myJavaValue.getEvaluationContext(); + evaluationContext.getManagerThread().schedule(new SuspendContextCommandImpl(evaluationContext.getSuspendContext()) { + @Override + public Priority getPriority() { + return Priority.NORMAL; + } + + @Override + public void contextAction() throws Exception { + callback.setValue( + StringUtil.wrapWithDoubleQuote(DebuggerUtils.translateStringValue(DebuggerUtils.getValueAsString(evaluationContext, value)))); + } + }); + } + else { + callback.setValue(null); } - return null; } //public void update(AnActionEvent e) { diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/ValueDescriptorImpl.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/ValueDescriptorImpl.java index a9e1d409ac93..34efd89882b1 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/ValueDescriptorImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/ValueDescriptorImpl.java @@ -22,6 +22,7 @@ import com.intellij.debugger.engine.evaluation.EvaluateException; import com.intellij.debugger.engine.evaluation.EvaluationContextImpl; import com.intellij.debugger.engine.events.SuspendContextCommandImpl; import com.intellij.debugger.impl.DebuggerContextImpl; +import com.intellij.debugger.impl.DebuggerUtilsEx; import com.intellij.debugger.jdi.VirtualMachineProxyImpl; import com.intellij.debugger.settings.NodeRendererSettings; import com.intellij.debugger.ui.tree.DebuggerTreeNode; @@ -58,6 +59,7 @@ public abstract class ValueDescriptorImpl extends NodeDescriptorImpl implements private String myIdLabel; private String myValueText; + private boolean myFullValue = false; @Nullable private Icon myValueIcon; @@ -328,8 +330,32 @@ public abstract class ValueDescriptorImpl extends NodeDescriptorImpl implements return calcValueName() + " = " + myIdLabel + myValueText; } + public ValueDescriptorImpl getFullValueDescriptor() { + ValueDescriptorImpl descriptor = new ValueDescriptorImpl(myProject, myValue) { + @Override + public Value calcValue(EvaluationContextImpl evaluationContext) throws EvaluateException { + return myValue; + } + + @Override + public String calcValueName() { + return null; + } + + @Override + public PsiExpression getDescriptorEvaluation(DebuggerContext context) throws EvaluateException { + return null; + } + }; + descriptor.myFullValue = true; + return descriptor; + } + @Override public void setValueLabel(String label) { + if (!myFullValue) { + label = DebuggerUtilsEx.truncateString(label); + } myValueText = label; myIdLabel = getIdLabel(label); } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassRenderer.java b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassRenderer.java index d0f4676f6819..720e3ce2456b 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassRenderer.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassRenderer.java @@ -37,7 +37,6 @@ import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.PsiElementFactory; import com.intellij.psi.PsiExpression; import com.intellij.util.IncorrectOperationException; -import com.intellij.util.StringBuilderSpinAllocator; import com.intellij.xdebugger.settings.XDebuggerSettingsManager; import com.sun.jdi.*; import org.jdom.Element; @@ -112,42 +111,31 @@ public class ClassRenderer extends NodeRendererImpl{ final ValueDescriptorImpl valueDescriptor = (ValueDescriptorImpl)descriptor; final Value value = valueDescriptor.getValue(); if (value instanceof ObjectReference) { - final StringBuilder buf = StringBuilderSpinAllocator.alloc(); - try { - if (value instanceof StringReference) { - // no need to add quotes and escape characters here, XValueTextRendererImpl handles the presentation - //buf.append('\"'); - //buf.append(DebuggerUtils.convertToPresentationString(((StringReference)value).value())); - //buf.append('\"'); - buf.append(((StringReference)value).value()); - } - else if (value instanceof ClassObjectReference) { - ReferenceType type = ((ClassObjectReference)value).reflectedType(); - buf.append((type != null)?type.name():"{...}"); - } - else { - final ObjectReference objRef = (ObjectReference)value; - final Type type = objRef.type(); - if (type instanceof ClassType && ((ClassType)type).isEnum()) { - final String name = getEnumConstantName(objRef, (ClassType)type); - if (name != null) { - buf.append(name); - } - else { - buf.append(type.name()); - } + if (value instanceof StringReference) { + return ((StringReference)value).value(); + } + else if (value instanceof ClassObjectReference) { + ReferenceType type = ((ClassObjectReference)value).reflectedType(); + return (type != null) ? type.name() : "{...}"; + } + else { + final ObjectReference objRef = (ObjectReference)value; + final Type type = objRef.type(); + if (type instanceof ClassType && ((ClassType)type).isEnum()) { + final String name = getEnumConstantName(objRef, (ClassType)type); + if (name != null) { + return name; } else { - buf.append(ValueDescriptorImpl.getIdLabel(objRef)); + return type.name(); } } - return buf.toString(); - } - finally { - StringBuilderSpinAllocator.dispose(buf); + else { + return ValueDescriptorImpl.getIdLabel(objRef); + } } } - else if(value == null) { + else if (value == null) { //noinspection HardCodedStringLiteral return "null"; } diff --git a/platform/core-impl/src/com/intellij/openapi/editor/ex/util/SegmentArrayWithData.java b/platform/core-impl/src/com/intellij/openapi/editor/ex/util/SegmentArrayWithData.java index 8463c49b339f..27f65f9f1e88 100644 --- a/platform/core-impl/src/com/intellij/openapi/editor/ex/util/SegmentArrayWithData.java +++ b/platform/core-impl/src/com/intellij/openapi/editor/ex/util/SegmentArrayWithData.java @@ -31,7 +31,7 @@ public class SegmentArrayWithData extends SegmentArray { } public void setElementAt(int i, int startOffset, int endOffset, int data) { - if (data < 0 && data > Short.MAX_VALUE) throw new IndexOutOfBoundsException("data out of short range" + data); + if (data < 0 || data > Short.MAX_VALUE) throw new IndexOutOfBoundsException("data out of short range" + data); setElementAt(i, startOffset, endOffset); myData = reallocateArray(myData, i+1); myData[i] = (short)data; diff --git a/platform/editor-ui-ex/src/com/intellij/openapi/editor/colors/impl/AbstractColorsScheme.java b/platform/editor-ui-ex/src/com/intellij/openapi/editor/colors/impl/AbstractColorsScheme.java index cd070861ee50..d9dce154db7b 100644 --- a/platform/editor-ui-ex/src/com/intellij/openapi/editor/colors/impl/AbstractColorsScheme.java +++ b/platform/editor-ui-ex/src/com/intellij/openapi/editor/colors/impl/AbstractColorsScheme.java @@ -349,7 +349,7 @@ public abstract class AbstractColorsScheme implements EditorColorsScheme { attr.setErrorStripeColor(defaultColor); } } - private static final Map DEFAULT_ERROR_STRIPE_COLOR = new THashMap(); + public static final Map DEFAULT_ERROR_STRIPE_COLOR = new THashMap(); static { DEFAULT_ERROR_STRIPE_COLOR.put(CodeInsightColors.ERRORS_ATTRIBUTES.getExternalName(), Color.red); DEFAULT_ERROR_STRIPE_COLOR.put(CodeInsightColors.WRONG_REFERENCES_ATTRIBUTES.getExternalName(), Color.red); diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/ex/FoldingModelEx.java b/platform/platform-impl/src/com/intellij/openapi/editor/ex/FoldingModelEx.java index e558a0482317..33373b56ce2f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/ex/FoldingModelEx.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/ex/FoldingModelEx.java @@ -36,6 +36,9 @@ public interface FoldingModelEx extends FoldingModel { boolean intersectsRegion(int startOffset, int endOffset); + /** + * @deprecated Use an equivalent method {@link FoldingModel#getCollapsedRegionAtOffset(int)} instead. To be removed in IDEA 16. + */ FoldRegion fetchOutermost(int offset); /** diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/IterationState.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/IterationState.java index 2d1ded2c9a36..3b658d03128f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/IterationState.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/IterationState.java @@ -269,7 +269,7 @@ public final class IterationState { advanceCurrentVirtualSelectionIndex(); if (!myUseOnlyFullLineHighlighters) { - myCurrentFold = myFoldingModel.fetchOutermost(myStartOffset); + myCurrentFold = myFoldingModel.getCollapsedRegionAtOffset(myStartOffset); } if (myCurrentFold != null) { myEndOffset = myCurrentFold.getEndOffset(); diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/SoftWrapApplianceManager.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/SoftWrapApplianceManager.java index 531c39c83f62..6bc28ed89ce2 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/SoftWrapApplianceManager.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/SoftWrapApplianceManager.java @@ -355,7 +355,9 @@ public class SoftWrapApplianceManager implements Dumpable { if (!foldRegion.isValid() || foldRegion.getStartOffset() != myContext.tokenStartOffset || foldRegion.getEndOffset() > document.getTextLength()) { - LOG.error("Inconsistent fold region state: fold region: " + foldRegion + ", soft wrap model state: " + myEditor.getSoftWrapModel()); + LOG.error("Inconsistent fold region state: fold region: " + foldRegion + + ", soft wrap model state: " + myEditor.getSoftWrapModel() + + ", folding model state: " + myEditor.getFoldingModel()); return true; } diff --git a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/BuildInfo.java b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/BuildInfo.java index 9b8885aa5cef..4beaf82778d7 100644 --- a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/BuildInfo.java +++ b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/BuildInfo.java @@ -101,9 +101,13 @@ public class BuildInfo implements Comparable { @Nullable public PatchInfo findPatchForCurrentBuild() { - BuildNumber currentBuild = ApplicationInfo.getInstance().getBuild(); + return findPatchForBuild(ApplicationInfo.getInstance().getBuild()); + } + + @Nullable + public PatchInfo findPatchForBuild(BuildNumber currentBuild) { for (PatchInfo each : myPatches) { - if (each.isAvailable() && each.getFromBuild().asStringWithoutProductCode().equals(currentBuild.asStringWithoutProductCode())) + if (each.isAvailable() && each.getFromBuild().asStringWithoutProductCode().equals(currentBuild.asStringWithoutProductCode())) return each; } return null; diff --git a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateStrategy.java b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateStrategy.java index e29c2c6bf715..399168ab35e2 100644 --- a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateStrategy.java +++ b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateStrategy.java @@ -89,7 +89,11 @@ public class UpdateStrategy { for (UpdateChannel channel : channels) { if ((channel.getMajorVersion() == myMajorVersion && channel.getStatus().compareTo(myChannelStatus) >= 0) || (channel.getMajorVersion() > myMajorVersion && channel.getStatus() == ChannelStatus.EAP && myChannelStatus == ChannelStatus.EAP)) { - result.add(channel); + if (channel.getMajorVersion() == myMajorVersion && channel.getStatus().compareTo(myChannelStatus) == 0) { + result.add(0, channel); // prefer channel that has same status as our selected channel status + } else { + result.add(channel); + } } } return result; diff --git a/platform/platform-tests/testSrc/com/intellij/ide/updates/UpdateStrategyTest.java b/platform/platform-tests/testSrc/com/intellij/ide/updates/UpdateStrategyTest.java index c287b32ad172..ab7217ea85c9 100644 --- a/platform/platform-tests/testSrc/com/intellij/ide/updates/UpdateStrategyTest.java +++ b/platform/platform-tests/testSrc/com/intellij/ide/updates/UpdateStrategyTest.java @@ -116,4 +116,16 @@ public class UpdateStrategyTest extends TestCase { Assert.assertEquals("IDEA10EAP", newChannel.getId()); Assert.assertEquals("IntelliJ IDEA X EAP", newChannel.getName()); } + + public void testChannelWithCurrentStatusPreferred() { + final TestUpdateSettings settings = new TestUpdateSettings(ChannelStatus.EAP); + + BuildNumber currentBuild = BuildNumber.fromString("IU-139.658"); + UpdateStrategy strategy = new UpdateStrategy(14, currentBuild, UpdatesInfoXppParserTest.InfoReader.read("idea-patchAvailable.xml"), settings); + + final CheckForUpdateResult result = strategy.checkForUpdates(); + Assert.assertEquals(UpdateStrategy.State.LOADED, result.getState()); + Assert.assertEquals(result.getUpdatedChannel().getStatus(), ChannelStatus.EAP); + Assert.assertNotNull(result.getNewBuildInSelectedChannel().findPatchForBuild(currentBuild)); + } } diff --git a/platform/platform-tests/testSrc/com/intellij/ide/updates/idea-patchAvailable.xml b/platform/platform-tests/testSrc/com/intellij/ide/updates/idea-patchAvailable.xml new file mode 100644 index 000000000000..ee7aec67ac17 --- /dev/null +++ b/platform/platform-tests/testSrc/com/intellij/ide/updates/idea-patchAvailable.xml @@ -0,0 +1,37 @@ + + + IU + IC + + + + IntelliJ IDEA 14.0.2 build 139.659 is available. +