// 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 <string>

#include "base/logging.h"

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_
