Skip to content

Commit 96a1856

Browse files
authored
fix: exclude static fields (#27)
1 parent 731a7d8 commit 96a1856

11 files changed

+85
-4
lines changed

lib/src/constructable_macro.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ macro class Constructable implements ClassDeclarationsMacro {
7070

7171
final fields = await builder.fieldsOf(clazz);
7272

73+
// Exclude static fields.
74+
fields.removeWhere((f) => f.hasStatic);
75+
7376
// Ensure all class fields have a type.
7477
if (fields.any((f) => f.type.checkNamed(builder) == null)) return null;
7578

lib/src/macro_extensions.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,11 @@ Future<List<FieldDeclaration>> _allFieldsOf(
9191
allFields.addAll(await fieldsOf(clazz));
9292

9393
var superclass = await superclassOf(clazz);
94-
while (superclass != null && superclass.identifier != 'Object') {
94+
while (superclass != null && superclass.identifier.name != 'Object') {
9595
allFields.addAll(await fieldsOf(superclass));
9696
superclass = await superclassOf(superclass);
9797
}
98-
return allFields;
98+
return allFields..removeWhere((f) => f.hasStatic);
9999
}
100100

101101
Future<TypeAnnotation?> _resolveType(

lib/src/stringable_macro.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,11 @@ macro class Stringable implements ClassDeclarationsMacro, ClassDefinitionMacro {
5959
(m) => m.identifier.name == 'toString',
6060
);
6161
if (toString == null) return;
62-
final toStringMethod = await builder.buildMethod(toString.identifier);
6362
final className = clazz.identifier.name;
64-
final fields = await builder.allFieldsOf(clazz);
63+
final (toStringMethod, fields) = await (
64+
builder.buildMethod(toString.identifier),
65+
builder.allFieldsOf(clazz),
66+
).wait;
6567
final toStringFields = fields.map((field) {
6668
return '${field.type.isNullable ? 'if (${field.identifier.name} != null)' : ''} "${field.identifier.name}: \${${field.identifier.name}.toString()}", ';
6769
});
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import 'package:data_class_macro/data_class_macro.dart';
2+
import 'package:test/test.dart';
3+
4+
@Constructable()
5+
class StaticFieldClass {
6+
static const String field = 'field';
7+
}
8+
9+
void main() {
10+
group(StaticFieldClass, () {
11+
test('has a const constructor', () {
12+
expect(const StaticFieldClass(), isA<StaticFieldClass>());
13+
});
14+
});
15+
}

test/src/constructable_macro_test.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import 'constructable_macro/single_field_nested_subclass_of_positional_single_fi
2626
as single_field_nested_subclass_of_positional_single_field_class_test;
2727
import 'constructable_macro/single_field_subclass_of_positional_single_field_class_test.dart'
2828
as single_field_subclass_of_positional_single_field_class_test;
29+
import 'constructable_macro/static_field_class_test.dart'
30+
as static_field_class_test;
2931

3032
void main() {
3133
empty_class_test.main();
@@ -43,4 +45,5 @@ void main() {
4345
single_field_class_test.main();
4446
single_field_nested_subclass_of_positional_single_field_class_test.main();
4547
single_field_subclass_of_positional_single_field_class_test.main();
48+
static_field_class_test.main();
4649
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import 'package:data_class_macro/data_class_macro.dart';
2+
import 'package:test/test.dart';
3+
4+
@Copyable()
5+
class StaticFieldClass {
6+
const StaticFieldClass();
7+
static const String field = 'field';
8+
}
9+
10+
void main() {
11+
group(StaticFieldClass, () {
12+
test('copyWith is correct', () {
13+
expect(StaticFieldClass().copyWith(), isA<StaticFieldClass>());
14+
});
15+
});
16+
}

test/src/copyable_macro_test.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import 'copyable_macro/single_field_nested_subclass_of_positional_single_field_c
2525
as single_field_nested_subclass_of_positional_single_field_class_test;
2626
import 'copyable_macro/single_field_subclass_of_positional_single_field_class_test.dart'
2727
as single_field_subclass_of_positional_single_field_class_test;
28+
import 'copyable_macro/static_field_class_test.dart' as static_field_class_test;
2829

2930
void main() {
3031
empty_class_test.main();
@@ -42,4 +43,5 @@ void main() {
4243
single_field_class_test.main();
4344
single_field_nested_subclass_of_positional_single_field_class_test.main();
4445
single_field_subclass_of_positional_single_field_class_test.main();
46+
static_field_class_test.main();
4547
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import 'package:data_class_macro/data_class_macro.dart';
2+
import 'package:test/test.dart';
3+
4+
@Equatable()
5+
class StaticFieldClass {
6+
static const String field = 'field';
7+
}
8+
9+
void main() {
10+
group(StaticFieldClass, () {
11+
test('== is correct', () {
12+
expect(StaticFieldClass(), equals(StaticFieldClass()));
13+
});
14+
15+
test('hashCode is correct', () {
16+
expect(StaticFieldClass().hashCode, equals(Object.hashAll([])));
17+
});
18+
});
19+
}

test/src/equatable_macro_test.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import 'equatable_macro/single_field_nested_subclass_of_positional_single_field_
2626
as single_field_nested_subclass_of_positional_single_field_class_test;
2727
import 'equatable_macro/single_field_subclass_of_positional_single_field_class_test.dart'
2828
as single_field_subclass_of_positional_single_field_class_test;
29+
import 'equatable_macro/static_field_class_test.dart'
30+
as static_field_class_test;
2931

3032
void main() {
3133
empty_class_test.main();
@@ -43,4 +45,5 @@ void main() {
4345
single_field_class_test.main();
4446
single_field_nested_subclass_of_positional_single_field_class_test.main();
4547
single_field_subclass_of_positional_single_field_class_test.main();
48+
static_field_class_test.main();
4649
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import 'package:data_class_macro/data_class_macro.dart';
2+
import 'package:test/test.dart';
3+
4+
@Stringable()
5+
class StaticFieldClass {
6+
static const field = 'field';
7+
}
8+
9+
void main() {
10+
group(StaticFieldClass, () {
11+
test('toString is correct', () {
12+
expect(StaticFieldClass().toString(), equals('StaticFieldClass()'));
13+
});
14+
});
15+
}

test/src/stringable_macro_test.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import 'stringable_macro/single_field_nested_subclass_of_positional_single_field
2626
as single_field_nested_subclass_of_positional_single_field_class_test;
2727
import 'stringable_macro/single_field_subclass_of_positional_single_field_class_test.dart'
2828
as single_field_subclass_of_positional_single_field_class_test;
29+
import 'stringable_macro/static_field_class_test.dart'
30+
as static_field_class_test;
2931

3032
void main() {
3133
empty_class_test.main();
@@ -43,4 +45,5 @@ void main() {
4345
single_field_class_test.main();
4446
single_field_nested_subclass_of_positional_single_field_class_test.main();
4547
single_field_subclass_of_positional_single_field_class_test.main();
48+
static_field_class_test.main();
4649
}

0 commit comments

Comments
 (0)