Unverified Commit 2bdbe723 authored by Emmanuel Garcia's avatar Emmanuel Garcia Committed by GitHub

Rewire all Dart entrypoints when the Dart plugin registrant is used. (#91856)

parent 43bbdd08
...@@ -685,6 +685,9 @@ const String _dartPluginRegistryForNonWebTemplate = ''' ...@@ -685,6 +685,9 @@ const String _dartPluginRegistryForNonWebTemplate = '''
// @dart = {{dartLanguageVersion}} // @dart = {{dartLanguageVersion}}
// When `{{mainEntrypoint}}` defines `main`, that definition is shadowed by the definition below.
export '{{mainEntrypoint}}';
import '{{mainEntrypoint}}' as entrypoint; import '{{mainEntrypoint}}' as entrypoint;
import 'dart:io'; // flutter_ignore: dart_io_import. import 'dart:io'; // flutter_ignore: dart_io_import.
{{#android}} {{#android}}
......
...@@ -243,6 +243,9 @@ void main() { ...@@ -243,6 +243,9 @@ void main() {
'\n' '\n'
'// @dart = 2.12\n' '// @dart = 2.12\n'
'\n' '\n'
'// When `package:path_provider_example/main.dart` defines `main`, that definition is shadowed by the definition below.\n'
"export 'package:path_provider_example/main.dart';\n"
'\n'
"import 'package:path_provider_example/main.dart' as entrypoint;\n" "import 'package:path_provider_example/main.dart' as entrypoint;\n"
"import 'dart:io'; // flutter_ignore: dart_io_import.\n" "import 'dart:io'; // flutter_ignore: dart_io_import.\n"
"import 'package:path_provider_linux/path_provider_linux.dart';\n" "import 'package:path_provider_linux/path_provider_linux.dart';\n"
...@@ -382,6 +385,9 @@ void main() { ...@@ -382,6 +385,9 @@ void main() {
'\n' '\n'
'// @dart = 2.12\n' '// @dart = 2.12\n'
'\n' '\n'
'// When `file:///root/external.dart` defines `main`, that definition is shadowed by the definition below.\n'
"export 'file:///root/external.dart';\n"
'\n'
"import 'file:///root/external.dart' as entrypoint;\n" "import 'file:///root/external.dart' as entrypoint;\n"
"import 'dart:io'; // flutter_ignore: dart_io_import.\n" "import 'dart:io'; // flutter_ignore: dart_io_import.\n"
"import 'package:path_provider_linux/path_provider_linux.dart';\n" "import 'package:path_provider_linux/path_provider_linux.dart';\n"
......
...@@ -599,6 +599,9 @@ void main() { ...@@ -599,6 +599,9 @@ void main() {
'\n' '\n'
'// @dart = 2.8\n' '// @dart = 2.8\n'
'\n' '\n'
'// When `package:app/main.dart` defines `main`, that definition is shadowed by the definition below.\n'
"export 'package:app/main.dart';\n"
'\n'
"import 'package:app/main.dart' as entrypoint;\n" "import 'package:app/main.dart' as entrypoint;\n"
"import 'dart:io'; // flutter_ignore: dart_io_import.\n" "import 'dart:io'; // flutter_ignore: dart_io_import.\n"
"import 'package:url_launcher_android/url_launcher_android.dart';\n" "import 'package:url_launcher_android/url_launcher_android.dart';\n"
...@@ -699,6 +702,203 @@ void main() { ...@@ -699,6 +702,203 @@ void main() {
ProcessManager: () => FakeProcessManager.any(), ProcessManager: () => FakeProcessManager.any(),
}); });
testUsingContext('Rewires entrypoints', () async {
flutterProject.isModule = true;
createFakeDartPlugins(
flutterProject,
flutterManifest,
fs,
<String, String>{
'url_launcher_android': '''
flutter:
plugin:
implements: url_launcher
platforms:
android:
dartPluginClass: AndroidPlugin
''',
'url_launcher_ios': '''
flutter:
plugin:
implements: url_launcher
platforms:
ios:
dartPluginClass: IosPlugin
''',
'url_launcher_macos': '''
flutter:
plugin:
implements: url_launcher
platforms:
macos:
dartPluginClass: MacOSPlugin
''',
'url_launcher_linux': '''
flutter:
plugin:
implements: url_launcher
platforms:
linux:
dartPluginClass: LinuxPlugin
''',
'url_launcher_windows': '''
flutter:
plugin:
implements: url_launcher
platforms:
windows:
dartPluginClass: WindowsPlugin
''',
'awesome_macos': '''
flutter:
plugin:
implements: awesome
platforms:
macos:
dartPluginClass: AwesomeMacOS
'''
});
final Directory libDir = flutterProject.directory.childDirectory('lib');
libDir.createSync(recursive: true);
final File mainFile = libDir.childFile('main.dart');
mainFile.writeAsStringSync('''
// @dart = 2.8
void main() {
}
@pragma('vm:entry-point')
void dream() => run(interactive: false);
@pragma('vm:entry-point', foobar)
void dreamWithFlags() => run(interactive: false);
''');
final PackageConfig packageConfig = await loadPackageConfigWithLogging(
flutterProject.directory.childDirectory('.dart_tool').childFile('package_config.json'),
logger: globals.logger,
throwOnError: false,
);
await generateMainDartWithPluginRegistrant(
flutterProject,
packageConfig,
'package:app/main.dart',
mainFile,
throwOnPluginPubspecError: true,
);
expect(flutterProject.dartPluginRegistrant.readAsStringSync(),
'//\n'
'// Generated file. Do not edit.\n'
'// This file is generated from template in file `flutter_tools/lib/src/flutter_plugins.dart`.\n'
'//\n'
'\n'
'// @dart = 2.8\n'
'\n'
'// When `package:app/main.dart` defines `main`, that definition is shadowed by the definition below.\n'
"export 'package:app/main.dart';\n"
'\n'
"import 'package:app/main.dart' as entrypoint;\n"
"import 'dart:io'; // flutter_ignore: dart_io_import.\n"
"import 'package:url_launcher_android/url_launcher_android.dart';\n"
"import 'package:url_launcher_ios/url_launcher_ios.dart';\n"
"import 'package:url_launcher_linux/url_launcher_linux.dart';\n"
"import 'package:awesome_macos/awesome_macos.dart';\n"
"import 'package:url_launcher_macos/url_launcher_macos.dart';\n"
"import 'package:url_launcher_windows/url_launcher_windows.dart';\n"
'\n'
"@pragma('vm:entry-point')\n"
'class _PluginRegistrant {\n'
'\n'
" @pragma('vm:entry-point')\n"
' static void register() {\n'
' if (Platform.isAndroid) {\n'
' try {\n'
' AndroidPlugin.registerWith();\n'
' } catch (err) {\n'
' print(\n'
" '`url_launcher_android` threw an error: \$err. '\n"
" 'The app may not function as expected until you remove this plugin from pubspec.yaml'\n"
' );\n'
' rethrow;\n'
' }\n'
'\n'
' } else if (Platform.isIOS) {\n'
' try {\n'
' IosPlugin.registerWith();\n'
' } catch (err) {\n'
' print(\n'
" '`url_launcher_ios` threw an error: \$err. '\n"
" 'The app may not function as expected until you remove this plugin from pubspec.yaml'\n"
' );\n'
' rethrow;\n'
' }\n'
'\n'
' } else if (Platform.isLinux) {\n'
' try {\n'
' LinuxPlugin.registerWith();\n'
' } catch (err) {\n'
' print(\n'
" '`url_launcher_linux` threw an error: \$err. '\n"
" 'The app may not function as expected until you remove this plugin from pubspec.yaml'\n"
' );\n'
' rethrow;\n'
' }\n'
'\n'
' } else if (Platform.isMacOS) {\n'
' try {\n'
' AwesomeMacOS.registerWith();\n'
' } catch (err) {\n'
' print(\n'
" '`awesome_macos` threw an error: \$err. '\n"
" 'The app may not function as expected until you remove this plugin from pubspec.yaml'\n"
' );\n'
' rethrow;\n'
' }\n'
'\n'
' try {\n'
' MacOSPlugin.registerWith();\n'
' } catch (err) {\n'
' print(\n'
" '`url_launcher_macos` threw an error: \$err. '\n"
" 'The app may not function as expected until you remove this plugin from pubspec.yaml'\n"
' );\n'
' rethrow;\n'
' }\n'
'\n'
' } else if (Platform.isWindows) {\n'
' try {\n'
' WindowsPlugin.registerWith();\n'
' } catch (err) {\n'
' print(\n'
" '`url_launcher_windows` threw an error: \$err. '\n"
" 'The app may not function as expected until you remove this plugin from pubspec.yaml'\n"
' );\n'
' rethrow;\n'
' }\n'
'\n'
' }\n'
' }\n'
'\n'
'}\n'
'\n'
'typedef _UnaryFunction = dynamic Function(List<String> args);\n'
'typedef _NullaryFunction = dynamic Function();\n'
'\n'
'void main(List<String> args) {\n'
' if (entrypoint.main is _UnaryFunction) {\n'
' (entrypoint.main as _UnaryFunction)(args);\n'
' } else {\n'
' (entrypoint.main as _NullaryFunction)();\n'
' }\n'
'}\n'
,
);
}, overrides: <Type, Generator>{
FileSystem: () => fs,
ProcessManager: () => FakeProcessManager.any(),
});
testUsingContext('Plugin without platform support throws tool exit', () async { testUsingContext('Plugin without platform support throws tool exit', () async {
flutterProject.isModule = false; flutterProject.isModule = false;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment