-
Notifications
You must be signed in to change notification settings - Fork 205
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
Macro expansion protocol implementation example #2022
Conversation
TypeComparator typeComparator, | ||
ClassIntrospector classIntrospector, | ||
TypeIntrospector typeIntrospector) => | ||
_sendRequest(ExecuteDefinitionsPhaseRequest(macro, declaration, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We cannot send TypeComparator
for example to another isolate, can we? It potentially a large data structure that references a big portion of analyzer or CFE. We probably have to marshal requests back and forth.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Correct - a more real implementation would I think have its own internal rpcs to handle this type of introspection - which would delegate on the executor
end of things to these objects. In fact in my actual original prototype that is exactly what it does.
This is just a starting point, more illustrative of how things are expected to work together than anything else at the moment.
'Reloading macros is not supported by this implementation'); | ||
} | ||
var libMirror = | ||
await currentMirrorSystem().isolate.loadUri(request.library); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we load a macro from string in memory?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I suppose possibly through a data:
uri? But I haven't tried. This api today actually doesn't even work for package:
uris although that is just a bug.
This adds a `MacroExecutor` interface which is intended for use by language frontends (cfe, analyzer) in order to load and execute macros, as well as create library augmention files. This should help more clearly define the role of a frontend when it comes to macros (discovery and introspection), as well as provide a unified api for producing the final library augmentations. It does not actually write files though, we still need to figure out how we want to coordinate that part, and make sure that the CFE and analyzer can consistently talk about these files. This also allows for multiple different implementations in terms of how macros are actually loaded and executed, without the frontends having to know about them. Followup PR here #2022 which starts an implementation using `IsolateMirror.loadUri`.
Followup to #2021. This partially implements one possible version of the MacroExecutor interface, and is a port of my early experiments using
IsolateMirror.loadUri
to load and execute macros.I could fully flesh this out, if the implementation teams think that would be helpful.