Spicy
imported-module.h
1 // Copyright (c) 2020-2021 by the Zeek Project. See LICENSE for details.
2 
3 #pragma once
4 
5 #include <string>
6 #include <utility>
7 #include <vector>
8 
9 #include <hilti/rt/filesystem.h>
10 
11 #include <hilti/ast/declaration.h>
12 #include <hilti/ast/expression.h>
13 #include <hilti/ast/id.h>
14 #include <hilti/ast/module.h>
15 #include <hilti/base/result.h>
16 
17 namespace hilti {
18 namespace declaration {
19 
22 public:
23  ImportedModule(ID id, const std::string& search_extension, Meta m = Meta())
24  : NodeBase({std::move(id)}, std::move(m)), _extension(search_extension) {}
25 
26  ImportedModule(ID id, const std::string& search_extension, std::optional<ID> search_scope, Meta m = Meta())
27  : NodeBase({std::move(id)}, std::move(m)), _extension(search_extension), _scope(std::move(search_scope)) {}
28 
29  ImportedModule(ID id, const std::string& search_extension, std::optional<ID> search_scope,
30  std::vector<hilti::rt::filesystem::path> search_dirs, Meta m = Meta())
31  : NodeBase({std::move(id)}, std::move(m)),
32  _extension(search_extension),
33  _scope(std::move(search_scope)),
34  _dirs(std::move(search_dirs)) {}
35 
36  ImportedModule(ID id, hilti::rt::filesystem::path path, Meta m = Meta())
37  : NodeBase({std::move(id)}, std::move(m)), _path(std::move(path)) {}
38 
39  Result<hilti::Module> module() const {
40  if ( _module )
41  return _module->template as<hilti::Module>();
42 
43  return result::Error("module reference not initialized yet");
44  }
45 
46  auto extension() const { return _extension; }
47  auto path() const { return _path; }
48  auto scope() const { return _scope; }
49  const auto& searchDirectories() const { return _dirs; }
50 
51  bool operator==(const ImportedModule& other) const { return id() == other.id(); }
52 
54  bool isConstant() const { return true; }
56  const ID& id() const { return child<ID>(0); }
58  Linkage linkage() const { return Linkage::Private; }
60  std::string displayName() const { return "imported module"; };
62  auto isEqual(const Declaration& other) const { return node::isEqual(this, other); }
63 
65  auto properties() const {
66  return node::Properties{{"extension", _extension.native()},
67  {"path", _path.native()},
68  {"scope", (_scope ? _scope->str() : std::string("-"))}};
69  }
70 
78  static Declaration setModule(const ImportedModule& d, NodeRef n) {
79  auto x = Declaration(d)._clone().as<ImportedModule>();
80  x._module = std::move(n);
81  return x;
82  }
83 
84 private:
85  NodeRef _module;
86  hilti::rt::filesystem::path _extension;
87  hilti::rt::filesystem::path _path;
88  std::optional<ID> _scope;
89  std::vector<hilti::rt::filesystem::path> _dirs;
90 };
91 
92 } // namespace declaration
93 } // namespace hilti
Linkage linkage() const
Definition: imported-module.h:58
Definition: result.h:18
bool isConstant() const
Definition: imported-module.h:54
auto properties() const
Definition: imported-module.h:65
std::string displayName() const
Definition: imported-module.h:60
static Declaration setModule(const ImportedModule &d, NodeRef n)
Definition: imported-module.h:78
const ID & id() const
Definition: imported-module.h:56
Definition: meta.h:18
std::map< std::string, node::detail::PropertyValue > Properties
Definition: node.h:83
auto isEqual(const Declaration &other) const
Definition: imported-module.h:62
Definition: node_ref.h:44
Definition: declaration.h:15
Definition: imported-module.h:21
Definition: id.h:18
Definition: result.h:67
Definition: node.h:318