ScannerFactory.java

package org.sterling.source.scanner;

import static java.util.Collections.unmodifiableMap;
import static org.sterling.source.syntax.NodeKind.*;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.sterling.source.syntax.NodeKind;

public class ScannerFactory {

    public Scanner getScanner(InputReader inputReader) {
        return new DelegatingScanner(inputReader, Holder.delegates);
    }

    private static final class Holder {

        private static final Map<NodeKind, ScannerDelegate> delegates;

        static {
            ScannerDelegateFactory factory = new ScannerDelegateFactory();
            Map<NodeKind, ScannerDelegate> map = new HashMap<>();
            map.put(IDENTIFIER, factory.getIdentifierScanner());
            map.put(INTEGER, factory.getIntegerScanner());
            map.put(DOUBLE, factory.getDoubleScanner());
            map.put(ADD, factory.getAddScanner());
            map.put(SUBTRACT, factory.getSubtractScanner());
            map.put(MULTIPLY, factory.getMultiplyScanner());
            map.put(DIVIDE, factory.getDivideScanner());
            map.put(MODULO, factory.getModuloScanner());
            map.put(POSITIVE, factory.getPositiveScanner());
            map.put(NEGATIVE, factory.getNegativeScanner());
            map.put(SHIFT_LEFT, factory.getShiftLeftScanner());
            map.put(SHIFT_RIGHT, factory.getShiftRightScanner());
            map.put(SIGNED_SHIFT_RIGHT, factory.getSignedShiftRightScanner());
            map.put(ACCESSOR, factory.getAccessorScanner());
            map.put(COALESCE, factory.getCoalesceScanner());
            map.put(BITWISE_AND, factory.getBitwiseAndScanner());
            map.put(BITWISE_OR, factory.getBitwiseOrScanner());
            map.put(BITWISE_XOR, factory.getBitwiseXorScanner());
            map.put(LOGICAL_AND, factory.getLogicalAndScanner());
            map.put(LOGICAL_OR, factory.getLogicalOrScanner());
            map.put(LOGICAL_NOT, factory.getLogicalNotScanner());
            map.put(GREATER_THAN, factory.getGreaterThanScanner());
            map.put(LESS_THAN, factory.getLessThanScanner());
            map.put(GREATER_THAN_EQUALS, factory.getGreaterThanEqualsScanner());
            map.put(LESS_THAN_EQUALS, factory.getLessThanEqualsScanner());
            map.put(EQUALS, factory.getEqualsScanner());
            map.put(NOT_EQUALS, factory.getNotEqualsScanner());
            map.put(ASSIGN, factory.getAssignScanner());
            map.put(BITWISE_NOT, factory.getBitwiseNotScanner());
            map.put(GROUP_OPEN, factory.getGroupOpenScanner());
            map.put(GROUP_CLOSE, factory.getGroupCloseScanner());
            map.put(INDEXER_OPEN, factory.getIndexerOpenScanner());
            map.put(INDEXER_CLOSE, factory.getIndexerCloseScanner());
            map.put(TERNARY_TRUE, factory.getTernaryTrueScanner());
            map.put(TERNARY_FALSE, factory.getTernaryFalseScanner());
            map.put(BOOLEAN, factory.getBooleanScanner());
            map.put(STRING, factory.getStringScanner());
            map.put(NOTHING, factory.getNullScanner());
            map.put(CHARACTER, factory.getCharacterScanner());
            map.put(TERMINATOR, factory.getTerminatorScanner());
            map.put(BLOCK_OPEN, factory.getBlockOpenScanner());
            map.put(BLOCK_CLOSE, factory.getBlockCloseScanner());
            map.put(END_OF_INPUT, factory.getEndOfInputScanner());
            map.put(ARROW, factory.getArrowScanner());
            map.put(KEYWORD_OBJECT, factory.getKeywordObjectScanner());
            map.put(KEYWORD_POSITIVE, factory.getKeywordPositiveScanner());
            map.put(KEYWORD_NEGATIVE, factory.getKeywordNegativeScanner());
            map.put(INDEXER_OPERATOR, factory.getIndexerOperatorScanner());
            map.put(SEPARATOR, factory.getSeparatorScanner());
            map.put(KEYWORD_IF, factory.getKeywordIfScanner());
            map.put(APPLY, factory.getApplyScanner());
            map.put(KEYWORD_MODULE, factory.getKeywordModuleScanner());
            map.put(KEYWORD_IMPORT, factory.getKeywordImportScanner());
            map.put(WILDCARD, factory.getWildcardScanner());
            map.put(KEYWORD_FROM, factory.getKeywordFromScanner());
            map.put(KEYWORD_AS, factory.getKeywordAsScanner());
            map.put(KEYWORD_JAVA, factory.getKeywordJavaScanner());
            delegates = unmodifiableMap(new ConcurrentHashMap<>(map));
        }

        private Holder() {
            // intentionally empty
        }
    }
}