Spicy
imported-module.h
1 // Copyright (c) 2020-2021 by the Zeek Project. See LICENSE for details.
2 
3 #pragma once
4 
5 #include <memory>
6 #include <string>
7 #include <utility>
8 #include <vector>
9 
10 #include <hilti/rt/filesystem.h>
11 
12 #include <hilti/ast/declaration.h>
13 #include <hilti/ast/expression.h>
14 #include <hilti/ast/id.h>
15 #include <hilti/ast/module.h>
16 #include <hilti/base/result.h>
17 
18 namespace hilti {
19 
20 class Unit;
21 
22 namespace declaration {
23 
35 public:
36  ImportedModule(ID id, const std::string& parse_extension, Meta m = Meta())
37  : DeclarationBase({std::move(id)}, std::move(m)), _parse_extension(parse_extension) {}
38 
39  ImportedModule(ID id, const std::string& parse_extension, std::optional<ID> search_scope, Meta m = Meta())
40  : DeclarationBase({std::move(id)}, std::move(m)),
41  _parse_extension(parse_extension),
42  _scope(std::move(search_scope)) {}
43 
44  ImportedModule(ID id, const std::string& parse_extension, std::optional<ID> search_scope,
45  std::vector<hilti::rt::filesystem::path> search_dirs, Meta m = Meta())
46  : DeclarationBase({std::move(id)}, std::move(m)),
47  _parse_extension(parse_extension),
48  _scope(std::move(search_scope)),
49  _dirs(std::move(search_dirs)) {}
50 
51  ImportedModule(ID id, hilti::rt::filesystem::path path, Meta m = Meta())
52  : DeclarationBase({std::move(id)}, std::move(m)), _parse_extension(path.extension()), _path(path) {}
53 
54  hilti::rt::filesystem::path parseExtension() const { return _parse_extension; }
55 
56  auto path() const { return _path; }
57  auto scope() const { return _scope; }
58  auto unit() const { return _unit.lock(); }
59  const auto& searchDirectories() const { return _dirs; }
60 
62  void setUnit(std::shared_ptr<Unit> unit) { _unit = std::move(unit); }
63 
64  bool operator==(const ImportedModule& other) const { return id() == other.id(); }
65 
67  bool isConstant() const { return true; }
69  const ID& id() const { return child<ID>(0); }
71  Linkage linkage() const { return Linkage::Private; }
73  std::string displayName() const { return "imported module"; };
75  auto isEqual(const Declaration& other) const { return node::isEqual(this, other); }
76 
79 
80 private:
81  std::weak_ptr<hilti::Unit> _unit;
82  hilti::rt::filesystem::path _parse_extension;
83  hilti::rt::filesystem::path _path;
84  std::optional<ID> _scope;
85  std::vector<hilti::rt::filesystem::path> _dirs;
86 };
87 
88 } // namespace declaration
89 } // namespace hilti
Linkage linkage() const
Definition: imported-module.h:71
Definition: declaration.h:53
bool isConstant() const
Definition: imported-module.h:67
std::string displayName() const
Definition: imported-module.h:73
void setUnit(std::shared_ptr< Unit > unit)
Definition: imported-module.h:62
const ID & id() const
Definition: imported-module.h:69
Definition: meta.h:18
Definition: declaration.h:87
std::map< std::string, node::detail::PropertyValue > Properties
Definition: node.h:99
auto isEqual(const Declaration &other) const
Definition: imported-module.h:75
node::Properties properties() const
Definition: imported-module.cc:9
Definition: imported-module.h:34
Definition: id.h:18