Skip to content

feat!: re-design GetTypeDependencies trait & add GetTypeDependencies derive macro #369

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Mar 15, 2025

Conversation

makspll
Copy link
Owner

@makspll makspll commented Mar 15, 2025

Summary

Currently the GetTypeDependencies trait struggles with deeply nested container types.

For example HashMap<Result<T,E>,V> would place bounds of GetTypeRegistration on Result which quickly falls apart with non-'static types like Ref and Mut which don't have GetTypeRegistration implementations.

This overhaul introduces the concept of an Underlying type allowing us to have two type trees, the Real types which we want to end up being registered in the registry, and the Facade types which exist purely as trait carriers:

graph TD;
	subgraph facade
	A1[HashMap<.Val<.T>>] --> A2["`Val<.T>`"]
	A2 --> T
	end

	subgraph underlying
    B1[HashMap<.T>] --> B2["`T`"]
    end
Loading

Thanks to that we can make the two assertions confidently:

  • I want your REAL types in the script function signature, to be Typed and possible to add to the type registry
  • I don't care if your FACADE types are

Also previously, HashMap<T, Val<T>> would not register HashMap<T, T> correctly at all, meaning we now get better dependency coverage!

Migration Guide

  • Any types which you implemented GetTypeDependencies for manually, will need to specify an underlying type, for non-generic types this will just be Self, for types which have recursive registrations, this will be Self<T1::Underlying, T2::Underlying...> etc
  • You can use the derive macro to make this easier instead

@makspll makspll force-pushed the feat/global-type-cache branch 2 times, most recently from e05e626 to 30323b9 Compare March 15, 2025 11:23
@makspll makspll force-pushed the feat/global-type-cache branch from 27455ba to 7383302 Compare March 15, 2025 11:40
@makspll makspll changed the title feat! add type cache table global, and refactor GetTypeDependencies… feat!: re-design GetTypeDependencies trait allowing more complex script argument types Mar 15, 2025
@makspll makspll changed the title feat!: re-design GetTypeDependencies trait allowing more complex script argument types feat!: re-design GetTypeDependencies trait & Add smart derive macro. Mar 15, 2025
@makspll makspll changed the title feat!: re-design GetTypeDependencies trait & Add smart derive macro. feat!: re-design GetTypeDependencies trait & Add derive macro. Mar 15, 2025
@makspll makspll changed the title feat!: re-design GetTypeDependencies trait & Add derive macro. feat!: re-design GetTypeDependencies trait & add derive macro. Mar 15, 2025
@makspll makspll changed the title feat!: re-design GetTypeDependencies trait & add derive macro. feat!: re-design GetTypeDependencies trait & add derive macro Mar 15, 2025
@makspll makspll changed the title feat!: re-design GetTypeDependencies trait & add derive macro feat!: re-design GetTypeDependencies trait & add GetTypeDependencies derive macro Mar 15, 2025
@makspll makspll enabled auto-merge (squash) March 15, 2025 12:30
@makspll makspll merged commit 2dc6558 into main Mar 15, 2025
20 checks passed
@makspll makspll deleted the feat/global-type-cache branch March 15, 2025 12:46
@github-actions github-actions bot mentioned this pull request Mar 12, 2025
makspll added a commit that referenced this pull request Mar 15, 2025
)

# Summary
using `get_type_by_name` is slightly cumbersome. In order to not repeat
yourself AND avoid polluting globals, you need to call:
```lua
local Type = world.get_type_by_name("MYType")
```
in EVERY callback, or alternatively do it once at the top of your
script, but doing that goes against the advice to not run code in the
body of the script outside of any functions.

this PR adds a global `types` cache, which lets you do:

```lua
types.MyType
```

or for more complex types:

```lua
types["MyGenericType<MyOtherType>"]
```

The types populated in the cache are equivalent to the types available
as static globals with the addition of generic types.

The change makes use of changes in #369 to correctly type this global as
`HashMap<String, ScriptComponentRegistration |
ScriptResourceRegistration | ScriptTypeRegistration >` meaning once we
start generating decleration files for lua we will have the correct
types at hand

