#pragma once

//
// This file is distributed under the MIT License. See LICENSE.md for details.
//

/* TUPLE-TREE-YAML
name: NamingConfiguration
type: struct
fields:
  - name: UnnamedSegmentPrefix
    doc: |
      The prefix for a segment without a name.

      The default value is `segment_`.
    type: string
    optional: true

  - name: UnnamedFunctionPrefix
    doc: |
      The prefix for a local function without a name.

      The default value is `function_`.
    type: string
    optional: true
  - name: UnnamedDynamicFunctionPrefix
    doc: |
      The prefix for a dynamic function without a name.

      The default value is `dynamic_`.
    type: string
    optional: true

  - name: UnnamedTypeDefinitionPrefix
    doc: |
      The prefix for a type definition without a name.

      The default value is ``.

      Note that the type kind (like `struct`, or `typedef`) is going to be
      inserted automatically after this prefix.
    type: string
    optional: true

  - name: UnnamedEnumEntryPrefix
    doc: |
      The prefix for an enum entry without a name.

      The default value is `enum_entry_`.
    type: string
    optional: true
  - name: UnnamedStructFieldPrefix
    doc: |
      The prefix for a struct field without a name.

      The default value is `offset_`.
    type: string
    optional: true
  - name: UnnamedUnionFieldPrefix
    doc: |
      The prefix for a union member without a name.

      The default value is `member_`.
    type: string
    optional: true

  - name: UnnamedFunctionArgumentPrefix
    doc: |
      The prefix for a cabi function argument without a name.

      The default value is `argument_`.
    type: string
    optional: true
  - name: UnnamedFunctionRegisterPrefix
    doc: |
      The prefix for a raw function register without a name.

      The default value is `register_`.
    type: string
    optional: true

  - name: StructPaddingPrefix
    doc: |
      The prefix for a padding struct field.

      The default value is `padding_at_`.
    type: string
    optional: true
  - name: ArtificialReturnValuePrefix
    doc: |
      The prefix for an artificial raw function return value.

      The default value is `artificial_struct_returned_by_`.
    type: string
    optional: true
  - name: ArtificialArrayWrapperPrefix
    doc: |
      The prefix for an artificial array wrapper.

      The default value is `artificial_wrapper_`.
    type: string
    optional: true
  - name: ArtificialArrayWrapperFieldName
    doc: |
      The name of the field within the artificial array wrapper.
      See \ref ArtificialArrayWrapperPrefix.

      The default value is `the_array`.
    type: string
    optional: true

  - name: CollisionResolutionSuffix
    doc: |
      The suffix attached to colliding names in order to disambiguate them.

      The default value is `_`.
    type: string
    optional: true

TUPLE-TREE-YAML */

#include "revng/Model/Generated/Early/NamingConfiguration.h"

class model::NamingConfiguration
  : public model::generated::NamingConfiguration {
public:
  using generated::NamingConfiguration::NamingConfiguration;

  // TODO: remove these after the support the default TTG values is added.

  llvm::StringRef unnamedSegmentPrefix() const {
    if (UnnamedSegmentPrefix().empty())
      return "segment_";
    else
      return UnnamedSegmentPrefix();
  }

  llvm::StringRef unnamedFunctionPrefix() const {
    if (UnnamedFunctionPrefix().empty())
      return "function_";
    else
      return UnnamedFunctionPrefix();
  }
  llvm::StringRef unnamedDynamicFunctionPrefix() const {
    if (UnnamedDynamicFunctionPrefix().empty())
      return "dynamic_";
    else
      return UnnamedDynamicFunctionPrefix();
  }

  llvm::StringRef unnamedTypeDefinitionPrefix() const {
    if (UnnamedTypeDefinitionPrefix().empty())
      return "";
    else
      return UnnamedTypeDefinitionPrefix();
  }

  llvm::StringRef unnamedEnumEntryPrefix() const {
    if (UnnamedEnumEntryPrefix().empty())
      return "enum_entry_";
    else
      return UnnamedEnumEntryPrefix();
  }
  llvm::StringRef unnamedStructFieldPrefix() const {
    if (UnnamedStructFieldPrefix().empty())
      return "offset_";
    else
      return UnnamedStructFieldPrefix();
  }
  llvm::StringRef unnamedUnionFieldPrefix() const {
    if (UnnamedUnionFieldPrefix().empty())
      return "member_";
    else
      return UnnamedUnionFieldPrefix();
  }

  llvm::StringRef unnamedFunctionArgumentPrefix() const {
    if (UnnamedFunctionArgumentPrefix().empty())
      return "argument_";
    else
      return UnnamedFunctionArgumentPrefix();
  }
  llvm::StringRef unnamedFunctionRegisterPrefix() const {
    if (UnnamedFunctionRegisterPrefix().empty())
      return "register_";
    else
      return UnnamedFunctionRegisterPrefix();
  }

  llvm::StringRef structPaddingPrefix() const {
    if (StructPaddingPrefix().empty())
      return "padding_at_";
    else
      return StructPaddingPrefix();
  }
  llvm::StringRef artificialReturnValuePrefix() const {
    if (ArtificialReturnValuePrefix().empty())
      return "artificial_struct_returned_by_";
    else
      return ArtificialReturnValuePrefix();
  }
  llvm::StringRef artificialArrayWrapperPrefix() const {
    if (ArtificialArrayWrapperPrefix().empty())
      return "artificial_wrapper_";
    else
      return ArtificialArrayWrapperPrefix();
  }
  llvm::StringRef artificialArrayWrapperFieldName() const {
    if (ArtificialArrayWrapperFieldName().empty())
      return "the_array";
    else
      return ArtificialArrayWrapperFieldName();
  }

  llvm::StringRef collisionResolutionSuffix() const {
    if (CollisionResolutionSuffix().empty())
      return "_";
    else
      return CollisionResolutionSuffix();
  }
};

#include "revng/Model/Generated/Late/NamingConfiguration.h"
