1 package gnu.text; 2 3 /** Helpers for managing source-code positions and ranges. 4 * FUTURE: An object that decodes source positions, encoded as longs. 5 * The default encoding gives start-line and end-line both 20 bits, 6 * and start-column and end-column both 12 bits. 7 */ 8 9 public class SourceMapper { simpleEncode(SourceLocator location)10 public static long simpleEncode(SourceLocator location) { 11 return location instanceof SourceLocator.Simple 12 ? ((SourceLocator.Simple) location).position 13 : SourceMapper 14 .simpleEncode(location.getStartLine(), location.getStartColumn(), 15 location.getEndLine(), location.getEndColumn()); 16 } 17 simpleEncode(int startLine, int startColumn, int endLine, int endColumn)18 public static long simpleEncode(int startLine, int startColumn, 19 int endLine, int endColumn) { 20 if (startLine < 0 || startLine > 0xfffff) startLine = 0; 21 if (endLine < 0 || endLine > 0xfffff) endLine = 0; 22 if (startColumn < 0 || startColumn > 0xfff) startColumn = 0; 23 if (endColumn < 0 || endColumn > 0xfff) endColumn = 0; 24 return ((long) endLine << 44) | ((long) endColumn << 32) 25 | ((long) startLine << 12) | ((long) startColumn); 26 } 27 simpleEncode(int startLine, int startColumn)28 public static long simpleEncode(int startLine, int startColumn) { 29 if (startLine < 0 || startLine > 0xfffff) startLine = 0; 30 if (startColumn < 0 || startColumn > 0xfff) startColumn = 0; 31 return ((long) startLine << 12) | ((long) startColumn); 32 } 33 simpleStartLine(long position)34 public static int simpleStartLine(long position) { 35 int line = (int) (position >> 12) & 0xfffff; 36 return line == 0 ? -1 : line; 37 } 38 simpleStartColumn(long position)39 public static int simpleStartColumn(long position) { 40 int column = (int) position & 0xfff; 41 return column == 0 ? -1 : column; 42 } 43 simpleEndLine(long position)44 public static int simpleEndLine(long position) { 45 int line = (int) (position >> 44) & 0xfffff; 46 return line == 0 ? simpleStartLine(position) : line; 47 } 48 simpleEndColumn(long position)49 public static int simpleEndColumn(long position) { 50 int column = (int) (position >> 32) & 0xfff; 51 return column == 0 ? simpleStartColumn(position) : column; 52 } 53 54 /* MAYBE FUTURE: 55 private String filename; 56 57 public static SourceMapper simpleMapper(String filename) { 58 SourceMapper mapper = new SourceMapper(); 59 mapper.filename = filename; 60 return mapper; 61 } 62 public String getFileName(long range) { return filename; } 63 64 public int getStartLine(long range) { return simpleStartLine(range); } 65 public int getStartColumn(long range) { return simpleStartColumn(range); } 66 67 public int getEndLine(long range) { return simpleEndLine(range); } 68 public int getEndColumn(long range) { return simpleEndColumn(range); } 69 70 public int getLineNumber(long range) { return getStartLine(range); } 71 public int getColumnNumber(long range) { return getStartColumn(range); } 72 73 public static String getFileName(Object mapper, long range) { 74 if (mapper instanceof String) 75 return (String) mapper; 76 else 77 return ((SourceMapper) mapper).getFileName(range); 78 } 79 public static int getLineNumber(Object mapper, long range) { 80 if (mapper instanceof String) 81 return getStartLine(mapper, range); 82 else 83 return ((SourceMapper) mapper).getLineNumber(range); 84 } 85 86 public static int getColumnNumber(Object mapper, long range) { 87 if (mapper instanceof String) 88 return getStartColumn(mapper, range); 89 else 90 return ((SourceMapper) mapper).getColumnNumber(range); 91 } 92 93 public static int getStartLine(Object mapper, long range) { 94 return (mapper instanceof String ? simpleStartLine(range) 95 : ((SourceMapper) mapper).getStartLine(range)); 96 } 97 98 public static int getEndLine(Object mapper, long range) { 99 if (mapper instanceof String) 100 return getStartLine(mapper, range); 101 return ((SourceMapper) mapper).getEndLine(range); 102 } 103 104 public static int getStartColumn(Object mapper, long range) { 105 return mapper instanceof String ? simpleStartColumn(range) 106 : ((SourceMapper) mapper).getStartColumn(range); 107 } 108 109 public static int getEndColumn(Object mapper, long range) { 110 return mapper instanceof String ? simpleEndColumn(range) 111 : ((SourceMapper) mapper).getEndColumn(range); 112 } 113 */ 114 } 115