# Coding Guidelines (Java written C/C++-style) These rules exist to **preserve intent, structure, and mental parseability**. Formatting must reflect **logic**, not arbitrary line limits or formatter preferences. Java syntax, **C/C++ brain**. --- ## 1. General Philosophy * Java is written **as if it were C/C++** * Formatting must never change perceived control flow * Readability = how fast the code parses *correctly* in your head * Tools must adapt to the codebase, not the other way around --- ## 2. Indentation & Whitespace * **Indentation: 4 spaces** * **No tabs** * Avoid excessive vertical whitespace * Blank lines only where they add logical separation ✅ **Good** ```java int sum(int a, int b) { int r = a + b; return r; } ``` ❌ **Bad** ```java int sum(int a, int b) { int r = a + b; return r; } ``` --- ## 3. Braces * Braces are **always required** * Opening brace stays **on the same line** * Never rely on implicit scopes ✅ **Good** ```java if (value == null) { return; } ``` ❌ **Bad** ```java if (value == null) { return; } ``` > Rationale: new-line braces create **false scope perception** and visual ambiguity. --- ## 4. Imports (IMPORTANT) ### ❗ Never use fully-qualified class names inline ❌ **Forbidden** ```java net.minecraft.util.math.BlockPos pos = new net.minecraft.util.math.BlockPos(0, 0, 0); ``` ✅ **Required** ```java import net.minecraft.util.math.BlockPos; BlockPos pos = new BlockPos(0, 0, 0); ``` ### Why: * Fully-qualified names **destroy readability** * They bloat expressions and hide logic * Imports exist to solve exactly this problem **Rule:** > If you need a class, **import it**. > If imports collide, resolve the collision explicitly — do *not* inline paths everywhere. --- ## 5. Function & Method Definitions * **Method signatures must stay on one line** * Never break parameters across multiple lines * Length is acceptable; ambiguity is not ✅ **Good** ```java void processUser(User user, int flags, boolean force, long timeout) { ... } ``` ❌ **Bad** ```java void processUser( User user, int flags, boolean force, long timeout ) { ... } ``` > Reason: multiline signatures look like scopes and break C/C++ mental parsing. --- ## 6. Function Calls & Argument Layout ### Default rule * **Single-line calls are preferred** * Flat calls stay flat * Length alone is **not** a reason to wrap ✅ **Good** ```java Color color = user.getProfile().getSettings().getTheme().getPrimaryColor(); ``` --- ### When multiline calls ARE allowed (and expected) Multiline calls are allowed **only when**: * The call is **structural / declarative** * Each argument is conceptually distinct * Nesting would otherwise hide meaning ### Example (correct usage) ```java BiomeModifications.addFeature( BiomeSelectors.foundInOverworld(), GenerationStep.Feature.UNDERGROUND_ORES, RegistryKey.of( RegistryKeys.PLACED_FEATURE, new Identifier("chipi", "chipper_ore") ) ); ``` ### Why this is correct: * Each argument represents a **different conceptual layer** * Nested calls are grouped logically * Visual structure mirrors logical structure * This reads like a configuration block, not a simple call --- ### ❌ Incorrect multiline usage ```java doThing( a, b, c ); ``` > This adds vertical noise with **no semantic gain**. --- ## 7. Chained Calls * Flat chains stay on one line * Long or builder-style chains may be split vertically * Each chained step gets its own line ✅ **Good** ```java builder .withColor(theme.getPrimaryColor()) .withSize(32) .enableShadow() .build(); ``` ❌ **Bad** ```java builder.withColor( theme.getPrimaryColor() ).withSize( 32 ).enableShadow().build(); ``` --- ## 8. Control Flow & Returns * **Early returns are encouraged** * Avoid artificial nesting * Single-exit functions are **not required** ✅ **Good** ```java void handle(User user) { if (user == null) return; if (!user.isActive()) return; process(user); } ``` ❌ **Bad** ```java void handle(User user) { if (user != null) { if (user.isActive()) { process(user); } } } ``` --- ## 9. One-Liners * One-liners allowed for **simple guard clauses** * No complex logic on one line ✅ **Allowed** ```java if (value == null) return; ``` ❌ **Not allowed** ```java if (a == b && c != d && flag && check()) doThing(); ``` --- ## 10. Null Handling * `null` is a **valid, intentional state** * Do not over-engineer around it * Prefer clarity over defensive clutter ✅ **Good** ```java User user = findUser(id); if (user == null) return; ``` --- ## 11. Logging & Debug Output * Logging must be **short and readable** * Prefer `System.out.println` for quick diagnostics * Verbose logging only when justified ✅ **Good** ```java System.out.println("Loaded structure: " + id); ``` --- ## 12. Autoformatters & Linters Autoformatters **must not**: * Break method signatures * Move braces to new lines * Introduce unwanted trailing newlines * Rewrap stable code repeatedly If a formatter fights these rules: **disable or reconfigure it**. --- ## Summary (Non-Negotiable) * Java written with **C/C++ structure** * Compact signatures, explicit layout * Imports always used * Multiline only when it adds meaning * Formatting reflects logic, not fashion > If a tool disagrees with this file, the tool is wrong.