Skip to content

Commit a6b99af

Browse files
johnniwintherCommit Queue
authored andcommitted
[cfe] Create fields through SourcePropertyBuilder
Change-Id: I20c9dd7baa705aba77d90b94ba0a46ed64eb02ec Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/403600 Commit-Queue: Johnni Winther <[email protected]> Reviewed-by: Chloe Stefantsova <[email protected]>
1 parent ad562fd commit a6b99af

40 files changed

+3310
-468
lines changed

pkg/front_end/lib/src/base/incremental_compiler.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ import '../base/processed_options.dart' show ProcessedOptions;
7373
import '../builder/builder.dart' show Builder;
7474
import '../builder/declaration_builders.dart'
7575
show ClassBuilder, ExtensionBuilder, ExtensionTypeDeclarationBuilder;
76-
import '../builder/field_builder.dart' show FieldBuilder;
7776
import '../builder/library_builder.dart'
7877
show CompilationUnit, LibraryBuilder, SourceCompilationUnit;
7978
import '../builder/member_builder.dart' show MemberBuilder;
@@ -741,7 +740,9 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
741740
if (sourceBuilder == null) {
742741
sourceBuilder = sourceLibraryBuilder.exportNameSpace
743742
.lookupLocalMember(name, setter: false);
744-
if (sourceBuilder is FieldBuilder && sourceBuilder.isAssignable) {
743+
if (sourceBuilder is MemberBuilder &&
744+
sourceBuilder.isField &&
745+
sourceBuilder.isAssignable) {
745746
// Assignable fields can be lowered into a getter and setter.
746747
return;
747748
}

pkg/front_end/lib/src/base/scope.dart

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -687,6 +687,14 @@ mixin ErroneousMemberBuilderMixin implements SourceMemberBuilder {
687687
// Coverage-ignore(suite): Not run.
688688
bool get isAbstract => false;
689689

690+
@override
691+
// Coverage-ignore(suite): Not run.
692+
bool get isFinal => false;
693+
694+
@override
695+
// Coverage-ignore(suite): Not run.
696+
bool get isSynthesized => false;
697+
690698
@override
691699
bool get isConflictingSetter => false;
692700

@@ -1503,8 +1511,9 @@ extension on Builder {
15031511
return _hasPatchAnnotation(self.metadata);
15041512
} else if (self is SourceMethodBuilder) {
15051513
return _hasPatchAnnotation(self.metadata);
1506-
} else if (self is SourceExtensionTypeDeclarationBuilder) {
1507-
// Coverage-ignore-block(suite): Not run.
1514+
}
1515+
// Coverage-ignore(suite): Not run.
1516+
else if (self is SourceExtensionTypeDeclarationBuilder) {
15081517
return _hasPatchAnnotation(self.metadata);
15091518
}
15101519
return false;

pkg/front_end/lib/src/builder/builder_mixins.dart

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import '../base/problems.dart';
1010
import '../base/scope.dart';
1111
import 'builder.dart';
1212
import 'declaration_builders.dart';
13-
import 'field_builder.dart';
1413
import 'library_builder.dart';
1514
import 'member_builder.dart';
1615
import 'nullability_builder.dart';
@@ -96,16 +95,16 @@ mixin DeclarationBuilderMixin implements IDeclarationBuilder {
9695
if (builder == null && setter) {
9796
// When looking up setters, we include assignable fields.
9897
builder = lookupLocalMember(name.text, setter: false, required: required);
99-
if (builder is! FieldBuilder || !builder.isAssignable) {
98+
if (builder is! MemberBuilder ||
99+
!builder.isField ||
100+
!builder.isAssignable) {
100101
builder = null;
101102
}
102103
}
103104
if (builder != null) {
104105
if (name.isPrivate && libraryBuilder.library != name.library) {
105106
builder = null;
106-
} else if (builder is FieldBuilder &&
107-
!builder.isStatic &&
108-
!builder.isExternal) {
107+
} else if (builder.isField && !builder.isStatic && !builder.isExternal) {
109108
// Non-external extension instance fields are invalid.
110109
builder = null;
111110
} else if (builder.isDuplicate) {

pkg/front_end/lib/src/builder/formal_parameter_builder.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@ import '../kernel/wildcard_lowering.dart';
1919
import '../source/builder_factory.dart';
2020
import '../source/constructor_declaration.dart';
2121
import '../source/source_factory_builder.dart';
22-
import '../source/source_field_builder.dart';
2322
import '../source/source_library_builder.dart';
2423
import 'builder.dart';
2524
import 'constructor_builder.dart';
2625
import 'declaration_builders.dart';
2726
import 'member_builder.dart';
2827
import 'omitted_type_builder.dart';
28+
import 'property_builder.dart';
2929
import 'type_builder.dart';
3030
import 'variable_builder.dart';
3131

@@ -229,7 +229,7 @@ class FormalParameterBuilder extends BuilderImpl
229229
ClassHierarchyBase hierarchy) {
230230
String fieldName = isWildcardLoweredFormalParameter(name) ? '_' : name;
231231
Builder? fieldBuilder = declarationBuilder.lookupLocalMember(fieldName);
232-
if (fieldBuilder is SourceFieldBuilder) {
232+
if (fieldBuilder is PropertyBuilder && fieldBuilder.isField) {
233233
DartType fieldType = fieldBuilder.inferType(hierarchy);
234234
fieldType = constructorDeclaration.substituteFieldType(fieldType);
235235
type.registerInferredType(fieldType);

pkg/front_end/lib/src/builder/invalid_type_declaration_builder.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class InvalidTypeDeclarationBuilder extends TypeDeclarationBuilderImpl
2828

2929
@override
3030
// Coverage-ignore(suite): Not run.
31-
Uri? get fileUri => message.uri;
31+
Uri get fileUri => message.uri!;
3232

3333
@override
3434
DartType buildAliasedType(

pkg/front_end/lib/src/builder/member_builder.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ abstract class BuilderClassMember implements ClassMember {
186186
Uri get fileUri => memberBuilder.fileUri;
187187

188188
@override
189+
// Coverage-ignore(suite): Not run.
189190
bool get isExtensionTypeMember => memberBuilder.isExtensionTypeMember;
190191

191192
@override
@@ -206,6 +207,7 @@ abstract class BuilderClassMember implements ClassMember {
206207
bool get isDuplicate => memberBuilder.isDuplicate;
207208

208209
@override
210+
// Coverage-ignore(suite): Not run.
209211
bool get isField => memberBuilder.isField;
210212

211213
@override
@@ -231,9 +233,11 @@ abstract class BuilderClassMember implements ClassMember {
231233
bool get isSynthesized => false;
232234

233235
@override
236+
// Coverage-ignore(suite): Not run.
234237
bool get isInternalImplementation => false;
235238

236239
@override
240+
// Coverage-ignore(suite): Not run.
237241
bool get isNoSuchMethodForwarder => false;
238242

239243
@override
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'package:kernel/ast.dart';
6+
import 'package:kernel/class_hierarchy.dart';
7+
8+
import 'member_builder.dart';
9+
10+
abstract class PropertyBuilder implements MemberBuilder {
11+
bool get hasInitializer;
12+
13+
@override
14+
Uri get fileUri;
15+
16+
bool get isExtensionTypeDeclaredInstanceField;
17+
18+
bool get isLate;
19+
20+
bool get isFinal;
21+
22+
abstract DartType fieldType;
23+
24+
DartType inferType(ClassHierarchyBase hierarchy);
25+
26+
/// Builds the field initializers for each field used to encode this field
27+
/// using the [fileOffset] for the created nodes and [value] as the initial
28+
/// field value.
29+
List<Initializer> buildInitializer(int fileOffset, Expression value,
30+
{required bool isSynthetic});
31+
32+
/// Creates the AST node for this field as the default initializer.
33+
void buildImplicitDefaultValue();
34+
35+
/// Create the [Initializer] for the implicit initialization of this field
36+
/// in a constructor.
37+
Initializer buildImplicitInitializer();
38+
39+
Initializer buildErroneousInitializer(Expression effect, Expression value,
40+
{required int fileOffset});
41+
}

0 commit comments

Comments
 (0)