generateCode function

String generateCode(
  1. List<Tuple2<String, String>> folderInfo,
  2. String existingCode
)

Implementation

String generateCode(List<Tuple2<String, String>> folderInfo, String existingCode) {
  Set<String> imports = {};
  Set<String> newImports = {};
  List<String> existingWidgets = [];
  List<String> newWidgets = [];
  Set<String> processedFolders = {}; // To track folders that already have 'usage' or 'newview'

  // 기존 코드에서 import 구문과 widgets 리스트를 추출
  var importRegex = RegExp(r"import\s+'([^']+)' as (\w+);");
  var widgetRegex = RegExp(r"Tuple2\('([^']+)',\s+(\w+)\.(\w+)\(\)\)");

  var importMatches = importRegex.allMatches(existingCode);
  var widgetMatches = widgetRegex.allMatches(existingCode);

  for (var match in importMatches) {
    String importLine = match.group(0)!;
    String importPath = match.group(1)!;
    String asName = match.group(2)!;

    imports.add(importLine);

    if (importPath.endsWith('_/_.dart') || importPath.endsWith('usage.dart')) {
      String folderName = importPath.split('/')[2]; // Extract folder name from import path
      processedFolders.add(folderName);
    }
  }

  for (var match in widgetMatches) {
    existingWidgets.add(match.group(0)!);
  }

  // 새로운 폴더 정보를 처리하여 import 및 widget 항목 추가
  for (var info in folderInfo) {
    String folderName = info.item1;
    String type = info.item2;
    String asName = folderName.replaceAll('.', '_');
    String importLine = "";

    if (processedFolders.contains(folderName)) {
      // Skip if the folder is already processed
      continue;
    }

    if (type == 'usage') {
      importLine = "import '../../widget_book/$folderName/usage.dart' as $asName;";
      if (!imports.any((import) => import.contains("$folderName/usage.dart"))) {
        newImports.add(importLine);
        newWidgets.add("Tuple2('$folderName', $asName.Usage())");
        processedFolders.add(folderName); // Mark folder as processed
      }
    } else if (type == 'newview') {
      importLine = "import '../../widget_book/$folderName/_/_.dart' as $asName;";
      if (!imports.any((import) => import.contains("$folderName/_/_.dart"))) {
        newImports.add(importLine);
        newWidgets.add("Tuple2('$folderName', $asName.NewView())");
        processedFolders.add(folderName); // Mark folder as processed
      }
    }
  }

  String importsCode = (newImports.isNotEmpty ? newImports.join('\n') + '\n' : '') + imports.join('\n');
  String widgetsCode = newWidgets.join(',\n  ') + (newWidgets.isNotEmpty ? ',\n  ' : '') + existingWidgets.join(',\n  ');

  return '''
import 'package:flutter/material.dart';
import 'package:tuple/tuple.dart';

$importsCode

final List<Tuple2<String, Widget>> widgets = [
  $widgetsCode
];
''';
}