/******************************************************************************* * Copyright (c) 2015 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.common; import java.nio.file.Path; import melnorme.lang.tooling.ast.SourceRange; import melnorme.lang.tooling.parser.SourceLinesInfo; import melnorme.utilbox.core.CommonException; import melnorme.utilbox.misc.Location; import melnorme.utilbox.misc.NumberUtil; import melnorme.utilbox.misc.PathUtil; import melnorme.utilbox.misc.StringUtil; public class SourceFileLocation { protected final String filePath; protected final String line; protected final String column; public SourceFileLocation(String filePath, String line, String column) { this.filePath = filePath; this.line = line; this.column = column; } public String getFileLocationString() { return filePath; } public String getLineString() { return line; } public String getColumnString() { return column; } /* ----------------- ----------------- */ /** * Parse a {@link SourceFileLocation} in the format `filePath */ public static SourceFileLocation parseSourceRange(String positionString, char separator) throws CommonException { String sourceRangeString = getSourceRangeString(positionString, separator); if(sourceRangeString == null) { throw new CommonException("Source range not available in `" + positionString + "`"); } String filePath = positionString.substring(0, positionString.length() - sourceRangeString.length() -1); String lineStr_1based = StringUtil.segmentUntilMatch(sourceRangeString, ":"); String columnStr_1based = StringUtil.segmentAfterMatch(sourceRangeString, ":"); return new SourceFileLocation(filePath, lineStr_1based, columnStr_1based); } protected static String getSourceRangeString(String posString, char separator) { int ix = posString.length(); int count = 0; while(--ix >= 0) { if(posString.charAt(ix) == separator) { if(++count == 2) { return posString.substring(ix + 1, posString.length()); } } } return null; } /* ----------------- ----------------- */ public Location getFileLocation() throws CommonException { return Location.create(filePath); } public Path getFilePath() throws CommonException { return PathUtil.createPath(filePath); } public SourceRange parseSourceRangeFrom1BasedIndex(SourceLinesInfo sourceLinesInfo) throws CommonException { int line_1based = NumberUtil.parseInt(line); int column_1based = NumberUtil.parseInt(column); int validatedOffset = sourceLinesInfo.getValidatedOffset_1(line_1based, column_1based); int length = sourceLinesInfo.getIdentifierAt(validatedOffset); return new SourceRange(validatedOffset, length); } }