From 34d58eb2e4f6651bd0e07345b08994adbeaac3f9 Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Thu, 2 May 2013 18:35:47 +0200 Subject: [PATCH] in case of long line, expand shown context to the word boundary when searching for word like query --- .../com/intellij/usages/ChunkExtractor.java | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/platform/usageView/src/com/intellij/usages/ChunkExtractor.java b/platform/usageView/src/com/intellij/usages/ChunkExtractor.java index 80bfdb2b056d..cf7b95dd92a1 100644 --- a/platform/usageView/src/com/intellij/usages/ChunkExtractor.java +++ b/platform/usageView/src/com/intellij/usages/ChunkExtractor.java @@ -150,26 +150,40 @@ public class ChunkExtractor { final List result = new ArrayList(); appendPrefix(result, visibleLineNumber, visibleColumnNumber); - int lineStartOffset = myDocument.getLineStartOffset(lineNumber); - int lineEndOffset = lineStartOffset < myDocument.getTextLength() ? myDocument.getLineEndOffset(lineNumber) : 0; - if (lineStartOffset > lineEndOffset) return TextChunk.EMPTY_ARRAY; + int fragmentToShowStart = myDocument.getLineStartOffset(lineNumber); + int fragmentToShowEnd = fragmentToShowStart < myDocument.getTextLength() ? myDocument.getLineEndOffset(lineNumber) : 0; + if (fragmentToShowStart > fragmentToShowEnd) return TextChunk.EMPTY_ARRAY; final CharSequence chars = myDocument.getCharsSequence(); - if (lineEndOffset - lineStartOffset > MAX_LINE_LENGTH_TO_SHOW) { + if (fragmentToShowEnd - fragmentToShowStart > MAX_LINE_LENGTH_TO_SHOW) { + final int lineStartOffset = fragmentToShowStart; + fragmentToShowStart = Math.max(lineStartOffset, absoluteStartOffset - OFFSET_BEFORE_TO_SHOW_WHEN_LONG_LINE); + + final int lineEndOffset = fragmentToShowEnd; Segment segment = usageInfo2UsageAdapter.getUsageInfo().getSegment(); int usage_length = segment != null ? segment.getEndOffset() - segment.getStartOffset():0; - lineStartOffset = Math.max(lineStartOffset, absoluteStartOffset - OFFSET_BEFORE_TO_SHOW_WHEN_LONG_LINE); - lineEndOffset = Math.min(lineEndOffset, absoluteStartOffset + usage_length + OFFSET_AFTER_TO_SHOW_WHEN_LONG_LINE); + fragmentToShowEnd = Math.min(lineEndOffset, absoluteStartOffset + usage_length + OFFSET_AFTER_TO_SHOW_WHEN_LONG_LINE); + + // if we search something like a word, then expand shown context from one symbol before / after at least for word boundary + // this should not cause restarts of the lexer as the tokens are usually words + if (usage_length > 0 && + StringUtil.isJavaIdentifierStart(chars.charAt(absoluteStartOffset)) && + StringUtil.isJavaIdentifierStart(chars.charAt(absoluteStartOffset + usage_length - 1))) { + while(fragmentToShowEnd < lineEndOffset && StringUtil.isJavaIdentifierStart(chars.charAt(fragmentToShowEnd - 1))) ++fragmentToShowEnd; + while(fragmentToShowStart > lineStartOffset && StringUtil.isJavaIdentifierStart(chars.charAt(fragmentToShowStart))) --fragmentToShowStart; + if (fragmentToShowStart != lineStartOffset) ++fragmentToShowStart; + if (fragmentToShowEnd != lineEndOffset) --fragmentToShowEnd; + } } if (myDocument instanceof DocumentWindow) { List editable = InjectedLanguageManager.getInstance(file.getProject()) - .intersectWithAllEditableFragments(file, new TextRange(lineStartOffset, lineEndOffset)); + .intersectWithAllEditableFragments(file, new TextRange(fragmentToShowStart, fragmentToShowEnd)); for (TextRange range : editable) { createTextChunks(usageInfo2UsageAdapter, chars, range.getStartOffset(), range.getEndOffset(), true, result); } return result.toArray(new TextChunk[result.size()]); } - return createTextChunks(usageInfo2UsageAdapter, chars, lineStartOffset, lineEndOffset, true, result); + return createTextChunks(usageInfo2UsageAdapter, chars, fragmentToShowStart, fragmentToShowEnd, true, result); } @NotNull