generateForAnnotatedElement method

  1. @override
Future<String> generateForAnnotatedElement(
  1. Element element,
  2. ConstantReader annotation,
  3. 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;';
}