Skip to content

Commit a2a03d2

Browse files
johnniwintherCommit Queue
authored andcommitted
[cfe] Add PrimaryConstructorFragment
Change-Id: Id46a32408e99896030b1a507dc59e9c9b245fde5 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/390680 Reviewed-by: Chloe Stefantsova <[email protected]>
1 parent 42364b1 commit a2a03d2

11 files changed

+314
-114
lines changed

pkg/front_end/lib/src/fragment/fragment.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ part 'getter.dart';
3737
part 'method.dart';
3838
part 'mixin.dart';
3939
part 'named_mixin_application.dart';
40+
part 'primary_constructor.dart';
4041
part 'setter.dart';
4142
part 'typedef.dart';
4243

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
// Copyright (c) 2024, 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+
part of 'fragment.dart';
6+
7+
class PrimaryConstructorFragment implements Fragment {
8+
final String name;
9+
final Uri fileUri;
10+
final int charOffset;
11+
final Modifiers modifiers;
12+
final OmittedTypeBuilder returnType;
13+
final List<NominalVariableBuilder>? typeParameters;
14+
final List<FormalParameterBuilder>? formals;
15+
final bool forAbstractClassOrMixin;
16+
Token? _beginInitializers;
17+
18+
AbstractSourceConstructorBuilder? _builder;
19+
20+
PrimaryConstructorFragment(
21+
{required this.name,
22+
required this.fileUri,
23+
required this.charOffset,
24+
required this.modifiers,
25+
required this.returnType,
26+
required this.typeParameters,
27+
required this.formals,
28+
required this.forAbstractClassOrMixin,
29+
required Token? beginInitializers})
30+
: _beginInitializers = beginInitializers;
31+
32+
Token? get beginInitializers {
33+
Token? result = _beginInitializers;
34+
// Ensure that we don't hold onto the token.
35+
_beginInitializers = null;
36+
return result;
37+
}
38+
39+
@override
40+
AbstractSourceConstructorBuilder get builder {
41+
assert(_builder != null, "Builder has not been computed for $this.");
42+
return _builder!;
43+
}
44+
45+
void set builder(AbstractSourceConstructorBuilder value) {
46+
assert(_builder == null, "Builder has already been computed for $this.");
47+
_builder = value;
48+
}
49+
50+
@override
51+
String toString() => '$runtimeType($name,$fileUri,$charOffset)';
52+
}

