boschresearch / blech

Blech is a language for developing reactive, real-time critical embedded software.
Apache License 2.0
72 stars 5 forks source link

Detect missing import in type checker #48

Open FriedrichGretz opened 3 years ago

FriedrichGretz commented 3 years ago

See line 488 in TyChkAmendment.fs

Expected behaviour Error message

schorg commented 3 years ago

Example: 3 Modules in an import chain:

// file service.blc
module exposes S

struct S
    var b: bool
end
---
// file client.blc
import s "service"

module exposes C

const C: s.S = { b = true }
---
// file main.blc
import c "client"
// import s "service"

module exposes Main
activity Main ()
    let flag = c.C
    // let flag2: s.S = c.C
    await true
end

let flag = c.C has a type the originates from service, but it does not have a name here.

After a closer inspection. I tend to not flag this as an error. The program is not really wrong and does also not leak any hidden information. As soon as you need a type declaration or access to a function from service, the import s "service" will be required - simply for name checking purposes. In the C implementation the .h-file is also included indirectly. The language server still can refer to file service.

It's not perfect - but it does not break any semantic guarantees. Actually there is no perfect solution: How should the import be named? Is import _ "service" correct, only to make the dependency explicit.

Proposal: We should live with the implicit dependency.

FriedrichGretz commented 3 years ago

Ok, let's document this in the manual and then close the issue.