[cfe] Create SourceProcedureBuilder through fragments Change-Id: If7fe7cc1b7779950e2d2a0227dde20c02eafddbf Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/385440 Commit-Queue: Johnni Winther <johnniwinther@google.com> Reviewed-by: Jens Johansen <jensj@google.com>
diff --git a/pkg/front_end/lib/src/builder/member_builder.dart b/pkg/front_end/lib/src/builder/member_builder.dart index 2c7ba80..2064e3e 100644 --- a/pkg/front_end/lib/src/builder/member_builder.dart +++ b/pkg/front_end/lib/src/builder/member_builder.dart
@@ -123,6 +123,7 @@ @override LibraryBuilder get libraryBuilder { if (parent is LibraryBuilder) { + // Coverage-ignore-block(suite): Not run. LibraryBuilder library = parent as LibraryBuilder; return library.partOfLibrary ?? library; } else if (parent is ExtensionBuilder) {
diff --git a/pkg/front_end/lib/src/fragment/fragment.dart b/pkg/front_end/lib/src/fragment/fragment.dart index 4611b77..6239b0e 100644 --- a/pkg/front_end/lib/src/fragment/fragment.dart +++ b/pkg/front_end/lib/src/fragment/fragment.dart
@@ -10,6 +10,7 @@ import '../builder/builder.dart'; import '../builder/constructor_reference_builder.dart'; import '../builder/declaration_builders.dart'; +import '../builder/formal_parameter_builder.dart'; import '../builder/metadata_builder.dart'; import '../builder/mixin_application_builder.dart'; import '../builder/type_builder.dart'; @@ -19,6 +20,7 @@ import '../source/source_extension_builder.dart'; import '../source/source_extension_type_declaration_builder.dart'; import '../source/source_field_builder.dart'; +import '../source/source_procedure_builder.dart'; import '../source/source_type_alias_builder.dart'; import '../source/type_parameter_scope_builder.dart'; @@ -525,3 +527,62 @@ @override String toString() => '$runtimeType($name,$fileUri,$charOffset)'; } + +class MethodFragment implements Fragment { + final String name; + final Uri fileUri; + final int startCharOffset; + final int charOffset; + final int charOpenParenOffset; + final int charEndOffset; + final List<MetadataBuilder>? metadata; + final int modifiers; + final TypeBuilder returnType; + final List<NominalVariableBuilder>? typeParameters; + final List<FormalParameterBuilder>? formals; + final ProcedureKind kind; + final Reference? procedureReference; + final Reference? tearOffReference; + final AsyncMarker asyncModifier; + final NameScheme nameScheme; + final String? nativeMethodName; + + SourceProcedureBuilder? _builder; + + MethodFragment( + {required this.name, + required this.fileUri, + required this.startCharOffset, + required this.charOffset, + required this.charOpenParenOffset, + required this.charEndOffset, + required this.metadata, + required this.modifiers, + required this.returnType, + required this.typeParameters, + required this.formals, + required this.kind, + required this.procedureReference, + required this.tearOffReference, + required this.asyncModifier, + required this.nameScheme, + required this.nativeMethodName}); + + @override + SourceProcedureBuilder get builder { + assert( + _builder != null, // Coverage-ignore(suite): Not run. + "Builder has not been computed for $this."); + return _builder!; + } + + void set builder(SourceProcedureBuilder value) { + assert( + _builder == null, // Coverage-ignore(suite): Not run. + "Builder has already been computed for $this."); + _builder = value; + } + + @override + String toString() => '$runtimeType($name,$fileUri,$charOffset)'; +}
diff --git a/pkg/front_end/lib/src/source/offset_map.dart b/pkg/front_end/lib/src/source/offset_map.dart index b3cc3f3..6c06b5e04 100644 --- a/pkg/front_end/lib/src/source/offset_map.dart +++ b/pkg/front_end/lib/src/source/offset_map.dart
@@ -26,7 +26,7 @@ final Map<int, DeclarationFragment> _declarationFragments = {}; final Map<int, FieldFragment> _fields = {}; final Map<int, SourceFunctionBuilder> _constructors = {}; - final Map<int, SourceFunctionBuilder> _procedures = {}; + final Map<int, MethodFragment> _procedures = {}; final Map<int, LibraryPart> _parts = {}; final Map<int, Import> _imports = {}; final Map<int, Export> _exports = {}; @@ -121,13 +121,13 @@ identifier.nameOffset); } - void registerProcedure(Identifier identifier, SourceFunctionBuilder builder) { - _procedures[identifier.nameOffset] = builder; + void registerProcedure(Identifier identifier, MethodFragment fragment) { + _procedures[identifier.nameOffset] = fragment; } SourceFunctionBuilder lookupProcedure(Identifier identifier) { - return _checkBuilder(_procedures[identifier.nameOffset], identifier.name, - identifier.nameOffset); + return _checkBuilder(_procedures[identifier.nameOffset]?.builder, + identifier.name, identifier.nameOffset); } T _checkDirective<T>(T? directive, String name, int charOffset) {
diff --git a/pkg/front_end/lib/src/source/source_builder_factory.dart b/pkg/front_end/lib/src/source/source_builder_factory.dart index be0a28f..c491aa8 100644 --- a/pkg/front_end/lib/src/source/source_builder_factory.dart +++ b/pkg/front_end/lib/src/source/source_builder_factory.dart
@@ -63,7 +63,6 @@ import 'source_function_builder.dart'; import 'source_library_builder.dart'; import 'source_loader.dart' show SourceLoader; -import 'source_procedure_builder.dart'; import 'type_parameter_scope_builder.dart'; class BuilderFactoryImpl implements BuilderFactory, BuilderFactoryResult { @@ -125,6 +124,8 @@ final List<SourceFunctionBuilder> _nativeMethods = []; + final List<MethodFragment> _nativeMethodFragments = []; + final LibraryName libraryName; final LookupScope _compilationUnitScope; @@ -2124,6 +2125,10 @@ return suffix; } + void _addNativeMethodFragment(MethodFragment fragment) { + _nativeMethodFragments.add(fragment); + } + void _addNativeMethod(SourceFunctionBuilder method) { _nativeMethods.add(method); } @@ -2203,34 +2208,32 @@ } } } - SourceProcedureBuilder procedureBuilder = new SourceProcedureBuilder( - metadata, - modifiers, - returnType ?? addInferableType(), - name, - typeVariables, - formals, - kind, - _parent, - _compilationUnit.fileUri, - startCharOffset, - charOffset, - charOpenParenOffset, - charEndOffset, - procedureReference, - tearOffReference, - asyncModifier, - nameScheme, + MethodFragment fragment = new MethodFragment( + name: name, + fileUri: _compilationUnit.fileUri, + startCharOffset: startCharOffset, + charOffset: charOffset, + charOpenParenOffset: charOpenParenOffset, + charEndOffset: charEndOffset, + metadata: metadata, + modifiers: modifiers, + returnType: returnType ?? addInferableType(), + typeParameters: typeVariables, + formals: formals, + kind: kind, + procedureReference: procedureReference, + tearOffReference: tearOffReference, + asyncModifier: asyncModifier, + nameScheme: nameScheme, nativeMethodName: nativeMethodName); _nominalParameterNameSpaces.pop().addTypeVariables( _problemReporting, typeVariables, - ownerName: procedureBuilder.name, allowNameConflict: true); - _addBuilder(name, procedureBuilder, charOffset, - getterReference: procedureReference); + ownerName: name, allowNameConflict: true); + _addFragment(fragment, getterReference: procedureReference); if (nativeMethodName != null) { - _addNativeMethod(procedureBuilder); + _addNativeMethodFragment(fragment); } - offsetMap.registerProcedure(identifier, procedureBuilder); + offsetMap.registerProcedure(identifier, fragment); } @override @@ -2662,6 +2665,7 @@ loader.buildersCreatedWithReferences[setterReference] = declaration; } if (_declarationFragments.isEmpty) { + // Coverage-ignore-block(suite): Not run. _libraryNameSpaceBuilder.addBuilder( name, declaration, _compilationUnit.fileUri, charOffset); } else { @@ -2742,6 +2746,9 @@ for (SourceFunctionBuilder method in _nativeMethods) { method.becomeNative(loader); } + for (MethodFragment fragment in _nativeMethodFragments) { + fragment.builder.becomeNative(loader); + } return _nativeMethods.length; }
diff --git a/pkg/front_end/lib/src/source/source_enum_builder.dart b/pkg/front_end/lib/src/source/source_enum_builder.dart index d87e951..2429e3b 100644 --- a/pkg/front_end/lib/src/source/source_enum_builder.dart +++ b/pkg/front_end/lib/src/source/source_enum_builder.dart
@@ -408,6 +408,7 @@ /* formals = */ null, ProcedureKind.Method, libraryBuilder, + this, fileUri, charOffset, charOffset,
diff --git a/pkg/front_end/lib/src/source/source_function_builder.dart b/pkg/front_end/lib/src/source/source_function_builder.dart index 2c6a53d..41e34d6 100644 --- a/pkg/front_end/lib/src/source/source_function_builder.dart +++ b/pkg/front_end/lib/src/source/source_function_builder.dart
@@ -8,20 +8,8 @@ import 'package:kernel/class_hierarchy.dart'; import '../api_prototype/lowering_predicates.dart'; -import '../base/local_scope.dart'; -import '../builder/builder.dart'; -import '../builder/constructor_builder.dart'; -import '../builder/declaration_builders.dart'; -import '../builder/formal_parameter_builder.dart'; -import '../builder/function_builder.dart'; -import '../builder/library_builder.dart'; -import '../builder/member_builder.dart'; -import '../builder/metadata_builder.dart'; -import '../builder/omitted_type_builder.dart'; -import '../builder/type_builder.dart'; import '../base/identifiers.dart'; -import '../kernel/internal_ast.dart' show VariableDeclarationImpl; -import '../kernel/kernel_helper.dart'; +import '../base/local_scope.dart'; import '../base/messages.dart' show messagePatchDeclarationMismatch, @@ -31,11 +19,22 @@ templateRequiredNamedParameterHasDefaultValueError; import '../base/modifier.dart'; import '../base/scope.dart'; -import 'source_loader.dart' show SourceLoader; +import '../builder/builder.dart'; +import '../builder/constructor_builder.dart'; +import '../builder/declaration_builders.dart'; +import '../builder/formal_parameter_builder.dart'; +import '../builder/function_builder.dart'; +import '../builder/member_builder.dart'; +import '../builder/metadata_builder.dart'; +import '../builder/omitted_type_builder.dart'; +import '../builder/type_builder.dart'; +import '../kernel/internal_ast.dart' show VariableDeclarationImpl; +import '../kernel/kernel_helper.dart'; import '../type_inference/type_inference_engine.dart' show IncludesTypeParametersNonCovariantly; import 'source_builder_mixins.dart'; import 'source_extension_type_declaration_builder.dart'; +import 'source_loader.dart' show SourceLoader; import 'source_member_builder.dart'; abstract class SourceFunctionBuilder @@ -155,11 +154,11 @@ this.name, this.typeVariables, this.formals, - LibraryBuilder compilationUnit, + Builder parent, Uri fileUri, int charOffset, this.nativeMethodName) - : super(compilationUnit, fileUri, charOffset) { + : super(parent, fileUri, charOffset) { returnType.registerInferredTypeListener(this); if (formals != null) { for (int i = 0; i < formals!.length; i++) {
diff --git a/pkg/front_end/lib/src/source/source_loader.dart b/pkg/front_end/lib/src/source/source_loader.dart index e569f42..694cf3c 100644 --- a/pkg/front_end/lib/src/source/source_loader.dart +++ b/pkg/front_end/lib/src/source/source_loader.dart
@@ -1383,6 +1383,7 @@ /* formals = */ null, ProcedureKind.Method, libraryBuilder, + null, libraryBuilder.fileUri, /* start char offset = */ 0, /* char offset = */ 0,
diff --git a/pkg/front_end/lib/src/source/source_procedure_builder.dart b/pkg/front_end/lib/src/source/source_procedure_builder.dart index 1fcb101..91d2d99 100644 --- a/pkg/front_end/lib/src/source/source_procedure_builder.dart +++ b/pkg/front_end/lib/src/source/source_procedure_builder.dart
@@ -31,6 +31,9 @@ class SourceProcedureBuilder extends SourceFunctionBuilderImpl implements ProcedureBuilder { + @override + final SourceLibraryBuilder libraryBuilder; + final int charOpenParenOffset; AsyncMarker actualAsyncModifier = AsyncMarker.Sync; @@ -84,7 +87,8 @@ List<NominalVariableBuilder>? typeVariables, List<FormalParameterBuilder>? formals, this.kind, - SourceLibraryBuilder libraryBuilder, + this.libraryBuilder, + DeclarationBuilder? declarationBuilder, Uri fileUri, int startCharOffset, int charOffset, @@ -102,8 +106,16 @@ this.isExtensionTypeInstanceMember = nameScheme.isInstanceMember && nameScheme.isExtensionTypeMember, _memberName = nameScheme.getDeclaredName(name), - super(metadata, modifiers, name, typeVariables, formals, libraryBuilder, - fileUri, charOffset, nativeMethodName) { + super( + metadata, + modifiers, + name, + typeVariables, + formals, + declarationBuilder ?? libraryBuilder, + fileUri, + charOffset, + nativeMethodName) { _procedure = new Procedure( dummyName, isExtensionInstanceMember || isExtensionTypeInstanceMember
diff --git a/pkg/front_end/lib/src/source/type_parameter_scope_builder.dart b/pkg/front_end/lib/src/source/type_parameter_scope_builder.dart index 31e0a24..6b5cd46 100644 --- a/pkg/front_end/lib/src/source/type_parameter_scope_builder.dart +++ b/pkg/front_end/lib/src/source/type_parameter_scope_builder.dart
@@ -25,6 +25,7 @@ import 'source_field_builder.dart'; import 'source_library_builder.dart'; import 'source_loader.dart'; +import 'source_procedure_builder.dart'; import 'source_type_alias_builder.dart'; sealed class _Added { @@ -383,6 +384,30 @@ fragment.builder = fieldBuilder; builders.add(new _AddBuilder(fragment.name, fieldBuilder, fragment.fileUri, fragment.charOffset)); + case MethodFragment(): + SourceProcedureBuilder procedureBuilder = new SourceProcedureBuilder( + fragment.metadata, + fragment.modifiers, + fragment.returnType, + fragment.name, + fragment.typeParameters, + fragment.formals, + fragment.kind, + enclosingLibraryBuilder, + declarationBuilder, + fragment.fileUri, + fragment.startCharOffset, + fragment.charOffset, + fragment.charOpenParenOffset, + fragment.charEndOffset, + fragment.procedureReference, + fragment.tearOffReference, + fragment.asyncModifier, + fragment.nameScheme, + nativeMethodName: fragment.nativeMethodName); + fragment.builder = procedureBuilder; + builders.add(new _AddBuilder(fragment.name, procedureBuilder, + fragment.fileUri, fragment.charOffset)); } } } @@ -394,6 +419,7 @@ List<_Added> _added = []; + // Coverage-ignore(suite): Not run. void addBuilder( String name, Builder declaration, Uri fileUri, int charOffset) { _added.add(new _AddedBuilder(
diff --git a/pkg/front_end/test/coverage_suite_expected.dart b/pkg/front_end/test/coverage_suite_expected.dart index 3a7568d..a657052 100644 --- a/pkg/front_end/test/coverage_suite_expected.dart +++ b/pkg/front_end/test/coverage_suite_expected.dart
@@ -325,7 +325,7 @@ ), // 100.0%. "package:front_end/src/builder/member_builder.dart": ( - hitCount: 148, + hitCount: 146, missCount: 0, ), // 100.0%. @@ -480,7 +480,7 @@ ), // 100.0%. "package:front_end/src/fragment/fragment.dart": ( - hitCount: 96, + hitCount: 103, missCount: 0, ), // 100.0%. @@ -790,7 +790,7 @@ ), // 100.0%. "package:front_end/src/source/offset_map.dart": ( - hitCount: 121, + hitCount: 122, missCount: 0, ), // 100.0%. @@ -805,7 +805,7 @@ ), // 100.0%. "package:front_end/src/source/source_builder_factory.dart": ( - hitCount: 1399, + hitCount: 1401, missCount: 0, ), // 100.0%. @@ -891,7 +891,7 @@ ), // 100.0%. "package:front_end/src/source/type_parameter_scope_builder.dart": ( - hitCount: 524, + hitCount: 544, missCount: 0, ), // 100.0%.