Skip to content

Commit f6107b1

Browse files
authored
feat: Create code gen for design tokens (#521)
* generate color token * checkpoint1 * annotation improvements * improve the SwatchColorToken * Update mixable_tokens_generator.dart * Update mixable_tokens_generator.dart * improve tests * Update lints_with_dcm.yaml * remove token from example * clean PR
1 parent 0f6542d commit f6107b1

File tree

16 files changed

+397
-52
lines changed

16 files changed

+397
-52
lines changed

examples/todo_list/lib/pages/todo_list_page.dart

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,18 @@ class _TodoListPageState extends State<TodoListPage> {
6666
onPressed: () {
6767
Future.delayed(
6868
const Duration(milliseconds: 200),
69-
() => Navigator.push(
70-
context,
71-
MaterialPageRoute(
72-
builder: (context) => AddTaskPage(
73-
controller: _controller,
74-
),
75-
),
76-
),
69+
() {
70+
if (mounted) {
71+
Navigator.push(
72+
context,
73+
MaterialPageRoute(
74+
builder: (context) => AddTaskPage(
75+
controller: _controller,
76+
),
77+
),
78+
);
79+
}
80+
},
7781
);
7882
},
7983
),

examples/todo_list/pubspec.yaml

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,22 @@ environment:
1212
dependencies:
1313
flutter:
1414
sdk: flutter
15-
mix:
15+
mix:
1616
path: ../../packages/mix
17+
mix_annotations:
18+
path: ../../packages/mix_annotations
1719
custom_lint: ^0.6.4
18-
google_fonts: ^6.0.0
20+
google_fonts: ^6.0.0
1921

2022
cupertino_icons: ^1.0.6
2123

2224
dev_dependencies:
25+
mix_generator:
26+
path: ../../packages/mix_generator
27+
build_runner:
2328
flutter_test:
2429
sdk: flutter
25-
mix_lint:
30+
mix_lint:
2631
path: ../../packages/mix_lint
2732

2833
flutter_lints: ^4.0.0

lints_with_dcm.yaml

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ dart_code_metrics:
1212
# avoid-collection-mutating-methods: true
1313
newline-before-return: true
1414
avoid-importing-entrypoint-exports:
15-
only-in-src: true
15+
only-in-src: true
1616
prefer-match-file-name: false
17+
avoid-suspicious-super-overrides: false
1718
prefer-overriding-parent-equality: false
1819
prefer-correct-callback-field-name: false
1920
prefer-single-widget-per-file: false
@@ -33,21 +34,21 @@ dart_code_metrics:
3334
- child
3435
- children
3536
avoid-nested-conditional-expressions:
36-
acceptable-level: 3
37+
acceptable-level: 3
3738
member-ordering:
38-
order:
39-
- public-fields
40-
- private-fields
41-
- constructors
42-
- static-methods
43-
- private-methods
44-
- private-getters
45-
- private-setters
46-
- public-getters
47-
- public-setters
48-
- public-methods
49-
- overridden-public-methods
50-
- overridden-public-getters
51-
- build-method
39+
order:
40+
- public-fields
41+
- private-fields
42+
- constructors
43+
- static-methods
44+
- private-methods
45+
- private-getters
46+
- private-setters
47+
- public-getters
48+
- public-setters
49+
- public-methods
50+
- overridden-public-methods
51+
- overridden-public-getters
52+
- build-method
5253
prefer-named-boolean-parameters:
53-
ignore-single: true
54+
ignore-single: true

packages/mix/lib/src/theme/tokens/text_style_token.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
//ignore_for_file: avoid-suspicious-super-overrides
21
import 'package:flutter/widgets.dart';
32

43
import '../../internal/mix_error.dart';

packages/mix_annotations/lib/src/annotations.dart

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,3 +248,24 @@ class MixDeprecatedRenamed extends MixDeprecated {
248248
required this.updatedName,
249249
});
250250
}
251+
252+
class MixableToken {
253+
final Object type;
254+
final String? namespace;
255+
final bool utilityExtension;
256+
final bool contextExtension;
257+
258+
const MixableToken(
259+
this.type, {
260+
this.namespace,
261+
this.utilityExtension = true,
262+
this.contextExtension = true,
263+
});
264+
}
265+
266+
class MixableSwatchColorToken {
267+
final int scale;
268+
final int defaultValue;
269+
270+
const MixableSwatchColorToken({this.scale = 3, this.defaultValue = 1});
271+
}

packages/mix_generator/build.yaml

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ targets:
22
$default:
33
builders:
44
spec:
5-
enabled: true
5+
enabled: true
66
generate_for:
77
exclude:
88
- test
@@ -14,33 +14,39 @@ targets:
1414
- test
1515
- example
1616

