Skip to content

Commit 4b6a8f3

Browse files
chloestefantsovaCommit Bot
authored and
Commit Bot
committed
Reland "[cfe,corelib] Add class 'Record' to the core library"
Part of #49713 Change-Id: I56bfca49492d14bb561b32993fd9adfe775b7400 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/259583 Reviewed-by: Johnni Winther <[email protected]> Reviewed-by: Slava Egorov <[email protected]> Commit-Queue: Chloe Stefantsova <[email protected]>
1 parent 30bbd94 commit 4b6a8f3

File tree

73 files changed

+4532
-24
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

73 files changed

+4532
-24
lines changed

pkg/_fe_analyzer_shared/test/inheritance/data/object_opt_in/core.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,3 +78,7 @@ class Type {}
7878

7979
/*class: Invocation:Invocation,Object*/
8080
class Invocation {}
81+
82+
/*cfe|cfe:builder.class: Record:Object,Record*/
83+
/*analyzer.class: Record:Record,Object*/
84+
class Record {}

pkg/_fe_analyzer_shared/test/inheritance/data/object_opt_out/core.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,3 +83,7 @@ class Type {}
8383

8484
/*class: Invocation:Invocation,Object*/
8585
class Invocation {}
86+
87+
/*analyzer.class Record:Record,Object*/
88+
/*cfe|cfe:builder.class: Record:Object,Record*/
89+
class Record {}

pkg/analyzer/lib/src/generated/error_verifier.dart

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import 'package:analyzer/dart/element/type_provider.dart';
1717
import 'package:analyzer/diagnostic/diagnostic.dart';
1818
import 'package:analyzer/error/error.dart';
1919
import 'package:analyzer/error/listener.dart';
20+
import 'package:analyzer/src/dart/analysis/experiments.dart';
2021
import 'package:analyzer/src/dart/ast/ast.dart';
2122
import 'package:analyzer/src/dart/ast/extensions.dart';
2223
import 'package:analyzer/src/dart/element/class_hierarchy.dart';
@@ -1025,6 +1026,16 @@ class ErrorVerifier extends RecursiveAstVisitor<void>
10251026
@override
10261027
void visitNamedType(NamedType node) {
10271028
_typeArgumentsVerifier.checkNamedType(node);
1029+
bool isDartCoreRecordVisible =
1030+
_currentLibrary.featureSet.isEnabled(Feature.records) ||
1031+
FeatureSet.latestLanguageVersion().isEnabled(Feature.records);
1032+
if ((node.type?.isDartCoreRecord ?? false) && !isDartCoreRecordVisible) {
1033+
errorReporter.reportErrorForToken(
1034+
ParserErrorCode.EXPERIMENT_NOT_ENABLED, node.beginToken, [
1035+
Feature.records.enableString,
1036+
"${Feature.records.releaseVersion ?? ExperimentStatus.currentVersion}"
1037+
]);
1038+
}
10281039
super.visitNamedType(node);
10291040
}
10301041

@@ -1165,6 +1176,23 @@ class ErrorVerifier extends RecursiveAstVisitor<void>
11651176
_checkForUnqualifiedReferenceToNonLocalStaticMember(node);
11661177
}
11671178
_checkUseVerifier.checkSimpleIdentifier(node);
1179+
1180+
bool isDartCoreRecordVisible =
1181+
_currentLibrary.featureSet.isEnabled(Feature.records) ||
1182+
FeatureSet.latestLanguageVersion().isEnabled(Feature.records);
1183+
Element? staticElement = node.staticElement;
1184+
if ((staticElement is ClassElement &&
1185+
staticElement.thisType.isDartCoreRecord ||
1186+
staticElement is TypeAliasElement &&
1187+
staticElement.aliasedType.isDartCoreRecord) &&
1188+
!isDartCoreRecordVisible) {
1189+
errorReporter.reportErrorForToken(
1190+
ParserErrorCode.EXPERIMENT_NOT_ENABLED, node.beginToken, [
1191+
Feature.records.enableString,
1192+
"${Feature.records.releaseVersion ?? ExperimentStatus.currentVersion}"
1193+
]);
1194+
}
1195+
11681196
super.visitSimpleIdentifier(node);
11691197
}
11701198

