From 1772be2944c9f842aa378f78296d0a4f137ff050 Mon Sep 17 00:00:00 2001 From: Roman Laptev Date: Tue, 15 Jul 2025 15:42:21 +0300 Subject: [PATCH 01/13] Migrate to element2 --- generator/CHANGELOG.md | 9 +- generator/analysis_options.yaml | 2 + generator/lib/src/generator.dart | 1589 ++++++++++---------- generator/pubspec.yaml | 18 +- generator/test/src/generator_test_src.dart | 1136 ++++---------- generator/test/src/query.pb.dart | 109 +- 6 files changed, 1217 insertions(+), 1646 deletions(-) diff --git a/generator/CHANGELOG.md b/generator/CHANGELOG.md index 84e19ea30..13e5efa4b 100644 --- a/generator/CHANGELOG.md +++ b/generator/CHANGELOG.md @@ -1,10 +1,15 @@ +## 10.0.0 + +- Migrate to `Element2` +- Updates minimum supported SDK version to Dart 3.8 + ## 9.7.0 - Upgrade build_runner to 2.5.4 ## 9.6.0 - - Updates minimum supported SDK version to Dart 3.6. + - Updates minimum supported SDK version to Dart 3.6 ## 9.5.0 @@ -126,7 +131,7 @@ return Either.right(response); } catch (e) { - return Either.left(ApiError(e)) + return Either.left(ApiError(e)); } } } diff --git a/generator/analysis_options.yaml b/generator/analysis_options.yaml index 572dd239d..011741769 100644 --- a/generator/analysis_options.yaml +++ b/generator/analysis_options.yaml @@ -1 +1,3 @@ include: package:lints/recommended.yaml +formatter: + page_width: 80 diff --git a/generator/lib/src/generator.dart b/generator/lib/src/generator.dart index 809d2dea6..b0448486a 100644 --- a/generator/lib/src/generator.dart +++ b/generator/lib/src/generator.dart @@ -2,12 +2,13 @@ import 'dart:ffi'; import 'dart:io'; 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:build/build.dart'; import 'package:built_collection/built_collection.dart'; import 'package:code_builder/code_builder.dart'; +import 'package:collection/collection.dart'; import 'package:dart_style/dart_style.dart'; import 'package:dio/dio.dart'; import 'package:protobuf/protobuf.dart'; @@ -26,15 +27,15 @@ class RetrofitOptions { }); RetrofitOptions.fromOptions([BuilderOptions? options]) - : autoCastResponse = - (options?.config['auto_cast_response']?.toString() ?? 'true') == - 'true', - emptyRequestBody = - (options?.config['empty_request_body']?.toString() ?? 'false') == - 'true', - className = options?.config['class-name']?.toString(), - useResult = - (options?.config['use_result']?.toString() ?? 'false') == 'true'; + : autoCastResponse = + (options?.config['auto_cast_response']?.toString() ?? 'true') == + 'true', + emptyRequestBody = + (options?.config['empty_request_body']?.toString() ?? 'false') == + 'true', + className = options?.config['class-name']?.toString(), + useResult = + (options?.config['use_result']?.toString() ?? 'false') == 'true'; final bool? autoCastResponse; final bool? emptyRequestBody; @@ -47,8 +48,8 @@ class RetrofitGenerator extends GeneratorForAnnotation { final RetrofitOptions globalOptions; - static const String _baseUrlVar = 'baseUrl'; - static const String _errorLoggerVar = 'errorLogger'; + static const _baseUrlVar = 'baseUrl'; + static const _errorLoggerVar = 'errorLogger'; static const _queryParamsVar = 'queryParameters'; static const _optionsVar = '_options'; static const _localHeadersVar = '_headers'; @@ -76,11 +77,11 @@ class RetrofitGenerator extends GeneratorForAnnotation { @override String generateForAnnotatedElement( - Element element, + Element2 element, ConstantReader annotation, BuildStep buildStep, ) { - if (element is! ClassElement) { + if (element is! ClassElement2) { final name = element.displayName; throw InvalidGenerationSourceError( 'Generator cannot target `$name`.', @@ -90,23 +91,27 @@ class RetrofitGenerator extends GeneratorForAnnotation { return _implementClass(element, annotation); } - String _implementClass(ClassElement element, ConstantReader? annotation) { - final className = globalOptions.className ?? '_${element.name}'; - final enumString = annotation?.peek('parser')?.revive().accessor; - final parser = retrofit.Parser.values - .firstWhereOrNull((e) => e.toString() == enumString); + String _implementClass(ClassElement2 element, ConstantReader annotation) { + final className = globalOptions.className ?? '_${element.name3}'; + final enumString = annotation.peek('parser')?.revive().accessor; + final parser = retrofit.Parser.values.firstWhereOrNull( + (e) => e.toString() == enumString, + ); clientAnnotation = retrofit.RestApi( - baseUrl: annotation?.peek(_baseUrlVar)?.stringValue ?? '', + baseUrl: annotation.peek(_baseUrlVar)?.stringValue ?? '', parser: parser ?? retrofit.Parser.JsonSerializable, ); clientAnnotationConstantReader = annotation; final baseUrl = clientAnnotation.baseUrl; - final annotateClassConsts = element.constructors - .where((c) => !c.isFactory && !c.isDefaultConstructor); + final annotateClassConsts = element.constructors2.where( + (c) => !c.isFactory && !c.isDefaultConstructor, + ); final classBuilder = Class((c) { c ..name = className - ..types.addAll(element.typeParameters.map((e) => refer(e.name))) + ..types.addAll( + element.typeParameters2.map((e) => e.name3).nonNulls.map(refer), + ) ..fields.addAll([ _buildDioFiled(), _buildBaseUrlFiled(baseUrl), @@ -134,100 +139,104 @@ class RetrofitGenerator extends GeneratorForAnnotation { }); final emitter = DartEmitter(useNullSafetySyntax: true); - return DartFormatter(languageVersion: DartFormatter.latestLanguageVersion) - .format([_analyzerIgnores, classBuilder.accept(emitter)].join('\n\n')); + return DartFormatter( + languageVersion: DartFormatter.latestLanguageVersion, + ).format([_analyzerIgnores, classBuilder.accept(emitter)].join('\n\n')); } Field _buildDioFiled() => Field( - (m) => m - ..name = _dioVar - ..type = refer('Dio') - ..modifier = FieldModifier.final$, - ); + (m) => m + ..name = _dioVar + ..type = refer('Dio') + ..modifier = FieldModifier.final$, + ); Field _buildBaseUrlFiled(String? url) => Field((m) { - m - ..name = _baseUrlVar - ..type = refer('String?') - ..modifier = FieldModifier.var$; - }); + m + ..name = _baseUrlVar + ..type = refer('String?') + ..modifier = FieldModifier.var$; + }); Field _buildErrorLoggerFiled() => Field((m) { - m - ..name = _errorLoggerVar - ..type = refer('ParseErrorLogger?') - ..modifier = FieldModifier.final$; - }); + m + ..name = _errorLoggerVar + ..type = refer('ParseErrorLogger?') + ..modifier = FieldModifier.final$; + }); Constructor _generateConstructor( String? url, { - ConstructorElement? superClassConst, - }) => - Constructor((c) { - c.requiredParameters.add( - Parameter( - (p) => p - ..name = _dioVar - ..toThis = true, - ), - ); - c.optionalParameters.addAll([ - Parameter( - (p) => p - ..named = true - ..name = _baseUrlVar - ..toThis = true, - ), - Parameter( - (p) => p - ..named = true - ..name = _errorLoggerVar - ..toThis = true, - ), - ]); - if (superClassConst != null) { - var superConstName = 'super'; - if (superClassConst.name.isNotEmpty) { - superConstName += '.${superClassConst.name}'; - c.name = superClassConst.name; - } - final constParams = superClassConst.parameters; - for (final element in constParams) { - if (!element.isOptional || element.isPrivate) { - c.requiredParameters.add( - Parameter( - (p) => p - ..type = refer(_displayString(element.type)) - ..name = element.name, - ), - ); - } else { - c.optionalParameters.add( - Parameter( - (p) => p - ..named = element.isNamed - ..type = refer(_displayString(element.type)) - ..name = element.name, - ), - ); - } - } - final paramList = constParams - .map((e) => '${e.isNamed ? '${e.name}: ' : ''}${e.name}'); - c.initializers.add(Code('$superConstName(${paramList.join(',')})')); + ConstructorElement2? superClassConst, + }) => Constructor((c) { + c.requiredParameters.add( + Parameter( + (p) => p + ..name = _dioVar + ..toThis = true, + ), + ); + c.optionalParameters.addAll([ + Parameter( + (p) => p + ..named = true + ..name = _baseUrlVar + ..toThis = true, + ), + Parameter( + (p) => p + ..named = true + ..name = _errorLoggerVar + ..toThis = true, + ), + ]); + if (superClassConst != null) { + var superConstName = 'super'; + if (superClassConst.name3?.isNotEmpty ?? false) { + superConstName += '.${superClassConst.name3}'; + c.name = superClassConst.name3; + } + final constParams = superClassConst.formalParameters; + for (final element in constParams) { + if (!element.isOptional || element.isPrivate) { + c.requiredParameters.add( + Parameter((p) { + p.type = refer(_displayString(element.type)); + if (element.name3 != null) { + p.name = element.name3!; + } + }), + ); + } else { + c.optionalParameters.add( + Parameter((p) { + p + ..named = element.isNamed + ..type = refer(_displayString(element.type)); + if (element.name3 != null) { + p.name = element.name3!; + } + }), + ); } - final block = [ - if (url != null && url.isNotEmpty) - Code('$_baseUrlVar ??= ${literal(url)};'), - ]; + } + final paramList = constParams.map( + (e) => '${e.isNamed ? '${e.name3}: ' : ''}${e.name3}', + ); + c.initializers.add(Code('$superConstName(${paramList.join(',')})')); + } + final block = [ + if (url != null && url.isNotEmpty) + Code('$_baseUrlVar ??= ${literal(url)};'), + ]; - if (block.isNotEmpty) { - c.body = Block.of(block); - } - }); + if (block.isNotEmpty) { + c.body = Block.of(block); + } + }); - // Traverses a type to find a matching type argument - // e.g. given a type `List>` and a key `User`, it will return the `DartType` "User" + /// Traverses a type to find a matching type argument + /// e.g. given a type `List>` and a key `User`, it will return the `DartType` "User" DartType? findMatchingTypeArgument(DartType? type, String key) { if (type?.getDisplayString() == key) { return type; @@ -244,15 +253,16 @@ class RetrofitGenerator extends GeneratorForAnnotation { return null; } - // retrieve CallAdapter from method annotation or class annotation - ConstantReader? getCallAdapterInterface(MethodElement m) { - final requestCallAdapterAnnotation = _typeChecker(retrofit.UseCallAdapter) - .firstAnnotationOf(m) - .toConstantReader(); + /// retrieve CallAdapter from method annotation or class annotation + ConstantReader? getCallAdapterInterface(MethodElement2 m) { + final requestCallAdapterAnnotation = _typeChecker( + retrofit.UseCallAdapter, + ).firstAnnotationOf(m).toConstantReader(); final rootCallAdapter = clientAnnotationConstantReader; - final callAdapter = - (requestCallAdapterAnnotation ?? rootCallAdapter)?.peek('callAdapter'); + final callAdapter = (requestCallAdapterAnnotation ?? rootCallAdapter)?.peek( + 'callAdapter', + ); final callAdapterTypeValue = callAdapter?.typeValue as InterfaceType?; if (callAdapterTypeValue != null) { @@ -271,8 +281,9 @@ class RetrofitGenerator extends GeneratorForAnnotation { /// where T is supposed to be the wrapped result type InterfaceType? getAdaptedReturnType(ConstantReader? callAdapter) { final callAdapterTypeVal = callAdapter?.typeValue as InterfaceType?; - final adaptedType = callAdapterTypeVal?.superclass?.typeArguments.lastOrNull - as InterfaceType?; + final adaptedType = + callAdapterTypeVal?.superclass?.typeArguments.lastOrNull + as InterfaceType?; return adaptedType; } @@ -295,11 +306,11 @@ class RetrofitGenerator extends GeneratorForAnnotation { } // parse methods in the Api class - Iterable _parseMethods(ClassElement element) { + Iterable _parseMethods(ClassElement2 element) { final methods = []; - final methodMembers = [ - ...element.methods, - ...element.mixins.expand((i) => i.methods), + final methodMembers = [ + ...element.methods2, + ...element.mixins.expand((i) => i.methods2), ]; for (final method in methodMembers) { final callAdapter = getCallAdapterInterface(method); @@ -308,10 +319,12 @@ class RetrofitGenerator extends GeneratorForAnnotation { adaptedReturnType != null ? _displayString(adaptedReturnType) : '', _displayString(method.returnType), ); - final typeArg = - findMatchingTypeArgument(method.returnType, resultTypeInString); + final typeArg = findMatchingTypeArgument( + method.returnType, + resultTypeInString, + ); final instantiatedCallAdapter = typeArg != null - ? (callAdapter?.typeValue as InterfaceType?)?.element.instantiate( + ? (callAdapter?.typeValue as InterfaceType?)?.element3.instantiate( typeArguments: [typeArg], nullabilitySuffix: NullabilitySuffix.none, ) @@ -320,26 +333,29 @@ class RetrofitGenerator extends GeneratorForAnnotation { methods.add(_generateApiCallMethod(method, instantiatedCallAdapter)!); } if (callAdapter != null) { - methods.add(_generateAdapterMethod( - method, instantiatedCallAdapter, resultTypeInString)); + methods.add( + _generateAdapterMethod( + method, + instantiatedCallAdapter, + resultTypeInString, + ), + ); } } return methods; } Method _generateAdapterMethod( - MethodElement m, + MethodElement2 m, InterfaceType? callAdapter, String resultType, ) { return Method((methodBuilder) { - methodBuilder.returns = - refer(_displayString(m.returnType, withNullability: true)); + methodBuilder.returns = refer( + _displayString(m.returnType, withNullability: true), + ); methodBuilder.requiredParameters.addAll( - _generateParameters( - m, - (it) => it.isRequiredPositional, - ), + _generateParameters(m, (it) => it.isRequiredPositional), ); methodBuilder.optionalParameters.addAll( _generateParameters( @@ -352,7 +368,7 @@ class RetrofitGenerator extends GeneratorForAnnotation { methodBuilder.annotations.add(const CodeExpression(Code('override'))); final positionalArgs = []; final namedArgs = []; - for (final parameter in m.parameters) { + for (final parameter in m.formalParameters) { if (parameter.isRequiredPositional || parameter.isOptionalPositional) { positionalArgs.add(parameter.displayName); } @@ -363,7 +379,7 @@ class RetrofitGenerator extends GeneratorForAnnotation { final args = '${positionalArgs.map((e) => '$e,').join()} ${namedArgs.map((e) => '$e,').join()}'; methodBuilder.body = Code(''' - return ${callAdapter?.element.name}<$resultType>().adapt( + return ${callAdapter?.element3.name3}<$resultType>().adapt( () => _${m.displayName}($args), ); '''); @@ -371,28 +387,32 @@ class RetrofitGenerator extends GeneratorForAnnotation { } Iterable _generateParameters( - MethodElement m, - bool Function(ParameterElement) filter, { + MethodElement2 m, + bool Function(FormalParameterElement) filter, { bool optional = false, }) { - return m.parameters.where(filter).map( - (it) => Parameter( - (p) => p - ..name = it.name + return m.formalParameters + .where(filter) + .map( + (it) => Parameter((p) { + p ..named = it.isNamed ..type = refer(it.type.getDisplayString()) ..required = optional && it.isRequiredNamed ..defaultTo = optional && it.defaultValueCode != null ? Code(it.defaultValueCode!) - : null, - ), + : null; + if (it.name3 != null) { + p.name = it.name3!; + } + }), ); } - String _generateTypeParameterizedName(TypeParameterizedElement element) => + String _generateTypeParameterizedName(TypeParameterizedElement2 element) => element.displayName + - (element.typeParameters.isNotEmpty - ? '<${element.typeParameters.join(',')}>' + (element.typeParameters2.isNotEmpty + ? '<${element.typeParameters2.join(',')}>' : ''); final _methodsAnnotations = const [ @@ -408,7 +428,7 @@ class RetrofitGenerator extends GeneratorForAnnotation { TypeChecker _typeChecker(Type type) => TypeChecker.fromRuntime(type); - ConstantReader? _getMethodAnnotation(MethodElement method) { + ConstantReader? _getMethodAnnotation(MethodElement2 method) { for (final type in _methodsAnnotations) { final annotation = _getMethodAnnotationByType(method, type); if (annotation != null) { @@ -418,54 +438,54 @@ class RetrofitGenerator extends GeneratorForAnnotation { return null; } - ConstantReader? _getMethodAnnotationByType(MethodElement method, Type type) { - final annotation = - _typeChecker(type).firstAnnotationOf(method, throwOnUnresolved: false); + ConstantReader? _getMethodAnnotationByType(MethodElement2 method, Type type) { + final annotation = _typeChecker( + type, + ).firstAnnotationOf(method, throwOnUnresolved: false); if (annotation != null) { return ConstantReader(annotation); } return null; } - ConstantReader? _getCacheAnnotation(MethodElement method) => + ConstantReader? _getCacheAnnotation(MethodElement2 method) => _getMethodAnnotationByType(method, retrofit.CacheControl); - ConstantReader? _getContentTypeAnnotation(MethodElement method) { + ConstantReader? _getContentTypeAnnotation(MethodElement2 method) { final multipart = _getMultipartAnnotation(method); final formUrlEncoded = _getFormUrlEncodedAnnotation(method); if (multipart != null && formUrlEncoded != null) { throw InvalidGenerationSourceError( - 'Two content-type annotation on one request ${method.name}', + 'Two content-type annotation on one request ${method.name3}', ); } return multipart ?? formUrlEncoded; } - ConstantReader? _getMultipartAnnotation(MethodElement method) => + ConstantReader? _getMultipartAnnotation(MethodElement2 method) => _getMethodAnnotationByType(method, retrofit.MultiPart); - ConstantReader? _getFormUrlEncodedAnnotation(MethodElement method) => + ConstantReader? _getFormUrlEncodedAnnotation(MethodElement2 method) => _getMethodAnnotationByType(method, retrofit.FormUrlEncoded); - ConstantReader? _getResponseTypeAnnotation(MethodElement method) => + ConstantReader? _getResponseTypeAnnotation(MethodElement2 method) => _getMethodAnnotationByType(method, retrofit.DioResponseType); Iterable _getMethodAnnotations( - MethodElement method, + MethodElement2 method, Type type, - ) => - _typeChecker(type) - .annotationsOf(method, throwOnUnresolved: false) - .map(ConstantReader.new); + ) => _typeChecker( + type, + ).annotationsOf(method, throwOnUnresolved: false).map(ConstantReader.new); - Map _getAnnotations( - MethodElement m, + Map _getAnnotations( + MethodElement2 m, Type type, ) { - final annotation = {}; - for (final p in m.parameters) { + final annotation = {}; + for (final p in m.formalParameters) { final a = _typeChecker(type).firstAnnotationOf(p); if (a != null) { annotation[p] = ConstantReader(a); @@ -474,11 +494,11 @@ class RetrofitGenerator extends GeneratorForAnnotation { return annotation; } - ({ParameterElement element, ConstantReader reader})? _getAnnotation( - MethodElement m, + ({FormalParameterElement element, ConstantReader reader})? _getAnnotation( + MethodElement2 m, Type type, ) { - for (final p in m.parameters) { + for (final p in m.formalParameters) { final a = _typeChecker(type).firstAnnotationOf(p); if (a != null) { return (element: p, reader: ConstantReader(a)); @@ -489,13 +509,13 @@ class RetrofitGenerator extends GeneratorForAnnotation { List? _genericListOf(DartType type) => type is ParameterizedType && type.typeArguments.isNotEmpty - ? type.typeArguments - : null; + ? type.typeArguments + : null; DartType? _genericOf(DartType type) => type is InterfaceType && type.typeArguments.isNotEmpty - ? type.typeArguments.first - : null; + ? type.typeArguments.first + : null; DartType? _getResponseType(DartType type) => _genericOf(type); @@ -527,26 +547,29 @@ class RetrofitGenerator extends GeneratorForAnnotation { void _configureMethodMetadata( MethodBuilder mm, - MethodElement m, + MethodElement2 m, String returnType, bool hasCallAdapter, ) { mm ..returns = refer(returnType) ..name = hasCallAdapter ? '_${m.displayName}' : m.displayName - ..types.addAll(m.typeParameters.map((e) => refer(e.name))) + ..types.addAll(m.typeParameters2.map((e) => e.name3).nonNulls.map(refer)) ..modifier = _isReturnTypeFuture(returnType) ? MethodModifier.async : MethodModifier.asyncStar; } - void _addParameters(MethodBuilder mm, MethodElement m) { + void _addParameters(MethodBuilder mm, MethodElement2 m) { mm.requiredParameters.addAll( _generateParameters(m, (it) => it.isRequiredPositional), ); mm.optionalParameters.addAll( - _generateParameters(m, (it) => it.isOptional || it.isRequiredNamed, - optional: true), + _generateParameters( + m, + (it) => it.isOptional || it.isRequiredNamed, + optional: true, + ), ); } @@ -567,7 +590,7 @@ class RetrofitGenerator extends GeneratorForAnnotation { } // generate the method that makes the http request - Method? _generateApiCallMethod(MethodElement m, InterfaceType? callAdapter) { + Method? _generateApiCallMethod(MethodElement2 m, InterfaceType? callAdapter) { final hasCallAdapter = callAdapter != null; if (hasCallAdapter) { @@ -581,8 +604,12 @@ class RetrofitGenerator extends GeneratorForAnnotation { final returnType = m.returnType; return Method((methodBuilder) { - _configureMethodMetadata(methodBuilder, m, - _displayString(returnType, withNullability: true), false); + _configureMethodMetadata( + methodBuilder, + m, + _displayString(returnType, withNullability: true), + false, + ); _addParameters(methodBuilder, m); _addAnnotations(methodBuilder, returnType, false); methodBuilder.body = _generateRequest(m, httpMethod, null); @@ -590,7 +617,9 @@ class RetrofitGenerator extends GeneratorForAnnotation { } Method? _generatePrivateApiCallMethod( - MethodElement m, InterfaceType? callAdapter) { + MethodElement2 m, + InterfaceType? callAdapter, + ) { final callAdapterOriginalReturnType = callAdapter?.superclass?.typeArguments.firstOrNull as InterfaceType?; @@ -600,22 +629,30 @@ class RetrofitGenerator extends GeneratorForAnnotation { } return Method((methodBuilder) { - _configureMethodMetadata(methodBuilder, m, - _displayString(callAdapterOriginalReturnType), true); + _configureMethodMetadata( + methodBuilder, + m, + _displayString(callAdapterOriginalReturnType), + true, + ); _addParameters(methodBuilder, m); _addAnnotations(methodBuilder, m.returnType, true); methodBuilder.body = _generateRequest(m, httpMethod, callAdapter); }); } - Expression _generatePath(MethodElement m, ConstantReader method) { + Expression _generatePath(MethodElement2 m, ConstantReader method) { final paths = _getAnnotations(m, retrofit.Path); var definePath = method.peek('path')?.stringValue; paths.forEach((k, v) { final value = v.peek('value')?.stringValue ?? k.displayName; definePath = definePath?.replaceAll( '{$value}', - "\${${k.displayName}${k.type.element?.kind == ElementKind.ENUM ? _hasToJson(k.type) ? '.toJson()' : '' : ''}}", + "\${${k.displayName}${k.type.element3?.kind == ElementKind.ENUM + ? _hasToJson(k.type) + ? '.toJson()' + : '' + : ''}}", ); }); return literal(definePath); @@ -624,17 +661,20 @@ class RetrofitGenerator extends GeneratorForAnnotation { bool _isReturnTypeFuture(String type) => type.startsWith('Future<'); Code _generateRequest( - MethodElement m, + MethodElement2 m, ConstantReader httpMethod, InterfaceType? callAdapter, ) { - var returnAsyncWrapper = - m.returnType.isDartAsyncFuture ? 'return' : 'yield'; + var returnAsyncWrapper = m.returnType.isDartAsyncFuture + ? 'return' + : 'yield'; if (callAdapter != null) { final callAdapterOriginalReturnType = callAdapter.superclass?.typeArguments.firstOrNull as InterfaceType?; - returnAsyncWrapper = _isReturnTypeFuture( - callAdapterOriginalReturnType?.getDisplayString() ?? '') + returnAsyncWrapper = + _isReturnTypeFuture( + callAdapterOriginalReturnType?.getDisplayString() ?? '', + ) ? 'return' : 'yield'; } @@ -657,8 +697,10 @@ class RetrofitGenerator extends GeneratorForAnnotation { .statement, ); - final preventNullToAbsent = - _getMethodAnnotationByType(m, retrofit.PreventNullToAbsent); + final preventNullToAbsent = _getMethodAnnotationByType( + m, + retrofit.PreventNullToAbsent, + ); if (preventNullToAbsent == null && headers.isNotEmpty) { blocks.add( @@ -685,16 +727,18 @@ class RetrofitGenerator extends GeneratorForAnnotation { final contentType = _getContentTypeAnnotation(m); if (contentType != null) { - extraOptions[_contentType] = - literal(contentType.peek('mime')?.stringValue); + extraOptions[_contentType] = literal( + contentType.peek('mime')?.stringValue, + ); } /// gen code for request body for content-type on Protobuf body final annotation = _getAnnotation(m, retrofit.Body); final bodyName = annotation?.element; if (bodyName != null) { - if (const TypeChecker.fromRuntime(GeneratedMessage) - .isAssignableFromType(bodyName.type)) { + if (const TypeChecker.fromRuntime( + GeneratedMessage, + ).isAssignableFromType(bodyName.type)) { extraOptions[_contentType] = literal( 'application/x-protobuf; \${${bodyName.displayName}.info_.qualifiedMessageName == "" ? "" :"messageType=\${${bodyName.displayName}.info_.qualifiedMessageName}"}', ); @@ -740,8 +784,9 @@ class RetrofitGenerator extends GeneratorForAnnotation { final receiveProgress = _getAnnotation(m, retrofit.ReceiveProgress); if (receiveProgress != null) { - namedArguments[_onReceiveProgress] = - refer(receiveProgress.element.displayName); + namedArguments[_onReceiveProgress] = refer( + receiveProgress.element.displayName, + ); } blocks.add( @@ -757,7 +802,8 @@ class RetrofitGenerator extends GeneratorForAnnotation { ? callAdapter.superclass!.typeArguments.first : m.returnType, ); - final isWrappedWithHttpResponseWrapper = wrappedReturnType != null && + final isWrappedWithHttpResponseWrapper = + wrappedReturnType != null && _typeChecker(retrofit.HttpResponse).isExactlyType(wrappedReturnType); final returnType = isWrappedWithHttpResponseWrapper @@ -767,19 +813,21 @@ class RetrofitGenerator extends GeneratorForAnnotation { if (isWrappedWithHttpResponseWrapper) { blocks ..add( - refer('final $_resultVar = await $_dioVar.fetch') - .call([options], {}, [refer('void')]).statement, + refer( + 'final $_resultVar = await $_dioVar.fetch', + ).call([options], {}, [refer('void')]).statement, ) ..add( Code(''' - final httpResponse = HttpResponse(null, $_resultVar); - $returnAsyncWrapper httpResponse; - '''), +final httpResponse = HttpResponse(null, $_resultVar); +$returnAsyncWrapper httpResponse; +'''), ); } else { blocks.add( - refer('await $_dioVar.fetch') - .call([options], {}, [refer('void')]).statement, + refer( + 'await $_dioVar.fetch', + ).call([options], {}, [refer('void')]).statement, ); } } else { @@ -803,17 +851,18 @@ class RetrofitGenerator extends GeneratorForAnnotation { .assign( refer('$_resultVar.data') .propertyIf( - thisNullable: returnType.isNullable, - name: 'cast', - ) + thisNullable: returnType.isNullable, + name: 'cast', + ) .call([], {}, [ - refer( - _displayString( - innerReturnType, - withNullability: innerReturnType?.isNullable ?? false, - ), - ), - ]), + refer( + _displayString( + innerReturnType, + withNullability: + innerReturnType?.isNullable ?? false, + ), + ), + ]), ) .statement, ); @@ -845,8 +894,9 @@ class RetrofitGenerator extends GeneratorForAnnotation { .statement, ); } else { - final castType = - _isEnum(innerReturnType) ? 'String' : 'Map'; + final castType = _isEnum(innerReturnType) + ? 'String' + : 'Map'; final Reference mapperCode; switch (clientAnnotation.parser) { @@ -897,8 +947,9 @@ class RetrofitGenerator extends GeneratorForAnnotation { blocks.add( declareFinal(_resultVar) .assign( - refer('await $_dioVar.fetch>') - .call([options]), + refer( + 'await $_dioVar.fetch>', + ).call([options]), ) .statement, ); @@ -915,43 +966,40 @@ class RetrofitGenerator extends GeneratorForAnnotation { switch (clientAnnotation.parser) { case retrofit.Parser.MapSerializable: mapperCode = refer(''' - (k, dynamic v) => - MapEntry( - k, (v as List) - .map((i) => ${_displayString(type)}.fromMap(i as Map)) - .toList() - ) - '''); +(k, dynamic v) => + MapEntry( + k, (v as List) + .map((i) => ${_displayString(type)}.fromMap(i as Map)) + .toList() + ) +'''); case retrofit.Parser.JsonSerializable: mapperCode = refer(''' - (k, dynamic v) => - MapEntry( - k, (v as List) - .map((i) => ${_displayString(type)}.fromJson(i as Map)) - .toList() - ) - '''); +(k, dynamic v) => + MapEntry( + k, (v as List) + .map((i) => ${_displayString(type)}.fromJson(i as Map)) + .toList() + ) +'''); case retrofit.Parser.DartJsonMapper: mapperCode = refer(''' - (k, dynamic v) => - MapEntry( - k, (v as List) - .map((i) => JsonMapper.fromMap<${_displayString(type)}>(i as Map)!) - .toList() - ) - '''); +(k, dynamic v) => + MapEntry( + k, (v as List) + .map((i) => JsonMapper.fromMap<${_displayString(type)}>(i as Map)!) + .toList() + ) +'''); case retrofit.Parser.FlutterCompute: log.warning(''' Return types should not be a map when running `Parser.FlutterCompute`, as spawning an isolate per entry is extremely intensive. You should create a new class to encapsulate the response. '''); future = true; - mapperCode = refer(''' - (e) async => MapEntry( - e.key, - await compute(deserialize${_displayString(type)}List, - (e.value as List).cast>())) - '''); + mapperCode = refer( + '(e) async => MapEntry( e.key, await compute(deserialize${_displayString(type)}List, (e.value as List).cast>()))', + ); } if (future) { _wrapInTryCatch( @@ -962,8 +1010,9 @@ You should create a new class to encapsulate the response. .assign( refer('Map.fromEntries').call([ refer('await Future.wait').call([ - refer('$_resultVar.data!.entries.map') - .call([mapperCode]), + refer( + '$_resultVar.data!.entries.map', + ).call([mapperCode]), ]), ]), ) @@ -978,9 +1027,9 @@ You should create a new class to encapsulate the response. .assign( refer('$_resultVar.data') .propertyIf( - thisNullable: returnType.isNullable, - name: 'map', - ) + thisNullable: returnType.isNullable, + name: 'map', + ) .call([mapperCode]), ) .statement, @@ -1009,10 +1058,9 @@ Return types should not be a map when running `Parser.FlutterCompute`, as spawni You should create a new class to encapsulate the response. '''); future = true; - mapperCode = refer(''' - (e) async => MapEntry( - e.key, await compute(deserialize${_displayString(secondType)}, e.value as Map)) - '''); + mapperCode = refer( + '(e) async => MapEntry(e.key, await compute(deserialize${_displayString(secondType)}, e.value as Map))', + ); } if (future) { _wrapInTryCatch( @@ -1025,8 +1073,9 @@ You should create a new class to encapsulate the response. thisNullable: returnType.isNullable, whenFalse: refer('Map.fromEntries').call([ refer('await Future.wait').call([ - refer('$_resultVar.data!.entries.map') - .call([mapperCode]), + refer( + '$_resultVar.data!.entries.map', + ).call([mapperCode]), ]), ]), ), @@ -1042,9 +1091,9 @@ You should create a new class to encapsulate the response. .assign( refer('$_resultVar.data') .propertyIf( - thisNullable: returnType.isNullable, - name: 'map', - ) + thisNullable: returnType.isNullable, + name: 'map', + ) .call([mapperCode]), ) .statement, @@ -1059,13 +1108,13 @@ You should create a new class to encapsulate the response. .assign( refer('$_resultVar.data') .propertyIf( - thisNullable: returnType.isNullable, - name: 'cast', - ) + thisNullable: returnType.isNullable, + name: 'cast', + ) .call([], {}, [ - refer(_displayString(firstType)), - refer(_displayString(secondType)), - ]), + refer(_displayString(firstType)), + refer(_displayString(secondType)), + ]), ) .statement, ); @@ -1078,8 +1127,9 @@ You should create a new class to encapsulate the response. blocks.add( declareFinal(_resultVar) .assign( - refer('await $_dioVar.fetch<${_displayString(returnType)}>') - .call([options]), + refer( + 'await $_dioVar.fetch<${_displayString(returnType)}>', + ).call([options]), ) .statement, ); @@ -1090,17 +1140,18 @@ You should create a new class to encapsulate the response. returnType, refer(_valueVar) .assign( - refer('$_resultVar.data') - .asNoNullIf(returnNullable: returnType.isNullable), + refer( + '$_resultVar.data', + ).asNoNullIf(returnNullable: returnType.isNullable), ) .statement, ); } else if (returnType is DynamicType || returnType.isDartCoreObject) { blocks ..add( - declareFinal(_resultVar) - .assign(refer('await $_dioVar.fetch').call([options])) - .statement, + declareFinal( + _resultVar, + ).assign(refer('await $_dioVar.fetch').call([options])).statement, ) ..add(const Code('final $_valueVar = $_resultVar.data;')); } else if (_typeChecker(GeneratedMessage).isSuperTypeOf(returnType)) { @@ -1124,9 +1175,10 @@ You should create a new class to encapsulate the response. blocks.add( declareFinal(_resultVar) .assign( - refer('await $_dioVar' - '.fetch<$fetchType>') - .call([options]), + refer( + 'await $_dioVar' + '.fetch<$fetchType>', + ).call([options]), ) .statement, ); @@ -1137,16 +1189,16 @@ You should create a new class to encapsulate the response. '${_displayString(returnType)}.fromMap($_resultVar.data!)', ); case retrofit.Parser.JsonSerializable: - final genericArgumentFactories = - isGenericArgumentFactories(returnType); - + final genericArgumentFactories = isGenericArgumentFactories( + returnType, + ); final typeArgs = returnType is ParameterizedType ? returnType.typeArguments : []; if (typeArgs.isNotEmpty && genericArgumentFactories) { - //Remove the outermost nullable modifier - //see NullableDynamicNullableInnerGenericTypeShouldBeCastedAsMap from generator/test/src/generator_test_src.dart:1529 + // Remove the outermost nullable modifier + // see NullableDynamicNullableInnerGenericTypeShouldBeCastedAsMap from generator/test/src/generator_test_src.dart:2139 var displayString = _displayString( returnType, withNullability: innerReturnType?.isNullable ?? false, @@ -1199,9 +1251,9 @@ You should create a new class to encapsulate the response. if (isWrappedWithHttpResponseWrapper) { blocks.add( Code(''' - final httpResponse = HttpResponse($_valueVar, $_resultVar); - $returnAsyncWrapper httpResponse; - '''), +final httpResponse = HttpResponse($_valueVar, $_resultVar); +$returnAsyncWrapper httpResponse; +'''), ); } else { blocks.add(Code('$returnAsyncWrapper $_valueVar;')); @@ -1212,12 +1264,17 @@ You should create a new class to encapsulate the response. } bool isGenericArgumentFactories(DartType? dartType) { - final metaData = dartType?.element?.metadata; + final metaData = dartType?.element3?.firstFragment is ClassFragment + ? (dartType!.element3!.firstFragment as ClassFragment) + .metadata2 + .annotations + : null; if (metaData == null || dartType == null) { return false; } - final constDartObj = - metaData.isNotEmpty ? metaData.first.computeConstantValue() : null; + final constDartObj = metaData.isNotEmpty + ? metaData.first.computeConstantValue() + : null; var genericArgumentFactories = false; if (constDartObj != null && (!_typeChecker(List).isExactlyType(dartType) && @@ -1227,7 +1284,7 @@ You should create a new class to encapsulate the response. final obj = annotation.peek('genericArgumentFactories'); genericArgumentFactories = obj?.boolValue ?? false; } on Object { - // nothing + // } } @@ -1241,43 +1298,40 @@ You should create a new class to encapsulate the response. if (dartType == null) { return false; } - final element = dartType.element; - if (element is! InterfaceElement) { + final element = dartType.element3; + if (element is! InterfaceElement2) { return false; } - final typeParameters = element.typeParameters; + final typeParameters = element.typeParameters2; if (typeParameters.isEmpty) { return false; } - final constructors = element.constructors; + final constructors = element.constructors2; if (constructors.isEmpty) { return false; } - final fromJson = constructors - .firstWhereOrNull((constructor) => constructor.name == 'fromJson'); + final fromJson = constructors.firstWhereOrNull( + (constructor) => constructor.name3 == 'fromJson', + ); - if (fromJson == null || fromJson.parameters.length == 1) { + if (fromJson == null || fromJson.formalParameters.length == 1) { return false; } - final fromJsonArguments = fromJson.parameters; + final fromJsonArguments = fromJson.formalParameters; if (typeParameters.length != (fromJsonArguments.length - 1)) { - // TODO: better error. theoretically this should never be hit - // "invalid fromJson"? - // throw Exception( - // 'Not the right amount of arguments: \n$typeParameters\n$fromJsonArguments'); - // throw Exception('Invalid fromJson found'); - return false; // or error? we shouldn't get here at all, theoretically + return false; } return true; } String _getInnerJsonSerializableMapperFn(DartType dartType) { - final typeArgs = - dartType is ParameterizedType ? dartType.typeArguments : []; + final typeArgs = dartType is ParameterizedType + ? dartType.typeArguments + : []; if (typeArgs.isNotEmpty) { if (_typeChecker(List).isExactlyType(dartType) || _typeChecker(BuiltList).isExactlyType(dartType)) { @@ -1292,45 +1346,38 @@ You should create a new class to encapsulate the response. if (typeArgs.isNotEmpty && isGenericArgumentFactories(genericType) && genericType != null) { - mapperVal = ''' - (json)=> json is List - ? json - .map<$genericTypeString>((i) => $genericTypeString.fromJson( - i as Map,${_getInnerJsonSerializableMapperFn(genericType)} - )) - .toList() - : List.empty(), - '''; + mapperVal = + ''' +(json) => json is List + ? json + .map<$genericTypeString>((i) => $genericTypeString.fromJson(i as Map,${_getInnerJsonSerializableMapperFn(genericType)})) + .toList() + : List.empty(), +'''; } else { if (_isBasicType(genericType)) { - mapperVal = ''' - (json)=> json is List - ? json - .map<$genericTypeString>((i) => - i as $genericTypeString - ) - .toList() - : List.empty(), + mapperVal = + ''' +(json) => json is List + ? json.map<$genericTypeString>((i) => i as $genericTypeString).toList() + : List.empty(), '''; } else { - mapperVal = """ - (json)=> json is List - ? json - .map<$genericTypeString>((i) => - ${genericTypeString == 'dynamic' ? ' i as Map' : '$genericTypeString.fromJson( i as Map ) '} - ) - .toList() - : List.empty(), - """; + mapperVal = + ''' +(json) => json is List + ? json.map<$genericTypeString>((i) => ${genericTypeString == 'dynamic' ? ' i as Map' : '$genericTypeString.fromJson(i as Map)'}).toList() + : List.empty(), +'''; } } return mapperVal; } else { var mappedVal = ''; for (final arg in typeArgs) { - // print(arg); - final typeArgs = - arg is ParameterizedType ? arg.typeArguments : []; + final typeArgs = arg is ParameterizedType + ? arg.typeArguments + : []; if (typeArgs.isNotEmpty) { if (_typeChecker(List).isExactlyType(arg) || _typeChecker(BuiltList).isExactlyType(arg)) { @@ -1338,10 +1385,10 @@ You should create a new class to encapsulate the response. } else { if (isGenericArgumentFactories(arg)) { mappedVal += - '(json)=>${_displayString(arg)}.fromJson(json as Map,${_getInnerJsonSerializableMapperFn(arg)}),'; + '(json) => ${_displayString(arg)}.fromJson(json as Map, ${_getInnerJsonSerializableMapperFn(arg)}),'; } else { mappedVal += - '(json)=>${_displayString(arg)}.fromJson(json as Map),'; + '(json) => ${_displayString(arg)}.fromJson(json as Map),'; } } } else { @@ -1352,15 +1399,15 @@ You should create a new class to encapsulate the response. } } else { if (_displayString(dartType) == 'dynamic' || _isBasicType(dartType)) { - return '(json)=>json as ${_displayString(dartType, withNullability: dartType.isNullable)},'; + return '(json) => json as ${_displayString(dartType, withNullability: dartType.isNullable)},'; } else { if (_displayString(dartType) == 'void') { - return '(json)=> (){}(),'; + return '(json) => (){}(),'; } else { if (dartType.isNullable) { - return '(json)=> json == null ? null : ${_displayString(dartType)}.fromJson(json as Map),'; + return '(json) => json == null ? null : ${_displayString(dartType)}.fromJson(json as Map),'; } else { - return '(json)=>${_displayString(dartType)}.fromJson(json as Map),'; + return '(json) => ${_displayString(dartType)}.fromJson(json as Map),'; } } } @@ -1368,8 +1415,9 @@ You should create a new class to encapsulate the response. } String _getInnerJsonDeSerializableMapperFn(DartType dartType) { - final typeArgs = - dartType is ParameterizedType ? dartType.typeArguments : []; + final typeArgs = dartType is ParameterizedType + ? dartType.typeArguments + : []; if (typeArgs.isNotEmpty) { if (_typeChecker(List).isExactlyType(dartType) || _typeChecker(BuiltList).isExactlyType(dartType)) { @@ -1396,8 +1444,9 @@ You should create a new class to encapsulate the response. } else { var mappedVal = ''; for (final arg in typeArgs) { - final typeArgs = - arg is ParameterizedType ? arg.typeArguments : []; + final typeArgs = arg is ParameterizedType + ? arg.typeArguments + : []; if (typeArgs.isNotEmpty) { if (_typeChecker(List).isExactlyType(arg) || _typeChecker(BuiltList).isExactlyType(arg)) { @@ -1426,7 +1475,7 @@ You should create a new class to encapsulate the response. } Expression _parseOptions( - MethodElement m, + MethodElement2 m, Map namedArguments, List blocks, Map extraOptions, @@ -1459,52 +1508,53 @@ You should create a new class to encapsulate the response. composeArguments[_onReceiveProgress] = receiveProgress; } - return refer('_setStreamType').call([ - refer('Options') - .newInstance([], args) - .property('compose') - .call( - [refer(_dioVar).property('options'), path], - composeArguments, - ) - .property('copyWith') - .call([], { - _baseUrlVar: refer('_combineBaseUrls').call([ - refer(_dioVar).property('options').property('baseUrl'), - baseUrl, - ]), - }), - ], {}, [ - type, - ]); + return refer('_setStreamType').call( + [ + refer('Options') + .newInstance([], args) + .property('compose') + .call([ + refer(_dioVar).property('options'), + path, + ], composeArguments) + .property('copyWith') + .call([], { + _baseUrlVar: refer('_combineBaseUrls').call([ + refer(_dioVar).property('options').property('baseUrl'), + baseUrl, + ]), + }), + ], + {}, + [type], + ); } else { hasCustomOptions = true; blocks.add( declareFinal('newOptions') .assign( - refer('newRequestOptions') - .call([refer(annoOptions.element.displayName)]), + refer( + 'newRequestOptions', + ).call([refer(annoOptions.element.displayName)]), ) .statement, ); final newOptions = refer('newOptions'); blocks ..add( - newOptions - .property(_extraVar) - .property('addAll') - .call([extraOptions.remove(_extraVar)!]).statement, + newOptions.property(_extraVar).property('addAll').call([ + extraOptions.remove(_extraVar)!, + ]).statement, ) ..add( - newOptions.property('headers').property('addAll').call( - [refer(_dioVar).property('options').property('headers')], - ).statement, + newOptions.property('headers').property('addAll').call([ + refer(_dioVar).property('options').property('headers'), + ]).statement, ) ..add( - newOptions - .property('headers') - .property('addAll') - .call([extraOptions.remove('headers')!]).statement, + newOptions.property('headers').property('addAll').call([ + extraOptions.remove('headers')!, + ]).statement, ); return newOptions .property('copyWith') @@ -1524,102 +1574,102 @@ You should create a new class to encapsulate the response. } Method _generateOptionsCastMethod() => Method((m) { - m - ..name = 'newRequestOptions' - ..returns = refer('RequestOptions') + m + ..name = 'newRequestOptions' + ..returns = refer('RequestOptions') + /// required parameters + ..requiredParameters.add( + Parameter((p) { + p + ..name = 'options' + ..type = refer('Object?').type; + }), + ) + /// add method body + ..body = const Code(''' +if (options is RequestOptions) { + return options as RequestOptions; +} +if (options is Options) { + return RequestOptions( + method: options.method, + sendTimeout: options.sendTimeout, + receiveTimeout: options.receiveTimeout, + extra: options.extra, + headers: options.headers, + responseType: options.responseType, + contentType: options.contentType.toString(), + validateStatus: options.validateStatus, + receiveDataWhenStatusError: options.receiveDataWhenStatusError, + followRedirects: options.followRedirects, + maxRedirects: options.maxRedirects, + requestEncoder: options.requestEncoder, + responseDecoder: options.responseDecoder, + path: '', + ); +} +return RequestOptions(path: ''); +'''); + }); - /// required parameters - ..requiredParameters.add( - Parameter((p) { - p - ..name = 'options' - ..type = refer('Object?').type; - }), - ) + Method _generateCombineBaseUrlsMethod() => Method((m) { + final dioBaseUrlParam = Parameter((p) { + p + ..name = 'dioBaseUrl' + ..type = refer('String'); + }); + final baseUrlParam = Parameter((p) { + p + ..name = 'baseUrl' + ..type = refer('String?'); + }); - /// add method body - ..body = const Code(''' - if (options is RequestOptions) { - return options as RequestOptions; - } - if (options is Options) { - return RequestOptions( - method: options.method, - sendTimeout: options.sendTimeout, - receiveTimeout: options.receiveTimeout, - extra: options.extra, - headers: options.headers, - responseType: options.responseType, - contentType: options.contentType.toString(), - validateStatus: options.validateStatus, - receiveDataWhenStatusError: options.receiveDataWhenStatusError, - followRedirects: options.followRedirects, - maxRedirects: options.maxRedirects, - requestEncoder: options.requestEncoder, - responseDecoder: options.responseDecoder, - path: '', - ); - } - return RequestOptions(path: ''); - '''); - }); + m + ..name = '_combineBaseUrls' + ..returns = refer('String') + ..requiredParameters = ListBuilder([ + dioBaseUrlParam, + baseUrlParam, + ]) + ..body = const Code(''' +if (baseUrl == null || baseUrl.trim().isEmpty) { + return dioBaseUrl; +} - Method _generateCombineBaseUrlsMethod() => Method((m) { - final dioBaseUrlParam = Parameter((p) { - p - ..name = 'dioBaseUrl' - ..type = refer('String'); - }); - final baseUrlParam = Parameter((p) { - p - ..name = 'baseUrl' - ..type = refer('String?'); - }); +final url = Uri.parse(baseUrl); - m - ..name = '_combineBaseUrls' - ..returns = refer('String') - ..requiredParameters = - ListBuilder([dioBaseUrlParam, baseUrlParam]) - ..body = const Code(''' - if (baseUrl == null || baseUrl.trim().isEmpty) { - return dioBaseUrl; - } - - final url = Uri.parse(baseUrl); - - if (url.isAbsolute) { - return url.toString(); - } - - return Uri.parse(dioBaseUrl).resolveUri(url).toString(); - '''); - }); +if (url.isAbsolute) { + return url.toString(); +} + +return Uri.parse(dioBaseUrl).resolveUri(url).toString(); +'''); + }); Method _generateTypeSetterMethod() => Method((m) { - final t = refer('T'); - final optionsParam = Parameter((p) { - p - ..name = 'requestOptions' - ..type = refer('RequestOptions'); - }); - m - ..name = '_setStreamType' - ..types = ListBuilder([t]) - ..returns = refer('RequestOptions') - ..requiredParameters = ListBuilder([optionsParam]) - ..body = const Code(''' + final t = refer('T'); + final optionsParam = Parameter((p) { + p + ..name = 'requestOptions' + ..type = refer('RequestOptions'); + }); + m + ..name = '_setStreamType' + ..types = ListBuilder([t]) + ..returns = refer('RequestOptions') + ..requiredParameters = ListBuilder([optionsParam]) + ..body = const Code(''' if (T != dynamic && - !(requestOptions.responseType == ResponseType.bytes || - requestOptions.responseType == ResponseType.stream)) { + !(requestOptions.responseType == ResponseType.bytes || requestOptions.responseType == ResponseType.stream)) { if (T == String) { requestOptions.responseType = ResponseType.plain; } else { requestOptions.responseType = ResponseType.json; } } - return requestOptions;'''); - }); + return requestOptions; +'''); + }); bool _isBasicType(DartType? returnType) { if (returnType == null) { @@ -1633,14 +1683,15 @@ if (T != dynamic && _typeChecker(Double).isExactlyType(returnType) || _typeChecker(Float).isExactlyType(returnType) || _typeChecker(BigInt).isExactlyType(returnType) || - _typeChecker(Long).isExactlyType(returnType); + _typeChecker(Long).isExactlyType(returnType) || + _typeChecker(Object).isExactlyType(returnType); } bool _isEnum(DartType? dartType) { - if (dartType == null || dartType.element == null) { + if (dartType == null || dartType.element3 == null) { return false; } - return dartType.element is EnumElement; + return dartType.element3 is EnumElement2; } bool _isDateTime(DartType? dartType) { @@ -1659,18 +1710,18 @@ if (T != dynamic && if (dartType is! InterfaceType) { return false; } - return dartType.element.getNamedConstructor('fromJson') != null; + return dartType.element3.getNamedConstructor2('fromJson') != null; } bool _hasToJson(DartType? dartType) { if (dartType is! InterfaceType) { return false; } - return dartType.element.getMethod('toJson') != null; + return dartType.element3.getMethod2('toJson') != null; } void _generateQueries( - MethodElement m, + MethodElement2 m, List blocks, String queryParamsVar, ) { @@ -1691,9 +1742,9 @@ if (T != dynamic && case retrofit.Parser.JsonSerializable: if (_isDateTime(p.type)) { value = p.type.nullabilitySuffix == NullabilitySuffix.question - ? refer(p.displayName) - .nullSafeProperty('toIso8601String') - .call([]) + ? refer( + p.displayName, + ).nullSafeProperty('toIso8601String').call([]) : refer(p.displayName).property('toIso8601String').call([]); } else if (_isEnum(p.type) && !_hasToJson(p.type)) { value = p.type.nullabilitySuffix == NullabilitySuffix.question @@ -1756,8 +1807,6 @@ if (T != dynamic && } } - /// workaround until this is merged in code_builder - /// https://github.com/dart-lang/code_builder/pull/269 final emitter = DartEmitter(useNullSafetySyntax: true); final buffer = StringBuffer(); value.accept(emitter, buffer); @@ -1769,11 +1818,14 @@ if (T != dynamic && blocks.add(refer('$queryParamsVar.addAll').call([expression]).statement); } - final preventNullToAbsent = - _getMethodAnnotationByType(m, retrofit.PreventNullToAbsent); + final preventNullToAbsent = _getMethodAnnotationByType( + m, + retrofit.PreventNullToAbsent, + ); - final anyNullable = m.parameters - .any((p) => p.type.nullabilitySuffix == NullabilitySuffix.question); + final anyNullable = m.formalParameters.any( + (p) => p.type.nullabilitySuffix == NullabilitySuffix.question, + ); if (preventNullToAbsent == null && anyNullable) { blocks.add(Code('$queryParamsVar.removeWhere((k, v) => v == null);')); @@ -1783,28 +1835,31 @@ if (T != dynamic && void _generateRequestBody( List blocks, String dataVar, - MethodElement m, + MethodElement2 m, ) { final noBody = _getMethodAnnotationByType(m, retrofit.NoBody); if (noBody != null) { blocks.add( - declareFinal(dataVar, type: refer('String?')) - .assign(refer('null')) - .statement, + declareFinal( + dataVar, + type: refer('String?'), + ).assign(refer('null')).statement, ); return; } var anyNullable = false; - final preventNullToAbsent = - _getMethodAnnotationByType(m, retrofit.PreventNullToAbsent); + final preventNullToAbsent = _getMethodAnnotationByType( + m, + retrofit.PreventNullToAbsent, + ); final annotation = _getAnnotation(m, retrofit.Body); final bodyName = annotation?.element; final bodyExtraAnnotations = _getAnnotations(m, retrofit.BodyExtra); final bodyExtras = {}; - final expandBodyExtras = {}; + final expandBodyExtras = {}; for (final item in bodyExtraAnnotations.entries) { final expand = item.value.peek('expand')?.boolValue ?? false; anyNullable |= @@ -1828,14 +1883,16 @@ if (T != dynamic && if (bodyName != null) { final nullToAbsent = annotation!.reader.peek('nullToAbsent')?.boolValue ?? false; - final bodyTypeElement = bodyName.type.element; - if (const TypeChecker.fromRuntime(Map) - .isAssignableFromType(bodyName.type)) { + final bodyTypeElement = bodyName.type.element3; + if (const TypeChecker.fromRuntime( + Map, + ).isAssignableFromType(bodyName.type)) { blocks ..add( declareFinal(dataVar) .assign( - literalMap(bodyExtras, refer('String'), refer('dynamic'))) + literalMap(bodyExtras, refer('String'), refer('dynamic')), + ) .statement, ) ..add( @@ -1854,8 +1911,8 @@ if (T != dynamic && !_isBasicInnerType(bodyName.type))) { final nullabilitySuffix = bodyName.type.nullabilitySuffix == NullabilitySuffix.question - ? '?' - : ''; + ? '?' + : ''; switch (clientAnnotation.parser) { case retrofit.Parser.JsonSerializable: case retrofit.Parser.DartJsonMapper: @@ -1884,10 +1941,12 @@ if (T != dynamic && blocks.add( declareFinal(dataVar) .assign( - refer(bodyName.type.nullabilitySuffix == - NullabilitySuffix.question - ? '${bodyName.displayName} == null ? null: $compute' - : compute), + refer( + bodyName.type.nullabilitySuffix == + NullabilitySuffix.question + ? '${bodyName.displayName} == null ? null: $compute' + : compute, + ), ) .statement, ); @@ -1899,79 +1958,78 @@ if (T != dynamic && ); } blocks.add( - declareFinal(dataVar) - .assign(refer('${bodyName.displayName}.writeToBuffer()')) - .statement, + declareFinal( + dataVar, + ).assign(refer('${bodyName.displayName}.writeToBuffer()')).statement, ); } else if (bodyTypeElement != null && _typeChecker(File).isExactly(bodyTypeElement)) { blocks.add( - declareFinal(dataVar) - .assign( - refer( - '${bodyName.displayName}.openRead()', - ), - ) - .statement, + declareFinal( + dataVar, + ).assign(refer('${bodyName.displayName}.openRead()')).statement, ); - } else if (bodyName.type.element is ClassElement) { - final ele = bodyName.type.element! as ClassElement; + } else if (bodyName.type.element3 is ClassElement2) { + final ele = bodyName.type.element3! as ClassElement2; if (clientAnnotation.parser == retrofit.Parser.MapSerializable) { - final toMap = - ele.augmented.lookUpMethod(name: 'toMap', library: ele.library); + final toMap = ele.lookUpMethod2(name: 'toMap', library: ele.library2); if (toMap == null) { log.warning( - '${_displayString(bodyName.type)} must provide a `toMap()` method which return a Map.\n' - "It is programmer's responsibility to make sure the ${bodyName.type} is properly serialized"); + '${_displayString(bodyName.type)} must provide a `toMap()` method which return a Map.\n' + "It is programmer's responsibility to make sure the ${bodyName.type} is properly serialized", + ); blocks.add( - declareFinal(dataVar) - .assign(refer(bodyName.displayName)) - .statement, + declareFinal( + dataVar, + ).assign(refer(bodyName.displayName)).statement, ); } else { blocks.add( declareFinal(dataVar) .assign( - literalMap(bodyExtras, refer('String'), refer('dynamic'))) + literalMap(bodyExtras, refer('String'), refer('dynamic')), + ) .statement, ); for (final item in expandBodyExtras.entries) { _generateParameterElement(item.key, blocks, dataVar); } blocks.add( - refer('$dataVar.addAll').call( - [ - refer( - '${bodyName.displayName}?.toMap() ?? {}', - ), - ], - ).statement, + refer('$dataVar.addAll').call([ + refer('${bodyName.displayName}?.toMap() ?? {}'), + ]).statement, ); } } else { if (_missingToJson(ele)) { log.warning( - '${_displayString(bodyName.type)} must provide a `toJson()` method which return a Map.\n' - "It is programmer's responsibility to make sure the ${_displayString(bodyName.type)} is properly serialized"); + '${_displayString(bodyName.type)} must provide a `toJson()` method which return a Map.\n' + "It is programmer's responsibility to make sure the ${_displayString(bodyName.type)} is properly serialized", + ); blocks.add( - declareFinal(dataVar) - .assign(refer(bodyName.displayName)) - .statement, + declareFinal( + dataVar, + ).assign(refer(bodyName.displayName)).statement, ); - } else if (_missingSerialize(ele.enclosingElement3, bodyName.type)) { + } else if (_missingSerialize( + ele.enclosingElement2.firstFragment, + bodyName.type, + )) { log.warning( - '${_displayString(bodyName.type)} must provide a `serialize${_displayString(bodyName.type)}()` method which returns a Map.\n' - "It is programmer's responsibility to make sure the ${_displayString(bodyName.type)} is properly serialized"); + '${_displayString(bodyName.type)} must provide a `serialize${_displayString(bodyName.type)}()` method which returns a Map.\n' + "It is programmer's responsibility to make sure the ${_displayString(bodyName.type)} is properly serialized", + ); blocks.add( - declareFinal(dataVar) - .assign(refer(bodyName.displayName)) - .statement, + declareFinal( + dataVar, + ).assign(refer(bodyName.displayName)).statement, ); } else { blocks.add( declareFinal(dataVar) .assign( - literalMap(bodyExtras, refer('String'), refer('dynamic'))) + literalMap(bodyExtras, refer('String'), refer('dynamic')), + ) .statement, ); @@ -1980,8 +2038,9 @@ if (T != dynamic && } final bodyType = bodyName.type; - final genericArgumentFactories = - isGenericArgumentFactories(bodyType); + final genericArgumentFactories = isGenericArgumentFactories( + bodyType, + ); final typeArgs = bodyType is ParameterizedType ? bodyType.typeArguments @@ -2051,9 +2110,11 @@ if (T != dynamic && } if (bodyExtras.isNotEmpty || expandBodyExtras.isNotEmpty) { - blocks.add(declareFinal(dataVar) - .assign(literalMap(bodyExtras, refer('String'), refer('dynamic'))) - .statement); + blocks.add( + declareFinal(dataVar) + .assign(literalMap(bodyExtras, refer('String'), refer('dynamic'))) + .statement, + ); for (final item in expandBodyExtras.entries) { _generateParameterElement(item.key, blocks, dataVar); } @@ -2091,10 +2152,9 @@ if (T != dynamic && blocks.add( declareFinal(dataVar) .assign( - refer('FormData').newInstanceNamed( - 'fromMap', - [CodeExpression(Code(parts.keys.first.displayName))], - ), + refer('FormData').newInstanceNamed('fromMap', [ + CodeExpression(Code(parts.keys.first.displayName)), + ]), ) .statement, ); @@ -2102,13 +2162,14 @@ if (T != dynamic && } blocks.add( - declareFinal(dataVar) - .assign(refer('FormData').newInstance([])) - .statement, + declareFinal( + dataVar, + ).assign(refer('FormData').newInstance([])).statement, ); parts.forEach((p, r) { - final fieldName = r.peek('name')?.stringValue ?? + final fieldName = + r.peek('name')?.stringValue ?? r.peek('value')?.stringValue ?? p.displayName; final isFileField = _typeChecker(File).isAssignableFromType(p.type); @@ -2121,39 +2182,46 @@ if (T != dynamic && final fileNameValue = r.peek('fileName')?.stringValue; final fileName = fileNameValue != null ? literalString(fileNameValue) - : refer(p.displayName) - .property('path.split(Platform.pathSeparator).last'); - - final uploadFileInfo = refer('$MultipartFile.fromFileSync').call([ - refer(p.displayName).property('path'), - ], { - 'filename': fileName, - if (contentType != null) - 'contentType': refer('DioMediaType', 'package:dio/dio.dart') - .property('parse') - .call([literal(contentType)]), - }); - - final optionalFile = m.parameters + : refer( + p.displayName, + ).property('path.split(Platform.pathSeparator).last'); + + final uploadFileInfo = refer('$MultipartFile.fromFileSync').call( + [refer(p.displayName).property('path')], + { + 'filename': fileName, + if (contentType != null) + 'contentType': refer( + 'DioMediaType', + 'package:dio/dio.dart', + ).property('parse').call([literal(contentType)]), + }, + ); + + final optionalFile = + m.formalParameters .firstWhereOrNull((pp) => pp.displayName == p.displayName) ?.isOptional ?? false; - final returnCode = - refer(dataVar).property('files').property('add').call([ - refer('MapEntry').newInstance([literal(fieldName), uploadFileInfo]), - ]).statement; + final returnCode = refer(dataVar) + .property('files') + .property('add') + .call([ + refer( + 'MapEntry', + ).newInstance([literal(fieldName), uploadFileInfo]), + ]) + .statement; if (optionalFile) { final condition = refer(p.displayName).notEqualTo(literalNull).code; - blocks.addAll( - [ - const Code('if('), - condition, - const Code(') {'), - returnCode, - const Code('}'), - ], - ); + blocks.addAll([ + const Code('if('), + condition, + const Code(') {'), + returnCode, + const Code('}'), + ]); } else { blocks.add(returnCode); } @@ -2161,7 +2229,8 @@ if (T != dynamic && blocks.add(const Code('}')); } } else if (_displayString(p.type) == 'List') { - final optionalFile = m.parameters + final optionalFile = + m.formalParameters .firstWhereOrNull((pp) => pp.displayName == p.displayName) ?.isOptional ?? false; @@ -2171,27 +2240,25 @@ if (T != dynamic && : 'contentType: DioMediaType.parse(${literal(contentType)}),'; final returnCode = refer(dataVar).property('files').property('add').call([ - refer(''' - MapEntry( - '$fieldName', - MultipartFile.fromBytes(${p.displayName}, - - filename:${literal(fileName)}, - $conType - )) - '''), - ]).statement; + refer(''' +MapEntry( +'$fieldName', +MultipartFile.fromBytes(${p.displayName}, + +filename:${literal(fileName)}, + $conType + )) +'''), + ]).statement; if (optionalFile) { final condition = refer(p.displayName).notEqualTo(literalNull).code; - blocks.addAll( - [ - const Code('if('), - condition, - const Code(') {'), - returnCode, - const Code('}'), - ], - ); + blocks.addAll([ + const Code('if('), + condition, + const Code(') {'), + returnCode, + const Code('}'), + ]); } else { blocks.add(returnCode); } @@ -2207,13 +2274,13 @@ if (T != dynamic && blocks.add( refer(dataVar).property('files').property('addAll').call([ refer(''' - ${p.displayName}.map((i) => MapEntry( - '$fieldName', - MultipartFile.fromBytes(i, - filename:${literal(fileName)}, - $conType - ))) - '''), +${p.displayName}.map((i) => MapEntry( +'$fieldName', +MultipartFile.fromBytes(i, + filename:${literal(fileName)}, + $conType + ))) +'''), ]).statement, ); } else if (_isBasicType(innerType) || @@ -2237,14 +2304,14 @@ if (T != dynamic && } final nullableInfix = (p.type.nullabilitySuffix == NullabilitySuffix.question) - ? '?' - : ''; + ? '?' + : ''; blocks.add( refer(''' - ${p.displayName}$nullableInfix.forEach((i){ - $dataVar.fields.add(MapEntry(${literal(fieldName)},$value)); - }) - ''').statement, +${p.displayName}$nullableInfix.forEach((i){ + $dataVar.fields.add(MapEntry(${literal(fieldName)},$value)); +}) +''').statement, ); } else if (innerType != null && _typeChecker(File).isExactlyType(innerType)) { @@ -2257,13 +2324,13 @@ if (T != dynamic && blocks.add( refer(dataVar).property('files').property('addAll').call([ refer(''' - ${p.displayName}.map((i) => MapEntry( - '$fieldName', - MultipartFile.fromFileSync(i.path, - filename: i.path.split(Platform.pathSeparator).last, - $conType - ))) - '''), +${p.displayName}.map((i) => MapEntry( +'$fieldName', +MultipartFile.fromFileSync(i.path, + filename: i.path.split(Platform.pathSeparator).last, + $conType + ))) +'''), ]).statement, ); if (p.type.isNullable) { @@ -2286,15 +2353,15 @@ if (T != dynamic && if (p.type.isNullable) { blocks.add(const Code('}')); } - } else if (innerType?.element is ClassElement) { - final ele = innerType!.element! as ClassElement; + } else if (innerType?.element3 is ClassElement2) { + final ele = innerType!.element3! as ClassElement2; if (_missingToJson(ele)) { if (_isDateTime(p.type)) { final expr = [ if (p.type.nullabilitySuffix == NullabilitySuffix.question) - refer(p.displayName) - .nullSafeProperty('toIso8601String') - .call([]) + refer( + p.displayName, + ).nullSafeProperty('toIso8601String').call([]) else refer(p.displayName).property('toIso8601String').call([]), ]; @@ -2328,8 +2395,9 @@ if (T != dynamic && else if (_isEnum(p.type)) _hasToJson(p.type) ? refer(p.displayName) - .property('toJson') - .call([]).ifNullThen(refer(p.displayName)) + .property('toJson') + .call([]) + .ifNullThen(refer(p.displayName)) : refer(p.displayName) else refer(p.displayName).property('toString').call([]), @@ -2343,20 +2411,21 @@ if (T != dynamic && _typeChecker(BuiltMap).isExactlyType(p.type)) { blocks.add( refer(dataVar).property('fields').property('add').call([ - refer('MapEntry').newInstance( - [literal(fieldName), refer('jsonEncode(${p.displayName})')], - ), + refer('MapEntry').newInstance([ + literal(fieldName), + refer('jsonEncode(${p.displayName})'), + ]), ]).statement, ); - } else if (p.type.element is ClassElement) { - final ele = p.type.element! as ClassElement; + } else if (p.type.element3 is ClassElement2) { + final ele = p.type.element3! as ClassElement2; if (_missingToJson(ele)) { if (_isDateTime(p.type)) { final expr = [ if (p.type.nullabilitySuffix == NullabilitySuffix.question) - refer(p.displayName) - .nullSafeProperty('toIso8601String') - .call([]) + refer( + p.displayName, + ).nullSafeProperty('toIso8601String').call([]) else refer(p.displayName).property('toIso8601String').call([]), ]; @@ -2366,38 +2435,46 @@ if (T != dynamic && } } else { if (contentType != null) { - final uploadFileInfo = refer('$MultipartFile.fromString').call([ - refer( - "jsonEncode(${p.displayName}${p.type.nullabilitySuffix == NullabilitySuffix.question ? ' ?? {}' : ''})", - ), - ], { - 'contentType': refer('DioMediaType', 'package:dio/dio.dart') - .property('parse') - .call([literal(contentType)]), - }); - - final optionalFile = m.parameters + final uploadFileInfo = refer('$MultipartFile.fromString').call( + [ + refer( + "jsonEncode(${p.displayName}${p.type.nullabilitySuffix == NullabilitySuffix.question ? ' ?? {}' : ''})", + ), + ], + { + 'contentType': refer( + 'DioMediaType', + 'package:dio/dio.dart', + ).property('parse').call([literal(contentType)]), + }, + ); + + final optionalFile = + m.formalParameters .firstWhereOrNull((pp) => pp.displayName == p.displayName) ?.isOptional ?? false; - final returnCode = - refer(dataVar).property('files').property('add').call([ - refer('MapEntry') - .newInstance([literal(fieldName), uploadFileInfo]), - ]).statement; + final returnCode = refer(dataVar) + .property('files') + .property('add') + .call([ + refer( + 'MapEntry', + ).newInstance([literal(fieldName), uploadFileInfo]), + ]) + .statement; if (optionalFile) { - final condition = - refer(p.displayName).notEqualTo(literalNull).code; - blocks.addAll( - [ - const Code('if('), - condition, - const Code(') {'), - returnCode, - const Code('}'), - ], - ); + final condition = refer( + p.displayName, + ).notEqualTo(literalNull).code; + blocks.addAll([ + const Code('if('), + condition, + const Code(') {'), + returnCode, + const Code('}'), + ]); } else { blocks.add(returnCode); } @@ -2407,7 +2484,7 @@ if (T != dynamic && refer('MapEntry').newInstance([ literal(fieldName), refer( - "jsonEncode(${p.displayName}${p.type.nullabilitySuffix == NullabilitySuffix.question ? ' ?? {}' : ''})", + 'jsonEncode(${p.displayName}${p.type.nullabilitySuffix == NullabilitySuffix.question ? ' ?? {}' : ''})', ), ]), ]).statement, @@ -2417,8 +2494,9 @@ if (T != dynamic && } else { blocks.add( refer(dataVar).property('fields').property('add').call([ - refer('MapEntry') - .newInstance([literal(fieldName), refer(p.displayName)]), + refer( + 'MapEntry', + ).newInstance([literal(fieldName), refer(p.displayName)]), ]).statement, ); } @@ -2429,45 +2507,41 @@ if (T != dynamic && /// There is no body if (globalOptions.emptyRequestBody ?? false) { blocks.add( - declareFinal(dataVar) - .assign(literalMap({}, refer('String'), refer('dynamic'))) - .statement, + declareFinal( + dataVar, + ).assign(literalMap({}, refer('String'), refer('dynamic'))).statement, ); } else { blocks.add( - declareConst(dataVar, type: refer('Map?')) - .assign(literalNull) - .statement, + declareConst( + dataVar, + type: refer('Map?'), + ).assign(literalNull).statement, ); } } - Map _generateHeaders(MethodElement m) { + Map _generateHeaders(MethodElement2 m) { final headers = _getMethodAnnotations(m, retrofit.Headers) .map((e) => e.peek('value')) .map( - (value) => value?.mapValue.map( - (k, v) { - dynamic val; - if (v == null) { - val = null; - } else if (v.type?.isDartCoreBool ?? false) { - val = v.toBoolValue(); - } else if (v.type?.isDartCoreString ?? false) { - val = v.toStringValue(); - } else if (v.type?.isDartCoreDouble ?? false) { - val = v.toDoubleValue(); - } else if (v.type?.isDartCoreInt ?? false) { - val = v.toIntValue(); - } else { - val = v.toStringValue(); - } - return MapEntry( - k?.toStringValue() ?? 'null', - literal(val), - ); - }, - ), + (value) => value?.mapValue.map((k, v) { + dynamic val; + if (v == null) { + val = null; + } else if (v.type?.isDartCoreBool ?? false) { + val = v.toBoolValue(); + } else if (v.type?.isDartCoreString ?? false) { + val = v.toStringValue(); + } else if (v.type?.isDartCoreDouble ?? false) { + val = v.toDoubleValue(); + } else if (v.type?.isDartCoreInt ?? false) { + val = v.toIntValue(); + } else { + val = v.toStringValue(); + } + return MapEntry(k?.toStringValue() ?? 'null', literal(val)); + }), ) .fold>({}, (p, e) => p..addAll(e ?? {})); @@ -2500,7 +2574,7 @@ if (T != dynamic && return headers; } - Map _generateCache(MethodElement m) { + Map _generateCache(MethodElement2 m) { final cache = _getCacheAnnotation(m); final result = {}; if (cache != null && cache.toString() != '') { @@ -2511,8 +2585,9 @@ if (T != dynamic && final noStore = cache.peek('noStore')?.boolValue; final noTransform = cache.peek('noTransform')?.boolValue; final onlyIfCached = cache.peek('onlyIfCached')?.boolValue; - final other = (cache.peek('other')?.listValue ?? const []) - .map((e) => e.toStringValue()); + final other = (cache.peek('other')?.listValue ?? const []).map( + (e) => e.toStringValue(), + ); final otherResult = []; for (final element in other) { @@ -2553,7 +2628,7 @@ if (T != dynamic && return value?.stringValue; } if (value?.objectValue.isEnum ?? false) { - return value?.objectValue.variable?.displayName; + return value?.objectValue.variable2?.displayName; } if (value?.isList ?? false) { return value?.listValue @@ -2578,10 +2653,14 @@ if (T != dynamic && final fields = {}; final type = value!.objectValue.type; if (type is InterfaceType) { - for (final field in type.element.fields) { + for (final field in type.element3.fields2) { if (!field.isStatic) { - final fieldValue = value.peek(field.name); - fields[field.name] = _getFieldValue(fieldValue); + final name = field.name3; + if (name == null) { + continue; + } + final fieldValue = value.peek(name); + fields[name] = _getFieldValue(fieldValue); } } } @@ -2590,18 +2669,22 @@ if (T != dynamic && return null; } - Map _getMapFromTypedExtras(MethodElement m) { + Map _getMapFromTypedExtras(MethodElement2 m) { final annotations = _getMethodAnnotations(m, retrofit.TypedExtras); final allTypedExtras = {}; for (final annotation in annotations) { - final fields = annotation.objectValue.type?.element?.children - .whereType(); - for (final field in fields ?? []) { - final value = annotation.peek(field.name); + final fields = annotation.objectValue.type?.element3?.children2 + .whereType(); + for (final field in (fields ?? [])) { + final name = field.name3; + if (name == null) { + continue; + } + final value = annotation.peek(name); final fieldValue = _getFieldValue(value); if (fieldValue != null) { - allTypedExtras[field.name] = fieldValue; + allTypedExtras[name] = fieldValue; } } } @@ -2610,12 +2693,16 @@ if (T != dynamic && } void _generateParameterElement( - ParameterElement paramElement, List blocks, String dataVar) { + FormalParameterElement paramElement, + List blocks, + String dataVar, + ) { final bodyType = paramElement.type; final genericArgumentFactories = isGenericArgumentFactories(bodyType); - final typeArgs = - bodyType is ParameterizedType ? bodyType.typeArguments : []; + final typeArgs = bodyType is ParameterizedType + ? bodyType.typeArguments + : []; var toJsonCode = ''; if (typeArgs.isNotEmpty && genericArgumentFactories) { @@ -2624,7 +2711,7 @@ if (T != dynamic && if (paramElement.type.nullabilitySuffix != NullabilitySuffix.question) { blocks.add( refer('$dataVar.addAll').call([ - refer('${paramElement.displayName}.toJson($toJsonCode)') + refer('${paramElement.displayName}.toJson($toJsonCode)'), ]).statement, ); } else { @@ -2632,14 +2719,14 @@ if (T != dynamic && refer('$dataVar.addAll').call([ refer( '${paramElement.displayName}?.toJson($toJsonCode) ?? {}', - ) + ), ]).statement, ); } } void _generateExtra( - MethodElement m, + MethodElement2 m, List blocks, String localExtraVar, ) { @@ -2674,8 +2761,8 @@ if (T != dynamic && ), ) .fold>({}, (p, e) { - return p..addAll(e ?? {}); - }) + return p..addAll(e ?? {}); + }) ..addAll(_getMapFromTypedExtras(m)), refer('String'), refer('dynamic'), @@ -2726,12 +2813,11 @@ if (T != dynamic && } } - bool _missingToJson(ClassElement ele) { + bool _missingToJson(ClassElement2 ele) { switch (clientAnnotation.parser) { case retrofit.Parser.JsonSerializable: case retrofit.Parser.DartJsonMapper: - final toJson = - ele.augmented.lookUpMethod(name: 'toJson', library: ele.library); + final toJson = ele.lookUpMethod2(name: 'toJson', library: ele.library2); return toJson == null; case retrofit.Parser.MapSerializable: case retrofit.Parser.FlutterCompute: @@ -2739,18 +2825,18 @@ if (T != dynamic && } } - bool _missingSerialize(CompilationUnitElement ele, DartType type) { + bool _missingSerialize(LibraryFragment ele, DartType type) { switch (clientAnnotation.parser) { case retrofit.Parser.JsonSerializable: case retrofit.Parser.DartJsonMapper: case retrofit.Parser.MapSerializable: return false; case retrofit.Parser.FlutterCompute: - return !ele.functions.any( + return !ele.functions2.any( (element) => - element.name == 'serialize${_displayString(type)}' && - element.parameters.length == 1 && - _displayString(element.parameters[0].type) == + element.name2 == 'serialize${_displayString(type)}' && + element.formalParameters.length == 1 && + _displayString(element.formalParameters[0].element.type) == _displayString(type), ); } @@ -2762,36 +2848,30 @@ if (T != dynamic && DartType? returnType, Code child, ) { - blocks.addAll( - [ - declareVar( - _valueVar, - type: refer(_displayString(returnType, withNullability: true)), - late: true, - ).statement, - const Code('try {'), - child, - const Code('} on Object catch (e, s) {'), - const Code('$_errorLoggerVar?.logError(e, s, $_optionsVar);'), - const Code('rethrow;'), - const Code('}'), - ], - ); + blocks.addAll([ + declareVar( + _valueVar, + type: refer(_displayString(returnType, withNullability: true)), + late: true, + ).statement, + const Code('try {'), + child, + const Code('} on Object catch (e, s) {'), + const Code('$_errorLoggerVar?.logError(e, s, $_optionsVar);'), + const Code('rethrow;'), + const Code('}'), + ]); } } -Builder generatorFactoryBuilder(BuilderOptions options) => SharedPartBuilder( - [RetrofitGenerator(RetrofitOptions.fromOptions(options))], - 'retrofit', - ); +Builder generatorFactoryBuilder(BuilderOptions options) => SharedPartBuilder([ + RetrofitGenerator(RetrofitOptions.fromOptions(options)), +], 'retrofit'); /// Returns `$revived($args $kwargs)`, this won't have ending semi-colon (`;`). /// [object] must not be null. /// [object] is assumed to be a constant. -String revivedLiteral( - Object object, { - DartEmitter? dartEmitter, -}) { +String revivedLiteral(Object object, {DartEmitter? dartEmitter}) { dartEmitter ??= DartEmitter(useNullSafetySyntax: true); ArgumentError.checkNotNull(object, 'object'); @@ -2820,7 +2900,8 @@ String revivedLiteral( /// If this is a class instantiation then `location[1]` will be populated /// with the class name if (location.length > 1) { - instantiation = location[1] + + instantiation = + location[1] + (revived.accessor.isNotEmpty ? '.${revived.accessor}' : ''); } else { /// Getters, Setters, Methods can't be declared as constants so this @@ -2858,7 +2939,6 @@ String revivedLiteral( if (constant.isList) { return literalList(constant.listValue.map(objectToSpec)); - // return literal(constant.listValue); } if (constant.isMap) { @@ -2868,12 +2948,10 @@ String revivedLiteral( constant.mapValue.values.map(objectToSpec), ), ); - // return literal(constant.mapValue); } if (constant.isSymbol) { return Code('Symbol(${constant.symbolValue})'); - // return literal(constant.symbolValue); } if (constant.isNull) { @@ -2890,8 +2968,10 @@ String revivedLiteral( /// Perhaps an object instantiation? /// In that case, try initializing it and remove `const` to reduce noise - final revived = revivedLiteral(constant.revive(), dartEmitter: dartEmitter) - .replaceFirst('const ', ''); + final revived = revivedLiteral( + constant.revive(), + dartEmitter: dartEmitter, + ).replaceFirst('const ', ''); return Code(revived); } @@ -2912,11 +2992,11 @@ String revivedLiteral( extension DartTypeStreamAnnotation on DartType { bool get isDartAsyncStream { - final e = element != null ? null : element! as ClassElement; + final e = element3 != null ? null : element3! as ClassElement2; if (e == null) { return false; } - return e.name == 'Stream' && e.library.isDartAsync; + return e.name3 == 'Stream' && e.library2.isDartAsync; } } @@ -2927,7 +3007,7 @@ String _displayString(DartType? e, {bool withNullability = false}) { } else { return e!.getDisplayString(); } - } on TypeError { + } on Object { if (!withNullability) { return e!.toStringNonNullable(); } else { @@ -2949,9 +3029,7 @@ extension DartTypeExt on DartType { } extension DartObjectX on DartObject? { - bool get isEnum { - return this?.type?.element?.kind.name == 'ENUM'; - } + bool get isEnum => this?.type?.element3?.kind.name == 'ENUM'; ConstantReader? toConstantReader() { if (this == null) { @@ -2967,28 +3045,13 @@ extension ReferenceExt on Reference { Reference asNoNullIf({required bool returnNullable}) => returnNullable ? this : asNoNull(); - Expression propertyIf({ - required bool thisNullable, - required String name, - }) => + Expression propertyIf({required bool thisNullable, required String name}) => thisNullable ? nullSafeProperty(name) : asNoNull().property(name); Expression conditionalIsNullIf({ required bool thisNullable, required Expression whenFalse, - }) => - thisNullable - ? equalTo(literalNull).conditional(literalNull, whenFalse) - : whenFalse; -} - -extension IterableExtension on Iterable { - T? firstWhereOrNull(bool Function(T element) test) { - for (final element in this) { - if (test(element)) { - return element; - } - } - return null; - } + }) => thisNullable + ? equalTo(literalNull).conditional(literalNull, whenFalse) + : whenFalse; } diff --git a/generator/pubspec.yaml b/generator/pubspec.yaml index e75627cad..f2aae8d6c 100644 --- a/generator/pubspec.yaml +++ b/generator/pubspec.yaml @@ -8,22 +8,24 @@ topics: - rest - retrofit - codegen -version: 9.7.0 +version: 10.0.0 environment: - sdk: '>=3.6.0 <4.0.0' + sdk: '>=3.8.0 <4.0.0' dependencies: - analyzer: ^7.2.0 - build: ^2.5.4 + analyzer: '>=7.5.9 <9.0.0' + build: '>=2.5.4 <4.0.0' built_collection: ^5.1.1 code_builder: ^4.10.1 - dart_style: ^3.0.1 - dio: ^5.2.0 + collection: ^1.19.1 + dart_style: ^3.1.0 + dio: ^5.8.0 protobuf: ^4.1.0 - source_gen: ^2.0.0 retrofit: ^4.6.0 + source_gen: ^3.0.0-dev +# source_gen: '>=2.0.0 <4.0.0' dev_dependencies: lints: any - source_gen_test: ^1.1.1 + source_gen_test: ^1.2.0 test: ^1.25.0 diff --git a/generator/test/src/generator_test_src.dart b/generator/test/src/generator_test_src.dart index ef7d16a60..e6d6bfb23 100644 --- a/generator/test/src/generator_test_src.dart +++ b/generator/test/src/generator_test_src.dart @@ -15,15 +15,12 @@ class MockCallAdapter1 extends CallAdapter, Future>> { } } -@ShouldGenerate( - ''' +@ShouldGenerate(''' @override Future>> getUser() { return MockCallAdapter1>().adapt(() => _getUser()); } -''', - contains: true, -) +''', contains: true) @RestApi() abstract class TestCallAdapter1 { @UseCallAdapter(MockCallAdapter1) @@ -41,15 +38,12 @@ class MockCallAdapter2 } } -@ShouldGenerate( - ''' +@ShouldGenerate(''' @override Future> getUser() { return MockCallAdapter2().adapt(() => _getUser()); } -''', - contains: true, -) +''', contains: true) @RestApi() abstract class TestCallAdapter2 { @UseCallAdapter(MockCallAdapter2) @@ -66,8 +60,7 @@ class MockCallAdapter3 extends CallAdapter, Flow> { } } -@ShouldGenerate( - ''' +@ShouldGenerate(''' Future _getUser() async { final _extra = {}; final queryParameters = {}; @@ -93,9 +86,7 @@ class MockCallAdapter3 extends CallAdapter, Flow> { } return _value; } -''', - contains: true, -) +''', contains: true) @RestApi() abstract class TestCallAdapter3 { @UseCallAdapter(MockCallAdapter3) @@ -137,8 +128,7 @@ class DummyTypedExtras extends TypedExtras { final bool? canFly; } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _extra = { 'id': '1234', 'config': { @@ -151,9 +141,7 @@ class DummyTypedExtras extends TypedExtras { 'sources': {'internet', 'local'}, 'shouldProceed': true, }; -''', - contains: true, -) +''', contains: true) @RestApi() abstract class TypedExtrasTest { @DummyTypedExtras( @@ -164,14 +152,8 @@ abstract class TypedExtrasTest { shouldReplace: true, subConfig: {'date': '24-11-2025'}, ), - fileTypes: [ - FileType.mp3, - FileType.mp4, - ], - sources: { - 'internet', - 'local', - }, + fileTypes: [FileType.mp3, FileType.mp4], + sources: {'internet', 'local'}, shouldProceed: true, ) @GET('path') @@ -190,8 +172,7 @@ class AnotherDummyTypedExtras extends TypedExtras { final String id; } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _extra = { 'bacon': 'sausage', 'id': '12345', @@ -207,9 +188,7 @@ class AnotherDummyTypedExtras extends TypedExtras { 'peanutButter': 'Jelly', 'mac': 'Cheese', }; -''', - contains: true, -) +''', contains: true) @RestApi() abstract class MultipleTypedExtrasTest { @DummyTypedExtras( @@ -220,28 +199,17 @@ abstract class MultipleTypedExtrasTest { shouldReplace: true, subConfig: {'date': '24-11-2025'}, ), - fileTypes: [ - FileType.mp3, - FileType.mp4, - ], - sources: { - 'internet', - 'local', - }, + fileTypes: [FileType.mp3, FileType.mp4], + sources: {'internet', 'local'}, shouldProceed: true, ) - @AnotherDummyTypedExtras( - peanutButter: 'Jelly', - mac: 'Cheese', - id: '12345', - ) + @AnotherDummyTypedExtras(peanutButter: 'Jelly', mac: 'Cheese', id: '12345') @Extra({'bacon': 'sausage'}) @GET('path') Future list(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' // ignore_for_file: unnecessary_brace_in_string_interps,no_leading_underscores_for_local_identifiers,unused_element,unnecessary_string_interpolations,unused_element_parameter class _RestClient implements RestClient { @@ -252,14 +220,11 @@ class _RestClient implements RestClient { String? baseUrl; final ParseErrorLogger? errorLogger; -''', - contains: true, -) +''', contains: true) @RestApi() abstract class RestClient {} -@ShouldGenerate( - ''' +@ShouldGenerate(''' class _BaseUrl implements BaseUrl { _BaseUrl(this._dio, {this.baseUrl, this.errorLogger}) { baseUrl ??= 'http://httpbin.org/'; @@ -270,18 +235,13 @@ class _BaseUrl implements BaseUrl { String? baseUrl; final ParseErrorLogger? errorLogger; -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'http://httpbin.org/') abstract class BaseUrl {} -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _extra = {}; -''', - contains: true, -) +''', contains: true) @RestApi() abstract class EmptyExtras { @GET('/list/') @@ -289,12 +249,9 @@ abstract class EmptyExtras { Future list(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _extra = {'key': 'value'}; -''', - contains: true, -) +''', contains: true) @RestApi() abstract class ExtrasWithPrimitiveValues { @GET('/list/') @@ -302,12 +259,9 @@ abstract class ExtrasWithPrimitiveValues { Future list(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _extra = {'key': 'value', 'key2': 'value2'}; -''', - contains: true, -) +''', contains: true) @RestApi() abstract class MultipleExtrasWithPrimitiveValues { @GET('/list/') @@ -316,12 +270,9 @@ abstract class MultipleExtrasWithPrimitiveValues { Future list(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _extra = {'key': CustomConstant()}; -''', - contains: true, -) +''', contains: true) @RestApi() abstract class ExtrasWithCustomConstant { @GET('/list/') @@ -329,60 +280,44 @@ abstract class ExtrasWithCustomConstant { Future list(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _extra = {}; _extra.addAll(extras ?? {}); -''', - contains: true, -) +''', contains: true) @RestApi() abstract class TestExtrasWithNullable { @GET('/list/') Future list(@Extras() Map? extras); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _extra = {'key': 'value'}; _extra.addAll(extras); -''', - contains: true, -) +''', contains: true) @RestApi() abstract class TestExtrasWithMap { @GET('/list/') @Extra({'key': 'value'}) - Future list( - @Extras() Map extras, - ); + Future list(@Extras() Map extras); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _extra = {}; _extra.addAll(u.toJson()); -''', - contains: true, -) +''', contains: true) @RestApi() abstract class TestExtrasWithObject { @GET('/list/') - Future list( - @Extras() User u, - ); + Future list(@Extras() User u); } class CustomConstant { const CustomConstant(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _headers = {}; -''', - contains: true, -) +''', contains: true) @RestApi() abstract class EmptyHeaders { @GET('/list/') @@ -390,12 +325,9 @@ abstract class EmptyHeaders { Future list(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _headers = {r'key': 'value'}; -''', - contains: true, -) +''', contains: true) @RestApi() abstract class HeadersWithPrimitiveValues { @GET('/list/') @@ -403,12 +335,9 @@ abstract class HeadersWithPrimitiveValues { Future list(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _headers = {r'key': 'value', r'key2': 'value2'}; -''', - contains: true, -) +''', contains: true) @RestApi() abstract class MultipleHeadersWithPrimitiveValues { @GET('/list/') @@ -417,60 +346,45 @@ abstract class MultipleHeadersWithPrimitiveValues { Future list(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' Options(method: 'GET', headers: _headers, extra: _extra) -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class HttpGetTest { @GET('/get') Future ip(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' Options(method: 'POST', headers: _headers, extra: _extra) -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class HttpPostTest { @POST('/post') Future ip(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' Options(method: 'PUT', headers: _headers, extra: _extra) -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class HttpPutTest { @PUT('/put') Future ip(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' Options(method: 'DELETE', headers: _headers, extra: _extra) -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class HttpDeleteTest { @DELETE('/delete') Future ip(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' Options(method: 'PATCH', headers: _headers, extra: _extra) -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class HttpPatchTest { @PATCH('/delete') @@ -488,10 +402,7 @@ abstract class FormUrlEncodedTest { Future ip(); } -@ShouldGenerate( - "contentType: 'multipart/form-data'", - contains: true, -) +@ShouldGenerate("contentType: 'multipart/form-data'", contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class MultipartTest { @POST('/get') @@ -508,10 +419,7 @@ abstract class TwoContentTypeAnnotationOnSameMethodTest { Future ip(); } -@ShouldGenerate( - r'/image/${imageType}/${id}_XL.png', - contains: true, -) +@ShouldGenerate(r'/image/${imageType}/${id}_XL.png', contains: true) @RestApi() abstract class PathTest { @GET('/image/{imageType}/{id}_XL.png') @@ -521,10 +429,7 @@ abstract class PathTest { ); } -@ShouldGenerate( - r'/image/${imageType}/${id}/${id}_XL.png', - contains: true, -) +@ShouldGenerate(r'/image/${imageType}/${id}/${id}_XL.png', contains: true) @RestApi() abstract class MultiplePathTest { @GET('/image/{imageType}/{id}/{id}_XL.png') @@ -536,8 +441,7 @@ abstract class MultiplePathTest { enum ImageType { icon, large } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _data = FormData(); _data.files.add( MapEntry( @@ -548,17 +452,14 @@ enum ImageType { icon, large } ), ), ); -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class FilePartTest { @POST('/profile') Future setProfile(@Part() File image); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _data = FormData(); _data.files.add( MapEntry( @@ -569,9 +470,7 @@ abstract class FilePartTest { ), ), ); -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class FilePartWithCustomNameTest { @POST('/profile') @@ -580,36 +479,29 @@ abstract class FilePartWithCustomNameTest { ); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _data = FormData(); _data.files.addAll(images.map((i) => MapEntry('images', i))); -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class FilePartWithMultipartListTest { @POST('/profile') Future setProfile(@Part() List images); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _data = FormData(); if (images != null) { _data.files.addAll(images.map((i) => MapEntry('images', i))); } -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class FilePartWithNullableMultipartListTest { @POST('/profile') Future setProfile(@Part() List? images); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _data = FormData(); _data.files.add( MapEntry( @@ -620,17 +512,14 @@ abstract class FilePartWithNullableMultipartListTest { ), ), ); - ''', - contains: true, -) + ''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class UploadFileInfoPartTest { @POST('/profile') Future setProfile(@Part() File image); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late User _value; try { _value = User.fromJson(_result.data!); @@ -639,17 +528,14 @@ abstract class UploadFileInfoPartTest { rethrow; } return _value; -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class GenericCast { @POST('/users/1') Future getUser(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late User? _value; try { _value = _result.data == null ? null : User.fromJson(_result.data!); @@ -658,17 +544,14 @@ abstract class GenericCast { rethrow; } return _value; -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class NullableGenericCast { @POST('/users/1') Future getUser(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late User _value; try { _value = User.fromJson(_result.data!); @@ -677,9 +560,7 @@ abstract class NullableGenericCast { rethrow; } yield _value; -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class StreamReturnType { @POST('/users/1') @@ -688,8 +569,7 @@ abstract class StreamReturnType { enum TestEnum { A, B } -@ShouldGenerate( - r''' +@ShouldGenerate(r''' late TestEnum _value; try { _value = TestEnum.values.firstWhere( @@ -702,26 +582,18 @@ enum TestEnum { A, B } errorLogger?.logError(e, s, _options); rethrow; } -''', - contains: true, -) +''', contains: true) @RestApi() abstract class EnumReturnType { @GET('/') Future getTestEnum(); } -enum EnumParam { - enabled, - disabled, -} +enum EnumParam { enabled, disabled } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final queryParameters = {r'test': status}; -''', - contains: true, -) +''', contains: true) @RestApi() abstract class TestQueryParamEnum { @GET('/test') @@ -734,15 +606,13 @@ enum FromJsonEnum { const FromJsonEnum(this.json); - factory FromJsonEnum.fromJson(String json) => values.firstWhere( - (e) => e.json == json, - ); + factory FromJsonEnum.fromJson(String json) => + values.firstWhere((e) => e.json == json); final String json; } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late FromJsonEnum _value; try { _value = FromJsonEnum.fromJson(_result.data!); @@ -751,9 +621,7 @@ enum FromJsonEnum { rethrow; } return _value; -''', - contains: true, -) +''', contains: true) @RestApi() abstract class EnumFromJsonReturnType { @GET('/') @@ -762,8 +630,7 @@ abstract class EnumFromJsonReturnType { enum ToJsonEnum { plus(1), - minus(-1), - ; + minus(-1); const ToJsonEnum(this.value); @@ -772,24 +639,18 @@ enum ToJsonEnum { int toJson() => value; } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final queryParameters = {r'test': status?.toJson()}; -''', - contains: true, -) +''', contains: true) @RestApi() abstract class TestQueryParamEnumToJson { @GET('/test') Future getTest(@Query('test') ToJsonEnum? status); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' Stream getUser() async* { -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class StreamReturnModifier { @POST('/users/1') @@ -799,7 +660,8 @@ abstract class StreamReturnModifier { class UserExtraInfo { const UserExtraInfo(); - factory UserExtraInfo.fromJson(Map json) => + // ignore: avoid_unused_constructor_parameters + factory UserExtraInfo.fromJson(Map json) => const UserExtraInfo(); Map toJson() => {}; @@ -853,8 +715,7 @@ abstract interface class AbstractUser with AbstractUserMixin { Map serializeUser(User object) => object.toJson(); -@ShouldGenerate( - ''' +@ShouldGenerate(''' late String _value; try { _value = _result.data!; @@ -863,17 +724,14 @@ Map serializeUser(User object) => object.toJson(); rethrow; } return _value; -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class GenericCastBasicType { @POST('/users/1') Future getUser(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late String? _value; try { _value = _result.data; @@ -882,91 +740,65 @@ abstract class GenericCastBasicType { rethrow; } return _value; -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class NullableGenericCastBasicType { @POST('/users/1') Future getUser(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _data = {}; _data.addAll(user.toJson()); -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class TestObjectBody { @POST('/users') Future createUser(@Body() User user); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' Future createUser({required dynamic user}) async { -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class TestDynamicRequiredBody { @POST('/users') - Future createUser({ - @Body() required dynamic user, - }); + // ignore: avoid_annotating_with_dynamic + Future createUser({@Body() required dynamic user}); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' Future createUser({dynamic user}) async { -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class TestDynamicBody { @POST('/users') - Future createUser({ - @Body() dynamic user, - }); + // ignore: avoid_annotating_with_dynamic + Future createUser({@Body() dynamic user}); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _data = {'user_id': userId}; -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class TestObjectSingleBodyExtra { @POST('/users') - Future createUser( - @BodyExtra('user_id') String userId, - ); + Future createUser(@BodyExtra('user_id') String userId); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _data = {'user_id': userId}; -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class TestObjectSingleBodyExtra1 { @POST('/users') - Future createUser({ - @BodyExtra('user_id') required String userId, - }); + Future createUser({@BodyExtra('user_id') required String userId}); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _data = {'update_timestamp': timestamp}; _data.addAll(user.toJson()); -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class TestObjectBodyExtra { @POST('/users') @@ -976,15 +808,12 @@ abstract class TestObjectBodyExtra { }); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _data = { 'user_name': userName, 'update_timestamp': timestamp, }; -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class TestObjectBodyExtraWithoutBody { @POST('/users') @@ -994,13 +823,10 @@ abstract class TestObjectBodyExtraWithoutBody { }); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _data = {'update_timestamp': timestamp}; _data.addAll(user?.toJson() ?? {}); -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class TestObjectBodyExtraOptional { @POST('/users') @@ -1010,14 +836,11 @@ abstract class TestObjectBodyExtraOptional { }); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _data = {}; _data.addAll(user.toJson()); _data.addAll(extraInfo.toJson()); -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class TestObjectBodyExtraMultiExpandObject { @POST('/users') @@ -1027,61 +850,46 @@ abstract class TestObjectBodyExtraMultiExpandObject { }); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _data = {}; _data.addAll(user?.toJson() ?? {}); -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class TestObjectBodyNullable { @POST('/users') Future createUser({@Body() User? user}); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _data = {}; _data.addAll(user.toJson()); -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class TestAbstractObjectBody { @POST('/users') Future createUser(@Body() AbstractUser user); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _data = {}; _data.addAll(user?.toJson() ?? {}); -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class TestAbstractObjectBodyNullable { @POST('/users') Future createUser({@Body() AbstractUser? user}); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final queryParameters = {r'u': u.toJson()}; queryParameters.addAll(user1.toJson()); queryParameters.addAll(user2.toJson()); -''', - contains: true, -) -@ShouldGenerate( - ''' +''', contains: true) +@ShouldGenerate(''' final queryParameters = {r'u': u.toJson()}; queryParameters.addAll(user3?.toJson() ?? {}); queryParameters.addAll(user4?.toJson() ?? {}); -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class TestObjectQueries { @POST('/users') @@ -1105,12 +913,9 @@ class CustomObject { final String id; } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final queryParameters = {r'test': date?.toIso8601String()}; -''', - contains: true, -) +''', contains: true) @RestApi() abstract class TestQueryParamDateTime { @GET('/test') @@ -1132,8 +937,7 @@ abstract class TestCustomObjectBody { Future createCustomObject(@Body() CustomObject customObject); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late Map> _value; try { _value = _result.data!.map( @@ -1150,17 +954,14 @@ abstract class TestCustomObjectBody { } return _value; } -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class TestMapBody { @GET('/xx') Future>> getResult(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late Map>? _value; try { _value = _result.data?.map( @@ -1177,17 +978,14 @@ abstract class TestMapBody { } return _value; } -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class NullableTestMapBody { @GET('/xx') Future>?> getResult(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late Map _value; try { _value = _result.data!.map( @@ -1199,17 +997,14 @@ abstract class NullableTestMapBody { } return _value; } -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class TestMapBody2 { @GET('/xx') Future> getResult(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late Map? _value; try { _value = _result.data?.map( @@ -1221,17 +1016,14 @@ abstract class TestMapBody2 { } return _value; } -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class NullableTestMapBody2 { @GET('/xx') Future?> getResult(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late List _value; try { _value = _result.data!.cast(); @@ -1240,17 +1032,14 @@ abstract class NullableTestMapBody2 { rethrow; } return _value; -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class TestBasicListString { @GET('/xx') Future> getResult(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late List? _value; try { _value = _result.data?.cast(); @@ -1259,17 +1048,14 @@ abstract class TestBasicListString { rethrow; } return _value; -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class NullableTestBasicListString { @GET('/xx') Future?> getResult(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late List _value; try { _value = _result.data!.cast(); @@ -1278,17 +1064,14 @@ abstract class NullableTestBasicListString { rethrow; } return _value; -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class TestBasicListBool { @GET('/xx') Future> getResult(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late List? _value; try { _value = _result.data?.cast(); @@ -1297,17 +1080,14 @@ abstract class TestBasicListBool { rethrow; } return _value; -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class NullableTestBasicListBool { @GET('/xx') Future?> getResult(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late List _value; try { _value = _result.data!.cast(); @@ -1316,17 +1096,14 @@ abstract class NullableTestBasicListBool { rethrow; } return _value; -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class TestBasicListInt { @GET('/xx') Future> getResult(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late List? _value; try { _value = _result.data?.cast(); @@ -1335,17 +1112,14 @@ abstract class TestBasicListInt { rethrow; } return _value; -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class NullableTestBasicListInt { @GET('/xx') Future?> getResult(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late List _value; try { _value = _result.data!.cast(); @@ -1354,17 +1128,14 @@ abstract class NullableTestBasicListInt { rethrow; } return _value; -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class TestBasicListDouble { @GET('/xx') Future> getResult(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late List? _value; try { _value = _result.data?.cast(); @@ -1373,19 +1144,14 @@ abstract class TestBasicListDouble { rethrow; } return _value; -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class NullableTestBasicListDouble { @GET('/xx') Future?> getResult(); } -@ShouldGenerate( - 'cancelToken: cancelToken', - contains: true, -) +@ShouldGenerate('cancelToken: cancelToken', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class TestCancelToken { @POST('/users') @@ -1395,10 +1161,7 @@ abstract class TestCancelToken { ); } -@ShouldGenerate( - 'onSendProgress: onSendProgress', - contains: true, -) +@ShouldGenerate('onSendProgress: onSendProgress', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class TestSendProgress { @POST('/users') @@ -1408,10 +1171,7 @@ abstract class TestSendProgress { ); } -@ShouldGenerate( - 'onReceiveProgress: onReceiveProgress', - contains: true, -) +@ShouldGenerate('onReceiveProgress: onReceiveProgress', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class TestReceiveProgress { @POST('/users') @@ -1421,56 +1181,43 @@ abstract class TestReceiveProgress { ); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' Options(method: 'HEAD', headers: _headers, extra: _extra) -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class TestHeadMethod { @HEAD('/') Future testHeadMethod(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' Options(method: 'OPTIONS', headers: _headers, extra: _extra) -''', - contains: true, -) +''', contains: true) @RestApi(baseUrl: 'https://httpbin.org/') abstract class TestOptionsMethod { @OPTIONS('/') Future testOptionsMethod(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final httpResponse = HttpResponse(null, _result); -''', - contains: true, -) +''', contains: true) @RestApi() abstract class TestHttpResponseVoid { @GET('/') Future> noResponseData(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final httpResponse = HttpResponse(_value, _result); -''', - contains: true, -) +''', contains: true) @RestApi() abstract class TestHttpResponseObject { @GET('/') Future>> responseWithObject(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late List _value; try { _value = _result.data!.cast(); @@ -1480,17 +1227,14 @@ abstract class TestHttpResponseObject { } final httpResponse = HttpResponse(_value, _result); return httpResponse; -''', - contains: true, -) +''', contains: true) @RestApi() abstract class TestHttpResponseArray { @GET('/') Future>> responseWithArray(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _data = FormData(); _data.files.addAll( files.map( @@ -1503,11 +1247,8 @@ abstract class TestHttpResponseArray { ), ), ); -''', - contains: true, -) -@ShouldGenerate( - ''' +''', contains: true) +@ShouldGenerate(''' final _data = FormData(); if (files != null) { _data.files.addAll( @@ -1522,11 +1263,8 @@ abstract class TestHttpResponseArray { ), ); } -''', - contains: true, -) -@ShouldGenerate( - ''' +''', contains: true) +@ShouldGenerate(''' final _data = FormData(); if (file != null) { _data.files.add( @@ -1539,9 +1277,7 @@ abstract class TestHttpResponseArray { ), ); } -''', - contains: true, -) +''', contains: true) @RestApi() abstract class TestFileList { @POST('/') @@ -1559,8 +1295,7 @@ enum TestEnumWithToJson { // @JsonValue('A') A('A'), // @JsonValue('B') - B('B'), - ; + B('B'); const TestEnumWithToJson(this.json); @@ -1577,35 +1312,22 @@ enum TestEnumWithToJson { "_data.fields.add(MapEntry('item', jsonEncode(user)));", contains: true, ) -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _data = FormData(); mapList.forEach((i) { _data.fields.add(MapEntry('mapList', jsonEncode(i))); }); -''', - contains: true, -) -@ShouldGenerate( - ''' +''', contains: true) +@ShouldGenerate(''' final _data = FormData.fromMap(map); -''', - contains: true, -) -@ShouldGenerate( - ''' +''', contains: true) +@ShouldGenerate(''' _data.fields.add(MapEntry('enumValue', enumValue)); -''', - contains: true, -) -@ShouldGenerate( - ''' +''', contains: true) +@ShouldGenerate(''' _data.fields.add(MapEntry('enumValue', enumValue.toJson() ?? enumValue)); -''', - contains: true, -) -@ShouldGenerate( - ''' +''', contains: true) +@ShouldGenerate(''' final _data = FormData(); _data.fields.add(MapEntry('a', a.toString())); _data.fields.add(MapEntry('b', b.toString())); @@ -1613,9 +1335,7 @@ _data.fields.add(MapEntry('enumValue', enumValue)); _data.fields.add(MapEntry('c', c)); } _data.fields.add(MapEntry('d', d.toString())); -''', - contains: true, -) +''', contains: true) @RestApi() abstract class TestModelList { @POST('/') @@ -1645,8 +1365,7 @@ abstract class TestModelList { }); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final newOptions = newRequestOptions(options); newOptions.extra.addAll(_extra); newOptions.headers.addAll(_dio.options.headers); @@ -1657,11 +1376,8 @@ abstract class TestModelList { queryParameters: queryParameters, path: '', )..data = _data; -''', - contains: true, -) -@ShouldGenerate( - ''' +''', contains: true) +@ShouldGenerate(''' RequestOptions newRequestOptions(Object? options) { if (options is RequestOptions) { return options as RequestOptions; @@ -1686,38 +1402,29 @@ abstract class TestModelList { } return RequestOptions(path: ''); } -''', - contains: true, -) +''', contains: true) @RestApi() abstract class CustomOptions { @GET('') Future testOptions(@DioOptions() Options options); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late User _value; try { _value = JsonMapper.fromMap(_result.data!)!; } on Object catch (e, s) { errorLogger?.logError(e, s, _options); - rethrow; - } -''', - contains: true, -) -@RestApi( - baseUrl: 'https://httpbin.org/', - parser: Parser.DartJsonMapper, -) + rethrow; + } +''', contains: true) +@RestApi(baseUrl: 'https://httpbin.org/', parser: Parser.DartJsonMapper) abstract class JsonMapperGenericCast { @POST('/xx') Future getUser(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late User? _value; try { _value = _result.data == null @@ -1727,20 +1434,14 @@ abstract class JsonMapperGenericCast { errorLogger?.logError(e, s, _options); rethrow; } -''', - contains: true, -) -@RestApi( - baseUrl: 'https://httpbin.org/', - parser: Parser.DartJsonMapper, -) +''', contains: true) +@RestApi(baseUrl: 'https://httpbin.org/', parser: Parser.DartJsonMapper) abstract class NullableJsonMapperGenericCast { @POST('/xx') Future getUser(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late List _value; try { _value = _result.data! @@ -1752,20 +1453,14 @@ abstract class NullableJsonMapperGenericCast { errorLogger?.logError(e, s, _options); rethrow; } -''', - contains: true, -) -@RestApi( - baseUrl: 'https://httpbin.org/', - parser: Parser.DartJsonMapper, -) +''', contains: true) +@RestApi(baseUrl: 'https://httpbin.org/', parser: Parser.DartJsonMapper) abstract class JsonMapperTestListBody { @GET('/xx') Future> getResult(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late Map> _value; try { _value = _result.data!.map( @@ -1780,20 +1475,14 @@ abstract class JsonMapperTestListBody { errorLogger?.logError(e, s, _options); rethrow; } -''', - contains: true, -) -@RestApi( - baseUrl: 'https://httpbin.org/', - parser: Parser.DartJsonMapper, -) +''', contains: true) +@RestApi(baseUrl: 'https://httpbin.org/', parser: Parser.DartJsonMapper) abstract class JsonMapperTestMapBody { @GET('/xx') Future>> getResult(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late Map _value; try { _value = _result.data!.map( @@ -1804,20 +1493,14 @@ abstract class JsonMapperTestMapBody { errorLogger?.logError(e, s, _options); rethrow; } -''', - contains: true, -) -@RestApi( - baseUrl: 'https://httpbin.org/', - parser: Parser.DartJsonMapper, -) +''', contains: true) +@RestApi(baseUrl: 'https://httpbin.org/', parser: Parser.DartJsonMapper) abstract class JsonMapperTestMapBody2 { @GET('/xx') Future> getResult(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late User _value; try { _value = User.fromMap(_result.data!); @@ -1825,20 +1508,14 @@ abstract class JsonMapperTestMapBody2 { errorLogger?.logError(e, s, _options); rethrow; } -''', - contains: true, -) -@RestApi( - baseUrl: 'https://httpbin.org/', - parser: Parser.MapSerializable, -) +''', contains: true) +@RestApi(baseUrl: 'https://httpbin.org/', parser: Parser.MapSerializable) abstract class MapSerializableGenericCast { @POST('/xx') Future getUser(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late User? _value; try { _value = _result.data == null ? null : User.fromMap(_result.data!); @@ -1846,20 +1523,14 @@ abstract class MapSerializableGenericCast { errorLogger?.logError(e, s, _options); rethrow; } -''', - contains: true, -) -@RestApi( - baseUrl: 'https://httpbin.org/', - parser: Parser.MapSerializable, -) +''', contains: true) +@RestApi(baseUrl: 'https://httpbin.org/', parser: Parser.MapSerializable) abstract class NullableMapSerializableGenericCast { @POST('/xx') Future getUser(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late List _value; try { _value = _result.data! @@ -1869,20 +1540,14 @@ abstract class NullableMapSerializableGenericCast { errorLogger?.logError(e, s, _options); rethrow; } -''', - contains: true, -) -@RestApi( - baseUrl: 'https://httpbin.org/', - parser: Parser.MapSerializable, -) +''', contains: true) +@RestApi(baseUrl: 'https://httpbin.org/', parser: Parser.MapSerializable) abstract class MapSerializableTestListBody { @GET('/xx') Future> getResult(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late List? _value; try { _value = _result.data @@ -1892,20 +1557,14 @@ abstract class MapSerializableTestListBody { errorLogger?.logError(e, s, _options); rethrow; } -''', - contains: true, -) -@RestApi( - baseUrl: 'https://httpbin.org/', - parser: Parser.MapSerializable, -) +''', contains: true) +@RestApi(baseUrl: 'https://httpbin.org/', parser: Parser.MapSerializable) abstract class NullableMapSerializableTestListBody { @GET('/xx') Future?> getResult(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late Map> _value; try { _value = _result.data!.map( @@ -1920,20 +1579,14 @@ abstract class NullableMapSerializableTestListBody { errorLogger?.logError(e, s, _options); rethrow; } -''', - contains: true, -) -@RestApi( - baseUrl: 'https://httpbin.org/', - parser: Parser.MapSerializable, -) +''', contains: true) +@RestApi(baseUrl: 'https://httpbin.org/', parser: Parser.MapSerializable) abstract class MapSerializableTestMapBody { @GET('/xx') Future>> getResult(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late Map>? _value; try { _value = _result.data?.map( @@ -1948,20 +1601,14 @@ abstract class MapSerializableTestMapBody { errorLogger?.logError(e, s, _options); rethrow; } -''', - contains: true, -) -@RestApi( - baseUrl: 'https://httpbin.org/', - parser: Parser.MapSerializable, -) +''', contains: true) +@RestApi(baseUrl: 'https://httpbin.org/', parser: Parser.MapSerializable) abstract class NullableMapSerializableTestMapBody { @GET('/xx') Future>?> getResult(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late Map _value; try { _value = _result.data!.map( @@ -1971,20 +1618,14 @@ abstract class NullableMapSerializableTestMapBody { errorLogger?.logError(e, s, _options); rethrow; } -''', - contains: true, -) -@RestApi( - baseUrl: 'https://httpbin.org/', - parser: Parser.MapSerializable, -) +''', contains: true) +@RestApi(baseUrl: 'https://httpbin.org/', parser: Parser.MapSerializable) abstract class MapSerializableTestMapBody2 { @GET('/xx') Future> getResult(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late Map? _value; try { _value = _result.data?.map( @@ -1994,40 +1635,28 @@ abstract class MapSerializableTestMapBody2 { errorLogger?.logError(e, s, _options); rethrow; } -''', - contains: true, -) -@RestApi( - baseUrl: 'https://httpbin.org/', - parser: Parser.MapSerializable, -) +''', contains: true) +@RestApi(baseUrl: 'https://httpbin.org/', parser: Parser.MapSerializable) abstract class NullableMapSerializableTestMapBody2 { @GET('/xx') Future?> getResult(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' try { _value = await compute(deserializeUser, _result.data!); } on Object catch (e, s) { errorLogger?.logError(e, s, _options); rethrow; } -''', - contains: true, -) -@RestApi( - baseUrl: 'https://httpbin.org/', - parser: Parser.FlutterCompute, -) +''', contains: true) +@RestApi(baseUrl: 'https://httpbin.org/', parser: Parser.FlutterCompute) abstract class ComputeGenericCast { @POST('/xx') Future getUser(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late User? _value; try { _value = _result.data == null @@ -2037,20 +1666,14 @@ abstract class ComputeGenericCast { errorLogger?.logError(e, s, _options); rethrow; } -''', - contains: true, -) -@RestApi( - baseUrl: 'https://httpbin.org/', - parser: Parser.FlutterCompute, -) +''', contains: true) +@RestApi(baseUrl: 'https://httpbin.org/', parser: Parser.FlutterCompute) abstract class NullableComputeGenericCast { @POST('/xx') Future getUser(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' try { _value = await compute( deserializeUserList, @@ -2060,20 +1683,14 @@ abstract class NullableComputeGenericCast { errorLogger?.logError(e, s, _options); rethrow; } -''', - contains: true, -) -@RestApi( - baseUrl: 'https://httpbin.org/', - parser: Parser.FlutterCompute, -) +''', contains: true) +@RestApi(baseUrl: 'https://httpbin.org/', parser: Parser.FlutterCompute) abstract class ComputeTestListBody { @GET('/xx') Future> getResult(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late List? _value; try { _value = _result.data == null @@ -2086,13 +1703,8 @@ abstract class ComputeTestListBody { errorLogger?.logError(e, s, _options); rethrow; } - ''', - contains: true, -) -@RestApi( - baseUrl: 'https://httpbin.org/', - parser: Parser.FlutterCompute, -) + ''', contains: true) +@RestApi(baseUrl: 'https://httpbin.org/', parser: Parser.FlutterCompute) abstract class NullableComputeTestListBody { @GET('/xx') Future?> getResult(); @@ -2125,13 +1737,10 @@ abstract class NullableComputeTestListBody { ''' Return types should not be a map when running `Parser.FlutterCompute`, as spawning an isolate per entry is extremely intensive. You should create a new class to encapsulate the response. -''' +''', ], ) -@RestApi( - baseUrl: 'https://httpbin.org/', - parser: Parser.FlutterCompute, -) +@RestApi(baseUrl: 'https://httpbin.org/', parser: Parser.FlutterCompute) abstract class ComputeTestMapBody { @GET('/xx') Future>> getResult(); @@ -2164,13 +1773,10 @@ abstract class ComputeTestMapBody { ''' Return types should not be a map when running `Parser.FlutterCompute`, as spawning an isolate per entry is extremely intensive. You should create a new class to encapsulate the response. -''' +''', ], ) -@RestApi( - baseUrl: 'https://httpbin.org/', - parser: Parser.FlutterCompute, -) +@RestApi(baseUrl: 'https://httpbin.org/', parser: Parser.FlutterCompute) abstract class NullableComputeTestMapBody { @GET('/xx') Future>?> getResult(); @@ -2200,13 +1806,10 @@ abstract class NullableComputeTestMapBody { ''' Return types should not be a map when running `Parser.FlutterCompute`, as spawning an isolate per entry is extremely intensive. You should create a new class to encapsulate the response. -''' +''', ], ) -@RestApi( - baseUrl: 'https://httpbin.org/', - parser: Parser.FlutterCompute, -) +@RestApi(baseUrl: 'https://httpbin.org/', parser: Parser.FlutterCompute) abstract class ComputeTestMapBody2 { @GET('/xx') Future> getResult(); @@ -2241,95 +1844,62 @@ abstract class ComputeTestMapBody2 { ''' Return types should not be a map when running `Parser.FlutterCompute`, as spawning an isolate per entry is extremely intensive. You should create a new class to encapsulate the response. -''' +''', ], ) -@RestApi( - baseUrl: 'https://httpbin.org/', - parser: Parser.FlutterCompute, -) +@RestApi(baseUrl: 'https://httpbin.org/', parser: Parser.FlutterCompute) abstract class NullableComputeTestMapBody2 { @GET('/xx') Future?> getResult(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final queryParameters = { r'u': await compute(serializeUser, user), }; -''', - contains: true, -) -@RestApi( - baseUrl: 'https://httpbin.org/', - parser: Parser.FlutterCompute, -) +''', contains: true) +@RestApi(baseUrl: 'https://httpbin.org/', parser: Parser.FlutterCompute) abstract class ComputeQuery { @GET('/xx') Future getResult(@Query('u') User user); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final queryParameters = {}; queryParameters.addAll(await compute(serializeUser, user)); -''', - contains: true, -) -@RestApi( - baseUrl: 'https://httpbin.org/', - parser: Parser.FlutterCompute, -) +''', contains: true) +@RestApi(baseUrl: 'https://httpbin.org/', parser: Parser.FlutterCompute) abstract class ComputeQueries { @GET('/xx') Future getResult(@Queries() User user); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _data = {}; _data.addAll(await compute(serializeUser, user)); -''', - contains: true, -) -@RestApi( - baseUrl: 'https://httpbin.org/', - parser: Parser.FlutterCompute, -) +''', contains: true) +@RestApi(baseUrl: 'https://httpbin.org/', parser: Parser.FlutterCompute) abstract class TestComputeObjectBody { @GET('/xx') Future getResult(@Body() User user); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _data = await compute(serializeUserList, users); -''', - contains: true, -) -@RestApi( - baseUrl: 'https://httpbin.org/', - parser: Parser.FlutterCompute, -) +''', contains: true) +@RestApi(baseUrl: 'https://httpbin.org/', parser: Parser.FlutterCompute) abstract class TestComputeObjectListBody { @GET('/xx') Future getResult(@Body() List users); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _data = {}; _data.addAll( user == null ? {} : await compute(serializeUser, user), ); -''', - contains: true, -) -@RestApi( - baseUrl: 'https://httpbin.org/', - parser: Parser.FlutterCompute, -) +''', contains: true) +@RestApi(baseUrl: 'https://httpbin.org/', parser: Parser.FlutterCompute) abstract class TestComputeNullableObjectBody { @GET('/xx') Future getResult(@Body() User? user); @@ -2339,10 +1909,7 @@ abstract class TestComputeNullableObjectBody { ' final _data = user?.map((e) => e.toJson()).toList();', contains: true, ) -@RestApi( - baseUrl: 'https://httpbin.org/', - parser: Parser.JsonSerializable, -) +@RestApi(baseUrl: 'https://httpbin.org/', parser: Parser.JsonSerializable) abstract class TestComputeNullableObjectListBodyJsonSerializable { @GET('/xx') Future getResult(@Body() List? user); @@ -2352,29 +1919,20 @@ abstract class TestComputeNullableObjectListBodyJsonSerializable { ' final _data = user == null ? null : await compute(serializeUserList, user);', contains: true, ) -@RestApi( - baseUrl: 'https://httpbin.org/', - parser: Parser.FlutterCompute, -) +@RestApi(baseUrl: 'https://httpbin.org/', parser: Parser.FlutterCompute) abstract class TestComputeNullableObjectListBodyFlutterCompute { @GET('/xx') Future getResult(@Body() List? user); } -@ShouldGenerate( - '_data.removeWhere((k, v) => v == null);', - contains: true, -) +@ShouldGenerate('_data.removeWhere((k, v) => v == null);', contains: true) @RestApi() abstract class MapBodyShouldBeCleanTest { @PUT('/') Future update(@Body(nullToAbsent: true) Map data); } -@ShouldGenerate( - '_data.removeWhere((k, v) => v == null);', - contains: true, -) +@ShouldGenerate('_data.removeWhere((k, v) => v == null);', contains: true) @RestApi() abstract class JsonSerializableBodyShouldBeCleanTest { @PUT('/') @@ -2397,8 +1955,7 @@ abstract class NonJsonSerializableBodyShouldNotBeCleanTest { Future update(@Body() String str); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _data = users.map((e) => e.toJson()).toList(); final _options = _setStreamType( Options(method: 'PUT', headers: _headers, extra: _extra) @@ -2411,17 +1968,14 @@ abstract class NonJsonSerializableBodyShouldNotBeCleanTest { .copyWith(baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl)), ); await _dio.fetch(_options); -''', - contains: true, -) +''', contains: true) @RestApi() abstract class ListBodyShouldNotBeCleanTest { @PUT('/') Future update(@Body() List users); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late GenericUser _value; try { _value = GenericUser.fromJson( @@ -2432,17 +1986,14 @@ abstract class ListBodyShouldNotBeCleanTest { errorLogger?.logError(e, s, _options); rethrow; } -''', - contains: true, -) +''', contains: true) @RestApi() abstract class DynamicInnerGenericTypeShouldBeCastedAsDynamic { @PUT('/') Future> get(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late GenericUser> _value; try { _value = GenericUser>.fromJson( @@ -2457,17 +2008,14 @@ abstract class DynamicInnerGenericTypeShouldBeCastedAsDynamic { errorLogger?.logError(e, s, _options); rethrow; } -''', - contains: true, -) +''', contains: true) @RestApi() abstract class DynamicInnerListGenericTypeShouldBeCastedRecursively { @PUT('/') Future>> get(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late GenericUser>? _value; try { _value = _result.data == null @@ -2486,17 +2034,14 @@ abstract class DynamicInnerListGenericTypeShouldBeCastedRecursively { errorLogger?.logError(e, s, _options); rethrow; } -''', - contains: true, -) +''', contains: true) @RestApi() abstract class NullableDynamicInnerListGenericTypeShouldBeCastedRecursively { @PUT('/') Future>?> get(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late GenericUser _value; try { _value = GenericUser.fromJson( @@ -2507,17 +2052,14 @@ abstract class NullableDynamicInnerListGenericTypeShouldBeCastedRecursively { errorLogger?.logError(e, s, _options); rethrow; } -''', - contains: true, -) +''', contains: true) @RestApi() abstract class DynamicInnerGenericTypeShouldBeCastedAsMap { @PUT('/') Future> get(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late GenericUser> _value; try { _value = GenericUser>.fromJson( @@ -2531,17 +2073,14 @@ abstract class DynamicInnerGenericTypeShouldBeCastedAsMap { errorLogger?.logError(e, s, _options); rethrow; } -''', - contains: true, -) +''', contains: true) @RestApi() abstract class NestGenericTypeShouldBeCastedRecursively { @PUT('/') Future>> get(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late GenericUser? _value; try { _value = _result.data == null @@ -2554,17 +2093,14 @@ abstract class NestGenericTypeShouldBeCastedRecursively { errorLogger?.logError(e, s, _options); rethrow; } -''', - contains: true, -) +''', contains: true) @RestApi() abstract class NullableDynamicInnerGenericTypeShouldBeCastedAsMap { @PUT('/') Future?> get(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late GenericUser _value; try { _value = GenericUser.fromJson( @@ -2576,17 +2112,14 @@ abstract class NullableDynamicInnerGenericTypeShouldBeCastedAsMap { errorLogger?.logError(e, s, _options); rethrow; } -''', - contains: true, -) +''', contains: true) @RestApi() abstract class DynamicNullableInnerGenericTypeShouldBeCastedAsMap { @PUT('/') Future> get(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late GenericUser? _value; try { _value = _result.data == null @@ -2601,17 +2134,14 @@ abstract class DynamicNullableInnerGenericTypeShouldBeCastedAsMap { errorLogger?.logError(e, s, _options); rethrow; } -''', - contains: true, -) +''', contains: true) @RestApi() abstract class NullableDynamicNullableInnerGenericTypeShouldBeCastedAsMap { @PUT('/') Future?> get(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late GenericUser> _value; try { _value = GenericUser>.fromJson( @@ -2624,17 +2154,14 @@ abstract class NullableDynamicNullableInnerGenericTypeShouldBeCastedAsMap { errorLogger?.logError(e, s, _options); rethrow; } -''', - contains: true, -) +''', contains: true) @RestApi() abstract class DynamicInnerListGenericPrimitiveTypeShouldBeCastedRecursively { @PUT('/') Future>> get(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late GenericUser>? _value; try { _value = _result.data == null @@ -2649,17 +2176,14 @@ abstract class DynamicInnerListGenericPrimitiveTypeShouldBeCastedRecursively { errorLogger?.logError(e, s, _options); rethrow; } -''', - contains: true, -) +''', contains: true) @RestApi() abstract class NullableDynamicInnerListGenericPrimitiveTypeShouldBeCastedRecursively { @PUT('/') Future>?> get(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late GenericUserWithoutGenericArgumentFactories _value; try { _value = GenericUserWithoutGenericArgumentFactories.fromJson( @@ -2669,17 +2193,14 @@ abstract class NullableDynamicInnerListGenericPrimitiveTypeShouldBeCastedRecursi errorLogger?.logError(e, s, _options); rethrow; } -''', - contains: true, -) +''', contains: true) @RestApi() abstract class DynamicInnerGenericTypeShouldBeWithoutGenericArgumentType { @PUT('/') Future> get(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' late GenericUserWithoutGenericArgumentFactories? _value; try { _value = _result.data == null @@ -2691,21 +2212,16 @@ abstract class DynamicInnerGenericTypeShouldBeWithoutGenericArgumentType { errorLogger?.logError(e, s, _options); rethrow; } -''', - contains: true, -) +''', contains: true) @RestApi() abstract class NullableDynamicInnerGenericTypeShouldBeWithoutGenericArgumentType { @PUT('/') Future?> get(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final String? _data = null; - ''', - contains: true, -) + ''', contains: true) @RestApi() abstract class NoBodyGeneratesNullBody { @PUT('/') @@ -2718,30 +2234,21 @@ mixin MethodInMixin { Future someGet(); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' @override Future someGet() async { -''', - contains: true, -) +''', contains: true) @RestApi() abstract class NoMethods with MethodInMixin {} -@ShouldGenerate( - 'await _dio.fetch?>', - contains: true, -) +@ShouldGenerate('await _dio.fetch?>', contains: true) @RestApi() abstract class NullableGenericCastFetch { @GET('/') Future get(); } -@ShouldGenerate( - 'await _dio.fetch>', - contains: true, -) +@ShouldGenerate('await _dio.fetch>', contains: true) @RestApi() abstract class GenericCastFetch { @GET('/') @@ -2758,8 +2265,7 @@ abstract class CombineBaseUrls { Future get(); } -@ShouldGenerate( - r''' +@ShouldGenerate(r''' final _headers = { r'accept': 'application/x-protobuf; ${Result.getDefault().info_.qualifiedMessageName == "" ? "" : "messageType=${Result.getDefault().info_.qualifiedMessageName}"}', @@ -2784,17 +2290,14 @@ abstract class CombineBaseUrls { ); final _result = await _dio.fetch>(_options); final _value = await compute(Result.fromBuffer, _result.data!); -''', - contains: true, -) +''', contains: true) @RestApi() abstract class ProtoSupportParserJsonSerializable { @GET('/') Future get(@Body() Params params); } -@ShouldGenerate( - r''' +@ShouldGenerate(r''' final _headers = { r'accept': 'application/x-protobuf; ${Result.getDefault().info_.qualifiedMessageName == "" ? "" : "messageType=${Result.getDefault().info_.qualifiedMessageName}"}', @@ -2819,17 +2322,14 @@ abstract class ProtoSupportParserJsonSerializable { ); final _result = await _dio.fetch>(_options); final _value = await compute(Result.fromBuffer, _result.data!); -''', - contains: true, -) +''', contains: true) @RestApi(parser: Parser.DartJsonMapper) abstract class ProtoSupportParserDartJsonMapper { @GET('/') Future get(@Body() Params params); } -@ShouldGenerate( - r''' +@ShouldGenerate(r''' final _headers = { r'accept': 'application/x-protobuf; ${Result.getDefault().info_.qualifiedMessageName == "" ? "" : "messageType=${Result.getDefault().info_.qualifiedMessageName}"}', @@ -2854,17 +2354,14 @@ abstract class ProtoSupportParserDartJsonMapper { ); final _result = await _dio.fetch>(_options); final _value = await compute(Result.fromBuffer, _result.data!); -''', - contains: true, -) +''', contains: true) @RestApi(parser: Parser.MapSerializable) abstract class ProtoSupportParserMapSerializable { @GET('/') Future get(@Body() Params params); } -@ShouldGenerate( - r''' +@ShouldGenerate(r''' final _headers = { r'accept': 'application/x-protobuf; ${Result.getDefault().info_.qualifiedMessageName == "" ? "" : "messageType=${Result.getDefault().info_.qualifiedMessageName}"}', @@ -2889,23 +2386,18 @@ abstract class ProtoSupportParserMapSerializable { ); final _result = await _dio.fetch>(_options); final _value = await compute(Result.fromBuffer, _result.data!); -''', - contains: true, -) +''', contains: true) @RestApi(parser: Parser.FlutterCompute) abstract class ProtoSupportParserFlutterCompute { @GET('/') Future get(@Body() Params params); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _data = FormData.fromMap(body); - ''', - contains: true, -) + ''', contains: true) @RestApi() -abstract class MultipartWithMultplePathParams { +abstract class MultipartWithMultiplePathParams { @MultiPart() @POST('post/{id}/comments/{commentId}') Future multipartBodyWithMultiplePathParameter( @@ -2915,12 +2407,9 @@ abstract class MultipartWithMultplePathParams { ); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _data = FormData.fromMap(body); - ''', - contains: true, -) + ''', contains: true) @RestApi() abstract class MultipartWithSinglePathParams { @MultiPart() @@ -2931,12 +2420,9 @@ abstract class MultipartWithSinglePathParams { ); } -@ShouldGenerate( - ''' +@ShouldGenerate(''' final _data = FormData.fromMap(body); - ''', - contains: true, -) + ''', contains: true) @RestApi() abstract class MultipartWithMultiplePathParamsPUT { @MultiPart() diff --git a/generator/test/src/query.pb.dart b/generator/test/src/query.pb.dart index e913710ae..70f4a043e 100644 --- a/generator/test/src/query.pb.dart +++ b/generator/test/src/query.pb.dart @@ -12,9 +12,7 @@ import 'dart:core' as $core; import 'package:protobuf/protobuf.dart' as $pb; class Params extends $pb.GeneratedMessage { - factory Params({ - $core.String? key, - }) { + factory Params({$core.String? key}) { final $result = create(); if (key != null) { $result.key = key; @@ -24,28 +22,36 @@ class Params extends $pb.GeneratedMessage { Params._() : super(); - factory Params.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - - factory Params.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - _omitMessageNames ? '' : 'Params', - createEmptyInstance: create) - ..aOS(1, _omitFieldNames ? '' : 'key') - ..hasRequiredFields = false; - - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory Params.fromBuffer( + $core.List<$core.int> i, [ + $pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY, + ]) => create()..mergeFromBuffer(i, r); + + factory Params.fromJson( + $core.String i, [ + $pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY, + ]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = + $pb.BuilderInfo( + _omitMessageNames ? '' : 'Params', + createEmptyInstance: create, + ) + ..aOS(1, _omitFieldNames ? '' : 'key') + ..hasRequiredFields = false; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version', + ) Params clone() => Params()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version', + ) Params copyWith(void Function(Params) updates) => super.copyWith((message) => updates(message as Params)) as Params; @@ -79,9 +85,7 @@ class Params extends $pb.GeneratedMessage { } class Result extends $pb.GeneratedMessage { - factory Result({ - $core.String? value, - }) { + factory Result({$core.String? value}) { final $result = create(); if (value != null) { $result.value = value; @@ -91,28 +95,36 @@ class Result extends $pb.GeneratedMessage { Result._() : super(); - factory Result.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - - factory Result.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - _omitMessageNames ? '' : 'Result', - createEmptyInstance: create) - ..aOS(1, _omitFieldNames ? '' : 'value') - ..hasRequiredFields = false; - - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory Result.fromBuffer( + $core.List<$core.int> i, [ + $pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY, + ]) => create()..mergeFromBuffer(i, r); + + factory Result.fromJson( + $core.String i, [ + $pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY, + ]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = + $pb.BuilderInfo( + _omitMessageNames ? '' : 'Result', + createEmptyInstance: create, + ) + ..aOS(1, _omitFieldNames ? '' : 'value') + ..hasRequiredFields = false; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version', + ) Result clone() => Result()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version', + ) Result copyWith(void Function(Result) updates) => super.copyWith((message) => updates(message as Result)) as Result; @@ -146,5 +158,6 @@ class Result extends $pb.GeneratedMessage { } const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names'); -const _omitMessageNames = - $core.bool.fromEnvironment('protobuf.omit_message_names'); +const _omitMessageNames = $core.bool.fromEnvironment( + 'protobuf.omit_message_names', +); From a39a926eed72cf3a51aef9cea41b663eb19e19a3 Mon Sep 17 00:00:00 2001 From: Roman Laptev Date: Tue, 15 Jul 2025 15:56:42 +0300 Subject: [PATCH 02/13] Extension fixes --- generator/lib/src/generator.dart | 45 ++++++++++++++++++-------------- generator/pubspec.yaml | 1 - 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/generator/lib/src/generator.dart b/generator/lib/src/generator.dart index b0448486a..b97b87dde 100644 --- a/generator/lib/src/generator.dart +++ b/generator/lib/src/generator.dart @@ -8,7 +8,6 @@ import 'package:analyzer/dart/element/type.dart'; import 'package:build/build.dart'; import 'package:built_collection/built_collection.dart'; import 'package:code_builder/code_builder.dart'; -import 'package:collection/collection.dart'; import 'package:dart_style/dart_style.dart'; import 'package:dio/dio.dart'; import 'package:protobuf/protobuf.dart'; @@ -18,6 +17,10 @@ import 'package:source_gen/source_gen.dart'; const _analyzerIgnores = '// ignore_for_file: unnecessary_brace_in_string_interps,no_leading_underscores_for_local_identifiers,unused_element,unnecessary_string_interpolations,unused_element_parameter'; +Builder generatorFactoryBuilder(BuilderOptions options) => SharedPartBuilder([ + RetrofitGenerator(RetrofitOptions.fromOptions(options)), +], 'retrofit'); + class RetrofitOptions { RetrofitOptions({ this.autoCastResponse, @@ -1293,7 +1296,6 @@ $returnAsyncWrapper httpResponse; } /// Checks for a compatible fromJson signature for generic argument factories - // TODO: But does the code work with multiple generic types? bool hasGenericArgumentFactoriesCompatibleSignature(DartType? dartType) { if (dartType == null) { return false; @@ -2864,10 +2866,6 @@ MultipartFile.fromFileSync(i.path, } } -Builder generatorFactoryBuilder(BuilderOptions options) => SharedPartBuilder([ - RetrofitGenerator(RetrofitOptions.fromOptions(options)), -], 'retrofit'); - /// Returns `$revived($args $kwargs)`, this won't have ending semi-colon (`;`). /// [object] must not be null. /// [object] is assumed to be a constant. @@ -2990,16 +2988,6 @@ String revivedLiteral(Object object, {DartEmitter? dartEmitter}) { return '$instantiation($args $kwargs)'; } -extension DartTypeStreamAnnotation on DartType { - bool get isDartAsyncStream { - final e = element3 != null ? null : element3! as ClassElement2; - if (e == null) { - return false; - } - return e.name3 == 'Stream' && e.library2.isDartAsync; - } -} - String _displayString(DartType? e, {bool withNullability = false}) { try { if (!withNullability) { @@ -3016,7 +3004,7 @@ String _displayString(DartType? e, {bool withNullability = false}) { } } -extension DartTypeExt on DartType { +extension _DartTypeX on DartType { bool get isNullable => nullabilitySuffix == NullabilitySuffix.question; String toStringNonNullable() { @@ -3026,9 +3014,17 @@ extension DartTypeExt on DartType { } return val; } + + bool get isDartAsyncStream { + final e = element3 != null ? null : element3! as ClassElement2; + if (e == null) { + return false; + } + return e.name3 == 'Stream' && e.library2.isDartAsync; + } } -extension DartObjectX on DartObject? { +extension _DartObjectX on DartObject? { bool get isEnum => this?.type?.element3?.kind.name == 'ENUM'; ConstantReader? toConstantReader() { @@ -3039,7 +3035,7 @@ extension DartObjectX on DartObject? { } } -extension ReferenceExt on Reference { +extension _ReferenceX on Reference { Reference asNoNull() => refer('$symbol!'); Reference asNoNullIf({required bool returnNullable}) => @@ -3055,3 +3051,14 @@ extension ReferenceExt on Reference { ? equalTo(literalNull).conditional(literalNull, whenFalse) : whenFalse; } + +extension _IterableX on Iterable { + T? firstWhereOrNull(bool Function(T element) test) { + for (final element in this) { + if (test(element)) { + return element; + } + } + return null; + } +} diff --git a/generator/pubspec.yaml b/generator/pubspec.yaml index f2aae8d6c..c676c7fac 100644 --- a/generator/pubspec.yaml +++ b/generator/pubspec.yaml @@ -17,7 +17,6 @@ dependencies: build: '>=2.5.4 <4.0.0' built_collection: ^5.1.1 code_builder: ^4.10.1 - collection: ^1.19.1 dart_style: ^3.1.0 dio: ^5.8.0 protobuf: ^4.1.0 From 3d603a225310b4aefcfc1473d3d4494b22840cc2 Mon Sep 17 00:00:00 2001 From: Roman Laptev Date: Tue, 15 Jul 2025 16:00:25 +0300 Subject: [PATCH 03/13] Analyze fixes --- generator/lib/src/generator.dart | 8 -------- generator/pubspec.yaml | 2 +- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/generator/lib/src/generator.dart b/generator/lib/src/generator.dart index b97b87dde..ea3b4a674 100644 --- a/generator/lib/src/generator.dart +++ b/generator/lib/src/generator.dart @@ -3014,14 +3014,6 @@ extension _DartTypeX on DartType { } return val; } - - bool get isDartAsyncStream { - final e = element3 != null ? null : element3! as ClassElement2; - if (e == null) { - return false; - } - return e.name3 == 'Stream' && e.library2.isDartAsync; - } } extension _DartObjectX on DartObject? { diff --git a/generator/pubspec.yaml b/generator/pubspec.yaml index c676c7fac..85ac87539 100644 --- a/generator/pubspec.yaml +++ b/generator/pubspec.yaml @@ -22,7 +22,7 @@ dependencies: protobuf: ^4.1.0 retrofit: ^4.6.0 source_gen: ^3.0.0-dev -# source_gen: '>=2.0.0 <4.0.0' + # source_gen: '>=2.0.0 <4.0.0' dev_dependencies: lints: any From 0725e3a9f983782905834fb80cb0b65fd074b9dc Mon Sep 17 00:00:00 2001 From: Roman Laptev Date: Wed, 16 Jul 2025 08:06:03 +0300 Subject: [PATCH 04/13] Fix dependencies versions --- README.md | 2 +- generator/CHANGELOG.md | 4 ++++ generator/pubspec.yaml | 5 ++--- retrofit/pubspec.yaml | 8 ++++---- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 52e6fd4d8..9d4d9791b 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ dependencies: json_annotation: ^4.9.0 dev_dependencies: - retrofit_generator: ^9.6.0 + retrofit_generator: ^10.0.1 build_runner: ^2.5.4 json_serializable: ^6.9.5 ``` diff --git a/generator/CHANGELOG.md b/generator/CHANGELOG.md index 13e5efa4b..8ccdd0eff 100644 --- a/generator/CHANGELOG.md +++ b/generator/CHANGELOG.md @@ -1,3 +1,7 @@ +## 10.0.1 + +- Fix dependencies versions + ## 10.0.0 - Migrate to `Element2` diff --git a/generator/pubspec.yaml b/generator/pubspec.yaml index 85ac87539..13e92f8be 100644 --- a/generator/pubspec.yaml +++ b/generator/pubspec.yaml @@ -8,7 +8,7 @@ topics: - rest - retrofit - codegen -version: 10.0.0 +version: 10.0.1 environment: sdk: '>=3.8.0 <4.0.0' @@ -21,8 +21,7 @@ dependencies: dio: ^5.8.0 protobuf: ^4.1.0 retrofit: ^4.6.0 - source_gen: ^3.0.0-dev - # source_gen: '>=2.0.0 <4.0.0' + source_gen: '>=2.0.0 <4.0.0' dev_dependencies: lints: any diff --git a/retrofit/pubspec.yaml b/retrofit/pubspec.yaml index 66b0f966e..e916bd1f8 100644 --- a/retrofit/pubspec.yaml +++ b/retrofit/pubspec.yaml @@ -8,13 +8,13 @@ topics: - rest - dio - retrofit -version: 4.6.0 +version: 4.7.0 environment: - sdk: '>=3.6.0 <4.0.0' + sdk: '>=3.8.0 <4.0.0' dependencies: - dio: ^5.2.0 - meta: ^1.15.0 + dio: ^5.8.0 + meta: ^1.16.0 dev_dependencies: lints: any From 3cd324c28e886483be88e60166d24c4254423075 Mon Sep 17 00:00:00 2001 From: Roman Laptev Date: Wed, 16 Jul 2025 08:18:48 +0300 Subject: [PATCH 05/13] Update versions --- README.md | 4 ++-- generator/pubspec.yaml | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 9d4d9791b..7040ac987 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,8 @@ dependencies: dev_dependencies: retrofit_generator: ^10.0.1 - build_runner: ^2.5.4 - json_serializable: ^6.9.5 + build_runner: ^3.0.0 + json_serializable: ^6.10.0 ``` ### Define and Generate your API diff --git a/generator/pubspec.yaml b/generator/pubspec.yaml index 13e92f8be..0f016fd96 100644 --- a/generator/pubspec.yaml +++ b/generator/pubspec.yaml @@ -14,16 +14,16 @@ environment: dependencies: analyzer: '>=7.5.9 <9.0.0' - build: '>=2.5.4 <4.0.0' + build: ^3.0.0 built_collection: ^5.1.1 code_builder: ^4.10.1 dart_style: ^3.1.0 dio: ^5.8.0 protobuf: ^4.1.0 retrofit: ^4.6.0 - source_gen: '>=2.0.0 <4.0.0' + source_gen: ^3.0.0 dev_dependencies: lints: any - source_gen_test: ^1.2.0 - test: ^1.25.0 + source_gen_test: ^1.3.0 + test: ^1.25.15 From 3380c81091c1122d42b89582a7d054cb98dd3086 Mon Sep 17 00:00:00 2001 From: Roman Laptev Date: Wed, 16 Jul 2025 08:20:33 +0300 Subject: [PATCH 06/13] Fix versions --- README.md | 2 +- retrofit/CHANGELOG.md | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7040ac987..f7c321fc5 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ dependencies: dev_dependencies: retrofit_generator: ^10.0.1 - build_runner: ^3.0.0 + build_runner: ^2.6.0 json_serializable: ^6.10.0 ``` diff --git a/retrofit/CHANGELOG.md b/retrofit/CHANGELOG.md index afcb32255..410c18411 100644 --- a/retrofit/CHANGELOG.md +++ b/retrofit/CHANGELOG.md @@ -1,5 +1,9 @@ ## 4.6.0 +- Updates minimum supported SDK version to Dart 3.8. + +## 4.6.0 + - Updates minimum supported SDK version to Dart 3.6. ## 4.5.0 From 56c9b5a4425f95a4d20ee422797ecdc27d8affa6 Mon Sep 17 00:00:00 2001 From: Roman Laptev Date: Wed, 16 Jul 2025 19:05:39 +0300 Subject: [PATCH 07/13] Update actions --- .github/workflows/github-pages.yml | 4 ++-- .github/workflows/label.yml | 2 +- .github/workflows/mirror-to-gitee.yml | 2 +- .github/workflows/publish-generator.yml | 2 +- .github/workflows/publish-retrofit.yml | 2 +- .github/workflows/test.yml | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/github-pages.yml b/.github/workflows/github-pages.yml index 4fd03661f..f9fd37b2f 100644 --- a/.github/workflows/github-pages.yml +++ b/.github/workflows/github-pages.yml @@ -12,14 +12,14 @@ jobs: container: image: dart:stable steps: - - uses: actions/checkout@v3.3.0 + - uses: actions/checkout@v4 - name: Build docs run: | cd retrofit dart doc mv doc/api ../public - name: GitHub Pages - uses: crazy-max/ghaction-github-pages@v3.1.0 + uses: crazy-max/ghaction-github-pages@v4 with: build_dir: public env: diff --git a/.github/workflows/label.yml b/.github/workflows/label.yml index 4e2b5da1a..8d5d2a389 100644 --- a/.github/workflows/label.yml +++ b/.github/workflows/label.yml @@ -16,6 +16,6 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/labeler@v4 + - uses: actions/labeler@v5 with: repo-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/mirror-to-gitee.yml b/.github/workflows/mirror-to-gitee.yml index 65a167f20..bcb8d00a0 100644 --- a/.github/workflows/mirror-to-gitee.yml +++ b/.github/workflows/mirror-to-gitee.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3.3.0 + - uses: actions/checkout@v4 - name: Mirror to Gitee run: | git fetch --unshallow diff --git a/.github/workflows/publish-generator.yml b/.github/workflows/publish-generator.yml index 8a36b36fe..d8b96de3f 100644 --- a/.github/workflows/publish-generator.yml +++ b/.github/workflows/publish-generator.yml @@ -13,7 +13,7 @@ jobs: id-token: write # Required for authentication using OIDC runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: dart-lang/setup-dart@v1 - name: Install dependencies run: cd generator && dart pub get diff --git a/.github/workflows/publish-retrofit.yml b/.github/workflows/publish-retrofit.yml index 46c63c505..324602c00 100644 --- a/.github/workflows/publish-retrofit.yml +++ b/.github/workflows/publish-retrofit.yml @@ -13,7 +13,7 @@ jobs: id-token: write # Required for authentication using OIDC runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: dart-lang/setup-dart@v1 - name: Install dependencies run: cd retrofit && dart pub get diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f76bc220a..7f6f01abd 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -13,8 +13,8 @@ jobs: os: [ubuntu-latest] sdk: [stable] steps: - - uses: actions/checkout@v3.5.2 - - uses: dart-lang/setup-dart@v1.5.0 + - uses: actions/checkout@v4 + - uses: dart-lang/setup-dart@v1 with: sdk: ${{ matrix.sdk }} - name: Generate code From a5b786498bbbd328f53519c922bf32c2a5507229 Mon Sep 17 00:00:00 2001 From: Roman Laptev Date: Wed, 16 Jul 2025 19:08:48 +0300 Subject: [PATCH 08/13] Fix dependencies --- generator/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generator/pubspec.yaml b/generator/pubspec.yaml index 0f016fd96..3e43114b6 100644 --- a/generator/pubspec.yaml +++ b/generator/pubspec.yaml @@ -25,5 +25,5 @@ dependencies: dev_dependencies: lints: any - source_gen_test: ^1.3.0 + source_gen_test: ^1.2.0 test: ^1.25.15 From 0a970bb3173a4362ee5270c54113a7997cac46b4 Mon Sep 17 00:00:00 2001 From: Roman Laptev Date: Wed, 16 Jul 2025 19:10:34 +0300 Subject: [PATCH 09/13] Update lower analyzer version --- generator/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generator/pubspec.yaml b/generator/pubspec.yaml index 3e43114b6..3cd74c549 100644 --- a/generator/pubspec.yaml +++ b/generator/pubspec.yaml @@ -13,7 +13,7 @@ environment: sdk: '>=3.8.0 <4.0.0' dependencies: - analyzer: '>=7.5.9 <9.0.0' + analyzer: '>=7.6.0 <9.0.0' build: ^3.0.0 built_collection: ^5.1.1 code_builder: ^4.10.1 From c0ec15b0aa38f6ae8874483a9610de605cd9e75a Mon Sep 17 00:00:00 2001 From: Roman Laptev Date: Thu, 17 Jul 2025 10:14:07 +0300 Subject: [PATCH 10/13] Update analyzer version --- generator/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generator/pubspec.yaml b/generator/pubspec.yaml index 3cd74c549..e45ccd776 100644 --- a/generator/pubspec.yaml +++ b/generator/pubspec.yaml @@ -13,7 +13,7 @@ environment: sdk: '>=3.8.0 <4.0.0' dependencies: - analyzer: '>=7.6.0 <9.0.0' + analyzer: '>=7.7.0 <9.0.0' build: ^3.0.0 built_collection: ^5.1.1 code_builder: ^4.10.1 From 8321538ac9ba235aa044a57e9ab49cb7530f8e39 Mon Sep 17 00:00:00 2001 From: Roman Laptev Date: Thu, 17 Jul 2025 14:33:18 +0300 Subject: [PATCH 11/13] Update dependencies --- generator/pubspec.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/generator/pubspec.yaml b/generator/pubspec.yaml index e45ccd776..237577e40 100644 --- a/generator/pubspec.yaml +++ b/generator/pubspec.yaml @@ -19,11 +19,11 @@ dependencies: code_builder: ^4.10.1 dart_style: ^3.1.0 dio: ^5.8.0 - protobuf: ^4.1.0 + protobuf: ^4.1.1 retrofit: ^4.6.0 source_gen: ^3.0.0 dev_dependencies: lints: any - source_gen_test: ^1.2.0 + source_gen_test: ^1.3.0 test: ^1.25.15 From 904d11f998d39072cd9dfc1ac998d7cdff50acf8 Mon Sep 17 00:00:00 2001 From: Roman Laptev Date: Thu, 17 Jul 2025 21:21:42 +0300 Subject: [PATCH 12/13] Update changelog version --- retrofit/CHANGELOG.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/retrofit/CHANGELOG.md b/retrofit/CHANGELOG.md index 410c18411..39ba19aa2 100644 --- a/retrofit/CHANGELOG.md +++ b/retrofit/CHANGELOG.md @@ -1,11 +1,7 @@ -## 4.6.0 +## 4.7.0 - Updates minimum supported SDK version to Dart 3.8. -## 4.6.0 - -- Updates minimum supported SDK version to Dart 3.6. - ## 4.5.0 - Added `@BodyExtra` annotation to support adding individual fields to request body, enhancing flexibility and extensibility. From fa60d7dfd364c3e643bf5f42a4e5bd840195e81f Mon Sep 17 00:00:00 2001 From: Roman Laptev Date: Wed, 23 Jul 2025 10:20:15 +0300 Subject: [PATCH 13/13] Update min version --- generator/pubspec.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/generator/pubspec.yaml b/generator/pubspec.yaml index 237577e40..7feef178b 100644 --- a/generator/pubspec.yaml +++ b/generator/pubspec.yaml @@ -13,11 +13,11 @@ environment: sdk: '>=3.8.0 <4.0.0' dependencies: - analyzer: '>=7.7.0 <9.0.0' + analyzer: '>=7.7.1 <9.0.0' build: ^3.0.0 built_collection: ^5.1.1 code_builder: ^4.10.1 - dart_style: ^3.1.0 + dart_style: ^3.1.1 dio: ^5.8.0 protobuf: ^4.1.1 retrofit: ^4.6.0