Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions .github/workflows/dart.yml
Original file line number Diff line number Diff line change
Expand Up @@ -166,23 +166,23 @@ jobs:
if: "always() && steps.pkgs_shelf_web_socket_pub_upgrade.conclusion == 'success'"
working-directory: pkgs/shelf_web_socket
job_005:
name: "analyze_and_format; linux; Dart 3.7.0; PKG: pkgs/shelf_router_generator; `dart analyze --fatal-infos .`"
name: "analyze_and_format; linux; Dart 3.9.0; PKG: pkgs/shelf_router_generator; `dart analyze --fatal-infos .`"
runs-on: ubuntu-latest
steps:
- name: Cache Pub hosted dependencies
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830
with:
path: "~/.pub-cache/hosted"
key: "os:ubuntu-latest;pub-cache-hosted;sdk:3.7.0;packages:pkgs/shelf_router_generator;commands:analyze"
key: "os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0;packages:pkgs/shelf_router_generator;commands:analyze"
restore-keys: |
os:ubuntu-latest;pub-cache-hosted;sdk:3.7.0;packages:pkgs/shelf_router_generator
os:ubuntu-latest;pub-cache-hosted;sdk:3.7.0
os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0;packages:pkgs/shelf_router_generator
os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0
os:ubuntu-latest;pub-cache-hosted
os:ubuntu-latest
- name: Setup Dart SDK
uses: dart-lang/setup-dart@e51d8e571e22473a2ddebf0ef8a2123f0ab2c02c
with:
sdk: "3.7.0"
sdk: "3.9.0"
- id: checkout
name: Checkout repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8
Expand Down Expand Up @@ -608,23 +608,23 @@ jobs:
- job_006
- job_007
job_013:
name: "unit_test; linux; Dart 3.7.0; PKG: pkgs/shelf_router_generator; `dart test --test-randomize-ordering-seed=random`"
name: "unit_test; linux; Dart 3.9.0; PKG: pkgs/shelf_router_generator; `dart test --test-randomize-ordering-seed=random`"
runs-on: ubuntu-latest
steps:
- name: Cache Pub hosted dependencies
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830
with:
path: "~/.pub-cache/hosted"
key: "os:ubuntu-latest;pub-cache-hosted;sdk:3.7.0;packages:pkgs/shelf_router_generator;commands:test_0"
key: "os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0;packages:pkgs/shelf_router_generator;commands:test_0"
restore-keys: |
os:ubuntu-latest;pub-cache-hosted;sdk:3.7.0;packages:pkgs/shelf_router_generator
os:ubuntu-latest;pub-cache-hosted;sdk:3.7.0
os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0;packages:pkgs/shelf_router_generator
os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0
os:ubuntu-latest;pub-cache-hosted
os:ubuntu-latest
- name: Setup Dart SDK
uses: dart-lang/setup-dart@e51d8e571e22473a2ddebf0ef8a2123f0ab2c02c
with:
sdk: "3.7.0"
sdk: "3.9.0"
- id: checkout
name: Checkout repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8
Expand Down
8 changes: 8 additions & 0 deletions pkgs/shelf_router_generator/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
## 1.1.3-wip

* Require `analyzer: ^8.1.1`
* Require `build: ^4.0.0`
* Require `build_config: ^1.2.0`
* Require `source_gen: ^4.0.1`
* Require `sdk: ^3.9.0`

## 1.1.2

* Require `analyzer: '>=7.4.0 <9.0.0'`
Expand Down
148 changes: 76 additions & 72 deletions pkgs/shelf_router_generator/lib/src/shelf_router_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,20 @@ import 'package:shelf_router/src/router_entry.dart' // ignore: implementation_im
import 'package:source_gen/source_gen.dart' as g;

// Type checkers that we need later
const _routeType = g.TypeChecker.fromRuntime(shelf_router.Route);
const _routerType = g.TypeChecker.fromRuntime(shelf_router.Router);
const _responseType = g.TypeChecker.fromRuntime(shelf.Response);
const _requestType = g.TypeChecker.fromRuntime(shelf.Request);
const _stringType = g.TypeChecker.fromRuntime(String);
const _routeType = g.TypeChecker.typeNamed(
shelf_router.Route,
inPackage: 'shelf_router',
);
const _routerType = g.TypeChecker.typeNamed(
shelf_router.Router,
inPackage: 'shelf_router',
);
const _responseType = g.TypeChecker.typeNamed(
shelf.Response,
inPackage: 'shelf',
);
const _requestType = g.TypeChecker.typeNamed(shelf.Request, inPackage: 'shelf');
const _stringType = g.TypeChecker.typeNamed(String, inSdk: true);

