move files into modules
This commit is contained in:
@@ -0,0 +1,131 @@
|
||||
package click.kamil.file_combine;
|
||||
|
||||
import click.kamil.file_combine.common.FileUtils;
|
||||
import org.eclipse.jdt.core.dom.*;
|
||||
import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
|
||||
import org.eclipse.jface.text.Document;
|
||||
import org.eclipse.text.edits.TextEdit;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.*;
|
||||
|
||||
public class JavaConcatenator {
|
||||
|
||||
public static void main(String[] args) throws IOException {
|
||||
Path sourceDir = Path.of("./src/main/java/click/kamil/callgraphexporter/domain");
|
||||
Path outputFile = Path.of("./Combined.java");
|
||||
|
||||
String targetPackage = "click.kamil";
|
||||
|
||||
List<Path> javaFiles = FileUtils.findFilesWithExtension(Set.of(sourceDir), ".java");
|
||||
|
||||
Set<String> uniqueImports = new TreeSet<>();
|
||||
List<String> classBodies = new ArrayList<>();
|
||||
|
||||
for (Path javaFile : javaFiles) {
|
||||
String source = Files.readString(javaFile);
|
||||
FileParseResult result = parseAndTransform(source);
|
||||
uniqueImports.addAll(result.imports);
|
||||
classBodies.add(result.classBody);
|
||||
}
|
||||
|
||||
StringBuilder combinedSource = new StringBuilder();
|
||||
|
||||
// Add package declaration
|
||||
combinedSource.append("package ").append(targetPackage).append(";\n\n");
|
||||
|
||||
// Filter and append imports excluding any from com.example.*
|
||||
for (String imp : uniqueImports) {
|
||||
String normalizedImport = imp.replaceFirst("^import\\s+static\\s+", "")
|
||||
.replaceFirst("^import\\s+", "")
|
||||
.replaceFirst(";$", "");
|
||||
|
||||
if (!normalizedImport.startsWith(targetPackage)) {
|
||||
combinedSource.append(imp).append("\n");
|
||||
}
|
||||
}
|
||||
combinedSource.append("\n");
|
||||
|
||||
// Append all class bodies
|
||||
for (String body : classBodies) {
|
||||
combinedSource.append(body).append("\n");
|
||||
}
|
||||
|
||||
Files.writeString(outputFile, combinedSource.toString());
|
||||
|
||||
System.out.println("Combined Java source written to: " + outputFile);
|
||||
}
|
||||
|
||||
private static FileParseResult parseAndTransform(String source) {
|
||||
ASTParser parser = ASTParser.newParser(AST.getJLSLatest());
|
||||
parser.setSource(source.toCharArray());
|
||||
parser.setKind(ASTParser.K_COMPILATION_UNIT);
|
||||
parser.setResolveBindings(false);
|
||||
|
||||
CompilationUnit cu = (CompilationUnit) parser.createAST(null);
|
||||
|
||||
AST ast = cu.getAST();
|
||||
ASTRewrite rewrite = ASTRewrite.create(ast);
|
||||
|
||||
// Collect imports as strings
|
||||
List<String> imports = new ArrayList<>();
|
||||
for (Object obj : cu.imports()) {
|
||||
ImportDeclaration imp = (ImportDeclaration) obj;
|
||||
imports.add(imp.toString().trim());
|
||||
rewrite.remove(imp, null); // Remove from AST
|
||||
}
|
||||
|
||||
// Remove package declaration
|
||||
if (cu.getPackage() != null) {
|
||||
rewrite.remove(cu.getPackage(), null);
|
||||
}
|
||||
|
||||
// Remove 'public' from type declarations
|
||||
cu.accept(new ASTVisitor() {
|
||||
@Override
|
||||
public boolean visit(TypeDeclaration node) {
|
||||
removePublicModifier(node.modifiers(), rewrite);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(EnumDeclaration node) {
|
||||
removePublicModifier(node.modifiers(), rewrite);
|
||||
return true;
|
||||
}
|
||||
|
||||
private void removePublicModifier(List<IExtendedModifier> modifiers, ASTRewrite rewrite) {
|
||||
for (IExtendedModifier mod : new ArrayList<>(modifiers)) {
|
||||
if (mod.isModifier()) {
|
||||
Modifier m = (Modifier) mod;
|
||||
if (m.isPublic()) {
|
||||
rewrite.remove(m, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
try {
|
||||
Document document = new Document(source);
|
||||
TextEdit edits = rewrite.rewriteAST(document, null);
|
||||
edits.apply(document);
|
||||
String transformedSource = document.get();
|
||||
return new FileParseResult(imports, transformedSource);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Failed to apply AST edits", e);
|
||||
}
|
||||
}
|
||||
|
||||
private static class FileParseResult {
|
||||
List<String> imports;
|
||||
String classBody;
|
||||
|
||||
public FileParseResult(List<String> imports, String classBody) {
|
||||
this.imports = imports;
|
||||
this.classBody = classBody;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package click.kamil.file_combine.common;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
public class FileUtils {
|
||||
public static List<Path> findFilesWithExtension(Set<Path> startDirs, String extension) throws RuntimeException {
|
||||
try (Stream<Path> paths = startDirs.stream()
|
||||
.flatMap(startDir -> {
|
||||
try {
|
||||
return Files.walk(startDir);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
})) {
|
||||
return paths
|
||||
.filter(p -> Files.isRegularFile(p) && p.toString().endsWith(extension))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
}
|
||||
}
|
||||
11
file_combine/src/test/java/click/kamil/MyTest.java
Normal file
11
file_combine/src/test/java/click/kamil/MyTest.java
Normal file
@@ -0,0 +1,11 @@
|
||||
package click.kamil;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
class MyTest {
|
||||
|
||||
@Test
|
||||
void contextLoads() {
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user