blob: 95fd7170a13b1bb27f30a5886d620a816896e736 [file] [log] [blame]
// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:kernel/ast.dart';
import '../api_prototype/experimental_flags.dart';
import '../source/source_library_builder.dart';
/// Returns `true` if access to `Record` from `dart:core` is allowed.
bool isRecordAccessAllowed(SourceLibraryBuilder library) {
return library
.loader
.target
.context
.options
.globalFeatures
.records
.isEnabled ||
// Coverage-ignore(suite): Not run.
ExperimentalFlag.records.isEnabledByDefault ||
// Coverage-ignore(suite): Not run.
library.libraryFeatures.records.isEnabled;
}
// Coverage-ignore(suite): Not run.
/// Returns `true` if [type] is `Record` from `dart:core`.
bool isDartCoreRecord(DartType type) {
Class? targetClass;
if (type is InterfaceType) {
targetClass = type.classNode;
}
return targetClass != null &&
targetClass.parent != null &&
targetClass.name == "Record" &&
targetClass.enclosingLibrary.importUri.scheme == "dart" &&
targetClass.enclosingLibrary.importUri.path == "core";
}
/// The positional record index of the identifier [name].
///
/// Accepts identifiers of the form `$digits` where `digits` is an integer
/// numeral with no leading zeros and a value *n* in the range
/// 1 ≤ *n* ≤ [positionalFieldCount].
///
/// Returns a zero-based index, one less than the value *n*,
/// if [name] is such an identifier, and `null` if not.
int? tryParseRecordPositionalGetterName(String name, int positionalFieldCount) {
const int c$ = 0x24; // ASCII code of '$'.
const int c0 = 0x30; // ASCII code of '0'.
if (name.length >= 2 &&
name.codeUnitAt(0) == c$ &&
name.codeUnitAt(1) != c0) {
// Starts with `$`, not followed by leading zero.
String suffix = name.substring(1);
int? impliedIndex = int.tryParse(suffix);
if (impliedIndex != null &&
impliedIndex >= 1 &&
impliedIndex <= positionalFieldCount) {
return impliedIndex - 1;
}
}
return null;
}