diff --git a/goldens/foo/lib/built_value/built_value_test.analyzer.augmentations b/goldens/foo/lib/built_value/built_value_test.analyzer.augmentations index 38674ffb..ee6f23e6 100644 --- a/goldens/foo/lib/built_value/built_value_test.analyzer.augmentations +++ b/goldens/foo/lib/built_value/built_value_test.analyzer.augmentations @@ -50,26 +50,26 @@ prefix1.PrimitiveFields rebuild(void Function(prefix1.PrimitiveFieldsBuilder) up augment class NestedFields { factory NestedFields([void Function(prefix1.NestedFieldsBuilder)? updates]) => (prefix1.NestedFieldsBuilder()..update(updates)).build(); -NestedFields._({required this.aPrimitiveFields,required this.aString,}) {} +NestedFields._({required this.aPrimitiveFields,required this.stringWrapper,required this.aString,}) {} prefix1.NestedFieldsBuilder toBuilder() => prefix1.NestedFieldsBuilder()..replace(this); prefix1.NestedFields rebuild(void Function(prefix1.NestedFieldsBuilder) updates) => (toBuilder()..update(updates)).build(); - prefix2.int get hashCode => prefix2.Object.hashAll([aPrimitiveFields,aString,]); + prefix2.int get hashCode => prefix2.Object.hashAll([aPrimitiveFields,stringWrapper,aString,]); prefix2.bool operator==(prefix2.Object other) => - other is prefix1.NestedFields&& aPrimitiveFields == other.aPrimitiveFields&& aString == other.aString; + other is prefix1.NestedFields&& aPrimitiveFields == other.aPrimitiveFields&& stringWrapper == other.stringWrapper&& aString == other.aString; - prefix2.String toString() => 'NestedFields(aPrimitiveFields: $aPrimitiveFields, aString: $aString)'; + prefix2.String toString() => 'NestedFields(aPrimitiveFields: $aPrimitiveFields, stringWrapper: $stringWrapper, aString: $aString)'; } augment class NestedFieldsBuilder { -prefix1.PrimitiveFieldsBuilder aPrimitiveFields = prefix1.PrimitiveFieldsBuilder();prefix2.String? aString; +prefix1.PrimitiveFieldsBuilder aPrimitiveFields = prefix1.PrimitiveFieldsBuilder();prefix1.StringWrapper? stringWrapper;prefix2.String? aString; -void replace(prefix1.NestedFields other) { this.aPrimitiveFields = other.aPrimitiveFields.toBuilder();this.aString = other.aString; } +void replace(prefix1.NestedFields other) { this.aPrimitiveFields = other.aPrimitiveFields.toBuilder();this.stringWrapper = other.stringWrapper;this.aString = other.aString; } void update(void Function(prefix1.NestedFieldsBuilder)? updates) => updates?.call(this); -prefix1.NestedFields build() => prefix1.NestedFields._(aPrimitiveFields: aPrimitiveFields.build(),aString: aString!,); +prefix1.NestedFields build() => prefix1.NestedFields._(aPrimitiveFields: aPrimitiveFields.build(),stringWrapper: stringWrapper!,aString: aString!,); } augment class PrimitiveFieldsBuilder { diff --git a/goldens/foo/lib/built_value/built_value_test.dart b/goldens/foo/lib/built_value/built_value_test.dart index c8745062..27c1c33f 100644 --- a/goldens/foo/lib/built_value/built_value_test.dart +++ b/goldens/foo/lib/built_value/built_value_test.dart @@ -54,17 +54,33 @@ void main() { b ..aPrimitiveFields.anInt = 3 ..aPrimitiveFields.aString = 'four' - ..aString = 'five', + ..aString = 'five' + ..stringWrapper = StringWrapper('six'), ); expect( value.toString(), 'NestedFields(aPrimitiveFields: PrimitiveFields(' - 'anInt: 3, aString: four, aNullableString: null), aString: five)', + 'anInt: 3, aString: four, aNullableString: null), ' + 'stringWrapper: StringWrapper(aString: six), aString: five)', ); }); }); } +class NonMacro { + const NonMacro(); +} + +@NonMacro() +class StringWrapper { + const StringWrapper(this.aString); + + final String aString; + + @override + String toString() => 'StringWrapper(aString: $aString)'; +} + @BuiltValue() class Empty {} @@ -78,5 +94,6 @@ class PrimitiveFields { @BuiltValue() class NestedFields { final PrimitiveFields aPrimitiveFields; + final StringWrapper stringWrapper; final String aString; } diff --git a/goldens/foo/lib/foo.analyzer.json b/goldens/foo/lib/foo.analyzer.json index 15f24c4b..1195bbbd 100644 --- a/goldens/foo/lib/foo.analyzer.json +++ b/goldens/foo/lib/foo.analyzer.json @@ -208,14 +208,18 @@ "value": { "reference": { "type": "ClassReference", - "value": {} + "value": { + "name": "QueryClass" + } }, "typeArguments": [] } }, "constructor": { "type": "ConstructorReference", - "value": {} + "value": { + "name": "new" + } }, "arguments": [] } @@ -272,14 +276,18 @@ "value": { "reference": { "type": "ClassReference", - "value": {} + "value": { + "name": "QueryClass" + } }, "typeArguments": [] } }, "constructor": { "type": "ConstructorReference", - "value": {} + "value": { + "name": "new" + } }, "arguments": [] } diff --git a/goldens/foo/lib/literal_params.analyzer.augmentations b/goldens/foo/lib/literal_params.analyzer.augmentations index b0a3057c..75f63cf0 100644 --- a/goldens/foo/lib/literal_params.analyzer.augmentations +++ b/goldens/foo/lib/literal_params.analyzer.augmentations @@ -5,10 +5,10 @@ augment class Foo { // aNum: 8.0, double // aDouble: 9.0, double // aString: 10, String - // anObject: {type: {type: NamedTypeAnnotation, value: {reference: {type: ClassReference, value: {}}, typeArguments: []}}, constructor: {type: ConstructorReference, value: {}}, arguments: [{type: NamedArgument, value: {name: a, expression: {type: BooleanLiteral, value: {text: true}}}}, {type: NamedArgument, value: {name: b, expression: {type: BooleanLiteral, value: {text: false}}}}]}, String + // anObject: {type: {type: NamedTypeAnnotation, value: {reference: {type: ClassReference, value: {name: Bar}}, typeArguments: []}}, constructor: {type: ConstructorReference, value: {name: new}}, arguments: [{type: NamedArgument, value: {name: a, expression: {type: BooleanLiteral, value: {value: true}}}}, {type: NamedArgument, value: {name: b, expression: {type: BooleanLiteral, value: {value: false}}}}]}, String // ints: [11, 12], List // nums: [13.0, 14], List // doubles: [15.0, 16], List // strings: [17, eighteen], List - // objects: [19, {type: {type: NamedTypeAnnotation, value: {reference: {type: ClassReference, value: {}}, typeArguments: []}}, constructor: {type: ConstructorReference, value: {}}, arguments: [{type: NamedArgument, value: {name: a, expression: {type: BooleanLiteral, value: {text: true}}}}, {type: NamedArgument, value: {name: b, expression: {type: BooleanLiteral, value: {text: false}}}}]}], List + // objects: [19, {type: {type: NamedTypeAnnotation, value: {reference: {type: ClassReference, value: {name: Bar}}, typeArguments: []}}, constructor: {type: ConstructorReference, value: {name: new}}, arguments: [{type: NamedArgument, value: {name: a, expression: {type: BooleanLiteral, value: {value: true}}}}, {type: NamedArgument, value: {name: b, expression: {type: BooleanLiteral, value: {value: false}}}}]}], List } diff --git a/goldens/foo/lib/metadata.analyzer.json b/goldens/foo/lib/metadata.analyzer.json index a1a4ec6c..71d9be48 100644 --- a/goldens/foo/lib/metadata.analyzer.json +++ b/goldens/foo/lib/metadata.analyzer.json @@ -28,14 +28,18 @@ "value": { "reference": { "type": "ClassReference", - "value": {} + "value": { + "name": "QueryClass" + } }, "typeArguments": [] } }, "constructor": { "type": "ConstructorReference", - "value": {} + "value": { + "name": "new" + } }, "arguments": [] } @@ -50,14 +54,18 @@ "value": { "reference": { "type": "ClassReference", - "value": {} + "value": { + "name": "Annotation" + } }, "typeArguments": [] } }, "constructor": { "type": "ConstructorReference", - "value": {} + "value": { + "name": "new" + } }, "arguments": [ { @@ -67,7 +75,7 @@ "expression": { "type": "BooleanLiteral", "value": { - "text": "true" + "value": true } } } @@ -79,7 +87,8 @@ "expression": { "type": "IntegerLiteral", "value": { - "text": "23" + "text": "23", + "value": 23 } } } diff --git a/pkgs/_analyzer_cfe_macros/lib/metadata_converter.dart b/pkgs/_analyzer_cfe_macros/lib/metadata_converter.dart index 4c8a13e6..e203f6b9 100644 --- a/pkgs/_analyzer_cfe_macros/lib/metadata_converter.dart +++ b/pkgs/_analyzer_cfe_macros/lib/metadata_converter.dart @@ -186,6 +186,9 @@ dart_model.Reference? convertToReference(Object? object) => switch (object) { front_end.EnumReference o => dart_model.Reference.enumReference( convert(o)!, ), + front_end.MixinReference o => dart_model.Reference.mixinReference( + convert(o)!, + ), front_end.FunctionTypeParameterReference o => dart_model .Reference.functionTypeParameterReference( convert(o)!, @@ -250,6 +253,8 @@ T? convert(Object? object) => switch (object) { front_end.BinaryOperator o => o.name as T, front_end.LogicalOperator o => o.name as T, front_end.UnaryOperator o => o.name as T, + front_end.AdjacentStringLiterals o => + dart_model.AdjacentStringLiterals(expressions: convert(o.expressions)) as T, front_end.AsExpression o => dart_model.AsExpression( expression: convertToExpression(o.expression), @@ -264,8 +269,9 @@ T? convert(Object? object) => switch (object) { ) as T, front_end.BooleanLiteral o => - dart_model.BooleanLiteral(text: convert(o.value.toString())) as T, - front_end.ClassReference o => dart_model.ClassReference() as T, + dart_model.BooleanLiteral(value: convert(o.value)) as T, + front_end.ClassReference o => + dart_model.ClassReference(name: convert(o.name)) as T, front_end.ConditionalExpression o => dart_model.ConditionalExpression( condition: convertToExpression(o.condition), @@ -280,7 +286,8 @@ T? convert(Object? object) => switch (object) { arguments: convert(o.arguments), ) as T, - front_end.ConstructorReference o => dart_model.ConstructorReference() as T, + front_end.ConstructorReference o => + dart_model.ConstructorReference(name: convert(o.name)) as T, front_end.ConstructorTearOff o => dart_model.ConstructorTearOff( type: convert(o.type), @@ -288,11 +295,13 @@ T? convert(Object? object) => switch (object) { ) as T, front_end.DoubleLiteral o => - dart_model.DoubleLiteral(text: convert(o.text)) as T, + dart_model.DoubleLiteral(text: convert(o.text), value: convert(o.value)) + as T, front_end.DynamicTypeAnnotation o => dart_model.DynamicTypeAnnotation(reference: convertToReference(o.reference)) as T, - front_end.EnumReference o => dart_model.EnumReference() as T, + front_end.EnumReference o => + dart_model.EnumReference(name: convert(o.name)) as T, front_end.EqualityExpression o => dart_model.EqualityExpression( left: convertToExpression(o.left), @@ -306,13 +315,16 @@ T? convert(Object? object) => switch (object) { isNullAware: convert(o.isNullAware), ) as T, - front_end.ExtensionReference o => dart_model.ExtensionReference() as T, + front_end.ExtensionReference o => + dart_model.ExtensionReference(name: convert(o.name)) as T, front_end.ExtensionTypeReference o => - dart_model.ExtensionTypeReference() as T, - front_end.FieldReference o => dart_model.FieldReference() as T, + dart_model.ExtensionTypeReference(name: convert(o.name)) as T, + front_end.FieldReference o => + dart_model.FieldReference(name: convert(o.name)) as T, front_end.FormalParameter o => dart_model.FormalParameter() as T, front_end.FormalParameterGroup o => dart_model.FormalParameterGroup() as T, - front_end.FunctionReference o => dart_model.FunctionReference() as T, + front_end.FunctionReference o => + dart_model.FunctionReference(name: convert(o.name)) as T, front_end.FunctionTearOff o => dart_model.FunctionTearOff(reference: convert(o.reference)) as T, front_end.FunctionTypeAnnotation o => @@ -324,7 +336,7 @@ T? convert(Object? object) => switch (object) { as T, front_end.FunctionTypeParameter o => dart_model.FunctionTypeParameter() as T, front_end.FunctionTypeParameterReference o => - dart_model.FunctionTypeParameterReference() as T, + dart_model.FunctionTypeParameterReference(name: convert(o.name)) as T, front_end.FunctionTypeParameterType o => dart_model.FunctionTypeParameterType( functionTypeParameter: convert(o.functionTypeParameter), @@ -357,7 +369,8 @@ T? convert(Object? object) => switch (object) { ) as T, front_end.IntegerLiteral o => - dart_model.IntegerLiteral(text: convert(o.text)) as T, + dart_model.IntegerLiteral(text: convert(o.text), value: convert(o.value)) + as T, front_end.InterpolationPart o => dart_model.InterpolationPart(expression: convertToExpression(o.expression)) as T, @@ -399,6 +412,8 @@ T? convert(Object? object) => switch (object) { arguments: convert(o.arguments), ) as T, + front_end.MixinReference o => + dart_model.MixinReference(name: convert(o.name)) as T, front_end.NamedArgument o => dart_model.NamedArgument( name: convert(o.name), @@ -479,14 +494,13 @@ T? convert(Object? object) => switch (object) { arguments: convert(o.arguments), ) as T, - front_end.AdjacentStringLiterals o => - dart_model.AdjacentStringLiterals(expressions: convert(o.expressions)) as T, front_end.StringLiteral o => dart_model.StringLiteral(parts: convert(o.parts)) as T, front_end.StringPart o => dart_model.StringPart(text: convert(o.text)) as T, front_end.SymbolLiteral o => dart_model.SymbolLiteral(parts: convert(o.parts)) as T, - front_end.TypedefReference o => dart_model.TypedefReference() as T, + front_end.TypedefReference o => + dart_model.TypedefReference(name: convert(o.name)) as T, front_end.TypeLiteral o => dart_model.TypeLiteral(typeAnnotation: convert(o.typeAnnotation)) as T, front_end.TypeReference o => dart_model.TypeReference() as T, diff --git a/pkgs/_analyzer_cfe_macros/test/metadata_converter_test.dart b/pkgs/_analyzer_cfe_macros/test/metadata_converter_test.dart index 00237200..71539279 100644 --- a/pkgs/_analyzer_cfe_macros/test/metadata_converter_test.dart +++ b/pkgs/_analyzer_cfe_macros/test/metadata_converter_test.dart @@ -20,7 +20,7 @@ void main() { expect(convert(invocation), { 'receiver': { 'type': 'DoubleLiteral', - 'value': {'text': '1.23'}, + 'value': {'text': '1.23', 'value': 1.23}, }, 'name': 'round', 'typeArguments': [], @@ -40,12 +40,12 @@ void main() { expect(convert(expression), { 'left': { 'type': 'DoubleLiteral', - 'value': {'text': '1.23'}, + 'value': {'text': '1.23', 'value': 1.23}, }, 'operator': 'minus', 'right': { 'type': 'DoubleLiteral', - 'value': {'text': '1.24'}, + 'value': {'text': '1.24', 'value': 1.24}, }, }); }); @@ -63,7 +63,7 @@ void main() { expect(convert(invocation), { 'receiver': { 'type': 'DoubleLiteral', - 'value': {'text': '1.23'}, + 'value': {'text': '1.23', 'value': 1.23}, }, 'name': 'round', 'typeArguments': [], diff --git a/pkgs/_test_macros/lib/built_value.dart b/pkgs/_test_macros/lib/built_value.dart index f928f427..1784f698 100644 --- a/pkgs/_test_macros/lib/built_value.dart +++ b/pkgs/_test_macros/lib/built_value.dart @@ -183,8 +183,20 @@ class BuiltValueBuilderImplementation implements ClassDeclarationsMacro { TypeAnnotationType.namedTypeAnnotation) { continue; } - // TODO(davidmorgan): macro metadata model doesn't actually have the - // name yet, just assume any constructor annotation is `BuiltValue`. + + final namedTypeAnnotation = + constructorInvocation.type.asNamedTypeAnnotation; + if (namedTypeAnnotation.reference.type != + ReferenceType.classReference) { + continue; + } + + final constructorReference = + namedTypeAnnotation.reference.asClassReference; + if (constructorReference.name != 'BuiltValue') { + continue; + } + nestedBuilderTypes.add(qualifiedName.asString); } } diff --git a/pkgs/_test_macros/lib/literal_params.dart b/pkgs/_test_macros/lib/literal_params.dart index 9bbeae20..d12c7f94 100644 --- a/pkgs/_test_macros/lib/literal_params.dart +++ b/pkgs/_test_macros/lib/literal_params.dart @@ -93,9 +93,9 @@ class LiteralParamsImplementation implements ClassDeclarationsMacro { extension ExpressionExtension on Expression { Object get evaluate => switch (type) { ExpressionType.integerLiteral => int.parse(asIntegerLiteral.text), - ExpressionType.doubleLiteral => double.parse(asDoubleLiteral.text), + ExpressionType.doubleLiteral => asDoubleLiteral.value, ExpressionType.stringLiteral => asStringLiteral.evaluate, - ExpressionType.booleanLiteral => bool.parse(asBooleanLiteral.text), + ExpressionType.booleanLiteral => asBooleanLiteral.value, ExpressionType.listLiteral => asListLiteral.elements.map((e) => e.evaluate).toList(), // TODO(davidmorgan): need the type name to do something useful here, diff --git a/pkgs/dart_model/lib/src/json_buffer/json_buffer_builder.dart b/pkgs/dart_model/lib/src/json_buffer/json_buffer_builder.dart index 629db4ec..01e2cc91 100644 --- a/pkgs/dart_model/lib/src/json_buffer/json_buffer_builder.dart +++ b/pkgs/dart_model/lib/src/json_buffer/json_buffer_builder.dart @@ -104,6 +104,8 @@ class JsonBufferBuilder { _buildDigest(pointer, byteSink); case Type.uint32: byteSink.addSlice(_buffer, pointer, pointer + 4, false); + case Type.float64: + byteSink.addSlice(_buffer, pointer, pointer + 8, false); case Type.boolean: // We use [1] and [2] because [0] is `null`. byteSink.add(_readBoolean(pointer) ? const [2] : const [1]); @@ -151,6 +153,8 @@ class JsonBufferBuilder { return _readPointer(pointer); case Type.uint32: return _readUint32(pointer); + case Type.float64: + return _readFloat64(pointer); case Type.boolean: return _readBoolean(pointer); case Type.anyPointer: @@ -206,6 +210,9 @@ class JsonBufferBuilder { case Type.uint32: _writeUint32(pointer, value as int); + case Type.float64: + _writeFloat64(pointer, value as double); + case Type.boolean: _writeBoolean(pointer, value as bool); @@ -325,6 +332,24 @@ class JsonBufferBuilder { (_buffer[pointer + 2] << 16) + (_buffer[pointer + 3] << 24); + /// Writes [value] at [pointer]. + void _writeFloat64(_Pointer pointer, double value) { + _explanations?.push('_writeFloat64 $value'); + __writeFloat64(pointer, value); + _explanations?.pop(); + } + + void __writeFloat64(_Pointer pointer, double value) { + final byteData = ByteData(8); + byteData.setFloat64(0, value, Endian.big); + _setRange(pointer, pointer + 8, byteData.buffer.asUint8List()); + } + + /// Reads the float64 at [_Pointer]. + double _readFloat64(_Pointer pointer) { + return ByteData.sublistView(_buffer).getFloat64(pointer, Endian.big); + } + /// Writes [boolean] at [pointer]. void _writeBoolean(_Pointer pointer, bool boolean) { _explanations?.push('_writeBoolean $boolean'); diff --git a/pkgs/dart_model/lib/src/json_buffer/type.dart b/pkgs/dart_model/lib/src/json_buffer/type.dart index 3ada111c..5472ecb9 100644 --- a/pkgs/dart_model/lib/src/json_buffer/type.dart +++ b/pkgs/dart_model/lib/src/json_buffer/type.dart @@ -27,6 +27,7 @@ enum Type { type(false), pointer(true), uint32(false), + float64(false), boolean(false), anyPointer(false), // This is actually a type followed by a pointer. stringPointer(true), @@ -52,6 +53,8 @@ enum Type { return Type.stringPointer; case int(): return Type.uint32; + case double(): + return Type.float64; case bool(): return Type.boolean; case Type(): @@ -92,6 +95,8 @@ enum Type { return 4; case anyPointer: return 5; + case float64: + return 8; } } } diff --git a/pkgs/dart_model/lib/src/macro_metadata.g.dart b/pkgs/dart_model/lib/src/macro_metadata.g.dart index 09108589..c8b386b7 100644 --- a/pkgs/dart_model/lib/src/macro_metadata.g.dart +++ b/pkgs/dart_model/lib/src/macro_metadata.g.dart @@ -678,6 +678,7 @@ enum ReferenceType { extensionReference, extensionTypeReference, enumReference, + mixinReference, functionTypeParameterReference; bool get isKnown => this != _unknown; @@ -726,6 +727,10 @@ extension type Reference.fromJson(Map node) implements Object { Reference.fromJson( Scope.createMap(_schema, 'EnumReference', enumReference), ); + static Reference mixinReference(MixinReference mixinReference) => + Reference.fromJson( + Scope.createMap(_schema, 'MixinReference', mixinReference), + ); static Reference functionTypeParameterReference( FunctionTypeParameterReference functionTypeParameterReference, ) => Reference.fromJson( @@ -755,6 +760,8 @@ extension type Reference.fromJson(Map node) implements Object { return ReferenceType.extensionTypeReference; case 'EnumReference': return ReferenceType.enumReference; + case 'MixinReference': + return ReferenceType.mixinReference; case 'FunctionTypeParameterReference': return ReferenceType.functionTypeParameterReference; default: @@ -827,6 +834,13 @@ extension type Reference.fromJson(Map node) implements Object { return EnumReference.fromJson(node['value'] as Map); } + MixinReference get asMixinReference { + if (node['type'] != 'MixinReference') { + throw StateError('Not a MixinReference.'); + } + return MixinReference.fromJson(node['value'] as Map); + } + FunctionTypeParameterReference get asFunctionTypeParameterReference { if (node['type'] != 'FunctionTypeParameterReference') { throw StateError('Not a FunctionTypeParameterReference.'); @@ -1112,6 +1126,19 @@ extension type const UnaryOperator.fromJson(String string) implements Object { static const UnaryOperator tilde = UnaryOperator.fromJson('tilde'); } +/// +extension type AdjacentStringLiterals.fromJson(Map node) + implements Object { + static final TypedMapSchema _schema = TypedMapSchema({ + 'expressions': Type.closedListPointer, + }); + AdjacentStringLiterals({List? expressions}) + : this.fromJson(Scope.createMap(_schema, expressions)); + + /// + List get expressions => (node['expressions'] as List).cast(); +} + /// extension type AsExpression.fromJson(Map node) implements Object { @@ -1156,21 +1183,25 @@ extension type BinaryExpression.fromJson(Map node) /// extension type BooleanLiteral.fromJson(Map node) implements Object { - static final TypedMapSchema _schema = TypedMapSchema({ - 'text': Type.stringPointer, - }); - BooleanLiteral({String? text}) - : this.fromJson(Scope.createMap(_schema, text)); + static final TypedMapSchema _schema = TypedMapSchema({'value': Type.boolean}); + BooleanLiteral({bool? value}) + : this.fromJson(Scope.createMap(_schema, value)); /// - String get text => node['text'] as String; + bool get value => node['value'] as bool; } /// extension type ClassReference.fromJson(Map node) implements Object { - static final TypedMapSchema _schema = TypedMapSchema({}); - ClassReference() : this.fromJson(Scope.createMap(_schema)); + static final TypedMapSchema _schema = TypedMapSchema({ + 'name': Type.stringPointer, + }); + ClassReference({String? name}) + : this.fromJson(Scope.createMap(_schema, name)); + + /// + String get name => node['name'] as String; } /// @@ -1224,8 +1255,14 @@ extension type ConstructorInvocation.fromJson(Map node) /// extension type ConstructorReference.fromJson(Map node) implements Object { - static final TypedMapSchema _schema = TypedMapSchema({}); - ConstructorReference() : this.fromJson(Scope.createMap(_schema)); + static final TypedMapSchema _schema = TypedMapSchema({ + 'name': Type.stringPointer, + }); + ConstructorReference({String? name}) + : this.fromJson(Scope.createMap(_schema, name)); + + /// + String get name => node['name'] as String; } /// @@ -1251,11 +1288,16 @@ extension type DoubleLiteral.fromJson(Map node) implements Object { static final TypedMapSchema _schema = TypedMapSchema({ 'text': Type.stringPointer, + 'value': Type.float64, }); - DoubleLiteral({String? text}) : this.fromJson(Scope.createMap(_schema, text)); + DoubleLiteral({String? text, double? value}) + : this.fromJson(Scope.createMap(_schema, text, value)); /// String get text => node['text'] as String; + + /// + double get value => node['value'] as double; } /// @@ -1274,8 +1316,13 @@ extension type DynamicTypeAnnotation.fromJson(Map node) /// extension type EnumReference.fromJson(Map node) implements Object { - static final TypedMapSchema _schema = TypedMapSchema({}); - EnumReference() : this.fromJson(Scope.createMap(_schema)); + static final TypedMapSchema _schema = TypedMapSchema({ + 'name': Type.stringPointer, + }); + EnumReference({String? name}) : this.fromJson(Scope.createMap(_schema, name)); + + /// + String get name => node['name'] as String; } /// @@ -1319,22 +1366,40 @@ extension type ExpressionElement.fromJson(Map node) /// extension type ExtensionReference.fromJson(Map node) implements Object { - static final TypedMapSchema _schema = TypedMapSchema({}); - ExtensionReference() : this.fromJson(Scope.createMap(_schema)); + static final TypedMapSchema _schema = TypedMapSchema({ + 'name': Type.stringPointer, + }); + ExtensionReference({String? name}) + : this.fromJson(Scope.createMap(_schema, name)); + + /// + String get name => node['name'] as String; } /// extension type ExtensionTypeReference.fromJson(Map node) implements Object { - static final TypedMapSchema _schema = TypedMapSchema({}); - ExtensionTypeReference() : this.fromJson(Scope.createMap(_schema)); + static final TypedMapSchema _schema = TypedMapSchema({ + 'name': Type.stringPointer, + }); + ExtensionTypeReference({String? name}) + : this.fromJson(Scope.createMap(_schema, name)); + + /// + String get name => node['name'] as String; } /// extension type FieldReference.fromJson(Map node) implements Object { - static final TypedMapSchema _schema = TypedMapSchema({}); - FieldReference() : this.fromJson(Scope.createMap(_schema)); + static final TypedMapSchema _schema = TypedMapSchema({ + 'name': Type.stringPointer, + }); + FieldReference({String? name}) + : this.fromJson(Scope.createMap(_schema, name)); + + /// + String get name => node['name'] as String; } /// @@ -1354,8 +1419,14 @@ extension type FormalParameterGroup.fromJson(Map node) /// extension type FunctionReference.fromJson(Map node) implements Object { - static final TypedMapSchema _schema = TypedMapSchema({}); - FunctionReference() : this.fromJson(Scope.createMap(_schema)); + static final TypedMapSchema _schema = TypedMapSchema({ + 'name': Type.stringPointer, + }); + FunctionReference({String? name}) + : this.fromJson(Scope.createMap(_schema, name)); + + /// + String get name => node['name'] as String; } /// @@ -1411,8 +1482,14 @@ extension type FunctionTypeParameterReference.fromJson( Map node ) implements Object { - static final TypedMapSchema _schema = TypedMapSchema({}); - FunctionTypeParameterReference() : this.fromJson(Scope.createMap(_schema)); + static final TypedMapSchema _schema = TypedMapSchema({ + 'name': Type.stringPointer, + }); + FunctionTypeParameterReference({String? name}) + : this.fromJson(Scope.createMap(_schema, name)); + + /// + String get name => node['name'] as String; } /// @@ -1515,12 +1592,16 @@ extension type IntegerLiteral.fromJson(Map node) implements Object { static final TypedMapSchema _schema = TypedMapSchema({ 'text': Type.stringPointer, + 'value': Type.uint32, }); - IntegerLiteral({String? text}) - : this.fromJson(Scope.createMap(_schema, text)); + IntegerLiteral({String? text, int? value}) + : this.fromJson(Scope.createMap(_schema, text, value)); /// String get text => node['text'] as String; + + /// + int? get value => node['value'] as int?; } /// @@ -1675,6 +1756,19 @@ extension type MethodInvocation.fromJson(Map node) List get arguments => (node['arguments'] as List).cast(); } +/// +extension type MixinReference.fromJson(Map node) + implements Object { + static final TypedMapSchema _schema = TypedMapSchema({ + 'name': Type.stringPointer, + }); + MixinReference({String? name}) + : this.fromJson(Scope.createMap(_schema, name)); + + /// + String get name => node['name'] as String; +} + /// extension type NamedArgument.fromJson(Map node) implements Object { @@ -1956,19 +2050,6 @@ extension type StaticInvocation.fromJson(Map node) List get arguments => (node['arguments'] as List).cast(); } -/// -extension type AdjacentStringLiterals.fromJson(Map node) - implements Object { - static final TypedMapSchema _schema = TypedMapSchema({ - 'expressions': Type.closedListPointer, - }); - AdjacentStringLiterals({List? expressions}) - : this.fromJson(Scope.createMap(_schema, expressions)); - - /// - List get expressions => (node['expressions'] as List).cast(); -} - /// extension type StringLiteral.fromJson(Map node) implements Object { @@ -2010,8 +2091,14 @@ extension type SymbolLiteral.fromJson(Map node) /// extension type TypedefReference.fromJson(Map node) implements Object { - static final TypedMapSchema _schema = TypedMapSchema({}); - TypedefReference() : this.fromJson(Scope.createMap(_schema)); + static final TypedMapSchema _schema = TypedMapSchema({ + 'name': Type.stringPointer, + }); + TypedefReference({String? name}) + : this.fromJson(Scope.createMap(_schema, name)); + + /// + String get name => node['name'] as String; } /// diff --git a/schemas/macro_metadata.schema.json b/schemas/macro_metadata.schema.json index 5547e426..c7ee70d2 100644 --- a/schemas/macro_metadata.schema.json +++ b/schemas/macro_metadata.schema.json @@ -229,6 +229,9 @@ { "$ref": "#/$defs/EnumReference" }, + { + "$ref": "#/$defs/MixinReference" + }, { "$ref": "#/$defs/FunctionTypeParameterReference" } @@ -319,6 +322,19 @@ "type": "string", "description": "" }, + "AdjacentStringLiterals": { + "type": "object", + "description": "", + "properties": { + "expressions": { + "type": "array", + "description": "", + "items": { + "$ref": "#/$defs/Expression" + } + } + } + }, "AsExpression": { "type": "object", "description": "", @@ -355,8 +371,8 @@ "type": "object", "description": "", "properties": { - "text": { - "type": "string", + "value": { + "type": "boolean", "description": "" } } @@ -364,7 +380,12 @@ "ClassReference": { "type": "object", "description": "", - "properties": {} + "properties": { + "name": { + "type": "string", + "description": "" + } + } }, "ConditionalExpression": { "type": "object", @@ -408,7 +429,12 @@ "ConstructorReference": { "type": "object", "description": "", - "properties": {} + "properties": { + "name": { + "type": "string", + "description": "" + } + } }, "ConstructorTearOff": { "type": "object", @@ -431,6 +457,10 @@ "text": { "type": "string", "description": "" + }, + "value": { + "type": "number", + "description": "" } } }, @@ -447,7 +477,12 @@ "EnumReference": { "type": "object", "description": "", - "properties": {} + "properties": { + "name": { + "type": "string", + "description": "" + } + } }, "EqualityExpression": { "type": "object", @@ -484,17 +519,32 @@ "ExtensionReference": { "type": "object", "description": "", - "properties": {} + "properties": { + "name": { + "type": "string", + "description": "" + } + } }, "ExtensionTypeReference": { "type": "object", "description": "", - "properties": {} + "properties": { + "name": { + "type": "string", + "description": "" + } + } }, "FieldReference": { "type": "object", "description": "", - "properties": {} + "properties": { + "name": { + "type": "string", + "description": "" + } + } }, "FormalParameter": { "type": "object", @@ -509,7 +559,12 @@ "FunctionReference": { "type": "object", "description": "", - "properties": {} + "properties": { + "name": { + "type": "string", + "description": "" + } + } }, "FunctionTearOff": { "type": "object", @@ -553,7 +608,12 @@ "FunctionTypeParameterReference": { "type": "object", "description": "", - "properties": {} + "properties": { + "name": { + "type": "string", + "description": "" + } + } }, "FunctionTypeParameterType": { "type": "object", @@ -645,6 +705,10 @@ "text": { "type": "string", "description": "" + }, + "value": { + "type": "integer", + "description": "" } } }, @@ -774,6 +838,16 @@ } } }, + "MixinReference": { + "type": "object", + "description": "", + "properties": { + "name": { + "type": "string", + "description": "" + } + } + }, "NamedArgument": { "type": "object", "description": "", @@ -1013,19 +1087,6 @@ } } }, - "AdjacentStringLiterals": { - "type": "object", - "description": "", - "properties": { - "expressions": { - "type": "array", - "description": "", - "items": { - "$ref": "#/$defs/Expression" - } - } - } - }, "StringLiteral": { "type": "object", "description": "", @@ -1065,7 +1126,12 @@ "TypedefReference": { "type": "object", "description": "", - "properties": {} + "properties": { + "name": { + "type": "string", + "description": "" + } + } }, "TypeLiteral": { "type": "object", diff --git a/tool/dart_model_generator/lib/generate_dart_model.dart b/tool/dart_model_generator/lib/generate_dart_model.dart index 6839b178..0077eccd 100644 --- a/tool/dart_model_generator/lib/generate_dart_model.dart +++ b/tool/dart_model_generator/lib/generate_dart_model.dart @@ -414,6 +414,8 @@ class TypeReference { return 'Type.boolean'; } else if (name == 'int') { return 'Type.uint32'; + } else if (name == 'double') { + return 'Type.float64'; } else { final representationType = context.lookupDefinition(name).representationTypeName; @@ -459,6 +461,11 @@ class TypeReference { 'type': 'integer', if (description != null) 'description': description, }; + } else if (name == 'double') { + return { + 'type': 'number', + if (description != null) 'description': description, + }; } // Not a built-in type, look up a user-defined type. This throws if there // is no such type defined. diff --git a/tool/dart_model_generator/lib/macro_metadata_definitions.dart b/tool/dart_model_generator/lib/macro_metadata_definitions.dart index 488406c0..b26a56ae 100644 --- a/tool/dart_model_generator/lib/macro_metadata_definitions.dart +++ b/tool/dart_model_generator/lib/macro_metadata_definitions.dart @@ -90,6 +90,7 @@ final definitions = [ 'ExtensionReference', 'ExtensionTypeReference', 'EnumReference', + 'MixinReference', 'FunctionTypeParameterReference', ], properties: [], @@ -146,6 +147,14 @@ final definitions = [ description: '', values: ['minus', 'bang', 'tilde'], ), + Definition.clazz( + 'AdjacentStringLiterals', + createInBuffer: true, + description: '', + properties: [ + Property('expressions', type: 'List', description: ''), + ], + ), Definition.clazz( 'AsExpression', createInBuffer: true, @@ -169,13 +178,13 @@ final definitions = [ 'BooleanLiteral', createInBuffer: true, description: '', - properties: [Property('text', type: 'String', description: '')], + properties: [Property('value', type: 'bool', description: '')], ), Definition.clazz( 'ClassReference', createInBuffer: true, description: '', - properties: [], + properties: [Property('name', type: 'String', description: '')], ), Definition.clazz( 'ConditionalExpression', @@ -201,7 +210,7 @@ final definitions = [ 'ConstructorReference', createInBuffer: true, description: '', - properties: [], + properties: [Property('name', type: 'String', description: '')], ), Definition.clazz( 'ConstructorTearOff', @@ -216,7 +225,10 @@ final definitions = [ 'DoubleLiteral', createInBuffer: true, description: '', - properties: [Property('text', type: 'String', description: '')], + properties: [ + Property('text', type: 'String', description: ''), + Property('value', type: 'double', description: ''), + ], ), Definition.clazz( 'DynamicTypeAnnotation', @@ -228,7 +240,7 @@ final definitions = [ 'EnumReference', createInBuffer: true, description: '', - properties: [], + properties: [Property('name', type: 'String', description: '')], ), Definition.clazz( 'EqualityExpression', @@ -253,19 +265,19 @@ final definitions = [ 'ExtensionReference', createInBuffer: true, description: '', - properties: [], + properties: [Property('name', type: 'String', description: '')], ), Definition.clazz( 'ExtensionTypeReference', createInBuffer: true, description: '', - properties: [], + properties: [Property('name', type: 'String', description: '')], ), Definition.clazz( 'FieldReference', createInBuffer: true, description: '', - properties: [], + properties: [Property('name', type: 'String', description: '')], ), Definition.clazz( 'FormalParameter', @@ -283,7 +295,7 @@ final definitions = [ 'FunctionReference', createInBuffer: true, description: '', - properties: [], + properties: [Property('name', type: 'String', description: '')], ), Definition.clazz( 'FunctionTearOff', @@ -326,7 +338,7 @@ final definitions = [ 'FunctionTypeParameterReference', createInBuffer: true, description: '', - properties: [], + properties: [Property('name', type: 'String', description: '')], ), Definition.clazz( 'FunctionTypeParameterType', @@ -382,7 +394,10 @@ final definitions = [ 'IntegerLiteral', createInBuffer: true, description: '', - properties: [Property('text', type: 'String', description: '')], + properties: [ + Property('text', type: 'String', description: ''), + Property('value', type: 'int', description: '', nullable: true), + ], ), Definition.clazz( 'InterpolationPart', @@ -453,6 +468,12 @@ final definitions = [ Property('arguments', type: 'List', description: ''), ], ), + Definition.clazz( + 'MixinReference', + createInBuffer: true, + description: '', + properties: [Property('name', type: 'String', description: '')], + ), Definition.clazz( 'NamedArgument', createInBuffer: true, @@ -601,14 +622,6 @@ final definitions = [ Property('arguments', type: 'List', description: ''), ], ), - Definition.clazz( - 'AdjacentStringLiterals', - createInBuffer: true, - description: '', - properties: [ - Property('expressions', type: 'List', description: ''), - ], - ), Definition.clazz( 'StringLiteral', createInBuffer: true, @@ -633,7 +646,7 @@ final definitions = [ 'TypedefReference', createInBuffer: true, description: '', - properties: [], + properties: [Property('name', type: 'String', description: '')], ), Definition.clazz( 'TypeLiteral', diff --git a/tool/generate_converter b/tool/generate_converter index 38974b6a..1825bf45 100755 --- a/tool/generate_converter +++ b/tool/generate_converter @@ -7,7 +7,7 @@ # # mkdir /tmp/inputs # cp ~/git/dart-sdk/sdk/pkg/_fe_analyzer_shared/lib/src/metadata/* /tmp/inputs -# rm /tmp/inputs/proto.dart /tmp/inputs/parser.dart /tmp/inputs/scope.dart +# rm /tmp/inputs/proto.dart /tmp/inputs/parser.dart /tmp/inputs/scope.dart /tmp/inputs/evaluate.dart # tool/generate_converter /tmp/inputs path="$1" @@ -39,7 +39,7 @@ echo "T? convert(Object? object) => switch (object) {" # Enums. for type in $(echo "$source" \ - | egrep '^enum [A-Z]' \ + | grep -E '^enum [A-Z]' \ | sed -e 's#enum ##' \ | sed -e 's# .*##' \ | sort); do @@ -48,7 +48,7 @@ done # Classes. for type in $(echo "$source" \ - | egrep '^[a-z ]*class ' \ + | grep -E '^[a-z ]*class ' \ | grep -v 'sealed' \ | sed -e 's#abstract ##' \ | sed -e 's#class ##' \ @@ -65,7 +65,18 @@ for type in $(echo "$source" \ continue fi field_type=$(echo $line | sed -e 's# final ##' | sed -e 's# .*##') - if echo "$field_type" | egrep -q '^(Argument|Element|Expression|RecordField|Reference|StringLiteralPart)$'; then + if echo "$field_type" | grep -E -q '^(Argument|Element|Expression|RecordField|Reference|StringLiteralPart)$'; then + echo " $field_name: convertTo$field_type(o.$field_name)," + else + echo " $field_name: convert(o.$field_name)," + fi + elif echo "$line" | grep -q ' get '; then + field_name=$(echo $line | sed -e 's#.* get ##' | sed -e 's#;##') + if test "$field_name" == "unresolved"; then + continue + fi + field_type=$(echo $line | sed -e 's# ##' | sed -e 's# get .*##') + if echo "$field_type" | grep -E -q '^(Argument|Element|Expression|RecordField|Reference|StringLiteralPart)$'; then echo " $field_name: convertTo$field_type(o.$field_name)," else echo " $field_name: convert(o.$field_name)," diff --git a/tool/generate_definitions b/tool/generate_definitions index 78f59e57..1e1980d7 100755 --- a/tool/generate_definitions +++ b/tool/generate_definitions @@ -7,7 +7,7 @@ # # mkdir /tmp/inputs # cp ~/git/dart-sdk/sdk/pkg/_fe_analyzer_shared/lib/src/metadata/* /tmp/inputs -# rm /tmp/inputs/proto.dart /tmp/inputs/parser.dart /tmp/inputs/scope.dart +# rm /tmp/inputs/proto.dart /tmp/inputs/parser.dart /tmp/inputs/scope.dart /tmp/inputs/evaluate.dart # tool/generate_definitions /tmp/inputs path="$1" @@ -24,6 +24,7 @@ for union in $( | sed -e 's# {##' \ | sort); do echo "Definition.union('$union'," + echo " createInBuffer: true," echo " description: ''," echo " types: [" for type in $(echo "$source" \ @@ -40,7 +41,7 @@ done # Enums. for type in $(echo "$source" \ - | egrep '^enum [A-Z]' \ + | grep -E '^enum [A-Z]' \ | sed -e 's#enum ##' \ | sed -e 's# .*##' \ | sort); do @@ -50,10 +51,10 @@ for type in $(echo "$source" \ for line in $(echo "$source" \ | grep -A1000000 "enum $type " \ | tail -n +2); do - if echo "$line" | grep -q ';'; then + if echo "$line" | grep -q -e ';' -e '}'; then break else - value=$(echo $line | sed -e 's# ##' | sed -e 's#(.*##') + value=$(echo $line | sed -e 's# ##' | sed -e 's#(.*##' | sed -e 's#,##') echo " '$value'," fi done @@ -63,7 +64,7 @@ done # Classes. for type in $(echo "$source" \ - | egrep '^[a-z ]*class ' \ + | grep -E '^[a-z ]*class ' \ | grep -v 'sealed' \ | sed -e 's#abstract ##' \ | sed -e 's#class ##' \ @@ -71,6 +72,7 @@ for type in $(echo "$source" \ | sed -e 's# {##' \ | sort); do echo "Definition.clazz('$type'," + echo " createInBuffer: true," echo " description: ''," echo " properties: [" for line in $(echo "$source" \ @@ -82,7 +84,19 @@ for type in $(echo "$source" \ continue fi field_type=$(echo $line | sed -e 's# final ##' | sed -e 's# .*##') - if echo "$field_type" | fgrep -q '?'; then + if echo "$field_type" | grep -F -q '?'; then + field_type=$(echo "$field_type" | sed -e 's#?##') + echo " Property('$field_name', type: '$field_type', description: '', nullable: true)," + else + echo " Property('$field_name', type: '$field_type', description: '')," + fi + elif echo "$line" | grep -q ' get '; then + field_name=$(echo $line | sed -e 's#.* get ##' | sed -e 's#;##') + if test "$field_name" == "unresolved"; then + continue + fi + field_type=$(echo $line | sed -e 's# ##' | sed -e 's# get .*##') + if echo "$field_type" | grep -F -q '?'; then field_type=$(echo "$field_type" | sed -e 's#?##') echo " Property('$field_name', type: '$field_type', description: '', nullable: true)," else