in src/org/intellij/grammar/generator/RuleGraphHelper.java [734:778]
private static void findTheBestReplacement(Map<BnfRule, BnfRule> rulesAndAlts,
List<Map.Entry<BnfRule, Collection<BnfRule>>> supers) {
BitSet bits = new BitSet(rulesAndAlts.size());
int minI = -1, minC = -1, minS = -1;
for (int len = Math.min(16, supers.size()), i = (1 << len) - 1; i > 0; i --) {
if (minC != -1 && Integer.bitCount(i) > minC) continue;
int curC = 0, curS = 0;
bits.set(0, rulesAndAlts.size(), true);
for (int j = 0, bit = 1; j < len; j ++, bit <<= 1) {
if ((i & bit) == 0) continue;
Collection<BnfRule> vals = supers.get(j).getValue();
curC += 1;
curS += vals.size();
if (bits.isEmpty()) continue;
int k = 0;
for (Map.Entry<BnfRule, BnfRule> e : rulesAndAlts.entrySet()) {
if (bits.get(k)) {
if (vals.contains(e.getKey()) || vals.contains(e.getValue())) {
bits.set(k, false);
}
}
k ++;
}
if (!bits.isEmpty()) {
curC += bits.cardinality();
curS += bits.cardinality();
}
}
if (minC == -1 || minC > curC || minC == curC && minS > curS) {
minC = curC;
minS = curS;
minI = i;
}
}
for (Map.Entry<BnfRule, BnfRule> e : rulesAndAlts.entrySet()) {
for (int len = supers.size(), j = 0, bit = 1; j < len; j++, bit <<= 1) {
if ((minI & bit) == 0) continue;
Collection<BnfRule> vals = supers.get(j).getValue();
if (vals.contains(e.getKey()) || vals.contains(e.getValue())) {
e.setValue(supers.get(j).getKey());
}
}
}
}