pkg/front_end/lib/src/source/offset_map.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class OffsetMap {
2525
final Uri uri;
2626
final Map<int, DeclarationFragment> _declarations = {};
2727
final Map<int, FieldFragment> _fields = {};
28+
final Map<int, PrimaryConstructorFragment> _primaryConstructors = {};
2829
final Map<int, ConstructorFragment> _constructors = {};
2930
final Map<int, FactoryFragment> _factoryFragments = {};
3031
final Map<int, GetterFragment> _getters = {};
@@ -105,12 +106,12 @@ class OffsetMap {
105106
}
106107

107108
void registerPrimaryConstructor(
108-
Token beginToken, ConstructorFragment builder) {
109-
_constructors[beginToken.charOffset] = builder;
109+
Token beginToken, PrimaryConstructorFragment fragment) {
110+
_primaryConstructors[beginToken.charOffset] = fragment;
110111
}
111112

112113
SourceFunctionBuilder lookupPrimaryConstructor(Token beginToken) {
113-
return _checkBuilder(_constructors[beginToken.charOffset]?.builder,
114+
return _checkBuilder(_primaryConstructors[beginToken.charOffset]?.builder,
114115
'<primary-constructor>', beginToken.charOffset);
115116
}
116117

pkg/front_end/lib/src/source/source_builder_factory.dart

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1652,24 +1652,34 @@ class BuilderFactoryImpl implements BuilderFactory, BuilderFactoryResult {
16521652
List<NominalVariableBuilder>? typeVariables =
16531653
nominalVariableCopy?.newVariableBuilders;
16541654

1655-
ConstructorFragment builder = _addConstructor(
1656-
null,
1657-
isConst ? Modifiers.Const : Modifiers.empty,
1658-
constructorName,
1659-
typeVariables,
1660-
formals,
1661-
/* startCharOffset = */
1662-
charOffset,
1663-
charOffset,
1664-
/* charOpenParenOffset = */
1665-
charOffset,
1666-
/* charEndOffset = */
1667-
charOffset,
1668-
/* nativeMethodName = */
1669-
null,
1670-
isConst: isConst,
1671-
forAbstractClassOrMixin: false);
1672-
offsetMap.registerPrimaryConstructor(beginToken, builder);
1655+
PrimaryConstructorFragment fragment = new PrimaryConstructorFragment(
1656+
name: constructorName,
1657+
fileUri: _compilationUnit.fileUri,
1658+
charOffset: charOffset,
1659+
modifiers: isConst ? Modifiers.Const : Modifiers.empty,
1660+
returnType: addInferableType(),
1661+
typeParameters: typeVariables,
1662+
formals: formals,
1663+
forAbstractClassOrMixin: false,
1664+
beginInitializers: isConst || libraryFeatures.superParameters.isEnabled
1665+
// const constructors will have their initializers compiled and
1666+
// written into the outline. In case of super-parameters language
1667+
// feature, the super initializers are required to infer the types
1668+
// of super parameters.
1669+
// TODO(johnniwinther): Avoid using a dummy token to ensure building
1670+
// of constant constructors in the outline phase.
1671+
? new Token.eof(-1)
1672+
: null);
1673+
1674+
_nominalParameterNameSpaces.pop().addTypeVariables(
1675+
_problemReporting, typeVariables,
1676+
ownerName: constructorName, allowNameConflict: true);
1677+
_addFragment(fragment);
1678+
if (isConst) {
1679+
_declarationFragments.current.declaresConstConstructor = true;
1680+
}
1681+
1682+
offsetMap.registerPrimaryConstructor(beginToken, fragment);
16731683
}
16741684

16751685
@override

pkg/front_end/lib/src/source/source_compilation_unit.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,6 @@ class SourceCompilationUnitImpl implements SourceCompilationUnit {
347347
assert(!_languageVersion.isFinal);
348348

349349
if (version > loader.target.currentSdkVersion) {
350-
// Coverage-ignore-block(suite): Not run.
351350
// If trying to set a language version that is higher than the current sdk
352351
// version it's an error.
353352
addPostponedProblem(

pkg/front_end/lib/src/source/source_constructor_builder.dart

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -411,23 +411,23 @@ class DeclaredSourceConstructorBuilder
411411
final DeclarationBuilder declarationBuilder;
412412

413413
DeclaredSourceConstructorBuilder(
414-
List<MetadataBuilder>? metadata,
415-
Modifiers modifiers,
416-
OmittedTypeBuilder returnType,
417-
String name,
418-
List<NominalVariableBuilder>? typeVariables,
419-
this.formals,
420-
this.libraryBuilder,
421-
this.declarationBuilder,
422-
this.fileUri,
423-
int startCharOffset,
424-
this.charOffset,
425-
int charOpenParenOffset,
426-
int charEndOffset,
427-
Reference? constructorReference,
428-
Reference? tearOffReference,
429-
NameScheme nameScheme,
430-
{String? nativeMethodName,
414+
{required List<MetadataBuilder>? metadata,
415+
required Modifiers modifiers,
416+
required OmittedTypeBuilder returnType,
417+
required String name,
418+
required List<NominalVariableBuilder>? typeVariables,
419+
required this.formals,
420+
required this.libraryBuilder,
421+
required this.declarationBuilder,
422+
required this.fileUri,
423+
required int startCharOffset,
424+
required this.charOffset,
425+
required int charOpenParenOffset,
426+
required int charEndOffset,
427+
required Reference? constructorReference,
428+
required Reference? tearOffReference,
429+
required NameScheme nameScheme,
430+
String? nativeMethodName,
431431
required bool forAbstractClassOrEnumOrMixin,
432432
required Token? beginInitializers,
433433
bool isSynthetic = false})
@@ -1238,23 +1238,23 @@ class SourceExtensionTypeConstructorBuilder
12381238
final Uri fileUri;
12391239

12401240
SourceExtensionTypeConstructorBuilder(
1241-
List<MetadataBuilder>? metadata,
1242-
Modifiers modifiers,
1243-
OmittedTypeBuilder returnType,
1244-
String name,
1245-
List<NominalVariableBuilder>? typeVariables,
1246-
List<FormalParameterBuilder>? formals,
1247-
this.libraryBuilder,
1248-
this.declarationBuilder,
1249-
this.fileUri,
1250-
int startCharOffset,
1251-
this.charOffset,
1252-
int charOpenParenOffset,
1253-
int charEndOffset,
1254-
Reference? constructorReference,
1255-
Reference? tearOffReference,
1256-
NameScheme nameScheme,
1257-
{String? nativeMethodName,
1241+
{required List<MetadataBuilder>? metadata,
1242+
required Modifiers modifiers,
1243+
required OmittedTypeBuilder returnType,
1244+
required String name,
1245+
required List<NominalVariableBuilder>? typeVariables,
1246+
required List<FormalParameterBuilder>? formals,
1247+
required this.libraryBuilder,
1248+
required this.declarationBuilder,
1249+
required this.fileUri,
1250+
required int startCharOffset,
1251+
required this.charOffset,
1252+
required int charOpenParenOffset,
1253+
required int charEndOffset,
1254+
required Reference? constructorReference,
1255+
required Reference? tearOffReference,
1256+
required NameScheme nameScheme,
1257+
String? nativeMethodName,
12581258
required bool forAbstractClassOrEnumOrMixin,
12591259
required Token? beginInitializers})
12601260
: _memberName = nameScheme.getDeclaredName(name),

pkg/front_end/lib/src/source/source_enum_builder.dart

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -351,23 +351,23 @@ class SourceEnumBuilder extends SourceClassBuilder {
351351
if (needsSynthesizedDefaultConstructor) {
352352
synthesizedDefaultConstructorBuilder =
353353
new DeclaredSourceConstructorBuilder(
354-
/* metadata = */ null,
355-
Modifiers.Const,
356-
/* returnType = */ libraryBuilder.loader.inferableTypes
357-
.addInferableType(),
358-
/* name = */ "",
359-
/* typeParameters = */ null,
360-
/* formals = */ [],
361-
libraryBuilder,
362-
this,
363-
fileUri,
364-
charOffset,
365-
charOffset,
366-
charOffset,
367-
charEndOffset,
368-
constructorReference,
369-
tearOffReference,
370-
new NameScheme(
354+
metadata: null,
355+
modifiers: Modifiers.Const,
356+
returnType:
357+
libraryBuilder.loader.inferableTypes.addInferableType(),
358+
name: "",
359+
typeVariables: null,
360+
formals: [],
361+
libraryBuilder: libraryBuilder,
362+
declarationBuilder: this,
363+
fileUri: fileUri,
364+
startCharOffset: charOffset,
365+
charOffset: charOffset,
366+
charOpenParenOffset: charOffset,
367+
charEndOffset: charEndOffset,
368+
constructorReference: constructorReference,
369+
tearOffReference: tearOffReference,
370+
nameScheme: new NameScheme(
371371
isInstanceMember: false,
372372
containerName: new ClassName(name),
373373
containerType: ContainerType.Class,

pkg/front_end/lib/src/source/source_loader.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,6 @@ class SourceLoader extends Loader {
548548
packageForLanguageVersion.languageVersion!.major,
549549
packageForLanguageVersion.languageVersion!.minor);
550550
if (version > target.currentSdkVersion) {
551-
// Coverage-ignore-block(suite): Not run.
552551
packageLanguageVersionProblem =
553552
templateLanguageVersionTooHighPackage.withArguments(
554553
version.major,

0 commit comments

Comments
 (0)