macro package CJson.jsonmacro

import std.ast.*

/*
*  The visitor for class-level vars for target class
*/
class ClassVarDeclVisitor <: Visitor {
    private var var_Tk_List: ArrayList<VarDecl> = ArrayList()
    private var defaultVarValueMap: Map<String, Expr> = HashMap()

    private var globalConfig: GlobalConfig

    public init(globalConfig: GlobalConfig) {
        this.globalConfig = globalConfig
    }

    /*
    * Gets the class level var token list
    *
    * @return the list of tokens with var
    */
    public func getVarTokenList(): ArrayList<VarDecl> {
        return var_Tk_List
    }

    /*
    * Gets the map that stores the default values for vars
    *
    * @return the map of default values with <VarName, DefaultVarValue>
    */
    public func getDefaultVarValueMap(): Map<String, Expr> {
        return defaultVarValueMap
    }

    /*
    * Set the default value of the var
    */
    private func setDefaultValue(varDecl_Tk: VarDecl): Unit { 
        try {
            defaultVarValueMap.put(varDecl_Tk.identifier.value, varDecl_Tk.expr)
        } catch (_: ASTException) {
            ()
        }
    }

    /*
    * Implementation of class var visiting strategy, only visiting class-level vars perform related operations
    *
    * @return true if wants to continue visisting
    */
    override public func visit(varDecl: VarDecl) {
        if (!globalConfig.ignoredVarSet.contains(varDecl.identifier.value)) {
            setDefaultValue(varDecl)
            var_Tk_List.append(varDecl)
        }
    }

    override public func visit(funcDecl: FuncDecl) {
        breakTraverse()
    }
}