blob: d737012325d4a95b3309d8b2a51a0553aca217ad [file] [log] [blame]
/*
* Copyright 2013 Google Inc.
*
* Licensed 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 com.google.gwt.dev.codeserver;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.dev.util.Util;
import com.google.gwt.thirdparty.debugging.sourcemap.SourceMapConsumerV3;
import com.google.gwt.thirdparty.debugging.sourcemap.SourceMapParseException;
import java.io.File;
/**
* A mapping from Java lines to JavaScript.
*/
class ReverseSourceMap {
private final SourceMapConsumerV3 consumer;
private ReverseSourceMap(SourceMapConsumerV3 consumer) {
this.consumer = consumer;
}
/**
* Reads a source map from disk and parses it into an in-memory representation.
* If it can't be loaded, logs a warning and returns an empty source map.
*/
static ReverseSourceMap load(TreeLogger logger, File sourceMapFile) {
SourceMapConsumerV3 consumer = new SourceMapConsumerV3();
String unparsed = Util.readFileAsString(sourceMapFile);
try {
consumer.parse(unparsed);
return new ReverseSourceMap(consumer);
} catch (SourceMapParseException e) {
logger.log(TreeLogger.WARN, "can't parse source map", e);
return new ReverseSourceMap(null);
}
}
/**
* Returns true if the given line in a Java file has any corresponding JavaScript in
* the GWT compiler's output. (The source file's path is relative to the source root directory
* where the GWT compiler found it.)
*/
boolean appearsInJavaScript(String path, int lineNumber) {
// TODO: getReverseMapping() seems to be off by one (lines numbered from zero). Why?
return consumer != null && !consumer.getReverseMapping(path, lineNumber - 1, -1).isEmpty();
}
}