visitFieldElement method

  1. @override
void visitFieldElement(
  1. FieldElement element
)
override

Implementation

@override
void visitFieldElement(FieldElement element) {
  if (element.isPrivate) {
    return;
  }
  final type = element.type.toString();
  final name = element.name;
  final isFinal = element.isFinal;
  final hasSetter = element.setter != null;
  final isSilent = silentAnnotation.hasAnnotationOf(element);
  final isCollection = element.type.isDartCoreList ||
      element.type.isDartCoreMap ||
      element.type.isDartCoreSet;
  final needSubscription =
      (isCollection && !isSilent) || !(isSilent || isFinal);

  // add stream
  if (needSubscription) {
    classBuilder.methods.add(
      Method(
        (builder) => builder
          ..name = '\$${name}Stream'
          ..returns = Reference('Stream<$type>')
          ..type = MethodType.getter
          ..body = Code('return _\$src.${name.streamName};'),
      ),
    );
  }

  // add getter
  classBuilder.methods.add(
    Method(
      (builder) => builder
        ..name = name
        ..annotations.add(CodeExpression(Code('override')))
        ..returns = Reference(type)
        ..type = MethodType.getter
        ..body = Code('''
${!needSubscription ? '' : '_\$observer.subscribe(_\$src.${name.subjectName}, ${name.streamName});'}
return _\$src.$name;
'''),
    ),
  );

  if (!hasSetter) {
    return;
  }

  classBuilder.methods.add(
    Method(
      (builder) => builder
        ..name = name
        ..annotations.add(CodeExpression(Code('override')))
        ..type = MethodType.setter
        ..requiredParameters.add(
          Parameter(
            (builder) => builder
              ..type = Reference(type)
              ..name = 'val'
              ..named = false,
          ),
        )
        ..body = Code('_\$src.$name = val;'),
    ),
  );
}