package org.elixir_lang.beam.decompiler;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;
import java.util.Set;
import static org.elixir_lang.beam.decompiler.Default.appendParameters;
public class SpecialForm extends MacroNameArity {
/*
* CONSTANTS
*/
private static final Set<String> SPECIAL_FORM_NAME_SET;
public static final MacroNameArity INSTANCE = new SpecialForm();
static {
SPECIAL_FORM_NAME_SET = new THashSet<String>();
SPECIAL_FORM_NAME_SET.add("%");
SPECIAL_FORM_NAME_SET.add("%{}");
SPECIAL_FORM_NAME_SET.add("&");
SPECIAL_FORM_NAME_SET.add(".");
SPECIAL_FORM_NAME_SET.add("<<>>");
SPECIAL_FORM_NAME_SET.add("fn");
SPECIAL_FORM_NAME_SET.add("unquote");
SPECIAL_FORM_NAME_SET.add("unquote_splicing");
SPECIAL_FORM_NAME_SET.add("{}");
}
/*
* Static Methods
*/
/**
* @param name {@link org.elixir_lang.beam.MacroNameArity#name}
*/
private static boolean isSpecialForm(@NotNull String name) {
return SPECIAL_FORM_NAME_SET.contains(name);
}
/*
* Instance Methods
*/
/**
* Wehther 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) {
return isSpecialForm(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(" unquote(:")
.append(macroNameArity.name)
.append(")");
appendParameters(decompiled, macroNameArity);
appendBody(decompiled);
}
}