Skip to content

Compiler fails to emit iterator for nested ADTs #306

@faculerena

Description

@faculerena

Context & versions:

Compiler 0.30.0

Steps to reproduce:

Compile this

import CompactStandardLibrary;

export ledger id_to_something: Map<Uint<64>, Uint<64>>;
export ledger id_to_set: Map<Uint<64>, Set<Uint<64>>>;

export circuit set_single(id: Uint<64>, s: Uint<64>): [] {
  id_to_something.insert(disclose(id), disclose(s));
}

export circuit set_set(id: Uint<64>, s: Uint<64>): [] {

  const d_id = disclose(id);

  if (!id_to_set.member(d_id)) {
    id_to_set.insert(d_id, default<Set<Uint<64>>>);
  }

  id_to_set.lookup(d_id).insert(disclose(s));
}

Actual behavior:

Ledger declaration is:

export type Ledger = {
  id_to_something: {
    isEmpty(): boolean;
    size(): bigint;
    member(key_0: bigint): boolean;
    lookup(key_0: bigint): bigint;
    [Symbol.iterator](): Iterator<[bigint, bigint]>
  };
  id_to_set: {
    isEmpty(): boolean;
    size(): bigint;
    member(key_0: bigint): boolean;
    lookup(key_0: bigint): {
      isEmpty(): boolean;
      size(): bigint;
      member(elem_0: bigint): boolean;
      [Symbol.iterator](): Iterator<bigint>
    }
  };
}

Expected behavior:

id_to_set should have an "outer" iterator:

export type Ledger = {
  id_to_something: {
    isEmpty(): boolean;
    size(): bigint;
    member(key_0: bigint): boolean;
    lookup(key_0: bigint): bigint;
    [Symbol.iterator](): Iterator<[bigint, bigint]>
  };
  id_to_set: {
    isEmpty(): boolean;
    size(): bigint;
    member(key_0: bigint): boolean;
    lookup(key_0: bigint): {
      isEmpty(): boolean;
      size(): bigint;
      member(elem_0: bigint): boolean;
      [Symbol.iterator](): Iterator<bigint>
    };
    // This is not being generated
    [Symbol.iterator](): Iterator<[bigint, {
      isEmpty(): boolean;
      size(): bigint;
      member(elem_0: bigint): boolean;
      [Symbol.iterator](): Iterator<bigint>
    }]>
  };
}

Metadata

Metadata

Assignees

Labels

triagedIssues that have been triaged by the team

Type

No type

Projects

Status

Backlog

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions