void (TextBuffer buffer, StructModuleAttribute moduleAttribute) { boolean newLineNeeded = false; List<StructModuleAttribute.RequiresEntry> requiresEntries = moduleAttribute.requires; if (!requiresEntries.isEmpty()) { for (StructModuleAttribute.RequiresEntry requires : requiresEntries) { if (!isGenerated(requires.flags)) { buffer.appendIndent(1).append("requires ").append(requires.moduleName.replace('/', '.')).append(';').appendLineSeparator(); newLineNeeded = true; } } } List<StructModuleAttribute.ExportsEntry> exportsEntries = moduleAttribute.exports; if (!exportsEntries.isEmpty()) { if (newLineNeeded) buffer.appendLineSeparator(); for (StructModuleAttribute.ExportsEntry exports : exportsEntries) { if (!isGenerated(exports.flags)) { buffer.appendIndent(1).append("exports ").append(exports.packageName.replace('/', '.')); List<String> exportToModules = exports.exportToModules; if (exportToModules.size() > 0) { buffer.append(" to").appendLineSeparator(); appendFQClassNames(buffer, exportToModules); } buffer.append(';').appendLineSeparator(); newLineNeeded = true; } } } List<StructModuleAttribute.OpensEntry> opensEntries = moduleAttribute.opens; if (!opensEntries.isEmpty()) { if (newLineNeeded) buffer.appendLineSeparator(); for (StructModuleAttribute.OpensEntry opens : opensEntries) { if (!isGenerated(opens.flags)) { buffer.appendIndent(1).append("opens ").append(opens.packageName.replace('/', '.')); List<String> opensToModules = opens.opensToModules; if (opensToModules.size() > 0) { buffer.append(" to").appendLineSeparator(); appendFQClassNames(buffer, opensToModules); } buffer.append(';').appendLineSeparator(); newLineNeeded = true; } } } List<String> usesEntries = moduleAttribute.uses; if (!usesEntries.isEmpty()) { if (newLineNeeded) buffer.appendLineSeparator(); for (String uses : usesEntries) { buffer.appendIndent(1).append("uses ").append(ExprProcessor.buildJavaClassName(uses)).append(';').appendLineSeparator(); } newLineNeeded = true; } List<StructModuleAttribute.ProvidesEntry> providesEntries = moduleAttribute.provides; if (!providesEntries.isEmpty()) { if (newLineNeeded) buffer.appendLineSeparator(); for (StructModuleAttribute.ProvidesEntry provides : providesEntries) { buffer.appendIndent(1).append("provides ").append(ExprProcessor.buildJavaClassName(provides.interfaceName)).append(" with").appendLineSeparator(); appendFQClassNames(buffer, provides.implementationNames.stream().map(ExprProcessor::buildJavaClassName).collect(Collectors.toList())); buffer.append(';').appendLineSeparator(); } } }