@Override public void codegenToIL(GenerationEnvironment environment, ILWriter writer) { for (TypedAST ast : exps) { if (ast instanceof ValDeclaration) { environment.register(((ValDeclaration) ast).getName(), ast.getType().generateILType()); writer.wrap( e -> new Let( ((ValDeclaration) ast).getName(), ExpressionWriter.generate( iw -> ((ValDeclaration) ast).getDefinition().codegenToIL(environment, iw)), (Expression) e)); } else if (ast instanceof Declaration) { String genName = GenerationEnvironment.generateVariableName(); List<wyvern.target.corewyvernIL.decl.Declaration> generated = DeclarationWriter.generate( writer, iw -> ast.codegenToIL(new GenerationEnvironment(environment, genName), iw)); writer.wrap(e -> new Let(genName, new New(generated, "this", null), (Expression) e)); } else { ast.codegenToIL(environment, writer); } } }