class IDL::AST::Const

def initialize(_name, _enclosure, params)

def initialize(_name, _enclosure, params)
  super(_name, _enclosure)
  @idltype = params[:type]
  @expression = params[:expression]
  @value = nil
  unless @idltype.is_a?(IDL::Type::ScopedName) && @idltype.is_node?(IDL::AST::TemplateParam)
    raise "Anonymous type definitions are not allowed!" if @idltype.is_anonymous?
    raise "Incomplete type #{@idltype.typename} not allowed here!" unless @idltype.is_complete?
    unless @expression.is_a?(IDL::Expression::ScopedName) && @expression.is_node?(IDL::AST::TemplateParam)
      @value = @idltype.narrow(@expression.value)
    end
  end
end

def instantiate(instantiation_context, _enclosure)

def instantiate(instantiation_context, _enclosure)
  _params = {
    type: @idltype.instantiate(instantiation_context),
    expression: @expression.instantiate(instantiation_context)
  }
  super(instantiation_context, _enclosure, _params)
end

def marshal_dump

def marshal_dump
  super() << @idltype << @expression
end

def marshal_load(vars)

def marshal_load(vars)
  @expression = vars.pop
  @idltype = vars.pop
  super(vars)
  unless @idltype.is_a?(IDL::Type::ScopedName) && @idltype.is_node?(IDL::AST::TemplateParam)
    unless @expression.is_a?(IDL::Expression::ScopedName) && @expression.is_node?(IDL::AST::TemplateParam)
      @value = @idltype.narrow(@expression.value)
    end
  end
end