isNativeOrEntryPoint function
Checks if an AST node has native or runtime entrypoint annotations
(@Native, @native, or explicit entrypoint @pragma like
@pragma('vm:entry-point') or @pragma('vm:isolate-unsendable')).
Optimization and inlining pragmas (e.g. @pragma('vm:prefer-inline'),
@pragma('dart2js:noInline')) are NOT treated as entrypoints.
Implementation
bool isNativeOrEntryPoint(AnnotatedNode node) {
for (final meta in node.metadata) {
final rawName = meta.name.name;
final baseName = rawName.contains('.') ? rawName.split('.').last : rawName;
if (_nativeAnnotationNames.contains(baseName)) {
return true;
}
final constructorName = meta.constructorName?.name;
if (constructorName != null &&
_nativeAnnotationNames.contains(constructorName)) {
return true;
}
if (baseName == 'pragma' || constructorName == 'pragma') {
final args = meta.arguments?.arguments;
if (args != null && args.isNotEmpty) {
final firstArg = args.first;
String? pragmaName;
if (firstArg is SimpleStringLiteral) {
pragmaName = firstArg.value;
} else if (firstArg is StringLiteral) {
pragmaName = firstArg.stringValue;
} else {
for (final entity in firstArg.childEntities) {
if (entity is SimpleStringLiteral) {
pragmaName = entity.value;
break;
} else if (entity is StringLiteral) {
pragmaName = entity.stringValue;
break;
}
}
}
if (pragmaName != null && _entryPointPragmas.contains(pragmaName)) {
return true;
}
}
}
}
return false;
}