Просмотр исходного кода

update: 去除全盘扫描导入查询提高生成速度,完善路由参数自动导入判断

hwh97 4 лет назад
Родитель
Сommit
6997658226

+ 3 - 15
build.yaml

@@ -2,15 +2,10 @@ targets:
   $default:
     builders:
       router_gen|router_gen_build:
-        options: { 'write': true }
+        options: { 'write': false }
         enabled: true
         generate_for:
           exclude: ['**.g.dart']
-      router_gen|model_import_builder:
-        options: { 'write': true }
-        enabled: true
-        generate_for:
-          exclude: [ '**.g.dart' ]
       router_gen|table_builder:
         options: { 'write': true }
         enabled: true
@@ -23,15 +18,8 @@ builders:
     builder_factories: ["generateRouterProvider"]
     build_extensions: {".dart": ['aa.dart']}
     auto_apply: dependents
-    build_to: cache
-    runs_before: [ 'router_gen|model_import_builder' ]
-  model_import_builder:
-    import: "package:router_gen/builder.dart"
-    builder_factories: [ "modelImportBuilder" ]
-    build_extensions: { ".dart": [ 'bb.dart' ] }
-    auto_apply: dependents
-    build_to: cache
-    runs_before: [ 'router_gen|table_builder']
+    build_to: source
+    runs_before: [ 'router_gen|table_builder' ]
   table_builder:
     import: "package:router_gen/builder.dart"
     builder_factories: [ "generateRouterTableProvider" ]

+ 0 - 4
lib/builder.dart

@@ -1,5 +1,4 @@
 import 'package:build/build.dart';
-import 'package:router_gen/generator/model_import_generator.dart';
 import 'package:router_gen/generator/router_table_generator.dart';
 import 'package:source_gen/source_gen.dart';
 import 'generator/router_generator.dart';
@@ -7,8 +6,5 @@ import 'generator/router_generator.dart';
 Builder generateRouterProvider(BuilderOptions options) =>
     LibraryBuilder(RouterGenerator(), generatedExtension: ".aa.dart");
 
-Builder modelImportBuilder(BuilderOptions options) =>
-    LibraryBuilder(ModelImportGenerator(), generatedExtension: ".bb.dart");
-
 Builder generateRouterTableProvider(BuilderOptions options) =>
     LibraryBuilder(RouterTableGenerator(), generatedExtension: ".route.dart");

+ 0 - 82
lib/generator/model_import_generator.dart

@@ -1,82 +0,0 @@
-import 'package:analyzer/dart/element/element.dart';
-import 'package:router_gen/model/router.dart';
-import 'package:router_gen/util/utils.dart';
-import 'package:source_gen/source_gen.dart';
-
-/// find class path from argument
-class ModelImportGenerator extends Generator {
-  const ModelImportGenerator();
-
-  @override
-  Future<String> generate(LibraryReader library, _) async {
-    if (library.classes.isNotEmpty) {
-      Map routerMap = router.routerMap;
-      for (String key in routerMap.keys) {
-        Page page = routerMap[key];
-        for (Argument argument in page.arguments) {
-          if (argument.isImported) continue;
-          if (_isSpeciousType(argument.type)) {
-            // 处理type
-            List<String> type = getType(argument.type);
-            type.removeWhere((element) => _isSpeciousType(element) == false);
-            if (type.length == 0) {
-              continue;
-            }
-            // 比较class name
-            bool isInThisClass = false;
-            for (ClassElement element in library.classes) {
-              if (type.contains(element.displayName)) {
-                isInThisClass = true;
-                break;
-              }
-            }
-            // 添加import
-            if (isInThisClass) {
-              argument.isImported = true;
-              router.imports.add(getImportStr(_));
-            }
-          } else {
-            argument.isImported = true;
-          }
-        }
-      }
-    }
-
-    return null;
-  }
-
-  bool _isSpeciousType(String type) {
-    if (type == "int" ||
-        type == "double" ||
-        type == "num" ||
-        type == "Runes" ||
-        type == "String" ||
-        type == "bool" ||
-        type == "dynamic") {
-      return false;
-    }
-    return true;
-  }
-
-  /// Notice: not contain all situation
-  /// 递归获取type
-  List<String> getType(String type) {
-    if (type.startsWith("List<") == false && type.startsWith("Map<") == false) {
-      return [type];
-    }
-
-    List<String> results = [];
-    if(type.startsWith("List<")) {
-      String result = type.substring(type.indexOf("List<") + 5, type.lastIndexOf(">"));
-      results.addAll(getType(result.trim()));
-    }
-
-    if (type.startsWith("Map<")) {
-      List<String> splits = type.substring(type.indexOf("Map<") + 4, type.lastIndexOf(">")).split(",");
-      results.addAll(getType(splits[0].trim()));
-      results.addAll(getType(splits[1].trim()));
-    }
-
-    return results;
-  }
-}

