Implementation
Future<List<String>> getImportDirectives({
Uri? uri,
String? source,
bool alsoImportOriginalFile = false,
}) async {
if (uri != null && source != null) {
throw ArgumentError(
"either uri or source must be non-null, but not both",
);
}
if (uri == null && source == null) {
throw ArgumentError(
"either uri or source must be non-null, but not both",
);
}
if (alsoImportOriginalFile == true && uri == null) {
throw ArgumentError(
"flag 'alsoImportOriginalFile' may only be set if 'uri' is also set",
);
}
final Package? package = await getPackageFromUri(uri);
final String? trailingSegments = uri?.pathSegments.sublist(1).join('/');
final fileUri =
package?.packageUriRoot.resolve(trailingSegments ?? '') ?? uri;
final text = source ?? File.fromUri(fileUri!).readAsStringSync();
final importRegex = RegExp("import [\\'\\\"]([^\\'\\\"]*)[\\'\\\"];");
final imports = importRegex.allMatches(text).map((m) {
final importedUri = Uri.parse(m.group(1)!);
if (!importedUri.isAbsolute) {
final path = fileUri
?.resolve(importedUri.path)
.toFilePath(windows: Platform.isWindows);
return "import 'file:${absolute(path!)}';";
}
return text.substring(m.start, m.end);
}).toList();
if (alsoImportOriginalFile) {
imports.add("import '$uri';");
}
return imports;
}