/*******************************************************************************
* Copyright (c) 2014 Bruno Medeiros and other Contributors.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Bruno Medeiros - initial API and implementation
*******************************************************************************/
package melnorme.lang.tooling.toolchain.ops;
import java.nio.file.Path;
import melnorme.lang.tooling.common.LineColumnPosition;
import melnorme.lang.tooling.common.SourceLineColumnRange;
import melnorme.utilbox.core.CommonException;
import melnorme.utilbox.misc.Location;
import melnorme.utilbox.misc.MiscUtil;
import melnorme.utilbox.misc.NumberUtil;
import melnorme.utilbox.misc.Pair;
import melnorme.utilbox.misc.StringUtil;
public interface ToolOutputParseHelper {
default int parsePositiveInt(String integerString) throws CommonException {
return NumberUtil.parsePositiveInt(integerString);
}
default int parseInt(String integerString) throws CommonException {
return NumberUtil.parseInt(integerString);
}
default int parseInt(String integerString, String errorMessage) throws CommonException {
return NumberUtil.parseInt(integerString, errorMessage);
}
default Path parsePath(String pathString) throws CommonException {
return MiscUtil.createPath(pathString);
}
default Location parseLocation(String pathString) throws CommonException {
return Location.create(pathString);
}
public static SourceLocation parsePathLineColumn(String sourceString, String separator)
throws CommonException {
Pair<String, LineColumnPosition> pair = parsePathLineColumn2(sourceString, separator);
Location loc = Location.create(pair.getFirst());
LineColumnPosition lcPos = pair.getSecond();
return new SourceLocation(loc, new SourceLineColumnRange(lcPos.line, lcPos.column));
}
/**
* Parse a path+line+column from given string, which are expected to be separated by given separator.
* Example sourceString: <code>D:\foo\bar\xpto.go:22:12</code>
*/
public static Pair<String, LineColumnPosition> parsePathLineColumn2(String sourceString, String separator)
throws CommonException {
// We need to parse sourceLocationString starting from the end,
// because on Windows the filePath can contain the ':' char
String columnStr = StringUtil.segmentAfterLastMatch(sourceString, separator);
sourceString = StringUtil.substringUntilLastMatch(sourceString, separator);
String lineStr = StringUtil.segmentAfterLastMatch(sourceString, separator);
sourceString = StringUtil.substringUntilLastMatch(sourceString, separator);
String pathString = sourceString;
LineColumnPosition second = parseLineColumn(lineStr, columnStr, 0, 0);
return Pair.create(pathString, second);
}
public static LineColumnPosition parseLineColumn(String lineStr, String columnStr, int line_start,
int column_start) throws CommonException {
if(columnStr == null || lineStr == null) {
throw new CommonException("No line or column position given.", null);
}
int line = NumberUtil.parseInt(lineStr, "Line is not a number: " + lineStr);
if(line < line_start) {
throw new CommonException("Line is not a positive number: " + lineStr);
}
int column = NumberUtil.parseInt(columnStr, "Column is not a number: " + columnStr);
if(column < column_start) {
throw new CommonException("Column is not a positive number: " + columnStr);
}
return new LineColumnPosition(line, column);
}
}