pkg/front_end/lib/src/fasta/builder/class_builder.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import 'package:kernel/ast.dart'
1111
DynamicType,
1212
FutureOrType,
1313
InterfaceType,
14+
InvalidType,
1415
Member,
1516
Name,
1617
NullType,
@@ -346,6 +347,15 @@ abstract class ClassBuilderImpl extends DeclarationBuilderImpl
346347
int charOffset,
347348
ClassHierarchyBase? hierarchy,
348349
{required bool hasExplicitTypeArguments}) {
350+
if (name == "Record" &&
351+
libraryBuilder.importUri.scheme == "dart" &&
352+
libraryBuilder.importUri.path == "core" &&
353+
library is SourceLibraryBuilder &&
354+
!library.libraryFeatures.records.isEnabled) {
355+
library.reportFeatureNotEnabled(
356+
library.libraryFeatures.records, fileUri, charOffset, name.length);
357+
return const InvalidType();
358+
}
349359
return buildAliasedTypeWithBuiltArguments(
350360
library,
351361
nullabilityBuilder.build(library),

pkg/front_end/lib/src/fasta/builder/constructor_reference_builder.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,7 @@ class ConstructorReferenceBuilder {
5555
PrefixBuilder prefix = declaration;
5656
declaration = prefix.lookup(middle, name.charOffset, fileUri);
5757
} else if (declaration is ClassBuilder) {
58-
ClassBuilder cls = declaration;
59-
declaration = cls.findConstructorOrFactory(
58+
declaration = declaration.findConstructorOrFactory(
6059
middle, name.charOffset, fileUri, accessingLibrary);
6160
if (suffix == null) {
6261
target = declaration;

pkg/front_end/lib/src/fasta/builder/named_type_builder.dart

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
library fasta.named_type_builder;
66

7+
import 'package:front_end/src/fasta/util/helpers.dart';
78
import 'package:kernel/ast.dart';
89
import 'package:kernel/class_hierarchy.dart';
910
import 'package:kernel/src/legacy_erasure.dart';
@@ -408,7 +409,16 @@ abstract class NamedTypeBuilder extends TypeBuilder {
408409
DartType buildAliased(
409410
LibraryBuilder library, TypeUse typeUse, ClassHierarchyBase? hierarchy) {
410411
assert(hierarchy != null || isExplicit, "Cannot build $this.");
411-
return _buildAliasedInternal(library, typeUse, hierarchy);
412+
413+
DartType builtType = _buildAliasedInternal(library, typeUse, hierarchy);
414+
415+
if (library is SourceLibraryBuilder &&
416+
!checkRecordOrItsAliasAccessAllowed(builtType, library)) {
417+
library.reportFeatureNotEnabled(library.libraryFeatures.records,
418+
fileUri ?? library.fileUri, charOffset!, nameText.length);
419+
}
420+
421+
return builtType;
412422
}
413423

414424
DartType _buildAliasedInternal(
@@ -695,7 +705,15 @@ class _ExplicitNamedTypeBuilder extends NamedTypeBuilder {
695705
@override
696706
DartType build(LibraryBuilder library, TypeUse typeUse,
697707
{ClassHierarchyBase? hierarchy}) {
698-
return _type ??= _buildInternal(library, typeUse, hierarchy);
708+
DartType builtType = _buildInternal(library, typeUse, hierarchy);
709+
710+
if (library is SourceLibraryBuilder &&
711+
!checkRecordOrItsAliasAccessAllowed(builtType, library)) {
712+
library.reportFeatureNotEnabled(library.libraryFeatures.records,
713+
fileUri ?? library.fileUri, charOffset!, nameText.length);
714+
}
715+
716+
return _type ??= builtType;
699717
}
700718
}
701719

pkg/front_end/lib/src/fasta/builder/prefix_builder.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ class PrefixBuilder extends BuilderImpl {
4747
@override
4848
Uri get fileUri => parent.fileUri;
4949

50+
/// Lookup a member with [name] in the export scope.
5051
Builder? lookup(String name, int charOffset, Uri fileUri) {
5152
return exportScope.lookup(name, charOffset, fileUri);
5253
}

pkg/front_end/lib/src/fasta/denylisted_classes.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ const List<String> denylistedCoreClasses = [
99
"num",
1010
"double",
1111
"String",
12-
"Null"
12+
"Null",
13+
"Record",
1314
];
1415

1516
// List of special classes in dart:typed_data that can't be subclassed.

pkg/front_end/lib/src/fasta/kernel/body_builder.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ import '../type_inference/inference_results.dart'
106106
import '../type_inference/type_inferrer.dart'
107107
show TypeInferrer, InferredFunctionBody;
108108
import '../type_inference/type_schema.dart' show UnknownType;
109-
import '../util/helpers.dart' show DelayedActionPerformer;
109+
import '../util/helpers.dart';
110110
import 'collections.dart';
111111
import 'constness.dart' show Constness;
112112
import 'constructor_tearoff_lowering.dart';

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,7 @@ class Scope extends MutableScope {
419419
}
420420
}
421421

422+
/// Lookup a member with [name] in the scope.
422423
Builder? lookup(String name, int charOffset, Uri fileUri,
423424
{bool isInstanceScope = true}) {
424425
recordUse(name, charOffset);

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2743,6 +2743,8 @@ class int extends num {}
27432743
class num {}
27442744
27452745
class Function {}
2746+
2747+
class Record {}
27462748
""";
27472749

27482750
/// A minimal implementation of dart:async that is sufficient to create an

pkg/front_end/lib/src/fasta/util/helpers.dart

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,31 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
import 'package:kernel/ast.dart';
6+
7+
import '../source/source_library_builder.dart';
8+
59
abstract class DelayedActionPerformer {
610
bool get hasDelayedActions;
711
void performDelayedActions({required bool allowFurtherDelays});
812
}
13+
14+
bool checkRecordOrItsAliasAccessAllowed(
15+
DartType type, SourceLibraryBuilder accessorLibrary) {
16+
Class? targetClass;
17+
if (type is InterfaceType) {
18+
targetClass = type.classNode;
19+
} else if (type is TypedefType) {
20+
DartType unaliasedType = type.unalias;
21+
if (unaliasedType is InterfaceType) {
22+
targetClass = unaliasedType.classNode;
23+
}
24+
}
25+
return accessorLibrary.libraryFeatures.records.isEnabled ||
26+
accessorLibrary.libraryFeatures.records.flag.isEnabledByDefault ||
27+
!(targetClass != null &&
28+
targetClass.parent != null &&
29+
targetClass.name == "Record" &&
30+
targetClass.enclosingLibrary.importUri.scheme == "dart" &&
31+
targetClass.enclosingLibrary.importUri.path == "core");
32+
}

pkg/front_end/test/spell_checking_list_common.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1257,6 +1257,7 @@ following
12571257
follows
12581258
food
12591259
for
1260+
forbid
12601261
forbidden
12611262
force
12621263
forced
@@ -1388,6 +1389,7 @@ head
13881389
header
13891390
headers
13901391
heading
1392+
heavier
13911393
help
13921394
helper
13931395
helpers

pkg/front_end/test/spell_checking_list_tests.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,7 @@ risky
560560
rk
561561
row
562562
rows
563+
rr
563564
runtimes
564565
rv
565566
sanitize

pkg/front_end/testcases/general/error_export_from_dill/main.dart.weak.expect

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ additionalExports = (core::Deprecated,
137137
core::Object,
138138
core::Pattern,
139139
core::Match,
140+
core::Record,
140141
core::RegExp,
141142
core::RegExpMatch,
142143
core::Set,

pkg/front_end/testcases/general/error_export_from_dill/main.dart.weak.outline.expect

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ additionalExports = (core::Deprecated,
7272
core::Object,
7373
core::Pattern,
7474
core::Match,
75+
core::Record,
7576
core::RegExp,
7677
core::RegExpMatch,
7778
core::Set,

pkg/front_end/testcases/general/error_export_from_dill/main.dart.weak.transformed.expect

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ additionalExports = (core::Deprecated,
133133
core::Object,
134134
core::Pattern,
135135
core::Match,
136+
core::Record,
136137
core::RegExp,
137138
core::RegExpMatch,
138139
core::Set,

pkg/front_end/testcases/incremental/export_core.yaml.world.2.expect

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ additionalExports = (asy::Future,
5050
core::Pattern,
5151
core::Provisional,
5252
core::RangeError,
53+
core::Record,
5354
core::RegExp,
5455
core::RegExpMatch,
5556
core::RuneIterator,

pkg/front_end/testcases/incremental/export_core.yaml.world.3.expect

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ additionalExports = (asy::Future,
5050
core::Pattern,
5151
core::Provisional,
5252
core::RangeError,
53+
core::Record,
5354
core::RegExp,
5455
core::RegExpMatch,
5556
core::RuneIterator,
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// Copyright (c) 2022, 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+
// @dart=2.17
6+
7+
abstract class Record {
8+
Record create();
9+
}
10+
11+
main() {}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
abstract class Record extends core::Object {
6+
synthetic constructor •() → self::Record
7+
: super core::Object::•()
8+
;
9+
abstract method create() → self::Record;
10+
}
11+
static method main() → dynamic {}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
abstract class Record extends core::Object {
6+
synthetic constructor •() → self::Record
7+
: super core::Object::•()
8+
;
9+
abstract method create() → self::Record;
10+
}
11+
static method main() → dynamic {}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// @dart = 2.17
2+
abstract class Record {
3+
Record create();
4+
}
5+
6+
main() {}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// @dart = 2.17
2+
abstract class Record {
3+
Record create();
4+
}
5+
6+
main() {}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
abstract class Record extends core::Object {
6+
synthetic constructor •() → self::Record
7+
: super core::Object::•()
8+
;
9+
abstract method create() → self::Record;
10+
}
11+
static method main() → dynamic {}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
abstract class Record extends core::Object {
6+
synthetic constructor •() → self::Record
7+
: super core::Object::•()
8+
;
9+
abstract method create() → self::Record;
10+
}
11+
static method main() → dynamic {}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
abstract class Record extends core::Object {
6+
synthetic constructor •() → self::Record
7+
;
8+
abstract method create() → self::Record;
9+
}
10+
static method main() → dynamic
11+
;
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
abstract class Record extends core::Object {
6+
synthetic constructor •() → self::Record
7+
: super core::Object::•()
8+
;
9+
abstract method create() → self::Record;
10+
}
11+
static method main() → dynamic {}

0 commit comments

Comments
 (0)