Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
111 changes: 107 additions & 4 deletions packages/pigeon/bin/pigeon.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// @dart = 2.2
// @dart = 2.3

import 'dart:async';
import 'dart:io';
Expand All @@ -26,18 +26,122 @@ String _posixRelative(String input, {String from}) {
return context.relative(posixAbsInputPath, from: posixTempPath);
}

/// aa_bb_cc -> AaBbCc
String _underLineToHump(String str) {
return str
.split('_')
.map((String e) => e.replaceRange(0, 1, e[0].toUpperCase()))
.join();
}

/// AaBbCc -> aa_bb_cc
String _humpToUnderLine(String str) {
return str.replaceAllMapped(RegExp(r'(^[A-Z])|([A-Z])'), (Match match) {
if (match[2] != null) {
return '_${match[2]?.toLowerCase()}';
} else {
return match[1]?.toLowerCase() ?? '';
}
});
}

Future<void> main(List<String> args) async {
final PigeonOptions opts = Pigeon.parseArgs(args);
final Directory tempDir = Directory.systemTemp.createTempSync(
'flutter_pigeon.',
);
if (opts.isDir) {
final Directory inputDir = Directory(opts.inputDir);
if (!inputDir.existsSync()) {
tempDir.deleteSync(recursive: true);
exit(exitCode);
}

final List<FileSystemEntity> list = inputDir.listSync(recursive: true);
final List<String> inputDirs = path.split(opts.inputDir);
for (int i = 0; i < list.length; i++) {
final FileSystemEntity element = list[i];
if (element is File) {
final String input = element.path;
final List<String> fileParents = path.split(input);
final String fileName = path.basenameWithoutExtension(input);
final String outName = _humpToUnderLine('${fileName}_${opts.suffit}');
final String humpName = _underLineToHump(outName);
opts.input = input;

final List<String> middle =
fileParents.sublist(inputDirs.length, fileParents.length - 1);
final List<String> javaPackage = middle.isNotEmpty
? <String>[
'--java_package',
'${opts.javaOptions.package}.${middle.join('.')}',
]
: <String>[
'--java_package',
opts.javaOptions.package,
];

final List<String> objcPrefix = opts.objcOptions.prefix != null
? <String>[
'--objc_prefix',
opts.objcOptions.prefix,
]
: List<String>.empty();

final List<String> fileArgs = <String>[
'--input',
input,
'--dart_out',
path.join(
opts.dartOutDir.replaceAll('/', path.separator),
middle.join(path.separator),
'$outName.dart',
),
'--java_out',
path.join(
opts.javaOutDir.replaceAll('/', path.separator),
opts.javaOptions.package?.replaceAll('.', path.separator) ?? '',
middle.join(path.separator),
'$humpName.java',
),
...javaPackage,
'--objc_header_out',
path.join(
opts.objcOutDir.replaceAll('/', path.separator),
middle.join(path.separator),
'$humpName.h',
),
'--objc_source_out',
path.join(
opts.objcOutDir.replaceAll('/', path.separator),
middle.join(path.separator),
'$humpName.m',
),
...objcPrefix,
];

print('generate file $input');
print('generate args $fileArgs');
final int code = await _genFile(fileArgs, opts, tempDir);
print('generate resule $code $input');
print('============================');
}
}
} else {
await _genFile(args, opts, tempDir);
}
tempDir.deleteSync(recursive: true);
exit(exitCode);
}

