@@ -50,6 +50,59 @@ Allowing deep introspection like this in cases where a macro needs it while
50
50
ensuring that users can understand the system and tools can implement it
51
51
efficiently is a central challenge of this proposal.
52
52
53
+ #### Omitted Type Annotations and Inference
54
+
55
+ In general, the introspection APIs will only provide exactly what the user has
56
+ written for the types of declarations. However, this presents problems when the
57
+ type is omitted, and in particular when the type is omitted but a useful type
58
+ would be inferred. For example, see this class:
59
+
60
+ ``` dart
61
+ class Foo extends Bar {
62
+ final inferred = someFunction();
63
+
64
+ final String name;
65
+
66
+ Foo(this.name, {super.baz});
67
+ }
68
+
69
+ class Bar {
70
+ final String? baz;
71
+
72
+ Bar({this.baz});
73
+ }
74
+ ```
75
+
76
+ When introspecting on the ` inferred ` field, the ` this.name ` parameter, or the
77
+ ` super.baz ` parameter, there is no hand written type to use. However, a macro
78
+ may need to know the actual inferred type, in order to emit an equivalent type
79
+ annotation in generated code elsewhere in the program.
80
+
81
+ In order to resolve this, there will be a special ` OmittedTypeAnnotation `
82
+ subtype of ` TypeAnnotation ` . It will have no fields, and is just a pointer to
83
+ the place where the type annotation was omitted.
84
+
85
+ There are two things you can do with an ` OmittedTypeAnnotation ` :
86
+
87
+ - Pass it directly as a part of a ` Code ` object.
88
+ - When the final augmentation library is created, the actual type that was
89
+ inferred will be used (or ` dynamic ` if no type was inferred).
90
+ - Explicitly ask to infer the type of it through the builder apis (only
91
+ available in phase 3).
92
+ - We don't allow augmentations of existing declarations to contribute to
93
+ inference, so in phase 3 type inference can be performed.
94
+
95
+ This allows you to generate correct signatures for any declarations you need to
96
+ create in Phase 1 or 2, without actually performing inference in those phases.
97
+ At the same time it allows you to get the inferred type in phase 3, where you
98
+ are creating the bodies of functions and may need to know the actual inferred
99
+ type (for instance you might want to do something for all fields that implement
100
+ a given interface).
101
+
102
+ The primary limitation of this approach is that you will not be able to inspect
103
+ the actual types of declarations where the type was omitted prior to phase 3,
104
+ but this situation will also be made very explicit to macro authors.
105
+
53
106
### Ordering in metaprogramming
54
107
55
108
Macros can read the user's Dart program and modify it. They are also written in
0 commit comments