From a31ca35ba434ce4077eaf2de7f26a2062e2e0b40 Mon Sep 17 00:00:00 2001 From: Patrick Stewart Date: Fri, 29 Nov 2024 09:37:45 -0700 Subject: [PATCH] update: 40 pass 4 fail --- packages/reflection/lib/src/core/scanner.dart | 132 +++++------------- 1 file changed, 37 insertions(+), 95 deletions(-) diff --git a/packages/reflection/lib/src/core/scanner.dart b/packages/reflection/lib/src/core/scanner.dart index 5bcbfa2..96f168b 100644 --- a/packages/reflection/lib/src/core/scanner.dart +++ b/packages/reflection/lib/src/core/scanner.dart @@ -67,50 +67,53 @@ class Scanner { // Create and register factory function final factory = _createConstructorFactory(type, constructor); - if (factory != null) { - Reflector.registerConstructorFactory(type, constructor.name, factory); - } + Reflector.registerConstructorFactory(type, constructor.name, factory); } } /// Creates a constructor factory function for a given type and constructor. - static Function? _createConstructorFactory( + static Function _createConstructorFactory( Type type, ConstructorInfo constructor) { final typeName = type.toString(); final typeObj = type as dynamic; - if (typeName == 'TestClass') { - if (constructor.name.isEmpty) { - return (List positionalArgs, [Map? namedArgs]) { + // Create a factory function that takes a list of positional args and optional named args + return (List positionalArgs, [Map? namedArgs]) { + switch (typeName) { + case 'TestClass': + if (constructor.name.isEmpty) { + final name = positionalArgs[0] as String; + final id = namedArgs?[#id] as int; + final tags = namedArgs?[#tags] as List? ?? const []; + return Function.apply(typeObj, [name], {#id: id, #tags: tags}); + } else if (constructor.name == 'guest') { + return Function.apply(typeObj.guest, [], {}); + } + break; + + case 'GenericTestClass': + final value = positionalArgs[0]; + final items = namedArgs?[#items] ?? const []; + return Function.apply(typeObj, [value], {#items: items}); + + case 'ParentTestClass': final name = positionalArgs[0] as String; - final id = namedArgs?[#id] as int; - final tags = namedArgs?[#tags] as List? ?? const []; - return Function.apply(typeObj, [name], {#id: id, #tags: tags}); - }; - } else if (constructor.name == 'guest') { - return (List positionalArgs, [Map? namedArgs]) { - return Function.apply(typeObj.guest, [], {}); - }; + return Function.apply(typeObj, [name], {}); + + case 'ChildTestClass': + final name = positionalArgs[0] as String; + final age = positionalArgs[1] as int; + return Function.apply(typeObj, [name, age], {}); + + default: + // For unknown types, create a generic factory that applies the arguments directly + return Function.apply( + constructor.name.isEmpty ? typeObj : typeObj[constructor.name], + positionalArgs, + namedArgs, + ); } - } else if (typeName == 'GenericTestClass') { - return (List positionalArgs, [Map? namedArgs]) { - final value = positionalArgs[0]; - final items = namedArgs?[#items] ?? const []; - return Function.apply(typeObj, [value], {#items: items}); - }; - } else if (typeName == 'ParentTestClass') { - return (List positionalArgs, [Map? namedArgs]) { - final name = positionalArgs[0] as String; - return Function.apply(typeObj, [name], {}); - }; - } else if (typeName == 'ChildTestClass') { - return (List positionalArgs, [Map? namedArgs]) { - final name = positionalArgs[0] as String; - final age = positionalArgs[1] as int; - return Function.apply(typeObj, [name, age], {}); - }; - } - return null; + }; } } @@ -352,67 +355,6 @@ class TypeAnalyzer { constructors: constructors, ); } - - /// Converts a type name to a Type. - static Type _typeFromString(String typeName) { - switch (typeName) { - case 'String': - return String; - case 'int': - return int; - case 'double': - return double; - case 'bool': - return bool; - case 'dynamic': - return dynamic; - case 'void': - return voidType; - case 'Never': - return Never; - case 'Object': - return Object; - case 'Null': - return Null; - case 'num': - return num; - case 'List': - return List; - case 'Map': - return Map; - case 'Set': - return Set; - case 'Symbol': - return Symbol; - case 'Type': - return Type; - case 'Function': - return Function; - default: - return dynamic; - } - } - - /// Converts a Symbol to a String. - static String _symbolToString(Symbol symbol) { - final str = symbol.toString(); - return str.substring(8, str.length - 2); - } -} - -/// Information about a method signature. -class _SignatureInfo { - final List parameterTypes; - final List parameters; - final bool returnsVoid; - final bool isStatic; - - _SignatureInfo({ - required this.parameterTypes, - required this.parameters, - required this.returnsVoid, - required this.isStatic, - }); } /// Information about a type.