Add property setters

typecheck-v2
Ibrahim Numanagić 2023-11-20 21:09:50 -08:00
parent 1fc0655ea7
commit 42bb3127f0
7 changed files with 36 additions and 9 deletions

View File

@ -595,6 +595,11 @@ void runLLVMOptimizationPasses(llvm::Module *module, bool debug, bool jit,
}
void verify(llvm::Module *module) {
std::string s;
llvm::raw_string_ostream OS(s);
OS << *module;
OS.flush();
LOG("--> {}", s);
const bool broken = llvm::verifyModule(*module, &llvm::errs());
seqassertn(!broken, "module broken");
}

View File

@ -213,12 +213,11 @@ bool RecordType::isInstantiated() const {
}
std::string RecordType::debugString(char mode) const {
if (name == "Partial" && generics[0].type->canRealize() && false) {
if (name == "Partial" && generics[0].type->canRealize()) {
auto func = getPartialFunc();
std::vector<std::string> gs;
for (auto &a : func->generics)
if (!a.name.empty())
gs.push_back(a.type->debugString(mode));
for (auto &a : generics[2].type->getRecord()->args)
gs.push_back(a->debugString(mode));
std::vector<std::string> as;
int i = 0, gi = 0;
auto known = getPartialMask();
@ -238,7 +237,8 @@ std::string RecordType::debugString(char mode) const {
fnname = func->debugString(mode);
}
return fmt::format("{}[{}{}]", fnname, join(as, ","),
mode == 2 ? fmt::format(";{}", join(gs, ",")) : "");
// mode == 2 ? fmt::format(";{}", join(gs, ",")) :
"");
}
return fmt::format("{}", this->ClassType::debugString(mode));
}

View File

@ -201,7 +201,8 @@ bool TypecheckVisitor::transformCallArgs(std::vector<CallExpr::Arg> &args) {
args.erase(args.begin() + ai);
} else {
if (auto el = args[ai].value->getEllipsis()) {
if (ai + 1 == args.size() && args[ai].name.empty())
if (ai + 1 == args.size() && args[ai].name.empty() &&
el->mode != EllipsisExpr::PIPE)
el->mode = EllipsisExpr::PARTIAL;
}
// Case: normal argument (no expansion)
@ -358,8 +359,7 @@ ExprPtr TypecheckVisitor::callReorderArguments(FuncTypePtr calleeFn, CallExpr *e
std::vector<std::string> names;
std::vector<ExprPtr> values;
if (!part.known.empty()) {
auto e =
transform(N<DotExpr>(N<DotExpr>(N<IdExpr>(part.var), "kwargs"), "args"));
auto e = transform(N<DotExpr>(N<IdExpr>(part.var), "kwargs"), "args");
for (auto &[n, ne] : extractNamedTuple(e)) {
names.emplace_back(n);
values.emplace_back(transform(ne));
@ -623,7 +623,7 @@ ExprPtr TypecheckVisitor::transformTupleGenerator(CallExpr *expr) {
E(Error::CALL_TUPLE_COMPREHENSION, expr->args[0].value->origExpr);
auto g = CAST(expr->args[0].value->origExpr, GeneratorExpr);
if (!g || g->kind != GeneratorExpr::Generator || g->loopCount() != 1)
E(Error::CALL_TUPLE_COMPREHENSION, expr->args[0].value->origExpr);
E(Error::CALL_TUPLE_COMPREHENSION, expr->args[0].value);
g->kind = GeneratorExpr::TupleGenerator;
return transform(g->shared_from_this());
}

View File

@ -964,6 +964,15 @@ TypecheckVisitor::generateSpecialAst(types::FuncType *type) {
N<CallExpr>(N<IdExpr>("__internal__.union_get_data"), N<IdExpr>(selfVar),
NT<IdExpr>(unionTypes[0]->realizedName()))));
ast->suite = suite;
} else if (startswith(ast->name, "__internal__.namedkeys")) {
auto n = type->funcGenerics[0].type->getStatic()->evaluate().getInt();
if (n < 0 || n >= ctx->cache->generatedTupleNames.size())
error("bad namedkeys index");
std::vector<ExprPtr> s;
for (auto &k : ctx->cache->generatedTupleNames[n])
s.push_back(N<StringExpr>(k));
auto suite = N<SuiteStmt>(N<ReturnStmt>(N<TupleExpr>(s)));
ast->suite = suite;
}
return ast;
}

View File

@ -216,6 +216,7 @@ void TypecheckVisitor::visit(PipeExpr *expr) {
// make sure to extract these layers and move them to the pipeline.
// Example: `foo(...)` that is transformed to `foo(unwrap(...))` will become
// `unwrap(...) |> foo(...)`
LOG("--> {}", (*ec));
transform(*ec);
auto layers = findEllipsis(*ec);
seqassert(!layers.empty(), "can't find the ellipsis");

View File

@ -238,6 +238,15 @@ class NamedTuple:
def __getitem__(self, key: Static[str]):
return getattr(self, key)
def __keys__(self):
return __internal__.namedkeys(N)
def __repr__(self):
keys = self.__keys__()
values = [v.__repr__() for v in self.args]
s = ', '.join(f"{keys[i]}: {values[i]}" for i in range(len(keys)))
return f"({s})"
@__internal__
@tuple

View File

@ -187,6 +187,9 @@ class __internal__:
# Tuples
def namedkeys(N: Static[int]):
pass
@pure
@derives
@llvm