diff --git a/packages/freezed/CHANGELOG.md b/packages/freezed/CHANGELOG.md index 9468e012..83c0663b 100644 --- a/packages/freezed/CHANGELOG.md +++ b/packages/freezed/CHANGELOG.md @@ -1,3 +1,7 @@ +## Unreleased 3.2.0-dev + +- Use `build` 3.0.0-dev. +- Use `source_gen` 3.0.0-dev. - Support Dart 3.8.0 and analyzer 7.5.9 as a minumum. ## 3.1.0 - 2025-07-02 diff --git a/packages/freezed/lib/src/ast.dart b/packages/freezed/lib/src/ast.dart index 2da192d4..786e7bb9 100644 --- a/packages/freezed/lib/src/ast.dart +++ b/packages/freezed/lib/src/ast.dart @@ -1,6 +1,6 @@ import 'package:analyzer/dart/ast/ast.dart'; import 'package:analyzer/dart/ast/token.dart'; -import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/element2.dart'; extension AstX on AstNode { String? get documentation { @@ -22,16 +22,16 @@ extension AstX on AstNode { extension ClassX on ClassDeclaration { bool get hasCustomToString { - final element = declaredElement!; + final element = declaredFragment!.element; for (final type in [ element, ...element.allSupertypes .where((e) => !e.isDartCoreObject) - .map((e) => e.element), + .map((e) => e.element3), ]) { - for (final method in type.methods) { - if (method.name == 'toString') { + for (final method in type.methods2) { + if (method.name3 == 'toString') { return true; } } @@ -40,56 +40,52 @@ extension ClassX on ClassDeclaration { return false; } - bool get hasSuperEqual => declaredElement!.allSupertypes + bool get hasSuperEqual => declaredFragment!.element.allSupertypes .where((e) => !e.isDartCoreObject) - .map((e) => e.element) + .map((e) => e.element3) .any((e) => e.hasEqual); - bool get hasCustomEquals => declaredElement!.hasEqual; + bool get hasCustomEquals => declaredFragment!.element.hasEqual; - bool get hasSuperHashCode => declaredElement!.allSupertypes + bool get hasSuperHashCode => declaredFragment!.element.allSupertypes .where((e) => !e.isDartCoreObject) - .map((e) => e.element) + .map((e) => e.element3) .any((e) => e.hasHashCode); } -extension on InterfaceElement { - bool get hasEqual => methods.any(((e) => e.isOperator && e.name == '==')); +extension on InterfaceElement2 { + bool get hasEqual => methods2.any(((e) => e.isOperator && e.name3 == '==')); - bool get hasHashCode => - accessors.where((e) => e.isGetter).any((e) => e.name == 'hashCode'); + bool get hasHashCode => getters2.any((e) => e.name3 == 'hashCode'); } extension ConstructorX on ConstructorDeclaration { String get fullName { - // ignore: deprecated_member_use, latest analyzer with enclosingElement3 not available in stable channel - final classElement = declaredElement!.enclosingElement3; + final classElement = declaredFragment!.element.enclosingElement2; - var generics = classElement.typeParameters - .map((e) => '\$${e.name}') + var generics = classElement.typeParameters2 + .map((e) => '\$${e.name3}') .join(', '); if (generics.isNotEmpty) { generics = '<$generics>'; } - // ignore: deprecated_member_use, latest analyzer with enclosingElement3 not available in stable channel - final className = classElement.enclosingElement3.name; + final className = classElement.enclosingElement2.name3; return name == null ? '$className$generics' : '$className$generics.$name'; } String get escapedName { - // ignore: deprecated_member_use, latest analyzer with enclosingElement3 not available in stable channel - final classElement = declaredElement!.enclosingElement3; + final classElement = declaredFragment!.element.enclosingElement2; - var generics = classElement.typeParameters - .map((e) => '\$${e.name}') + var generics = classElement.typeParameters2 + .map((e) => '\$${e.name3}') .join(', '); if (generics.isNotEmpty) { generics = '<$generics>'; } - final escapedElementName = classElement.name.replaceAll(r'$', r'\$'); + final escapedElementName = classElement.name3!.replaceAll(r'$', r'\$'); final escapedConstructorName = name?.lexeme.replaceAll(r'$', r'\$'); return escapedConstructorName == null diff --git a/packages/freezed/lib/src/models.dart b/packages/freezed/lib/src/models.dart index f933e95e..ea1a3195 100644 --- a/packages/freezed/lib/src/models.dart +++ b/packages/freezed/lib/src/models.dart @@ -4,7 +4,7 @@ import 'package:analyzer/dart/ast/ast.dart'; import 'package:analyzer/dart/constant/value.dart'; -import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/element2.dart'; import 'package:analyzer/dart/element/nullability_suffix.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:collection/collection.dart'; @@ -27,7 +27,7 @@ class _Sentinel { const _Sentinel(); } -extension on Element { +extension on Element2 { bool get hasJsonSerializable { return const TypeChecker.fromRuntime( JsonSerializable, @@ -35,9 +35,9 @@ extension on Element { } } -extension on ConstructorElement { +extension on ConstructorElement2 { bool isFallbackUnion(String? fallbackConstructorName) { - final constructorName = isDefaultConstructor(this) ? 'default' : name; + final constructorName = isDefaultConstructor(this) ? 'default' : name3; return constructorName == fallbackConstructorName; } @@ -49,7 +49,7 @@ extension on ConstructorElement { return annotation.getField('value')!.toStringValue()!; } - final constructorName = isDefaultConstructor(this) ? 'default' : name; + final constructorName = isDefaultConstructor(this) ? 'default' : name3!; switch (unionCase) { case null: case FreezedUnionCase.none: @@ -88,12 +88,12 @@ class DeepCloneableProperty { for (final parameterNode in constructorNode.parameters.parameters) { final type = parseTypeSource(parameterNode); - final parameter = parameterNode.declaredElement!; + final parameter = parameterNode.declaredFragment!.element; final parameterType = parameter.type; if (parameterType is! InterfaceType) continue; - final typeElement = parameterType.element; - if (typeElement is! ClassElement) continue; + final typeElement = parameterType.element3; + if (typeElement is! ClassElement2) continue; final freezedAnnotation = freezedType.firstAnnotationOf( typeElement, @@ -111,10 +111,10 @@ class DeepCloneableProperty { if (configs.copyWith == false) continue; yield DeepCloneableProperty( - name: parameter.name, + name: parameter.name3!, type: type, nullable: parameter.type.isNullable, - typeName: typeElement.name, + typeName: typeElement.name3!, genericParameters: GenericsParameterTemplate( (parameter.type as InterfaceType).typeArguments .map((e) => e.getDisplayString()) @@ -196,7 +196,7 @@ class ConstructorDetails { freezedCtors.isNotEmpty) { throw InvalidGenerationSourceError( 'Classes decorated with @freezed can only have a single non-factory constructor.', - element: constructor.declaredElement, + element: constructor.declaredFragment?.element, ); } @@ -216,7 +216,7 @@ but at least one constructor does not have a matching parameter. When specifying fields in non-factory constructor then specifying factory constructors, either: - the parameter should be named - or all constructors in the class should specify that parameter. -''', element: constructor.declaredElement); +''', element: constructor.declaredFragment?.element); } } } @@ -228,7 +228,7 @@ When specifying fields in non-factory constructor then specifying factory constr required String className, }) { for (final parameter in constructor.parameters.parameters) { - final parameterElement = parameter.declaredElement; + final parameterElement = parameter.declaredFragment?.element; if (parameterElement == null) continue; if (parameterElement.type.nullabilitySuffix != @@ -240,7 +240,7 @@ When specifying fields in non-factory constructor then specifying factory constr throw InvalidGenerationSourceError( 'The parameter `${parameter.name}` of `$className$ctorName` is non-nullable but is neither required nor marked with @Default', - element: parameter.declaredElement, + element: parameter.declaredFragment?.element, ); } } @@ -278,7 +278,7 @@ When specifying fields in non-factory constructor then specifying factory constr final excludedProperties = manualConstructor?.parameters.parameters - .map((e) => e.declaredElement!.name) + .map((e) => e.declaredFragment!.element.name3!) .toSet() ?? {}; @@ -303,7 +303,7 @@ When specifying fields in non-factory constructor then specifying factory constr asserts: AssertAnnotation.parseAll(constructor).toList(), isSynthetic: !isEjected, name: constructor.name?.lexeme ?? '', - unionValue: constructor.declaredElement!.unionValue( + unionValue: constructor.declaredFragment!.element.unionValue( configs.annotation.unionValueCase, ), isConst: constructor.constKeyword != null, @@ -313,7 +313,7 @@ When specifying fields in non-factory constructor then specifying factory constr decorators: constructor.metadata .where((element) { final elementSourceUri = - element.element?.declaration?.librarySource?.uri; + element.element2?.baseElement.library2?.uri; final isFreezedAnnotation = elementSourceUri != null && @@ -326,14 +326,17 @@ When specifying fields in non-factory constructor then specifying factory constr .map((e) => e.toSource()) .toList(), withDecorators: WithAnnotation.parseAll( - constructor.declaredElement!, + constructor.declaredFragment!.element, ).toSet().toList(), implementsDecorators: ImplementsAnnotation.parseAll( - constructor.declaredElement!, + constructor.declaredFragment!.element, ).toSet().toList(), - isDefault: isDefaultConstructor(constructor.declaredElement!), - hasJsonSerializable: constructor.declaredElement!.hasJsonSerializable, - isFallback: constructor.declaredElement!.isFallbackUnion( + isDefault: isDefaultConstructor( + constructor.declaredFragment!.element, + ), + hasJsonSerializable: + constructor.declaredFragment!.element.hasJsonSerializable, + isFallback: constructor.declaredFragment!.element.isFallbackUnion( configs.annotation.fallbackUnion, ), deepCloneableProperties: DeepCloneableProperty.parseAll( @@ -353,7 +356,7 @@ When specifying fields in non-factory constructor then specifying factory constr result.none((c) => c.isFallback)) { throw InvalidGenerationSourceError( 'Fallback union was specified but no ${configs.annotation.fallbackUnion} constructor exists.', - element: declaration.declaredElement, + element: declaration.declaredFragment!.element, ); } @@ -416,7 +419,7 @@ class ImplementsAnnotation { ImplementsAnnotation({required this.type}); static Iterable parseAll( - ConstructorElement constructor, + ConstructorElement2 constructor, ) sync* { for (final meta in const TypeChecker.fromRuntime( Implements, @@ -427,7 +430,7 @@ class ImplementsAnnotation { } else { yield ImplementsAnnotation( type: resolveFullTypeStringFrom( - constructor.library, + constructor.library2, (meta.type! as InterfaceType).typeArguments.single, ), ); @@ -442,9 +445,9 @@ class WithAnnotation { WithAnnotation({required this.type}); static Iterable parseAll( - ConstructorElement constructor, + ConstructorElement2 constructor, ) sync* { - for (final metadata in constructor.metadata) { + for (final metadata in constructor.metadata2.annotations) { if (!metadata.isWith) continue; final object = metadata.computeConstantValue()!; @@ -454,7 +457,7 @@ class WithAnnotation { } else { yield WithAnnotation( type: resolveFullTypeStringFrom( - constructor.library, + constructor.library2, (object.type! as InterfaceType).typeArguments.single, ), ); @@ -473,7 +476,7 @@ class AssertAnnotation { ) sync* { for (final meta in const TypeChecker.fromRuntime( Assert, - ).annotationsOf(constructor.declaredElement!)) { + ).annotationsOf(constructor.declaredFragment!.element)) { yield AssertAnnotation( code: meta.getField('eval')!.toStringValue()!, message: meta.getField('message')!.toStringValue(), @@ -542,7 +545,7 @@ class Class { final ClassDeclaration _node; final Set parents = {}; - LibraryElement get library => _node.declaredElement!.library; + LibraryElement2 get library => _node.declaredFragment!.element.library2; static Class _from( ClassDeclaration declaration, @@ -560,7 +563,7 @@ class Class { ); if (constructors.isNotEmpty) { - for (final field in declaration.declaredElement!.fields) { + for (final field in declaration.declaredFragment!.element.fields2) { _assertValidFieldUsage(field, shouldUseExtends: privateCtor != null); } } @@ -573,7 +576,7 @@ class Class { if (!has$ClassMixin) { throw InvalidGenerationSourceError( 'Classes using @freezed must use `with _\$${declaration.name.lexeme.public}`.', - element: declaration.declaredElement, + element: declaration.declaredFragment?.element, node: declaration, ); } @@ -584,7 +587,7 @@ class Class { declaration.withClause!.mixinTypes.length > 1)) { throw InvalidGenerationSourceError( 'Classes using extends/with must define a MyClass._() constructor.', - element: declaration.declaredElement, + element: declaration.declaredFragment?.element, node: declaration.extendsClause ?? declaration.withClause, ); } @@ -621,7 +624,7 @@ To fix, either: - Make `${param.name}` optional - Make sure `this.${param.name}` is accessible from the copyWith method ''', - element: declaration.declaredElement, + element: declaration.declaredFragment?.element, node: declaration, ); } @@ -666,14 +669,14 @@ To fix, either: options: configs, constructors: constructors, concretePropertiesName: [ - for (final p in declaration.declaredElement!.fields) - if (!p.isStatic) p.name, + for (final p in declaration.declaredFragment!.element.fields2) + if (!p.isStatic) p.name3!, ], genericsDefinitionTemplate: GenericsDefinitionTemplate.fromGenericElement( - declaration.declaredElement!.typeParameters, + declaration.declaredFragment!.element.typeParameters2, ), genericsParameterTemplate: GenericsParameterTemplate.fromGenericElement( - declaration.declaredElement!.typeParameters, + declaration.declaredFragment!.element.typeParameters2, ), ); } @@ -686,7 +689,7 @@ To fix, either: }) { final unitsExcludingGeneratedFiles = units .where( - (element) => !element.declaredElement!.source.fullName.endsWith( + (element) => !element.declaredFragment!.source.fullName.endsWith( '.freezed.dart', ), ) @@ -699,7 +702,7 @@ To fix, either: if (declaration is! ClassDeclaration) { throw InvalidGenerationSourceError( '@freezed can only be applied on classes.', - element: declaration.declaredElement, + element: declaration.declaredFragment?.element, ); } @@ -822,9 +825,9 @@ To fix, either: doc: property.$1.documentation, isFinal: property.$1.fields.isFinal, isSynthetic: false, - decorators: switch (property.$1.declaredElement) { - final e? => parseDecorators(e.metadata), - null => [], + decorators: switch (property.$1.declaredFragment?.element) { + final Annotatable e => parseDecorators(e.metadata2.annotations), + _ => [], }, ); } @@ -851,8 +854,10 @@ To fix, either: } } - late final typeSystem = declaration.declaredElement!.library.typeSystem; - late final typeProvider = declaration.declaredElement!.library.typeProvider; + late final typeSystem = + declaration.declaredFragment!.element.library2.typeSystem; + late final typeProvider = + declaration.declaredFragment!.element.library2.typeProvider; fieldLoop: for (final entry in typesMap.entries) { @@ -906,7 +911,7 @@ To fix, either: isFinal = true; typeString = resolveFullTypeStringFrom( - declaration.declaredElement!.library, + declaration.declaredFragment!.element.library2, type, ); } @@ -952,7 +957,7 @@ To fix, either: param: parameter.name, ); - final library = parameter.parameterElement!.library!; + final library = parameter.parameterElement!.library2!; var commonTypeBetweenAllUnionConstructors = parameter.parameterElement!.type; @@ -1049,12 +1054,12 @@ To fix, either: } static void _assertValidFieldUsage( - FieldElement field, { + FieldElement2 field, { required bool shouldUseExtends, }) { if (field.isStatic) return; - if (field.setter != null) { + if (field.setter2 != null) { throw InvalidGenerationSourceError( 'Classes decorated with @freezed cannot have mutable properties', element: field, @@ -1063,9 +1068,9 @@ To fix, either: // The field is a "Type get name => " if (!shouldUseExtends && - field.getter != null && - !field.getter!.isAbstract && - !field.getter!.isSynthetic) { + field.getter2 != null && + !field.getter2!.isAbstract && + !field.getter2!.isSynthetic) { throw InvalidGenerationSourceError( 'Getters require a MyClass._() constructor', element: field, @@ -1116,10 +1121,11 @@ class Library { static Library from(List units) { return Library( hasJson: units.any( - (unit) => unit.declaredElement!.library.importsJsonSerializable, + (unit) => + unit.declaredFragment!.element.library2.importsJsonSerializable, ), hasDiagnostics: units.any( - (unit) => unit.declaredElement!.library.importsDiagnosticable, + (unit) => unit.declaredFragment!.element.library2.importsDiagnosticable, ), ); } @@ -1344,18 +1350,18 @@ extension ClassDeclarationX on ClassDeclaration { } } -extension on LibraryElement { +extension on LibraryElement2 { bool get importsJsonSerializable { return findAllAvailableTopLevelElements().any((element) { - return element.name == 'JsonSerializable' && - (element.library?.isFromPackage('json_annotation') ?? false); + return element.name3 == 'JsonSerializable' && + (element.library2?.isFromPackage('json_annotation') ?? false); }); } bool get importsDiagnosticable { return findAllAvailableTopLevelElements().any((element) { - return element.name == 'DiagnosticableTreeMixin' && - (element.library?.isFromPackage('flutter') ?? false); + return element.name3 == 'DiagnosticableTreeMixin' && + (element.library2?.isFromPackage('flutter') ?? false); }); } } diff --git a/packages/freezed/lib/src/parse_generator.dart b/packages/freezed/lib/src/parse_generator.dart index c35c00e0..db7c315c 100644 --- a/packages/freezed/lib/src/parse_generator.dart +++ b/packages/freezed/lib/src/parse_generator.dart @@ -3,7 +3,7 @@ import 'dart:async'; import 'package:analyzer/dart/analysis/results.dart'; import 'package:analyzer/dart/ast/ast.dart'; import 'package:analyzer/dart/constant/value.dart'; -import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/element2.dart'; import 'package:build/build.dart'; import 'package:collection/collection.dart'; import 'package:source_gen/source_gen.dart'; @@ -20,7 +20,7 @@ abstract class ParserGenerator if (oldLibrary.classes.isEmpty) return ''; final units = await Stream.fromFutures( - oldLibrary.element.units.map( + oldLibrary.element.fragments.map( (e) => buildStep.resolver.astNodeFor(e, resolve: true), ), ).cast().toList(); @@ -30,11 +30,11 @@ abstract class ParserGenerator for (final unit in units) { for (var declaration in unit.declarations) { - final declaredElement = declaration.declaredElement; - if (declaredElement == null) continue; + final declaredFragment = declaration.declaredFragment; + if (declaredFragment == null) continue; final annotation = typeChecker.firstAnnotationOf( - declaredElement, + declaredFragment.element, throwOnUnresolved: false, ); if (annotation == null) continue; @@ -57,7 +57,7 @@ abstract class ParserGenerator @override Stream generateForAnnotatedElement( - Element element, + Element2 element, ConstantReader annotation, BuildStep buildStep, ) async* { @@ -70,11 +70,12 @@ abstract class ParserGenerator if (annotation == null) return; final unit = await element.session!.getResolvedUnit( - element.source!.fullName, + element.firstFragment.libraryFragment!.source.fullName, ); unit as ResolvedUnitResult; final Object? ast = unit.unit.declarations.firstWhereOrNull( - (declaration) => declaration.declaredElement?.name == element.name!, + (declaration) => + declaration.declaredFragment?.element.name3 == element.name3!, ); if (ast == null) { throw InvalidGenerationSourceError('Ast not found', element: element); diff --git a/packages/freezed/lib/src/templates/concrete_template.dart b/packages/freezed/lib/src/templates/concrete_template.dart index 59baa53f..3c5663c0 100644 --- a/packages/freezed/lib/src/templates/concrete_template.dart +++ b/packages/freezed/lib/src/templates/concrete_template.dart @@ -1,5 +1,5 @@ import 'package:analyzer/dart/ast/ast.dart'; -import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/element2.dart'; import 'package:freezed/src/freezed_generator.dart'; import 'package:freezed/src/models.dart'; import 'package:freezed/src/templates/properties.dart'; @@ -513,20 +513,20 @@ int get hashCode => Object.hash(${hashedProperties.join(',')}); '''; } -extension DefaultValue on ParameterElement { +extension DefaultValue on FormalParameterElement { /// Returns the sources of the default value associated with a `@Default`, /// or `null` if no `@Default` are specified. String? get defaultValue { const matcher = TypeChecker.fromRuntime(Default); - for (final meta in metadata) { + for (final meta in metadata2.annotations) { final obj = meta.computeConstantValue()!; if (matcher.isExactlyType(obj.type!)) { final source = meta.toSource(); final res = source.substring('@Default('.length, source.length - 1); var needsConstModifier = - !declaration.type.isDartCoreString && + !baseElement.type.isDartCoreString && !res.trimLeft().startsWith('const') && (res.contains('(') || res.contains('[') || res.contains('{')); @@ -558,5 +558,5 @@ String parseTypeSource(FormalParameter p) { break; } - return p.declaredElement!.type.getDisplayString(); + return p.declaredFragment!.element.type.getDisplayString(); } diff --git a/packages/freezed/lib/src/templates/parameter_template.dart b/packages/freezed/lib/src/templates/parameter_template.dart index 7bd7e34a..6fc83770 100644 --- a/packages/freezed/lib/src/templates/parameter_template.dart +++ b/packages/freezed/lib/src/templates/parameter_template.dart @@ -1,5 +1,5 @@ import 'package:analyzer/dart/ast/ast.dart'; -import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/element2.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:collection/collection.dart'; import 'package:freezed/src/ast.dart'; @@ -11,10 +11,10 @@ class GenericsDefinitionTemplate { GenericsDefinitionTemplate(this.typeParameters); factory GenericsDefinitionTemplate.fromGenericElement( - List generics, + List generics, ) { return GenericsDefinitionTemplate( - generics.map((e) => e.getDisplayString()).toList(), + generics.map((e) => e.displayString2()).toList(), ); } @@ -36,9 +36,9 @@ class GenericsParameterTemplate { GenericsParameterTemplate(this.typeParameters); factory GenericsParameterTemplate.fromGenericElement( - List generics, + List generics, ) { - return GenericsParameterTemplate(generics.map((e) => e.name).toList()); + return GenericsParameterTemplate(generics.map((e) => e.name3!).toList()); } final List typeParameters; @@ -67,16 +67,16 @@ class ParametersTemplate { required bool addImplicitFinal, }) { Parameter asParameter(FormalParameter p) { - final e = p.declaredElement!; + final e = p.declaredFragment!.element; final value = Parameter( - name: e.name, + name: e.name3!, defaultValueSource: e.defaultValue, isRequired: e.isRequiredNamed, isFinal: addImplicitFinal || e.isFinal, type: e.type, typeDisplayString: parseTypeSource(p), - decorators: parseDecorators(e.metadata), + decorators: parseDecorators(e.metadata2.annotations), doc: p.documentation ?? '', showDefaultValue: true, parameterElement: e, @@ -244,7 +244,7 @@ class Parameter { final bool showDefaultValue; final bool isFinal; final String doc; - final ParameterElement? parameterElement; + final FormalParameterElement? parameterElement; Parameter copyWith({ DartType? type, diff --git a/packages/freezed/lib/src/templates/properties.dart b/packages/freezed/lib/src/templates/properties.dart index ef1115c8..863d74e0 100644 --- a/packages/freezed/lib/src/templates/properties.dart +++ b/packages/freezed/lib/src/templates/properties.dart @@ -1,5 +1,5 @@ import 'package:analyzer/dart/ast/ast.dart'; -import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/element2.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:freezed/src/ast.dart'; import 'package:freezed/src/templates/parameter_template.dart'; @@ -40,11 +40,11 @@ class Property { required bool addImplicitFinal, required bool isSynthetic, }) { - final element = parameter.declaredElement!; + final element = parameter.declaredFragment!.element; final defaultValue = element.defaultValue; if (defaultValue != null && - (element.hasRequired || element.isRequiredPositional)) { + (element.isRequired || element.isRequiredPositional)) { throw InvalidGenerationSourceError( '@Default cannot be used on non-optional parameters', element: element, @@ -52,13 +52,13 @@ class Property { } return Property( - name: element.name, + name: element.name3!, isFinal: addImplicitFinal || element.isFinal, isSynthetic: isSynthetic, doc: parameter.documentation ?? '', type: element.type, typeDisplayString: parseTypeSource(parameter), - decorators: parseDecorators(element.metadata), + decorators: parseDecorators(element.metadata2.annotations), defaultValueSource: defaultValue, hasJsonKey: element.hasJsonKey, ); @@ -114,7 +114,7 @@ class Property { bool? hasJsonKey, String? doc, bool? isPossiblyDartCollection, - ParameterElement? parameterElement, + TypeParameterElement2? parameterElement, }) { return Property( type: type ?? this.type, diff --git a/packages/freezed/lib/src/templates/prototypes.dart b/packages/freezed/lib/src/templates/prototypes.dart index f2a047a3..efac7b70 100644 --- a/packages/freezed/lib/src/templates/prototypes.dart +++ b/packages/freezed/lib/src/templates/prototypes.dart @@ -1,4 +1,4 @@ -import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/element2.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:source_gen/source_gen.dart'; @@ -38,8 +38,8 @@ extension FreezedElementAnnotation on ElementAnnotation { } } -bool isDefaultConstructor(ConstructorElement constructor) { - return constructor.name.isEmpty; +bool isDefaultConstructor(ConstructorElement2 constructor) { + return constructor.name3 == 'new'; } String constructorNameToCallbackName(String constructorName) { diff --git a/packages/freezed/lib/src/tools/imports.dart b/packages/freezed/lib/src/tools/imports.dart index 4d0c39a0..4d995395 100644 --- a/packages/freezed/lib/src/tools/imports.dart +++ b/packages/freezed/lib/src/tools/imports.dart @@ -1,18 +1,18 @@ -import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/element2.dart'; -extension LibraryHasImport on LibraryElement { - LibraryElement? findTransitiveExportWhere( - bool Function(LibraryElement library) visitor, +extension LibraryHasImport on LibraryElement2 { + LibraryElement2? findTransitiveExportWhere( + bool Function(LibraryElement2 library) visitor, ) { if (visitor(this)) return this; - final visitedLibraries = {}; - LibraryElement? visitLibrary(LibraryElement library) { + final visitedLibraries = {}; + LibraryElement2? visitLibrary(LibraryElement2 library) { if (!visitedLibraries.add(library)) return null; if (visitor(library)) return library; - for (final export in library.exportedLibraries) { + for (final export in library.exportedLibraries2) { final result = visitLibrary(export); if (result != null) return result; } @@ -20,7 +20,7 @@ extension LibraryHasImport on LibraryElement { return null; } - for (final import in exportedLibraries) { + for (final import in exportedLibraries2) { final result = visitLibrary(import); if (result != null) return result; } @@ -28,7 +28,7 @@ extension LibraryHasImport on LibraryElement { return null; } - bool anyTransitiveExport(bool Function(LibraryElement library) visitor) { + bool anyTransitiveExport(bool Function(LibraryElement2 library) visitor) { return findTransitiveExportWhere(visitor) != null; } } diff --git a/packages/freezed/lib/src/tools/recursive_import_locator.dart b/packages/freezed/lib/src/tools/recursive_import_locator.dart index d290d0cd..2ec6600e 100644 --- a/packages/freezed/lib/src/tools/recursive_import_locator.dart +++ b/packages/freezed/lib/src/tools/recursive_import_locator.dart @@ -1,9 +1,9 @@ -import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/element2.dart'; import 'package:collection/collection.dart'; -extension FindAllAvailableTopLevelElements on LibraryElement { +extension FindAllAvailableTopLevelElements on LibraryElement2 { bool isFromPackage(String packageName) { - return librarySource.fullName.startsWith('/$packageName/'); + return firstFragment.source.fullName.startsWith('/$packageName/'); } /// Recursively loops at the import/export directives to know what is available @@ -11,32 +11,32 @@ extension FindAllAvailableTopLevelElements on LibraryElement { /// /// This function does not guarantees that the elements returned are unique. /// It is possible for the same object to be present multiple times in the list. - Iterable findAllAvailableTopLevelElements() { + Iterable findAllAvailableTopLevelElements() { return _findAllAvailableTopLevelElements( {}, checkExports: false, key: _LibraryKey( hideStatements: {}, showStatements: {}, - librarySource: librarySource.fullName, + librarySource: firstFragment.source.fullName, ), ); } - Iterable _findAllAvailableTopLevelElements( + Iterable _findAllAvailableTopLevelElements( Set<_LibraryKey> visitedLibraryPaths, { required bool checkExports, required _LibraryKey key, }) sync* { - yield* topLevelElements; + yield* children2; final librariesToCheck = checkExports - ? units - .expand((e) => e.libraryExports) + ? fragments + .expand((e) => e.libraryExports2) .map(_LibraryDirectives.fromExport) .nonNulls - : units - .expand((e) => e.libraryImports) + : fragments + .expand((e) => e.libraryImports2) .map(_LibraryDirectives.fromImport) .nonNulls; @@ -55,8 +55,8 @@ extension FindAllAvailableTopLevelElements on LibraryElement { return (directive.showStatements.isEmpty && directive.hideStatements.isEmpty) || (directive.hideStatements.isNotEmpty && - !directive.hideStatements.contains(element.name)) || - directive.showStatements.contains(element.name); + !directive.hideStatements.contains(element.name3)) || + directive.showStatements.contains(element.name3); }); } } @@ -69,8 +69,8 @@ class _LibraryDirectives { required this.library, }); - static _LibraryDirectives? fromExport(LibraryExportElement export) { - final library = export.exportedLibrary; + static _LibraryDirectives? fromExport(LibraryExport export) { + final library = export.exportedLibrary2; if (library == null) return null; final hideStatements = export.combinators @@ -90,8 +90,8 @@ class _LibraryDirectives { ); } - static _LibraryDirectives? fromImport(LibraryImportElement export) { - final library = export.importedLibrary; + static _LibraryDirectives? fromImport(LibraryImport export) { + final library = export.importedLibrary2; if (library == null) return null; final hideStatements = export.combinators @@ -113,13 +113,13 @@ class _LibraryDirectives { final Set hideStatements; final Set showStatements; - final LibraryElement library; + final LibraryElement2 library; _LibraryKey get key { return _LibraryKey( hideStatements: hideStatements, showStatements: showStatements, - librarySource: library.source.fullName, + librarySource: library.firstFragment.source.fullName, ); } } diff --git a/packages/freezed/lib/src/tools/type.dart b/packages/freezed/lib/src/tools/type.dart index 55fceec7..b269d1e8 100644 --- a/packages/freezed/lib/src/tools/type.dart +++ b/packages/freezed/lib/src/tools/type.dart @@ -1,4 +1,4 @@ -import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/element2.dart'; import 'package:analyzer/dart/element/nullability_suffix.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:collection/collection.dart'; @@ -24,31 +24,29 @@ extension DartTypeX on DartType { } } -/// Returns the [Element] for a given [DartType] +/// Returns the [Element2] for a given [DartType] /// /// this is usually type.element, except if it is a typedef then it is /// type.alias.element -Element? _getElementForType(DartType type) { +Element2? _getElementForType(DartType type) { if (type is InterfaceType) { - return type.element; + return type.element3; } if (type is FunctionType) { - return type.alias?.element; + return type.alias?.element2; } return null; } /// Renders a type based on its string + potential import alias -String resolveFullTypeStringFrom(LibraryElement originLibrary, DartType type) { - final owner = originLibrary.units - .expand((e) => e.libraryImportPrefixes) - .firstWhereOrNull((e) { - return e.imports.any((l) { - return l.importedLibrary!.anyTransitiveExport((library) { - return library.id == _getElementForType(type)?.library?.id; - }); - }); +String resolveFullTypeStringFrom(LibraryElement2 originLibrary, DartType type) { + final owner = originLibrary.firstFragment.prefixes.firstWhereOrNull((e) { + return e.imports.any((l) { + return l.importedLibrary2!.anyTransitiveExport((library) { + return library.id == _getElementForType(type)?.library2?.id; }); + }); + }); String? displayType = type.getDisplayString(); @@ -64,8 +62,8 @@ String resolveFullTypeStringFrom(LibraryElement originLibrary, DartType type) { // 'dynamic Function(String)' // // Instead of 'SomeTypedef' - if (type is FunctionType && type.alias?.element != null) { - displayType = type.alias!.element.name; + if (type is FunctionType && type.alias?.element2 != null) { + displayType = type.alias!.element2.name3!; if (type.alias!.typeArguments.isNotEmpty) { displayType += '<${type.alias!.typeArguments.join(', ')}>'; } @@ -86,14 +84,14 @@ String resolveFullTypeStringFrom(LibraryElement originLibrary, DartType type) { // This a regression in analyzer 5.13.0 if (type is InterfaceType && type.typeArguments.any((e) => e is InvalidType)) { - final dynamicType = type.element.library.typeProvider.dynamicType; + final dynamicType = type.element3.library2.typeProvider.dynamicType; var modified = type; modified.typeArguments..replaceWhere((t) => t is InvalidType, dynamicType); displayType = modified.getDisplayString(); } if (owner != null) { - return '${owner.name}.$displayType'; + return '${owner.name3}.$displayType'; } return displayType; diff --git a/packages/freezed/pubspec.yaml b/packages/freezed/pubspec.yaml index 86b093c2..b44c10ea 100644 --- a/packages/freezed/pubspec.yaml +++ b/packages/freezed/pubspec.yaml @@ -11,19 +11,19 @@ environment: dependencies: analyzer: ">=7.5.9 <8.0.0" - build: ^2.5.0 + build: ^3.0.0 build_config: ^1.1.0 collection: ^1.15.0 meta: ^1.9.1 - source_gen: ^2.0.0 + source_gen: ^3.0.0 freezed_annotation: 3.1.0 json_annotation: ^4.8.0 dart_style: ^3.0.0 pub_semver: ^2.2.0 dev_dependencies: - json_serializable: ^6.3.2 - build_test: ^3.0.0 + json_serializable: ^6.10.0 + build_test: ^3.3.0 build_runner: ^2.3.3 test: ^1.21.0 matcher: ^0.12.14 diff --git a/packages/freezed/test/bidirectional_test.dart b/packages/freezed/test/bidirectional_test.dart index 2cfb679f..060f0834 100644 --- a/packages/freezed/test/bidirectional_test.dart +++ b/packages/freezed/test/bidirectional_test.dart @@ -9,7 +9,8 @@ void main() { final main = await resolveSources( {'freezed|test/integration/bidirectional.dart': useAssetReader}, (r) => r.libraries.firstWhere( - (element) => element.source.toString().contains('bidirectional'), + (element) => + element.firstFragment.source.toString().contains('bidirectional'), ), ); diff --git a/packages/freezed/test/common_types_test.dart b/packages/freezed/test/common_types_test.dart index a4881638..0b046be1 100644 --- a/packages/freezed/test/common_types_test.dart +++ b/packages/freezed/test/common_types_test.dart @@ -14,7 +14,8 @@ Future main() async { final main = await resolveSources( {'freezed|test/integration/common_types.dart': useAssetReader}, (r) => r.libraries.firstWhere( - (element) => element.source.toString().contains('common_types'), + (element) => + element.firstFragment.source.toString().contains('common_types'), ), ); diff --git a/packages/freezed/test/decorator_test.dart b/packages/freezed/test/decorator_test.dart index 7131702c..2132d124 100644 --- a/packages/freezed/test/decorator_test.dart +++ b/packages/freezed/test/decorator_test.dart @@ -1,5 +1,4 @@ import 'package:analyzer/dart/analysis/results.dart'; -import 'package:analyzer/dart/element/element.dart'; import 'package:build_test/build_test.dart'; import 'package:test/test.dart'; @@ -8,7 +7,8 @@ void main() { final main = await resolveSources( {'freezed|test/integration/decorator.dart': useAssetReader}, (r) => r.libraries.firstWhere( - (element) => element.source.toString().contains('decorator'), + (element) => + element.firstFragment.source.toString().contains('decorator'), ), ); @@ -33,26 +33,32 @@ import 'decorator.dart'; ''', }, (r) => r.libraries.firstWhere( - (element) => element.library.name == 'decorator', + (element) => element.library2.name3 == 'decorator', ), readAllSourcesFromFilesystem: true, ); - final concrete = main.topLevelElements - .whereType() - .firstWhere((e) => e.name == r'ListDecorator0'); + final concrete = main.classes.firstWhere( + (e) => e.name3 == r'ListDecorator0', + ); expect( - concrete.fields.firstWhere((element) => element.name == '_a').metadata, + concrete.fields2 + .firstWhere((element) => element.name3 == '_a') + .metadata2 + .annotations, isEmpty, ); - final unmodifiableGetter = concrete.fields - .firstWhere((element) => element.name == 'a') - .getter!; + final unmodifiableGetter = concrete.fields2 + .firstWhere((element) => element.name3 == 'a') + .getter2!; - expect(unmodifiableGetter.metadata.length, 2); - expect(unmodifiableGetter.metadata.last.toSource(), '@Foo()'); + expect(unmodifiableGetter.metadata2.annotations.length, 2); + expect( + unmodifiableGetter.metadata2.annotations.last.toSource(), + '@Foo()', + ); }, ); @@ -81,7 +87,7 @@ void main() { ''', }, (r) => r.libraries.firstWhere( - (element) => element.source.toString().contains('decorator'), + (element) => element.firstFragment.toString().contains('decorator'), ), readAllSourcesFromFilesystem: true, ); diff --git a/packages/freezed/test/deep_copy_test.dart b/packages/freezed/test/deep_copy_test.dart index 34ff7825..55eae442 100644 --- a/packages/freezed/test/deep_copy_test.dart +++ b/packages/freezed/test/deep_copy_test.dart @@ -20,7 +20,8 @@ void main() { final main = await resolveSources( {'freezed|test/integration/deep_copy.dart': useAssetReader}, (r) => r.libraries.firstWhere( - (element) => element.source.toString().contains('deep_copy'), + (element) => + element.firstFragment.source.toString().contains('deep_copy'), ), ); @@ -37,7 +38,8 @@ void main() { final main = await resolveSources( {'freezed|test/integration/deep_copy2.dart': useAssetReader}, (r) => r.libraries.firstWhere( - (element) => element.source.toString().contains('deep_copy2'), + (element) => + element.firstFragment.source.toString().contains('deep_copy2'), ), ); @@ -722,7 +724,8 @@ void main() { ''', }, (r) => r.libraries.firstWhere( - (element) => element.source.toString().contains('deep_copy'), + (element) => + element.firstFragment.source.toString().contains('deep_copy'), ), readAllSourcesFromFilesystem: true, ); diff --git a/packages/freezed/test/generic_test.dart b/packages/freezed/test/generic_test.dart index d5f4eeb5..818d40c5 100644 --- a/packages/freezed/test/generic_test.dart +++ b/packages/freezed/test/generic_test.dart @@ -41,7 +41,8 @@ void main() { final main = await resolveSources( {'freezed|test/integration/generic.dart': useAssetReader}, (r) => r.libraries.firstWhere( - (element) => element.source.toString().contains('generic'), + (element) => + element.firstFragment.source.toString().contains('generic'), ), ); diff --git a/packages/freezed/test/generics_refs_test.dart b/packages/freezed/test/generics_refs_test.dart index 5b3338aa..4a13ca97 100644 --- a/packages/freezed/test/generics_refs_test.dart +++ b/packages/freezed/test/generics_refs_test.dart @@ -10,7 +10,8 @@ void main() { final main = await resolveSources( {'freezed|test/integration/generics_refs.dart': useAssetReader}, (r) => r.libraries.firstWhere( - (element) => element.source.toString().contains('generics_refs'), + (element) => + element.firstFragment.source.toString().contains('generics_refs'), ), ); diff --git a/packages/freezed/test/json_test.dart b/packages/freezed/test/json_test.dart index cc665eea..f3a6e255 100644 --- a/packages/freezed/test/json_test.dart +++ b/packages/freezed/test/json_test.dart @@ -11,7 +11,7 @@ Future main() async { final jsonFile = await resolveSources( {'freezed|test/integration/json.dart': useAssetReader}, (r) => r.libraries.firstWhere( - (element) => element.source.toString().contains('json'), + (element) => element.firstFragment.source.toString().contains('json'), ), ); @@ -23,7 +23,7 @@ Future main() async { expect(Regression280n2.fromJson('hello'), Regression280n2('hello')); expect( - jsonFile.topLevelElements.map((e) => e.name), + jsonFile.publicNamespace.definedNames2.keys.toSet(), allOf( isNot(contains(r'_$Regression280FromJson')), isNot(contains(r'_$Regression280ToJson')), diff --git a/packages/freezed/test/multiple_constructors_test.dart b/packages/freezed/test/multiple_constructors_test.dart index d5372a2a..99b2d483 100644 --- a/packages/freezed/test/multiple_constructors_test.dart +++ b/packages/freezed/test/multiple_constructors_test.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'package:analyzer/dart/analysis/results.dart'; -import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/element2.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:build_test/build_test.dart'; import 'package:test/test.dart'; @@ -17,16 +17,14 @@ Future main() async { (r) { return r.libraries.firstWhere( (element) => - element.source.toString().contains('multiple_constructors'), + element.firstFragment.toString().contains('multiple_constructors'), ); }, readAllSourcesFromFilesystem: true, ); - ClassElement _getClassElement(String elementName) { - return sources.topLevelElements.whereType().firstWhere( - (element) => element.name == elementName, - ); + ClassElement2 _getClassElement(String elementName) { + return sources.classes.singleWhere((e) => e.name3 == elementName); } test('Response', () { @@ -39,14 +37,14 @@ Future main() async { test('recursive class does not generate dynamic', () async { final recursiveClass = _getClassElement('_RecursiveNext'); - expect(recursiveClass.getField('value')!.type, isA()); + expect(recursiveClass.getField2('value')!.type, isA()); }); test('recursive class with dollar generates correctly', () async { final recursiveClass = _getClassElement('_RecursiveWith\$DollarNext'); expect( - recursiveClass.getField('value')!.type.getDisplayString(), + recursiveClass.getField2('value')!.type.getDisplayString(), 'RecursiveWith\$DollarImpl', ); }); @@ -66,54 +64,54 @@ Future main() async { final complex2 = _getClassElement('Complex2'); expect( - complex.mixins.first.accessors.first, - isA() - .having((e) => e.name, 'name', 'a') + complex.mixins.first.getters.first, + isA() + .having((e) => e.name3, 'name', 'a') .having((e) => e.documentationComment, 'doc', '/// Hello'), ); expect( - complex0.fields.where( - (e) => e.name != 'copyWith' && e.name != 'hashCode', + complex0.fields2.where( + (e) => e.name3 != 'copyWith' && e.name3 != 'hashCode', ), [ - isA() - .having((e) => e.name, 'name', 'a') + isA() + .having((e) => e.name3, 'name', 'a') .having((e) => e.documentationComment, 'doc', '/// Hello'), ], ); expect( - complex1.fields.where( - (e) => e.name != 'copyWith' && e.name != 'hashCode', + complex1.fields2.where( + (e) => e.name3 != 'copyWith' && e.name3 != 'hashCode', ), [ - isA() - .having((e) => e.name, 'name', 'a') + isA() + .having((e) => e.name3, 'name', 'a') .having((e) => e.documentationComment, 'doc', '/// World'), - isA() - .having((e) => e.name, 'name', 'b') + isA() + .having((e) => e.name3, 'name', 'b') .having((e) => e.documentationComment, 'doc', '/// B'), - isA() - .having((e) => e.name, 'name', 'd') + isA() + .having((e) => e.name3, 'name', 'd') .having((e) => e.documentationComment, 'doc', null), ], ); expect( - complex2.fields.where( - (e) => e.name != 'copyWith' && e.name != 'hashCode', + complex2.fields2.where( + (e) => e.name3 != 'copyWith' && e.name3 != 'hashCode', ), [ - isA() - .having((e) => e.name, 'name', 'a') + isA() + .having((e) => e.name3, 'name', 'a') // The doc is inherited from `Complex` .having((e) => e.documentationComment, 'doc', null), - isA() - .having((e) => e.name, 'name', 'c') + isA() + .having((e) => e.name3, 'name', 'c') .having((e) => e.documentationComment, 'doc', '/// C'), - isA() - .having((e) => e.name, 'name', 'd') + isA() + .having((e) => e.name3, 'name', 'd') .having((e) => e.documentationComment, 'doc', null), ], ); @@ -171,8 +169,9 @@ void main() { final main = await resolveSources( {'freezed|test/integration/multiple_constructors.dart': useAssetReader}, (r) => r.libraries.firstWhere( - (element) => - element.source.toString().contains('multiple_constructors'), + (element) => element.firstFragment.source.toString().contains( + 'multiple_constructors', + ), ), ); @@ -575,7 +574,7 @@ void main() { final nestedListClass = _getClassElement('ShallowNestedList'); expect( - nestedListClass.getField('children')!.type.getDisplayString(), + nestedListClass.getField2('children')!.type.getDisplayString(), 'List', ); }); @@ -584,14 +583,14 @@ void main() { final nestedListClass = _getClassElement('DeepNestedList'); expect( - nestedListClass.getField('children')!.type.getDisplayString(), + nestedListClass.getField2('children')!.type.getDisplayString(), 'List', ); final nestedListItemClass = _getClassElement('InnerNestedListItem'); expect( - nestedListItemClass.getField('children')!.type.getDisplayString(), + nestedListItemClass.getField2('children')!.type.getDisplayString(), 'List', ); }); @@ -601,7 +600,7 @@ void main() { final nestedMapClass = _getClassElement('ShallowNestedMap'); expect( - nestedMapClass.getField('children')!.type.getDisplayString(), + nestedMapClass.getField2('children')!.type.getDisplayString(), 'Map', ); }); @@ -610,14 +609,14 @@ void main() { final nestedMapClass = _getClassElement('DeepNestedMap'); expect( - nestedMapClass.getField('children')!.type.getDisplayString(), + nestedMapClass.getField2('children')!.type.getDisplayString(), 'Map', ); final nestedMapItemClass = _getClassElement('InnerNestedMapItem'); expect( - nestedMapItemClass.getField('children')!.type.getDisplayString(), + nestedMapItemClass.getField2('children')!.type.getDisplayString(), 'Map', ); }); @@ -628,19 +627,19 @@ void main() { final nestedMapClass = _getClassElement('_UsesGenerated'); expect( - nestedMapClass.getField('value')!.type.getDisplayString(), + nestedMapClass.getField2('value')!.type.getDisplayString(), 'CodeGenerated', ); expect( - nestedMapClass.getField('list')!.type.getDisplayString(), + nestedMapClass.getField2('list')!.type.getDisplayString(), 'List', ); expect( - nestedMapClass.getField('nestedList')!.type.getDisplayString(), + nestedMapClass.getField2('nestedList')!.type.getDisplayString(), 'List>', ); expect( - nestedMapClass.getField('map')!.type.getDisplayString(), + nestedMapClass.getField2('map')!.type.getDisplayString(), 'Map', ); }); diff --git a/packages/freezed/test/optional_maybe_test.dart b/packages/freezed/test/optional_maybe_test.dart index 7d94eabe..fb55c1fc 100644 --- a/packages/freezed/test/optional_maybe_test.dart +++ b/packages/freezed/test/optional_maybe_test.dart @@ -10,7 +10,8 @@ void main() { final main = await resolveSources( {'freezed|test/integration/optional_maybe.dart': useAssetReader}, (r) => r.libraries.firstWhere( - (element) => element.source.toString().contains('optional_maybe'), + (element) => + element.firstFragment.source.toString().contains('optional_maybe'), ), ); diff --git a/packages/freezed/test/single_class_constructor_test.dart b/packages/freezed/test/single_class_constructor_test.dart index 384fe2d9..475db64f 100644 --- a/packages/freezed/test/single_class_constructor_test.dart +++ b/packages/freezed/test/single_class_constructor_test.dart @@ -1,6 +1,6 @@ // ignore_for_file: prefer_const_constructors, omit_local_variable_types, deprecated_member_use_from_same_package import 'package:analyzer/dart/analysis/results.dart'; -import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/element2.dart'; import 'package:build_test/build_test.dart'; import 'package:test/test.dart'; @@ -25,14 +25,14 @@ class MyObject { } Future main() async { - Future analyze() { + Future analyze() { return resolveSources( { 'freezed|test/integration/single_class_constructor.dart': useAssetReader, }, (r) => r.libraries.firstWhere((e) { - return e.source.fullName == + return e.firstFragment.source.fullName == '/freezed/test/integration/single_class_constructor.dart'; }), readAllSourcesFromFilesystem: true, @@ -211,30 +211,28 @@ Future main() async { test('documentation', () async { final singleClassLibrary = await analyze(); - final doc = - singleClassLibrary.topLevelElements.firstWhere((e) => e.name == 'Doc') - as ClassElement; + final doc = singleClassLibrary.classes.firstWhere((e) => e.name3 == 'Doc'); expect( - doc.mixins.first.accessors.where( - (e) => e.name != 'copyWith' && e.name != 'hashCode', + doc.mixins.first.getters.where( + (e) => e.name3 != 'copyWith' && e.name3 != 'hashCode', ), [ - isA() - .having((e) => e.name, 'name', 'positional') + isA() + .having((e) => e.name3, 'name', 'positional') .having((e) => e.documentationComment, 'doc', ''' /// Multi /// line /// positional'''), - isA() // - .having((e) => e.name, 'name', 'named') + isA() // + .having((e) => e.name3, 'name', 'named') .having( (e) => e.documentationComment, 'doc', '/// Single line named', ), - isA() // - .having((e) => e.name, 'name', 'simple') + isA() // + .having((e) => e.name3, 'name', 'simple') .having((e) => e.documentationComment, 'doc', null), ], ); diff --git a/packages/freezed/test/typedef_parameter_test.dart b/packages/freezed/test/typedef_parameter_test.dart index 1eee7a7c..5b417af2 100644 --- a/packages/freezed/test/typedef_parameter_test.dart +++ b/packages/freezed/test/typedef_parameter_test.dart @@ -1,5 +1,4 @@ import 'package:analyzer/dart/analysis/results.dart'; -import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/nullability_suffix.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:build_test/build_test.dart'; @@ -10,7 +9,9 @@ void main() { final main = await resolveSources( {'freezed|test/integration/typedef_parameter.dart': useAssetReader}, (r) => r.libraries.firstWhere( - (element) => element.source.toString().contains('typedef_parameter'), + (element) => element.firstFragment.source.toString().contains( + 'typedef_parameter', + ), ), ); @@ -27,39 +28,41 @@ void main() { final main = await resolveSources( {'freezed|test/integration/typedef_parameter.dart': useAssetReader}, (r) => r.libraries.firstWhere( - (element) => element.source.toString().contains('typedef_parameter'), + (element) => element.firstFragment.source.toString().contains( + 'typedef_parameter', + ), ), readAllSourcesFromFilesystem: true, ); - var freezedClass = main.topLevelElements - .whereType() - .firstWhere((element) => element.name == '_ClassWithTypedef'); + var freezedClass = main.classes.firstWhere( + (element) => element.name3 == '_ClassWithTypedef', + ); - var constructor = freezedClass.constructors.firstWhere( - (element) => element.name == '', + var constructor = freezedClass.constructors2.firstWhere( + (element) => element.name3 == 'new', ); - var a = constructor.parameters.first.type; + var a = constructor.formalParameters.first.type; expect(a, isA()); - expect(a.alias!.element.name, equals('MyTypedef')); + expect(a.alias!.element2.name3, equals('MyTypedef')); - var b = constructor.parameters[1].type; + var b = constructor.formalParameters[1].type; expect(b, isA()); - expect(b.alias!.element.name, equals('MyTypedef')); + expect(b.alias!.element2.name3, equals('MyTypedef')); expect(b.nullabilitySuffix, equals(NullabilitySuffix.question)); - var c = constructor.parameters[2].type; + var c = constructor.formalParameters[2].type; expect(c, isA()); - expect(c.alias!.element.name, equals('ExternalTypedef')); + expect(c.alias!.element2.name3, equals('ExternalTypedef')); - var d = constructor.parameters[3].type; + var d = constructor.formalParameters[3].type; expect(d, isA()); - expect(d.alias!.element.name, equals('ExternalTypedefTwo')); + expect(d.alias!.element2.name3, equals('ExternalTypedefTwo')); - var e = constructor.parameters[4].type; + var e = constructor.formalParameters[4].type; expect(e, isA()); - expect(e.alias!.element.name, equals('GenericTypedef')); + expect(e.alias!.element2.name3, equals('GenericTypedef')); expect(e.alias!.typeArguments.toString(), equals('[int, bool]')); }); }