| /* |
| * Copyright (C) 2007-2010 JĂșlio Vilmar Gesser. |
| * Copyright (C) 2011, 2013-2016 The JavaParser Team. |
| * |
| * This file is part of JavaParser. |
| * |
| * JavaParser can be used either under the terms of |
| * a) the GNU Lesser General Public License as published by |
| * the Free Software Foundation, either version 3 of the License, or |
| * (at your option) any later version. |
| * b) the terms of the Apache License |
| * |
| * You should have received a copy of both licenses in LICENCE.LGPL and |
| * LICENCE.APACHE. Please refer to those files for details. |
| * |
| * JavaParser is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU Lesser General Public License for more details. |
| */ |
| |
| package com.github.javaparser; |
| |
| import java.util.Comparator; |
| import java.util.Optional; |
| |
| import static com.github.javaparser.utils.Utils.EOL; |
| import static com.github.javaparser.utils.Utils.assertNotNull; |
| |
| /** |
| * A problem that was encountered during parsing. |
| */ |
| public class Problem { |
| private final String message; |
| private final TokenRange location; |
| private final Throwable cause; |
| |
| public Problem(String message, TokenRange location, Throwable cause) { |
| assertNotNull(message); |
| |
| this.message = message; |
| this.location = location; |
| this.cause = cause; |
| } |
| |
| @Override |
| public String toString() { |
| final StringBuilder str = new StringBuilder(getVerboseMessage()); |
| if (cause != null) { |
| str.append(EOL).append("Problem stacktrace : ").append(EOL); |
| for (int i = 0; i < cause.getStackTrace().length; i++) { |
| StackTraceElement ste = cause.getStackTrace()[i]; |
| str.append(" ").append(ste.toString()); |
| if (i + 1 != cause.getStackTrace().length) |
| str.append(EOL); |
| } |
| } |
| return str.toString(); |
| } |
| |
| /** |
| * @return the message that was passed into the constructor. |
| */ |
| public String getMessage() { |
| return message; |
| } |
| |
| /** |
| * @return the message plus location information. |
| */ |
| public String getVerboseMessage() { |
| return getLocation().map(l -> l.getBegin().getRange().map(r -> r.begin.toString()).orElse("(line ?,col ?)") + " " + message).orElse(message); |
| } |
| |
| /** |
| * @return the location that was passed into the constructor. |
| */ |
| public Optional<TokenRange> getLocation() { |
| return Optional.ofNullable(location); |
| } |
| |
| /** |
| * @deprecated use getLocation() |
| */ |
| @Deprecated |
| public Optional<TokenRange> getRange() { |
| return getLocation(); |
| } |
| |
| /** |
| * @return the cause that was passed into the constructor. |
| */ |
| public Optional<Throwable> getCause() { |
| return Optional.ofNullable(cause); |
| } |
| |
| /** |
| * Sorts problems on position. |
| */ |
| public static Comparator<Problem> PROBLEM_BY_BEGIN_POSITION = (a, b) -> { |
| final Optional<Position> aBegin= a.getLocation().flatMap(l -> l.getBegin().getRange().map(r -> r.begin)); |
| final Optional<Position> bBegin = b.getLocation().flatMap(l -> l.getBegin().getRange().map(r -> r.begin)); |
| |
| if (aBegin.isPresent() && bBegin.isPresent()) { |
| return aBegin.get().compareTo(bBegin.get()); |
| } |
| if (a.getLocation().isPresent() || b.getLocation().isPresent()) { |
| if (a.getLocation().isPresent()) { |
| return 1; |
| } |
| return -1; |
| } |
| return 0; |
| }; |
| |
| |
| } |