package org.elixir_lang.lexer.group;
import com.intellij.psi.tree.IElementType;
import org.elixir_lang.psi.ElixirTypes;
import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
import java.util.Map;
/**
* Created by luke.imhoff on 8/21/14.
*/
public class Quote extends Base {
private static Map<String, Quote> quoteByPromoter = new HashMap<String, Quote>();
private static Map<String, Quote> quoteByTerminator = new HashMap<String, Quote>();
public static final String charListPromoter = "'";
public static final String charListHeredocPromoter = "'''";
public static final String stringPromoter = "\"";
public static final String stringHeredocPromoter = "\"\"\"";
public static final String charListTerminator = "'";
public static final String charListHeredocTerminator = "'''";
public static final String stringTerminator = "\"";
public static final String stringHeredocTerminator = "\"\"\"";
public static final Quote charList = new Quote(
ElixirTypes.CHAR_LIST_PROMOTER,
ElixirTypes.CHAR_LIST_HEREDOC_PROMOTER,
ElixirTypes.CHAR_LIST_FRAGMENT,
ElixirTypes.CHAR_LIST_TERMINATOR,
ElixirTypes.CHAR_LIST_HEREDOC_TERMINATOR
);
public static final Quote string = new Quote(
ElixirTypes.STRING_PROMOTER,
ElixirTypes.STRING_HEREDOC_PROMOTER,
ElixirTypes.STRING_FRAGMENT,
ElixirTypes.STRING_TERMINATOR,
ElixirTypes.STRING_HEREDOC_TERMINATOR
);
static {
quoteByPromoter.put(charListPromoter, charList);
quoteByPromoter.put(charListHeredocPromoter, charList);
quoteByPromoter.put(stringPromoter, string);
quoteByPromoter.put(stringHeredocPromoter, string);
quoteByTerminator.put(charListTerminator, charList);
quoteByTerminator.put(charListHeredocTerminator, charList);
quoteByTerminator.put(stringTerminator, string);
quoteByTerminator.put(stringHeredocTerminator, string);
}
@NotNull
public static Quote fetch(String promoter) {
Quote quote = quoteByPromoter.get(promoter);
if (quote == null) {
throw new IllegalArgumentException("No Quote promoted by " + promoter);
}
return quote;
}
public Quote(IElementType promoterType, IElementType heredocPromoterType, IElementType fragmentType, IElementType terminatorType, IElementType heredocTerminatorType) {
super(promoterType, heredocPromoterType, fragmentType, terminatorType, heredocTerminatorType);
}
}