Skip to content

Commit dab419d

Browse files
committed
Add TypeChecker.typeNamedLiterally.
1 parent 1fc3fb7 commit dab419d

File tree

2 files changed

+88
-0
lines changed

2 files changed

+88
-0
lines changed

source_gen/lib/src/type_checker.dart

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,16 @@ abstract class TypeChecker {
4040
bool? inSdk,
4141
}) = _NameTypeChecker;
4242

43+
/// Create a new [TypeChecker] for types with name exactly [name].
44+
///
45+
/// Optionally, also pass [inPackage] to restrict to a specific package by
46+
/// name. Set [inSdk] if it's a `dart` package.
47+
const factory TypeChecker.typeNamedLiterally(
48+
String name, {
49+
String? inPackage,
50+
bool? inSdk,
51+
}) = _LiteralNameTypeChecker;
52+
4353
/// Create a new [TypeChecker] backed by a static [type].
4454
const factory TypeChecker.fromStatic(DartType type) = _LibraryTypeChecker;
4555

@@ -270,6 +280,21 @@ class _NameTypeChecker extends TypeChecker {
270280
String toString() => _inPackage == null ? '$_type' : '$_inPackage#$_type';
271281
}
272282

283+
// [_NameTypeChecker] that ignores the `Type` and uses a `String` name.
284+
class _LiteralNameTypeChecker extends _NameTypeChecker {
285+
@override
286+
final String _typeName;
287+
288+
const _LiteralNameTypeChecker(
289+
this._typeName, {
290+
String? inPackage,
291+
bool? inSdk,
292+
}) : super(Object, inPackage: inPackage, inSdk: inSdk);
293+
294+
@override
295+
String toString() => _inPackage == null ? '$_type' : '$_inPackage#$_typeName';
296+
}
297+
273298
// Checks a runtime type against an Uri and Symbol.
274299
class _UriTypeChecker extends TypeChecker {
275300
final String _url;

source_gen/test/type_checker_test.dart

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,69 @@ void main() {
390390
);
391391
});
392392

393+
group('TypeChecker.typeNamedLiterally without package', () {
394+
commonTests(
395+
checkIterable: () => const TypeChecker.typeNamedLiterally('Iterable'),
396+
checkEnum: () => const TypeChecker.typeNamedLiterally('Enum'),
397+
checkEnumMixin: () => const TypeChecker.typeNamedLiterally('MyEnumMixin'),
398+
checkMap: () => const TypeChecker.typeNamedLiterally('Map'),
399+
checkMapMixin: () => const TypeChecker.typeNamedLiterally('MyMapMixin'),
400+
checkHashMap: () => const TypeChecker.typeNamedLiterally('HashMap'),
401+
checkGenerator: () => const TypeChecker.typeNamedLiterally('Generator'),
402+
checkGeneratorForAnnotation:
403+
() => const TypeChecker.typeNamedLiterally('GeneratorForAnnotation'),
404+
);
405+
});
406+
407+
group('TypeChecker.typeNamedLiterally with package', () {
408+
commonTests(
409+
checkIterable:
410+
() => const TypeChecker.typeNamedLiterally(
411+
'Iterable',
412+
inPackage: 'core',
413+
inSdk: true,
414+
),
415+
checkEnum:
416+
() => const TypeChecker.typeNamedLiterally(
417+
'Enum',
418+
inPackage: 'core',
419+
inSdk: true,
420+
),
421+
checkEnumMixin:
422+
() => const TypeChecker.typeNamedLiterally(
423+
'MyEnumMixin',
424+
inPackage: 'source_gen',
425+
),
426+
checkMap:
427+
() => const TypeChecker.typeNamedLiterally(
428+
'Map',
429+
inPackage: 'core',
430+
inSdk: true,
431+
),
432+
checkMapMixin:
433+
() => const TypeChecker.typeNamedLiterally(
434+
'MyMapMixin',
435+
inPackage: 'source_gen',
436+
),
437+
checkHashMap:
438+
() => const TypeChecker.typeNamedLiterally(
439+
'HashMap',
440+
inPackage: 'collection',
441+
inSdk: true,
442+
),
443+
checkGenerator:
444+
() => const TypeChecker.typeNamedLiterally(
445+
'Generator',
446+
inPackage: 'source_gen',
447+
),
448+
checkGeneratorForAnnotation:
449+
() => const TypeChecker.typeNamedLiterally(
450+
'GeneratorForAnnotation',
451+
inPackage: 'source_gen',
452+
),
453+
);
454+
});
455+
393456
group('TypeChecker.forStatic', () {
394457
commonTests(
395458
checkIterable: () => staticIterableChecker,

0 commit comments

Comments
 (0)