private Map joinMaps()

in antlr-based-bootstrap/peg/GraphHelper.java [157:201]


    private Map<Tree, Cardinality> joinMaps(int type, List<Map<Tree, Cardinality>> list) {
        if (list.isEmpty()) return Collections.emptyMap();
        if (type == OPT || type == ONEMORE || type == ZEROMORE) {
            HashMap<Tree, Cardinality> map = new HashMap<Tree, Cardinality>();
            assert list.size() == 1;
            Map<Tree, Cardinality> m = list.get(0);
            for (Tree t : m.keySet()) {
                map.put(t, fromNodeType(type).and(m.get(t)));
            }
            return map;
        }
        else if (type == SEQ) {
            if (list.size() == 1) return list.get(0);
            HashMap<Tree, Cardinality> map = new HashMap<Tree, Cardinality>();
            for (Map<Tree, Cardinality> m : list) {
                for (Tree t : m.keySet()) {
                    map.put(t, m.get(t).or(map.get(t)));
                }
            }
            return map;
        }
        else if (type == CHOICE) {
            HashMap<Tree, Cardinality> map = new HashMap<Tree, Cardinality>();
            Map<Tree, Cardinality> m0 = list.get(0);
            map.putAll(m0);
            for (Map<Tree, Cardinality> m : list) {
                map.keySet().retainAll(m.keySet());
            }
            for (Tree t : map.keySet()) {
                map.put(t, REQUIRED.and(m0.get(t)));
                for (Map<Tree, Cardinality> m : list) {
                    if (m == list.get(0)) continue;
                    map.put(t, map.get(t).and(m.get(t)));
                }
            }
            for (Map<Tree, Cardinality> m : list) {
                for (Tree t : m.keySet()) {
                    if (map.containsKey(t)) continue;
                    map.put(t, OPTIONAL.and(m.get(t)));
                }
            }
            return map;
        }
        else throw new AssertionError(GrammarParser.tokenNames[type]);
    }