Skip to content

Commit 28e3b1a

Browse files
committed
start implementing recursive repository scan
1 parent 13cbe3e commit 28e3b1a

18 files changed

+274
-211
lines changed

CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,11 @@ add_library(hk_objects OBJECT
4040
"${CMAKE_CURRENT_SOURCE_DIR}/src/ast/expression_node.hpp"
4141
"${CMAKE_CURRENT_SOURCE_DIR}/src/ast/import_declaration_node.cpp"
4242
"${CMAKE_CURRENT_SOURCE_DIR}/src/ast/import_declaration_node.hpp"
43+
"${CMAKE_CURRENT_SOURCE_DIR}/src/ast/import_library_declaration_node.hpp"
44+
"${CMAKE_CURRENT_SOURCE_DIR}/src/ast/import_module_declaration_node.hpp"
45+
"${CMAKE_CURRENT_SOURCE_DIR}/src/ast/import_repository_declaration_node.hpp"
4346
"${CMAKE_CURRENT_SOURCE_DIR}/src/ast/module_declaration_node.hpp"
47+
"${CMAKE_CURRENT_SOURCE_DIR}/src/ast/module_node.cpp"
4448
"${CMAKE_CURRENT_SOURCE_DIR}/src/ast/module_node.hpp"
4549
"${CMAKE_CURRENT_SOURCE_DIR}/src/ast/node.hpp"
4650
"${CMAKE_CURRENT_SOURCE_DIR}/src/ast/nodes.hpp"
@@ -104,6 +108,8 @@ add_library(hk_objects OBJECT
104108
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/module.hpp"
105109
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/path.cpp"
106110
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/path.hpp"
111+
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/repository_url.cpp"
112+
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/repository_url.hpp"
107113
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/semantic_version.cpp"
108114
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/semantic_version.hpp"
109115
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/sha.cpp"

src/ast/import_declaration_node.hpp

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
#include "node.hpp"
55
#include "utility/fqname.hpp"
66
#include "utility/generator.hpp"
7-
#include "utility/remote_repo_url.hpp"
87

98

109
namespace hk::ast {
@@ -13,36 +12,6 @@ class import_declaration_node : public node {
1312
public:
1413
using node::node;
1514

16-
enum class kind_type {
17-
/** Import a module.
18-
*/
19-
mod,
20-
21-
/** Import a FFI/system library.
22-
*/
23-
lib,
24-
25-
/** Import a repository.
26-
*/
27-
repository
28-
};
29-
30-
/** The kind of import
31-
*/
32-
kind_type kind = kind_type::mod;
33-
34-
/** The fully qualified name of the imported module.
35-
*/
36-
fqname name = {};
37-
38-
/** The name to import the module to.
39-
*/
40-
std::string as = {};
41-
42-
remote_repo_url url = {};
43-
44-
private:
45-
4615
};
4716

4817
using import_declaration_node_ptr = std::unique_ptr<import_declaration_node>;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
2+
#include "import_declaration_node.hpp"
3+
4+
namespace hk::ast {
5+
6+
class import_library_declaration_node : public import_declaration_node {
7+
public:
8+
using import_declaration_node::import_declaration_node;
9+
10+
import_library_declaration_node(file_location first, file_location last, std::filesystem::path path) :
11+
import_declaration_node(first, last), path(path)
12+
{
13+
}
14+
15+
std::filesystem::path path;
16+
};
17+
18+
} // namespace hk::ast
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
2+
#include "import_declaration_node.hpp"
3+
4+
namespace hk::ast {
5+
6+
class import_module_declaration_node : public import_declaration_node {
7+
public:
8+
using import_declaration_node::import_declaration_node;
9+
10+
import_module_declaration_node(file_location first, file_location last, fqname name, fqname as) :
11+
import_declaration_node(first, last), name(name), as(as)
12+
{
13+
}
14+
15+
fqname name;
16+
fqname as;
17+
18+
private:
19+
};
20+
21+
} // namespace hk::ast
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
2+
#include "import_declaration_node.hpp"
3+
#include "utility/repository_url.hpp"
4+
5+
namespace hk::ast {
6+
7+
class import_repository_declaration_node : public import_declaration_node {
8+
public:
9+
using import_declaration_node::import_declaration_node;
10+
11+
import_repository_declaration_node(file_location first, file_location last, repository_url url) :
12+
import_declaration_node(first, last), url(url)
13+
{
14+
}
15+
16+
repository_url url;
17+
};
18+
19+
} // namespace hk::ast

src/ast/module_node.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11

22
#include "module_node.hpp"
3+
#include "import_repository_declaration_node.hpp"
34

4-
namespace hk {
5+
namespace hk::ast {
56

6-
[[nodiscard]] generator<remote_repo_url> remote_repositories() const
7+
[[nodiscard]] generator<repository_url> module_node::remote_repositories() const
78
{
8-
9+
for (auto const& import : imports) {
10+
if (auto repository_import_ptr = dynamic_cast<import_repository_declaration_node const*>(import.get())) {
11+
co_yield repository_import_ptr->url;
12+
}
13+
}
914
}
1015

1116
}

src/ast/module_node.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#include "module_declaration_node.hpp"
66
#include "import_declaration_node.hpp"
77
#include "error/error_list.hpp"
8-
#include "utility/remote_repo_url.hpp"
8+
#include "utility/repository_url.hpp"
99
#include <memory>
1010
#include <vector>
1111
#include <chrono>
@@ -22,9 +22,6 @@ class module_node : public node {
2222
parsed,
2323
};
2424

25-
[[nodiscard]] generator<remote_repo_url> remote_repositories() const;
26-
27-
private:
2825
/** List of errors found.
2926
*/
3027
error_list errors;
@@ -51,6 +48,9 @@ class module_node : public node {
5148
module_declaration_node_ptr declaration;
5249
std::vector<import_declaration_node_ptr> imports;
5350
std::vector<node_ptr> body;
51+
52+
[[nodiscard]] generator<repository_url> remote_repositories() const;
53+
5454
};
5555

5656
using module_node_ptr = std::unique_ptr<module_node>;

src/ast/nodes.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22
#pragma once
33

44
#include "expression_node.hpp"
5+
#include "import_library_declaration_node.hpp"
6+
#include "import_module_declaration_node.hpp"
7+
#include "import_repository_declaration_node.hpp"
58
#include "import_declaration_node.hpp"
69
#include "module_declaration_node.hpp"
710
#include "module_node.hpp"
811
#include "node.hpp"
9-
#include "package_import_node.hpp"

src/ast/package_import_node.hpp

Lines changed: 0 additions & 40 deletions
This file was deleted.

src/parser/parse_import_declaration.cpp

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,66 +13,77 @@ namespace hk {
1313
}
1414
++it;
1515

16-
auto r = std::make_unique<ast::import_declaration_node>(first);
16+
auto r = std::unique_ptr<ast::import_declaration_node>{};
1717

1818
if (*it == "git") {
19-
r->kind = ast::import_declaration_node::kind_type::git;
2019
++it;
2120

21+
auto url = std::string{};
2222
if (*it == token::string_literal) {
23-
r->path = it->text;
23+
url = it->text;
2424
++it;
2525
} else {
2626
return e.add<error::missing_import_git_declaration_url>(first, it->last);
2727
}
2828

29+
auto rev = std::string{};
2930
if (*it == token::string_literal) {
30-
r->branch = it->text;
31+
rev = it->text;
3132
++it;
3233
} else {
3334
return e.add<error::missing_import_git_declaration_branch>(first, it->last);
3435
}
3536

37+
auto repository = repository_url{repository_type::git, std::move(url), std::move(rev)};
38+
r = std::make_unique<ast::import_repository_declaration_node>(first, it->last, std::move(repository));
39+
3640
} else if (*it == "zip") {
37-
r->kind = ast::import_declaration_node::kind_type::zip;
3841
++it;
3942

43+
auto url = std::string{};
4044
if (*it == token::string_literal) {
41-
r->path = it->text;
45+
url = it->text;
4246
++it;
4347
} else {
4448
return e.add<error::missing_import_zip_declaration_path>(first, it->last);
4549
}
4650

51+
auto repository = repository_url{repository_type::zip, it->text};
52+
r = std::make_unique<ast::import_repository_declaration_node>(first, it->last, std::move(repository));
53+
4754
} else if (*it == "lib") {
48-
r->kind = ast::import_declaration_node::kind_type::lib;
4955
++it;
5056

57+
auto path = std::string{};
5158
if (*it == token::string_literal) {
52-
r->path = it->text;
59+
path = it->text;
5360
++it;
5461
} else {
5562
return e.add<error::missing_import_lib_declaration_path>(first, it->last);
5663
}
5764

58-
} else if (auto fqname = parse_fqname(it, e)) {
59-
r->kind = ast::import_declaration_node::kind_type::mod;
60-
r->name = std::move(fqname).value();
65+
r = std::make_unique<ast::import_library_declaration_node>(first, it->last, path);
66+
67+
} else if (auto name = parse_fqname(it, e)) {
6168
++it;
6269

70+
auto as = hk::fqname{};
6371
if (*it == "as") {
6472
++it;
6573

66-
if (*it == token::string_literal) {
67-
r->as = it->text;
74+
if (auto as = parse_fqname(it, e)) {
75+
as = std::move(as).value();
6876

6977
} else {
7078
return e.add<error::missing_import_mod_declaration_as_name>(first, it->last);
7179
}
7280
}
7381

74-
} else if (fqname.error()) {
75-
return std::unexpected{fqname.error()};
82+
r = std::make_unique<ast::import_module_declaration_node>(first, it->last, std::move(name).value(), as);
83+
84+
} else if (name.error()) {
85+
return std::unexpected{name.error()};
86+
7687
} else {
7788
return e.add<error::missing_import_mod_declaration_name>(first, it->last);
7889
}
@@ -85,4 +96,4 @@ namespace hk {
8596
return e.add<error::missing_import_declaration_semicolon>(first, it->last);
8697
}
8798

88-
}
99+
} // namespace hk

0 commit comments

Comments
 (0)