b315eb18创建于 2025年11月10日历史提交
/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2024-2025. All rights reserved.
 */
macro package cjjson.macros

import std.ast.*

// @JsonAdapter 修饰 class 时允许使用的属性
class JsonAdapterClassAttr {
    public static const WITH_SUPER_CLASS: String = "withSuperClass"
    public static const WITH_GENERIC_TYPE: String = "withGenericType"
    public static const ALLOW_NULL: String = "allowNull"

    public static func availableAttrs(): String {
        return "[${WITH_SUPER_CLASS}, ${WITH_GENERIC_TYPE}, ${ALLOW_NULL}]"
    }
}

// 带属性的宏定义
public macro JsonAdapter(attr: Tokens, input: Tokens): Tokens {
    return jsonAdapterImpl(attr, input)
}

// 不带属性的宏定义
public macro JsonAdapter(input: Tokens): Tokens {
    return jsonAdapterImpl(Tokens(), input)
}

func jsonAdapterImpl(attr: Tokens, input: Tokens): Tokens {
    var ret = input
    let decl = parseDecl(input)
    match (decl) {
        case cd: ClassDecl => ret = HandleClass(cd).doExpend(attr)
        case ed: EnumDecl => ret = HandleEnum(ed).doExpend(attr)
        case sd: StructDecl => ret = HandleStruct(sd).doExpend(attr)
        case _ => diagReport(DiagReportLevel.ERROR, input, "Can only be used on class or struct types",
            "Expect class or struct")
    }

    // 展开完一个class之后,需要重置全局信息,以便展开下一个class 时全局数据保证是空的
    GlobalInfo.current().reset()

    return ret
}