Commit Graph

173 Commits

Author SHA1 Message Date
Richard Wei
01e6fe2936 [Macros] Code item macros
Add support for declaring and expanding code item macros.  Add experimental feature flag `CodeItemMacros`.
2023-04-04 09:54:57 -07:00
Doug Gregor
1715963540 Merge pull request #64892 from DougGregor/peer-macro-scope-tree-fix 2023-04-04 09:03:46 -07:00
Doug Gregor
f12d1f8652 [ASTScope] Adjust parent location for peer macro to after its attached decl.
Peer macro produce declarations that are semantically alongside the
declaration to which the macro is attached. However, the source
location used for constructing the scope tree was based on the
attribute itself, which meant it was inside the scope of the
declaration to which the macro was attached. This lead to incorrect
unqualified name lookup; in the example that's now a test case, this
meant that the `Self` of the protocol to which the macro was attached
was visible from within the peer declaration. Hilarity (in the form of
a type checker crash) ensued.

Fix the location used for constructing the scope tree of peer macros to
be right after the attached declaration. Fixes rdar://107228586.
2023-04-03 21:27:34 -07:00
Ben Barham
c1b08e591e Merge pull request #64814 from bnbarham/empty-trivia
[Test] Fix up macros using optional trivia API
2023-04-03 09:17:23 -07:00
Doug Gregor
5e4118ad97 Allow expansion of member macros on extensions and make those names visible.
Ensure that name lookup triggers the expansion of member macros on
extensions, so we can find those names. And fix a bug that caused
expansion of member macros to crash.
2023-03-31 23:29:40 -07:00
Ben Barham
2ad8db4ad4 [Test] Fix up macros using optional trivia API
https://github.com/apple/swift-syntax/pull/1477 makes `leadingTrivia`
and `trailingTrivia` non-optional.
2023-03-31 11:57:02 -07:00
Alex Hoppen
962664a2e5 [ASTGen/Macros] Adjustments to split FunctionParameterSyntax into multiple nodes for function parameters, closure parameters and enum parameters
Companion of https://github.com/apple/swift-syntax/pull/1455
2023-03-30 08:31:26 -07:00
Doug Gregor
82de47c494 [Macros] Fix name lookup in macro expansion declaration arguments.
Teach ASTScope to create child nodes for each of the arguments of a
macro expansion declaration, so that we can perform name lookup into
them. Otherwise, we cannot have nontrivial closures in arguments to a
macro expansion declaration.

Fixes rdar://107388151.
2023-03-30 00:10:20 -07:00
Doug Gregor
7c7459ac6b Merge pull request #64641 from DougGregor/macro-replacement-expansion 2023-03-29 20:47:30 -07:00
Doug Gregor
49277f7e89 [Macros] Move most macro definition checking into ASTGen
In preparation for supporting macros that are defined in terms of other
macros, adopt macro definition checking provided by the
`MacroDeclSyntax.checkDefinition` operation (implemented in
swift-syntax). Use this in lieu of the checking on the C++ side.

