Skip to content

Commit 560293e

Browse files
authored
feat: add an asset list variable in class (#291)
* feat: add an asset list variable to generate files * refactor: change to nonnull variable * refactor: change method order
1 parent 6731ad3 commit 560293e

13 files changed

+176
-3
lines changed

example/lib/gen/assets.gen.dart

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ class $AssetsFlareGen {
1919

2020
/// File path: assets/flare/Penguin.flr
2121
FlareGenImage get penguin => const FlareGenImage('assets/flare/Penguin.flr');
22+
23+
/// List of all assets
24+
List<FlareGenImage> get values => [penguin];
2225
}
2326

2427
class $AssetsImagesGen {
@@ -43,27 +46,40 @@ class $AssetsImagesGen {
4346
/// File path: assets/images/profile.png
4447
AssetGenImage get profilePng =>
4548
const AssetGenImage('assets/images/profile.png');
49+
50+
/// List of all assets
51+
List<AssetGenImage> get values =>
52+
[chip1, chip2, logo, profileJpg, profilePng];
4653
}
4754

4855
class $AssetsJsonGen {
4956
const $AssetsJsonGen();
5057

5158
/// File path: assets/json/fruits.json
5259
String get fruits => 'assets/json/fruits.json';
60+
61+
/// List of all assets
62+
List<String> get values => [fruits];
5363
}
5464

5565
class $AssetsMovieGen {
5666
const $AssetsMovieGen();
5767

5868
/// File path: assets/movie/the_earth.mp4
5969
String get theEarth => 'assets/movie/the_earth.mp4';
70+
71+
/// List of all assets
72+
List<String> get values => [theEarth];
6073
}
6174

6275
class $AssetsRiveGen {
6376
const $AssetsRiveGen();
6477

6578
/// File path: assets/rive/vehicles.riv
6679
RiveGenImage get vehicles => const RiveGenImage('assets/rive/vehicles.riv');
80+
81+
/// List of all assets
82+
List<RiveGenImage> get values => [vehicles];
6783
}
6884

6985
class $AssetsUnknownGen {
@@ -77,6 +93,9 @@ class $AssetsUnknownGen {
7793

7894
/// File path: assets/unknown/unknown_mime_type.bk
7995
String get unknownMimeType => 'assets/unknown/unknown_mime_type.bk';
96+
97+
/// List of all assets
98+
List<String> get values => [changelog, readme, unknownMimeType];
8099
}
81100

82101
class $AssetsImagesChip4Gen {
@@ -85,6 +104,9 @@ class $AssetsImagesChip4Gen {
85104
/// File path: assets/images/chip4/chip4.jpg
86105
AssetGenImage get chip4 =>
87106
const AssetGenImage('assets/images/chip4/chip4.jpg');
107+
108+
/// List of all assets
109+
List<AssetGenImage> get values => [chip4];
88110
}
89111

90112
class $AssetsImagesIconsGen {
@@ -103,6 +125,9 @@ class $AssetsImagesIconsGen {
103125

104126
/// File path: assets/images/icons/paint.svg
105127
SvgGenImage get paint => const SvgGenImage('assets/images/icons/paint.svg');
128+
129+
/// List of all assets
130+
List<SvgGenImage> get values => [dartTest, fuchsia, kmm, paint];
106131
}
107132

108133
class MyAssets {

packages/core/lib/generators/assets_generator.dart

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ _Statement? _createAssetTypeStatement(
167167
name: name,
168168
value: 'AssetGenImage(\'${posixStyle(assetType.path)}\')',
169169
isConstConstructor: true,
170+
isDirectory: false,
170171
needDartDoc: true,
171172
);
172173
} else if (FileSystemEntity.isDirectorySync(childAssetAbsolutePath)) {
@@ -177,6 +178,7 @@ _Statement? _createAssetTypeStatement(
177178
name: name,
178179
value: '$childClassName()',
179180
isConstConstructor: true,
181+
isDirectory: true,
180182
needDartDoc: false,
181183
);
182184
} else if (!assetType.isIgnoreFile) {
@@ -190,6 +192,7 @@ _Statement? _createAssetTypeStatement(
190192
name: name,
191193
value: '\'${posixStyle(assetType.path)}\'',
192194
isConstConstructor: false,
195+
isDirectory: false,
193196
needDartDoc: true,
194197
);
195198
} else {
@@ -200,6 +203,7 @@ _Statement? _createAssetTypeStatement(
200203
name: name,
201204
value: integration.classInstantiate(posixStyle(assetType.path)),
202205
isConstConstructor: integration.isConstConstructor,
206+
isDirectory: false,
203207
needDartDoc: true,
204208
);
205209
}
@@ -259,6 +263,7 @@ String _dotDelimiterStyleDefinition(
259263
name: assetType.baseName.camelCase(),
260264
value: '$className()',
261265
isConstConstructor: true,
266+
isDirectory: true,
262267
needDartDoc: true,
263268
));
264269
}
@@ -340,7 +345,7 @@ String _flatStyleAssetsClassDefinition(
340345
statements.map((statement) => '''${statement.toDartDocString()}
341346
${statement.toStaticFieldString()}
342347
''').join('\n');
343-
return _assetsClassDefinition(className, statementsBlock);
348+
return _assetsClassDefinition(className, statements, statementsBlock);
344349
}
345350

346351
String _dotDelimiterStyleAssetsClassDefinition(
@@ -349,15 +354,38 @@ String _dotDelimiterStyleAssetsClassDefinition(
349354
) {
350355
final statementsBlock =
351356
statements.map((statement) => statement.toStaticFieldString()).join('\n');
352-
return _assetsClassDefinition(className, statementsBlock);
357+
return _assetsClassDefinition(className, statements, statementsBlock);
353358
}
354359

355-
String _assetsClassDefinition(String className, String statementsBlock) {
360+
String _assetValuesDefinition(List<_Statement> statements) {
361+
final values = statements.where((element) => !element.isDirectory);
362+
if (values.isEmpty) return '';
363+
final names = values.map((value) => value.name).join(', ');
364+
var type = values.first.type;
365+
for (var value in values) {
366+
if (type != value.type) {
367+
type = 'dynamic';
368+
break;
369+
}
370+
}
371+
372+
return '''
373+
/// List of all assets
374+
List<$type> get values => [$names];''';
375+
}
376+
377+
String _assetsClassDefinition(
378+
String className,
379+
List<_Statement> statements,
380+
String statementsBlock,
381+
) {
382+
final valuesBlock = _assetValuesDefinition(statements);
356383
return '''
357384
class $className {
358385
$className._();
359386
360387
$statementsBlock
388+
$valuesBlock
361389
}
362390
''';
363391
}
@@ -373,11 +401,14 @@ String _directoryClassGenDefinition(
373401
'''
374402
: statement.toGetterString())
375403
.join('\n');
404+
final valuesBlock = _assetValuesDefinition(statements);
405+
376406
return '''
377407
class $className {
378408
const $className();
379409
380410
$statementsBlock
411+
$valuesBlock
381412
}
382413
''';
383414
}
@@ -463,6 +494,7 @@ class _Statement {
463494
required this.name,
464495
required this.value,
465496
required this.isConstConstructor,
497+
required this.isDirectory,
466498
required this.needDartDoc,
467499
});
468500

@@ -471,6 +503,7 @@ class _Statement {
471503
final String name;
472504
final String value;
473505
final bool isConstConstructor;
506+
final bool isDirectory;
474507
final bool needDartDoc;
475508

476509
String toDartDocString() => '/// File path: ${posixStyle(filePath)}';

packages/core/test_resources/actual_data/assets.gen.dart

Lines changed: 28 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/core/test_resources/actual_data/assets_camel_case.gen.dart

Lines changed: 17 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/core/test_resources/actual_data/assets_change_class_name.gen.dart

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/core/test_resources/actual_data/assets_flare_integrations.gen.dart

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/core/test_resources/actual_data/assets_no_integrations.gen.dart

Lines changed: 19 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)