@@ -30,11 +30,20 @@ import 'package:shelf_router/src/router_entry.dart' // ignore: implementation_im
3030import 'package:source_gen/source_gen.dart' as g;
3131
3232// Type checkers that we need later
33- const _routeType = g.TypeChecker .fromRuntime (shelf_router.Route );
34- const _routerType = g.TypeChecker .fromRuntime (shelf_router.Router );
35- const _responseType = g.TypeChecker .fromRuntime (shelf.Response );
36- const _requestType = g.TypeChecker .fromRuntime (shelf.Request );
37- const _stringType = g.TypeChecker .fromRuntime (String );
33+ const _routeType = g.TypeChecker .typeNamed (
34+ shelf_router.Route ,
35+ inPackage: 'shelf_router' ,
36+ );
37+ const _routerType = g.TypeChecker .typeNamed (
38+ shelf_router.Router ,
39+ inPackage: 'shelf_router' ,
40+ );
41+ const _responseType = g.TypeChecker .typeNamed (
42+ shelf.Response ,
43+ inPackage: 'shelf' ,
44+ );
45+ const _requestType = g.TypeChecker .typeNamed (shelf.Request , inPackage: 'shelf' );
46+ const _stringType = g.TypeChecker .typeNamed (String , inSdk: true );
3847
3948/// A representation of a handler that was annotated with [shelf_router.Route] .
4049class _Handler {
@@ -47,51 +56,50 @@ class _Handler {
4756/// Find members of a class annotated with [shelf_router.Route] .
4857List <ExecutableElement2 > getAnnotatedElementsOrderBySourceOffset (
4958 ClassElement2 cls,
50- ) => < ExecutableElement2 > [
51- ...cls.methods2.where (_routeType.hasAnnotationOfExact),
52- ...cls.getters2.where (_routeType.hasAnnotationOfExact),
53- ]..sort (
54- (a, b) =>
55- (a.firstFragment.nameOffset2! ).compareTo (b.firstFragment.nameOffset2! ),
56- );
59+ ) =>
60+ < ExecutableElement2 > [
61+ ...cls.methods2.where (_routeType.hasAnnotationOfExact),
62+ ...cls.getters2.where (_routeType.hasAnnotationOfExact),
63+ ]..sort (
64+ (a, b) => (a.firstFragment.nameOffset2! ).compareTo (
65+ b.firstFragment.nameOffset2! ,
66+ ),
67+ );
5768
5869/// Generate a `_$<className>Router(<className> service)` method that returns a
5970/// [shelf_router.Router] configured based on annotated handlers.
6071 code.Method _buildRouterMethod ({
6172 required ClassElement2 classElement,
6273 required List <_Handler > handlers,
6374}) => code.Method (
64- (b) =>
65- b
66- ..name = '_\$ ${classElement .name3 }Router'
67- ..requiredParameters.add (
68- code.Parameter (
69- (b) =>
70- b
71- ..name = 'service'
72- ..type = code.refer (classElement.name3! ),
75+ (b) => b
76+ ..name = '_\$ ${classElement .name3 }Router'
77+ ..requiredParameters.add (
78+ code.Parameter (
79+ (b) => b
80+ ..name = 'service'
81+ ..type = code.refer (classElement.name3! ),
82+ ),
83+ )
84+ ..returns = code.refer ('Router' )
85+ ..body = code.Block (
86+ (b) => b
87+ ..addExpression (
88+ code
89+ .declareFinal ('router' )
90+ .assign (code.refer ('Router' ).newInstance ([])),
91+ )
92+ ..statements.addAll (
93+ handlers.map (
94+ (h) => _buildAddHandlerCode (
95+ router: code.refer ('router' ),
96+ service: code.refer ('service' ),
97+ handler: h,
98+ ),
7399 ),
74100 )
75- ..returns = code.refer ('Router' )
76- ..body = code.Block (
77- (b) =>
78- b
79- ..addExpression (
80- code
81- .declareFinal ('router' )
82- .assign (code.refer ('Router' ).newInstance ([])),
83- )
84- ..statements.addAll (
85- handlers.map (
86- (h) => _buildAddHandlerCode (
87- router: code.refer ('router' ),
88- service: code.refer ('service' ),
89- handler: h,
90- ),
91- ),
92- )
93- ..addExpression (code.refer ('router' ).returned),
94- ),
101+ ..addExpression (code.refer ('router' ).returned),
102+ ),
95103);
96104
97105/// Generate the code statement that adds [handler] from [service] to [router] .
@@ -100,22 +108,19 @@ code.Code _buildAddHandlerCode({
100108 required code.Reference service,
101109 required _Handler handler,
102110}) => switch (handler.verb) {
103- r'$mount' =>
104- router.property ('mount' ).call ([
105- code.literalString (handler.route, raw: true ),
106- service.property (handler.element.name3! ).property ('call' ),
107- ]).statement,
108- r'$all' =>
109- router.property ('all' ).call ([
110- code.literalString (handler.route, raw: true ),
111- service.property (handler.element.name3! ),
112- ]).statement,
113- _ =>
114- router.property ('add' ).call ([
115- code.literalString (handler.verb.toUpperCase ()),
116- code.literalString (handler.route, raw: true ),
117- service.property (handler.element.name3! ),
118- ]).statement,
111+ r'$mount' => router.property ('mount' ).call ([
112+ code.literalString (handler.route, raw: true ),
113+ service.property (handler.element.name3! ).property ('call' ),
114+ ]).statement,
115+ r'$all' => router.property ('all' ).call ([
116+ code.literalString (handler.route, raw: true ),
117+ service.property (handler.element.name3! ),
118+ ]).statement,
119+ _ => router.property ('add' ).call ([
120+ code.literalString (handler.verb.toUpperCase ()),
121+ code.literalString (handler.route, raw: true ),
122+ service.property (handler.element.name3! ),
123+ ]).statement,
119124};
120125
121126class ShelfRouterGenerator extends g.Generator {
@@ -131,21 +136,20 @@ class ShelfRouterGenerator extends g.Generator {
131136 }
132137 log.info ('found shelf_router.Route annotations in ${cls .name3 }' );
133138
134- classes[cls] =
135- elements
136- .map (
137- (e) => _routeType
138- .annotationsOfExact (e)
139- .map (
140- (a) => _Handler (
141- a.getField ('verb' )! .toStringValue ()! ,
142- a.getField ('route' )! .toStringValue ()! ,
143- e,
144- ),
145- ),
146- )
147- .expand ((i) => i)
148- .toList ();
139+ classes[cls] = elements
140+ .map (
141+ (e) => _routeType
142+ .annotationsOfExact (e)
143+ .map (
144+ (a) => _Handler (
145+ a.getField ('verb' )! .toStringValue ()! ,
146+ a.getField ('route' )! .toStringValue ()! ,
147+ e,
148+ ),
149+ ),
150+ )
151+ .expand ((i) => i)
152+ .toList ();
149153 }
150154 if (classes.isEmpty) {
151155 return null ; // nothing to do if nothing was annotated
0 commit comments