Version 2.19.0-278.0.dev

Merge 99f60a5e662a7951dd5ab3bf0d4ba76e2d18db5d into dev
diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
index 18513d5..ea4f42d 100644
--- a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
@@ -282,7 +282,7 @@
     isEnabledByDefault: IsEnabledByDefault.records,
     isExpired: IsExpired.records,
     documentation: 'Records',
-    experimentalReleaseVersion: null,
+    experimentalReleaseVersion: Version.parse('2.19.0'),
     releaseVersion: null,
   );
 
diff --git a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
index 7d6aea0..d249bd7 100644
--- a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
+++ b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
@@ -644,185 +644,184 @@
   ExperimentalFlag.variance: ExperimentalFlag.variance.isEnabledByDefault,
 };
 const AllowedExperimentalFlags defaultAllowedExperimentalFlags =
-    const AllowedExperimentalFlags(
-        sdkDefaultExperiments: {},
-        sdkLibraryExperiments: {},
-        packageExperiments: {
-      "async": {
-        ExperimentalFlag.nonNullable,
-      },
-      "boolean_selector": {
-        ExperimentalFlag.nonNullable,
-      },
-      "characters": {
-        ExperimentalFlag.nonNullable,
-      },
-      "clock": {
-        ExperimentalFlag.nonNullable,
-      },
-      "collection": {
-        ExperimentalFlag.nonNullable,
-      },
-      "connectivity": {
-        ExperimentalFlag.nonNullable,
-      },
-      "connectivity_platform_interface": {
-        ExperimentalFlag.nonNullable,
-      },
-      "convert": {
-        ExperimentalFlag.nonNullable,
-      },
-      "crypto": {
-        ExperimentalFlag.nonNullable,
-      },
-      "csslib": {
-        ExperimentalFlag.nonNullable,
-      },
-      "dart_internal": {
-        ExperimentalFlag.nonNullable,
-      },
-      "device_info": {
-        ExperimentalFlag.nonNullable,
-      },
-      "device_info_platform_interface": {
-        ExperimentalFlag.nonNullable,
-      },
-      "fake_async": {
-        ExperimentalFlag.nonNullable,
-      },
-      "file": {
-        ExperimentalFlag.nonNullable,
-      },
-      "fixnum": {
-        ExperimentalFlag.nonNullable,
-      },
-      "flutter": {
-        ExperimentalFlag.nonNullable,
-      },
-      "flutter_driver": {
-        ExperimentalFlag.nonNullable,
-      },
-      "flutter_test": {
-        ExperimentalFlag.nonNullable,
-      },
-      "flutter_goldens": {
-        ExperimentalFlag.nonNullable,
-      },
-      "flutter_goldens_client": {
-        ExperimentalFlag.nonNullable,
-      },
-      "http": {
-        ExperimentalFlag.nonNullable,
-      },
-      "http_parser": {
-        ExperimentalFlag.nonNullable,
-      },
-      "intl": {
-        ExperimentalFlag.nonNullable,
-      },
-      "js": {
-        ExperimentalFlag.nonNullable,
-      },
-      "logging": {
-        ExperimentalFlag.nonNullable,
-      },
-      "matcher": {
-        ExperimentalFlag.nonNullable,
-      },
-      "meta": {
-        ExperimentalFlag.nonNullable,
-      },
-      "native_stack_traces": {
-        ExperimentalFlag.nonNullable,
-      },
-      "observatory": {
-        ExperimentalFlag.nonNullable,
-      },
-      "observatory_test_package": {
-        ExperimentalFlag.nonNullable,
-      },
-      "path": {
-        ExperimentalFlag.nonNullable,
-      },
-      "pedantic": {
-        ExperimentalFlag.nonNullable,
-      },
-      "platform": {
-        ExperimentalFlag.nonNullable,
-      },
-      "plugin_platform_interface": {
-        ExperimentalFlag.nonNullable,
-      },
-      "pool": {
-        ExperimentalFlag.nonNullable,
-      },
-      "process": {
-        ExperimentalFlag.nonNullable,
-      },
-      "pub_semver": {
-        ExperimentalFlag.nonNullable,
-      },
-      "sky_engine": {
-        ExperimentalFlag.nonNullable,
-      },
-      "source_maps": {
-        ExperimentalFlag.nonNullable,
-      },
-      "source_map_stack_trace": {
-        ExperimentalFlag.nonNullable,
-      },
-      "source_span": {
-        ExperimentalFlag.nonNullable,
-      },
-      "stack_trace": {
-        ExperimentalFlag.nonNullable,
-      },
-      "stream_channel": {
-        ExperimentalFlag.nonNullable,
-      },
-      "string_scanner": {
-        ExperimentalFlag.nonNullable,
-      },
-      "term_glyph": {
-        ExperimentalFlag.nonNullable,
-      },
-      "test": {
-        ExperimentalFlag.nonNullable,
-      },
-      "test_api": {
-        ExperimentalFlag.nonNullable,
-      },
-      "test_core": {
-        ExperimentalFlag.nonNullable,
-      },
-      "typed_data": {
-        ExperimentalFlag.nonNullable,
-      },
-      "url_launcher": {
-        ExperimentalFlag.nonNullable,
-      },
-      "url_launcher_linux": {
-        ExperimentalFlag.nonNullable,
-      },
-      "url_launcher_macos": {
-        ExperimentalFlag.nonNullable,
-      },
-      "url_launcher_platform_interface": {
-        ExperimentalFlag.nonNullable,
-      },
-      "url_launcher_windows": {
-        ExperimentalFlag.nonNullable,
-      },
-      "vector_math": {
-        ExperimentalFlag.nonNullable,
-      },
-      "video_player": {
-        ExperimentalFlag.nonNullable,
-      },
-      "video_player_platform_interface": {
-        ExperimentalFlag.nonNullable,
-      },
-      "video_player_web": {
-        ExperimentalFlag.nonNullable,
-      },
-    });
+    const AllowedExperimentalFlags(sdkDefaultExperiments: {
+  ExperimentalFlag.records,
+}, sdkLibraryExperiments: {}, packageExperiments: {
+  "async": {
+    ExperimentalFlag.nonNullable,
+  },
+  "boolean_selector": {
+    ExperimentalFlag.nonNullable,
+  },
+  "characters": {
+    ExperimentalFlag.nonNullable,
+  },
+  "clock": {
+    ExperimentalFlag.nonNullable,
+  },
+  "collection": {
+    ExperimentalFlag.nonNullable,
+  },
+  "connectivity": {
+    ExperimentalFlag.nonNullable,
+  },
+  "connectivity_platform_interface": {
+    ExperimentalFlag.nonNullable,
+  },
+  "convert": {
+    ExperimentalFlag.nonNullable,
+  },
+  "crypto": {
+    ExperimentalFlag.nonNullable,
+  },
+  "csslib": {
+    ExperimentalFlag.nonNullable,
+  },
+  "dart_internal": {
+    ExperimentalFlag.nonNullable,
+  },
+  "device_info": {
+    ExperimentalFlag.nonNullable,
+  },
+  "device_info_platform_interface": {
+    ExperimentalFlag.nonNullable,
+  },
+  "fake_async": {
+    ExperimentalFlag.nonNullable,
+  },
+  "file": {
+    ExperimentalFlag.nonNullable,
+  },
+  "fixnum": {
+    ExperimentalFlag.nonNullable,
+  },
+  "flutter": {
+    ExperimentalFlag.nonNullable,
+  },
+  "flutter_driver": {
+    ExperimentalFlag.nonNullable,
+  },
+  "flutter_test": {
+    ExperimentalFlag.nonNullable,
+  },
+  "flutter_goldens": {
+    ExperimentalFlag.nonNullable,
+  },
+  "flutter_goldens_client": {
+    ExperimentalFlag.nonNullable,
+  },
+  "http": {
+    ExperimentalFlag.nonNullable,
+  },
+  "http_parser": {
+    ExperimentalFlag.nonNullable,
+  },
+  "intl": {
+    ExperimentalFlag.nonNullable,
+  },
+  "js": {
+    ExperimentalFlag.nonNullable,
+  },
+  "logging": {
+    ExperimentalFlag.nonNullable,
+  },
+  "matcher": {
+    ExperimentalFlag.nonNullable,
+  },
+  "meta": {
+    ExperimentalFlag.nonNullable,
+  },
+  "native_stack_traces": {
+    ExperimentalFlag.nonNullable,
+  },
+  "observatory": {
+    ExperimentalFlag.nonNullable,
+  },
+  "observatory_test_package": {
+    ExperimentalFlag.nonNullable,
+  },
+  "path": {
+    ExperimentalFlag.nonNullable,
+  },
+  "pedantic": {
+    ExperimentalFlag.nonNullable,
+  },
+  "platform": {
+    ExperimentalFlag.nonNullable,
+  },
+  "plugin_platform_interface": {
+    ExperimentalFlag.nonNullable,
+  },
+  "pool": {
+    ExperimentalFlag.nonNullable,
+  },
+  "process": {
+    ExperimentalFlag.nonNullable,
+  },
+  "pub_semver": {
+    ExperimentalFlag.nonNullable,
+  },
+  "sky_engine": {
+    ExperimentalFlag.nonNullable,
+  },
+  "source_maps": {
+    ExperimentalFlag.nonNullable,
+  },
+  "source_map_stack_trace": {
+    ExperimentalFlag.nonNullable,
+  },
+  "source_span": {
+    ExperimentalFlag.nonNullable,
+  },
+  "stack_trace": {
+    ExperimentalFlag.nonNullable,
+  },
+  "stream_channel": {
+    ExperimentalFlag.nonNullable,
+  },
+  "string_scanner": {
+    ExperimentalFlag.nonNullable,
+  },
+  "term_glyph": {
+    ExperimentalFlag.nonNullable,
+  },
+  "test": {
+    ExperimentalFlag.nonNullable,
+  },
+  "test_api": {
+    ExperimentalFlag.nonNullable,
+  },
+  "test_core": {
+    ExperimentalFlag.nonNullable,
+  },
+  "typed_data": {
+    ExperimentalFlag.nonNullable,
+  },
+  "url_launcher": {
+    ExperimentalFlag.nonNullable,
+  },
+  "url_launcher_linux": {
+    ExperimentalFlag.nonNullable,
+  },
+  "url_launcher_macos": {
+    ExperimentalFlag.nonNullable,
+  },
+  "url_launcher_platform_interface": {
+    ExperimentalFlag.nonNullable,
+  },
+  "url_launcher_windows": {
+    ExperimentalFlag.nonNullable,
+  },
+  "vector_math": {
+    ExperimentalFlag.nonNullable,
+  },
+  "video_player": {
+    ExperimentalFlag.nonNullable,
+  },
+  "video_player_platform_interface": {
+    ExperimentalFlag.nonNullable,
+  },
+  "video_player_web": {
+    ExperimentalFlag.nonNullable,
+  },
+});
diff --git a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
index 7a469b9..3ea1366 100644
--- a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
@@ -409,11 +409,10 @@
   DartType buildAliased(
       LibraryBuilder library, TypeUse typeUse, ClassHierarchyBase? hierarchy) {
     assert(hierarchy != null || isExplicit, "Cannot build $this.");
-
     DartType builtType = _buildAliasedInternal(library, typeUse, hierarchy);
-
     if (library is SourceLibraryBuilder &&
-        !checkRecordOrItsAliasAccessAllowed(builtType, library)) {
+        !library.libraryFeatures.records.isEnabled &&
+        isRecordOrItsAlias(builtType)) {
       library.reportFeatureNotEnabled(library.libraryFeatures.records,
           fileUri ?? library.fileUri, charOffset!, nameText.length);
     }
@@ -708,7 +707,8 @@
     DartType builtType = _buildInternal(library, typeUse, hierarchy);
 
     if (library is SourceLibraryBuilder &&
-        !checkRecordOrItsAliasAccessAllowed(builtType, library)) {
+        !library.libraryFeatures.records.isEnabled &&
+        isRecordOrItsAlias(builtType)) {
       library.reportFeatureNotEnabled(library.libraryFeatures.records,
           fileUri ?? library.fileUri, charOffset!, nameText.length);
     }
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 52835d6..6228bd7 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -349,7 +349,7 @@
   /// Returns the state of the experimental features within this library.
   LibraryFeatures get libraryFeatures =>
       _libraryFeatures ??= new LibraryFeatures(loader.target.globalFeatures,
-          _packageUri ?? importUri, languageVersion.version);
+          _packageUri ?? origin.importUri, languageVersion.version);
 
   /// Reports that [feature] is not enabled, using [charOffset] and
   /// [length] for the location of the message.
