Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 // For the purposes of the mirrors library, we adopt a naming | 5 // For the purposes of the mirrors library, we adopt a naming |
| 6 // convention with respect to getters and setters. Specifically, for | 6 // convention with respect to getters and setters. Specifically, for |
| 7 // some variable or field... | 7 // some variable or field... |
| 8 // | 8 // |
| 9 // var myField; | 9 // var myField; |
| 10 // | 10 // |
| (...skipping 1178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1189 * | 1189 * |
| 1190 * The following text is non-normative: | 1190 * The following text is non-normative: |
| 1191 * | 1191 * |
| 1192 * In some scenarios, for example, when minifying Dart code, or when generating | 1192 * In some scenarios, for example, when minifying Dart code, or when generating |
| 1193 * JavaScript code from a Dart program, the size and performance of the output | 1193 * JavaScript code from a Dart program, the size and performance of the output |
| 1194 * can suffer from use of reflection. In those cases, telling the compiler | 1194 * can suffer from use of reflection. In those cases, telling the compiler |
| 1195 * what is used, can have a significant impact. | 1195 * what is used, can have a significant impact. |
| 1196 * | 1196 * |
| 1197 * Example usage: | 1197 * Example usage: |
| 1198 * | 1198 * |
| 1199 * @MirrorsUsed(symbols: 'foo', override: '*') | 1199 * @MirrorsUsed(symbols: 'foo') |
| 1200 * import 'dart:mirrors'; | 1200 * import 'dart:mirrors'; |
| 1201 * | 1201 * |
| 1202 * class Foo { | 1202 * class Foo { |
| 1203 * noSuchMethod(Invocation invocation) { | 1203 * noSuchMethod(Invocation invocation) { |
| 1204 * print(MirrorSystem.getName(invocation.memberName)); | 1204 * print(MirrorSystem.getName(invocation.memberName)); |
| 1205 * } | 1205 * } |
| 1206 * } | 1206 * } |
| 1207 * | 1207 * |
| 1208 * main() { | 1208 * main() { |
| 1209 * new Foo().foo(); // Prints "foo". | 1209 * new Foo().foo(); // Prints "foo". |
| 1210 * new Foo().bar(); // Might print an arbitrary (mangled) name, "bar". | 1210 * new Foo().bar(); // Might print an arbitrary (mangled) name, "bar". |
| 1211 * } | 1211 * } |
| 1212 * | |
| 1213 * For a detailed description of the parameters to the [MirrorsUsed] constructor | |
| 1214 * see the comments for the respective fields [symbols]. [targets] and | |
|
Kathy Walrath
2015/05/05 19:24:57
delete "the respective fields "
. -> ,
herhut
2015/05/06 14:24:16
Done.
| |
| 1215 * [metaTargets]. | |
|
Kathy Walrath
2015/05/05 19:24:57
what about [override]?
herhut
2015/05/06 14:24:17
Good catch, thanks!
| |
| 1216 * | |
| 1217 * An import of `dart:mirrors` may have multiple [MirrorsUsed] annotations. This | |
| 1218 * is particularly helpful to specify overrides for specific libraries. For | |
| 1219 * example | |
|
Kathy Walrath
2015/05/05 19:24:57
example -> example:
herhut
2015/05/06 14:24:15
Done.
| |
| 1220 * | |
| 1221 * @MirrorsUsed(targets: 'foo.Bar', override: 'foo') | |
| 1222 * @MirrorsUsed(targets: 'Bar') | |
| 1223 * import 'dart:mirrors'; | |
| 1224 * | |
| 1225 * will ensure that the target `Bar` from the current library and from library | |
| 1226 * `foo` is available for reflection. See also [override]. | |
| 1212 */ | 1227 */ |
| 1213 // TODO(ahe): Remove ", override: '*'" when it isn't necessary anymore. | |
| 1214 class MirrorsUsed { | 1228 class MirrorsUsed { |
| 1215 // Note: the fields of this class are untyped. This is because the most | 1229 // Note: the fields of this class are untyped. This is because the most |
| 1216 // convenient way to specify to specify symbols today is using a single | 1230 // convenient way to specify symbols today is using a single string. In |
| 1217 // string. In some cases, a const list of classes might be convenient. Some | 1231 // some cases, a const list of classes might be convenient. Some |
| 1218 // might prefer to use a const list of symbols. | 1232 // might prefer to use a const list of symbols. |
| 1219 | 1233 |
| 1220 /** | 1234 /** |
| 1221 * The list of strings passed to new [Symbol], and symbols that might be | 1235 * The list of strings passed to new [Symbol], and symbols that might be |
| 1222 * passed to [MirrorSystem.getName]. | 1236 * passed to [MirrorSystem.getName]. |
| 1223 * | 1237 * |
| 1224 * Combined with the names of [targets], [metaTargets] and their members, | 1238 * Combined with the names of [targets], [metaTargets] and their members, |
| 1225 * this forms the complete list of strings passed to new [Symbol], and | 1239 * this forms the complete list of strings passed to new [Symbol], and |
| 1226 * symbols that might be passed to [MirrorSystem.getName] by the library to | 1240 * symbols that might be passed to [MirrorSystem.getName] by the library to |
| 1227 * which this metadata applies. | 1241 * which this metadata applies. |
| 1228 * | 1242 * |
| 1229 * The following text is non-normative: | 1243 * The following text is non-normative: |
| 1230 * | 1244 * |
| 1245 * Dart2js currently supports the below formats to specify symbols: | |
|
Kathy Walrath
2015/05/05 19:24:58
below -> following
herhut
2015/05/06 14:24:16
Done.
| |
| 1246 * | |
| 1247 * * A [List] of [String] constants representing symbol names, e.g., | |
|
Kathy Walrath
2015/05/05 19:24:57
A -> A constant
? (it must be a const List, right?
herhut
2015/05/06 14:24:16
Done.
| |
| 1248 * `const ['foo', 'bar']`. | |
| 1249 * * A single [String] constant whose value is a comma separated list of | |
|
Kathy Walrath
2015/05/05 19:24:58
comma separated -> comma-separated
Lasse Reichstein Nielsen
2015/05/06 07:41:21
comma + whitespace separated apparently?
Are multi
herhut
2015/05/06 14:24:16
Done.
herhut
2015/05/06 14:24:16
This is meant to be a documentation, not a formal
| |
| 1250 * symbol names, e.g., `"foo, bar"`. | |
| 1251 * | |
| 1231 * Specifying this option turns off the following warnings emitted by | 1252 * Specifying this option turns off the following warnings emitted by |
|
Kathy Walrath
2015/05/05 19:24:57
this option -> the `symbols` field
herhut
2015/05/06 14:24:17
Done.
| |
| 1232 * dart2js: | 1253 * dart2js: |
| 1233 * | 1254 * |
| 1234 * * Using "MirrorSystem.getName" may result in larger output. | 1255 * * Using "MirrorSystem.getName" may result in larger output. |
| 1235 * * Using "new #{name}" may result in larger output. | 1256 * * Using "new #{name}" may result in larger output. |
| 1236 * | 1257 * |
| 1237 * Use symbols = "*" to turn off the warnings mentioned above. | |
| 1238 * | |
| 1239 * For example, if using [noSuchMethod] to interact with a database, extract | 1258 * For example, if using [noSuchMethod] to interact with a database, extract |
|
Kathy Walrath
2015/05/05 19:24:57
using -> you're using
herhut
2015/05/06 14:24:16
Done.
| |
| 1240 * all the possible column names and include them in this list. Similarly, | 1259 * all the possible column names and include them in this list. Similarly, |
| 1241 * if using [noSuchMethod] to interact with another language (JavaScript, for | 1260 * if using [noSuchMethod] to interact with another language (JavaScript, for |
|
Kathy Walrath
2015/05/05 19:24:58
using -> you're using
herhut
2015/05/06 14:24:17
Done.
| |
| 1242 * example) extract all the identifiers from API used and include them in | 1261 * example) extract all the identifiers from API used and include them in |
|
Kathy Walrath
2015/05/05 19:24:57
API -> the API you use
herhut
2015/05/06 14:24:15
Done.
| |
| 1243 * this list. | 1262 * this list. |
| 1263 * | |
| 1264 * Note that specifying a symbol only ensures that the symbol will be | |
| 1265 * available under that name at runtime. It does not mark targets with | |
| 1266 * that name as available for reflection. See [targets] and [metaTargets] | |
| 1267 * for that purpose. | |
| 1244 */ | 1268 */ |
| 1245 final symbols; | 1269 final symbols; |
| 1246 | 1270 |
| 1247 /** | 1271 /** |
| 1248 * A list of reflective targets. | 1272 * A list of reflective targets. |
| 1249 * | 1273 * |
| 1250 * Combined with [metaTargets], this provides the complete list of reflective | 1274 * Combined with [metaTargets], this provides the complete list of reflective |
| 1251 * targets used by the library to which this metadata applies. | 1275 * targets used by the library to which this metadata applies. |
|
Lasse Reichstein Nielsen
2015/05/06 07:41:21
What kinds of declarations can be targets.
It's s
herhut
2015/05/06 14:24:16
It is not stated here because it is not formally d
| |
| 1252 * | 1276 * |
| 1253 * The following text is non-normative: | 1277 * The following text is non-normative: |
| 1254 * | 1278 * |
| 1279 * Dart2js currently supports the below formats to specify targets: | |
|
Kathy Walrath
2015/05/05 19:24:58
Same comments as above:
below -> following
[List]
herhut
2015/05/06 14:24:16
Done.
| |
| 1280 * | |
| 1281 * * A [List] containing [String] constants representing (qualified) | |
| 1282 * names of targets and Dart types. | |
| 1283 * * A single [String] constant whose value is a comma separated list of | |
| 1284 * (qualified) names. | |
| 1285 * * A single Dart type. | |
| 1286 * | |
| 1287 * A (qualified) name is resolved to a target as follows: | |
| 1288 * | |
| 1289 * 1. If the qualified name matches a library name, the matching library is | |
|
Lasse Reichstein Nielsen
2015/05/06 07:41:20
"matches" meaning?
I guess equals-after-canonicali
herhut
2015/05/06 14:24:17
...not a spec.
| |
| 1290 * the target. | |
| 1291 * 2. Else, find the longest prefix of the name such that the prefix ends | |
| 1292 * with a `.` and is a library name. | |
|
Lasse Reichstein Nielsen
2015/05/06 07:41:21
ends with -> ends just before
(Otherwise the prefi
herhut
2015/05/06 14:24:16
Done.
| |
| 1293 * 3. Use that library as current scope. If no matching prefix was found, use | |
| 1294 * the current library, i.e., the library where the [MirrorsUsed] | |
| 1295 * annotation was placed. | |
| 1296 * 4. Split the remaining suffix into a list of [String] using `.` as a | |
|
Lasse Reichstein Nielsen
2015/05/06 07:41:20
Split the remaining suffix (the entire name in cas
herhut
2015/05/06 14:24:16
Done.
| |
| 1297 * separator. | |
| 1298 * 5. Select all targets in the current scope whose name matches a [String] | |
|
Lasse Reichstein Nielsen
2015/05/06 07:41:21
"matches" means? Equals for non-setters or equals-
herhut
2015/05/06 14:24:16
without the = for setters. Again this is not a spe
| |
| 1299 * from the list. | |
|
Lasse Reichstein Nielsen
2015/05/06 07:41:20
Step 5 looks wrong. Not saying it's not what's hap
herhut
2015/05/06 14:24:16
This is how it is and I added an example to highli
| |
| 1300 * | |
|
Kathy Walrath
2015/05/05 19:24:58
A brief example would be nice here.
herhut
2015/05/06 14:24:16
Added.
Kathy Walrath
2015/05/06 20:54:25
That helps. Thanks!
| |
| 1301 * Note that everything within a target also is available for reflection. | |
| 1302 * So, if a library is specified as target, all classes in that library | |
| 1303 * become targets for reflection. Likewise, if a class is a target, all | |
| 1304 * its methods and fields become targets for reflection. | |
| 1305 * | |
| 1255 * For now, there is no formal description of what a reflective target is. | 1306 * For now, there is no formal description of what a reflective target is. |
| 1256 * Informally, it is a list of things that are expected to have fully | 1307 * Informally, a target is a library, a class, a method or a field. |
| 1257 * functional mirrors. | 1308 * |
| 1258 */ | 1309 */ |
| 1259 final targets; | 1310 final targets; |
| 1260 | 1311 |
| 1261 /** | 1312 /** |
| 1262 * A list of classes that when used as metadata indicates a reflective | 1313 * A list of classes that when used as metadata indicates a reflective |
| 1263 * target. | 1314 * target. See also [targets]. |
| 1264 * | 1315 * |
| 1265 * See [targets]. | 1316 * The following text is non-normative: |
|
Lasse Reichstein Nielsen
2015/05/06 07:41:20
What does that mean? Where it the normative defini
herhut
2015/05/06 14:24:17
There is none.
| |
| 1317 * | |
| 1318 * The format for specifying the list of classes is the same as used for | |
| 1319 * specifying [targets]. However, as a library cannot be used as a metadata | |
| 1320 * annotation in Dart, adding a library to the list of [metaTargets] has no | |
| 1321 * effect. In particular, adding a library to [metaTargets] does not make | |
| 1322 * the library's classes a valid metadata annotation to enable reflection. | |
|
Lasse Reichstein Nielsen
2015/05/06 07:41:21
a valid metadata annotation -> valid metadata anno
herhut
2015/05/06 14:24:17
Done.
| |
| 1323 * | |
| 1324 * If a class specified in [metaTargets] is used as metadata annotation | |
|
Lasse Reichstein Nielsen
2015/05/06 07:41:21
If an instance of a class ...
herhut
2015/05/06 14:24:17
Done.
| |
| 1325 * on a class, field or method, that class, field or method is added to | |
|
Lasse Reichstein Nielsen
2015/05/06 07:41:21
But not library?
herhut
2015/05/06 14:24:16
Good catch, thanks!
| |
| 1326 * the set of targets for reflection. | |
| 1327 * | |
| 1328 * Example usage: | |
| 1329 * | |
| 1330 * library example; | |
| 1331 * @MirrorsUsed(metaTargets: "example.Reflectable") | |
| 1332 * import "dart:mirrors"; | |
| 1333 * | |
| 1334 * class Reflectable { | |
| 1335 * const Reflectable(); | |
| 1336 * } | |
| 1337 * | |
| 1338 * class Foo { | |
| 1339 * @Reflectable() | |
| 1340 * reflectableMethod() { ... } | |
| 1341 * | |
| 1342 * nonReflectableMethod() { ... } | |
| 1343 * } | |
| 1344 * | |
| 1345 * In the above example. `reflectableMethod` is marked as reflectable by | |
| 1346 * using the `Reflectable` class, which in turn is specified in the | |
| 1347 * [metaTargets] annotation. | |
| 1348 * | |
| 1349 * The method `nonReflectableMethod` lacks a metadata annotation and thus | |
| 1350 * will not be reflectable at runtime. | |
| 1266 */ | 1351 */ |
| 1267 final metaTargets; | 1352 final metaTargets; |
| 1268 | 1353 |
| 1269 /** | 1354 /** |
| 1270 * A list of library names or "*". | 1355 * A list of library names or "*". |
| 1271 * | 1356 * |
| 1272 * When used as metadata on an import of "dart:mirrors", this metadata does | 1357 * When used as metadata on an import of "dart:mirrors", this metadata does |
| 1273 * not apply to the library in which the annotation is used, but instead | 1358 * not apply to the library in which the annotation is used, but instead |
| 1274 * applies to the other libraries (all libraries if "*" is used). | 1359 * applies to the other libraries (all libraries if "*" is used). In |
|
Lasse Reichstein Nielsen
2015/05/06 07:41:21
So it *does* apply to itself if "*" is used?
And i
herhut
2015/05/06 14:24:17
I had to rewrite the entire section after looking
| |
| 1360 * particular, if the other library has a metadata annotation of its own, | |
| 1361 * it will be shadowed by the override. | |
|
Lasse Reichstein Nielsen
2015/05/06 07:41:21
The word "shadow" suggests an ordering where the o
Lasse Reichstein Nielsen
2015/05/06 07:41:21
What if you specify yourself without using "*"?
l
herhut
2015/05/06 14:24:16
Removed.
herhut
2015/05/06 14:24:17
Removed.
| |
| 1362 * | |
| 1363 * If two libraries have mutual overrides, they will shadow each other and | |
| 1364 * an empty annotation will be assumed. | |
|
Lasse Reichstein Nielsen
2015/05/06 07:41:21
That's not what "shadow each other" means (if it m
herhut
2015/05/06 14:24:16
Removed.
| |
| 1365 * | |
| 1366 * The following text is non-normative: | |
|
Lasse Reichstein Nielsen
2015/05/06 07:41:21
Where is the normative text then?
herhut
2015/05/06 14:24:16
Does not exist.
| |
| 1367 * | |
| 1368 * While the annotation will apply to the given target libraries, the | |
| 1369 * [symbols], [targets] and [metaTargets] are still evaluated in the | |
| 1370 * scope of the annotation. Thus, to select a target from library `foo`, | |
| 1371 * a qualified name has to be used or, if the target is visible in the | |
| 1372 * current scope, its type may be referenced. | |
| 1373 * | |
| 1374 * For example | |
|
Kathy Walrath
2015/05/05 19:24:57
-> For example, the following code marks all targe
herhut
2015/05/06 14:24:16
Done.
| |
| 1375 * | |
| 1376 * @MirrorsUsed(metaTargets: "foo.Reflectable", override: "foo") | |
| 1377 * | |
| 1378 * will mark all targets in the library `foo` as reflectable that have | |
| 1379 * a metadata annotation using the `Reflectable` class from the same library. | |
| 1380 * However, | |
|
Kathy Walrath
2015/05/05 19:24:58
Delete previous two lines (moved, actually). Chang
herhut
2015/05/06 14:24:17
Done.
| |
| 1381 * | |
| 1382 * @MirrorsUsed(metaTargets: "Reflectable", override: "foo") | |
| 1383 * | |
| 1384 * would require the use of the `Reflectable` class from the current | |
|
Kathy Walrath
2015/05/05 19:24:58
Delete these 2 lines (move up above, actually).
herhut
2015/05/06 14:24:16
Done.
| |
| 1385 * library, instead. | |
| 1275 */ | 1386 */ |
|
Lasse Reichstein Nielsen
2015/05/06 07:41:21
So, if I get this right:
Override specifies a set
herhut
2015/05/06 14:24:16
Removed.
| |
| 1276 final override; | 1387 final override; |
| 1277 | 1388 |
| 1389 /** | |
| 1390 * See the documentation for [MirrorsUsed.symbols], [MirrorsUsed.targets], | |
| 1391 * [MirrorsUsed.metaTargets] and [MirrorsUsed.override] for documentation | |
| 1392 * of the parameters. | |
| 1393 */ | |
| 1278 const MirrorsUsed( | 1394 const MirrorsUsed( |
| 1279 {this.symbols, this.targets, this.metaTargets, this.override}); | 1395 {this.symbols, this.targets, this.metaTargets, this.override}); |
| 1280 } | 1396 } |
| OLD | NEW |