@@ -63,6 +63,16 @@ public enum FillMode {
6363    FORCED 
6464  }
6565
66+   /** 
67+    * The maximum supported line width. 
68+    * 
69+    * <p>This can be used as a sentinel/threshold for {@code Doc}s that break unconditionally. 
70+    * 
71+    * <p>The value was selected to be obviously too large for any practical line, but small enough to 
72+    * prevent accidental overflow. 
73+    */ 
74+   public  static  final  int  MAX_LINE_WIDTH  = 1000 ;
75+ 
6676  /** State for writing. */ 
6777  public  static  final  class  State  {
6878    final  int  lastIndent ;
@@ -103,8 +113,7 @@ public String toString() {
103113  private  static  final  Range <Integer > EMPTY_RANGE  = Range .closedOpen (-1 , -1 );
104114  private  static  final  DiscreteDomain <Integer > INTEGERS  = DiscreteDomain .integers ();
105115
106-   // Memoized width; Float.POSITIVE_INFINITY if contains forced breaks. 
107-   private  final  Supplier <Float > width  = Suppliers .memoize (this ::computeWidth );
116+   private  final  Supplier <Integer > width  = Suppliers .memoize (this ::computeWidth );
108117
109118  // Memoized flat; not defined (and never computed) if contains forced breaks. 
110119  private  final  Supplier <String > flat  = Suppliers .memoize (this ::computeFlat );
@@ -113,16 +122,16 @@ public String toString() {
113122  private  final  Supplier <Range <Integer >> range  = Suppliers .memoize (this ::computeRange );
114123
115124  /** 
116-    * Return the width of a {@code Doc}, or {@code Float.POSITIVE_INFINITY} if it must be broken . 
125+    * Return the width of a {@code Doc}. 
117126   * 
118127   * @return the width 
119128   */ 
120-   final  float  getWidth () {
129+   final  int  getWidth () {
121130    return  width .get ();
122131  }
123132
124133  /** 
125-    * Return a {@code Doc}'s flat-string value; not defined (and never called) if the ( @code Doc} 
134+    * Return a {@code Doc}'s flat-string value; not defined (and never called) if the { @code Doc} 
126135   * contains forced breaks. 
127136   * 
128137   * @return the flat-string value 
@@ -143,9 +152,9 @@ final Range<Integer> range() {
143152  /** 
144153   * Compute the {@code Doc}'s width. 
145154   * 
146-    * @return the width, or {@code Float.POSITIVE_INFINITY} if it must be broken  
155+    * @return the width 
147156   */ 
148-   abstract  float  computeWidth ();
157+   abstract  int  computeWidth ();
149158
150159  /** 
151160   * Compute the {@code Doc}'s flat value. Not defined (and never called) if contains forced breaks. 
@@ -202,12 +211,8 @@ void add(Doc doc) {
202211    }
203212
204213    @ Override 
205-     float  computeWidth () {
206-       float  thisWidth  = 0.0F ;
207-       for  (Doc  doc  : docs ) {
208-         thisWidth  += doc .getWidth ();
209-       }
210-       return  thisWidth ;
214+     int  computeWidth () {
215+       return  getWidth (docs );
211216    }
212217
213218    @ Override 
@@ -246,10 +251,10 @@ Range<Integer> computeRange() {
246251
247252    @ Override 
248253    public  State  computeBreaks (CommentsHelper  commentsHelper , int  maxWidth , State  state ) {
249-       float  thisWidth  = getWidth ();
254+       int  thisWidth  = getWidth ();
250255      if  (state .column  + thisWidth  <= maxWidth ) {
251256        oneLine  = true ;
252-         return  state .withColumn (state .column  + ( int )  thisWidth );
257+         return  state .withColumn (state .column  + thisWidth );
253258      }
254259      State  broken  =
255260          computeBroken (
@@ -295,8 +300,8 @@ private static State computeBreakAndSplit(
295300        State  state ,
296301        Optional <Break > optBreakDoc ,
297302        List <Doc > split ) {
298-       float  breakWidth  = optBreakDoc .isPresent () ? optBreakDoc .get ().getWidth () : 0.0F  ;
299-       float  splitWidth  = getWidth (split );
303+       int  breakWidth  = optBreakDoc .isPresent () ? optBreakDoc .get ().getWidth () : 0 ;
304+       int  splitWidth  = getWidth (split );
300305      boolean  shouldBreak  =
301306          (optBreakDoc .isPresent () && optBreakDoc .get ().fillMode  == FillMode .UNIFIED )
302307              || state .mustBreak 
@@ -348,12 +353,16 @@ private void writeFilled(Output output) {
348353     * Get the width of a sequence of {@link Doc}s. 
349354     * 
350355     * @param docs the {@link Doc}s 
351-      * @return the width, or {@code Float.POSITIVE_INFINITY} if any {@link Doc} must be broken  
356+      * @return the width 
352357     */ 
353-     static  float  getWidth (List <Doc > docs ) {
354-       float  width  = 0.0F  ;
358+     static  int  getWidth (List <Doc > docs ) {
359+       int  width  = 0 ;
355360      for  (Doc  doc  : docs ) {
356361        width  += doc .getWidth ();
362+ 
363+         if  (width  >= MAX_LINE_WIDTH ) {
364+           return  MAX_LINE_WIDTH ; // Paranoid overflow protection 
365+         }
357366      }
358367      return  width ;
359368    }
@@ -455,7 +464,7 @@ public void add(DocBuilder builder) {
455464    }
456465
457466    @ Override 
458-     float  computeWidth () {
467+     int  computeWidth () {
459468      return  token .getTok ().length ();
460469    }
461470
@@ -512,8 +521,8 @@ public void add(DocBuilder builder) {
512521    }
513522
514523    @ Override 
515-     float  computeWidth () {
516-       return  1.0F  ;
524+     int  computeWidth () {
525+       return  1 ;
517526    }
518527
519528    @ Override 
@@ -615,8 +624,8 @@ public void add(DocBuilder builder) {
615624    }
616625
617626    @ Override 
618-     float  computeWidth () {
619-       return  isForced () ? Float . POSITIVE_INFINITY  : ( float )  flat .length ();
627+     int  computeWidth () {
628+       return  isForced () ? MAX_LINE_WIDTH  :  flat .length ();
620629    }
621630
622631    @ Override 
@@ -705,7 +714,7 @@ public void add(DocBuilder builder) {
705714    }
706715
707716    @ Override 
708-     float  computeWidth () {
717+     int  computeWidth () {
709718      int  idx  = Newlines .firstBreak (tok .getOriginalText ());
710719      // only count the first line of multi-line block comments 
711720      if  (tok .isComment ()) {
@@ -718,7 +727,7 @@ float computeWidth() {
718727          return  reformatParameterComment (tok ).map (String ::length ).orElse (tok .length ());
719728        }
720729      }
721-       return  idx  != -1  ? Float . POSITIVE_INFINITY  : ( float )  tok .length ();
730+       return  idx  != -1  ? MAX_LINE_WIDTH  :  tok .length ();
722731    }
723732
724733    @ Override 
0 commit comments