visitClassDeclaration method
void
visitClassDeclaration(
- 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);
}