17-
1817
builders:
1918
spec:
2019
import: "package:mix_generator/mix_generator.dart"
2120
builder_factories: ["specDefinition"]
22-
build_extensions: {".dart": ["spec.g.part"]}
21+
build_extensions: { ".dart": ["spec.g.part"] }
2322
auto_apply: dependents
2423
build_to: cache
2524
applies_builders: ["source_gen|combining_builder"]
2625
dto:
2726
import: "package:mix_generator/mix_generator.dart"
2827
builder_factories: ["dtoDefinition"]
29-
build_extensions: {".dart": ["dto.g.part"]}
28+
build_extensions: { ".dart": ["dto.g.part"] }
3029
auto_apply: dependents
3130
build_to: cache
3231
applies_builders: ["source_gen|combining_builder"]
3332
enum_utility:
3433
import: "package:mix_generator/mix_generator.dart"
3534
builder_factories: ["enumUtilityDefinition"]
36-
build_extensions: {".dart": ["enum_utility.g.part"]}
35+
build_extensions: { ".dart": ["enum_utility.g.part"] }
3736
auto_apply: dependents
3837
build_to: cache
3938
applies_builders: ["source_gen|combining_builder"]
4039
class_utility:
4140
import: "package:mix_generator/mix_generator.dart"
4241
builder_factories: ["classUtilityDefinition"]
43-
build_extensions: {".dart": ["class_utility.g.part"]}
42+
build_extensions: { ".dart": ["class_utility.g.part"] }
43+
auto_apply: dependents
44+
build_to: cache
45+
applies_builders: ["source_gen|combining_builder"]
46+
tokens:
47+
import: "package:mix_generator/mix_generator.dart"
48+
builder_factories: ["tokensDefinition"]
49+
build_extensions: { ".dart": ["tokens.g.part"] }
4450
auto_apply: dependents
4551
build_to: cache
4652
applies_builders: ["source_gen|combining_builder"]

packages/mix_generator/lib/mix_generator.dart

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
// ignore_for_file: avoid-unused-parameters
22

33
import 'package:build/build.dart';
4+
import 'package:source_gen/source_gen.dart';
5+
46
import 'src/mixable_class_utility_generator.dart';
57
import 'src/mixable_dto_generator.dart';
68
import 'src/mixable_enum_utility_generator.dart';
79
import 'src/mixable_spec_generator.dart';
8-
import 'package:source_gen/source_gen.dart';
10+
import 'src/mixable_tokens_generator.dart';
911

1012
Builder specDefinition(BuilderOptions options) => SharedPartBuilder(
1113
[const MixableSpecGenerator()],
@@ -30,3 +32,9 @@ Builder enumUtilityDefinition(BuilderOptions options) => SharedPartBuilder(
3032
'enum_utility',
3133
allowSyntaxErrors: true,
3234
);
35+
36+
Builder tokensDefinition(BuilderOptions options) => SharedPartBuilder(
37+
[const MixableTokensGenerator()],
38+
'tokens',
39+
allowSyntaxErrors: true,
40+
);

packages/mix_generator/lib/src/builders/dto/class_utility.dart

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,25 @@ String utilityClass(ClassBuilderContext context) {
2020

2121
final instance = ClassInfo(
2222
name: utilityName,
23-
fields: context.fields,
23+
fields: context.constructorParameters,
2424
extendsType: extendsType,
2525
genericTypes: {'T extends Attribute'},
2626
);
2727

2828
final className = instance.name;
2929

30-
final fields = generateUtilityFields(attributeName, context.fields);
30+
final fields =
31+
generateUtilityFields(attributeName, context.constructorParameters);
3132

3233
final onlyMethod = utilityMethodOnlyBuilder(
3334
utilityType: attributeName,
34-
fields: context.fields,
35+
fields: context.constructorParameters,
3536
);
3637

3738
final valueClassFields = generateUtilityFieldsFromClass(context.classElement);
3839

3940
final callMethodDefinition =
40-
isDto ? utilityMethodCallBuilder(context.fields) : '';
41+
isDto ? utilityMethodCallBuilder(context.constructorParameters) : '';
4142

4243
final chainGetterDefinition = isDto
4344
? ''

packages/mix_generator/lib/src/builders/dto/extension_value.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ String toRefTypeExtension(ClassBuilderContext<MixableDto> context) {
1313
params[element.name] = ParameterInfo.ofElement(element);
1414
});
1515

16-
final fieldStatements = context.fields.map((field) {
16+
final fieldStatements = context.constructorParameters.map((field) {
1717
final fieldName = field.name;
1818

1919
if (field.hasDto) {

packages/mix_generator/lib/src/builders/spec/class_attribute_spec.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import 'package:mix_annotations/mix_annotations.dart';
2+
3+
import '../../helpers/field_info.dart';
24
import '../method_debug_fill_properties.dart';
35
import '../method_equality.dart';
46
import '../method_merge.dart';
57
import '../method_resolve.dart';
6-
import '../../helpers/field_info.dart';
78

89
String specAttributeClass(ClassBuilderContext<MixableSpec> context) {
910
final specName = context.name;
@@ -13,7 +14,7 @@ String specAttributeClass(ClassBuilderContext<MixableSpec> context) {
1314

1415
final attributeInstance = ClassInfo(
1516
name: context.attributeName,
16-
fields: context.fields,
17+
fields: context.constructorParameters,
1718
isBase: specInstance.isBase,
1819
isFinal: specInstance.isFinal,
1920
mixinTypes: hasDiagnosticable ? {'Diagnosticable'} : {},

0 commit comments

Comments
 (0)