/* Copyright (c) 2019 Microsoft Corporation. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Author: Leonardo de Moura */ #include "library/attribute_manager.h" #include "library/constants.h" #include "library/util.h" namespace lean { struct export_attr_data : public attr_data { name m_id; export_attr_data(name const & id): m_id(id) {} export_attr_data() {} virtual unsigned hash() const override { return m_id.hash(); } virtual void parse(expr const & e) override { buffer args; get_app_args(e, args); if (args.size() != 1 || !is_const(extract_mdata(args[0]))) throw parser_error("constant expected", get_pos_info_provider()->get_pos_info_or_some(e)); m_id = const_name(extract_mdata(args[0])); } virtual void print(std::ostream & out) override { out << " " << m_id; } void write(serializer & s) const { s << m_id; } void read(deserializer & d) { m_id = read_name(d); } }; typedef typed_attribute export_attr; static export_attr const & get_export_attr() { return static_cast(get_system_attribute("export")); } optional get_export_name_for(environment const & env, name const & n) { if (auto const & data = get_export_attr().get(env, n)) { return optional(data->m_id); } else { return optional(); } } void initialize_export_attribute() { register_system_attribute(export_attr("export", "name to be used by code generators", [](environment const & env, io_state const &, name const & n, unsigned, bool persistent) { if (!persistent) throw exception("invalid [export] attribute, must be persistent"); auto const & data = *get_export_attr().get(env, n); name it = data.m_id; if (it.is_anonymous()) throw exception("invalid [export] attribute, argument is missing"); while (!it.is_anonymous()) { if (!it.is_string()) throw exception("invalid [export] attribute, identifier cannot be numeric"); it = it.get_prefix(); } constant_info cinfo = env.get(n); if (!cinfo.is_definition()) throw exception("invalid '[export]' use, only definitions can be exported"); return env; })); } void finalize_export_attribute() { } }