extractNodeName function
Extracts a string name from an AST node safely.
Supports ClassDeclaration, FunctionDeclaration, EnumDeclaration,
MixinDeclaration, ExtensionDeclaration, ExtensionTypeDeclaration,
TypeAlias, VariableDeclaration, MethodDeclaration,
and ConstructorDeclaration, falling back to recursive identifier token
scanning.
Implementation
String? extractNodeName(AstNode node) => switch (node) {
ClassDeclaration(:final declaredFragment) =>
declaredFragment?.element.name ?? _findFirstIdentifier(node),
ClassTypeAlias(:final declaredFragment, :final name) =>
declaredFragment?.element.name ?? name.lexeme,
EnumDeclaration(:final declaredFragment) =>
declaredFragment?.element.name ?? _findFirstIdentifier(node),
MixinDeclaration(:final declaredFragment, :final name) =>
declaredFragment?.element.name ?? name.lexeme,
ExtensionDeclaration(:final declaredFragment, :final name) =>
declaredFragment?.element.name ?? name?.lexeme,
ExtensionTypeDeclaration(:final declaredFragment) =>
declaredFragment?.element.name ?? _findFirstIdentifier(node),
TypeAlias(:final declaredFragment, :final name) =>
declaredFragment?.element.name ?? name.lexeme,
FunctionDeclaration(:final declaredFragment, :final name) =>
declaredFragment?.element.name ?? name.lexeme,
VariableDeclaration(:final declaredFragment, :final name) =>
declaredFragment?.element.name ?? name.lexeme,
MethodDeclaration(:final declaredFragment, :final name) =>
declaredFragment?.element.name ?? name.lexeme,
ConstructorDeclaration(:final declaredFragment, :final name) =>
declaredFragment?.element.name ?? name?.lexeme,
EnumConstantDeclaration(:final name) => name.lexeme,
TopLevelVariableDeclaration(:final variables)
when variables.variables.isNotEmpty =>
extractNodeName(variables.variables.first),
FieldDeclaration(:final fields) when fields.variables.isNotEmpty =>
extractNodeName(fields.variables.first),
_ => _findFirstIdentifier(node),
};