state machine exporter
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -42,4 +42,4 @@ out/
|
|||||||
*.png
|
*.png
|
||||||
*.dot
|
*.dot
|
||||||
*.scxml.xml
|
*.scxml.xml
|
||||||
./Combined.java
|
Combined.java
|
||||||
@@ -1 +1 @@
|
|||||||
rootProject.name = 'statemachinedemo'
|
rootProject.name = 'state machine exporter'
|
||||||
|
|||||||
131
src/main/java/click/kamil/filecombine/JavaConcatenator.java
Normal file
131
src/main/java/click/kamil/filecombine/JavaConcatenator.java
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
package click.kamil.filecombine;
|
||||||
|
|
||||||
|
import click.kamil.springstatemachineexporter.ast.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/springstatemachineexporter/ast");
|
||||||
|
Path outputFile = Path.of("./Combined.java");
|
||||||
|
|
||||||
|
String targetPackage = "click.kamil";
|
||||||
|
|
||||||
|
List<Path> javaFiles = FileUtils.findFilesWithExtension(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.JLS17);
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user