From b4cce85d4ff68ae8a23dfeb757c954f78744f5e7 Mon Sep 17 00:00:00 2001 From: Ruslan <95baes@gmail.com> Date: Wed, 6 Aug 2025 01:27:13 +0600 Subject: [PATCH 1/4] auto gen snippets vscode --- README.md | 11 + build.yaml | 26 +- example/.vscode/dimengen.code-snippets | 107 +++++ example/lib/borders.dimengen.g.part | 397 ++++++++++++++++++ example/lib/dimensions.dimengen.g.part | 265 ++++++++++++ example/lib/insets.dimengen.g.part | 56 +++ example/lib/spaces.dimengen.g.part | 23 + example/pubspec.lock | 30 +- example/pubspec.yaml | 2 +- lib/builder.dart | 5 +- lib/dimengen.dart | 4 + lib/src/builder/snippet_builder.dart | 77 ++++ .../liveTemplates/DimensionsTemplates.xml | 2 + .../builder/snippet_builder.vscode/dart.json | 1 + 14 files changed, 980 insertions(+), 26 deletions(-) create mode 100644 example/.vscode/dimengen.code-snippets create mode 100644 example/lib/borders.dimengen.g.part create mode 100644 example/lib/dimensions.dimengen.g.part create mode 100644 example/lib/insets.dimengen.g.part create mode 100644 example/lib/spaces.dimengen.g.part create mode 100644 lib/src/builder/snippet_builder.dart create mode 100644 lib/src/builder/snippet_builder.idea/liveTemplates/DimensionsTemplates.xml create mode 100644 lib/src/builder/snippet_builder.vscode/dart.json diff --git a/README.md b/README.md index 6fb3b87..23637fa 100644 --- a/README.md +++ b/README.md @@ -153,6 +153,17 @@ Why Use Dimengen? --- +## Snippet generation +After every `build_runner` run two files are produced automatically: + +* `.vscode/dimengen.code-snippets` +* `.idea/liveTemplates/DimensionsTemplates.xml` + +Import them into your IDE (VS Code or Android Studio) and use +`d16`, `in16`, `sp16` … abbreviations instead of magic numbers. + +--- + ## Contributing Have suggestions, ideas, or found a bug? Contributions are welcome! diff --git a/build.yaml b/build.yaml index b91d3cf..24e82d0 100644 --- a/build.yaml +++ b/build.yaml @@ -1,18 +1,26 @@ targets: $default: + sources: + - lib/**.dart builders: - dimengen: - generate_for: - include: - - lib/**.dart - options: - parse_ast: true + dimengen|dimengen: + enabled: true + dimengen|snippet_builder: + enabled: true builders: dimengen: import: "package:dimengen/builder.dart" builder_factories: ["dimengenBuilder"] - build_extensions: {".dart": ["dimengen.g.part"]} + build_extensions: {".dart": [".g.dart"]} auto_apply: dependents - build_to: cache - applies_builders: ["source_gen|combining_builder"] + build_to: source + runs_before: ["source_gen|combining_builder"] + + snippet_builder: + import: "package:dimengen/builder.dart" + builder_factories: ["snippetBuilder"] + build_extensions: {r"$package$": [".vscode/dimengen.code-snippets", ".idea/liveTemplates/DimensionsTemplates.xml"]} + auto_apply: dependents + build_to: source + runs_before: ["source_gen|combining_builder"] diff --git a/example/.vscode/dimengen.code-snippets b/example/.vscode/dimengen.code-snippets new file mode 100644 index 0000000..0f4af65 --- /dev/null +++ b/example/.vscode/dimengen.code-snippets @@ -0,0 +1,107 @@ +{ + "d8": { + "prefix": "d8", + "body": "Dimensions.s", + "description": "Dimensions.s (8.0)" + }, + "in8": { + "prefix": "in8", + "body": "Insets.s", + "description": "Insets.s (8.0)" + }, + "iv8": { + "prefix": "iv8", + "body": "Insets.sVertical", + "description": "Insets.sVertical (8.0)" + }, + "ih8": { + "prefix": "ih8", + "body": "Insets.sHorizontal", + "description": "Insets.sHorizontal (8.0)" + }, + "sp8": { + "prefix": "sp8", + "body": "Spaces.s", + "description": "Spaces.s (8.0)" + }, + "sv8": { + "prefix": "sv8", + "body": "Spaces.sVertical", + "description": "Spaces.sVertical (8.0)" + }, + "sh8": { + "prefix": "sh8", + "body": "Spaces.sHorizontal", + "description": "Spaces.sHorizontal (8.0)" + }, + "d16": { + "prefix": "d16", + "body": "Dimensions.m", + "description": "Dimensions.m (16.0)" + }, + "in16": { + "prefix": "in16", + "body": "Insets.m", + "description": "Insets.m (16.0)" + }, + "iv16": { + "prefix": "iv16", + "body": "Insets.mVertical", + "description": "Insets.mVertical (16.0)" + }, + "ih16": { + "prefix": "ih16", + "body": "Insets.mHorizontal", + "description": "Insets.mHorizontal (16.0)" + }, + "sp16": { + "prefix": "sp16", + "body": "Spaces.m", + "description": "Spaces.m (16.0)" + }, + "sv16": { + "prefix": "sv16", + "body": "Spaces.mVertical", + "description": "Spaces.mVertical (16.0)" + }, + "sh16": { + "prefix": "sh16", + "body": "Spaces.mHorizontal", + "description": "Spaces.mHorizontal (16.0)" + }, + "d24": { + "prefix": "d24", + "body": "Dimensions.l", + "description": "Dimensions.l (24.0)" + }, + "in24": { + "prefix": "in24", + "body": "Insets.l", + "description": "Insets.l (24.0)" + }, + "iv24": { + "prefix": "iv24", + "body": "Insets.lVertical", + "description": "Insets.lVertical (24.0)" + }, + "ih24": { + "prefix": "ih24", + "body": "Insets.lHorizontal", + "description": "Insets.lHorizontal (24.0)" + }, + "sp24": { + "prefix": "sp24", + "body": "Spaces.l", + "description": "Spaces.l (24.0)" + }, + "sv24": { + "prefix": "sv24", + "body": "Spaces.lVertical", + "description": "Spaces.lVertical (24.0)" + }, + "sh24": { + "prefix": "sh24", + "body": "Spaces.lHorizontal", + "description": "Spaces.lHorizontal (24.0)" + } +} \ No newline at end of file diff --git a/example/lib/borders.dimengen.g.part b/example/lib/borders.dimengen.g.part new file mode 100644 index 0000000..6a6670a --- /dev/null +++ b/example/lib/borders.dimengen.g.part @@ -0,0 +1,397 @@ +// ************************************************************************** +// BordersGenerator +// ************************************************************************** + +// -------------------------------------------------- +// This file was generated by the `dimengen` package. +// Any changes to this file may be lost during rebuild. +// +// Generator: https://pub.dev/packages/dimengen +// Author: http://github.com/warioddly +// -------------------------------------------------- + +abstract class Borders { + const Borders._(); + + static const BorderRadius m = BorderRadius.all(Radius.circular(16.0)); + static const BorderRadius mTop = BorderRadius.only( + topLeft: Radius.circular(16.0), + topRight: Radius.circular(16.0), + ); + static const BorderRadius mBottom = BorderRadius.only( + bottomLeft: Radius.circular(16.0), + bottomRight: Radius.circular(16.0), + ); + static const BorderRadius mLeft = BorderRadius.only( + topLeft: Radius.circular(16.0), + bottomLeft: Radius.circular(16.0), + ); + static const BorderRadius mRight = BorderRadius.only( + topRight: Radius.circular(16.0), + bottomRight: Radius.circular(16.0), + ); + static const BorderRadius mVertical = BorderRadius.vertical( + top: Radius.circular(16.0), + bottom: Radius.circular(16.0), + ); + static const BorderRadius mHorizontal = BorderRadius.horizontal( + left: Radius.circular(16.0), + right: Radius.circular(16.0), + ); + static const BorderRadius mTopLeft = BorderRadius.only( + topLeft: Radius.circular(16.0), + ); + static const BorderRadius mTopRight = BorderRadius.only( + topRight: Radius.circular(16.0), + ); + static const BorderRadius mBottomLeft = BorderRadius.only( + bottomLeft: Radius.circular(16.0), + ); + static const BorderRadius mBottomRight = BorderRadius.only( + bottomRight: Radius.circular(16.0), + ); + static const BorderRadius mTopLeftBottomRight = BorderRadius.only( + topLeft: Radius.circular(16.0), + bottomRight: Radius.circular(16.0), + ); + static const BorderRadius mTopRightBottomLeft = BorderRadius.only( + topRight: Radius.circular(16.0), + bottomLeft: Radius.circular(16.0), + ); + static const BorderRadius mTopXslLeft = BorderRadius.only( + topLeft: Radius.circular(16.0), + topRight: Radius.circular(22), + ); + static const BorderRadius mRightXslBottom = BorderRadius.only( + topRight: Radius.circular(16.0), + bottomLeft: Radius.circular(22), + ); + static const BorderRadius mTopXslRight = BorderRadius.only( + topLeft: Radius.circular(16.0), + bottomRight: Radius.circular(22), + ); + static const BorderRadius mBottomXslBottom = BorderRadius.only( + bottomLeft: Radius.circular(16.0), + bottomRight: Radius.circular(22), + ); + static const BorderRadius mTopXlLeft = BorderRadius.only( + topLeft: Radius.circular(16.0), + topRight: Radius.circular(28), + ); + static const BorderRadius mRightXlBottom = BorderRadius.only( + topRight: Radius.circular(16.0), + bottomLeft: Radius.circular(28), + ); + static const BorderRadius mTopXlRight = BorderRadius.only( + topLeft: Radius.circular(16.0), + bottomRight: Radius.circular(28), + ); + static const BorderRadius mBottomXlBottom = BorderRadius.only( + bottomLeft: Radius.circular(16.0), + bottomRight: Radius.circular(28), + ); + static const BorderRadius mTopSLeft = BorderRadius.only( + topLeft: Radius.circular(16.0), + topRight: Radius.circular(24.0), + ); + static const BorderRadius mRightSBottom = BorderRadius.only( + topRight: Radius.circular(16.0), + bottomLeft: Radius.circular(24.0), + ); + static const BorderRadius mTopSRight = BorderRadius.only( + topLeft: Radius.circular(16.0), + bottomRight: Radius.circular(24.0), + ); + static const BorderRadius mBottomSBottom = BorderRadius.only( + bottomLeft: Radius.circular(16.0), + bottomRight: Radius.circular(24.0), + ); + static const BorderRadius xsl = BorderRadius.all(Radius.circular(22)); + static const BorderRadius xslTop = BorderRadius.only( + topLeft: Radius.circular(22), + topRight: Radius.circular(22), + ); + static const BorderRadius xslBottom = BorderRadius.only( + bottomLeft: Radius.circular(22), + bottomRight: Radius.circular(22), + ); + static const BorderRadius xslLeft = BorderRadius.only( + topLeft: Radius.circular(22), + bottomLeft: Radius.circular(22), + ); + static const BorderRadius xslRight = BorderRadius.only( + topRight: Radius.circular(22), + bottomRight: Radius.circular(22), + ); + static const BorderRadius xslVertical = BorderRadius.vertical( + top: Radius.circular(22), + bottom: Radius.circular(22), + ); + static const BorderRadius xslHorizontal = BorderRadius.horizontal( + left: Radius.circular(22), + right: Radius.circular(22), + ); + static const BorderRadius xslTopLeft = BorderRadius.only( + topLeft: Radius.circular(22), + ); + static const BorderRadius xslTopRight = BorderRadius.only( + topRight: Radius.circular(22), + ); + static const BorderRadius xslBottomLeft = BorderRadius.only( + bottomLeft: Radius.circular(22), + ); + static const BorderRadius xslBottomRight = BorderRadius.only( + bottomRight: Radius.circular(22), + ); + static const BorderRadius xslTopLeftBottomRight = BorderRadius.only( + topLeft: Radius.circular(22), + bottomRight: Radius.circular(22), + ); + static const BorderRadius xslTopRightBottomLeft = BorderRadius.only( + topRight: Radius.circular(22), + bottomLeft: Radius.circular(22), + ); + static const BorderRadius xslTopMLeft = BorderRadius.only( + topLeft: Radius.circular(22), + topRight: Radius.circular(16.0), + ); + static const BorderRadius xslRightMBottom = BorderRadius.only( + topRight: Radius.circular(22), + bottomLeft: Radius.circular(16.0), + ); + static const BorderRadius xslTopMRight = BorderRadius.only( + topLeft: Radius.circular(22), + bottomRight: Radius.circular(16.0), + ); + static const BorderRadius xslBottomMBottom = BorderRadius.only( + bottomLeft: Radius.circular(22), + bottomRight: Radius.circular(16.0), + ); + static const BorderRadius xslTopXlLeft = BorderRadius.only( + topLeft: Radius.circular(22), + topRight: Radius.circular(28), + ); + static const BorderRadius xslRightXlBottom = BorderRadius.only( + topRight: Radius.circular(22), + bottomLeft: Radius.circular(28), + ); + static const BorderRadius xslTopXlRight = BorderRadius.only( + topLeft: Radius.circular(22), + bottomRight: Radius.circular(28), + ); + static const BorderRadius xslBottomXlBottom = BorderRadius.only( + bottomLeft: Radius.circular(22), + bottomRight: Radius.circular(28), + ); + static const BorderRadius xslTopSLeft = BorderRadius.only( + topLeft: Radius.circular(22), + topRight: Radius.circular(24.0), + ); + static const BorderRadius xslRightSBottom = BorderRadius.only( + topRight: Radius.circular(22), + bottomLeft: Radius.circular(24.0), + ); + static const BorderRadius xslTopSRight = BorderRadius.only( + topLeft: Radius.circular(22), + bottomRight: Radius.circular(24.0), + ); + static const BorderRadius xslBottomSBottom = BorderRadius.only( + bottomLeft: Radius.circular(22), + bottomRight: Radius.circular(24.0), + ); + static const BorderRadius xl = BorderRadius.all(Radius.circular(28)); + static const BorderRadius xlTop = BorderRadius.only( + topLeft: Radius.circular(28), + topRight: Radius.circular(28), + ); + static const BorderRadius xlBottom = BorderRadius.only( + bottomLeft: Radius.circular(28), + bottomRight: Radius.circular(28), + ); + static const BorderRadius xlLeft = BorderRadius.only( + topLeft: Radius.circular(28), + bottomLeft: Radius.circular(28), + ); + static const BorderRadius xlRight = BorderRadius.only( + topRight: Radius.circular(28), + bottomRight: Radius.circular(28), + ); + static const BorderRadius xlVertical = BorderRadius.vertical( + top: Radius.circular(28), + bottom: Radius.circular(28), + ); + static const BorderRadius xlHorizontal = BorderRadius.horizontal( + left: Radius.circular(28), + right: Radius.circular(28), + ); + static const BorderRadius xlTopLeft = BorderRadius.only( + topLeft: Radius.circular(28), + ); + static const BorderRadius xlTopRight = BorderRadius.only( + topRight: Radius.circular(28), + ); + static const BorderRadius xlBottomLeft = BorderRadius.only( + bottomLeft: Radius.circular(28), + ); + static const BorderRadius xlBottomRight = BorderRadius.only( + bottomRight: Radius.circular(28), + ); + static const BorderRadius xlTopLeftBottomRight = BorderRadius.only( + topLeft: Radius.circular(28), + bottomRight: Radius.circular(28), + ); + static const BorderRadius xlTopRightBottomLeft = BorderRadius.only( + topRight: Radius.circular(28), + bottomLeft: Radius.circular(28), + ); + static const BorderRadius xlTopMLeft = BorderRadius.only( + topLeft: Radius.circular(28), + topRight: Radius.circular(16.0), + ); + static const BorderRadius xlRightMBottom = BorderRadius.only( + topRight: Radius.circular(28), + bottomLeft: Radius.circular(16.0), + ); + static const BorderRadius xlTopMRight = BorderRadius.only( + topLeft: Radius.circular(28), + bottomRight: Radius.circular(16.0), + ); + static const BorderRadius xlBottomMBottom = BorderRadius.only( + bottomLeft: Radius.circular(28), + bottomRight: Radius.circular(16.0), + ); + static const BorderRadius xlTopXslLeft = BorderRadius.only( + topLeft: Radius.circular(28), + topRight: Radius.circular(22), + ); + static const BorderRadius xlRightXslBottom = BorderRadius.only( + topRight: Radius.circular(28), + bottomLeft: Radius.circular(22), + ); + static const BorderRadius xlTopXslRight = BorderRadius.only( + topLeft: Radius.circular(28), + bottomRight: Radius.circular(22), + ); + static const BorderRadius xlBottomXslBottom = BorderRadius.only( + bottomLeft: Radius.circular(28), + bottomRight: Radius.circular(22), + ); + static const BorderRadius xlTopSLeft = BorderRadius.only( + topLeft: Radius.circular(28), + topRight: Radius.circular(24.0), + ); + static const BorderRadius xlRightSBottom = BorderRadius.only( + topRight: Radius.circular(28), + bottomLeft: Radius.circular(24.0), + ); + static const BorderRadius xlTopSRight = BorderRadius.only( + topLeft: Radius.circular(28), + bottomRight: Radius.circular(24.0), + ); + static const BorderRadius xlBottomSBottom = BorderRadius.only( + bottomLeft: Radius.circular(28), + bottomRight: Radius.circular(24.0), + ); + static const BorderRadius s = BorderRadius.all(Radius.circular(24.0)); + static const BorderRadius sTop = BorderRadius.only( + topLeft: Radius.circular(24.0), + topRight: Radius.circular(24.0), + ); + static const BorderRadius sBottom = BorderRadius.only( + bottomLeft: Radius.circular(24.0), + bottomRight: Radius.circular(24.0), + ); + static const BorderRadius sLeft = BorderRadius.only( + topLeft: Radius.circular(24.0), + bottomLeft: Radius.circular(24.0), + ); + static const BorderRadius sRight = BorderRadius.only( + topRight: Radius.circular(24.0), + bottomRight: Radius.circular(24.0), + ); + static const BorderRadius sVertical = BorderRadius.vertical( + top: Radius.circular(24.0), + bottom: Radius.circular(24.0), + ); + static const BorderRadius sHorizontal = BorderRadius.horizontal( + left: Radius.circular(24.0), + right: Radius.circular(24.0), + ); + static const BorderRadius sTopLeft = BorderRadius.only( + topLeft: Radius.circular(24.0), + ); + static const BorderRadius sTopRight = BorderRadius.only( + topRight: Radius.circular(24.0), + ); + static const BorderRadius sBottomLeft = BorderRadius.only( + bottomLeft: Radius.circular(24.0), + ); + static const BorderRadius sBottomRight = BorderRadius.only( + bottomRight: Radius.circular(24.0), + ); + static const BorderRadius sTopLeftBottomRight = BorderRadius.only( + topLeft: Radius.circular(24.0), + bottomRight: Radius.circular(24.0), + ); + static const BorderRadius sTopRightBottomLeft = BorderRadius.only( + topRight: Radius.circular(24.0), + bottomLeft: Radius.circular(24.0), + ); + static const BorderRadius sTopMLeft = BorderRadius.only( + topLeft: Radius.circular(24.0), + topRight: Radius.circular(16.0), + ); + static const BorderRadius sRightMBottom = BorderRadius.only( + topRight: Radius.circular(24.0), + bottomLeft: Radius.circular(16.0), + ); + static const BorderRadius sTopMRight = BorderRadius.only( + topLeft: Radius.circular(24.0), + bottomRight: Radius.circular(16.0), + ); + static const BorderRadius sBottomMBottom = BorderRadius.only( + bottomLeft: Radius.circular(24.0), + bottomRight: Radius.circular(16.0), + ); + static const BorderRadius sTopXslLeft = BorderRadius.only( + topLeft: Radius.circular(24.0), + topRight: Radius.circular(22), + ); + static const BorderRadius sRightXslBottom = BorderRadius.only( + topRight: Radius.circular(24.0), + bottomLeft: Radius.circular(22), + ); + static const BorderRadius sTopXslRight = BorderRadius.only( + topLeft: Radius.circular(24.0), + bottomRight: Radius.circular(22), + ); + static const BorderRadius sBottomXslBottom = BorderRadius.only( + bottomLeft: Radius.circular(24.0), + bottomRight: Radius.circular(22), + ); + static const BorderRadius sTopXlLeft = BorderRadius.only( + topLeft: Radius.circular(24.0), + topRight: Radius.circular(28), + ); + static const BorderRadius sRightXlBottom = BorderRadius.only( + topRight: Radius.circular(24.0), + bottomLeft: Radius.circular(28), + ); + static const BorderRadius sTopXlRight = BorderRadius.only( + topLeft: Radius.circular(24.0), + bottomRight: Radius.circular(28), + ); + static const BorderRadius sBottomXlBottom = BorderRadius.only( + bottomLeft: Radius.circular(24.0), + bottomRight: Radius.circular(28), + ); + + static const BorderRadius customTakeProperty = BorderRadius.only( + topLeft: Radius.circular(_Borders.s), + topRight: Radius.circular(_Borders.s), + ); + + static String hello() => 'Hello World!'; + + static get getBorder => BorderRadius.all(Radius.circular(_Borders.s)); +} diff --git a/example/lib/dimensions.dimengen.g.part b/example/lib/dimensions.dimengen.g.part new file mode 100644 index 0000000..bb3ff6f --- /dev/null +++ b/example/lib/dimensions.dimengen.g.part @@ -0,0 +1,265 @@ +// ************************************************************************** +// DimensionsGenerator +// ************************************************************************** + +// -------------------------------------------------- +// This file was generated by the `dimengen` package. +// Any changes to this file may be lost during rebuild. +// +// Generator: https://pub.dev/packages/dimengen +// Author: http://github.com/warioddly +// -------------------------------------------------- + +abstract class Borders { + const Borders._(); + + static const BorderRadius s = BorderRadius.all(Radius.circular(8.0)); + static const BorderRadius sTop = BorderRadius.only( + topLeft: Radius.circular(8.0), + topRight: Radius.circular(8.0), + ); + static const BorderRadius sBottom = BorderRadius.only( + bottomLeft: Radius.circular(8.0), + bottomRight: Radius.circular(8.0), + ); + static const BorderRadius sLeft = BorderRadius.only( + topLeft: Radius.circular(8.0), + bottomLeft: Radius.circular(8.0), + ); + static const BorderRadius sRight = BorderRadius.only( + topRight: Radius.circular(8.0), + bottomRight: Radius.circular(8.0), + ); + static const BorderRadius sVertical = BorderRadius.vertical( + top: Radius.circular(8.0), + bottom: Radius.circular(8.0), + ); + static const BorderRadius sHorizontal = BorderRadius.horizontal( + left: Radius.circular(8.0), + right: Radius.circular(8.0), + ); + static const BorderRadius sTopLeft = BorderRadius.only( + topLeft: Radius.circular(8.0), + ); + static const BorderRadius sTopRight = BorderRadius.only( + topRight: Radius.circular(8.0), + ); + static const BorderRadius sBottomLeft = BorderRadius.only( + bottomLeft: Radius.circular(8.0), + ); + static const BorderRadius sBottomRight = BorderRadius.only( + bottomRight: Radius.circular(8.0), + ); + static const BorderRadius sTopLeftBottomRight = BorderRadius.only( + topLeft: Radius.circular(8.0), + bottomRight: Radius.circular(8.0), + ); + static const BorderRadius sTopRightBottomLeft = BorderRadius.only( + topRight: Radius.circular(8.0), + bottomLeft: Radius.circular(8.0), + ); + static const BorderRadius sTopMLeft = BorderRadius.only( + topLeft: Radius.circular(8.0), + topRight: Radius.circular(16.0), + ); + static const BorderRadius sRightMBottom = BorderRadius.only( + topRight: Radius.circular(8.0), + bottomLeft: Radius.circular(16.0), + ); + static const BorderRadius sTopMRight = BorderRadius.only( + topLeft: Radius.circular(8.0), + bottomRight: Radius.circular(16.0), + ); + static const BorderRadius sBottomMBottom = BorderRadius.only( + bottomLeft: Radius.circular(8.0), + bottomRight: Radius.circular(16.0), + ); + static const BorderRadius sTopLLeft = BorderRadius.only( + topLeft: Radius.circular(8.0), + topRight: Radius.circular(24.0), + ); + static const BorderRadius sRightLBottom = BorderRadius.only( + topRight: Radius.circular(8.0), + bottomLeft: Radius.circular(24.0), + ); + static const BorderRadius sTopLRight = BorderRadius.only( + topLeft: Radius.circular(8.0), + bottomRight: Radius.circular(24.0), + ); + static const BorderRadius sBottomLBottom = BorderRadius.only( + bottomLeft: Radius.circular(8.0), + bottomRight: Radius.circular(24.0), + ); + static const BorderRadius m = BorderRadius.all(Radius.circular(16.0)); + static const BorderRadius mTop = BorderRadius.only( + topLeft: Radius.circular(16.0), + topRight: Radius.circular(16.0), + ); + static const BorderRadius mBottom = BorderRadius.only( + bottomLeft: Radius.circular(16.0), + bottomRight: Radius.circular(16.0), + ); + static const BorderRadius mLeft = BorderRadius.only( + topLeft: Radius.circular(16.0), + bottomLeft: Radius.circular(16.0), + ); + static const BorderRadius mRight = BorderRadius.only( + topRight: Radius.circular(16.0), + bottomRight: Radius.circular(16.0), + ); + static const BorderRadius mVertical = BorderRadius.vertical( + top: Radius.circular(16.0), + bottom: Radius.circular(16.0), + ); + static const BorderRadius mHorizontal = BorderRadius.horizontal( + left: Radius.circular(16.0), + right: Radius.circular(16.0), + ); + static const BorderRadius mTopLeft = BorderRadius.only( + topLeft: Radius.circular(16.0), + ); + static const BorderRadius mTopRight = BorderRadius.only( + topRight: Radius.circular(16.0), + ); + static const BorderRadius mBottomLeft = BorderRadius.only( + bottomLeft: Radius.circular(16.0), + ); + static const BorderRadius mBottomRight = BorderRadius.only( + bottomRight: Radius.circular(16.0), + ); + static const BorderRadius mTopLeftBottomRight = BorderRadius.only( + topLeft: Radius.circular(16.0), + bottomRight: Radius.circular(16.0), + ); + static const BorderRadius mTopRightBottomLeft = BorderRadius.only( + topRight: Radius.circular(16.0), + bottomLeft: Radius.circular(16.0), + ); + static const BorderRadius mTopSLeft = BorderRadius.only( + topLeft: Radius.circular(16.0), + topRight: Radius.circular(8.0), + ); + static const BorderRadius mRightSBottom = BorderRadius.only( + topRight: Radius.circular(16.0), + bottomLeft: Radius.circular(8.0), + ); + static const BorderRadius mTopSRight = BorderRadius.only( + topLeft: Radius.circular(16.0), + bottomRight: Radius.circular(8.0), + ); + static const BorderRadius mBottomSBottom = BorderRadius.only( + bottomLeft: Radius.circular(16.0), + bottomRight: Radius.circular(8.0), + ); + static const BorderRadius mTopLLeft = BorderRadius.only( + topLeft: Radius.circular(16.0), + topRight: Radius.circular(24.0), + ); + static const BorderRadius mRightLBottom = BorderRadius.only( + topRight: Radius.circular(16.0), + bottomLeft: Radius.circular(24.0), + ); + static const BorderRadius mTopLRight = BorderRadius.only( + topLeft: Radius.circular(16.0), + bottomRight: Radius.circular(24.0), + ); + static const BorderRadius mBottomLBottom = BorderRadius.only( + bottomLeft: Radius.circular(16.0), + bottomRight: Radius.circular(24.0), + ); + static const BorderRadius l = BorderRadius.all(Radius.circular(24.0)); + static const BorderRadius lTop = BorderRadius.only( + topLeft: Radius.circular(24.0), + topRight: Radius.circular(24.0), + ); + static const BorderRadius lBottom = BorderRadius.only( + bottomLeft: Radius.circular(24.0), + bottomRight: Radius.circular(24.0), + ); + static const BorderRadius lLeft = BorderRadius.only( + topLeft: Radius.circular(24.0), + bottomLeft: Radius.circular(24.0), + ); + static const BorderRadius lRight = BorderRadius.only( + topRight: Radius.circular(24.0), + bottomRight: Radius.circular(24.0), + ); + static const BorderRadius lVertical = BorderRadius.vertical( + top: Radius.circular(24.0), + bottom: Radius.circular(24.0), + ); + static const BorderRadius lHorizontal = BorderRadius.horizontal( + left: Radius.circular(24.0), + right: Radius.circular(24.0), + ); + static const BorderRadius lTopLeft = BorderRadius.only( + topLeft: Radius.circular(24.0), + ); + static const BorderRadius lTopRight = BorderRadius.only( + topRight: Radius.circular(24.0), + ); + static const BorderRadius lBottomLeft = BorderRadius.only( + bottomLeft: Radius.circular(24.0), + ); + static const BorderRadius lBottomRight = BorderRadius.only( + bottomRight: Radius.circular(24.0), + ); + static const BorderRadius lTopLeftBottomRight = BorderRadius.only( + topLeft: Radius.circular(24.0), + bottomRight: Radius.circular(24.0), + ); + static const BorderRadius lTopRightBottomLeft = BorderRadius.only( + topRight: Radius.circular(24.0), + bottomLeft: Radius.circular(24.0), + ); + static const BorderRadius lTopSLeft = BorderRadius.only( + topLeft: Radius.circular(24.0), + topRight: Radius.circular(8.0), + ); + static const BorderRadius lRightSBottom = BorderRadius.only( + topRight: Radius.circular(24.0), + bottomLeft: Radius.circular(8.0), + ); + static const BorderRadius lTopSRight = BorderRadius.only( + topLeft: Radius.circular(24.0), + bottomRight: Radius.circular(8.0), + ); + static const BorderRadius lBottomSBottom = BorderRadius.only( + bottomLeft: Radius.circular(24.0), + bottomRight: Radius.circular(8.0), + ); + static const BorderRadius lTopMLeft = BorderRadius.only( + topLeft: Radius.circular(24.0), + topRight: Radius.circular(16.0), + ); + static const BorderRadius lRightMBottom = BorderRadius.only( + topRight: Radius.circular(24.0), + bottomLeft: Radius.circular(16.0), + ); + static const BorderRadius lTopMRight = BorderRadius.only( + topLeft: Radius.circular(24.0), + bottomRight: Radius.circular(16.0), + ); + static const BorderRadius lBottomMBottom = BorderRadius.only( + bottomLeft: Radius.circular(24.0), + bottomRight: Radius.circular(16.0), + ); +} + +abstract class DesignSpaces { + const DesignSpaces._(); + + static const SizedBox s = SizedBox.square(dimension: 8.0); + static const SizedBox sVertical = SizedBox(height: 8.0); + static const SizedBox sHorizontal = SizedBox(width: 8.0); + static const SizedBox m = SizedBox.square(dimension: 16.0); + static const SizedBox mVertical = SizedBox(height: 16.0); + static const SizedBox mHorizontal = SizedBox(width: 16.0); + static const SizedBox l = SizedBox.square(dimension: 24.0); + static const SizedBox lVertical = SizedBox(height: 24.0); + static const SizedBox lHorizontal = SizedBox(width: 24.0); + + static SizedBox h(double value) => SizedBox(height: value); + static SizedBox w(double value) => SizedBox(width: value); + static SizedBox square(double value) => SizedBox.square(dimension: value); +} diff --git a/example/lib/insets.dimengen.g.part b/example/lib/insets.dimengen.g.part new file mode 100644 index 0000000..9e4f111 --- /dev/null +++ b/example/lib/insets.dimengen.g.part @@ -0,0 +1,56 @@ +// ************************************************************************** +// InsetsGenerator +// ************************************************************************** + +// -------------------------------------------------- +// This file was generated by the `dimengen` package. +// Any changes to this file may be lost during rebuild. +// +// Generator: https://pub.dev/packages/dimengen +// Author: http://github.com/warioddly +// -------------------------------------------------- + +abstract class Insets { + const Insets._(); + + static const EdgeInsets m = EdgeInsets.all(16.0); + static const EdgeInsets mTop = EdgeInsets.only(top: 16.0); + static const EdgeInsets mBottom = EdgeInsets.only(bottom: 16.0); + static const EdgeInsets mLeft = EdgeInsets.only(left: 16.0); + static const EdgeInsets mRight = EdgeInsets.only(right: 16.0); + static const EdgeInsets mVertical = EdgeInsets.symmetric(vertical: 16.0); + static const EdgeInsets mHorizontal = EdgeInsets.symmetric(horizontal: 16.0); + static const EdgeInsets mTopLBottom = EdgeInsets.only( + top: 16.0, + bottom: 24.0, + ); + static const EdgeInsets mLeftLRight = EdgeInsets.only( + left: 16.0, + right: 24.0, + ); + static const EdgeInsets mTopLLeft = EdgeInsets.only(top: 16.0, left: 24.0); + static const EdgeInsets mRightLBottom = EdgeInsets.only( + right: 16.0, + bottom: 24.0, + ); + static const EdgeInsets l = EdgeInsets.all(24.0); + static const EdgeInsets lTop = EdgeInsets.only(top: 24.0); + static const EdgeInsets lBottom = EdgeInsets.only(bottom: 24.0); + static const EdgeInsets lLeft = EdgeInsets.only(left: 24.0); + static const EdgeInsets lRight = EdgeInsets.only(right: 24.0); + static const EdgeInsets lVertical = EdgeInsets.symmetric(vertical: 24.0); + static const EdgeInsets lHorizontal = EdgeInsets.symmetric(horizontal: 24.0); + static const EdgeInsets lTopMBottom = EdgeInsets.only( + top: 24.0, + bottom: 16.0, + ); + static const EdgeInsets lLeftMRight = EdgeInsets.only( + left: 24.0, + right: 16.0, + ); + static const EdgeInsets lTopMLeft = EdgeInsets.only(top: 24.0, left: 16.0); + static const EdgeInsets lRightMBottom = EdgeInsets.only( + right: 24.0, + bottom: 16.0, + ); +} diff --git a/example/lib/spaces.dimengen.g.part b/example/lib/spaces.dimengen.g.part new file mode 100644 index 0000000..58136c1 --- /dev/null +++ b/example/lib/spaces.dimengen.g.part @@ -0,0 +1,23 @@ +// ************************************************************************** +// SpacesGenerator +// ************************************************************************** + +// -------------------------------------------------- +// This file was generated by the `dimengen` package. +// Any changes to this file may be lost during rebuild. +// +// Generator: https://pub.dev/packages/dimengen +// Author: http://github.com/warioddly +// -------------------------------------------------- + +abstract class Spaces { + const Spaces._(); + + static const SizedBox m = SizedBox.square(dimension: 24.0); + static const SizedBox mVertical = SizedBox(height: 24.0); + static const SizedBox mHorizontal = SizedBox(width: 24.0); + + static SizedBox h(double value) => SizedBox(height: value); + static SizedBox w(double value) => SizedBox(width: value); + static SizedBox square(double value) => SizedBox.square(dimension: value); +} diff --git a/example/pubspec.lock b/example/pubspec.lock index ea26e74..34c34d3 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -50,10 +50,10 @@ packages: dependency: transitive description: name: build - sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 + sha256: "51dc711996cbf609b90cbe5b335bbce83143875a9d58e4b5c6d3c4f684d3dda7" url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.5.4" build_config: dependency: transitive description: @@ -74,26 +74,26 @@ packages: dependency: transitive description: name: build_resolvers - sha256: b9e4fda21d846e192628e7a4f6deda6888c36b5b69ba02ff291a01fd529140f0 + sha256: ee4257b3f20c0c90e72ed2b57ad637f694ccba48839a821e87db762548c22a62 url: "https://pub.dev" source: hosted - version: "2.4.4" + version: "2.5.4" build_runner: dependency: "direct dev" description: name: build_runner - sha256: "058fe9dce1de7d69c4b84fada934df3e0153dd000758c4d65964d0166779aa99" + sha256: "382a4d649addbfb7ba71a3631df0ec6a45d5ab9b098638144faf27f02778eb53" url: "https://pub.dev" source: hosted - version: "2.4.15" + version: "2.5.4" build_runner_core: dependency: transitive description: name: build_runner_core - sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021" + sha256: "85fbbb1036d576d966332a3f5ce83f2ce66a40bea1a94ad2d5fc29a19a0d3792" url: "https://pub.dev" source: hosted - version: "8.0.0" + version: "9.1.2" built_collection: dependency: transitive description: @@ -106,10 +106,10 @@ packages: dependency: transitive description: name: built_value - sha256: "082001b5c3dc495d4a42f1d5789990505df20d8547d42507c29050af6933ee27" + sha256: "0b1b12a0a549605e5f04476031cd0bc91ead1d7c8e830773a18ee54179b3cb62" url: "https://pub.dev" source: hosted - version: "8.10.1" + version: "8.11.0" characters: dependency: transitive description: @@ -122,10 +122,10 @@ packages: dependency: transitive description: name: checked_yaml - sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.0.4" clock: dependency: transitive description: @@ -188,7 +188,7 @@ packages: path: ".." relative: true source: path - version: "0.2.1" + version: "0.4.0" fake_async: dependency: transitive description: @@ -583,10 +583,10 @@ packages: dependency: transitive description: name: watcher - sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104" + sha256: "0b7fd4a0bbc4b92641dbf20adfd7e3fd1398fe17102d94b674234563e110088a" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" web: dependency: transitive description: diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 59482f8..f01c517 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -34,7 +34,7 @@ dev_dependencies: sdk: flutter flutter_test: sdk: flutter - build_runner: ^2.4.15 + build_runner: ^2.5.4 # The "flutter_lints" package below contains a set of recommended lints to # encourage good coding practices. The lint set provided by the package is diff --git a/lib/builder.dart b/lib/builder.dart index 77cdbc5..180d337 100644 --- a/lib/builder.dart +++ b/lib/builder.dart @@ -1,4 +1,5 @@ import 'package:build/build.dart'; +import 'package:dimengen/src/builder/snippet_builder.dart'; import 'package:dimengen/src/generators/borders_generator.dart'; import 'package:dimengen/src/generators/spaces_generator.dart'; import 'package:dimengen/src/generators/dimensions_generator.dart'; @@ -17,4 +18,6 @@ Builder dimengenBuilder(BuilderOptions options) { ], 'dimengen', ); -} \ No newline at end of file +} + +Builder snippetBuilder(BuilderOptions options) => DimengenSnippetBuilder(); diff --git a/lib/dimengen.dart b/lib/dimengen.dart index d5dc773..b90408c 100644 --- a/lib/dimengen.dart +++ b/lib/dimengen.dart @@ -1 +1,5 @@ +library dimengen; + export 'src/meta.dart'; +export 'builder.dart'; + diff --git a/lib/src/builder/snippet_builder.dart b/lib/src/builder/snippet_builder.dart new file mode 100644 index 0000000..ec86011 --- /dev/null +++ b/lib/src/builder/snippet_builder.dart @@ -0,0 +1,77 @@ +import 'dart:convert'; + +import 'package:analyzer/dart/analysis/utilities.dart'; +import 'package:analyzer/dart/ast/ast.dart'; +import 'package:build/build.dart'; +import 'package:glob/glob.dart'; + +class DimengenSnippetBuilder implements Builder { + @override + final buildExtensions = const { + r'$package$': [ + '.vscode/dimengen.code-snippets', + '.idea/liveTemplates/DimensionsTemplates.xml', + ], + }; + + @override + Future build(BuildStep step) async { + final json = {}; + final xml = StringBuffer('\n'); + + void add(String key, String body, String value) { + json[key] = { + 'prefix': key, + 'body': body, + 'description': '$body ($value)' + }; + xml.writeln( + ' '); + } + + await for (final input in step.findAssets(Glob('lib/**.dart'))) { + final content = await step.readAsString(input); + if (!content.contains('@Dimengen')) continue; + + final unit = parseString(content: content).unit; + + for (var c in unit.declarations.whereType()) { + if (!c.metadata.any((m) => m.name.name == 'Dimengen')) continue; + + for (var f in c.members.whereType()) { + if (!f.isStatic || !f.fields.isConst) continue; + for (var v in f.fields.variables) { + final name = v.name.lexeme; + final value = v.initializer?.toString() ?? ''; + final num = value.split('.').first; + + // Dimensions + add('d$num', 'Dimensions.$name', value); + // Insets + add('in$num', 'Insets.$name', value); + add('iv$num', 'Insets.${name}Vertical', value); + add('ih$num', 'Insets.${name}Horizontal', value); + // Spaces + add('sp$num', 'Spaces.$name', value); + add('sv$num', 'Spaces.${name}Vertical', value); + add('sh$num', 'Spaces.${name}Horizontal', value); + } + } + } + } + + xml.writeln(''); + + if (json.isEmpty) return; + + await step.writeAsString( + AssetId(step.inputId.package, '.vscode/dimengen.code-snippets'), + const JsonEncoder.withIndent(' ').convert(json)); + await step.writeAsString( + AssetId(step.inputId.package, + '.idea/liveTemplates/DimensionsTemplates.xml'), + xml.toString()); + } +} \ No newline at end of file diff --git a/lib/src/builder/snippet_builder.idea/liveTemplates/DimensionsTemplates.xml b/lib/src/builder/snippet_builder.idea/liveTemplates/DimensionsTemplates.xml new file mode 100644 index 0000000..abcb376 --- /dev/null +++ b/lib/src/builder/snippet_builder.idea/liveTemplates/DimensionsTemplates.xml @@ -0,0 +1,2 @@ + + diff --git a/lib/src/builder/snippet_builder.vscode/dart.json b/lib/src/builder/snippet_builder.vscode/dart.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/lib/src/builder/snippet_builder.vscode/dart.json @@ -0,0 +1 @@ +{} \ No newline at end of file From 3d7dc1ecf978c3c33cf6c174f5bb73519b94b0ac Mon Sep 17 00:00:00 2001 From: Ruslan <95baes@gmail.com> Date: Wed, 6 Aug 2025 02:39:00 +0600 Subject: [PATCH 2/4] optional snippet --- example/.vscode/dimengen.code-snippets | 126 ++++++++++++------------- example/lib/dimengen_example.dart | 20 ++++ lib/src/builder/snippet_builder.dart | 101 ++++++++++---------- 3 files changed, 131 insertions(+), 116 deletions(-) create mode 100644 example/lib/dimengen_example.dart diff --git a/example/.vscode/dimengen.code-snippets b/example/.vscode/dimengen.code-snippets index 0f4af65..d23898f 100644 --- a/example/.vscode/dimengen.code-snippets +++ b/example/.vscode/dimengen.code-snippets @@ -1,107 +1,107 @@ { "d8": { "prefix": "d8", - "body": "Dimensions.s", - "description": "Dimensions.s (8.0)" + "body": "Dimensions.small", + "description": "Dimensions.small (8.0)" }, "in8": { "prefix": "in8", - "body": "Insets.s", - "description": "Insets.s (8.0)" + "body": "Insets.small", + "description": "Insets.small (8.0)" }, "iv8": { "prefix": "iv8", - "body": "Insets.sVertical", - "description": "Insets.sVertical (8.0)" + "body": "Insets.smallVertical", + "description": "Insets.smallVertical (8.0)" }, "ih8": { "prefix": "ih8", - "body": "Insets.sHorizontal", - "description": "Insets.sHorizontal (8.0)" + "body": "Insets.smallHorizontal", + "description": "Insets.smallHorizontal (8.0)" }, "sp8": { "prefix": "sp8", - "body": "Spaces.s", - "description": "Spaces.s (8.0)" + "body": "Spaces.small", + "description": "Spaces.small (8.0)" }, "sv8": { "prefix": "sv8", - "body": "Spaces.sVertical", - "description": "Spaces.sVertical (8.0)" + "body": "Spaces.smallVertical", + "description": "Spaces.smallVertical (8.0)" }, "sh8": { "prefix": "sh8", - "body": "Spaces.sHorizontal", - "description": "Spaces.sHorizontal (8.0)" + "body": "Spaces.smallHorizontal", + "description": "Spaces.smallHorizontal (8.0)" }, "d16": { "prefix": "d16", - "body": "Dimensions.m", - "description": "Dimensions.m (16.0)" + "body": "Dimensions.medium", + "description": "Dimensions.medium (16.0)" }, "in16": { "prefix": "in16", - "body": "Insets.m", - "description": "Insets.m (16.0)" + "body": "Insets.medium", + "description": "Insets.medium (16.0)" }, "iv16": { "prefix": "iv16", - "body": "Insets.mVertical", - "description": "Insets.mVertical (16.0)" + "body": "Insets.mediumVertical", + "description": "Insets.mediumVertical (16.0)" }, "ih16": { "prefix": "ih16", - "body": "Insets.mHorizontal", - "description": "Insets.mHorizontal (16.0)" + "body": "Insets.mediumHorizontal", + "description": "Insets.mediumHorizontal (16.0)" }, "sp16": { "prefix": "sp16", - "body": "Spaces.m", - "description": "Spaces.m (16.0)" + "body": "Spaces.medium", + "description": "Spaces.medium (16.0)" }, "sv16": { "prefix": "sv16", - "body": "Spaces.mVertical", - "description": "Spaces.mVertical (16.0)" + "body": "Spaces.mediumVertical", + "description": "Spaces.mediumVertical (16.0)" }, "sh16": { "prefix": "sh16", - "body": "Spaces.mHorizontal", - "description": "Spaces.mHorizontal (16.0)" - }, - "d24": { - "prefix": "d24", - "body": "Dimensions.l", - "description": "Dimensions.l (24.0)" - }, - "in24": { - "prefix": "in24", - "body": "Insets.l", - "description": "Insets.l (24.0)" - }, - "iv24": { - "prefix": "iv24", - "body": "Insets.lVertical", - "description": "Insets.lVertical (24.0)" - }, - "ih24": { - "prefix": "ih24", - "body": "Insets.lHorizontal", - "description": "Insets.lHorizontal (24.0)" - }, - "sp24": { - "prefix": "sp24", - "body": "Spaces.l", - "description": "Spaces.l (24.0)" - }, - "sv24": { - "prefix": "sv24", - "body": "Spaces.lVertical", - "description": "Spaces.lVertical (24.0)" - }, - "sh24": { - "prefix": "sh24", - "body": "Spaces.lHorizontal", - "description": "Spaces.lHorizontal (24.0)" + "body": "Spaces.mediumHorizontal", + "description": "Spaces.mediumHorizontal (16.0)" + }, + "d32": { + "prefix": "d32", + "body": "Dimensions.large", + "description": "Dimensions.large (32.0)" + }, + "in32": { + "prefix": "in32", + "body": "Insets.large", + "description": "Insets.large (32.0)" + }, + "iv32": { + "prefix": "iv32", + "body": "Insets.largeVertical", + "description": "Insets.largeVertical (32.0)" + }, + "ih32": { + "prefix": "ih32", + "body": "Insets.largeHorizontal", + "description": "Insets.largeHorizontal (32.0)" + }, + "sp32": { + "prefix": "sp32", + "body": "Spaces.large", + "description": "Spaces.large (32.0)" + }, + "sv32": { + "prefix": "sv32", + "body": "Spaces.largeVertical", + "description": "Spaces.largeVertical (32.0)" + }, + "sh32": { + "prefix": "sh32", + "body": "Spaces.largeHorizontal", + "description": "Spaces.largeHorizontal (32.0)" } } \ No newline at end of file diff --git a/example/lib/dimengen_example.dart b/example/lib/dimengen_example.dart new file mode 100644 index 0000000..f374e28 --- /dev/null +++ b/example/lib/dimengen_example.dart @@ -0,0 +1,20 @@ +/// Пример использования опциональной генерации сниппетов +/// Просто добавьте @DimengenSnippets к нужному классу +library; + +class DimengenSnippets { + const DimengenSnippets(); +} + +@DimengenSnippets() +class Dimensions { + static const double small = 8.0; + static const double medium = 16.0; + static const double large = 32.0; +} + +// Класс без аннотации — сниппеты не будут сгенерированы +class Insets { + static const double tiny = 2.0; + static const double huge = 64.0; +} diff --git a/lib/src/builder/snippet_builder.dart b/lib/src/builder/snippet_builder.dart index ec86011..982d6ba 100644 --- a/lib/src/builder/snippet_builder.dart +++ b/lib/src/builder/snippet_builder.dart @@ -1,10 +1,48 @@ import 'dart:convert'; - import 'package:analyzer/dart/analysis/utilities.dart'; import 'package:analyzer/dart/ast/ast.dart'; import 'package:build/build.dart'; import 'package:glob/glob.dart'; +/// Вынесенная логика генерации сниппетов +class SnippetGenerator { + final Map json = {}; + final StringBuffer xml = StringBuffer('\n'); + + void add(String key, String body, String value) { + json[key] = {'prefix': key, 'body': body, 'description': '$body ($value)'}; + xml.writeln(' '); + } + + void processUnit(CompilationUnit unit) { + for (var c in unit.declarations.whereType()) { + // Генерируем сниппеты только для классов с аннотацией @DimengenSnippets + if (!c.metadata.any((m) => m.name.name == 'DimengenSnippets')) continue; + for (var f in c.members.whereType()) { + if (!f.isStatic || !f.fields.isConst) continue; + for (var v in f.fields.variables) { + final name = v.name.lexeme; + final value = v.initializer?.toString() ?? ''; + final num = value.split('.').first; + add('d$num', 'Dimensions.$name', value); + add('in$num', 'Insets.$name', value); + add('iv$num', 'Insets.${name}Vertical', value); + add('ih$num', 'Insets.${name}Horizontal', value); + add('sp$num', 'Spaces.$name', value); + add('sv$num', 'Spaces.${name}Vertical', value); + add('sh$num', 'Spaces.${name}Horizontal', value); + } + } + } + } + + void finalize() { + xml.writeln(''); + } +} + class DimengenSnippetBuilder implements Builder { @override final buildExtensions = const { @@ -16,62 +54,19 @@ class DimengenSnippetBuilder implements Builder { @override Future build(BuildStep step) async { - final json = {}; - final xml = StringBuffer('\n'); - - void add(String key, String body, String value) { - json[key] = { - 'prefix': key, - 'body': body, - 'description': '$body ($value)' - }; - xml.writeln( - ' '); - } - + final generator = SnippetGenerator(); await for (final input in step.findAssets(Glob('lib/**.dart'))) { final content = await step.readAsString(input); if (!content.contains('@Dimengen')) continue; - final unit = parseString(content: content).unit; - - for (var c in unit.declarations.whereType()) { - if (!c.metadata.any((m) => m.name.name == 'Dimengen')) continue; - - for (var f in c.members.whereType()) { - if (!f.isStatic || !f.fields.isConst) continue; - for (var v in f.fields.variables) { - final name = v.name.lexeme; - final value = v.initializer?.toString() ?? ''; - final num = value.split('.').first; - - // Dimensions - add('d$num', 'Dimensions.$name', value); - // Insets - add('in$num', 'Insets.$name', value); - add('iv$num', 'Insets.${name}Vertical', value); - add('ih$num', 'Insets.${name}Horizontal', value); - // Spaces - add('sp$num', 'Spaces.$name', value); - add('sv$num', 'Spaces.${name}Vertical', value); - add('sh$num', 'Spaces.${name}Horizontal', value); - } - } - } + generator.processUnit(unit); } - - xml.writeln(''); - - if (json.isEmpty) return; - - await step.writeAsString( - AssetId(step.inputId.package, '.vscode/dimengen.code-snippets'), - const JsonEncoder.withIndent(' ').convert(json)); + generator.finalize(); + if (generator.json.isEmpty) return; + await step.writeAsString(AssetId(step.inputId.package, '.vscode/dimengen.code-snippets'), + const JsonEncoder.withIndent(' ').convert(generator.json)); await step.writeAsString( - AssetId(step.inputId.package, - '.idea/liveTemplates/DimensionsTemplates.xml'), - xml.toString()); + AssetId(step.inputId.package, '.idea/liveTemplates/DimensionsTemplates.xml'), + generator.xml.toString()); } -} \ No newline at end of file +} From 041a27ae9839d79a73a6a4699fc75310879723b3 Mon Sep 17 00:00:00 2001 From: Ruslan <95baes@gmail.com> Date: Wed, 6 Aug 2025 03:35:16 +0600 Subject: [PATCH 3/4] fix build.yaml --- README.md | 25 +++++++++++++++++-- lib/src/builder/snippet_builder.dart | 14 +++++++---- .../liveTemplates/DimensionsTemplates.xml | 2 -- .../builder/snippet_builder.vscode/dart.json | 1 - 4 files changed, 32 insertions(+), 10 deletions(-) delete mode 100644 lib/src/builder/snippet_builder.idea/liveTemplates/DimensionsTemplates.xml delete mode 100644 lib/src/builder/snippet_builder.vscode/dart.json diff --git a/README.md b/README.md index 23637fa..558d95b 100644 --- a/README.md +++ b/README.md @@ -153,15 +153,36 @@ Why Use Dimengen? --- + ## Snippet generation -After every `build_runner` run two files are produced automatically: +After every `build_runner` run, two files are produced automatically: * `.vscode/dimengen.code-snippets` * `.idea/liveTemplates/DimensionsTemplates.xml` -Import them into your IDE (VS Code or Android Studio) and use +### How to enable snippet generation +Snippets are generated only for classes marked with the annotation `@DimengenSnippets()`: + +```dart +class DimengenSnippets { + const DimengenSnippets(); +} + +@DimengenSnippets() +class Dimensions { + static const double small = 8.0; + static const double medium = 16.0; + static const double large = 32.0; +} +``` + +Classes without this annotation will be ignored by the snippet builder. + +Import the generated files into your IDE (VS Code or Android Studio) and use `d16`, `in16`, `sp16` … abbreviations instead of magic numbers. +> ⚠️ Snippet import for Android Studio is not tested yet. Please report your experience! + --- ## Contributing diff --git a/lib/src/builder/snippet_builder.dart b/lib/src/builder/snippet_builder.dart index 982d6ba..9eecb63 100644 --- a/lib/src/builder/snippet_builder.dart +++ b/lib/src/builder/snippet_builder.dart @@ -55,11 +55,15 @@ class DimengenSnippetBuilder implements Builder { @override Future build(BuildStep step) async { final generator = SnippetGenerator(); - await for (final input in step.findAssets(Glob('lib/**.dart'))) { - final content = await step.readAsString(input); - if (!content.contains('@Dimengen')) continue; - final unit = parseString(content: content).unit; - generator.processUnit(unit); + // Обрабатываем файлы из lib и example/lib + final globs = [Glob('lib/**.dart'), Glob('example/lib/**.dart')]; + for (final glob in globs) { + await for (final input in step.findAssets(glob)) { + final content = await step.readAsString(input); + if (!content.contains('@Dimengen')) continue; + final unit = parseString(content: content).unit; + generator.processUnit(unit); + } } generator.finalize(); if (generator.json.isEmpty) return; diff --git a/lib/src/builder/snippet_builder.idea/liveTemplates/DimensionsTemplates.xml b/lib/src/builder/snippet_builder.idea/liveTemplates/DimensionsTemplates.xml deleted file mode 100644 index abcb376..0000000 --- a/lib/src/builder/snippet_builder.idea/liveTemplates/DimensionsTemplates.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/lib/src/builder/snippet_builder.vscode/dart.json b/lib/src/builder/snippet_builder.vscode/dart.json deleted file mode 100644 index 9e26dfe..0000000 --- a/lib/src/builder/snippet_builder.vscode/dart.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file From 4f25bd31f426eef3b2ecd36b4bfeeb3aa4ed90de Mon Sep 17 00:00:00 2001 From: Ruslan <95baes@gmail.com> Date: Wed, 6 Aug 2025 04:20:23 +0600 Subject: [PATCH 4/4] update example --- README.md | 35 ++++++- example/.vscode/dimengen.code-snippets | 126 ++++++++++++------------- example/build.yaml | 7 ++ example/generate_snippets.dart | 0 example/lib/dimengen_example.dart | 20 ---- example/lib/dimensions.dart | 6 +- lib/dimengen.dart | 7 +- 7 files changed, 109 insertions(+), 92 deletions(-) create mode 100644 example/build.yaml create mode 100644 example/generate_snippets.dart diff --git a/README.md b/README.md index 558d95b..7cf7a3e 100644 --- a/README.md +++ b/README.md @@ -143,7 +143,37 @@ Watch for changes: flutter pub run build_runner watch ``` -⸻ +--- + +## Build configuration + +To control what is generated, configure your `build.yaml`: + +Generate only main dimension files (no snippets): +```yaml +targets: + $default: + builders: + dimengen|dimengen: + enabled: true + dimengen|snippet_builder: + enabled: false +``` + +Generate both dimension files and snippets: +```yaml +targets: + $default: + builders: + dimengen|dimengen: + enabled: true + dimengen|snippet_builder: + enabled: true +``` + +You can also remove the `snippet_builder` section entirely if you do not need snippets. + +--- Why Use Dimengen? - 📐 Centralized dimension values @@ -164,9 +194,6 @@ After every `build_runner` run, two files are produced automatically: Snippets are generated only for classes marked with the annotation `@DimengenSnippets()`: ```dart -class DimengenSnippets { - const DimengenSnippets(); -} @DimengenSnippets() class Dimensions { diff --git a/example/.vscode/dimengen.code-snippets b/example/.vscode/dimengen.code-snippets index d23898f..0f4af65 100644 --- a/example/.vscode/dimengen.code-snippets +++ b/example/.vscode/dimengen.code-snippets @@ -1,107 +1,107 @@ { "d8": { "prefix": "d8", - "body": "Dimensions.small", - "description": "Dimensions.small (8.0)" + "body": "Dimensions.s", + "description": "Dimensions.s (8.0)" }, "in8": { "prefix": "in8", - "body": "Insets.small", - "description": "Insets.small (8.0)" + "body": "Insets.s", + "description": "Insets.s (8.0)" }, "iv8": { "prefix": "iv8", - "body": "Insets.smallVertical", - "description": "Insets.smallVertical (8.0)" + "body": "Insets.sVertical", + "description": "Insets.sVertical (8.0)" }, "ih8": { "prefix": "ih8", - "body": "Insets.smallHorizontal", - "description": "Insets.smallHorizontal (8.0)" + "body": "Insets.sHorizontal", + "description": "Insets.sHorizontal (8.0)" }, "sp8": { "prefix": "sp8", - "body": "Spaces.small", - "description": "Spaces.small (8.0)" + "body": "Spaces.s", + "description": "Spaces.s (8.0)" }, "sv8": { "prefix": "sv8", - "body": "Spaces.smallVertical", - "description": "Spaces.smallVertical (8.0)" + "body": "Spaces.sVertical", + "description": "Spaces.sVertical (8.0)" }, "sh8": { "prefix": "sh8", - "body": "Spaces.smallHorizontal", - "description": "Spaces.smallHorizontal (8.0)" + "body": "Spaces.sHorizontal", + "description": "Spaces.sHorizontal (8.0)" }, "d16": { "prefix": "d16", - "body": "Dimensions.medium", - "description": "Dimensions.medium (16.0)" + "body": "Dimensions.m", + "description": "Dimensions.m (16.0)" }, "in16": { "prefix": "in16", - "body": "Insets.medium", - "description": "Insets.medium (16.0)" + "body": "Insets.m", + "description": "Insets.m (16.0)" }, "iv16": { "prefix": "iv16", - "body": "Insets.mediumVertical", - "description": "Insets.mediumVertical (16.0)" + "body": "Insets.mVertical", + "description": "Insets.mVertical (16.0)" }, "ih16": { "prefix": "ih16", - "body": "Insets.mediumHorizontal", - "description": "Insets.mediumHorizontal (16.0)" + "body": "Insets.mHorizontal", + "description": "Insets.mHorizontal (16.0)" }, "sp16": { "prefix": "sp16", - "body": "Spaces.medium", - "description": "Spaces.medium (16.0)" + "body": "Spaces.m", + "description": "Spaces.m (16.0)" }, "sv16": { "prefix": "sv16", - "body": "Spaces.mediumVertical", - "description": "Spaces.mediumVertical (16.0)" + "body": "Spaces.mVertical", + "description": "Spaces.mVertical (16.0)" }, "sh16": { "prefix": "sh16", - "body": "Spaces.mediumHorizontal", - "description": "Spaces.mediumHorizontal (16.0)" - }, - "d32": { - "prefix": "d32", - "body": "Dimensions.large", - "description": "Dimensions.large (32.0)" - }, - "in32": { - "prefix": "in32", - "body": "Insets.large", - "description": "Insets.large (32.0)" - }, - "iv32": { - "prefix": "iv32", - "body": "Insets.largeVertical", - "description": "Insets.largeVertical (32.0)" - }, - "ih32": { - "prefix": "ih32", - "body": "Insets.largeHorizontal", - "description": "Insets.largeHorizontal (32.0)" - }, - "sp32": { - "prefix": "sp32", - "body": "Spaces.large", - "description": "Spaces.large (32.0)" - }, - "sv32": { - "prefix": "sv32", - "body": "Spaces.largeVertical", - "description": "Spaces.largeVertical (32.0)" - }, - "sh32": { - "prefix": "sh32", - "body": "Spaces.largeHorizontal", - "description": "Spaces.largeHorizontal (32.0)" + "body": "Spaces.mHorizontal", + "description": "Spaces.mHorizontal (16.0)" + }, + "d24": { + "prefix": "d24", + "body": "Dimensions.l", + "description": "Dimensions.l (24.0)" + }, + "in24": { + "prefix": "in24", + "body": "Insets.l", + "description": "Insets.l (24.0)" + }, + "iv24": { + "prefix": "iv24", + "body": "Insets.lVertical", + "description": "Insets.lVertical (24.0)" + }, + "ih24": { + "prefix": "ih24", + "body": "Insets.lHorizontal", + "description": "Insets.lHorizontal (24.0)" + }, + "sp24": { + "prefix": "sp24", + "body": "Spaces.l", + "description": "Spaces.l (24.0)" + }, + "sv24": { + "prefix": "sv24", + "body": "Spaces.lVertical", + "description": "Spaces.lVertical (24.0)" + }, + "sh24": { + "prefix": "sh24", + "body": "Spaces.lHorizontal", + "description": "Spaces.lHorizontal (24.0)" } } \ No newline at end of file diff --git a/example/build.yaml b/example/build.yaml new file mode 100644 index 0000000..6c136b5 --- /dev/null +++ b/example/build.yaml @@ -0,0 +1,7 @@ +targets: + $default: + builders: + dimengen|dimengen: + enabled: true + dimengen|snippet_builder: + enabled: true \ No newline at end of file diff --git a/example/generate_snippets.dart b/example/generate_snippets.dart new file mode 100644 index 0000000..e69de29 diff --git a/example/lib/dimengen_example.dart b/example/lib/dimengen_example.dart index f374e28..e69de29 100644 --- a/example/lib/dimengen_example.dart +++ b/example/lib/dimengen_example.dart @@ -1,20 +0,0 @@ -/// Пример использования опциональной генерации сниппетов -/// Просто добавьте @DimengenSnippets к нужному классу -library; - -class DimengenSnippets { - const DimengenSnippets(); -} - -@DimengenSnippets() -class Dimensions { - static const double small = 8.0; - static const double medium = 16.0; - static const double large = 32.0; -} - -// Класс без аннотации — сниппеты не будут сгенерированы -class Insets { - static const double tiny = 2.0; - static const double huge = 64.0; -} diff --git a/example/lib/dimensions.dart b/example/lib/dimensions.dart index 2b54159..b160da3 100644 --- a/example/lib/dimensions.dart +++ b/example/lib/dimensions.dart @@ -3,10 +3,8 @@ import 'package:flutter/cupertino.dart'; part 'dimensions.g.dart'; -@Dimengen( - spacesName: 'DesignSpaces', - generateInsets: false, -) +@Dimengen(spacesName: 'DesignSpaces', generateInsets: false) +@DimengenSnippets() abstract final class Dimensions { Dimensions._(); diff --git a/lib/dimengen.dart b/lib/dimengen.dart index b90408c..e2f9682 100644 --- a/lib/dimengen.dart +++ b/lib/dimengen.dart @@ -1,5 +1,10 @@ -library dimengen; +library; export 'src/meta.dart'; export 'builder.dart'; +export 'src/builder/snippet_builder.dart'; +/// Annotation for enabling snippet generation for a class. +class DimengenSnippets { + const DimengenSnippets(); +}