From 2116ad9cf097c773eb20fdac721ce12d15be7f97 Mon Sep 17 00:00:00 2001 From: Andrej Valek Date: Sat, 25 Oct 2025 18:49:07 +0200 Subject: [PATCH 1/4] feat(formatting): replace hello-world formatter with real implementation --- .vscode/launch.json | 2 +- README.md | 23 +- docs/images/formatting.gif | Bin 0 -> 2446713 bytes docs/images/highlighting.png | Bin 120349 -> 71466 bytes package.json | 19 +- src/extension.ts | 26 +- src/formatter.ts | 570 +++++++++++++++++++++++++++++++++++ src/test/extension.test.ts | 11 - 8 files changed, 615 insertions(+), 36 deletions(-) create mode 100644 docs/images/formatting.gif create mode 100644 src/formatter.ts diff --git a/.vscode/launch.json b/.vscode/launch.json index 38b117b..54347ac 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -13,7 +13,7 @@ "--extensionDevelopmentPath=${workspaceFolder}" ], "outFiles": [ - "${workspaceFolder}/dist/**/*.js" + "${workspaceFolder}/dist/*.js" ], } ] diff --git a/README.md b/README.md index 81ac1f8..672cd1e 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,21 @@ This extension provides comprehensive syntax highlighting for Device Tree Source *Example of Device Tree file with syntax highlighting enabled* -#### Supported File Extensions +### Formatting + +This extension provides intelligent formatting for Device Tree Source (DTS) files with support for: + +- **Automatic indentation**: Proper nesting levels for nodes, properties, and blocks +- **Line length management**: Configurable maximum line length with smart wrapping +- **Comment preservation**: Maintains inline and block comments during formatting +- **Whitespace normalization**: Consistent spacing around operators and delimiters +- **Property alignment**: Organized layout for property definitions and cell arrays + +![Device Tree Formatting](docs/images/formatting.gif) + +*Example of Device Tree file before and after formatting* + +### Supported File Extensions - `.dts` - Device Tree Source files - `.dtsi` - Device Tree Source Include files @@ -34,15 +48,11 @@ Install this extension from the [Visual Studio Code Marketplace](https://marketp ## Commands -### `DeviceTree: Hello World` - -Displays a welcome message (placeholder command for future DeviceTree functionality). - ### `DeviceTree: Validate Syntax` *(Coming Soon)* Validates DeviceTree syntax and highlights errors. -### `DeviceTree: Format Document` *(Coming Soon)* +### `DeviceTree: Format Document` Formats DeviceTree files according to standard conventions. @@ -77,7 +87,6 @@ We welcome contributions! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guid - Describe the use case and expected functionality - Include examples of DeviceTree syntax that should be supported - ## Changelog Everything related to versions and their release notes can be found in the [CHANGELOG.md](CHANGELOG.md). diff --git a/docs/images/formatting.gif b/docs/images/formatting.gif new file mode 100644 index 0000000000000000000000000000000000000000..47b45f09daa7f7ec329531331cc55f8a81a69529 GIT binary patch literal 2446713 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

YPIg0fd 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