generateForAnnotatedElement method
Future<String>
generateForAnnotatedElement(
- Element element,
- ConstantReader annotation,
- BuildStep buildStep
Implement to return source code to generate for element
.
This method is invoked based on finding elements annotated with an
instance of T
. The annotation
is provided as a ConstantReader
.
Supported return values include a single String or multiple String instances within an Iterable or Stream. It is also valid to return a Future of String, Iterable, or Stream.
Implementations should return null
when no content is generated. Empty
or whitespace-only String instances are also ignored.
Implementation
@override
Future<String> generateForAnnotatedElement(
Element element,
ConstantReader annotation,
BuildStep buildStep,
) async {
if (p.isAbsolute(annotation.read('path').stringValue)) {
throw ArgumentError(
'`annotation.path` must be relative path to the source file.');
}
final sourcePathDir = p.dirname(buildStep.inputId.path);
final fileId = AssetId(buildStep.inputId.package,
p.join(sourcePathDir, annotation.read('path').stringValue));
final content = json.decode(await buildStep.readAsString(fileId));
final asConst = annotation.read('asConst').boolValue;
final thing = jsonLiteralAsDart(content).toString();
final marked = asConst ? 'const' : 'final';
return '$marked _\$${element.name}JsonLiteral = $thing;';
}