discoverModuleInfos function
Implementation
List<ModuleInfo> discoverModuleInfos(
String pluginName, {
String baseDir = '.',
}) {
final libDir = Directory(p.join(baseDir, 'lib'));
if (!libDir.existsSync()) {
return [ModuleInfo(lib: pluginName, module: pluginName, isCpp: false)];
}
final specs = libDir
.listSync(recursive: true)
.whereType<File>()
.where((f) => f.path.endsWith('.native.dart'))
.toList();
if (specs.isEmpty) {
return [ModuleInfo(lib: pluginName, module: pluginName, isCpp: false)];
}
final modules = <ModuleInfo>[];
for (final spec in specs) {
final content = spec.readAsStringSync();
final stem = p
.basename(spec.path)
.replaceAll(RegExp(r'\.native\.dart$'), '');
final libName = extractLibNameFromSpec(spec) ?? stem.replaceAll('-', '_');
final moduleMatch = RegExp(
r'abstract class (\w+) extends HybridObject',
).firstMatch(content);
final moduleName = moduleMatch?.group(1) ?? _toPascalCase(stem);
// Parse annotation once; avoids two extra file reads vs calling isCppModule + isNativeCppModule.
final analyzer = PlatformTargetAnalyzer.fromContent(content);
if (!modules.any((m) => m.module == moduleName)) {
modules.add(
ModuleInfo(
lib: libName,
module: moduleName,
isCpp: analyzer.requiresCpp,
isNativeCpp: analyzer.isNativeCpp,
isAndroidCpp: analyzer.supportsAndroid,
iosIsCpp: analyzer.supportsIosCpp,
macosIsCpp: analyzer.supportsMacosCpp,
),
);
}
}
return modules;
}