/// A representation of a handler that was annotated with [shelf_router.Route].
class _Handler {
Expand All @@ -47,51 +56,50 @@ class _Handler {
/// Find members of a class annotated with [shelf_router.Route].
List<ExecutableElement2> getAnnotatedElementsOrderBySourceOffset(
ClassElement2 cls,
) => <ExecutableElement2>[
...cls.methods2.where(_routeType.hasAnnotationOfExact),
...cls.getters2.where(_routeType.hasAnnotationOfExact),
]..sort(
(a, b) =>
(a.firstFragment.nameOffset2!).compareTo(b.firstFragment.nameOffset2!),
);
) =>
<ExecutableElement2>[
...cls.methods2.where(_routeType.hasAnnotationOfExact),
...cls.getters2.where(_routeType.hasAnnotationOfExact),
]..sort(
(a, b) => (a.firstFragment.nameOffset2!).compareTo(
b.firstFragment.nameOffset2!,
),
);

/// Generate a `_$<className>Router(<className> service)` method that returns a
/// [shelf_router.Router] configured based on annotated handlers.
code.Method _buildRouterMethod({
required ClassElement2 classElement,
required List<_Handler> handlers,
}) => code.Method(
(b) =>
b
..name = '_\$${classElement.name3}Router'
..requiredParameters.add(
code.Parameter(
(b) =>
b
..name = 'service'
..type = code.refer(classElement.name3!),
(b) => b
..name = '_\$${classElement.name3}Router'
..requiredParameters.add(
code.Parameter(
(b) => b
..name = 'service'
..type = code.refer(classElement.name3!),
),
)
..returns = code.refer('Router')
..body = code.Block(
(b) => b
..addExpression(
code
.declareFinal('router')
.assign(code.refer('Router').newInstance([])),
)
..statements.addAll(
handlers.map(
(h) => _buildAddHandlerCode(
router: code.refer('router'),
service: code.refer('service'),
handler: h,
),
),
)
..returns = code.refer('Router')
..body = code.Block(
(b) =>
b
..addExpression(
code
.declareFinal('router')
.assign(code.refer('Router').newInstance([])),
)
..statements.addAll(
handlers.map(
(h) => _buildAddHandlerCode(
router: code.refer('router'),
service: code.refer('service'),
handler: h,
),
),
)
..addExpression(code.refer('router').returned),
),
..addExpression(code.refer('router').returned),
),
);

/// Generate the code statement that adds [handler] from [service] to [router].
Expand All @@ -100,22 +108,19 @@ code.Code _buildAddHandlerCode({
required code.Reference service,
required _Handler handler,
}) => switch (handler.verb) {
r'$mount' =>
router.property('mount').call([
code.literalString(handler.route, raw: true),
service.property(handler.element.name3!).property('call'),
]).statement,
r'$all' =>
router.property('all').call([
code.literalString(handler.route, raw: true),
service.property(handler.element.name3!),
]).statement,
_ =>
router.property('add').call([
code.literalString(handler.verb.toUpperCase()),
code.literalString(handler.route, raw: true),
service.property(handler.element.name3!),
]).statement,
r'$mount' => router.property('mount').call([
code.literalString(handler.route, raw: true),
service.property(handler.element.name3!).property('call'),
]).statement,
r'$all' => router.property('all').call([
code.literalString(handler.route, raw: true),
service.property(handler.element.name3!),
]).statement,
_ => router.property('add').call([
code.literalString(handler.verb.toUpperCase()),
code.literalString(handler.route, raw: true),
service.property(handler.element.name3!),
]).statement,
};

class ShelfRouterGenerator extends g.Generator {
Expand All @@ -131,21 +136,20 @@ class ShelfRouterGenerator extends g.Generator {
}
log.info('found shelf_router.Route annotations in ${cls.name3}');

classes[cls] =
elements
.map(
(e) => _routeType
.annotationsOfExact(e)
.map(
(a) => _Handler(
a.getField('verb')!.toStringValue()!,
a.getField('route')!.toStringValue()!,
e,
),
),
)
.expand((i) => i)
.toList();
classes[cls] = elements
.map(
(e) => _routeType
.annotationsOfExact(e)
.map(
(a) => _Handler(
a.getField('verb')!.toStringValue()!,
a.getField('route')!.toStringValue()!,
e,
),
),
)
.expand((i) => i)
.toList();
}
if (classes.isEmpty) {
return null; // nothing to do if nothing was annotated
Expand Down
16 changes: 8 additions & 8 deletions pkgs/shelf_router_generator/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: shelf_router_generator
version: 1.1.2
version: 1.1.3-wip
description: >
A package:build-compatible builder for generating request routers for the
shelf web-framework based on source annotations.
Expand All @@ -11,21 +11,21 @@ topics:
- shelf

environment:
sdk: ^3.7.0
sdk: ^3.9.0

dependencies:
analyzer: '>=7.4.0 <9.0.0'
build: ^3.0.0
build_config: ^1.1.0
analyzer: ^8.1.1
build: ^4.0.0
build_config: ^1.2.0
code_builder: ^4.2.0
http_methods: ^1.1.0
shelf: ^1.1.0
shelf_router: ^1.1.0
source_gen: ^3.0.0
source_gen: ^4.0.1

dev_dependencies:
build_runner: ^2.6.0
build_runner: ^2.7.2
build_verify: ^3.0.0
dart_flutter_team_lints: ^3.0.0
http: ^1.0.0
test: ^1.25.9
test: ^1.26.3