Highlight usages supports MultiRangeReference (as seen in objective-c message passing).

This commit is contained in:
Maxim Shafirov
2010-05-19 20:50:19 +04:00
parent 0dd8ba5e14
commit be80e61677
2 changed files with 15 additions and 12 deletions
@@ -98,12 +98,12 @@ public class IdentifierHighlighterPass extends TextEditorHighlightingPass {
final PsiElement finalMyTarget = myTarget;
ReferencesSearch.search(myTarget, new LocalSearchScope(myFile)).forEach(new Processor<PsiReference>() {
public boolean process(final PsiReference psiReference) {
final TextRange textRange = HighlightUsagesHandler.getRangeToHighlight(psiReference);
final List<TextRange> textRanges = HighlightUsagesHandler.getRangesToHighlight(psiReference);
if (detector == null || detector.getReferenceAccess(finalMyTarget, psiReference) == ReadWriteAccessDetector.Access.Read) {
myReadAccessRanges.add(textRange);
myReadAccessRanges.addAll(textRanges);
}
else {
myWriteAccessRanges.add(textRange);
myWriteAccessRanges.addAll(textRanges);
}
return true;
}
@@ -365,19 +365,22 @@ public class HighlightUsagesHandler extends HighlightHandlerBase {
TextAttributes attributes, boolean clearHighlights) {
List<TextRange> textRanges = new ArrayList<TextRange>(refs.size());
for (PsiReference ref : refs) {
TextRange range = getRangeToHighlight(ref);
textRanges.add(range);
textRanges.addAll(getRangesToHighlight(ref));
}
highlightRanges(highlightManager, editor, attributes, clearHighlights, textRanges);
}
public static TextRange getRangeToHighlight(final PsiReference ref) {
PsiElement element = ref.getElement();
TextRange rangeInElement = ref.getRangeInElement();
TextRange range = element.getTextRange().cutOut(rangeInElement);
// injection occurs
range = InjectedLanguageManager.getInstance(element.getProject()).injectedToHost(element, range);
return range;
public static List<TextRange> getRangesToHighlight(final PsiReference ref) {
final List<TextRange> relativeRanges = ReferenceRange.getRanges(ref);
List<TextRange> answer = new ArrayList<TextRange>(relativeRanges.size());
for (TextRange relativeRange : relativeRanges) {
PsiElement element = ref.getElement();
TextRange range = element.getTextRange().cutOut(relativeRange);
// injection occurs
answer.add(InjectedLanguageManager.getInstance(element.getProject()).injectedToHost(element, range));
}
return answer;
}
@Nullable