In the comments to yesterday's post on Dart annotations, Ladislav Thon pointed out that there is already a package in the Dart Pub using them: meta. I cannot resist the temptation to kick the tires, so I update my
pubspec.yaml to include any version of meta:name: classes dependencies: unittest: any meta: anyAnd install the newly specified dependency:
➜ classes git:(master) ✗ pub install Resolving dependencies... Downloading meta 0.2.9+7... Dependencies installed!Next, in my awesome
Cookie class, I decide that cookie should not be responsible for mixing its own ingredients. I factor that functionality out into a Mixer class and deprecate the mix_it() method. Rather than raising an error or printing a warning that I will be sure to ignore, I use meta's @deprecated annotation:import 'package:meta/meta.dart';
class Cookie {
int number_of_chips;
Cookie({this.number_of_chips:42});
@deprecated
void mix_it() {
print("Mixing ingredients and ${number_of_chips} chips.");
}
}Since that is an annotation, it has no effect whatsoever on the ability to exercise that code. Given the following main() entry point:main() {
var cookie = new Cookie();
print("cookie has ${cookie.number_of_chips} chips");
// Whoa! Calling a deprecated method:
cookie.mix_it();
}Dart produces the same output as it would were that annotation not in place:➜ classes git:(master) ✗ dart annotations.dart cookie has 42 chips Mixing ingredients and 42 chips.But, when I run the code through
dart_analyzer, I get a warning:➜ classes git:(master) ✗ dart_analyzer annotations.dart
file:/Code/classes/annotations.dart:23:10: Method 'mix_it' is deprecated
22:
23: cookie.mix_it();
~~~~~~That is pretty cool. This even works if I trace it through subclasses. Consider the amazing thin mint cookie:class ThinMint extends Cookie {
ThinMint(): super(number_of_chips: 0);
}When I try to mix it as well:main() {
@FixMe("Moar better code")
var cookie = new Cookie();
print("cookie has ${cookie.number_of_chips} chips");
cookie.mix_it();
print("\n*** Thin Mint time!");
var thin_mint = new ThinMint();
thin_mint.mix_it();
}The code still runs just fine:➜ classes git:(master) ✗ dart annotations.dart cookie has 42 chips Mixing ingredients and 42 chips. *** Thin Mint time! Mixing ingredients and 0 chipsOnly now I get two
dart_analyzer warning instead of one:➜ classes git:(master) ✗ dart_analyzer annotations.dart
file:/Code/classes/annotations.dart:27:10: Method 'mix_it' is deprecated
26:
27: cookie.mix_it();
~~~~~~
file:/Code/classes/annotations.dart:31:13: Method 'mix_it' is deprecated
30: var thin_mint = new ThinMint();
31: thin_mint.mix_it();
~~~~~~That is amazing.I would very much like to adapt this kind of annotation for my own internal annotations. Specifically, I would like to make my
@IntentionalError annotation suppress normal warnings from dart_analyzer. This is very specific to examples from Dart for Hipsters so I would not expect dart_analyzer to support it natively. But if I could adapt what the meta package does to influence dart_analyzer, I would be very happy.Unfortunately, the meta package does nothing. It only includes a few constant constructor definitions. Internal code in
dart_analyzer must look for these annotations in order to do its thing. Ah well, maybe someday.Until then, I can be secure in the knowledge that
dart_analyzer (and Dart Editor) are hard at work warning other developers of the danger of telling a cookie to mix itself.Day #618
No comments:
Post a Comment