# Migration Guide
- Not a breaking change, but you should change instances where you call
`get_type_by_name("T")` to `types["T"]` etc. this will increase
performance as well as make your scripts easier to read!
makspll added a commit that referenced this pull request Mar 16, 2025
## 🤖 New release

* `bevy_mod_scripting_derive`: 0.9.11 -> 0.10.0
* `bevy_mod_scripting_core`: 0.9.11 -> 0.10.0 (✓ API compatible changes)
* `bevy_mod_scripting_lua`: 0.9.11 -> 0.10.0 (✓ API compatible changes)
* `bevy_mod_scripting_rhai`: 0.9.11 -> 0.10.0 (✓ API compatible changes)
* `bevy_mod_scripting_functions`: 0.9.11 -> 0.10.0 (✓ API compatible
changes)
* `ladfile`: 0.3.1 -> 0.4.0 (⚠ API breaking changes)
* `mdbook_lad_preprocessor`: 0.1.3 -> 0.1.4 (✓ API compatible changes)
* `ladfile_builder`: 0.2.5 -> 0.2.6 (✓ API compatible changes)
* `bevy_mod_scripting`: 0.9.11 -> 0.10.0 (✓ API compatible changes)

### ⚠ `ladfile` breaking changes

```text
--- failure constructible_struct_adds_field: externally-constructible struct adds field ---

Description:
A pub struct constructible with a struct literal has a new pub field. Existing struct literals must be updated to include the new field.
        ref: https://doc.rust-lang.org/reference/expressions/struct-expr.html
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.40.0/src/lints/constructible_struct_adds_field.ron

Failed in:
  field LadInstance.type_kind in /tmp/.tmpHaT0UL/bevy_mod_scripting/crates/ladfile/src/lib.rs:97

--- failure enum_missing: pub enum removed or renamed ---

Description:
A publicly-visible enum cannot be imported by its prior path. A `pub use` may have been removed, or the enum itself may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.40.0/src/lints/enum_missing.ron

Failed in:
  enum ladfile::LadArgumentKind, previously in file /tmp/.tmpAHPNdG/ladfile/src/lib.rs:171

--- failure struct_pub_field_missing: pub struct's pub field removed or renamed ---

Description:
A publicly-visible struct has at least one public field that is no longer available under its prior name. It may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.40.0/src/lints/struct_pub_field_missing.ron

Failed in:
  field type_id of struct LadInstance, previously in file /tmp/.tmpAHPNdG/ladfile/src/lib.rs:97
```

<details><summary><i><b>Changelog</b></i></summary><p>

## `bevy_mod_scripting_derive`

<blockquote>

##
[0.10.0](bevy_mod_scripting_derive-v0.9.11...bevy_mod_scripting_derive-v0.10.0)
- 2025-03-16

### Added

