Skip to content

Commit

Permalink
Merge pull request #28 from davidmorgan/better-error-messages
Browse files Browse the repository at this point in the history
Improve error output on failure to generate.
  • Loading branch information
davidmorgan authored Jun 20, 2016
2 parents 2e2c805 + 9a0e22a commit 252b412
Show file tree
Hide file tree
Showing 6 changed files with 42 additions and 30 deletions.
8 changes: 6 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
# Changelog

## 0.1.1

- Improve error output on failure to generate.

## 0.1.0

- Upgrade to source_gen 0.5.0.
- Breaking change; see example for required changes to build.dart.
- Upgrade to source_gen 0.5.0.
- Breaking change; see example for required changes to build.dart.

## 0.0.6

Expand Down
2 changes: 1 addition & 1 deletion built_value/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: built_value
version: 0.1.0
version: 0.1.1
description: >
Value types with builders. This library is the runtime dependency.
authors:
Expand Down
24 changes: 16 additions & 8 deletions built_value_generator/lib/built_value_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,7 @@ class BuiltValueGenerator extends Generator {
]);

if (errors.isNotEmpty) {
throw new InvalidGenerationSourceError(
'Please make changes to use built_value.',
todo: errors.join(' '));
throw _makeError(errors);
}

return generateCode(className, fields, builderFields);
Expand All @@ -69,7 +67,7 @@ class BuiltValueGenerator extends Generator {
final name = classElement.displayName;

if (!classElement.isAbstract) {
result.add('Make class abstract');
result.add('Make class abstract.');
}

final expectedConstructor = '$name._()';
Expand Down Expand Up @@ -100,7 +98,7 @@ class BuiltValueGenerator extends Generator {
Iterable<String> checkBuilderClass(
String className, ClassElement classElement) {
if (classElement == null) {
return <String>['Add abstract class ${className}Builder'];
return <String>['Add abstract class: ${className}Builder'];
}

final result = <String>[];
Expand Down Expand Up @@ -164,7 +162,7 @@ class BuiltValueGenerator extends Generator {
final fieldName = field.displayName;
if (field.getter == null || field.getter.isSynthetic) {
checkFieldTypes = false;
result.add('Make field $fieldName a getter');
result.add('Make field $fieldName a getter.');
}
}

Expand All @@ -174,7 +172,7 @@ class BuiltValueGenerator extends Generator {
field.getter.isAbstract ||
!field.getter.isSynthetic) {
checkFieldTypes = false;
result.add('Make builder field $fieldName a normal field');
result.add('Make builder field $fieldName a normal field.');
}
}

Expand All @@ -199,7 +197,7 @@ class BuiltValueGenerator extends Generator {
fieldType.replaceAll('Built', '') !=
builderFieldType.replaceAll('Builder', '')) {
result.add(
'Make builder field ${field.displayName} have type $fieldType');
'Make builder field ${field.displayName} have type: $fieldType');
}
}
}
Expand Down Expand Up @@ -327,4 +325,14 @@ class BuiltValueGenerator extends Generator {

return result.toString();
}

InvalidGenerationSourceError _makeError(Iterable<String> todos) {
final message = new StringBuffer(
'Please make the following changes to use built_value:\n');
for (var i = 0; i != todos.length; ++i) {
message.write('\n${i + 1}. ${todos.elementAt(i)}');
}

return new InvalidGenerationSourceError(message.toString());
}
}
6 changes: 3 additions & 3 deletions built_value_generator/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: built_value_generator
version: 0.1.0
version: 0.1.1
description: >
Value types with builders. This library is the dev dependency.
authors:
Expand All @@ -13,8 +13,8 @@ dependencies:
analyzer: '>=0.27.1 <0.28.0'
build: '^0.3.0'
built_collection: '^1.0.0'
built_value: '^0.1.0'
source_gen: '>=0.5.0 <0.6.0'
built_value: '^0.1.1'
source_gen: '>=0.5.0+03 <0.6.0'
quiver: '>=0.21.0 <0.22.0'

dev_dependencies:
Expand Down
26 changes: 13 additions & 13 deletions built_value_generator/test/built_value_generator_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ abstract class Value extends Built<Value, ValueBuilder> {
abstract class ValueBuilder extends Builder<Value, ValueBuilder> {
ValueBuilder._();
factory ValueBuilder() = _\$ValueBuilder;
}'''), contains("TODO: Import generated part: part 'value.g.dart';"));
}'''), contains("1. Import generated part: part 'value.g.dart';"));
});

test('suggests to make value class abstract', () async {
Expand All @@ -36,7 +36,7 @@ class Value extends Built<Value, ValueBuilder> {
abstract class ValueBuilder extends Builder<Value, ValueBuilder> {
ValueBuilder._();
factory ValueBuilder() = _\$ValueBuilder;
}'''), contains("TODO: Make class abstract"));
}'''), contains("1. Make class abstract."));
});

