visitClassDeclaration method

  1. @override
void visitClassDeclaration(
  1. ClassDeclaration node
)
override

Implementation

@override
void visitClassDeclaration(ClassDeclaration node) {
  final classBody = node.body;
  if (classBody is! BlockClassBody) {
    super.visitClassDeclaration(node);
    return;
  }

  final extendsClause = node.extendsClause;
  if (extendsClause != null &&
      extendsClause.superclass.name.lexeme == 'GetxController') {
    final className = node.namePart.typeName.lexeme;
    final stateFields = <FieldInfo>[];
    final methods = <MethodInfo>[];

    bool isFamilyCandidate = false;
    for (final member in classBody.members) {
      if (member is FieldDeclaration) {
        for (final variable in member.fields.variables) {
          final source = variable.toSource();
          if (source.contains('.obs')) {
            stateFields.add(
              FieldInfo(
                rawName: variable.name.lexeme,
                type: _inferObservableType(
                  member.fields.type?.toSource(),
                  variable.initializer?.toSource(),
                ),
                initializer: _normalizeObservableInitializer(
                  variable.initializer?.toSource(),
                ),
              ),
            );
          }
        }
      } else if (member is ConstructorDeclaration) {
        for (final param in member.parameters.parameters) {
          final paramName = param.name?.lexeme ?? '';
          if (paramName != 'key') {
            isFamilyCandidate = true;
            break;
          }
        }
      } else if (member is MethodDeclaration) {
        methods.add(
          buildMethodInfo(
            member,
            callsNotifyListeners: member.body.toSource().contains('.value ='),
          ),
        );
      }
    }

    nodes.add(
      LogicUnitNode(
        name: className,
        stateFields: stateFields,
        methods: methods,
        isNotifier: true,
        notifierType: detectNotifierType(methods),
        isFamilyCandidate: isFamilyCandidate,
        filePath: filePath,
        offset: node.offset,
        length: node.length,
      ),
    );
  }
  super.visitClassDeclaration(node);
}