Future<int> _genFile(
List<String> args, PigeonOptions opts, Directory tempDir) async {
String importLine = '';
if (opts.input != null) {
final String relInputPath = _posixRelative(opts.input, from: tempDir.path);
importLine = 'import \'$relInputPath\';\n';
}
final String code = """// @dart = 2.2
final String code = """// @dart = 2.3
$importLine
import 'dart:io';
import 'dart:isolate';
Expand Down Expand Up @@ -68,6 +172,5 @@ void main(List<String> args, SendPort sendPort) async {
}
});
final int exitCode = await completer.future;
tempDir.deleteSync(recursive: true);
exit(exitCode);
return exitCode;
}
20 changes: 20 additions & 0 deletions packages/pigeon/example/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,26 @@ flutter pub run pigeon \
--java_out ./android/app/src/main/java/dev/flutter/pigeon/Pigeon.java \
--java_package "dev.flutter.pigeon"
```
### Directory model generated

Enable Directory model generated

```sh
flutter pub run pigeon --dir
```

Other args

```sh
flutter pub run pigeon --dir \
--input_dir pigeons \
--dart_out_dir lib \
--objc_out_dir ios/Runner \
--objc_prefix FL \
--java_out_dir android/app/src/main/java \
--java_package "dev.flutter.pigeon"
```


### AppDelegate.m

Expand Down
8 changes: 4 additions & 4 deletions packages/pigeon/lib/dart_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -134,14 +134,14 @@ void _writeFlutterApi(
: func.returnType == 'void'
? 'return;'
: 'return null;';
indent.write('if (message == null) ');
indent.scoped('{', '}', () {
indent.writeln(emptyReturnStatement);
});
String call;
if (argType == 'void') {
call = 'api.${func.name}()';
} else {
indent.write('if (message == null) ');
indent.scoped('{', '}', () {
indent.writeln(emptyReturnStatement);
});
indent.writeln(
'final $argType input = $argType.decode(message);',
);
Expand Down
38 changes: 38 additions & 0 deletions packages/pigeon/lib/pigeon_lib.dart
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,24 @@ bool _isFlutterApi(ClassMirror apiMirror) {

/// Options used when running the code generator.
class PigeonOptions {
/// Enable directory model
bool isDir;

/// Directory model suffit that will be appended after all generated classes or file.
String suffit;

/// Path to the directory which will be processed.
String inputDir;

/// Path to the dart direcotry that will be generated.
String dartOutDir;

/// Path to the Objective-C source and header direcotry will be generated.
String objcOutDir;

/// Path to the java direcotry that will be generated.
String javaOutDir;

/// Path to the file which will be processed.
String input;

Expand Down Expand Up @@ -284,6 +302,19 @@ options:
}

static final ArgParser _argParser = ArgParser()
..addFlag('dir', abbr: 'd', help: 'Enable directory model')
..addOption('suffit',
defaultsTo: 'pigeon',
help: 'Directory model suffix for generated classes or files.')
..addOption('input_dir', defaultsTo: 'pigeons', help: 'Path to pigeon.')
..addOption('dart_out_dir',
defaultsTo: 'lib', help: 'Path to generated Dart source directory.')
..addOption('java_out_dir',
defaultsTo: 'android/src/main/java',
help: 'Path to generated Java directory.')
..addOption('objc_out_dir',
defaultsTo: 'ios/Classes',
help: 'Path to generated Objective-C source and header directory.')
..addOption('input', help: 'REQUIRED: Path to pigeon file.')
..addOption('dart_out',
help: 'REQUIRED: Path to generated Dart source file (.dart).')
Expand All @@ -307,6 +338,12 @@ options:
final ArgResults results = _argParser.parse(args);

final PigeonOptions opts = PigeonOptions();
opts.isDir = results['dir'];
opts.suffit = results['suffit'];
opts.inputDir = results['input_dir'];
opts.dartOutDir = results['dart_out_dir'];
opts.objcOutDir = results['objc_out_dir'];
opts.javaOutDir = results['java_out_dir'];
opts.input = results['input'];
opts.dartOut = results['dart_out'];
opts.dartTestOut = results['dart_test_out'];
Expand All @@ -327,6 +364,7 @@ options:
sink = stdout;
} else {
file = File(output);
file.parent.createSync(recursive: true);
sink = file.openWrite();
}
func(sink);
Expand Down
2 changes: 1 addition & 1 deletion packages/pigeon/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ dependencies:
dev_dependencies:
test: ^1.11.1
environment:
sdk: '>=2.2.0 <3.0.0'
sdk: '>=2.3.0 <3.0.0'