mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
in case of long line, expand shown context to the word boundary when searching for word like query
This commit is contained in:
@@ -150,26 +150,40 @@ public class ChunkExtractor {
|
||||
final List<TextChunk> result = new ArrayList<TextChunk>();
|
||||
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<TextRange> 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
|
||||
|
||||
Reference in New Issue
Block a user