// Copyright 2023 The Verible Authors.
//
// 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.

#include "common/lsp/lsp-protocol.h"
#include "common/strings/line_column_map.h"

// Simple conversion functions between verible data structures and Language
// Server Protocol structs.

namespace verilog {

// Convert a Verible internal source code range to a language server protocol
// range.
inline verible::lsp::Range RangeFromLineColumn(
    const verible::LineColumnRange &range) {
  return {.start = {.line = range.start.line, .character = range.start.column},
          .end = {.line = range.end.line, .character = range.end.column}};
}
}  // namespace verilog
