winglang / wing

A programming language for the cloud ☁️ A unified programming model, combining infrastructure and runtime code into one language ⚡
https://winglang.io
Other
4.97k stars 196 forks source link

Wing swaps structs with the same name, even if they're private scoped #5779

Closed skyrpex closed 3 months ago

skyrpex commented 7 months ago

I tried this:

// main.w
bring cloud;
bring "./resource-a.w" as resource_a;
bring "./resource-b.w" as resource_b;

let resourceA = new resource_a.ResourceA();
let resourceB = new resource_b.ResourceB();

new cloud.Function(inflight () => {
    resourceA.push(
        a: "Hello, a!",
    );

    resourceB.push(
        b: "Hello, b!",
    );
});
// resource-a.w
bring cloud;

struct QueueMessage {
    a: str;
}

pub class ResourceA {
    queue: cloud.Queue;

    new() {
        this.queue = new cloud.Queue();
        this.queue.setConsumer(inflight (message) => {
            let event = QueueMessage.parseJson(message);
            log(unsafeCast(event));
        });
    }

    pub inflight push(event: QueueMessage) {
        this.queue.push(Json.stringify(event));
    }
}
// resource-b.w
bring cloud;

struct QueueMessage {
    b: str;
}

pub class ResourceB {
    queue: cloud.Queue;

    new() {
        this.queue = new cloud.Queue();
        this.queue.setConsumer(inflight (message) => {
            let event = QueueMessage.parseJson(message);
            log(unsafeCast(event));
        });
    }

    pub inflight push(event: QueueMessage) {
        this.queue.push(Json.stringify(event));
    }
}

This happened:

I expected this:

Each resource should use their own private scoped QueueMessage structs.

Is there a workaround?

Renaming the structs.

Anything else?

No response

Wing Version

0.59.8

Node.js Version

No response

Platform(s)

No response

Community Notes

eladb commented 7 months ago

@Chriscbr looks like this is related to modules, no?

meirdev commented 7 months ago

I think it's just a typo, you wrote:

let resourceA = new resource_a.ResourceA();
let resourceB = new resource_a.ResourceA();

Should be:

let resourceA = new resource_a.ResourceA();
let resourceB = new resource_b.ResourceB();
skyrpex commented 6 months ago

I think it's just a typo, you wrote:


let resourceA = new resource_a.ResourceA();

let resourceB = new resource_a.ResourceA();

Should be:


let resourceA = new resource_a.ResourceA();

let resourceB = new resource_b.ResourceB();

Thanks, I fixed the typo in the issue.

monadabot commented 3 months ago

Congrats! :rocket: This was released in Wing 0.74.33.