eclipse-langium / langium

Next-gen language engineering / DSL framework
https://langium.org/
MIT License
665 stars 61 forks source link

`createDefaultCoreModule` isn't compatible with `ExampleGeneratedModule` (`langium` v3.0.0) #1392

Closed Yokozuna59 closed 4 months ago

Yokozuna59 commented 4 months ago

Langium version: 3.0.0 Package name: langium

Steps To Reproduce

  1. Create an example language using langium v3.0.0. (Or use an existing one)
  2. Modify the language service inject function parameter to use createDefaultCoreModule instead of createDefaultModule.

https://github.com/eclipse-langium/langium/blob/be0407ef03397fe04bf2dfbab387e13034d92279/examples/arithmetics/src/language-server/arithmetics-module.ts#L65-L69

Link to code example: You could use the existing examples in the repo.

Just modify those lines of code to this:

 const arithmetics = inject( 
-    createDefaultModule({ shared }), 
+    createDefaultCoreModule({ shared }), 
     ArithmeticsGeneratedModule, 
     ArithmeticsModule 
 );

The current behavior

Errors are thrown.

The errors ``` error TS2345: Argument of type 'Module' is not assignable to parameter of type 'Module | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & InfoAddedServices, LangiumGeneratedCoreServices>'. Types of property 'Grammar' are incompatible. Type 'Module | ((injector: LangiumServices) => Grammar)' is not assignable to type 'Module | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & InfoAddedServices, Grammar> | ((injector: LangiumDefaultCo...'. Type 'Module' is not assignable to type 'Module | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & InfoAddedServices, Grammar> | ((injector: LangiumDefaultCo...'. Type 'Module' is not assignable to type 'Module | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & InfoAddedServices, Grammar>'. Types of property '$type' are incompatible. Type '"Grammar" | ((injector: LangiumServices) => "Grammar")' is not assignable to type '"Grammar" | ((injector: LangiumDefaultCoreServices & LangiumGeneratedCoreServices & { Grammar?: { readonly $type?: "Grammar" | undefined; ... 13 more ...; readonly $document?: LangiumDocument<...> | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & InfoAddedServices) => "Grammar")'. Type '(injector: LangiumServices) => "Grammar"' is not assignable to type '"Grammar" | ((injector: LangiumDefaultCoreServices & LangiumGeneratedCoreServices & { Grammar?: { readonly $type?: "Grammar" | undefined; ... 13 more ...; readonly $document?: LangiumDocument<...> | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & InfoAddedServices) => "Grammar")'. Type '(injector: LangiumServices) => "Grammar"' is not assignable to type '(injector: LangiumDefaultCoreServices & LangiumGeneratedCoreServices & { Grammar?: { readonly $type?: "Grammar" | undefined; ... 13 more ...; readonly $document?: LangiumDocument<...> | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & InfoAddedServices) => "Grammar"'. Types of parameters 'injector' and 'injector' are incompatible. Type 'LangiumDefaultCoreServices & LangiumGeneratedCoreServices & { Grammar?: { readonly $type?: "Grammar" | undefined; ... 13 more ...; readonly $document?: LangiumDocument<...> | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & InfoAddedServices' is not assignable to type 'LangiumServices'. packages/parser/src/language/packet/module.ts(72,5): error TS2345: Argument of type 'Module' is not assignable to parameter of type 'Module | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & PacketAddedServices, LangiumGeneratedCoreServices>'. Types of property 'Grammar' are incompatible. Type 'Module | ((injector: LangiumServices) => Grammar)' is not assignable to type 'Module | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & PacketAddedServices, Grammar> | ((injector: LangiumDefault...'. Type 'Module' is not assignable to type 'Module | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & PacketAddedServices, Grammar> | ((injector: LangiumDefault...'. Type 'Module' is not assignable to type 'Module | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & PacketAddedServices, Grammar>'. Types of property '$type' are incompatible. Type '"Grammar" | ((injector: LangiumServices) => "Grammar")' is not assignable to type '"Grammar" | ((injector: LangiumDefaultCoreServices & LangiumGeneratedCoreServices & { Grammar?: { readonly $type?: "Grammar" | undefined; ... 13 more ...; readonly $document?: LangiumDocument<...> | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & PacketAddedServices) => "Grammar")'. Type '(injector: LangiumServices) => "Grammar"' is not assignable to type '"Grammar" | ((injector: LangiumDefaultCoreServices & LangiumGeneratedCoreServices & { Grammar?: { readonly $type?: "Grammar" | undefined; ... 13 more ...; readonly $document?: LangiumDocument<...> | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & PacketAddedServices) => "Grammar")'. Type '(injector: LangiumServices) => "Grammar"' is not assignable to type '(injector: LangiumDefaultCoreServices & LangiumGeneratedCoreServices & { Grammar?: { readonly $type?: "Grammar" | undefined; ... 13 more ...; readonly $document?: LangiumDocument<...> | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & PacketAddedServices) => "Grammar"'. Types of parameters 'injector' and 'injector' are incompatible. Type 'LangiumDefaultCoreServices & LangiumGeneratedCoreServices & { Grammar?: { readonly $type?: "Grammar" | undefined; ... 13 more ...; readonly $document?: LangiumDocument<...> | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & PacketAddedServices' is not assignable to type 'LangiumServices'. packages/parser/src/language/pie/module.ts(69,5): error TS2345: Argument of type 'Module' is not assignable to parameter of type 'Module | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & PieAddedServices, LangiumGeneratedCoreServices>'. Types of property 'Grammar' are incompatible. Type 'Module | ((injector: LangiumServices) => Grammar)' is not assignable to type 'Module | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & PieAddedServices, Grammar> | ((injector: LangiumDefaultCor...'. Type 'Module' is not assignable to type 'Module | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & PieAddedServices, Grammar> | ((injector: LangiumDefaultCor...'. Type 'Module' is not assignable to type 'Module | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & PieAddedServices, Grammar>'. Types of property '$type' are incompatible. Type '"Grammar" | ((injector: LangiumServices) => "Grammar")' is not assignable to type '"Grammar" | ((injector: LangiumDefaultCoreServices & LangiumGeneratedCoreServices & { Grammar?: { readonly $type?: "Grammar" | undefined; ... 13 more ...; readonly $document?: LangiumDocument<...> | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & PieAddedServices) => "Grammar")'. Type '(injector: LangiumServices) => "Grammar"' is not assignable to type '"Grammar" | ((injector: LangiumDefaultCoreServices & LangiumGeneratedCoreServices & { Grammar?: { readonly $type?: "Grammar" | undefined; ... 13 more ...; readonly $document?: LangiumDocument<...> | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & PieAddedServices) => "Grammar")'. Type '(injector: LangiumServices) => "Grammar"' is not assignable to type '(injector: LangiumDefaultCoreServices & LangiumGeneratedCoreServices & { Grammar?: { readonly $type?: "Grammar" | undefined; ... 13 more ...; readonly $document?: LangiumDocument<...> | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & PieAddedServices) => "Grammar"'. Types of parameters 'injector' and 'injector' are incompatible. Type 'LangiumDefaultCoreServices & LangiumGeneratedCoreServices & { Grammar?: { readonly $type?: "Grammar" | undefined; ... 13 more ...; readonly $document?: LangiumDocument<...> | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & PieAddedServices' is not assignable to type 'LangiumServices'. packages/parser/src/language/sankey/module.ts(76,5): error TS2345: Argument of type 'Module' is not assignable to parameter of type 'Module | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & SankeyAddedServices, LangiumGeneratedCoreServices>'. Types of property 'Grammar' are incompatible. Type 'Module | ((injector: LangiumServices) => Grammar)' is not assignable to type 'Module | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & SankeyAddedServices, Grammar> | ((injector: LangiumDefault...'. Type 'Module' is not assignable to type 'Module | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & SankeyAddedServices, Grammar> | ((injector: LangiumDefault...'. Type 'Module' is not assignable to type 'Module | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & SankeyAddedServices, Grammar>'. Types of property '$type' are incompatible. Type '"Grammar" | ((injector: LangiumServices) => "Grammar")' is not assignable to type '"Grammar" | ((injector: LangiumDefaultCoreServices & LangiumGeneratedCoreServices & { Grammar?: { readonly $type?: "Grammar" | undefined; ... 13 more ...; readonly $document?: LangiumDocument<...> | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & SankeyAddedServices) => "Grammar")'. Type '(injector: LangiumServices) => "Grammar"' is not assignable to type '"Grammar" | ((injector: LangiumDefaultCoreServices & LangiumGeneratedCoreServices & { Grammar?: { readonly $type?: "Grammar" | undefined; ... 13 more ...; readonly $document?: LangiumDocument<...> | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & SankeyAddedServices) => "Grammar")'. Type '(injector: LangiumServices) => "Grammar"' is not assignable to type '(injector: LangiumDefaultCoreServices & LangiumGeneratedCoreServices & { Grammar?: { readonly $type?: "Grammar" | undefined; ... 13 more ...; readonly $document?: LangiumDocument<...> | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & SankeyAddedServices) => "Grammar"'. Types of parameters 'injector' and 'injector' are incompatible. Type 'LangiumDefaultCoreServices & LangiumGeneratedCoreServices & { Grammar?: { readonly $type?: "Grammar" | undefined; ... 13 more ...; readonly $document?: LangiumDocument<...> | undefined; } | undefined; ... 7 more ...; shared?: { ...; } | undefined; } & SankeyAddedServices' is not assignable to type 'LangiumServices' ```

The expected behavior

No errors were thrown, and everything worked perfectly.

msujew commented 4 months ago

@Yokozuna59 This seems to work well for me: image Looking at your error, you might need to ensure that you actually create an instance of LangiumCoreServices, as LangiumServices contains the LSP related services.

Anyway, a reproducible example/link would be appreciated to see what's wrong.

Yokozuna59 commented 4 months ago

@msujew Oh, sorry about that.

I noticed that the service uses the LangiumServices interface, but it didn't throw an error, so I didn't assume there is a LangiumCoreServices.

Thank you.