@@ -1611,7 +1611,9 @@
   @override
   SourceLibraryBuilder get origin {
     SourceLibraryBuilder? origin = _immediateOrigin;
-    if (origin != null && origin.isPart) {
+    // TODO(johnniwinther): This returns the wrong origin for early queries on
+    // augmentations imported into parts.
+    if (origin != null && origin.partOfLibrary is SourceLibraryBuilder) {
       origin = origin.partOfLibrary as SourceLibraryBuilder;
     }
     return origin?.origin ?? this;
diff --git a/pkg/front_end/lib/src/fasta/util/helpers.dart b/pkg/front_end/lib/src/fasta/util/helpers.dart
index 5cf5fed..33c3c15 100644
--- a/pkg/front_end/lib/src/fasta/util/helpers.dart
+++ b/pkg/front_end/lib/src/fasta/util/helpers.dart
@@ -4,15 +4,12 @@
 
 import 'package:kernel/ast.dart';
 
-import '../source/source_library_builder.dart';
-
 abstract class DelayedActionPerformer {
   bool get hasDelayedActions;
   void performDelayedActions({required bool allowFurtherDelays});
 }
 
-bool checkRecordOrItsAliasAccessAllowed(
-    DartType type, SourceLibraryBuilder accessorLibrary) {
+bool isRecordOrItsAlias(DartType type) {
   Class? targetClass;
   if (type is InterfaceType) {
     targetClass = type.classNode;
@@ -22,11 +19,9 @@
       targetClass = unaliasedType.classNode;
     }
   }
-  return accessorLibrary.libraryFeatures.records.isEnabled ||
-      accessorLibrary.libraryFeatures.records.flag.isEnabledByDefault ||
-      !(targetClass != null &&
-          targetClass.parent != null &&
-          targetClass.name == "Record" &&
-          targetClass.enclosingLibrary.importUri.scheme == "dart" &&
-          targetClass.enclosingLibrary.importUri.path == "core");
+  return targetClass != null &&
+      targetClass.parent != null &&
+      targetClass.name == "Record" &&
+      targetClass.enclosingLibrary.importUri.scheme == "dart" &&
+      targetClass.enclosingLibrary.importUri.path == "core";
 }
diff --git a/sdk/lib/_internal/allowed_experiments.json b/sdk/lib/_internal/allowed_experiments.json
index 37658a13..6cdf7e4 100644
--- a/sdk/lib/_internal/allowed_experiments.json
+++ b/sdk/lib/_internal/allowed_experiments.json
@@ -2,6 +2,7 @@
   "version": 1,
   "experimentSets": {
     "sdkExperiments": [
+      "records"
     ],
     "nullSafety": [
       "non-nullable"
diff --git a/sdk/lib/_internal/vm/lib/record_patch.dart b/sdk/lib/_internal/vm/lib/record_patch.dart
index 500cba6..031979b 100644
--- a/sdk/lib/_internal/vm/lib/record_patch.dart
+++ b/sdk/lib/_internal/vm/lib/record_patch.dart
@@ -6,7 +6,7 @@
 
 // Base class for record instances.
 @pragma("vm:entry-point")
-class _Record {
+class _Record implements Record {
   factory _Record._uninstantiable() {
     throw "Unreachable";
   }
diff --git a/tools/VERSION b/tools/VERSION
index 0600da2..3136cd6 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 19
 PATCH 0
-PRERELEASE 277
+PRERELEASE 278
 PRERELEASE_PATCH 0
diff --git a/tools/experimental_features.yaml b/tools/experimental_features.yaml
index d27ee9e..61c61af 100644
--- a/tools/experimental_features.yaml
+++ b/tools/experimental_features.yaml
@@ -130,6 +130,7 @@
 
   records:
     help: "Records"
+    experimentalReleaseVersion: '2.19.0'
 
   patterns:
     help: "Patterns"