/** * x -> a,b,c : x depends on a,b,c add a,b,c then add x to final code buffer * * @param requiredModuleName module name required */ private void combineRequire(String requiredModuleName) { // if css file, do not combine with js files if (requiredModuleName.endsWith(".css") || // conditional loader requiredModuleName.startsWith("#")) { this.addDependency(requiredModuleName); return; } // if specify exclude this module, just return if (excludePattern != null && excludePattern.matcher(requiredModuleName).matches()) { this.addDependency(requiredModuleName); return; } if (!packages.isModuleExists(requiredModuleName)) { System.out.println("warning: module not found: " + requiredModuleName); this.addDependency(requiredModuleName); return; } Module requiredModule = packages.getModuleFromName(requiredModuleName); if (requiredModule == null) { System.err.println("error: invalid module: " + requiredModuleName); System.exit(1); } // x -> a,b,c // a -> b // reduce redundant parse and recursive if (processedModules.contains(requiredModule)) { return; } if (modulesVisited.contains(requiredModuleName)) { String error = "cyclic dependence: " + ArrayUtils.join(modulesVisited.toArray(new String[modulesVisited.size()]), ",") + "," + requiredModuleName; // if silence ,just return System.err.println(error); System.exit(1); return; } // mark as start for cyclic detection modulesVisited.add(requiredModuleName); requiredModule.completeModuleName(fixModuleName); String[] requires = requiredModule.getRequires(); for (String require : requires) { combineRequire(require); } // remove mark for cyclic detection modulesVisited.remove(modulesVisited.size() - 1); processedModules.add(requiredModule); }