From adf80e166a5786ea53c190070d0fa9a5f2ae8c5b Mon Sep 17 00:00:00 2001 From: Sam Harwell Date: Tue, 5 Feb 2013 13:11:49 -0600 Subject: [PATCH] Fix IntervalSet.add when multiple merges are required --- .../org/antlr/v4/runtime/misc/IntervalSet.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/runtime/Java/src/org/antlr/v4/runtime/misc/IntervalSet.java b/runtime/Java/src/org/antlr/v4/runtime/misc/IntervalSet.java index 888512146..58a2144b0 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/misc/IntervalSet.java +++ b/runtime/Java/src/org/antlr/v4/runtime/misc/IntervalSet.java @@ -141,14 +141,17 @@ public class IntervalSet implements IntSet { iter.set(bigger); // make sure we didn't just create an interval that // should be merged with next interval in list - if ( iter.hasNext() ) { + while ( iter.hasNext() ) { Interval next = iter.next(); - if ( bigger.adjacent(next)||!bigger.disjoint(next) ) { - // if we bump up against or overlap next, merge - iter.remove(); // remove this one - iter.previous(); // move backwards to what we just set - iter.set(bigger.union(next)); // set to 3 merged ones + if ( !bigger.adjacent(next) && bigger.disjoint(next) ) { + break; } + + // if we bump up against or overlap next, merge + iter.remove(); // remove this one + iter.previous(); // move backwards to what we just set + iter.set(bigger.union(next)); // set to 3 merged ones + iter.next(); // first call to next after previous duplicates the result } return; }