package org.elixir_lang.beam.decompiler;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;
import java.util.Set;
public class InfixOperator extends MacroNameArity {
/*
* CONSTANTS
*/
private static final Set<String> INFIX_OPERATOR_SET;
public static final MacroNameArity INSTANCE = new InfixOperator();
static {
INFIX_OPERATOR_SET = new THashSet<String>();
INFIX_OPERATOR_SET.add("!=");
INFIX_OPERATOR_SET.add("!==");
INFIX_OPERATOR_SET.add("");
INFIX_OPERATOR_SET.add("&&");
INFIX_OPERATOR_SET.add("&&&");
INFIX_OPERATOR_SET.add("*");
INFIX_OPERATOR_SET.add("+");
INFIX_OPERATOR_SET.add("++");
INFIX_OPERATOR_SET.add("-");
INFIX_OPERATOR_SET.add("--");
INFIX_OPERATOR_SET.add("--");
INFIX_OPERATOR_SET.add("->");
INFIX_OPERATOR_SET.add("..");
INFIX_OPERATOR_SET.add("/");
INFIX_OPERATOR_SET.add("::");
INFIX_OPERATOR_SET.add("<");
INFIX_OPERATOR_SET.add("<-");
INFIX_OPERATOR_SET.add("<<<");
INFIX_OPERATOR_SET.add("<<~");
INFIX_OPERATOR_SET.add("<=");
INFIX_OPERATOR_SET.add("<>");
INFIX_OPERATOR_SET.add("<|>");
INFIX_OPERATOR_SET.add("<~");
INFIX_OPERATOR_SET.add("<~>");
INFIX_OPERATOR_SET.add("=");
INFIX_OPERATOR_SET.add("==");
INFIX_OPERATOR_SET.add("===");
INFIX_OPERATOR_SET.add("=>");
INFIX_OPERATOR_SET.add("=~");
INFIX_OPERATOR_SET.add(">");
INFIX_OPERATOR_SET.add(">=");
INFIX_OPERATOR_SET.add(">>>");
INFIX_OPERATOR_SET.add("\\\\");
INFIX_OPERATOR_SET.add("^");
INFIX_OPERATOR_SET.add("^^^");
INFIX_OPERATOR_SET.add("and");
INFIX_OPERATOR_SET.add("in");
INFIX_OPERATOR_SET.add("or");
INFIX_OPERATOR_SET.add("|>");
INFIX_OPERATOR_SET.add("||");
INFIX_OPERATOR_SET.add("|||");
INFIX_OPERATOR_SET.add("~=");
INFIX_OPERATOR_SET.add("~>");
INFIX_OPERATOR_SET.add("~>>");
}
/*
* Static Methods
*/
/**
* @param name {@link org.elixir_lang.beam.MacroNameArity#name}
*/
private static boolean isInfixOperator(@NotNull String name) {
return INFIX_OPERATOR_SET.contains(name);
}
/*
* Instance Methods
*/
/**
* Whether the decompiler accepts the {@code macroNameArity}
*
* @return {@code true} if {@link #append(StringBuilder, org.elixir_lang.beam.MacroNameArity)} should be called with
* {@code macroNameArity}.
*/
@Override
public boolean accept(@NotNull org.elixir_lang.beam.MacroNameArity macroNameArity) {
Integer arity = macroNameArity.arity;
return arity != null && arity == 2 && isInfixOperator(macroNameArity.name);
}
/**
* Append the decompiled source for {@code macroNameArity} to {@code decompiled}.
*
* @param decompiled the decompiled source so far
*/
@Override
public void append(@NotNull StringBuilder decompiled, @NotNull org.elixir_lang.beam.MacroNameArity macroNameArity) {
decompiled
.append(" ")
.append(macroNameArity.macro)
.append(" left ")
.append(macroNameArity.name)
.append(" right");
appendBody(decompiled);
}
}