/*
 * 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();
  }
}
