* [Dependency] source generator
No more reflection, no more codegen at runtime
Also various changes to Roslyn helpers to make this easier to write.
Requires all types with dependencies to be partial and not have readonly dependency fields. An analyzer enforces this at warning level, the previous injection strategies have remained in the code *for now* as a fallback.
No fallback is available for [field: Dependency] properties, due to a Roslyn bug.
Code Fixes exist. We love Roslyn
* Apply dependencies generator changes to all code
* Release notes
* Preprocessor got hands
* Handle nullable dependencies
These are bad but gotta deal with it.
* Apply suggestions from code review
Co-authored-by: Moony <moony@hellomouse.net>
* Fine, let's not use collection expressions
---------
Co-authored-by: Moony <moony@hellomouse.net>
This means we don't have to JIT a bunch of UIs that you might not open, reducing memory usage and startup overhead.
One (1) UI is always JITed in another thread before prototype UIs are loaded, so as to warm up the JIT machinery. Said type is DropDownDebugConsole which always gets used anyways so there's no harm in it.
In total, these changes save more than a second of startup time for me.
* Move RobustXaml to a shared package
In a near-future change, I'll make it possible to optionally link to
this from Robust.Client, which will allow JIT compiling XAML.
Also upgrade it to a version of .NET that supports nullability
annotations.
* Re-namespace packages
* Add a JIT compiler, plus hooks that call into it
In Debug, after this change, all XAML will be hot reloaded once every
time an assembly is reloaded.
The new code is compiled with SRE and is _not_ sandboxed -- this is not
suitable to run against prod.
In Release, the hot reload path is totally skipped, using the same trick
as SmugLeaf used in an earlier attempt to implement this functionality.
* Hot reload: watcher
This is a bit of a horror, but there's not in-engine support for
identifying the source tree or the XAML files in it.
* Put everything dangerous behind conditional comp
* Code cleanup, docs
* Fix a bad comment
* Deal a little better with crashes in the watcher
* Make reload failures Info, since they're expected
They were previously causing the integration tests to flag, even though
"a few types fail hot reloading because they're internal" is expected
behavior.
* Fix an unnecessary null check
I removed the ability for CompileCore to return null.
* injectors: null! strings, default primitives
* Tidy documentation (thanks, PJB!)
* Reinstate netstandard2.0, abolish Pidgin
* Internal-ize all of Robust.Xaml
* Add a cautionary note to Sandbox.yml
* Shuffle around where conditional compilation occurs
* Privatize fields in XamlImplementationStorage
* Internalize XamlJitDelegate
* Inline some remarks. No cond. comp in Robust.Xaml
* Use file-scoped namespaces
They aren't allowed at Language Level 8.0. (which I arbitrarily picked
for Robust.Xaml because it's the oldest one that would work)
* Bump language level for R.Xaml, file namespaces
* Force hot reloading off for integration tests
* Fix bizarre comment/behavior in XamlImplementationStorage
* Consistently use interfaces, even in generated code
* Update Robust.Client/ClientIoC.cs
---------
Co-authored-by: Pieter-Jan Briers <pieterjan.briers@gmail.com>