// Path: app/src/main/java/com/annimon/hotarufx/lexer/SourcePosition.java
// public class SourcePosition {
// 
//     private final int position;
//     private final int row;
//     private final int column;
// 
//     public SourcePosition(int position, int row, int column) {
//         this.position = position;
//         this.row = row;
//         this.column = column;
//     }
// 
//     public int getPosition() {
//         return position;
//     }
// 
//     public int getRow() {
//         return row;
//     }
// 
//     public int getColumn() {
//         return column;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
//         SourcePosition that = (SourcePosition) o;
//         return position == that.position &&
//                 row == that.row &&
//                 column == that.column;
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hash(position, row, column);
//     }
// 
//     @Override
//     public String toString() {
//         return "[" + row + ", " + column + "]";
//     }
// }


import com.annimon.hotarufx.lexer.SourcePosition;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Stream;
package com.annimon.hotarufx.parser;


public class ParseErrors implements Iterable<ParseError> {

    private final List<ParseError> errors;

    public ParseErrors() {
        errors = new ArrayList<>();
    }

    public void clear() {
        errors.clear();
    }

    public void add(Exception ex, SourcePosition pos) {
        errors.add(new ParseError(ex, pos));
    }

    public boolean hasErrors() {
// Path: app/src/main/java/com/annimon/hotarufx/lexer/SourcePosition.java
// public class SourcePosition {
// 
//     private final int position;
//     private final int row;
//     private final int column;
// 
//     public SourcePosition(int position, int row, int column) {
//         this.position = position;
//         this.row = row;
//         this.column = column;
//     }
// 
//     public int getPosition() {
//         return position;
//     }
// 
//     public int getRow() {
//         return row;
//     }
// 
//     public int getColumn() {
//         return column;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
//         SourcePosition that = (SourcePosition) o;
//         return position == that.position &&
//                 row == that.row &&
//                 column == that.column;
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hash(position, row, column);
//     }
// 
//     @Override
//     public String toString() {
//         return "[" + row + ", " + column + "]";
//     }
// }


// Path: app/src/main/java/com/annimon/hotarufx/parser/ParseErrors.java
import com.annimon.hotarufx.lexer.SourcePosition;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Stream;

package com.annimon.hotarufx.parser;


public class ParseErrors implements Iterable<ParseError> {

    private final List<ParseError> errors;

    public ParseErrors() {
        errors = new ArrayList<>();
    }

    public void clear() {
        errors.clear();
    }

    public void add(Exception ex, SourcePosition pos) {
        errors.add(new ParseError(ex, pos));
    }

    public boolean hasErrors() {
        return !errors.isEmpty();