- [**breaking**] re-design `GetTypeDependencies` trait & add
`GetTypeDependencies` derive macro
([#369](#369))
</blockquote>

## `bevy_mod_scripting_core`

<blockquote>

##
[0.10.0](bevy_mod_scripting_core-v0.9.11...bevy_mod_scripting_core-v0.10.0)
- 2025-03-16

### Added

- *(ladfile)* improve globals in LAD format
([#372](#372))
- add global `types` cache making `get_type_by_name` redundant
([#370](#370))
- [**breaking**] re-design `GetTypeDependencies` trait & add
`GetTypeDependencies` derive macro
([#369](#369))
- shorten import paths
([#367](#367))
- Add missing `luau` extension, improve extension configuration options
([#366](#366))
- allow lua scripts to insert `ScriptComponent`'s
([#359](#359))
- ✨ Parallelizable Script Systems with `Res` and `Query`
parameters & Schedule debugging utilities
([#361](#361))

### Fixed

- supported extensions not including default extensions [SKIP_CHANGELOG]
([#373](#373))
- unit enum variants other than `Option::None` being converted into
`ScriptValue::Unit`
([#360](#360))

### Other

- [**breaking**] Merge `ScriptContexts<T>` into `Scripts<T>` + Remove
`Sync` bound from Contexts
([#350](#350))
</blockquote>

## `bevy_mod_scripting_lua`

<blockquote>

##
[0.10.0](bevy_mod_scripting_lua-v0.9.11...bevy_mod_scripting_lua-v0.10.0)
- 2025-03-16

### Added

- Add missing `luau` extension, improve extension configuration options
([#366](#366))

### Fixed

- [**breaking**] script contexts being completely overwritten on a
re-load ([#345](#345))

### Other

- [**breaking**] Merge `ScriptContexts<T>` into `Scripts<T>` + Remove
`Sync` bound from Contexts
([#350](#350))
</blockquote>

## `bevy_mod_scripting_rhai`

<blockquote>

##
[0.10.0](bevy_mod_scripting_rhai-v0.9.11...bevy_mod_scripting_rhai-v0.10.0)
- 2025-03-16

### Added

- Add missing `luau` extension, improve extension configuration options
([#366](#366))
- ✨ Parallelizable Script Systems with `Res` and `Query`
parameters & Schedule debugging utilities
([#361](#361))

### Fixed

- rhai reloading behavior regression from #345 [SKIP_CHANGELOG]
([#351](#351))
- [**breaking**] script contexts being completely overwritten on a
re-load ([#345](#345))

### Other

- [**breaking**] Merge `ScriptContexts<T>` into `Scripts<T>` + Remove
`Sync` bound from Contexts
([#350](#350))
</blockquote>

## `bevy_mod_scripting_functions`

<blockquote>

##
[0.10.0](bevy_mod_scripting_functions-v0.9.11...bevy_mod_scripting_functions-v0.10.0)
- 2025-03-16

### Added

- add global `types` cache making `get_type_by_name` redundant
([#370](#370))
- ✨ Parallelizable Script Systems with `Res` and `Query`
parameters & Schedule debugging utilities
([#361](#361))
</blockquote>

## `ladfile`

<blockquote>

##
[0.4.0](v0.3.1-ladfile...v0.4.0-ladfile)
- 2025-03-16

### Added

- *(ladfile)* improve globals in LAD format
([#372](#372))
</blockquote>

## `mdbook_lad_preprocessor`

<blockquote>

##
[0.1.4](v0.1.3-mdbook_lad_preprocessor...v0.1.4-mdbook_lad_preprocessor)
- 2025-03-16

### Added

- *(ladfile)* improve globals in LAD format
([#372](#372))
</blockquote>

## `ladfile_builder`

<blockquote>

##
[0.2.6](v0.2.5-ladfile_builder...v0.2.6-ladfile_builder)
- 2025-03-16

### Added

- *(ladfile)* improve globals in LAD format
([#372](#372))
</blockquote>

## `bevy_mod_scripting`

<blockquote>

##
[0.10.0](v0.9.11...v0.10.0)
- 2025-03-16

### Added

- add global `types` cache making `get_type_by_name` redundant
([#370](#370))
- ✨ Parallelizable Script Systems with `Res` and `Query`
parameters & Schedule debugging utilities
([#361](#361))
- Add missing `luau` extension, improve extension configuration options
([#366](#366))
- *(ladfile)* improve globals in LAD format
([#372](#372))
- [**breaking**] re-design `GetTypeDependencies` trait & add
`GetTypeDependencies` derive macro
([#369](#369))
- shorten import paths
([#367](#367))
- allow lua scripts to insert `ScriptComponent`'s
([#359](#359))

### Fixed

- rhai reloading behavior regression from #345 [SKIP_CHANGELOG]
([#351](#351))
- [**breaking**] script contexts being completely overwritten on a
re-load ([#345](#345))
- supported extensions not including default extensions [SKIP_CHANGELOG]
([#373](#373))
- unit enum variants other than `Option::None` being converted into
`ScriptValue::Unit`
([#360](#360))

### Other

- [**breaking**] Merge `ScriptContexts<T>` into `Scripts<T>` + Remove
`Sync` bound from Contexts
([#350](#350))
</blockquote>


</p></details>

---
This PR was generated with
[release-plz](https://github.com/release-plz/release-plz/).

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Maksymilian Mozolewski <[email protected]>
This was referenced Mar 16, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant