blob: 8ec5a476958c5027563fb1336a76dacc26a05028 [file]
// Copyright (c) 2025, 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.
// This file is generated, do not edit.
// File generated by pkg/record_use/tool/generate_syntax.dart.
// ignore_for_file: unused_element, public_member_api_docs
import 'dart:io';
class BoolConstantSyntax extends ConstantSyntax {
BoolConstantSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
BoolConstantSyntax({required bool value, super.path = const []})
: super(type: 'bool') {
_value = value;
json.sortOnKey();
}
/// Setup all fields for [BoolConstantSyntax] that are not in
/// [ConstantSyntax].
void setup({required bool value}) {
_value = value;
json.sortOnKey();
}
bool get value => _reader.get<bool>('value');
set _value(bool value) {
json.setOrRemove('value', value);
}
List<String> _validateValue() => _reader.validate<bool>('value');
@override
List<String> validate() => [...super.validate(), ..._validateValue()];
@override
String toString() => 'BoolConstantSyntax($json)';
}
extension BoolConstantSyntaxExtension on ConstantSyntax {
bool get isBoolConstant => type == 'bool';
BoolConstantSyntax get asBoolConstant =>
BoolConstantSyntax.fromJson(json, path: path);
}
class CallSyntax extends JsonObjectSyntax {
factory CallSyntax.fromJson(
Map<String, Object?> json, {
List<Object> path = const [],
}) {
final result = CallSyntax._fromJson(json, path: path);
if (result.isTearoffCall) {
return result.asTearoffCall;
}
if (result.isWithArgumentsCall) {
return result.asWithArgumentsCall;
}
return result;
}
CallSyntax._fromJson(
super.json, {
super.path = const [],
}) : super.fromJson();
CallSyntax({
required int loadingUnitIndex,
int? receiver,
required String type,
super.path = const [],
}) : super() {
_loadingUnitIndex = loadingUnitIndex;
_receiver = receiver;
_type = type;
json.sortOnKey();
}
int get loadingUnitIndex => _reader.get<int>('loading_unit_index');
set _loadingUnitIndex(int value) {
json.setOrRemove('loading_unit_index', value);
}
List<String> _validateLoadingUnitIndex() =>
_reader.validate<int>('loading_unit_index');
int? get receiver => _reader.get<int?>('receiver');
set _receiver(int? value) {
json.setOrRemove('receiver', value);
}
List<String> _validateReceiver() => _reader.validate<int?>('receiver');
String get type => _reader.get<String>('type');
set _type(String value) {
json.setOrRemove('type', value);
}
List<String> _validateType() => _reader.validate<String>('type');
@override
List<String> validate() => [
...super.validate(),
..._validateLoadingUnitIndex(),
..._validateReceiver(),
..._validateType(),
];
@override
String toString() => 'CallSyntax($json)';
}
class CallRecordingSyntax extends JsonObjectSyntax {
CallRecordingSyntax.fromJson(
super.json, {
super.path = const [],
}) : super.fromJson();
CallRecordingSyntax({
required int definitionIndex,
required List<CallSyntax> uses,
super.path = const [],
}) : super() {
_definitionIndex = definitionIndex;
_uses = uses;
json.sortOnKey();
}
int get definitionIndex => _reader.get<int>('definition_index');
set _definitionIndex(int value) {
json.setOrRemove('definition_index', value);
}
List<String> _validateDefinitionIndex() =>
_reader.validate<int>('definition_index');
List<CallSyntax> get uses {
final jsonValue = _reader.list('uses');
return [
for (final (index, element) in jsonValue.indexed)
CallSyntax.fromJson(
element as Map<String, Object?>,
path: [...path, 'uses', index],
),
];
}
set _uses(List<CallSyntax> value) {
json['uses'] = [for (final item in value) item.json];
}
List<String> _validateUses() {
final listErrors = _reader.validateList<Map<String, Object?>>(
'uses',
);
if (listErrors.isNotEmpty) {
return listErrors;
}
final elements = uses;
return [for (final element in elements) ...element.validate()];
}
@override
List<String> validate() => [
...super.validate(),
..._validateDefinitionIndex(),
..._validateUses(),
];
@override
String toString() => 'CallRecordingSyntax($json)';
}
class ClassNameSyntax extends NameSyntax {
ClassNameSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
ClassNameSyntax({
super.disambiguators,
required super.name,
super.path = const [],
}) : super(kind: 'class');
@override
List<String> validate() => [
...super.validate(),
];
@override
String toString() => 'ClassNameSyntax($json)';
}
extension ClassNameSyntaxExtension on NameSyntax {
bool get isClassName => kind == 'class';
ClassNameSyntax get asClassName => ClassNameSyntax.fromJson(json, path: path);
}
class ConstantSyntax extends JsonObjectSyntax {
factory ConstantSyntax.fromJson(
Map<String, Object?> json, {
List<Object> path = const [],
}) {
final result = ConstantSyntax._fromJson(json, path: path);
if (result.isBoolConstant) {
return result.asBoolConstant;
}
if (result.isDoubleConstant) {
return result.asDoubleConstant;
}
if (result.isEnumConstant) {
return result.asEnumConstant;
}
if (result.isInstanceConstant) {
return result.asInstanceConstant;
}
if (result.isIntConstant) {
return result.asIntConstant;
}
if (result.isListConstant) {
return result.asListConstant;
}
if (result.isMapConstant) {
return result.asMapConstant;
}
if (result.isNonConstantConstant) {
return result.asNonConstantConstant;
}
if (result.isNullConstant) {
return result.asNullConstant;
}
if (result.isRecordConstant) {
return result.asRecordConstant;
}
if (result.isSetConstant) {
return result.asSetConstant;
}
if (result.isStringConstant) {
return result.asStringConstant;
}
if (result.isSymbolConstant) {
return result.asSymbolConstant;
}
if (result.isUnsupportedConstant) {
return result.asUnsupportedConstant;
}
return result;
}
ConstantSyntax._fromJson(
super.json, {
super.path = const [],
}) : super.fromJson();
ConstantSyntax({required String type, super.path = const []}) : super() {
_type = type;
json.sortOnKey();
}
String get type => _reader.get<String>('type');
set _type(String value) {
json.setOrRemove('type', value);
}
List<String> _validateType() => _reader.validate<String>('type');
@override
List<String> validate() => [
...super.validate(),
..._validateType(),
..._validateExtraRulesConstant(),
];
List<String> _validateExtraRulesConstant() {
final result = <String>[];
if (_reader.tryTraverse(['type']) == 'double') {
final objectErrors = _reader.validate<Map<String, Object?>?>('value');
result.addAll(objectErrors);
if (objectErrors.isEmpty) {
final jsonValue = _reader.get<Map<String, Object?>?>('value');
if (jsonValue != null) {
final reader = _JsonReader(jsonValue, [...path, 'value']);
result.addAll(reader.validate<Object>('type'));
}
}
}
if (_reader.tryTraverse(['type']) == 'instance') {
result.addAll(_reader.validate<Object>('definition_index'));
}
if (_reader.tryTraverse(['type']) == 'symbol') {
result.addAll(_reader.validate<Object>('name'));
}
return result;
}
@override
String toString() => 'ConstantSyntax($json)';
}
class ConstantInstanceSyntax extends InstanceSyntax {
ConstantInstanceSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
ConstantInstanceSyntax({
required int constantIndex,
required super.loadingUnitIndex,
super.path = const [],
}) : super(type: 'constant') {
_constantIndex = constantIndex;
json.sortOnKey();
}
/// Setup all fields for [ConstantInstanceSyntax] that are not in
/// [InstanceSyntax].
void setup({required int constantIndex}) {
_constantIndex = constantIndex;
json.sortOnKey();
}
int get constantIndex => _reader.get<int>('constant_index');
set _constantIndex(int value) {
json.setOrRemove('constant_index', value);
}
List<String> _validateConstantIndex() =>
_reader.validate<int>('constant_index');
@override
List<String> validate() => [...super.validate(), ..._validateConstantIndex()];
@override
String toString() => 'ConstantInstanceSyntax($json)';
}
extension ConstantInstanceSyntaxExtension on InstanceSyntax {
bool get isConstantInstance => type == 'constant';
ConstantInstanceSyntax get asConstantInstance =>
ConstantInstanceSyntax.fromJson(json, path: path);
}
class ConstructorNameSyntax extends NameSyntax {
ConstructorNameSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
ConstructorNameSyntax({
super.disambiguators,
required super.name,
super.path = const [],
}) : super(kind: 'constructor');
@override
List<String> validate() => [
...super.validate(),
];
@override
String toString() => 'ConstructorNameSyntax($json)';
}
extension ConstructorNameSyntaxExtension on NameSyntax {
bool get isConstructorName => kind == 'constructor';
ConstructorNameSyntax get asConstructorName =>
ConstructorNameSyntax.fromJson(json, path: path);
}
class CreationInstanceSyntax extends InstanceSyntax {
CreationInstanceSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
CreationInstanceSyntax({
required int definitionIndex,
required super.loadingUnitIndex,
Map<String, int>? named,
List<int>? positional,
super.path = const [],
}) : super(type: 'creation') {
_definitionIndex = definitionIndex;
_named = named;
_positional = positional;
json.sortOnKey();
}
/// Setup all fields for [CreationInstanceSyntax] that are not in
/// [InstanceSyntax].
void setup({
required int definitionIndex,
required Map<String, int>? named,
required List<int>? positional,
}) {
_definitionIndex = definitionIndex;
_named = named;
_positional = positional;
json.sortOnKey();
}
int get definitionIndex => _reader.get<int>('definition_index');
set _definitionIndex(int value) {
json.setOrRemove('definition_index', value);
}
List<String> _validateDefinitionIndex() =>
_reader.validate<int>('definition_index');
Map<String, int>? get named => _reader.optionalMap<int>(
'named',
);
set _named(Map<String, int>? value) {
_checkArgumentMapKeys(
value,
);
json.setOrRemove('named', value);
}
List<String> _validateNamed() => _reader.validateOptionalMap<int>(
'named',
);
List<int>? get positional => _reader.optionalList<int>('positional');
set _positional(List<int>? value) {
json.setOrRemove('positional', value);
}
List<String> _validatePositional() =>
_reader.validateOptionalList<int>('positional');
@override
List<String> validate() => [
...super.validate(),
..._validateDefinitionIndex(),
..._validateNamed(),
..._validatePositional(),
];
@override
String toString() => 'CreationInstanceSyntax($json)';
}
extension CreationInstanceSyntaxExtension on InstanceSyntax {
bool get isCreationInstance => type == 'creation';
CreationInstanceSyntax get asCreationInstance =>
CreationInstanceSyntax.fromJson(json, path: path);
}
class DefinitionSyntax extends JsonObjectSyntax {
DefinitionSyntax.fromJson(
super.json, {
super.path = const [],
}) : super.fromJson();
DefinitionSyntax({
required List<NameSyntax> definitionPath,
required String uri,
super.path = const [],
}) : super() {
_definitionPath = definitionPath;
_uri = uri;
json.sortOnKey();
}
List<NameSyntax> get definitionPath {
final jsonValue = _reader.list('path');
return [
for (final (index, element) in jsonValue.indexed)
NameSyntax.fromJson(
element as Map<String, Object?>,
path: [...path, 'path', index],
),
];
}
set _definitionPath(List<NameSyntax> value) {
json['path'] = [for (final item in value) item.json];
}
List<String> _validateDefinitionPath() {
final listErrors = _reader.validateList<Map<String, Object?>>(
'path',
);
if (listErrors.isNotEmpty) {
return listErrors;
}
final elements = definitionPath;
return [for (final element in elements) ...element.validate()];
}
static final _uriPattern = RegExp(r'^package:');
String get uri => _reader.string('uri', _uriPattern);
set _uri(String value) {
if (!_uriPattern.hasMatch(value)) {
throw ArgumentError.value(
value,
'value',
'Value does not satisfy pattern: ${_uriPattern.pattern}.',
);
}
json.setOrRemove('uri', value);
}
List<String> _validateUri() => _reader.validateString('uri', _uriPattern);
@override
List<String> validate() => [
...super.validate(),
..._validateDefinitionPath(),
..._validateUri(),
];
@override
String toString() => 'DefinitionSyntax($json)';
}
class DoubleConstantSyntax extends ConstantSyntax {
DoubleConstantSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
DoubleConstantSyntax({
required DoubleConstantValueSyntax value,
super.path = const [],
}) : super(type: 'double') {
_value = value;
json.sortOnKey();
}
/// Setup all fields for [DoubleConstantSyntax] that are not in
/// [ConstantSyntax].
void setup({required DoubleConstantValueSyntax value}) {
_value = value;
json.sortOnKey();
}
DoubleConstantValueSyntax get value {
final jsonValue = _reader.map$('value');
return DoubleConstantValueSyntax.fromJson(
jsonValue,
path: [...path, 'value'],
);
}
set _value(DoubleConstantValueSyntax value) {
json['value'] = value.json;
}
List<String> _validateValue() {
final mapErrors = _reader.validate<Map<String, Object?>>('value');
if (mapErrors.isNotEmpty) {
return mapErrors;
}
return value.validate();
}
@override
List<String> validate() => [...super.validate(), ..._validateValue()];
@override
String toString() => 'DoubleConstantSyntax($json)';
}
extension DoubleConstantSyntaxExtension on ConstantSyntax {
bool get isDoubleConstant => type == 'double';
DoubleConstantSyntax get asDoubleConstant =>
DoubleConstantSyntax.fromJson(json, path: path);
}
class DoubleConstantValueSyntax extends JsonObjectSyntax {
factory DoubleConstantValueSyntax.fromJson(
Map<String, Object?> json, {
List<Object> path = const [],
}) {
final result = DoubleConstantValueSyntax._fromJson(json, path: path);
if (result.isNegativeInfinityDoubleConstantValue) {
return result.asNegativeInfinityDoubleConstantValue;
}
if (result.isNotANumberDoubleConstantValue) {
return result.asNotANumberDoubleConstantValue;
}
if (result.isNumberDoubleConstantValue) {
return result.asNumberDoubleConstantValue;
}
if (result.isPositiveInfinityDoubleConstantValue) {
return result.asPositiveInfinityDoubleConstantValue;
}
return result;
}
DoubleConstantValueSyntax._fromJson(
super.json, {
super.path = const [],
}) : super.fromJson();
DoubleConstantValueSyntax({
required String type,
double? value,
super.path = const [],
}) : super() {
_type = type;
_value = value;
json.sortOnKey();
}
String get type => _reader.get<String>('type');
set _type(String value) {
json.setOrRemove('type', value);
}
List<String> _validateType() => _reader.validate<String>('type');
double? get value => _reader.get<double?>('value');
set _value(double? value) {
json.setOrRemove('value', value);
}
List<String> _validateValue() => _reader.validate<double?>('value');
@override
List<String> validate() => [
...super.validate(),
..._validateType(),
..._validateValue(),
..._validateExtraRulesDoubleConstantValue(),
];
List<String> _validateExtraRulesDoubleConstantValue() {
final result = <String>[];
if (_reader.tryTraverse(['type']) == 'number') {
result.addAll(_reader.validate<Object>('value'));
}
return result;
}
@override
String toString() => 'DoubleConstantValueSyntax($json)';
}
class EnumConstantSyntax extends ConstantSyntax {
EnumConstantSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
EnumConstantSyntax({
required int definitionIndex,
required int index,
required String name,
Map<String, int>? value,
super.path = const [],
}) : super(type: 'enum') {
_definitionIndex = definitionIndex;
_index = index;
_name = name;
_value = value;
json.sortOnKey();
}
/// Setup all fields for [EnumConstantSyntax] that are not in
/// [ConstantSyntax].
void setup({
required int definitionIndex,
required int index,
required String name,
required Map<String, int>? value,
}) {
_definitionIndex = definitionIndex;
_index = index;
_name = name;
_value = value;
json.sortOnKey();
}
int get definitionIndex => _reader.get<int>('definition_index');
set _definitionIndex(int value) {
json.setOrRemove('definition_index', value);
}
List<String> _validateDefinitionIndex() =>
_reader.validate<int>('definition_index');
int get index => _reader.get<int>('index');
set _index(int value) {
json.setOrRemove('index', value);
}
List<String> _validateIndex() => _reader.validate<int>('index');
String get name => _reader.get<String>('name');
set _name(String value) {
json.setOrRemove('name', value);
}
List<String> _validateName() => _reader.validate<String>('name');
Map<String, int>? get value => _reader.optionalMap<int>(
'value',
);
set _value(Map<String, int>? value) {
_checkArgumentMapKeys(
value,
);
json.setOrRemove('value', value);
}
List<String> _validateValue() => _reader.validateOptionalMap<int>(
'value',
);
@override
List<String> validate() => [
...super.validate(),
..._validateDefinitionIndex(),
..._validateIndex(),
..._validateName(),
..._validateValue(),
];
@override
String toString() => 'EnumConstantSyntax($json)';
}
extension EnumConstantSyntaxExtension on ConstantSyntax {
bool get isEnumConstant => type == 'enum';
EnumConstantSyntax get asEnumConstant =>
EnumConstantSyntax.fromJson(json, path: path);
}
class EnumNameSyntax extends NameSyntax {
EnumNameSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
EnumNameSyntax({
super.disambiguators,
required super.name,
super.path = const [],
}) : super(kind: 'enum');
@override
List<String> validate() => [
...super.validate(),
];
@override
String toString() => 'EnumNameSyntax($json)';
}
extension EnumNameSyntaxExtension on NameSyntax {
bool get isEnumName => kind == 'enum';
EnumNameSyntax get asEnumName => EnumNameSyntax.fromJson(json, path: path);
}
class ExtensionNameSyntax extends NameSyntax {
ExtensionNameSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
ExtensionNameSyntax({
super.disambiguators,
required super.name,
super.path = const [],
}) : super(kind: 'extension');
@override
List<String> validate() => [
...super.validate(),
];
@override
String toString() => 'ExtensionNameSyntax($json)';
}
extension ExtensionNameSyntaxExtension on NameSyntax {
bool get isExtensionName => kind == 'extension';
ExtensionNameSyntax get asExtensionName =>
ExtensionNameSyntax.fromJson(json, path: path);
}
class ExtensionTypeNameSyntax extends NameSyntax {
ExtensionTypeNameSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
ExtensionTypeNameSyntax({
super.disambiguators,
required super.name,
super.path = const [],
}) : super(kind: 'extension_type');
@override
List<String> validate() => [
...super.validate(),
];
@override
String toString() => 'ExtensionTypeNameSyntax($json)';
}
extension ExtensionTypeNameSyntaxExtension on NameSyntax {
bool get isExtensionTypeName => kind == 'extension_type';
ExtensionTypeNameSyntax get asExtensionTypeName =>
ExtensionTypeNameSyntax.fromJson(json, path: path);
}
class GetterNameSyntax extends NameSyntax {
GetterNameSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
GetterNameSyntax({
super.disambiguators,
required super.name,
super.path = const [],
}) : super(kind: 'getter');
@override
List<String> validate() => [
...super.validate(),
];
@override
String toString() => 'GetterNameSyntax($json)';
}
extension GetterNameSyntaxExtension on NameSyntax {
bool get isGetterName => kind == 'getter';
GetterNameSyntax get asGetterName =>
GetterNameSyntax.fromJson(json, path: path);
}
class InstanceSyntax extends JsonObjectSyntax {
factory InstanceSyntax.fromJson(
Map<String, Object?> json, {
List<Object> path = const [],
}) {
final result = InstanceSyntax._fromJson(json, path: path);
if (result.isConstantInstance) {
return result.asConstantInstance;
}
if (result.isCreationInstance) {
return result.asCreationInstance;
}
if (result.isTearoffInstance) {
return result.asTearoffInstance;
}
return result;
}
InstanceSyntax._fromJson(
super.json, {
super.path = const [],
}) : super.fromJson();
InstanceSyntax({
required int loadingUnitIndex,
required String type,
super.path = const [],
}) : super() {
_loadingUnitIndex = loadingUnitIndex;
_type = type;
json.sortOnKey();
}
int get loadingUnitIndex => _reader.get<int>('loading_unit_index');
set _loadingUnitIndex(int value) {
json.setOrRemove('loading_unit_index', value);
}
List<String> _validateLoadingUnitIndex() =>
_reader.validate<int>('loading_unit_index');
String get type => _reader.get<String>('type');
set _type(String value) {
json.setOrRemove('type', value);
}
List<String> _validateType() => _reader.validate<String>('type');
@override
List<String> validate() => [
...super.validate(),
..._validateLoadingUnitIndex(),
..._validateType(),
..._validateExtraRulesInstance(),
];
List<String> _validateExtraRulesInstance() {
final result = <String>[];
if (_reader.tryTraverse(['type']) == 'creation') {
result.addAll(_reader.validate<Object>('definition_index'));
}
return result;
}
@override
String toString() => 'InstanceSyntax($json)';
}
class InstanceConstantSyntax extends ConstantSyntax {
InstanceConstantSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
InstanceConstantSyntax({
required int definitionIndex,
JsonObjectSyntax? value,
super.path = const [],
}) : super(type: 'instance') {
_definitionIndex = definitionIndex;
_value = value;
json.sortOnKey();
}
/// Setup all fields for [InstanceConstantSyntax] that are not in
/// [ConstantSyntax].
void setup({required int definitionIndex, required JsonObjectSyntax? value}) {
_definitionIndex = definitionIndex;
_value = value;
json.sortOnKey();
}
int get definitionIndex => _reader.get<int>('definition_index');
set _definitionIndex(int value) {
json.setOrRemove('definition_index', value);
}
List<String> _validateDefinitionIndex() =>
_reader.validate<int>('definition_index');
JsonObjectSyntax? get value {
final jsonValue = _reader.optionalMap('value');
if (jsonValue == null) return null;
return JsonObjectSyntax.fromJson(jsonValue, path: [...path, 'value']);
}
set _value(JsonObjectSyntax? value) {
json.setOrRemove('value', value?.json);
}
List<String> _validateValue() {
final mapErrors = _reader.validate<Map<String, Object?>?>('value');
if (mapErrors.isNotEmpty) {
return mapErrors;
}
return value?.validate() ?? [];
}
@override
List<String> validate() => [
...super.validate(),
..._validateDefinitionIndex(),
..._validateValue(),
];
@override
String toString() => 'InstanceConstantSyntax($json)';
}
extension InstanceConstantSyntaxExtension on ConstantSyntax {
bool get isInstanceConstant => type == 'instance';
InstanceConstantSyntax get asInstanceConstant =>
InstanceConstantSyntax.fromJson(json, path: path);
}
class InstanceRecordingSyntax extends JsonObjectSyntax {
InstanceRecordingSyntax.fromJson(
super.json, {
super.path = const [],
}) : super.fromJson();
InstanceRecordingSyntax({
required int definitionIndex,
required List<InstanceSyntax> uses,
super.path = const [],
}) : super() {
_definitionIndex = definitionIndex;
_uses = uses;
json.sortOnKey();
}
int get definitionIndex => _reader.get<int>('definition_index');
set _definitionIndex(int value) {
json.setOrRemove('definition_index', value);
}
List<String> _validateDefinitionIndex() =>
_reader.validate<int>('definition_index');
List<InstanceSyntax> get uses {
final jsonValue = _reader.list('uses');
return [
for (final (index, element) in jsonValue.indexed)
InstanceSyntax.fromJson(
element as Map<String, Object?>,
path: [...path, 'uses', index],
),
];
}
set _uses(List<InstanceSyntax> value) {
json['uses'] = [for (final item in value) item.json];
}
List<String> _validateUses() {
final listErrors = _reader.validateList<Map<String, Object?>>(
'uses',
);
if (listErrors.isNotEmpty) {
return listErrors;
}
final elements = uses;
return [for (final element in elements) ...element.validate()];
}
@override
List<String> validate() => [
...super.validate(),
..._validateDefinitionIndex(),
..._validateUses(),
];
@override
String toString() => 'InstanceRecordingSyntax($json)';
}
class IntConstantSyntax extends ConstantSyntax {
IntConstantSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
IntConstantSyntax({required int value, super.path = const []})
: super(type: 'int') {
_value = value;
json.sortOnKey();
}
/// Setup all fields for [IntConstantSyntax] that are not in
/// [ConstantSyntax].
void setup({required int value}) {
_value = value;
json.sortOnKey();
}
int get value => _reader.get<int>('value');
set _value(int value) {
json.setOrRemove('value', value);
}
List<String> _validateValue() => _reader.validate<int>('value');
@override
List<String> validate() => [...super.validate(), ..._validateValue()];
@override
String toString() => 'IntConstantSyntax($json)';
}
extension IntConstantSyntaxExtension on ConstantSyntax {
bool get isIntConstant => type == 'int';
IntConstantSyntax get asIntConstant =>
IntConstantSyntax.fromJson(json, path: path);
}
class ListConstantSyntax extends ConstantSyntax {
ListConstantSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
ListConstantSyntax({required List<int> value, super.path = const []})
: super(type: 'list') {
_value = value;
json.sortOnKey();
}
/// Setup all fields for [ListConstantSyntax] that are not in
/// [ConstantSyntax].
void setup({required List<int> value}) {
_value = value;
json.sortOnKey();
}
List<int> get value => _reader.list<int>('value');
set _value(List<int> value) {
json['value'] = value;
}
List<String> _validateValue() => _reader.validateList<int>('value');
@override
List<String> validate() => [...super.validate(), ..._validateValue()];
@override
String toString() => 'ListConstantSyntax($json)';
}
extension ListConstantSyntaxExtension on ConstantSyntax {
bool get isListConstant => type == 'list';
ListConstantSyntax get asListConstant =>
ListConstantSyntax.fromJson(json, path: path);
}
class LoadingUnitSyntax extends JsonObjectSyntax {
LoadingUnitSyntax.fromJson(
super.json, {
super.path = const [],
}) : super.fromJson();
LoadingUnitSyntax({required String name, super.path = const []}) : super() {
_name = name;
json.sortOnKey();
}
String get name => _reader.get<String>('name');
set _name(String value) {
json.setOrRemove('name', value);
}
List<String> _validateName() => _reader.validate<String>('name');
@override
List<String> validate() => [...super.validate(), ..._validateName()];
@override
String toString() => 'LoadingUnitSyntax($json)';
}
class MapConstantSyntax extends ConstantSyntax {
MapConstantSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
MapConstantSyntax({
required List<MapEntrySyntax> value,
super.path = const [],
}) : super(type: 'map') {
_value = value;
json.sortOnKey();
}
/// Setup all fields for [MapConstantSyntax] that are not in
/// [ConstantSyntax].
void setup({required List<MapEntrySyntax> value}) {
_value = value;
json.sortOnKey();
}
List<MapEntrySyntax> get value {
final jsonValue = _reader.list('value');
return [
for (final (index, element) in jsonValue.indexed)
MapEntrySyntax.fromJson(
element as Map<String, Object?>,
path: [...path, 'value', index],
),
];
}
set _value(List<MapEntrySyntax> value) {
json['value'] = [for (final item in value) item.json];
}
List<String> _validateValue() {
final listErrors = _reader.validateList<Map<String, Object?>>(
'value',
);
if (listErrors.isNotEmpty) {
return listErrors;
}
final elements = value;
return [for (final element in elements) ...element.validate()];
}
@override
List<String> validate() => [...super.validate(), ..._validateValue()];
@override
String toString() => 'MapConstantSyntax($json)';
}
extension MapConstantSyntaxExtension on ConstantSyntax {
bool get isMapConstant => type == 'map';
MapConstantSyntax get asMapConstant =>
MapConstantSyntax.fromJson(json, path: path);
}
class MapEntrySyntax extends JsonObjectSyntax {
MapEntrySyntax.fromJson(
super.json, {
super.path = const [],
}) : super.fromJson();
MapEntrySyntax({required int key, required int value, super.path = const []})
: super() {
_key = key;
_value = value;
json.sortOnKey();
}
int get key => _reader.get<int>('key');
set _key(int value) {
json.setOrRemove('key', value);
}
List<String> _validateKey() => _reader.validate<int>('key');
int get value => _reader.get<int>('value');
set _value(int value) {
json.setOrRemove('value', value);
}
List<String> _validateValue() => _reader.validate<int>('value');
@override
List<String> validate() => [
...super.validate(),
..._validateKey(),
..._validateValue(),
];
@override
String toString() => 'MapEntrySyntax($json)';
}
class MethodNameSyntax extends NameSyntax {
MethodNameSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
MethodNameSyntax({
super.disambiguators,
required super.name,
super.path = const [],
}) : super(kind: 'method');
@override
List<String> validate() => [
...super.validate(),
];
@override
String toString() => 'MethodNameSyntax($json)';
}
extension MethodNameSyntaxExtension on NameSyntax {
bool get isMethodName => kind == 'method';
MethodNameSyntax get asMethodName =>
MethodNameSyntax.fromJson(json, path: path);
}
class MixinNameSyntax extends NameSyntax {
MixinNameSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
MixinNameSyntax({
super.disambiguators,
required super.name,
super.path = const [],
}) : super(kind: 'mixin');
@override
List<String> validate() => [
...super.validate(),
];
@override
String toString() => 'MixinNameSyntax($json)';
}
extension MixinNameSyntaxExtension on NameSyntax {
bool get isMixinName => kind == 'mixin';
MixinNameSyntax get asMixinName => MixinNameSyntax.fromJson(json, path: path);
}
class NameSyntax extends JsonObjectSyntax {
factory NameSyntax.fromJson(
Map<String, Object?> json, {
List<Object> path = const [],
}) {
final result = NameSyntax._fromJson(json, path: path);
if (result.isClassName) {
return result.asClassName;
}
if (result.isConstructorName) {
return result.asConstructorName;
}
if (result.isEnumName) {
return result.asEnumName;
}
if (result.isExtensionName) {
return result.asExtensionName;
}
if (result.isExtensionTypeName) {
return result.asExtensionTypeName;
}
if (result.isGetterName) {
return result.asGetterName;
}
if (result.isMethodName) {
return result.asMethodName;
}
if (result.isMixinName) {
return result.asMixinName;
}
if (result.isOperatorName) {
return result.asOperatorName;
}
if (result.isSetterName) {
return result.asSetterName;
}
return result;
}
NameSyntax._fromJson(
super.json, {
super.path = const [],
}) : super.fromJson();
NameSyntax({
List<String>? disambiguators,
required String kind,
required String name,
super.path = const [],
}) : super() {
_disambiguators = disambiguators;
_kind = kind;
_name = name;
json.sortOnKey();
}
List<String>? get disambiguators =>
_reader.optionalStringList('disambiguators');
set _disambiguators(List<String>? value) {
json.setOrRemove('disambiguators', value);
}
List<String> _validateDisambiguators() =>
_reader.validateOptionalStringList('disambiguators');
String get kind => _reader.get<String>('kind');
set _kind(String value) {
json.setOrRemove('kind', value);
}
List<String> _validateKind() => _reader.validate<String>('kind');
String get name => _reader.get<String>('name');
set _name(String value) {
json.setOrRemove('name', value);
}
List<String> _validateName() => _reader.validate<String>('name');
@override
List<String> validate() => [
...super.validate(),
..._validateDisambiguators(),
..._validateKind(),
..._validateName(),
];
@override
String toString() => 'NameSyntax($json)';
}
class NegativeInfinityDoubleConstantValueSyntax
extends DoubleConstantValueSyntax {
NegativeInfinityDoubleConstantValueSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
NegativeInfinityDoubleConstantValueSyntax({
super.value,
super.path = const [],
}) : super(type: 'negative_infinity');
@override
List<String> validate() => [
...super.validate(),
];
@override
String toString() => 'NegativeInfinityDoubleConstantValueSyntax($json)';
}
extension NegativeInfinityDoubleConstantValueSyntaxExtension
on DoubleConstantValueSyntax {
bool get isNegativeInfinityDoubleConstantValue => type == 'negative_infinity';
NegativeInfinityDoubleConstantValueSyntax
get asNegativeInfinityDoubleConstantValue =>
NegativeInfinityDoubleConstantValueSyntax.fromJson(json, path: path);
}
class NonConstantConstantSyntax extends ConstantSyntax {
NonConstantConstantSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
NonConstantConstantSyntax({super.path = const []})
: super(type: 'non_constant');
@override
List<String> validate() => [
...super.validate(),
];
@override
String toString() => 'NonConstantConstantSyntax($json)';
}
extension NonConstantConstantSyntaxExtension on ConstantSyntax {
bool get isNonConstantConstant => type == 'non_constant';
NonConstantConstantSyntax get asNonConstantConstant =>
NonConstantConstantSyntax.fromJson(json, path: path);
}
class NotANumberDoubleConstantValueSyntax extends DoubleConstantValueSyntax {
NotANumberDoubleConstantValueSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
NotANumberDoubleConstantValueSyntax({super.value, super.path = const []})
: super(type: 'not_a_number');
@override
List<String> validate() => [
...super.validate(),
];
@override
String toString() => 'NotANumberDoubleConstantValueSyntax($json)';
}
extension NotANumberDoubleConstantValueSyntaxExtension
on DoubleConstantValueSyntax {
bool get isNotANumberDoubleConstantValue => type == 'not_a_number';
NotANumberDoubleConstantValueSyntax get asNotANumberDoubleConstantValue =>
NotANumberDoubleConstantValueSyntax.fromJson(json, path: path);
}
class NullConstantSyntax extends ConstantSyntax {
NullConstantSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
NullConstantSyntax({super.path = const []}) : super(type: 'null');
@override
List<String> validate() => [
...super.validate(),
];
@override
String toString() => 'NullConstantSyntax($json)';
}
extension NullConstantSyntaxExtension on ConstantSyntax {
bool get isNullConstant => type == 'null';
NullConstantSyntax get asNullConstant =>
NullConstantSyntax.fromJson(json, path: path);
}
class NumberDoubleConstantValueSyntax extends DoubleConstantValueSyntax {
NumberDoubleConstantValueSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
NumberDoubleConstantValueSyntax({super.value, super.path = const []})
: super(type: 'number');
@override
List<String> validate() => [
...super.validate(),
];
@override
String toString() => 'NumberDoubleConstantValueSyntax($json)';
}
extension NumberDoubleConstantValueSyntaxExtension
on DoubleConstantValueSyntax {
bool get isNumberDoubleConstantValue => type == 'number';
NumberDoubleConstantValueSyntax get asNumberDoubleConstantValue =>
NumberDoubleConstantValueSyntax.fromJson(json, path: path);
}
class OperatorNameSyntax extends NameSyntax {
OperatorNameSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
OperatorNameSyntax({
super.disambiguators,
required super.name,
super.path = const [],
}) : super(kind: 'operator');
@override
List<String> validate() => [
...super.validate(),
];
@override
String toString() => 'OperatorNameSyntax($json)';
}
extension OperatorNameSyntaxExtension on NameSyntax {
bool get isOperatorName => kind == 'operator';
OperatorNameSyntax get asOperatorName =>
OperatorNameSyntax.fromJson(json, path: path);
}
class PositiveInfinityDoubleConstantValueSyntax
extends DoubleConstantValueSyntax {
PositiveInfinityDoubleConstantValueSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
PositiveInfinityDoubleConstantValueSyntax({
super.value,
super.path = const [],
}) : super(type: 'positive_infinity');
@override
List<String> validate() => [
...super.validate(),
];
@override
String toString() => 'PositiveInfinityDoubleConstantValueSyntax($json)';
}
extension PositiveInfinityDoubleConstantValueSyntaxExtension
on DoubleConstantValueSyntax {
bool get isPositiveInfinityDoubleConstantValue => type == 'positive_infinity';
PositiveInfinityDoubleConstantValueSyntax
get asPositiveInfinityDoubleConstantValue =>
PositiveInfinityDoubleConstantValueSyntax.fromJson(json, path: path);
}
class RecordConstantSyntax extends ConstantSyntax {
RecordConstantSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
RecordConstantSyntax({
Map<String, int>? named,
List<int>? positional,
super.path = const [],
}) : super(type: 'record') {
_named = named;
_positional = positional;
json.sortOnKey();
}
/// Setup all fields for [RecordConstantSyntax] that are not in
/// [ConstantSyntax].
void setup({
required Map<String, int>? named,
required List<int>? positional,
}) {
_named = named;
_positional = positional;
json.sortOnKey();
}
Map<String, int>? get named => _reader.optionalMap<int>(
'named',
);
set _named(Map<String, int>? value) {
_checkArgumentMapKeys(
value,
);
json.setOrRemove('named', value);
}
List<String> _validateNamed() => _reader.validateOptionalMap<int>(
'named',
);
List<int>? get positional => _reader.optionalList<int>('positional');
set _positional(List<int>? value) {
json.setOrRemove('positional', value);
}
List<String> _validatePositional() =>
_reader.validateOptionalList<int>('positional');
@override
List<String> validate() => [
...super.validate(),
..._validateNamed(),
..._validatePositional(),
];
@override
String toString() => 'RecordConstantSyntax($json)';
}
extension RecordConstantSyntaxExtension on ConstantSyntax {
bool get isRecordConstant => type == 'record';
RecordConstantSyntax get asRecordConstant =>
RecordConstantSyntax.fromJson(json, path: path);
}
class RecordedUsesSyntax extends JsonObjectSyntax {
RecordedUsesSyntax.fromJson(
super.json, {
super.path = const [],
}) : super.fromJson();
RecordedUsesSyntax({
List<ConstantSyntax>? constants,
List<DefinitionSyntax>? definitions,
List<LoadingUnitSyntax>? loadingUnits,
UsesSyntax? uses,
super.path = const [],
}) : super() {
_constants = constants;
_definitions = definitions;
_loadingUnits = loadingUnits;
_uses = uses;
json.sortOnKey();
}
List<ConstantSyntax>? get constants {
final jsonValue = _reader.optionalList('constants');
if (jsonValue == null) return null;
return [
for (final (index, element) in jsonValue.indexed)
ConstantSyntax.fromJson(
element as Map<String, Object?>,
path: [...path, 'constants', index],
),
];
}
set _constants(List<ConstantSyntax>? value) {
if (value == null) {
json.remove('constants');
} else {
json['constants'] = [for (final item in value) item.json];
}
}
List<String> _validateConstants() {
final listErrors = _reader.validateOptionalList<Map<String, Object?>>(
'constants',
);
if (listErrors.isNotEmpty) {
return listErrors;
}
final elements = constants;
if (elements == null) {
return [];
}
return [for (final element in elements) ...element.validate()];
}
List<DefinitionSyntax>? get definitions {
final jsonValue = _reader.optionalList('definitions');
if (jsonValue == null) return null;
return [
for (final (index, element) in jsonValue.indexed)
DefinitionSyntax.fromJson(
element as Map<String, Object?>,
path: [...path, 'definitions', index],
),
];
}
set _definitions(List<DefinitionSyntax>? value) {
if (value == null) {
json.remove('definitions');
} else {
json['definitions'] = [for (final item in value) item.json];
}
}
List<String> _validateDefinitions() {
final listErrors = _reader.validateOptionalList<Map<String, Object?>>(
'definitions',
);
if (listErrors.isNotEmpty) {
return listErrors;
}
final elements = definitions;
if (elements == null) {
return [];
}
return [for (final element in elements) ...element.validate()];
}
List<LoadingUnitSyntax>? get loadingUnits {
final jsonValue = _reader.optionalList('loading_units');
if (jsonValue == null) return null;
return [
for (final (index, element) in jsonValue.indexed)
LoadingUnitSyntax.fromJson(
element as Map<String, Object?>,
path: [...path, 'loading_units', index],
),
];
}
set _loadingUnits(List<LoadingUnitSyntax>? value) {
if (value == null) {
json.remove('loading_units');
} else {
json['loading_units'] = [for (final item in value) item.json];
}
}
List<String> _validateLoadingUnits() {
final listErrors = _reader.validateOptionalList<Map<String, Object?>>(
'loading_units',
);
if (listErrors.isNotEmpty) {
return listErrors;
}
final elements = loadingUnits;
if (elements == null) {
return [];
}
return [for (final element in elements) ...element.validate()];
}
UsesSyntax? get uses {
final jsonValue = _reader.optionalMap('uses');
if (jsonValue == null) return null;
return UsesSyntax.fromJson(jsonValue, path: [...path, 'uses']);
}
set _uses(UsesSyntax? value) {
json.setOrRemove('uses', value?.json);
}
List<String> _validateUses() {
final mapErrors = _reader.validate<Map<String, Object?>?>('uses');
if (mapErrors.isNotEmpty) {
return mapErrors;
}
return uses?.validate() ?? [];
}
@override
List<String> validate() => [
...super.validate(),
..._validateConstants(),
..._validateDefinitions(),
..._validateLoadingUnits(),
..._validateUses(),
];
@override
String toString() => 'RecordedUsesSyntax($json)';
}
class SetConstantSyntax extends ConstantSyntax {
SetConstantSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
SetConstantSyntax({required List<int> value, super.path = const []})
: super(type: 'set') {
_value = value;
json.sortOnKey();
}
/// Setup all fields for [SetConstantSyntax] that are not in
/// [ConstantSyntax].
void setup({required List<int> value}) {
_value = value;
json.sortOnKey();
}
List<int> get value => _reader.list<int>('value');
set _value(List<int> value) {
json['value'] = value;
}
List<String> _validateValue() => _reader.validateList<int>('value');
@override
List<String> validate() => [...super.validate(), ..._validateValue()];
@override
String toString() => 'SetConstantSyntax($json)';
}
extension SetConstantSyntaxExtension on ConstantSyntax {
bool get isSetConstant => type == 'set';
SetConstantSyntax get asSetConstant =>
SetConstantSyntax.fromJson(json, path: path);
}
class SetterNameSyntax extends NameSyntax {
SetterNameSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
SetterNameSyntax({
super.disambiguators,
required super.name,
super.path = const [],
}) : super(kind: 'setter');
@override
List<String> validate() => [
...super.validate(),
];
@override
String toString() => 'SetterNameSyntax($json)';
}
extension SetterNameSyntaxExtension on NameSyntax {
bool get isSetterName => kind == 'setter';
SetterNameSyntax get asSetterName =>
SetterNameSyntax.fromJson(json, path: path);
}
class StringConstantSyntax extends ConstantSyntax {
StringConstantSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
StringConstantSyntax({required String value, super.path = const []})
: super(type: 'string') {
_value = value;
json.sortOnKey();
}
/// Setup all fields for [StringConstantSyntax] that are not in
/// [ConstantSyntax].
void setup({required String value}) {
_value = value;
json.sortOnKey();
}
String get value => _reader.get<String>('value');
set _value(String value) {
json.setOrRemove('value', value);
}
List<String> _validateValue() => _reader.validate<String>('value');
@override
List<String> validate() => [...super.validate(), ..._validateValue()];
@override
String toString() => 'StringConstantSyntax($json)';
}
extension StringConstantSyntaxExtension on ConstantSyntax {
bool get isStringConstant => type == 'string';
StringConstantSyntax get asStringConstant =>
StringConstantSyntax.fromJson(json, path: path);
}
class SymbolConstantSyntax extends ConstantSyntax {
SymbolConstantSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
SymbolConstantSyntax({
String? libraryUri,
required String name,
super.path = const [],
}) : super(type: 'symbol') {
_libraryUri = libraryUri;
_name = name;
json.sortOnKey();
}
/// Setup all fields for [SymbolConstantSyntax] that are not in
/// [ConstantSyntax].
void setup({required String? libraryUri, required String name}) {
_libraryUri = libraryUri;
_name = name;
json.sortOnKey();
}
static final _libraryUriPattern = RegExp(r'^package:');
String? get libraryUri =>
_reader.optionalString('libraryUri', _libraryUriPattern);
set _libraryUri(String? value) {
if (value != null && !_libraryUriPattern.hasMatch(value)) {
throw ArgumentError.value(
value,
'value',
'Value does not satisfy pattern: ${_libraryUriPattern.pattern}.',
);
}
json.setOrRemove('libraryUri', value);
}
List<String> _validateLibraryUri() =>
_reader.validateOptionalString('libraryUri', _libraryUriPattern);
String get name => _reader.get<String>('name');
set _name(String value) {
json.setOrRemove('name', value);
}
List<String> _validateName() => _reader.validate<String>('name');
@override
List<String> validate() => [
...super.validate(),
..._validateLibraryUri(),
..._validateName(),
];
@override
String toString() => 'SymbolConstantSyntax($json)';
}
extension SymbolConstantSyntaxExtension on ConstantSyntax {
bool get isSymbolConstant => type == 'symbol';
SymbolConstantSyntax get asSymbolConstant =>
SymbolConstantSyntax.fromJson(json, path: path);
}
class TearoffCallSyntax extends CallSyntax {
TearoffCallSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
TearoffCallSyntax({
required super.loadingUnitIndex,
super.receiver,
super.path = const [],
}) : super(type: 'tearoff');
@override
List<String> validate() => [
...super.validate(),
];
@override
String toString() => 'TearoffCallSyntax($json)';
}
extension TearoffCallSyntaxExtension on CallSyntax {
bool get isTearoffCall => type == 'tearoff';
TearoffCallSyntax get asTearoffCall =>
TearoffCallSyntax.fromJson(json, path: path);
}
class TearoffInstanceSyntax extends InstanceSyntax {
TearoffInstanceSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
TearoffInstanceSyntax({
required int definitionIndex,
required super.loadingUnitIndex,
super.path = const [],
}) : super(type: 'tearoff') {
_definitionIndex = definitionIndex;
json.sortOnKey();
}
/// Setup all fields for [TearoffInstanceSyntax] that are not in
/// [InstanceSyntax].
void setup({required int definitionIndex}) {
_definitionIndex = definitionIndex;
json.sortOnKey();
}
int get definitionIndex => _reader.get<int>('definition_index');
set _definitionIndex(int value) {
json.setOrRemove('definition_index', value);
}
List<String> _validateDefinitionIndex() =>
_reader.validate<int>('definition_index');
@override
List<String> validate() => [
...super.validate(),
..._validateDefinitionIndex(),
];
@override
String toString() => 'TearoffInstanceSyntax($json)';
}
extension TearoffInstanceSyntaxExtension on InstanceSyntax {
bool get isTearoffInstance => type == 'tearoff';
TearoffInstanceSyntax get asTearoffInstance =>
TearoffInstanceSyntax.fromJson(json, path: path);
}
class UnsupportedConstantSyntax extends ConstantSyntax {
UnsupportedConstantSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
UnsupportedConstantSyntax({required String message, super.path = const []})
: super(type: 'unsupported') {
_message = message;
json.sortOnKey();
}
/// Setup all fields for [UnsupportedConstantSyntax] that are not in
/// [ConstantSyntax].
void setup({required String message}) {
_message = message;
json.sortOnKey();
}
String get message => _reader.get<String>('message');
set _message(String value) {
json.setOrRemove('message', value);
}
List<String> _validateMessage() => _reader.validate<String>('message');
@override
List<String> validate() => [...super.validate(), ..._validateMessage()];
@override
String toString() => 'UnsupportedConstantSyntax($json)';
}
extension UnsupportedConstantSyntaxExtension on ConstantSyntax {
bool get isUnsupportedConstant => type == 'unsupported';
UnsupportedConstantSyntax get asUnsupportedConstant =>
UnsupportedConstantSyntax.fromJson(json, path: path);
}
class UsesSyntax extends JsonObjectSyntax {
UsesSyntax.fromJson(
super.json, {
super.path = const [],
}) : super.fromJson();
UsesSyntax({
List<InstanceRecordingSyntax>? instances,
List<CallRecordingSyntax>? staticCalls,
super.path = const [],
}) : super() {
_instances = instances;
_staticCalls = staticCalls;
json.sortOnKey();
}
List<InstanceRecordingSyntax>? get instances {
final jsonValue = _reader.optionalList('instances');
if (jsonValue == null) return null;
return [
for (final (index, element) in jsonValue.indexed)
InstanceRecordingSyntax.fromJson(
element as Map<String, Object?>,
path: [...path, 'instances', index],
),
];
}
set _instances(List<InstanceRecordingSyntax>? value) {
if (value == null) {
json.remove('instances');
} else {
json['instances'] = [for (final item in value) item.json];
}
}
List<String> _validateInstances() {
final listErrors = _reader.validateOptionalList<Map<String, Object?>>(
'instances',
);
if (listErrors.isNotEmpty) {
return listErrors;
}
final elements = instances;
if (elements == null) {
return [];
}
return [for (final element in elements) ...element.validate()];
}
List<CallRecordingSyntax>? get staticCalls {
final jsonValue = _reader.optionalList('static_calls');
if (jsonValue == null) return null;
return [
for (final (index, element) in jsonValue.indexed)
CallRecordingSyntax.fromJson(
element as Map<String, Object?>,
path: [...path, 'static_calls', index],
),
];
}
set _staticCalls(List<CallRecordingSyntax>? value) {
if (value == null) {
json.remove('static_calls');
} else {
json['static_calls'] = [for (final item in value) item.json];
}
}
List<String> _validateStaticCalls() {
final listErrors = _reader.validateOptionalList<Map<String, Object?>>(
'static_calls',
);
if (listErrors.isNotEmpty) {
return listErrors;
}
final elements = staticCalls;
if (elements == null) {
return [];
}
return [for (final element in elements) ...element.validate()];
}
@override
List<String> validate() => [
...super.validate(),
..._validateInstances(),
..._validateStaticCalls(),
];
@override
String toString() => 'UsesSyntax($json)';
}
class WithArgumentsCallSyntax extends CallSyntax {
WithArgumentsCallSyntax.fromJson(
super.json, {
super.path,
}) : super._fromJson();
WithArgumentsCallSyntax({
required super.loadingUnitIndex,
Map<String, int>? named,
List<int>? positional,
super.receiver,
super.path = const [],
}) : super(type: 'with_arguments') {
_named = named;
_positional = positional;
json.sortOnKey();
}
/// Setup all fields for [WithArgumentsCallSyntax] that are not in
/// [CallSyntax].
void setup({
required Map<String, int>? named,
required List<int>? positional,
}) {
_named = named;
_positional = positional;
json.sortOnKey();
}
Map<String, int>? get named => _reader.optionalMap<int>(
'named',
);
set _named(Map<String, int>? value) {
_checkArgumentMapKeys(
value,
);
json.setOrRemove('named', value);
}
List<String> _validateNamed() => _reader.validateOptionalMap<int>(
'named',
);
List<int>? get positional => _reader.optionalList<int>('positional');
set _positional(List<int>? value) {
json.setOrRemove('positional', value);
}
List<String> _validatePositional() =>
_reader.validateOptionalList<int>('positional');
@override
List<String> validate() => [
...super.validate(),
..._validateNamed(),
..._validatePositional(),
];
@override
String toString() => 'WithArgumentsCallSyntax($json)';
}
extension WithArgumentsCallSyntaxExtension on CallSyntax {
bool get isWithArgumentsCall => type == 'with_arguments';
WithArgumentsCallSyntax get asWithArgumentsCall =>
WithArgumentsCallSyntax.fromJson(json, path: path);
}
class JsonObjectSyntax {
final Map<String, Object?> json;
final List<Object> path;
_JsonReader get _reader => _JsonReader(json, path);
JsonObjectSyntax({this.path = const []}) : json = {};
JsonObjectSyntax.fromJson(this.json, {this.path = const []});
List<String> validate() => [];
}
class _JsonReader {
/// The JSON Object this reader is reading.
final Map<String, Object?> json;
/// The path traversed by readers of the surrounding JSON.
///
/// Contains [String] property keys and [int] indices.
///
/// This is used to give more precise error messages.
final List<Object> path;
_JsonReader(this.json, this.path);
T get<T extends Object?>(String key) {
final value = json[key];
if (value is T) return value;
throwFormatException(value, [key], expectedType: T);
}
List<String> validate<T extends Object?>(String key) {
final value = json[key];
if (value is T) return [];
return [
errorString(value, [key], expectedType: T),
];
}
List<T> list<T extends Object?>(String key) =>
_castList<T>(get<List<Object?>>(key), key);
List<String> validateList<T extends Object?>(String key) {
final listErrors = validate<List<Object?>>(key);
if (listErrors.isNotEmpty) {
return listErrors;
}
return _validateListElements(get<List<Object?>>(key), key);
}
List<T>? optionalList<T extends Object?>(String key) =>
switch (get<List<Object?>?>(key)?.cast<T>()) {
null => null,
final l => _castList<T>(l, key),
};
List<String> validateOptionalList<T extends Object?>(String key) {
final listErrors = validate<List<Object?>?>(key);
if (listErrors.isNotEmpty) {
return listErrors;
}
final list = get<List<Object?>?>(key);
if (list == null) {
return [];
}
return _validateListElements(list, key);
}
/// [List.cast] but with [FormatException]s.
List<T> _castList<T extends Object?>(List<Object?> list, String key) {
for (final (index, value) in list.indexed) {
if (value is! T) {
throwFormatException(value, [key, index], expectedType: T);
}
}
return list.cast();
}
List<String> _validateListElements<T extends Object?>(
List<Object?> list,
String key,
) {
final result = <String>[];
for (final (index, value) in list.indexed) {
if (value is! T) {
result.add(errorString(value, [key, index], expectedType: T));
}
}
return result;
}
Map<String, T> map$<T extends Object?>(String key, {RegExp? keyPattern}) {
final map = get<Map<String, Object?>>(key);
final keyErrors = _validateMapKeys(map, key, keyPattern: keyPattern);
if (keyErrors.isNotEmpty) {
throw FormatException(keyErrors.join('\n'));
}
return _castMap<T>(map, key);
}
List<String> validateMap<T extends Object?>(
String key, {
RegExp? keyPattern,
}) {
final mapErrors = validate<Map<String, Object?>>(key);
if (mapErrors.isNotEmpty) {
return mapErrors;
}
final map = get<Map<String, Object?>>(key);
return [
..._validateMapKeys(map, key, keyPattern: keyPattern),
..._validateMapElements<T>(map, key),
];
}
Map<String, T>? optionalMap<T extends Object?>(
String key, {
RegExp? keyPattern,
}) {
final map = get<Map<String, Object?>?>(key);
if (map == null) return null;
final keyErrors = _validateMapKeys(map, key, keyPattern: keyPattern);
if (keyErrors.isNotEmpty) {
throw FormatException(keyErrors.join('\n'));
}
return _castMap<T>(map, key);
}
List<String> validateOptionalMap<T extends Object?>(
String key, {
RegExp? keyPattern,
}) {
final mapErrors = validate<Map<String, Object?>?>(key);
if (mapErrors.isNotEmpty) {
return mapErrors;
}
final map = get<Map<String, Object?>?>(key);
if (map == null) {
return [];
}
return [
..._validateMapKeys(map, key, keyPattern: keyPattern),
..._validateMapElements<T>(map, key),
];
}
/// [Map.cast] but with [FormatException]s.
Map<String, T> _castMap<T extends Object?>(
Map<String, Object?> map_,
String parentKey,
) {
for (final MapEntry(:key, :value) in map_.entries) {
if (value is! T) {
throwFormatException(value, [parentKey, key], expectedType: T);
}
}
return map_.cast();
}
List<String> _validateMapKeys(
Map<String, Object?> map_,
String parentKey, {
required RegExp? keyPattern,
}) {
if (keyPattern == null) return [];
final result = <String>[];
for (final key in map_.keys) {
if (!keyPattern.hasMatch(key)) {
result.add(
keyErrorString(key, pattern: keyPattern, pathExtension: [parentKey]),
);
}
}
return result;
}
List<String> _validateMapElements<T extends Object?>(
Map<String, Object?> map_,
String parentKey,
) {
final result = <String>[];
for (final MapEntry(:key, :value) in map_.entries) {
if (value is! T) {
result.add(errorString(value, [parentKey, key], expectedType: T));
}
}
return result;
}
List<String> validateMapStringElements<T extends Object?>(
Map<String, String?> map_,
String parentKey, {
RegExp? valuePattern,
}) {
final result = <String>[];
for (final MapEntry(:key, :value) in map_.entries) {
if (value != null &&
valuePattern != null &&
!valuePattern.hasMatch(value)) {
result.add(
errorString(
value,
[parentKey, key],
expectedType: T,
pattern: valuePattern,
),
);
}
}
return result;
}
String string(String key, RegExp? pattern) {
final value = get<String>(key);
if (pattern != null && !pattern.hasMatch(value)) {
throwFormatException(
value,
[key],
expectedType: String,
pattern: pattern,
);
}
return value;
}
String? optionalString(String key, RegExp? pattern) {
final value = get<String?>(key);
if (value == null) return null;
if (pattern != null && !pattern.hasMatch(value)) {
throwFormatException(
value,
[key],
expectedType: String,
pattern: pattern,
);
}
return value;
}
List<String> validateString(String key, RegExp? pattern) {
final errors = validate<String>(key);
if (errors.isNotEmpty) {
return errors;
}
final value = get<String>(key);
if (pattern != null && !pattern.hasMatch(value)) {
return [
errorString(value, [key], expectedType: String, pattern: pattern),
];
}
return [];
}
List<String> validateOptionalString(String key, RegExp? pattern) {
final errors = validate<String?>(key);
if (errors.isNotEmpty) {
return errors;
}
final value = get<String?>(key);
if (value == null) return [];
if (pattern != null && !pattern.hasMatch(value)) {
return [
errorString(value, [key], expectedType: String, pattern: pattern),
];
}
return [];
}
List<String>? optionalStringList(String key) => optionalList<String>(key);
List<String> validateOptionalStringList(String key) =>
validateOptionalList<String>(key);
List<String> stringList(String key) => list<String>(key);
List<String> validateStringList(String key) => validateList<String>(key);
Uri path$(String key) => _fileSystemPathToUri(get<String>(key));
List<String> validatePath(String key) => validate<String>(key);
Uri? optionalPath(String key) {
final value = get<String?>(key);
if (value == null) return null;
return _fileSystemPathToUri(value);
}
List<String> validateOptionalPath(String key) => validate<String?>(key);
List<Uri>? optionalPathList(String key) {
final strings = optionalStringList(key);
if (strings == null) {
return null;
}
return [for (final string in strings) _fileSystemPathToUri(string)];
}
List<String> validateOptionalPathList(String key) =>
validateOptionalStringList(key);
static Uri _fileSystemPathToUri(String path) {
if (path.endsWith(Platform.pathSeparator)) {
return Uri.directory(path);
}
return Uri.file(path);
}
String _jsonPathToString(List<Object> pathEnding) =>
[...path, ...pathEnding].join('.');
Never throwFormatException(
Object? value,
List<Object> pathExtension, {
Type? expectedType,
RegExp? pattern,
Set<String>? expectedValues,
}) => _throwFormatException(
value,
[...path, ...pathExtension],
expectedType: expectedType,
pattern: pattern,
expectedValues: expectedValues,
);
String errorString(
Object? value,
List<Object> pathExtension, {
Type? expectedType,
RegExp? pattern,
Set<String>? expectedValues,
}) => _errorString(
value,
[...path, ...pathExtension],
expectedType: expectedType,
pattern: pattern,
expectedValues: expectedValues,
);
String keyErrorString(
String key, {
required RegExp pattern,
List<Object> pathExtension = const [],
}) {
final pathString = _jsonPathToString(pathExtension);
return "Unexpected key '$key' in '$pathString'."
' Expected a key satisfying ${pattern.pattern}.';
}
/// Traverses a JSON path, returns `null` if the path cannot be traversed.
Object? tryTraverse(List<String> path) {
Object? json = this.json;
for (final key in path) {
if (json is! Map<String, Object?>) {
return null;
}
json = json[key];
}
return json;
}
}
extension on Map<String, Object?> {
void setOrRemove(String key, Object? value) {
if (value == null) {
remove(key);
} else {
this[key] = value;
}
}
}
extension on List<Uri> {
List<String> toJson() => [for (final uri in this) uri.toFilePath()];
}
extension<K extends Comparable<K>, V extends Object?> on Map<K, V> {
void sortOnKey() {
final result = <K, V>{};
final keysSorted = keys.toList()..sort();
for (final key in keysSorted) {
result[key] = this[key] as V;
}
clear();
addAll(result);
}
}
void _checkArgumentMapKeys(Map<String, Object?>? map, {RegExp? keyPattern}) {
if (map == null) return;
if (keyPattern == null) return;
for (final key in map.keys) {
if (!keyPattern.hasMatch(key)) {
throw ArgumentError.value(
map,
"Unexpected key '$key'."
' Expected a key satisfying ${keyPattern.pattern}.',
);
}
}
}
Never _throwFormatException(
Object? value,
List<Object> path, {
Type? expectedType,
RegExp? pattern,
Set<String>? expectedValues,
}) {
throw FormatException(
_errorString(
value,
path,
expectedType: expectedType,
pattern: pattern,
expectedValues: expectedValues,
),
);
}
String _errorString(
Object? value,
List<Object> path, {
Type? expectedType,
RegExp? pattern,
Set<String>? expectedValues,
}) {
final pathString = path.join('.');
final String expected;
if (expectedValues != null) {
expected = "one of ${expectedValues.map((e) => "'$e'").join(', ')}";
} else {
final satisfying = pattern == null ? '' : ' satisfying ${pattern.pattern}';
expected = 'a $expectedType$satisfying';
}
if (value == null) {
return "No value was provided for '$pathString'."
' Expected $expected.';
}
return "Unexpected value '$value' (${value.runtimeType}) for '$pathString'."
' Expected $expected.';
}
void _checkArgumentMapStringElements(
Map<String, String?>? map, {
RegExp? valuePattern,
}) {
if (map == null) return;
if (valuePattern == null) return;
for (final entry in map.entries) {
final value = entry.value;
if (value != null && !valuePattern.hasMatch(value)) {
throw ArgumentError.value(
map,
"Unexpected value '$value' under key '${entry.key}'."
' Expected a value satisfying ${valuePattern.pattern}.',
);
}
}
}