Skip to content
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

Merged
merged 26 commits into from
Dec 15, 2021
Merged

Conversation

jakemac53
Copy link
Contributor

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.

@jakemac53 jakemac53 changed the base branch from master to protocol December 9, 2021 21:35
TypeComparator typeComparator,
ClassIntrospector classIntrospector,
TypeIntrospector typeIntrospector) =>
_sendRequest(ExecuteDefinitionsPhaseRequest(macro, declaration,
Copy link
Contributor

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.

Copy link
Contributor Author

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);
Copy link
Contributor

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?

Copy link
Contributor Author

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.

jakemac53 added a commit that referenced this pull request Dec 15, 2021
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`.
Base automatically changed from protocol to master December 15, 2021 17:28
@jakemac53 jakemac53 merged commit 9daaad1 into master Dec 15, 2021
@jakemac53 jakemac53 deleted the protocol-impl branch December 15, 2021 17:30
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.

4 participants