/*
 * Copyright 2014 Google Inc. All Rights Reserved.
 *
 * 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.
 */

#ifndef COBALT_BASE_SOURCE_LOCATION_H_
#define COBALT_BASE_SOURCE_LOCATION_H_

#include "base/logging.h"

#include <string>

namespace base {

// Used by CSS and HTML parsers to define location in a source file.
//
// If file path cannot be determined, provide a name of Web API object
// which triggered the parsing, in the form of "[object ClassName]" (this
// matches JavaScript's toString() format for objects).
//
// For example, a list of CSS declarations assigned to HTMLElement.style
// should have a |file_path| set to "[object CSSStyleDeclaration]", where
// CSSStyleDeclaration is the type of HTMLElement.style property.
//
// Line and column numbers are 1-based.
struct SourceLocation {
  SourceLocation(const std::string& file_path, int line_number,
                 int column_number)
      : file_path(file_path),
        line_number(line_number),
        column_number(column_number) {
    DCHECK_GE(line_number, 1);
    DCHECK_GE(column_number, 1);
  }

  std::string file_path;
  int line_number;
  int column_number;
};

// Offsets the location within embedded source relatively to the start
// of embedded source.
//
// Line and column numbers are 1-based.
inline void AdjustForStartLocation(int start_line_number,
                                   int start_column_number, int* line_number,
                                   int* column_number) {
  DCHECK_GE(start_line_number, 1);
  DCHECK_GE(start_column_number, 1);
  DCHECK(line_number);
  DCHECK(column_number);
  DCHECK_GE(*line_number, 1);
  DCHECK_GE(*column_number, 1);

  *column_number += *line_number == 1 ? start_column_number - 1 : 0;
  *line_number += start_line_number - 1;
}

}  // namespace base

#endif  // COBALT_BASE_SOURCE_LOCATION_H_
