From e48005b3cc006d240aacef41145cae6d85fe0786 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Tue, 11 Apr 2017 16:07:23 +0300 Subject: [PATCH] more diagnostics for EA-100155 - IAE: UsageInfo. --- .../src/com/intellij/usageView/UsageInfo.java | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/platform/core-api/src/com/intellij/usageView/UsageInfo.java b/platform/core-api/src/com/intellij/usageView/UsageInfo.java index 2881d761b00b..78c1d854c196 100644 --- a/platform/core-api/src/com/intellij/usageView/UsageInfo.java +++ b/platform/core-api/src/com/intellij/usageView/UsageInfo.java @@ -35,7 +35,7 @@ public class UsageInfo { public final boolean isNonCodeUsage; protected boolean myDynamicUsage; - public UsageInfo(@NotNull PsiElement element, int startOffset, int endOffset, boolean isNonCodeUsage) { + public UsageInfo(@NotNull PsiElement element, final int startOffset, final int endOffset, boolean isNonCodeUsage) { element = element.getNavigationElement(); PsiFile file = element.getContainingFile(); PsiElement topElement = file == null ? element : file; @@ -45,30 +45,32 @@ public class UsageInfo { if (elementRange == null) { throw new IllegalArgumentException("text range null for " + element + "; " + element.getClass()); } + int effectiveStart; + int effectiveEnd; if (startOffset == -1 && endOffset == -1) { // calculate natural element range - startOffset = element.getTextOffset() - elementRange.getStartOffset(); - endOffset = elementRange.getEndOffset() - elementRange.getStartOffset(); + effectiveStart = element.getTextOffset() - elementRange.getStartOffset(); + effectiveEnd = elementRange.getLength(); + } + else { + effectiveStart = startOffset; + effectiveEnd = endOffset; } - if (startOffset < 0) { - throw new IllegalArgumentException("element " + element + "; startOffset " +startOffset); - } - if (startOffset > endOffset) { - throw new IllegalArgumentException("element " + element + "; diff " + (endOffset-startOffset)); + if (effectiveStart < 0 || effectiveStart > effectiveEnd) { + throw new IllegalArgumentException("element " + element + "; startOffset " +startOffset+"; endOffset="+endOffset+ + "; effectiveStart="+effectiveStart+"; effectiveEnd="+effectiveEnd+ + "; elementRange="+elementRange+"; element.getTextOffset()="+element.getTextOffset()); } Project project = topElement.getProject(); SmartPointerManager smartPointerManager = SmartPointerManager.getInstance(project); mySmartPointer = smartPointerManager.createSmartPsiElementPointer(element, file); - if (startOffset != element.getTextOffset() - elementRange.getStartOffset() || endOffset != elementRange.getLength()) { - TextRange rangeToStore; - if (file != null && InjectedLanguageManager.getInstance(project).isInjectedFragment(file)) { - rangeToStore = elementRange; - } - else { - rangeToStore = TextRange.create(startOffset, endOffset).shiftRight(elementRange.getStartOffset()); - } + if (file != null && + (effectiveStart != element.getTextOffset() - elementRange.getStartOffset() || effectiveEnd != elementRange.getLength())) { + TextRange rangeToStore = InjectedLanguageManager.getInstance(project).isInjectedFragment(file) + ? elementRange + : TextRange.create(effectiveStart, effectiveEnd).shiftRight(elementRange.getStartOffset()); myPsiFileRange = smartPointerManager.createSmartPsiFileRangePointer(file, rangeToStore); } else {