Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Prev Previous commit
Next Next commit
update merging logic, relocate overflow class injection, add test
  • Loading branch information
tarrinneal committed Feb 25, 2025
commit d263fb759fb1c2878a5e3297f9c5f8bc6aa1d09f
5 changes: 4 additions & 1 deletion packages/pigeon/lib/src/cpp/cpp_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:path/path.dart' as path;

import '../ast.dart';
import '../functional.dart';
import '../generator.dart';
Expand Down Expand Up @@ -113,7 +115,8 @@ class InternalCppOptions {
this.cppHeaderOut,
this.cppSourceOut,
Iterable<String>? copyrightHeader,
}) : headerIncludePath = options.headerIncludePath,
}) : headerIncludePath =
options.headerIncludePath ?? path.basename(cppHeaderOut!),
namespace = options.namespace,
copyrightHeader = options.copyrightHeader ?? copyrightHeader,
headerOutPath = options.headerOutPath;
Expand Down
5 changes: 4 additions & 1 deletion packages/pigeon/lib/src/gobject/gobject_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:path/path.dart' as path;

import '../ast.dart';
import '../generator.dart';
import '../generator_tools.dart';
Expand Down Expand Up @@ -89,7 +91,8 @@ class InternalGObjectOptions {
this.gobjectHeaderOut,
this.gobjectSourceOut,
Iterable<String>? copyrightHeader,
}) : headerIncludePath = options.headerIncludePath,
}) : headerIncludePath =
options.headerIncludePath ?? path.basename(gobjectHeaderOut!),
module = options.module,
copyrightHeader = options.copyrightHeader ?? copyrightHeader,
headerOutPath = options.headerOutPath;
Expand Down
5 changes: 4 additions & 1 deletion packages/pigeon/lib/src/objc/objc_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:path/path.dart' as path;

import '../ast.dart';
import '../functional.dart';
import '../generator.dart';
Expand Down Expand Up @@ -110,7 +112,8 @@ class InternalObjcOptions {
this.objcSourceOut,
String? fileSpecificClassNameComponent,
Iterable<String>? copyrightHeader,
}) : headerIncludePath = options.headerIncludePath,
}) : headerIncludePath =
options.headerIncludePath ?? path.basename(objcHeaderOut!),
prefix = options.prefix,
copyrightHeader = options.copyrightHeader ?? copyrightHeader,
fileSpecificClassNameComponent =
Expand Down
47 changes: 4 additions & 43 deletions packages/pigeon/lib/src/pigeon_lib.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import 'package:analyzer/dart/ast/visitor.dart' as dart_ast_visitor;
import 'package:analyzer/error/error.dart' show AnalysisError;
import 'package:args/args.dart';
import 'package:collection/collection.dart' as collection;
import 'package:meta/meta.dart' show visibleForTesting;
import 'package:path/path.dart' as path;
import 'package:pub_semver/pub_semver.dart';

Expand Down Expand Up @@ -2677,8 +2678,8 @@ ${_argParser.usage}''';
PigeonOptions options, {
List<GeneratorAdapter>? adapters,
String? sdkPath,
bool injectOverflowTypes = false,
bool mergeDefinitionFileOptions = true,
@visibleForTesting ParseResults? parseResults,
}) async {
final Pigeon pigeon = Pigeon.setup();
if (options.debugGenerators ?? false) {
Expand All @@ -2703,21 +2704,8 @@ ${_argParser.usage}''';
return 0;
}

final ParseResults parseResults =
pigeon.parseFile(options.input!, sdkPath: sdkPath);

if (injectOverflowTypes) {
final List<Enum> addedEnums = List<Enum>.generate(
totalCustomCodecKeysAllowed - 1,
(final int tag) {
return Enum(
name: 'FillerEnum$tag',
members: <EnumMember>[EnumMember(name: 'FillerMember$tag')]);
},
);
addedEnums.addAll(parseResults.root.enums);
parseResults.root.enums = addedEnums;
}
parseResults =
parseResults ?? pigeon.parseFile(options.input!, sdkPath: sdkPath);

