blob: ba2d9bb71148680adee51a88895647207ec5b028 [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.royale.compiler.utils;
import java.io.IOException;
import com.google.debugging.sourcemap.FilePosition;
import com.google.debugging.sourcemap.SourceMapConsumerV3;
import com.google.debugging.sourcemap.SourceMapGeneratorV3;
import com.google.debugging.sourcemap.SourceMapParseException;
public class SourceMapUtils
{
public static String sourceMapConsumerToString(SourceMapConsumerV3 consumer, String file)
{
SourceMapGeneratorV3 generator = sourceMapConsumerToGenerator(consumer);
StringBuilder builder = new StringBuilder();
try
{
generator.appendTo(builder, file);
}
catch(IOException e)
{
return "";
}
return builder.toString();
}
public static SourceMapGeneratorV3 sourceMapConsumerToGenerator(SourceMapConsumerV3 consumer)
{
final SourceMapGeneratorV3 generator = new SourceMapGeneratorV3();
final SourceMapEntryCounter counter = new SourceMapEntryCounter();
generator.setSourceRoot(consumer.getSourceRoot());
consumer.visitMappings(counter);
consumer.visitMappings(new SourceMapConsumerV3.EntryVisitor()
{
private int index = 0;
@Override
public void visit(String sourceName,
String symbolName,
FilePosition sourceStartPosition,
FilePosition startPosition,
FilePosition endPosition) {
generator.addMapping(sourceName, symbolName, sourceStartPosition, startPosition, endPosition);
index++;
if(index == counter.count)
{
//add an extra mapping because there seems to be a bug in
//SourceMapGeneratorV3's appendTo() that omits the last
//entry, for some reason
appendExtraMappingToGenerator(generator, sourceName, symbolName, sourceStartPosition, startPosition, endPosition);
}
}
});
return generator;
}
public static SourceMapGeneratorV3 sourceMapConsumerToGeneratorWithRemappedSourceRoot(SourceMapConsumerV3 consumer, String sourceRoot, String className)
{
final SourceMapGeneratorV3 generator = new SourceMapGeneratorV3();
final SourceMapEntryCounter counter = new SourceMapEntryCounter();
final String startPath = "/" + className.replace(".", "/") + ".";
generator.setSourceRoot(sourceRoot);
consumer.visitMappings(counter);
consumer.visitMappings(new SourceMapConsumerV3.EntryVisitor()
{
private int index = 0;
@Override
public void visit(String sourceName,
String symbolName,
FilePosition sourceStartPosition,
FilePosition startPosition,
FilePosition endPosition) {
String newSourceName = sourceName;
int startPathIndex = newSourceName.indexOf(startPath);
if(startPathIndex != -1)
{
newSourceName = newSourceName.substring(startPathIndex + 1);
}
generator.addMapping(newSourceName, symbolName, sourceStartPosition, startPosition, endPosition);
index++;
if(index == counter.count)
{
//add an extra mapping because there seems to be a bug in
//SourceMapGeneratorV3's appendTo() that omits the last
//entry, for some reason
appendExtraMappingToGenerator(generator, newSourceName, symbolName, sourceStartPosition, startPosition, endPosition);
}
}
});
return generator;
}
public static SourceMapConsumerV3 addLineToSourceMap(SourceMapConsumerV3 consumer, String sourceFileName, final int lineToAdd)
{
if (consumer == null)
{
return null;
}
final SourceMapGeneratorV3 generator = new SourceMapGeneratorV3();
final SourceMapEntryCounter counter = new SourceMapEntryCounter();
generator.setSourceRoot(consumer.getSourceRoot());
consumer.visitMappings(counter);
consumer.visitMappings(new SourceMapConsumerV3.EntryVisitor()
{
private int index = 0;
@Override
public void visit(String sourceName,
String symbolName,
FilePosition sourceStartPosition,
FilePosition startPosition,
FilePosition endPosition) {
if(startPosition.getLine() >= lineToAdd)
{
startPosition = new FilePosition(startPosition.getLine() + 1, startPosition.getColumn());
endPosition = new FilePosition(endPosition.getLine() + 1, endPosition.getColumn());
}
generator.addMapping(sourceName, symbolName, sourceStartPosition, startPosition, endPosition);
index++;
if(index == counter.count)
{
//add an extra mapping because there seems to be a bug in
//SourceMapGeneratorV3's appendTo() that omits the last
//entry, for some reason
appendExtraMappingToGenerator(generator, sourceName, symbolName, sourceStartPosition, startPosition, endPosition);
}
}
});
return sourceMapGeneratorToConsumer(generator, sourceFileName);
}
public static SourceMapConsumerV3 removeLineFromSourceMap(SourceMapConsumerV3 consumer, String sourceFileName, final int lineToRemove)
{
if (consumer == null)
{
return null;
}
final SourceMapGeneratorV3 generator = new SourceMapGeneratorV3();
final SourceMapEntryCounter counter = new SourceMapEntryCounter();
generator.setSourceRoot(consumer.getSourceRoot());
consumer.visitMappings(counter);
consumer.visitMappings(new SourceMapConsumerV3.EntryVisitor()
{
private int index = 0;
@Override
public void visit(String sourceName,
String symbolName,
FilePosition sourceStartPosition,
FilePosition startPosition,
FilePosition endPosition) {
if(startPosition.getLine() == lineToRemove)
{
return;
}
if(startPosition.getLine() > lineToRemove)
{
startPosition = new FilePosition(startPosition.getLine() - 1, startPosition.getColumn());
}
if(endPosition.getLine() > lineToRemove)
{
endPosition = new FilePosition(endPosition.getLine() - 1, endPosition.getColumn());
}
generator.addMapping(sourceName, symbolName, sourceStartPosition, startPosition, endPosition);
index++;
if(index == counter.count)
{
//add an extra mapping because there seems to be a bug in
//SourceMapGeneratorV3's appendTo() that omits the last
//entry, for some reason
appendExtraMappingToGenerator(generator, sourceName, symbolName, sourceStartPosition, startPosition, endPosition);
}
}
});
return sourceMapGeneratorToConsumer(generator, sourceFileName);
}
private static void appendExtraMappingToGenerator(SourceMapGeneratorV3 generator,
String sourceName,
String symbolName,
FilePosition sourceStartPosition,
FilePosition startPosition,
FilePosition endPosition)
{
//add an extra mapping because there seems to be a bug in
//SourceMapGeneratorV3's appendTo() that omits the last
//entry, for some reason
FilePosition newEndPosition = new FilePosition(endPosition.getLine(), endPosition.getColumn() + 1);
generator.addMapping(sourceName, null, sourceStartPosition, endPosition, newEndPosition);
}
private static class SourceMapEntryCounter implements SourceMapConsumerV3.EntryVisitor
{
private int count = 0;
@Override
public void visit(String sourceName,
String symbolName,
FilePosition sourceStartPosition,
FilePosition startPosition,
FilePosition endPosition) {
count++;
}
}
public static String sourceMapGeneratorToString(SourceMapGeneratorV3 generator, String fileName)
{
StringBuilder builder = new StringBuilder();
try
{
generator.appendTo(builder, fileName);
}
catch(IOException e)
{
return null;
}
return builder.toString();
}
public static SourceMapConsumerV3 sourceMapGeneratorToConsumer(SourceMapGeneratorV3 generator, String fileName)
{
String generatorString = sourceMapGeneratorToString(generator, fileName);
if(generatorString == null)
{
return null;
}
SourceMapConsumerV3 consumer = new SourceMapConsumerV3();
try
{
consumer.parse(generatorString);
}
catch(SourceMapParseException e)
{
return null;
}
return consumer;
}
}