下面列出了怎么用com.intellij.psi.ReferenceRange的API类实例代码及写法,或者点击链接到github查看源代码。
public static String getPrefix(CompletionParameters parameters) {
PsiElement insertedElement = parameters.getPosition();
int offsetInFile = parameters.getOffset();
PsiReference ref = insertedElement.getContainingFile().findReferenceAt(offsetInFile);
if (isStep(insertedElement) && ref != null) {
List<TextRange> ranges = ReferenceRange.getRanges(ref);
PsiElement element = ref.getElement();
int startOffset = element.getTextRange().getStartOffset();
for (TextRange range : ranges) {
if (range.contains(offsetInFile - startOffset)) {
int endIndex = offsetInFile - startOffset;
int startIndex = range.getStartOffset();
return StringUtil.trimStart(element.getText().substring(startIndex + 1, endIndex), " ");
}
}
}
return parameters.getPosition().getText().replace("IntellijIdeaRulezzz ", "").trim();
}
@RequiredReadAction
@Nullable
@Override
public HighlightInfoFactory checkImpl(@Nonnull CSharpLanguageVersion languageVersion, @Nonnull CSharpHighlightContext highlightContext, @Nonnull CSharpConstantExpressionImpl element)
{
PsiReference[] references = element.getReferences();
for(PsiReference reference : references)
{
PsiElement resolved = reference.resolve();
if(resolved != null)
{
continue;
}
if(reference instanceof CSharpReferenceWithValidation)
{
String errorMessage = ((CSharpReferenceWithValidation) reference).getErrorMessage(element);
List<TextRange> ranges = ReferenceRange.getAbsoluteRanges(reference);
return newBuilder(ranges.get(0)).setText(errorMessage);
}
}
return null;
}
@Override
public boolean processTextOccurrence(@Nonnull PsiElement element, int offsetInElement, @Nonnull final Processor<? super PsiReference> consumer) {
if (!myTarget.isValid()) {
return false;
}
final List<PsiReference> references = ourReferenceService.getReferences(element, new PsiReferenceService.Hints(myTarget, offsetInElement));
//noinspection ForLoopReplaceableByForEach
for (int i = 0; i < references.size(); i++) {
PsiReference ref = references.get(i);
ProgressManager.checkCanceled();
if (ReferenceRange.containsOffsetInElement(ref, offsetInElement) && ref.isReferenceTo(myTarget) && !consumer.process(ref)) {
return false;
}
}
return true;
}
private static void processReference(final CompletionResultSet result,
final int startOffset,
final PairConsumer<PsiReference, CompletionResultSet> consumer,
final PsiReference reference) {
PsiElement element = reference.getElement();
final int offsetInElement = startOffset - element.getTextRange().getStartOffset();
if (!ReferenceRange.containsOffsetInElement(reference, offsetInElement)) {
return;
}
TextRange range = reference.getRangeInElement();
try {
final String prefix = element.getText().substring(range.getStartOffset(), offsetInElement);
consumer.consume(reference, result.withPrefixMatcher(prefix));
}
catch (StringIndexOutOfBoundsException e) {
LOG.error("Reference=" + reference +
"; element=" + element + " of " + element.getClass() +
"; range=" + range +
"; offset=" + offsetInElement,
e);
}
}
private static int findReplacementOffset(int selectionEndOffset, PsiReference reference) {
final List<TextRange> ranges = ReferenceRange.getAbsoluteRanges(reference);
for (TextRange range : ranges) {
if (range.contains(selectionEndOffset)) {
return range.getEndOffset();
}
}
return selectionEndOffset;
}