diff --git a/platform/core-api/src/com/intellij/diagnostic/Dumpable.java b/platform/core-api/src/com/intellij/diagnostic/Dumpable.java new file mode 100644 index 000000000000..ffe528337cb8 --- /dev/null +++ b/platform/core-api/src/com/intellij/diagnostic/Dumpable.java @@ -0,0 +1,28 @@ +/* + * Copyright 2000-2012 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.diagnostic; + +import org.jetbrains.annotations.NotNull; + +/** + * @author Denis Zhdanov + * @since 4/9/12 2:10 PM + */ +public interface Dumpable { + + @NotNull + String dumpState(); +} diff --git a/platform/core-impl/src/com/intellij/openapi/editor/impl/CharArray.java b/platform/core-impl/src/com/intellij/openapi/editor/impl/CharArray.java index bee5b0ba7eac..1329da1d6495 100644 --- a/platform/core-impl/src/com/intellij/openapi/editor/impl/CharArray.java +++ b/platform/core-impl/src/com/intellij/openapi/editor/impl/CharArray.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.editor.impl; +import com.intellij.diagnostic.Dumpable; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.event.DocumentEvent; import com.intellij.util.ArrayUtil; @@ -37,7 +38,7 @@ import java.util.concurrent.locks.ReentrantLock; /** * @author cdr */ -abstract class CharArray implements CharSequenceBackedByArray { +abstract class CharArray implements CharSequenceBackedByArray, Dumpable { private static final Logger LOG = Logger.getInstance("#" + CharArray.class.getName()); @SuppressWarnings("UseOfArchaicSystemPropertyAccessors") @@ -669,7 +670,7 @@ abstract class CharArray implements CharSequenceBackedByArray { @NonNls @NotNull - private String dumpState() { + public String dumpState() { return "deferred changes mode: " + isDeferredChangeMode()+", length: " + length()+" (data array length: " + myCount+ ", deferred shift: " + myDeferredShift+"); view offsets: [" + myStart+"; "+myCount+"]; deferred changes: "+myDeferredChangesStorage; } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/EditorUtil.java b/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/EditorUtil.java index 61752288e703..ad2fe4b161c4 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/EditorUtil.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/EditorUtil.java @@ -15,6 +15,8 @@ */ package com.intellij.openapi.editor.ex.util; +import com.intellij.diagnostic.Dumpable; +import com.intellij.diagnostic.LogMessageEx; import com.intellij.openapi.application.Result; import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.diagnostic.Logger; @@ -398,10 +400,20 @@ public class EditorUtil { char c = text.charAt(i); if (c == '\n' || c == '\r') { String editorInfo = editor instanceof EditorImpl ? ". Editor info: " + ((EditorImpl)editor).dumpState() : ""; - LOG.error(String.format( - "Symbol: '%c', its index: %d, given start: %d, given offset: %d, given tab size: %d. Text holder class: %s%s", - c, i, start, offset, tabSize, text.getClass(), editorInfo - )); + String documentInfo; + if (text instanceof Dumpable) { + documentInfo = ((Dumpable)text).dumpState(); + } + else { + documentInfo = "Text holder class: " + text.getClass(); + } + LogMessageEx.error( + LOG, "detected incorrect offset -> column number calculation", + String.format( + "Symbol: '%c', its index: %d, given start: %d, given offset: %d, given tab size: %d. %s%s", + c, i, start, offset, tabSize, documentInfo, editorInfo + ) + ); } if (c == '\t') { shift += getTabLength(i + shift - start, tabSize) - 1; diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java index 1ea0f94e675a..fa6a7ba84451 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java @@ -22,6 +22,7 @@ import com.intellij.codeInsight.hint.EditorFragmentComponent; import com.intellij.codeInsight.hint.TooltipController; import com.intellij.codeInsight.hint.TooltipGroup; import com.intellij.concurrency.JobScheduler; +import com.intellij.diagnostic.Dumpable; import com.intellij.diagnostic.LogMessageEx; import com.intellij.ide.*; import com.intellij.ide.dnd.DnDManager; @@ -127,7 +128,7 @@ import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; -public final class EditorImpl extends UserDataHolderBase implements EditorEx, HighlighterClient, Queryable { +public final class EditorImpl extends UserDataHolderBase implements EditorEx, HighlighterClient, Queryable, Dumpable { private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.editor.impl.EditorImpl"); private static final Key DND_COMMAND_KEY = Key.create("DndCommand"); public static final Key PERMANENT_HEADER = Key.create("PERMANENT_HEADER"); @@ -562,7 +563,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi @Override @NotNull - public FoldingModelEx getFoldingModel() { + public FoldingModelImpl getFoldingModel() { return myFoldingModel; } @@ -2609,8 +2610,8 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi + "', allow caret inside tab: " + mySettings.isCaretInsideTabs() + ", allow caret after line end: " + mySettings.isVirtualSpace() + ", soft wraps: " + (mySoftWrapModel.isSoftWrappingEnabled() ? "on" : "off") - + ", soft wraps data: " + getSoftWrapModel() - + "\n\nfolding data: " + getFoldingModel() + + ", soft wraps data: " + getSoftWrapModel().dumpState() + + "\n\nfolding data: " + getFoldingModel().dumpState() + "\n\ndocument info: " + myDocument.dumpState(); } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldingModelImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldingModelImpl.java index 1adca403dcd4..611456fe84f0 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldingModelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldingModelImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 JetBrains s.r.o. + * Copyright 2000-2012 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. @@ -24,6 +24,7 @@ */ package com.intellij.openapi.editor.impl; +import com.intellij.diagnostic.Dumpable; import com.intellij.openapi.application.ex.ApplicationManagerEx; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.FoldRegion; @@ -46,7 +47,7 @@ import java.util.List; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; -public class FoldingModelImpl implements FoldingModelEx, PrioritizedDocumentListener { +public class FoldingModelImpl implements FoldingModelEx, PrioritizedDocumentListener, Dumpable { private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.editor.impl.EditorFoldingModelImpl"); private final Set myListeners = new CopyOnWriteArraySet(); @@ -526,8 +527,14 @@ public class FoldingModelImpl implements FoldingModelEx, PrioritizedDocumentList } } + @NotNull @Override - public String toString() { + public String dumpState() { return Arrays.toString(myFoldTree.fetchTopLevel()); } + + @Override + public String toString() { + return dumpState(); + } } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/SoftWrapModelImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/SoftWrapModelImpl.java index 7f228571ca81..4c09db41fac7 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/SoftWrapModelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/SoftWrapModelImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 JetBrains s.r.o. + * Copyright 2000-2012 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. @@ -15,6 +15,7 @@ */ package com.intellij.openapi.editor.impl; +import com.intellij.diagnostic.Dumpable; import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; @@ -51,7 +52,7 @@ import java.util.List; * @author Denis Zhdanov * @since Jun 8, 2010 12:47:32 PM */ -public class SoftWrapModelImpl implements SoftWrapModelEx, PrioritizedDocumentListener, FoldingListener, PropertyChangeListener { +public class SoftWrapModelImpl implements SoftWrapModelEx, PrioritizedDocumentListener, FoldingListener, PropertyChangeListener, Dumpable { /** * Holds name of JVM property which presence should trigger debug-aware soft wraps processing. @@ -686,9 +687,16 @@ public class SoftWrapModelImpl implements SoftWrapModelEx, PrioritizedDocumentLi } } + @NotNull + @Override + public String dumpState() { + return String.format("appliance manager state: %s; soft wraps mapping info: %s", + myApplianceManager.dumpState(), myDataMapper.dumpState()); + } + @Override public String toString() { - return String.format("appliance manager state: %s; soft wraps mapping info: %s", myApplianceManager, myDataMapper); + return dumpState(); } /** diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/CachingSoftWrapDataMapper.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/CachingSoftWrapDataMapper.java index f1261dc06d11..a6c245998eea 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/CachingSoftWrapDataMapper.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/CachingSoftWrapDataMapper.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.editor.impl.softwrap.mapping; +import com.intellij.diagnostic.Dumpable; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.*; import com.intellij.openapi.editor.ex.EditorEx; @@ -55,7 +56,7 @@ import java.util.List; * @author Denis Zhdanov * @since Aug 31, 2010 10:24:47 AM */ -public class CachingSoftWrapDataMapper implements SoftWrapDataMapper, SoftWrapAwareDocumentParsingListener { +public class CachingSoftWrapDataMapper implements SoftWrapDataMapper, SoftWrapAwareDocumentParsingListener, Dumpable { private static final Logger LOG = Logger.getInstance("#" + CachingSoftWrapDataMapper.class.getName()); private static final boolean DEBUG_SOFT_WRAP_PROCESSING = false; @@ -617,9 +618,15 @@ public class CachingSoftWrapDataMapper implements SoftWrapDataMapper, SoftWrapAw } } + @NotNull + @Override + public String dumpState() { + return myCache.toString(); + } + @Override public String toString() { - return myCache.toString(); + return dumpState(); } /** 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 e190b1b66c75..52745723e8e7 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 @@ -15,6 +15,7 @@ */ package com.intellij.openapi.editor.impl.softwrap.mapping; +import com.intellij.diagnostic.Dumpable; import com.intellij.diagnostic.LogMessageEx; import com.intellij.openapi.application.ex.ApplicationManagerEx; import com.intellij.openapi.diagnostic.Logger; @@ -53,7 +54,7 @@ import java.util.List; * @author Denis Zhdanov * @since Jul 5, 2010 10:01:27 AM */ -public class SoftWrapApplianceManager implements SoftWrapFoldingListener, DocumentListener { +public class SoftWrapApplianceManager implements SoftWrapFoldingListener, DocumentListener, Dumpable { private static final Logger LOG = Logger.getInstance("#" + SoftWrapApplianceManager.class.getName()); @@ -925,15 +926,21 @@ public class SoftWrapApplianceManager implements SoftWrapFoldingListener, Docume public void setWidthProvider(VisibleAreaWidthProvider widthProvider) { myWidthProvider = widthProvider; } - + + @NotNull @Override - public String toString() { + public String dumpState() { return String.format( "recalculation in progress: %b; stored update events: %s; active update events: %s, event being processed: %s", myInProgress, myEventsStorage, myActiveEvents, myEventBeingProcessed ); } + @Override + public String toString() { + return dumpState(); + } + /** * We need to use correct indent for soft-wrapped lines, i.e. they should be indented to the start of the logical line. * This class stores information about logical line start indent.