Skip to content

Commit

Permalink
improved oid reference providers for oid tags
Browse files Browse the repository at this point in the history
  • Loading branch information
1azyman committed Mar 4, 2024
1 parent c9a97d8 commit 4817423
Show file tree
Hide file tree
Showing 6 changed files with 39 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public List<AxiomQueryError> doAnnotate(final PsiFile file) {
return Collections.emptyList();
}

return axiomQueryLangService.validate(file.getText());
return axiomQueryLangService.validate(content);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public class OidInlayParameterHintsProvider implements InlayParameterHintsProvid
@NotNull
@Override
public List<InlayInfo> getParameterHints(PsiElement element) {
if (!isReferenceOidAttribute(element) && !PsiUtils.isReferenceOidTag(element)) {
if (!PsiUtils.isReferenceOidAttributeValue(element) && !PsiUtils.isReferenceOidTag(element)) {
return Collections.emptyList();
}

Expand Down Expand Up @@ -73,18 +73,6 @@ public List<InlayInfo> getParameterHints(PsiElement element) {
return List.of(new InlayInfo(label, offset, false, true, false));
}

private boolean isReferenceOidAttribute(PsiElement element) {
if (!(element instanceof XmlAttributeValue value)) {
return false;
}

if (!(value.getParent() instanceof XmlAttribute attribute)) {
return false;
}

return "oid".equals(attribute.getLocalName());
}

private int inlayOffset(PsiElement expr, boolean atEnd) {
if (expr.getTextRange().isEmpty()) {
PsiElement next = expr.getNextSibling();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,17 @@
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.PsiReferenceBase;
import com.intellij.psi.xml.XmlAttributeValue;
import com.intellij.psi.xml.XmlElement;
import org.jetbrains.annotations.Nullable;

/**
* Created by Viliam Repan (lazyman).
*/
public class OidReference extends PsiReferenceBase<XmlAttributeValue> {
public class OidReference extends PsiReferenceBase<XmlElement> {

private final VirtualFile file;

public OidReference(XmlAttributeValue element, VirtualFile file) {
public OidReference(XmlElement element, VirtualFile file) {
super(element, true);

this.file = file;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,10 @@ public void registerReferenceProviders(@NotNull PsiReferenceRegistrar registrar)
.withParent(
XmlPatterns.xmlAttribute("oid")),
new OidReferenceProvider());

registrar.registerReferenceProvider(
XmlPatterns
.xmlTag().withLocalName("oid"),
new OidReferenceProvider());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,14 @@

import com.evolveum.midpoint.studio.impl.psi.search.ObjectFileBasedIndexImpl;
import com.evolveum.midpoint.studio.util.MidPointUtils;
import com.evolveum.midpoint.studio.util.PsiUtils;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiReference;
import com.intellij.psi.PsiReferenceProvider;
import com.intellij.psi.xml.XmlAttributeValue;
import com.intellij.psi.xml.XmlElement;
import com.intellij.psi.xml.XmlTag;
import com.intellij.util.ProcessingContext;
import org.jetbrains.annotations.NotNull;

Expand All @@ -18,30 +21,35 @@
*/
public class OidReferenceProvider extends PsiReferenceProvider {

// todo for object[oid] show only data from /objects folder maybe?
@NotNull
@Override
public PsiReference @NotNull [] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) {
if (!(element instanceof XmlAttributeValue attrValue)) {
if (!PsiUtils.isReferenceOidAttributeValue(element) && !PsiUtils.isReferenceOidTag(element)) {
return PsiReference.EMPTY_ARRAY;
}

boolean isObjectOid = MidPointUtils.isItObjectTypeOidAttribute(element);

String oid = attrValue.getValue();
XmlTag ref = PsiUtils.findObjectReferenceTag(element);
if (ref == null) {
return PsiReference.EMPTY_ARRAY;
}

List<VirtualFile> files = ObjectFileBasedIndexImpl.getVirtualFiles(oid, element.getProject(), isObjectOid);
if (files == null) {
String oid = PsiUtils.getOidFromReferenceTag(ref);
if (oid == null) {
return PsiReference.EMPTY_ARRAY;
}

boolean isObjectOid = element instanceof XmlAttributeValue ?
MidPointUtils.isItObjectTypeOidAttribute(element) : false;

List<VirtualFile> files = ObjectFileBasedIndexImpl.getVirtualFiles(oid, element.getProject(), isObjectOid);

Stream<VirtualFile> stream = files.stream();
if (files.size() == 1 && isObjectOid) {
stream = stream.filter(f -> !f.equals(element.getContainingFile().getVirtualFile()));
}

return stream
.map(f -> new OidReference(attrValue, f))
.map(f -> new OidReference((XmlElement) element, f))
.toList()
.toArray(new PsiReference[0]);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,7 @@
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiReference;
import com.intellij.psi.impl.source.xml.TagNameReference;
import com.intellij.psi.xml.XmlElement;
import com.intellij.psi.xml.XmlFile;
import com.intellij.psi.xml.XmlTag;
import com.intellij.psi.xml.*;
import org.apache.commons.lang3.StringUtils;

import javax.xml.namespace.QName;
Expand Down Expand Up @@ -176,4 +174,16 @@ public static String getOidFromReferenceTag(XmlTag reference) {
.findFirst()
.orElse(null);
}

public static boolean isReferenceOidAttributeValue(PsiElement element) {
if (!(element instanceof XmlAttributeValue value)) {
return false;
}

if (!(value.getParent() instanceof XmlAttribute attribute)) {
return false;
}

return "oid".equals(attribute.getLocalName());
}
}

0 comments on commit 4817423

Please sign in to comment.