CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-com-squareup--javapoet

Java API for generating .java source files programmatically with fluent builder interfaces.

Pending
Overview
Eval results
Files

file-management.mddocs/

File and Package Management

Core functionality for creating and writing Java source files with proper package structure, import management, and output formatting.

Capabilities

JavaFile

Represents a complete Java source file containing a single top-level class, interface, enum, or annotation. Handles package declarations, imports, file comments, and proper Java source formatting.

/**
 * A Java file containing a single top level class.
 */
public final class JavaFile {
    // Public fields
    public final CodeBlock fileComment;
    public final String packageName;
    public final TypeSpec typeSpec;
    public final boolean skipJavaLangImports;
    
    // Static factory method
    public static Builder builder(String packageName, TypeSpec typeSpec);
    
    // Writing methods
    public void writeTo(Appendable out) throws IOException;
    public void writeTo(Path directory) throws IOException;
    public void writeTo(Path directory, Charset charset) throws IOException;
    public Path writeToPath(Path directory) throws IOException;
    public Path writeToPath(Path directory, Charset charset) throws IOException;
    public void writeTo(File directory) throws IOException;
    public File writeToFile(File directory) throws IOException;
    public void writeTo(Filer filer) throws IOException;
    
    // Conversion methods
    public JavaFileObject toJavaFileObject();
    public Builder toBuilder();
    
    // Standard object methods
    public boolean equals(Object o);
    public int hashCode();
    public String toString();
}

Usage Examples:

import com.squareup.javapoet.*;
import javax.lang.model.element.Modifier;

// Create a simple class
TypeSpec myClass = TypeSpec.classBuilder("MyClass")
    .addModifiers(Modifier.PUBLIC)
    .build();

// Create Java file
JavaFile javaFile = JavaFile.builder("com.example", myClass)
    .addFileComment("Generated code - do not modify")
    .build();

// Write to string
String sourceCode = javaFile.toString();

// Write to file system
javaFile.writeTo(Paths.get("src/main/java"));

// Write to annotation processing Filer
javaFile.writeTo(processingEnv.getFiler());

JavaFile.Builder

Builder for configuring JavaFile instances with file comments, static imports, and formatting options.

public static final class Builder {
    // Static import management
    public Builder addStaticImport(Enum<?> constant);
    public Builder addStaticImport(Class<?> clazz, String... names);
    public Builder addStaticImport(ClassName className, String... names);
    
    // File configuration
    public Builder addFileComment(String format, Object... args);
    public Builder skipJavaLangImports(boolean skipJavaLangImports);
    public Builder indent(String indent);
    
    // Build method
    public JavaFile build();
}

Usage Examples:

// Configure file with static imports and comments
JavaFile javaFile = JavaFile.builder("com.example", typeSpec)
    .addFileComment("Auto-generated on $L", new Date())
    .addStaticImport(Collections.class, "emptyList", "singletonList")
    .addStaticImport(Assert.class, "*")
    .skipJavaLangImports(true)
    .indent("    ") // 4 spaces instead of default 2
    .build();

// Static import for enum constants
JavaFile builderFile = JavaFile.builder("com.example", builderClass)
    .addStaticImport(Modifier.PUBLIC)
    .addStaticImport(Modifier.STATIC)
    .build();

File Writing Options

JavaFile provides multiple output methods for different use cases:

Console Output

// Write to System.out
javaFile.writeTo(System.out);

// Write to any Appendable
StringBuilder buffer = new StringBuilder();
javaFile.writeTo(buffer);

File System Output

// Write to directory using standard Java package structure
javaFile.writeTo(Paths.get("src/main/java"));

// Write with specific charset
javaFile.writeTo(Paths.get("src/main/java"), StandardCharsets.UTF_8);

// Write and get the actual output path
Path outputPath = javaFile.writeToPath(Paths.get("src/main/java"));
System.out.println("Wrote to: " + outputPath);

// Legacy File API
javaFile.writeTo(new File("src/main/java"));
File outputFile = javaFile.writeToFile(new File("src/main/java"));

Annotation Processing Output

// Write using javax.annotation.processing.Filer
@Override
public boolean process(Set<? extends TypeElement> annotations, 
                      RoundEnvironment roundEnv) {
    try {
        javaFile.writeTo(processingEnv.getFiler());
    } catch (IOException e) {
        processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, 
            "Failed to write generated file: " + e.getMessage());
    }
    return true;
}

JavaFileObject Integration

// Convert to JavaFileObject for compiler integration
JavaFileObject fileObject = javaFile.toJavaFileObject();

// Use with JavaCompiler
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
Iterable<? extends JavaFileObject> compilationUnits = Arrays.asList(fileObject);
compiler.getTask(null, fileManager, null, null, null, compilationUnits).call();

Import Management

JavaPoet automatically manages imports based on type references in the generated code:

// Types are automatically imported
MethodSpec method = MethodSpec.methodBuilder("process")
    .addParameter(List.class, "items")
    .addParameter(Map.class, "config")
    .returns(Optional.class)
    .addStatement("$T result = new $T<>()", ArrayList.class, ArrayList.class)
    .addStatement("return $T.of(result)", Optional.class)
    .build();

// Generated imports:
// import java.util.List;
// import java.util.Map;
// import java.util.Optional;
// import java.util.ArrayList;

Static Import Control

// Add static imports for cleaner code
JavaFile.builder("com.example", typeSpec)
    .addStaticImport(Collections.class, "emptyList")
    .addStaticImport(Assertions.class, "*")
    .build();

// Results in:
// import static java.util.Collections.emptyList;
// import static org.junit.jupiter.api.Assertions.*;

java.lang Import Control

// Skip java.lang imports (default behavior includes them)
JavaFile.builder("com.example", typeSpec)
    .skipJavaLangImports(true)
    .build();

// Without skipJavaLangImports: import java.lang.String;
// With skipJavaLangImports: String used without import

File Comments and Documentation

// Add file-level comments
JavaFile.builder("com.example", typeSpec)
    .addFileComment("This file was auto-generated on $L", Instant.now())
    .addFileComment("")
    .addFileComment("Copyright (c) $L Example Corp", Year.now().getValue())
    .addFileComment("All rights reserved.")
    .build();

// Generates:
/*
 * This file was auto-generated on 2023-10-15T14:30:00Z
 *
 * Copyright (c) 2023 Example Corp
 * All rights reserved.
 */

Install with Tessl CLI

npx tessl i tessl/maven-com-squareup--javapoet

docs

advanced-types.md

code-generation.md

code-specifications.md

file-management.md

index.md

type-system.md

tile.json