@Override public PsiElement resolve() { ErlangVarProcessor processor = new ErlangVarProcessor(myElement.getText(), myElement); ErlangListComprehension lc = PsiTreeUtil.getParentOfType(myElement, ErlangListComprehension.class); ErlangCompositeElement place = lc != null ? lc.getLcExprs() : myElement; ResolveUtil.treeWalkUp(place, processor); ErlangQVar result = processor.getResult(); if (result != null) return result; ErlangModule module = getModule(myElement.getContainingFile()); if (module == null) return null; module.processDeclarations(processor, ResolveState.initial(), module, module); return processor.getResult(); }
@NotNull @Override public Object[] getVariants() { if (PsiTreeUtil.getParentOfType(myElement, ErlangArgumentDefinition.class) != null) return new Object[] {}; final List<LookupElement> result = new ArrayList<LookupElement>(); if (!(myElement.getParent() instanceof ErlangRecordExpression)) { final ErlangFunctionClause clause = PsiTreeUtil.getParentOfType(myElement, ErlangFunctionClause.class); BaseScopeProcessor processor = new BaseScopeProcessor() { @Override public boolean execute(@NotNull PsiElement psiElement, ResolveState resolveState) { if (!psiElement.equals(myElement) && psiElement instanceof ErlangQVar && !psiElement.getText().equals("_") && !inColonQualified(myElement)) { if (PsiTreeUtil.isAncestor(clause, psiElement, false) && (inDefinition(psiElement) || isLeftPartOfAssignment(psiElement))) { result.add( LookupElementBuilder.create((PsiNamedElement) psiElement) .setIcon(ErlangIcons.VARIABLE)); } } return true; } }; ResolveUtil.treeWalkUp(myElement, processor); result.addAll( ErlangPsiImplUtil.getFunctionLookupElements( myElement.getContainingFile(), false, PsiTreeUtil.getParentOfType(myElement, ErlangColonQualifiedExpression.class))); } return ArrayUtil.toObjectArray(result); }