public static boolean processChildrenFromTop(@NotNull PsiElement element, @NotNull PsiScopeProcessor processor, @NotNull ResolveState substitutor, @Nullable PsiElement lastParent, @NotNull PsiElement place) { PsiElement run = element.getFirstChild(); while (run != null) { if (run instanceof GoCompositeElement) { if (run.isEquivalentTo(lastParent)) return true; if (!run.processDeclarations(processor, substitutor, null, place)) return false; } run = run.getNextSibling(); } return true; } }
return new LineMarkerInfo<>(element.getFirstChild(), element.getTextRange(), PlatformIcons.FOLDER_ICON, Pass.UPDATE_ALL, null, null, GutterIconRenderer.Alignment.CENTER);
/** * getChildren eg on YamlArray is empty, provide workaround */ static public PsiElement[] getChildrenFix(PsiElement psiElement) { List<PsiElement> psiElements = new ArrayList<>(); PsiElement startElement = psiElement.getFirstChild(); if(startElement == null) { return psiElements.toArray(new PsiElement[psiElements.size()]); } psiElements.add(startElement); for (PsiElement child = psiElement.getFirstChild().getNextSibling(); child != null; child = child.getNextSibling()) { psiElements.add(child); } return psiElements.toArray(new PsiElement[psiElements.size()]); }
@NotNull public static <T extends PsiElement> Collection<T> getChildrenOfTypeAsList(@Nullable PsiElement element, ElementPattern<T> pattern) { Collection<T> collection = new ArrayList<>(); if (element == null) { return collection; } for (PsiElement child = element.getFirstChild(); child != null; child = child.getNextSibling()) { if (pattern.accepts(child)) { //noinspection unchecked collection.add((T)child); } } return collection; }
@Nullable public static <T extends PsiElement> T getChildrenOfType(@Nullable PsiElement element, ElementPattern<T> pattern) { if (element == null) return null; for (PsiElement child = element.getFirstChild(); child != null; child = child.getNextSibling()) { if (pattern.accepts(child)) { //noinspection unchecked return (T)child; } } return null; }
public void testAmbiguousBackReference() { myFixture.configureByFiles("ambiguous_back.ex"); PsiElement ambiguous = myFixture .getFile() .findElementAt(myFixture.getCaretOffset()) .getPrevSibling(); assertInstanceOf(ambiguous.getFirstChild(), ElixirIdentifier.class); PsiReference reference = ambiguous.getReference(); assertNotNull("`referenced` has no reference", reference); PsiElement resolved = reference.resolve(); assertNotNull("`referenced` not resolved", resolved); assertEquals( "ambiguous reference does not resolve to previous function declaration", "def referenced do\n\n end", resolved.getText() ); }
public void testAmbiguousForwardReference() { myFixture.configureByFiles("ambiguous_forward.ex"); PsiElement ambiguous = myFixture .getFile() .findElementAt(myFixture.getCaretOffset()) .getPrevSibling(); assertInstanceOf(ambiguous.getFirstChild(), ElixirIdentifier.class); PsiReference reference = ambiguous.getReference(); assertNotNull("`referenced` has no reference", reference); PsiElement resolved = reference.resolve(); assertNotNull("`referenced` not resolved", resolved); assertEquals( "ambiguous reference does not resolve to forward function declaration", "def referenced do\n\n end", resolved.getText() ); }
public void testAmbiguousRecursiveReference() { myFixture.configureByFiles("ambiguous_recursive.ex"); PsiElement ambiguous = myFixture .getFile() .findElementAt(myFixture.getCaretOffset()) .getPrevSibling(); assertInstanceOf(ambiguous.getFirstChild(), ElixirIdentifier.class); PsiReference reference = ambiguous.getReference(); assertNotNull("`referenced` has no reference", reference); PsiElement resolved = reference.resolve(); assertNotNull("`referenced` not resolved", resolved); assertEquals( "ambiguous reference does not resolve to recursive function declaration", "def referenced do\n referenced\n\n a = 1\n end", resolved.getText() ); }
/** * Get array string values mapped with their PsiElements * * ["value", "value2"] */ @NotNull static public Map<String, PsiElement> getArrayValuesAsMap(@NotNull ArrayCreationExpression arrayCreationExpression) { Collection<PsiElement> arrayValues = PhpPsiUtil.getChildren(arrayCreationExpression, psiElement -> psiElement.getNode().getElementType() == PhpElementTypes.ARRAY_VALUE ); Map<String, PsiElement> keys = new HashMap<>(); for (PsiElement child : arrayValues) { String stringValue = PhpElementsUtil.getStringValue(child.getFirstChild()); if(stringValue != null && StringUtils.isNotBlank(stringValue)) { keys.put(stringValue, child); } } return keys; }
public void testParenthesesSingleCorrectArityReference() { myFixture.configureByFiles("parentheses_single_correct_arity.ex"); PsiElement parenthesesCall = myFixture .getFile() .findElementAt(myFixture.getCaretOffset()) .getParent() .getParent() .getParent(); assertInstanceOf(parenthesesCall.getFirstChild(), ElixirIdentifier.class); PsiReference reference = parenthesesCall.getReference(); assertNotNull("`referenced` has no reference", reference); PsiElement resolved = reference.resolve(); assertNotNull("`referenced` not resolved", resolved); assertEquals( "parentheses 1-arity reference does not resolve to single 1-arity function declaration", "def referenced(_) do\n end", resolved.getText() ); }
public void testParenthesesRecursiveReference() { myFixture.configureByFiles("parentheses_recursive.ex"); PsiElement parenthesesCall = myFixture .getFile() .findElementAt(myFixture.getCaretOffset()) .getParent() .getParent() .getParent(); assertInstanceOf(parenthesesCall.getFirstChild(), ElixirIdentifier.class); PsiReference reference = parenthesesCall.getReference(); assertNotNull("`referenced` has no reference", reference); PsiElement resolved = reference.resolve(); assertNotNull("`referenced` not resolved", resolved); assertEquals( "ambiguous reference does not resolve to recursive function declaration", "def referenced do\n referenced()\n\n a = 1\n end", resolved.getText() ); }
public void testFunctionNameMultipleSameArity() { myFixture.configureByFiles("function_name_multiple_same_arity.ex"); PsiElement parenthesesCall = myFixture .getFile() .findElementAt(myFixture.getCaretOffset()) .getParent() .getParent() .getParent(); assertInstanceOf(parenthesesCall.getFirstChild(), ElixirIdentifier.class); PsiReference reference = parenthesesCall.getReference(); assertNotNull("`referenced` has no reference", reference); assertInstanceOf(reference, PsiPolyVariantReference.class); PsiPolyVariantReference polyVariantReference = (PsiPolyVariantReference) reference; ResolveResult[] resolveResults = polyVariantReference.multiResolve(false); assertNotEquals("Resolved to both clauses instead of selected clause", 2, resolveResults.length); assertEquals("Resolves to self", 1, resolveResults.length); PsiElement resolved = reference.resolve(); assertNotNull("Reference not resolved", resolved); assertEquals("def referenced(true) do\n end", resolved.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()); }
@NotNull private Collection<PsiElement> getParentGoto(@NotNull PsiElement psiElement) { // find printblock PsiElement printBlock = psiElement.getParent(); if(printBlock == null || !PlatformPatterns.psiElement(TwigElementTypes.PRINT_BLOCK).accepts(printBlock)) { return Collections.emptyList(); } // printblock need to be child block statement PsiElement blockStatement = printBlock.getParent(); if(blockStatement == null || !PlatformPatterns.psiElement(TwigElementTypes.BLOCK_STATEMENT).accepts(blockStatement)) { return Collections.emptyList(); } // BlockTag is first child of block statement PsiElement blockTag = blockStatement.getFirstChild(); if(!(blockTag instanceof TwigBlockTag)) { return Collections.emptyList(); } String blockName = ((TwigBlockTag) blockTag).getName(); if(blockName == null) { return Collections.emptyList(); } return TwigBlockUtil.getBlockOverwriteTargets(psiElement.getContainingFile(), blockName, false); }
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()); }
PsiElement marcoTag = psiElement.getFirstChild(); if(marcoTag == null) { return;
/** * Find block scope "embed" with self search or file context with foreign extends search * * {% embed "template.twig" %}{% block <caret> %} * {% block <caret> %} */ @NotNull public static Pair<Collection<PsiFile>, Boolean> findScopedFile(@NotNull PsiElement psiElement) { // {% embed "template.twig" %}{% block <caret> %} PsiElement firstParent = getTransDefaultDomainScope(psiElement); // {% embed "template.twig" %} if(firstParent != null && firstParent.getNode().getElementType() == TwigElementTypes.EMBED_STATEMENT) { PsiElement embedTag = firstParent.getFirstChild(); if(embedTag != null) { String templateName = getTemplateNameForEmbedTag(embedTag); if(templateName != null) { return Pair.create(getTemplatePsiElements(psiElement.getProject(), templateName), true); } } return Pair.create(Collections.emptyList(), true); } return Pair.create(Collections.singletonList(psiElement.getContainingFile()), false); }
private void collect(TwigFile twigFile) { for(PsiElement psiElement: twigFile.getChildren()) { if(psiElement instanceof TwigExtendsTag) { for (String s : getTwigExtendsTagTemplates((TwigExtendsTag) psiElement)) { containerElement.addExtend(s); } } else if(psiElement.getNode().getElementType() == TwigElementTypes.BLOCK_STATEMENT) { PsiElement blockTag = psiElement.getFirstChild(); if(blockTag instanceof TwigBlockTag) { String name = ((TwigBlockTag) blockTag).getName(); if(StringUtils.isNotBlank(name)) { containerElement.addBlock(name); } } } } }
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()); }
.getParent(); assertInstanceOf(parenthesesCall.getFirstChild(), ElixirIdentifier.class);