use of com.perl5.lang.pod.parser.psi.references.PodLinkToSectionReference in project Perl5-IDEA by Camelcade.
the class PodLinkCompletionProvider method addCompletions.
@Override
protected void addCompletions(@NotNull CompletionParameters parameters, ProcessingContext context, @NotNull CompletionResultSet result) {
PsiElement element = parameters.getOriginalPosition();
if (element == null) {
return;
}
PsiPodFormatLink psiPodFormatLink = PsiTreeUtil.getParentOfType(element, PsiPodFormatLink.class);
if (psiPodFormatLink == null) {
return;
}
TextRange elementRange = element.getTextRange().shiftRight(-psiPodFormatLink.getTextOffset());
PsiReference[] references = psiPodFormatLink.getReferences();
for (PsiReference reference : references) {
TextRange referenceRange = reference.getRangeInElement();
if (referenceRange.contains(elementRange)) {
if (reference instanceof PodLinkToFileReference) {
addFilesCompletions(psiPodFormatLink, result);
return;
} else if (reference instanceof PodLinkToSectionReference) {
addSectionsCompletions(result, psiPodFormatLink.getTargetFile());
return;
}
}
}
// checking for an empty section
if (atSectionPosition(element)) {
addSectionsCompletions(result, psiPodFormatLink.getTargetFile());
}
}
use of com.perl5.lang.pod.parser.psi.references.PodLinkToSectionReference in project Perl5-IDEA by Camelcade.
the class PodFormatterLMixin method computeReferences.
@Override
public PsiReference[] computeReferences() {
List<PsiReference> references = new ArrayList<>();
final PodLinkDescriptor descriptor = getLinkDescriptor();
if (descriptor != null && !descriptor.isUrl()) {
PsiElement contentBlock = getContentBlock();
if (contentBlock != null) {
int rangeOffset = contentBlock.getStartOffsetInParent();
// file reference
TextRange fileRange = descriptor.getFileIdTextRangeInLink();
if (fileRange != null && !fileRange.isEmpty()) {
references.add(new PodLinkToFileReference(this, fileRange.shiftRight(rangeOffset)));
}
// section reference
TextRange sectionRange = descriptor.getSectionTextRangeInLink();
if (sectionRange != null && !sectionRange.isEmpty()) {
references.add(new PodLinkToSectionReference(this, sectionRange.shiftRight(rangeOffset)));
}
}
}
references.addAll(Arrays.asList(ReferenceProvidersRegistry.getReferencesFromProviders(this)));
return references.toArray(new PsiReference[references.size()]);
}
use of com.perl5.lang.pod.parser.psi.references.PodLinkToSectionReference in project Perl5-IDEA by Camelcade.
the class PodUnresolvableLinkInspection method buildVisitor.
@NotNull
@Override
public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder, boolean isOnTheFly) {
return new PodVisitor() {
@Override
public void visitPodFormatLink(@NotNull PsiPodFormatLink o) {
for (PsiReference reference : o.getReferences()) {
if (reference instanceof PsiPolyVariantReference && ((PsiPolyVariantReference) reference).multiResolve(false).length == 0) {
String error;
if (reference instanceof PodLinkToFileReference) {
String fileName = "UNKNONW";
PodLinkDescriptor descriptor = o.getLinkDescriptor();
if (descriptor != null && descriptor.getFileId() != null) {
fileName = descriptor.getFileId();
}
error = "Can't find POD or PM file by: " + fileName;
} else if (reference instanceof PodLinkToSectionReference) {
String fileName = "UNKNONW";
PodLinkDescriptor descriptor = o.getLinkDescriptor();
if (descriptor != null && descriptor.getSection() != null) {
fileName = descriptor.getSection();
}
error = "Can't find POD section: " + fileName;
} else {
error = "Can't find reference target";
}
holder.registerProblem(reference, error, ProblemHighlightType.GENERIC_ERROR_OR_WARNING);
}
}
super.visitPodFormatLink(o);
}
};
}
Aggregations