//===-- AppleObjCTypeEncodingParser.h ---------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef LLDB_SOURCE_PLUGINS_LANGUAGERUNTIME_OBJC_APPLEOBJCRUNTIME_APPLEOBJCTYPEENCODINGPARSER_H
#define LLDB_SOURCE_PLUGINS_LANGUAGERUNTIME_OBJC_APPLEOBJCRUNTIME_APPLEOBJCTYPEENCODINGPARSER_H

#include "clang/AST/ASTContext.h"

#include "lldb/lldb-private.h"

#include "Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h"

namespace lldb_private {
class StringLexer;
class AppleObjCTypeEncodingParser : public ObjCLanguageRuntime::EncodingToType {
public:
  AppleObjCTypeEncodingParser(ObjCLanguageRuntime &runtime);
  ~AppleObjCTypeEncodingParser() override = default;

  CompilerType RealizeType(TypeSystemClang &ast_ctx, const char *name,
                           bool for_expression) override;

private:
  struct StructElement {
    std::string name;
    clang::QualType type;
    uint32_t bitfield;

    StructElement();
    ~StructElement() = default;
  };

  clang::QualType BuildType(TypeSystemClang &clang_ast_ctx, StringLexer &type,
                            bool for_expression,
                            uint32_t *bitfield_bit_size = nullptr);

  clang::QualType BuildStruct(TypeSystemClang &ast_ctx, StringLexer &type,
                              bool for_expression);

  clang::QualType BuildAggregate(TypeSystemClang &clang_ast_ctx,
                                 StringLexer &type, bool for_expression,
                                 char opener, char closer, uint32_t kind);

  clang::QualType BuildUnion(TypeSystemClang &ast_ctx, StringLexer &type,
                             bool for_expression);

  clang::QualType BuildArray(TypeSystemClang &ast_ctx, StringLexer &type,
                             bool for_expression);

  std::string ReadStructName(StringLexer &type);

  StructElement ReadStructElement(TypeSystemClang &ast_ctx, StringLexer &type,
                                  bool for_expression);

  clang::QualType BuildObjCObjectPointerType(TypeSystemClang &clang_ast_ctx,
                                             StringLexer &type,
                                             bool for_expression);

  uint32_t ReadNumber(StringLexer &type);

  std::string ReadQuotedString(StringLexer &type);

  ObjCLanguageRuntime &m_runtime;
};

} // namespace lldb_private

#endif // LLDB_SOURCE_PLUGINS_LANGUAGERUNTIME_OBJC_APPLEOBJCRUNTIME_APPLEOBJCTYPEENCODINGPARSER_H
