// Copyright 2021 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.
//

#ifndef VERILOG_TOOLS_LS_VERIBLE_LSP_ADAPTER_H
#define VERILOG_TOOLS_LS_VERIBLE_LSP_ADAPTER_H

#include <vector>

#include "common/lsp/lsp-protocol.h"
#include "nlohmann/json.hpp"
#include "verilog/tools/ls/lsp-parse-buffer.h"

// Adapter functions converting verible state into lsp objects.

namespace verilog {

// Given the output of the parser and a lint status, create a diagnostic
// output to be sent in textDocument/publishDiagnostics notification.
std::vector<verible::lsp::Diagnostic> CreateDiagnostics(const BufferTracker &,
                                                        int message_limit);

// Generate code actions from autofixes provided by the linter.
std::vector<verible::lsp::CodeAction> GenerateLinterCodeActions(
    const BufferTracker *tracker, const verible::lsp::CodeActionParams &p);

verible::lsp::FullDocumentDiagnosticReport GenerateDiagnosticReport(
    const BufferTracker *tracker,
    const verible::lsp::DocumentDiagnosticParams &p);

// Given a parse tree, generate a document symbol outline
// textDocument/documentSymbol request
// There is a workaround for the kate editor currently. Goal is to actually
// fix this upstream in the kate editor, but for now let's have an explicit
// boolean to make it visible what is needed.
nlohmann::json CreateDocumentSymbolOutline(
    const BufferTracker *tracker, const verible::lsp::DocumentSymbolParams &p,
    bool kate_compatible_tags = true);

// Given a position in a document, return ranges in the buffer that should
// be highlighted.
// Current implementation: if cursor is over a symbol, highlight all symbols
// with the same name (NB: Does _not_ take scoping into account yet).
std::vector<verible::lsp::DocumentHighlight> CreateHighlightRanges(
    const BufferTracker *tracker,
    const verible::lsp::DocumentHighlightParams &p);

// Format given range (or whole document) and emit an edit.
std::vector<verible::lsp::TextEdit> FormatRange(
    const BufferTracker *tracker,
    const verible::lsp::DocumentFormattingParams &p);

}  // namespace verilog
#endif  // VERILOG_TOOLS_LS_VERIBLE_LSP_ADAPTER_H
