@Nullable @Override public PsiElement resolve() { ResolveResult[] resolveResults = multiResolve(false); return resolveResults.length == 1 ? resolveResults[0].getElement() : null; } }
@Nullable @Override public PsiElement resolve() { final ResolveResult[] resolveResults = multiResolve(true); return resolveResults.length == 0 || resolveResults.length > 1 || !resolveResults[0].isValidResult() ? null : resolveResults[0].getElement(); }
if (!result.isValidResult()) { throw new AssertionFailedError("Invalid resolve result"); PsiElement targetElement = result.getElement(); assertNotNull(targetElement);
/** * Returns the element which is the target of the reference. * * @return the target element, or null if it was not possible to resolve the reference to a valid target. */ @Nullable @Override public PsiElement resolve() { ResolveResult[] resolveResults = multiResolve(false); return resolveResults.length == 1 ? resolveResults[0].getElement() : null; } }
@NotNull @Override protected ResolveResult[] innerResolve(boolean caseSensitive, @NotNull PsiFile containingFile) { String referenceText = getText(); Set<ResolveResult> result = ContainerUtil.newLinkedHashSet(); Set<ResolveResult> innerResult = ContainerUtil.newLinkedHashSet(); for (PsiFileSystemItem context : getContexts()) { innerResolveInContext(referenceText, context, innerResult, caseSensitive); for (ResolveResult resolveResult : innerResult) { PsiElement element = resolveResult.getElement(); if (element instanceof PsiDirectory) { if (isLast()) { return new ResolveResult[] { resolveResult }; } result.add(resolveResult); } } innerResult.clear(); } return result.isEmpty() ? ResolveResult.EMPTY_ARRAY : result.toArray(new ResolveResult[result.size()]); }
innerResolveInContext(referenceText, context, innerResult, caseSensitive); for (ResolveResult resolveResult : innerResult) { PsiElement element = resolveResult.getElement(); if (element instanceof PsiDirectory) { if (isLast()) {
@Override public PsiElement bindToElement(@NotNull PsiElement element, boolean absolute) throws IncorrectOperationException { if (!absolute) { FileReference firstReference = ArrayUtil.getFirstElement(getFileReferenceSet().getAllReferences()); if (firstReference != null) { Collection<PsiFileSystemItem> contexts = getFileReferenceSet().getDefaultContexts(); for (ResolveResult resolveResult : firstReference.multiResolve(false)) { PsiElement resolveResultElement = resolveResult.getElement(); if (resolveResultElement instanceof PsiFileSystemItem) { PsiFileSystemItem parentDirectory = ((PsiFileSystemItem)resolveResultElement).getParent(); if (parentDirectory != null && contexts.contains(parentDirectory)) { return getElement(); } } } } } return super.bindToElement(element, absolute); }
@Override public String fun(ResolveResult resolveResult) { PsiElement resolveResultElement = resolveResult.getElement(); assertNotNull(resolveResultElement); assertInstanceOf(resolveResultElement, PsiFileSystemItem.class); PsiFileSystemItem fileSystemItem = (PsiFileSystemItem) resolveResultElement; return VfsUtilCore.getRelativePath(fileSystemItem.getVirtualFile(), rootFile, '/'); } });
public void testReference() { myFixture.configureByFiles("reference.ex", "suffix.ex", "nested.ex"); PsiElement alias = myFixture .getFile() .findElementAt(myFixture.getCaretOffset()) .getParent() .getPrevSibling(); assertInstanceOf(alias, QualifiedAlias.class); PsiPolyVariantReference polyVariantReference = (PsiPolyVariantReference) alias.getReference(); assertNotNull(polyVariantReference); ResolveResult[] resolveResults = polyVariantReference.multiResolve(false); assertEquals(2, resolveResults.length); // alias assertEquals("alias Prefix.Suffix", resolveResults[0].getElement().getParent().getParent().getText()); // defmodule assertEquals("defmodule Prefix.Suffix.Nested do\nend", resolveResults[1].getElement().getText()); }
public void testReference() { myFixture.configureByFiles("reference.ex", "suffix.ex"); PsiElement alias = myFixture .getFile() .findElementAt(myFixture.getCaretOffset()) .getParent() .getPrevSibling() .getFirstChild(); assertInstanceOf(alias, ElixirAlias.class); PsiPolyVariantReference polyVariantReference = (PsiPolyVariantReference) alias.getReference(); assertNotNull(polyVariantReference); ResolveResult[] resolveResults = polyVariantReference.multiResolve(false); assertEquals(resolveResults.length, 2); // alias assertEquals("alias Prefix.Suffix", resolveResults[0].getElement().getParent().getParent().getText()); // defmodule assertEquals("defmodule Prefix.Suffix do\nend", resolveResults[1].getElement().getText()); }
public void testReference() { myFixture.configureByFiles("reference.ex", "suffix1.ex"); PsiElement alias = myFixture .getFile() .findElementAt(myFixture.getCaretOffset()) .getParent() .getPrevSibling() .getFirstChild(); assertInstanceOf(alias, ElixirAlias.class); PsiPolyVariantReference polyVariantReference = (PsiPolyVariantReference) alias.getReference(); assertNotNull(polyVariantReference); ResolveResult[] resolveResults = polyVariantReference.multiResolve(false); assertEquals(3, resolveResults.length); // alias .., as: assertEquals( "alias Prefix.Suffix1, as: As", resolveResults[0].getElement().getParent().getParent().getParent().getParent().getParent().getText() ); // alias .. assertEquals( "alias Prefix.Suffix1, as: As", resolveResults[1].getElement().getParent().getParent().getText() ); // defmodule .. assertEquals("defmodule Prefix.Suffix1 do\nend", resolveResults[2].getElement().getText()); }
public void testReference() { myFixture.configureByFiles("reference.ex", "suffix.ex", "nested.ex"); PsiElement alias = myFixture .getFile() .findElementAt(myFixture.getCaretOffset()) .getParent() .getPrevSibling(); assertInstanceOf(alias, QualifiedAlias.class); PsiPolyVariantReference polyVariantReference = (PsiPolyVariantReference) alias.getReference(); assertNotNull(polyVariantReference); ResolveResult[] resolveResults = polyVariantReference.multiResolve(false); assertEquals(2, resolveResults.length); // alias assertEquals( "alias Prefix.Suffix, as: As", resolveResults[0].getElement().getParent().getParent().getParent().getParent().getParent().getText() ); // defmodule assertEquals("defmodule Prefix.Suffix.Nested do\nend", resolveResults[1].getElement().getText()); }
public void testReference() { myFixture.configureByFiles("reference.ex", "multiple_alias_aye.ex", "multiple_alias_bee.ex", "nested.ex"); PsiElement alias = myFixture .getFile() .findElementAt(myFixture.getCaretOffset()) .getParent() .getPrevSibling(); assertInstanceOf(alias, QualifiedAlias.class); PsiPolyVariantReference polyVariantReference = (PsiPolyVariantReference) alias.getReference(); assertNotNull(polyVariantReference); ResolveResult[] resolveResults = polyVariantReference.multiResolve(false); assertEquals(2, resolveResults.length); // alias assertEquals( "alias Prefix.{MultipleAliasAye, MultipleAliasBee}", resolveResults[0].getElement().getParent().getParent().getParent().getParent().getParent().getText() ); // defmodule assertEquals("defmodule Prefix.MultipleAliasAye.Nested do\nend", resolveResults[1].getElement().getText()); }
public void testReference() { myFixture.configureByFiles("reference.ex", "multiple_alias_aye.ex", "multiple_alias_bee.ex"); PsiElement alias = myFixture .getFile() .findElementAt(myFixture.getCaretOffset()) .getParent() .getPrevSibling() .getFirstChild(); assertInstanceOf(alias, ElixirAlias.class); PsiPolyVariantReference polyVariantReference = (PsiPolyVariantReference) alias.getReference(); assertNotNull(polyVariantReference); ResolveResult[] resolveResults = polyVariantReference.multiResolve(false); assertEquals(2, resolveResults.length); // alias assertEquals( "alias Prefix.{MultipleAliasAye, MultipleAliasBee}", resolveResults[0].getElement().getParent().getParent().getParent().getParent().getParent().getText() ); // defmodule assertEquals("defmodule Prefix.MultipleAliasAye do\nend", resolveResults[1].getElement().getText()); }
/** * Single resolve doesnt work if we have non unique class names in project context, * so try a multiResolve */ @NotNull public static Method[] getMultiResolvedMethod(@NotNull PsiReference psiReference) { // class be unique in normal case, so try this first PsiElement resolvedReference = psiReference.resolve(); if (resolvedReference instanceof Method) { return new Method[] { (Method) resolvedReference }; } // try multiResolve if class exists twice in project if(psiReference instanceof PsiPolyVariantReference) { Collection<Method> methods = new HashSet<>(); for(ResolveResult resolveResult : ((PsiPolyVariantReference) psiReference).multiResolve(false)) { PsiElement element = resolveResult.getElement(); if(element instanceof Method) { methods.add((Method) element); } } if(methods.size() > 0) { return methods.toArray(new Method[methods.size()]); } } return new Method[0]; }
/** * Resolves MethodReference and compare containing class against implementations instances */ public static boolean isMethodReferenceInstanceOf(@NotNull MethodReference methodReference, @NotNull String expectedClassName) { for (ResolveResult resolveResult : methodReference.multiResolve(false)) { PsiElement resolve = resolveResult.getElement(); if(!(resolve instanceof Method)) { continue; } PhpClass containingClass = ((Method) resolve).getContainingClass(); if(containingClass == null) { continue; } if(!PhpElementsUtil.isInstanceOf(containingClass, expectedClassName)) { continue; } return true; } return false; }
PsiElement firstResolved = firstResolveResult.getElement(); PsiElement secondResolved = secondResolveResult.getElement();
private void assertReferences(@NotNull ElementPattern<?> pattern, PsiElement psiElement) { for (PsiReference reference : psiElement.getReferences()) { // single resolve; should also match first multi by design PsiElement element = reference.resolve(); if (pattern.accepts(element)) { return; } // multiResolve support if(reference instanceof PsiPolyVariantReference) { for (ResolveResult resolveResult : ((PsiPolyVariantReference) reference).multiResolve(true)) { if (pattern.accepts(resolveResult.getElement())) { return; } } } } fail(String.format("Fail that '%s' match given pattern", psiElement.toString())); }
@NotNull public static PsiElement[] mapElements(@NotNull ResolveResult[] candidates) { PsiElement[] result = new PsiElement[candidates.length]; for (int i = 0; i < candidates.length; i++) { result[i] = candidates[i].getElement(); } return result; }
@Nullable @Override public PsiElement resolve() { final ResolveResult[] resolveResults = multiResolve(false); if (resolveResults.length == 0) { return null; } return resolveResults[0].getElement(); }