/** Assigns sequential ids to used mappings, and returns the last line mapped. */ private int prepMappings() throws IOException { // Mark any unused mappings. (new MappingTraversal()).traverse(new UsedMappingCheck()); // Renumber used mappings and keep track of the last line. int id = 0; int maxLine = 0; for (Mapping m : mappings) { if (m.used) { m.id = id++; int endPositionLine = m.endPosition.getLine(); maxLine = Math.max(maxLine, endPositionLine); } } // Adjust for the prefix. return maxLine + prefixPosition.getLine(); }
public void testParseSourceMetaMap() throws Exception { final String INPUT1 = "file1"; final String INPUT2 = "file2"; LinkedHashMap<String, String> inputs = Maps.newLinkedHashMap(); inputs.put(INPUT1, "var __FOO__ = 1;"); inputs.put(INPUT2, "var __BAR__ = 2;"); RunResult result1 = compile(inputs.get(INPUT1), INPUT1); RunResult result2 = compile(inputs.get(INPUT2), INPUT2); final String MAP1 = "map1"; final String MAP2 = "map2"; final LinkedHashMap<String, String> maps = Maps.newLinkedHashMap(); maps.put(MAP1, result1.sourceMapFileContent); maps.put(MAP2, result2.sourceMapFileContent); List<SourceMapSection> sections = Lists.newArrayList(); StringBuilder output = new StringBuilder(); FilePosition offset = appendAndCount(output, result1.generatedSource); sections.add(SourceMapSection.forURL(MAP1, 0, 0)); output.append(result2.generatedSource); sections.add(SourceMapSection.forURL(MAP2, offset.getLine(), offset.getColumn())); SourceMapGeneratorV3 generator = new SourceMapGeneratorV3(); StringBuilder mapContents = new StringBuilder(); generator.appendIndexMapTo(mapContents, "out.js", sections); check( inputs, output.toString(), mapContents.toString(), new SourceMapSupplier() { @Override public String getSourceMap(String url) { return maps.get(url); } }); }
public void testSourceMapMerging() throws Exception { final String INPUT1 = "file1"; final String INPUT2 = "file2"; LinkedHashMap<String, String> inputs = Maps.newLinkedHashMap(); inputs.put(INPUT1, "var __FOO__ = 1;"); inputs.put(INPUT2, "var __BAR__ = 2;"); RunResult result1 = compile(inputs.get(INPUT1), INPUT1); RunResult result2 = compile(inputs.get(INPUT2), INPUT2); StringBuilder output = new StringBuilder(); FilePosition offset = appendAndCount(output, result1.generatedSource); output.append(result2.generatedSource); SourceMapGeneratorV3 generator = new SourceMapGeneratorV3(); generator.mergeMapSection(0, 0, result1.sourceMapFileContent); generator.mergeMapSection(offset.getLine(), offset.getColumn(), result2.sourceMapFileContent); StringBuilder mapContents = new StringBuilder(); generator.appendTo(mapContents, "out.js"); check(inputs, output.toString(), mapContents.toString()); }
/** @return The column adjusted for the prefix position. */ private int getAdjustedCol(FilePosition p) { int rawLine = p.getLine(); int rawCol = p.getColumn(); // Only the first line needs the character position adjusted. return (rawLine != 0) ? rawCol : rawCol + prefixPosition.getColumn(); }
/** @return The line adjusted for the prefix position. */ private int getAdjustedLine(FilePosition p) { return p.getLine() + prefixPosition.getLine(); }
/** * Adds a mapping for the given node. Mappings must be added in order. * * @param startPosition The position on the starting line * @param endPosition The position on the ending line. */ @Override public void addMapping( String sourceName, @Nullable String symbolName, FilePosition sourceStartPosition, FilePosition startPosition, FilePosition endPosition) { // Don't bother if there is not sufficient information to be useful. if (sourceName == null || sourceStartPosition.getLine() < 0) { return; } FilePosition adjustedStart = startPosition; FilePosition adjustedEnd = endPosition; if (offsetPosition.getLine() != 0 || offsetPosition.getColumn() != 0) { // If the mapping is found on the first line, we need to offset // its character position by the number of characters found on // the *last* line of the source file to which the code is // being generated. int offsetLine = offsetPosition.getLine(); int startOffsetPosition = offsetPosition.getColumn(); int endOffsetPosition = offsetPosition.getColumn(); if (startPosition.getLine() > 0) { startOffsetPosition = 0; } if (endPosition.getLine() > 0) { endOffsetPosition = 0; } adjustedStart = new FilePosition( startPosition.getLine() + offsetLine, startPosition.getColumn() + startOffsetPosition); adjustedEnd = new FilePosition( endPosition.getLine() + offsetLine, endPosition.getColumn() + endOffsetPosition); } // Create the new mapping. Mapping mapping = new Mapping(); mapping.sourceFile = sourceName; mapping.originalPosition = sourceStartPosition; mapping.originalName = symbolName; mapping.startPosition = adjustedStart; mapping.endPosition = adjustedEnd; // Validate the mappings are in a proper order. if (lastMapping != null) { int lastLine = lastMapping.startPosition.getLine(); int lastColumn = lastMapping.startPosition.getColumn(); int nextLine = mapping.startPosition.getLine(); int nextColumn = mapping.startPosition.getColumn(); Preconditions.checkState( nextLine > lastLine || (nextLine == lastLine && nextColumn >= lastColumn), "Incorrect source mappings order, previous : (%s,%s)\n" + "new : (%s,%s)", lastLine, lastColumn, nextLine, nextColumn); } lastMapping = mapping; mappings.add(mapping); }