helper.ha (2648B)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
// Copyright (C) 2025 Lou Woell <lou@repetitions.de>
// This program is free software: you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free Software
// Foundation, version 3.
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
// details.
// You should have received a copy of the GNU General Public License along with
// this program. If not, see <https://www.gnu.org/licenses/>.
use dirs;
use fmt;
use getopt;
use hare::module;
use os;
use strings;
const help: []getopt::help = [
"help with hare",
('h', "show help"),
('p', "path", "append to harepath"),
('P', "return harepath"),
('t', "tagset", "set/unset build tags"),
"subcommand",
"args",
("list", [
"list symbols in module",
('u', "list unexported symbols"),
"module",
]: []getopt::help ),
("resolve", [
"resolve namespace for identifier",
"identifier",
"file"
]: []getopt::help),
("locate", [
"return location of declaration for identifier",
"identifier",
]: []getopt::help),
("list-modules", [
"list all modules in current harepath",
]: []getopt::help),
("find-references", [
"find all references to symbol",
"identifier",
"path",
]: []getopt::help),
];
export fn main () void = {
let ppath = false;
const cmd = getopt::parse(os::args, help...);
defer getopt::finish(&cmd);
const ctx = module::context {
harepath = harepath(),
harecache = match (os::getenv("HARECACHE")) {
case let s: str =>
yield s;
case void =>
yield dirs::cache("hare");
},
tags = default_tags(),
};
defer free(ctx.tags);
for (let (k, v) .. cmd.opts) {
switch (k) {
case 'h' =>
getopt::printhelp(os::stdout, "harehelper", help)!;
os::exit(0);
case 'p' =>
ctx.harepath = strings::join(":", ctx.harepath, v)!;
case 'P' =>
ppath = true;
case 't' =>
merge_tags(&ctx.tags, v)!;
case => void;
};
};
if(ppath) {
fmt::print(ctx.harepath)!;
os::exit(0);
};
match :cmd (cmd.subcmd) {
case void => void;
case let c: (str, *getopt::command) =>
switch (c.0) {
case "resolve" =>
resolve(*c.1, &ctx);
case "list" =>
list(*c.1, &ctx);
case "list-modules" =>
list_modules(&ctx);
case "locate" =>
locate(*c.1, &ctx);
case "find-references" =>
find_refs(*c.1, &ctx);
case =>
fmt::errorfln("Error: {} not a valid subcommand.\n")!;
yield :cmd;
};
os::exit(0);
};
getopt::printusage(os::stderr, "harehelper", help)!;
os::exit(1);
};
|