+ 51 - 0
lib/generator/router_generator.dart

@@ -37,6 +37,41 @@ class RouterGenerator extends GeneratorForAnnotation<RouterPage> {
       for (FieldElement e in (element as ClassElement).fields) {
         if (_paramChecker.hasAnnotationOf(e)) {
           String type = e.type.getDisplayString(withNullability: false);
+          try {
+            Set<String> types = getType(type);
+            for (String importType in types) {
+              // not container all type
+              if (isSpeciousType(importType) == false) {
+                continue;
+              }
+              print("specious type ${importType}");
+              // 添加到imports
+              for (LibraryElement element
+                  in (await buildStep.inputLibrary).importedLibraries) {
+                Uri importUri = element.getType(importType)?.source?.uri;
+
+                if (importUri != null) {
+                  router.imports.add(importUri.toString());
+                } else {
+                  // 查找exports
+                  Set<LibraryElement> exports = allExportedElements(element);
+                  bool exported = false;
+                  for (LibraryElement exportElement in exports) {
+                    print("export element ${exportElement.source?.uri}");
+                    if (exportElement.getType(importType) != null) {
+                      exported = true;
+                      break;
+                    }
+                  }
+                  if (exported) {
+                    router.imports.add(element.source?.uri?.toString());
+                  }
+                }
+              }
+            }
+          } catch (e) {
+            print(e);
+          }
           bool required =
               e.computeConstantValue()?.getField("required")?.toBoolValue();
           page.arguments.add(Argument(
@@ -50,4 +85,20 @@ class RouterGenerator extends GeneratorForAnnotation<RouterPage> {
     }
     return null;
   }
+
+  Set<LibraryElement> allExportedElements(LibraryElement element) {
+    Set<LibraryElement> allElements = Set();
+
+    if (element.exports.isEmpty) {
+      return Set()..add(element);
+    }
+
+    allElements.addAll(element.exportedLibraries);
+    // 查找exports
+    for (LibraryElement exportElement in element.exportedLibraries) {
+      allElements.addAll(allExportedElements(exportElement));
+    }
+
+    return allElements;
+  }
 }

+ 3 - 3
lib/generator/router_table_generator.dart

@@ -26,14 +26,14 @@ class RouterTableGenerator extends GeneratorForAnnotation<RouterTable> {
 
     return """
 import '${relatedFileName}';
-import 'package:fluro/fluro.dart';
+import 'package:fluro/fluro.dart' as fluro;
 import 'package:school_parent/base_plugin/routes.dart';
 ${imports}
 
 class \$${relatedClassName} implements ${relatedClassName} {
   ${pathFiled}
   @override
-  void registerRoutes(Router router) {
+  void registerRoutes(fluro.Router router) {
     ${register}
   }
 }
@@ -59,7 +59,7 @@ class \$${relatedClassName} implements ${relatedClassName} {
 
       register += """
      router.define(${e},
-        handler: Handler(
+        handler: fluro.Handler(
           handlerFunc: (c, p) => ${page[e].name}(
             ${params}
           ),

+ 32 - 2
lib/util/utils.dart

@@ -11,9 +11,39 @@ String getImportStr(BuildStep buildStep) {
   var importStr = "";
   if (buildStep.inputId.path.contains('lib/')) {
     importStr =
-    "package:${buildStep.inputId.package}/${buildStep.inputId.path.replaceFirst('lib/', '')}";
+        "package:${buildStep.inputId.package}/${buildStep.inputId.path.replaceFirst('lib/', '')}";
   } else {
     importStr = "${buildStep.inputId.path}";
   }
   return importStr;
-}
+}
+
+bool isSpeciousType(String type) {
+  if (type == "int" ||
+      type == "double" ||
+      type == "num" ||
+      type == "Runes" ||
+      type == "String" ||
+      type == "bool" ||
+      type == "dynamic" ||
+      type == "List" ||
+      type == "Map" ||
+      type == "dynamic") {
+    return false;
+  }
+  return true;
+}
+
+/// 获取type
+Set<String> getType(String type) {
+  type.replaceAll("<", ",");
+  type.replaceAll(">", ",");
+  return (type
+          .replaceAll("<", ",")
+          .replaceAll(">", ",")
+          .split(",")
+          .map((e) => e.trim())
+          .toList()
+            ..removeWhere((element) => element.trim().isEmpty))
+      .toSet();
+}