final List<Error> errors = <Error>[];
errors.addAll(parseResults.errors);
Expand All @@ -2734,37 +2722,10 @@ ${_argParser.usage}''';
mergeMaps(options.toMap(), parseResults.pigeonOptions!));
}

if (options.objcHeaderOut != null) {
options = options.merge(PigeonOptions(
objcOptions: (options.objcOptions ?? const ObjcOptions()).merge(
ObjcOptions(
headerIncludePath: options.objcOptions?.headerIncludePath ??
path.basename(options.objcHeaderOut!)))));
}

if (options.cppHeaderOut != null) {
options = options.merge(PigeonOptions(
cppOptions: (options.cppOptions ?? const CppOptions()).merge(
CppOptions(
headerIncludePath: options.cppOptions?.headerIncludePath ??
path.basename(options.cppHeaderOut!)))));
}

if (options.gobjectHeaderOut != null) {
options = options.merge(PigeonOptions(
gobjectOptions: (options.gobjectOptions ?? const GObjectOptions())
.merge(GObjectOptions(
headerIncludePath:
path.basename(options.gobjectHeaderOut!)))));
}

final InternalPigeonOptions internalOptions =
InternalPigeonOptions.fromPigeonOptions(options);

for (final GeneratorAdapter adapter in safeGeneratorAdapters) {
if (injectOverflowTypes && adapter is GObjectGeneratorAdapter) {
continue;
}
final IOSink? sink =
adapter.shouldGenerate(internalOptions, FileType.source);
if (sink != null) {
Expand Down
3 changes: 2 additions & 1 deletion packages/pigeon/pigeons/enum.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
import 'package:pigeon/pigeon.dart';

@ConfigurePigeon(PigeonOptions(
objcOptions: ObjcOptions(prefix: 'PGN'),
// This is here to test option merging.
objcOptions: ObjcOptions(prefix: 'ThisShouldntEndUpInTheOutput'),
))

/// This comment is to test enum documentation comments.
Expand Down
2 changes: 1 addition & 1 deletion packages/pigeon/test/pigeon_lib_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1376,7 +1376,7 @@ abstract class Api {
await completer.future;
});

test('run with InternalPigeonOptions', () async {
test('run with PigeonOptions', () async {
final Completer<void> completer = Completer<void>();
withTempFile('foo.dart', (File input) async {
final _ValidatorGeneratorAdapter generator =
Expand Down
43 changes: 37 additions & 6 deletions packages/pigeon/tool/shared/generation.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'dart:io' show Platform;

import 'package:path/path.dart' as p;
import 'package:pigeon/pigeon.dart';
import 'package:pigeon/src/ast.dart';
import 'package:pigeon/src/generator_tools.dart';

import 'process_utils.dart';
Expand Down Expand Up @@ -204,10 +205,15 @@ Future<int> generateTestPigeons(
objcSourceOut: skipLanguages.contains(GeneratorLanguage.objc)
? null
: '$alternateOutputBase/ios/Classes/$pascalCaseName.gen.m',
objcPrefix: input == 'core_tests' ? 'FLT' : '',
objcPrefix: input == 'core_tests'
? 'FLT'
: input == 'enum'
? 'PGN'
: '',
suppressVersion: true,
dartPackageName: 'pigeon_integration_tests',
injectOverflowTypes: includeOverflow && input == 'core_tests',
mergeDefinitionFileOptions: input != 'enum',
);
if (generateCode != 0) {
return generateCode;
Expand All @@ -224,10 +230,15 @@ Future<int> generateTestPigeons(
objcSourceOut: skipLanguages.contains(GeneratorLanguage.objc)
? null
: '$alternateOutputBase/macos/Classes/$pascalCaseName.gen.m',
objcPrefix: input == 'core_tests' ? 'FLT' : '',
objcPrefix: input == 'core_tests'
? 'FLT'
: input == 'enum'
? 'PGN'
: '',
suppressVersion: true,
dartPackageName: 'pigeon_integration_tests',
injectOverflowTypes: includeOverflow && input == 'core_tests',
mergeDefinitionFileOptions: input != 'enum',
);
if (generateCode != 0) {
return generateCode;
Expand Down Expand Up @@ -263,6 +274,7 @@ Future<int> runPigeon({
String? basePath,
String? dartPackageName,
bool injectOverflowTypes = false,
bool mergeDefinitionFileOptions = true,
}) async {
// Temporarily suppress the version output via the global flag if requested.
// This is done because having the version in all the generated test output
Expand All @@ -276,6 +288,22 @@ Future<int> runPigeon({
if (suppressVersion) {
includeVersionInGeneratedWarning = false;
}

// parse results in advance when overflow is included to avoid exposing as public option
final ParseResults parseResults = Pigeon().parseFile(input);
if (injectOverflowTypes) {
final List<Enum> addedEnums = List<Enum>.generate(
totalCustomCodecKeysAllowed - 1,
(final int tag) {
return Enum(
name: 'FillerEnum$tag',
members: <EnumMember>[EnumMember(name: 'FillerMember$tag')]);
},
);
addedEnums.addAll(parseResults.root.enums);
parseResults.root.enums = addedEnums;
}

final int result = await Pigeon.runWithOptions(
PigeonOptions(
input: input,
Expand All @@ -286,9 +314,10 @@ Future<int> runPigeon({
cppHeaderOut: cppHeaderOut,
cppSourceOut: cppSourceOut,
cppOptions: CppOptions(namespace: cppNamespace),
gobjectHeaderOut: gobjectHeaderOut,
gobjectSourceOut: gobjectSourceOut,
gobjectOptions: GObjectOptions(module: gobjectModule),
gobjectHeaderOut: injectOverflowTypes ? null : gobjectHeaderOut,
gobjectSourceOut: injectOverflowTypes ? null : gobjectSourceOut,
gobjectOptions:
injectOverflowTypes ? null : GObjectOptions(module: gobjectModule),
javaOut: javaOut,
javaOptions: JavaOptions(package: javaPackage),
kotlinOut: kotlinOut,
Expand All @@ -308,7 +337,9 @@ Future<int> runPigeon({
basePath: basePath,
dartPackageName: dartPackageName,
),
injectOverflowTypes: injectOverflowTypes,
// ignore: invalid_use_of_visible_for_testing_member
parseResults: injectOverflowTypes ? parseResults : null,
mergeDefinitionFileOptions: mergeDefinitionFileOptions,
);
includeVersionInGeneratedWarning = originalWarningSetting;
return result;
Expand Down