// Copyright 2017-2020 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 VERIBLE_COMMON_FORMATTING_TREE_ANNOTATOR_H_
#define VERIBLE_COMMON_FORMATTING_TREE_ANNOTATOR_H_

#include <functional>
#include <vector>

#include "common/formatting/format_token.h"
#include "common/text/symbol.h"
#include "common/text/syntax_tree_context.h"
#include "common/text/token_info.h"

namespace verible {

// Parameters: left token, right token (modified),
// left token's syntax tree context,
// right token's syntax tree context.
using ContextTokenAnnotatorFunction =
    std::function<void(const PreFormatToken &, PreFormatToken *,
                       const SyntaxTreeContext &, const SyntaxTreeContext &)>;

// Applies inter-token formatting annotations, using syntactic context
// at every token.
void AnnotateFormatTokensUsingSyntaxContext(
    const Symbol *syntax_tree_root, const TokenInfo &eof_token,
    std::vector<PreFormatToken>::iterator tokens_begin,
    std::vector<PreFormatToken>::iterator tokens_end,
    const ContextTokenAnnotatorFunction &annotator);

}  // namespace verible

#endif  // VERIBLE_COMMON_FORMATTING_TREE_ANNOTATOR_H_