This required me to finally fix an issue with the source ranges for
Fix-Its, where we were replacing the leading/trailing trivia of nodes
along with the node itself, even though that's incorrect: we should
only replce the node itself, and there are other Fix-It kinds for
replacing leading or trailing trivia.
2023-03-29 16:30:42 -07:00
Doug Gregor
a2737df55a [Macros] Unpack DiagnosticsError into separate diagnostics
Fixes rdar://107289985.
2023-03-29 15:28:52 -07:00
swift-ci
0473879b04 Merge pull request #64184 from DougGregor/macro-unique-name-lookup-type-reconstruction
[Macros] Ensure that name lookup can find uniquely-generated macro names
2023-03-07 15:41:16 -08:00
Richard Wei
aea93fc8ef Merge pull request #63962 from rxwei/rename-createuniquename
[Macros] Rename `createUniqueName` to `makeUniqueName`
2023-03-07 15:34:03 -08:00
Doug Gregor
6ab3bc27f3 Ensure that we lazily find macro-unique names in nominal type context 2023-03-07 12:30:37 -08:00
Doug Gregor
613ec8827c Merge pull request #64132 from hborla/validate-freestanding-macro-expansions
[Macros] Validate freestanding macro expansions.
2023-03-06 08:17:39 -08:00
Richard Wei
833338f9ce [Macros] Top-level freestanding macros (#63553)
Allow freestanding macros to be used at top-level.
- Parse top-level `#…` as `MacroExpansionDecl` when we are not in scripting mode.
- Add macro expansion decls to the source lookup cache with name-driven lazy expansion. Not supporting arbitrary name yet.
- Experimental support for script mode and brace-level declaration macro expansions: When type-checking a `MacroExpansionExpr`, assign it a substitute `MacroExpansionDecl` if the macro reference resolves to a declaration macro. This doesn’t work quite fully yet and will be enabled in a future fix.
2023-03-06 07:15:20 -08:00
Holly Borla
ed4ce5cd8f [Macros] Validate freestanding macro expansions. 2023-03-05 22:55:28 -08:00
Holly Borla
9b722b9bd2 Merge pull request #64097 from hborla/macro-expansion-validation
[Macros] Diagnose macro expansions containing invalid declarations.
2023-03-05 13:22:38 -08:00
Doug Gregor
ba3504ad96 Add a test for a macro introducing members to an enum
There was a short time where this was broken. Add a test to make sure
we don't regress it later. rdar://105228228
2023-03-04 21:53:55 -08:00
Holly Borla
4a319b2a4e [Macros] Diagnose default literal type overrides in macro expansions. 2023-03-04 15:31:25 -08:00
Holly Borla
cd62c6d513 [Macros] Fix a few issues with invalid macro expansion diagnostics, and add tests. 2023-03-04 15:31:25 -08:00
Holly Borla
e4172055c3 [Macros] Allow any decl names in macro expansions when the macro covers arbitrary
names.
2023-03-04 15:31:24 -08:00
Doug Gregor
d1bfe72a45 [Macros] Register the extension for a conformance macro fully.
When we form an extension for a conformance macro, make sure to
register that extension as being part of the nominal type to which the
conformance macro is attached. This ensures that the conformance is
seen everywhere. Crucially, this ensures that that protocol
conformance table handles conformances that are implied by the
conformance macro. For example, a conformance macro that introduces a
`Hashable` conformance will also imply an `Equatable` conformance;
that wasn't happening before this change.

This is needed to make the `OptionSet` macro work fully.
2023-03-01 21:45:04 -08:00
Doug Gregor
200f2340d9 [Macros] Be deliberate about walking macro arguments vs. expansions
Provide ASTWalker with a customization point to specify whether to
check macro arguments (which are type checked but never emitted), the
macro expansion (which is the result of applying the macro and is
actually emitted into the source), or both. Provide answers for the
~115 different ASTWalker visitors throughout the code base.

Fixes rdar://104042945, which concerns checking of effects in
macro arguments---which we shouldn't do.
2023-02-28 17:48:23 -08:00
Richard Wei
77c886c861 [Macros] Rename createUniqueName to makeUniqueName
As per Evolution comment: https://forums.swift.org/t/se-0382-second-review-expression-macros/63064/20

To be merged with https://github.com/apple/swift-syntax/pull/1367
2023-02-28 16:14:15 +08:00
Holly Borla
4b2571aa9c [Macros] Add tests for conditional conformance expansion. 2023-02-23 21:33:03 -08:00
Holly Borla
02a53d070f [Macros] Correct the where clause syntax type in ConformanceMacro. 2023-02-23 20:58:22 -08:00
Holly Borla
a3caacd309 [Macros] Initial implementation of conformance macros. 2023-02-23 20:43:11 -08:00
Holly Borla
c33c925e81 [Macros] Remove the macro role argument to ResolveMacroRequest.
The macro role argument presented an opportunity for callers to accidentally
invoke this request twice for the same macro with slightly different macro
roles passed in, which resulted in re-typechecking the macro arguments.
Instead, derive the corresponding macro roles from the macro reference syntax.
2023-02-14 22:38:53 -08:00
Holly Borla
46db62b5b5 [Macros] Pass the attached macro mangling to ASTGen to use as the discriminator
when creating the macro expansion context.
2023-02-14 16:24:27 -08:00
Holly Borla
f4b2b60446 [Macros] Enable global peer macros.
Global peer macro expansions are not injected into the AST. Instead, they
are visited as "auxiliary declarations" when needed, such as in the decl
checker and during SILGen. This is the same mechanism used for local property
wrappers and local lazy variables.
2023-02-14 16:24:25 -08:00
Holly Borla
56a9e17863 [Macros] Expand peer macros. 2023-02-10 14:43:17 -08:00
Holly Borla
205313b1eb Merge pull request #63484 from hborla/attached-macro-generic-args 2023-02-06 22:39:09 -08:00
Richard Wei
01e4c8df26 [Macros] Use name lookup for lazy declaration macro expansion (#63411)
- Use the name lookup table instead of adding members from a macro expansion to the parent decl context.
- Require declaration macros to specify introduced names and used the declared names to guide macro expansions lazily.
2023-02-07 11:24:42 +08:00
Holly Borla
09e34f274d [Macros] Apply generic arguments from attached macro custom attributes when
resolving the macro reference.
2023-02-06 18:45:26 -08:00
Holly Borla
d6e4b707db [Macros] Update member attribute macro test cases to account for a change in
the MemberAttributeMacro protocol in SwiftSyntax.
2023-02-06 10:15:09 -08:00
Holly Borla
5c3872748a [Macros] Invoke member macro expansion during qualified lookup.
Otherwise, members that are added via macro expansion will not be visible
in other source files.
2023-02-05 21:23:30 -08:00
Doug Gregor
8ad7601ade [Macros] Create macro expansion contexts based on the SourceManager
Rather than trying to patch up the "basic" macro expansion context
that comes from the swift-syntax package, implement our own based
on the new SourceManager. Fixes the `location(of:)` operation.
2023-02-02 23:24:56 -08:00
Doug Gregor
69edc787cf [Macros] Walk semantic attributes when checking a primary file 2023-02-01 23:09:36 -08:00
Doug Gregor
cbdb18097e [Macros] Fix emission of thrown errors.
Errors that were thrown out of a macro implementation were being
emitted and then lost. The result of this is a SILGen assertion later
on, if there were no other errors in the code.

Make sure we properly emit these diagnostics through the source
manager, which required fixing an issue in the offset computation used
for diagnostics.
2023-02-01 15:01:44 -08:00
Doug Gregor
ac4aa41d0f [Macros] Use macro expansion mangling for unique names in macros
Use the name mangling scheme we've devised for macro expansions to
back the implementation of the macro expansion context's
`getUniqueName` operation. This way, we guarantee that the names
provided by macro expansions don't conflict, as well as making them
demangleable so we can determine what introduced the names.
2023-01-31 09:40:48 -08:00
Doug Gregor
3fd895a13d Merge pull request #63284 from DougGregor/swift-syntax-macros-module-update 2023-01-29 15:38:27 -08:00
Doug Gregor
027ce8d21c [ASTGen/Macros] Introduce a Swift-side SourceManager into ASTGen.
Add SourceManager that can keep track of multiple source file syntax
nodes along with their external representations. The source manager can
emit diagnostics into any of those files, including tracking any
explicitly "detached" syntax nodes used for macro expansion.

Make sure we detach syntax nodes before passing them to macro
implementations, so they cannot see more of the source file than they
are permitted. We hadn't been doing this before (by accident), and
doing so motivated the introduction of the SourceManager.

Additionally, perform operator folding on macro arguments as part of
detaching them. Macro clients shouldn't have to do this, and moreover,
when clients do this, they lose the ability to easily emit diagnostics
on the now-folded nodes.
2023-01-28 22:23:52 -08:00
Doug Gregor
182950bacb Update to account for SwiftSyntaxMacros module rename and overhaul 2023-01-28 09:00:54 -08:00
Holly Borla
e6d7ea53ed [Parser] Use proper ParseDeclOptions when parsing the result of a member macro
expansion.
2023-01-27 22:37:22 -08:00
Alex Hoppen
b5ca122a94 Merge pull request #63251 from ahoppen/ahoppen/only-base-nodes-expressible-by-string
[SwiftSyntax] Adjustments because `VariableDeclSyntax` etc. are no longer expressible by string literals
2023-01-27 07:45:16 +01:00
Doug Gregor
976060e29c Merge pull request #63220 from AtariDreams/deprecations
Fix DeclarationMacro deprecations
2023-01-26 17:04:08 -08:00
Alex Hoppen
d0f0652bc6 [SwiftSyntax] Adjustments because VariableDeclSyntax etc. are no longer expressible by string literals 2023-01-27 00:56:24 +01:00
Alex Hoppen
cbdaa25d89 Adjustment for removed with<childName> functions in SwiftSyntax 2023-01-26 17:09:55 +01:00
Holly Borla
07319d0fdd [ASTScope] Teach ASTScope lookup to find source locations inside macro-expanded
scopes.

ASTScope lookup can no longer assume that all scopes are within the same source
file. Scope trees can now contain scopes that are in macro expansion buffers, which
live in different source files with independent source ranges from the root of a
given scope tree. To handle this when searching for a scope containing a given source
location, ASTScope lookup needs to walk up the chain of macro expansion buffers to find
the lowest common buffer in which to compare source locations.

This fixes a number of issues with unqualified lookup into and from within macro-expanded
code.
2023-01-25 23:19:33 -08:00