package org.elixir_lang.reference.module; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiNamedElement; import org.elixir_lang.psi.*; import org.elixir_lang.psi.call.Call; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import static org.elixir_lang.psi.call.name.Function.ALIAS; import static org.elixir_lang.psi.call.name.Module.KERNEL; import static org.elixir_lang.psi.impl.ElixirPsiImplUtil.finalArguments; import static org.elixir_lang.psi.impl.ElixirPsiImplUtil.hasKeywordKey; public class UnaliasedName { /* * Public Static Methods */ @Nullable public static String unaliasedName(@NotNull PsiNamedElement namedElement) { String unaliasedName; if (namedElement instanceof QualifiableAlias) { unaliasedName = unaliasedName((QualifiableAlias) namedElement); } else { unaliasedName = namedElement.getName(); } return unaliasedName; } /* * Private Static Methods */ @Nullable private static String down(@NotNull PsiElement element) { String unaliasedName = null; if (element instanceof QualifiableAlias) { PsiNamedElement namedElement = (PsiNamedElement) element; unaliasedName = namedElement.getName(); } return unaliasedName; } @Nullable private static String unaliasedName(@NotNull QualifiableAlias qualifiableAlias) { return up(qualifiableAlias.getParent(), qualifiableAlias); } @Nullable private static String up(@NotNull Call call, @NotNull QualifiableAlias entrance) { String unaliasedName = null; if (call.isCalling(KERNEL, ALIAS)) { PsiElement[] finalArguments = finalArguments(call); if (finalArguments != null && finalArguments.length > 0) { PsiElement firstArgument = finalArguments[0]; unaliasedName = down(firstArgument); } } return unaliasedName; } @Nullable private static String up(@Nullable PsiElement element, @NotNull QualifiableAlias entrance) { String unaliasedName = null; if (element instanceof Call) { unaliasedName = up((Call) element, entrance); } else if (element instanceof ElixirAccessExpression || element instanceof QuotableArguments || element instanceof QuotableKeywordList) { unaliasedName = up(element.getParent(), entrance); } else if (element instanceof ElixirMultipleAliases) { unaliasedName = ResolvableName.resolvableName(entrance); } else if (element instanceof QuotableKeywordPair) { unaliasedName = up((QuotableKeywordPair) element, entrance); } return unaliasedName; } @Nullable private static String up(@NotNull QuotableKeywordPair element, @NotNull QualifiableAlias entrance) { String unaliasedName = null; if (hasKeywordKey(element, "as")) { unaliasedName = up(element.getParent(), entrance); } return unaliasedName; } }