test('suggests to add constructor to value class', () async {
Expand All @@ -49,7 +49,7 @@ abstract class Value extends Built<Value, ValueBuilder> {
abstract class ValueBuilder extends Builder<Value, ValueBuilder> {
ValueBuilder._();
factory ValueBuilder() = _\$ValueBuilder;
}'''), contains("TODO: Make class have exactly one constructor: Value._();"));
}'''), contains("1. Make class have exactly one constructor: Value._();"));
});

test('allows code in constructor of value class', () async {
Expand All @@ -68,7 +68,7 @@ abstract class ValueBuilder extends Builder<Value, ValueBuilder> {
factory ValueBuilder() = _\$ValueBuilder;
}'''),
isNot(contains(
"TODO: Make class have exactly one constructor: Value._();")));
"1. Make class have exactly one constructor: Value._();")));
});

test('suggests to add factory to value class', () async {
Expand All @@ -83,7 +83,7 @@ abstract class ValueBuilder extends Builder<Value, ValueBuilder> {
ValueBuilder._();
factory ValueBuilder() = _\$ValueBuilder;
}'''),
contains("TODO: Make class have factory: "
contains("1. Make class have factory: "
"factory Value([updates(ValueBuilder b)]) = _\$Value;"));
});

Expand All @@ -94,7 +94,7 @@ part 'value.g.dart';
abstract class Value extends Built<Value, ValueBuilder> {
Value._();
factory Value([updates(ValueBuilder b)]) = _\$Value;
}'''), contains("TODO: Add abstract class ValueBuilder"));
}'''), contains("1. Add abstract class: ValueBuilder"));
});

test('suggests to make builder class abstract', () async {
Expand All @@ -108,7 +108,7 @@ abstract class Value extends Built<Value, ValueBuilder> {
class ValueBuilder extends Builder<Value, ValueBuilder> {
ValueBuilder._();
factory ValueBuilder() = _\$ValueBuilder;
}'''), contains("TODO: Make builder class abstract"));
}'''), contains("1. Make builder class abstract"));
});

test('suggests to add constructor to builder class', () async {
Expand All @@ -123,7 +123,7 @@ abstract class Value extends Built<Value, ValueBuilder> {
abstract class ValueBuilder extends Builder<Value, ValueBuilder> {
factory ValueBuilder() = _\$ValueBuilder;
}'''),
contains("TODO: Make builder class "
contains("1. Make builder class "
"have exactly one constructor: ValueBuilder._();"));
});

Expand All @@ -139,7 +139,7 @@ abstract class Value extends Built<Value, ValueBuilder> {
abstract class ValueBuilder extends Builder<Value, ValueBuilder> {
ValueBuilder._();
}'''),
contains("TODO: Make builder class have exactly one factory: "
contains("1. Make builder class have exactly one factory: "
"factory ValueBuilder() = _\$ValueBuilder;"));
});

Expand All @@ -156,7 +156,7 @@ abstract class ValueBuilder extends Builder<Value, ValueBuilder> {
ValueBuilder._();
factory ValueBuilder() = _\$ValueBuilder;
int foo;
}'''), contains("TODO: Make field foo a getter"));
}'''), contains("1. Make field foo a getter."));
});

test('suggests builder fields must be getters', () async {
Expand All @@ -172,7 +172,7 @@ abstract class ValueBuilder extends Builder<Value, ValueBuilder> {
ValueBuilder._();
factory ValueBuilder() = _\$ValueBuilder;
int get foo;
}'''), contains("TODO: Make builder field foo a normal field"));
}'''), contains("1. Make builder field foo a normal field."));
});

test('suggests builder fields must be in sync', () async {
Expand All @@ -187,7 +187,7 @@ abstract class Value extends Built<Value, ValueBuilder> {
abstract class ValueBuilder extends Builder<Value, ValueBuilder> {
ValueBuilder._();
factory ValueBuilder() = _\$ValueBuilder;
}'''), contains("TODO: Make builder have exactly these fields: foo"));
}'''), contains("1. Make builder have exactly these fields: foo"));
});

test('suggests builder fields must be same type', () async {
Expand All @@ -203,7 +203,7 @@ abstract class ValueBuilder extends Builder<Value, ValueBuilder> {
ValueBuilder._();
factory ValueBuilder() = _\$ValueBuilder;
String foo;
}'''), contains("TODO: Make builder field foo have type int"));
}'''), contains("1. Make builder field foo have type: int"));
});

test('ignores setters', () async {
Expand Down
6 changes: 3 additions & 3 deletions example/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: example
version: 0.1.0
version: 0.1.1
description: >
Just an example, not for publishing.
authors:
Expand All @@ -11,8 +11,8 @@ environment:

dependencies:
built_collection: '^1.0.0'
built_value: '^0.1.0'
built_value: '^0.1.1'

dev_dependencies:
built_value_generator: '^0.1.0'
built_value_generator: '^0.1.1'
test: any

0 comments on commit 252b412

Please sign in to comment.