source_gen 1.5.0 source_gen: ^1.5.0 copied to clipboard
Source code generation builders and utilities for the Dart build system
1.5.0 #
- Add
throwOnUnresolved
configuration to theGeneratorForAnnotation
constructor. - Rename
InvalidGenerationSourceError
toInvalidGenerationSource
. Change from a subtype ofError
to a subtype ofException
. This may be breaking if a builder relies on aon Exception catch
to ignore this error.
1.4.0 #
- Require Dart 3.0
- Support the latest
package:analyzer
. - Add a
node
argument toInvalidGenerationSourceError
to allow finding the source location from anAstNode
over anElement
.
1.3.2 #
- Make
TypeChecker.isAssignableFromType()
null safe.
1.3.1 #
- Always use a Uri in
part of
directives (previously a name would be used if the library had a non-empty one).
1.3.0 #
- Add support for
build_extensions
configuration of builders producing multiple files. For example:build_extensions: { '.dart': ['.stub.dart', '.web.dart', '.vm.dart'] }
- Avoid throwing when a type without a backing class is checked with
TypeChecker
. - Include imports, exports, and part directives in
LibraryReader.allElements
. This allowsGeneratorForAnnotation
to target annotated directives.
1.2.7 #
- Update the value of the pubspec
repository
field. - Require Dart SDK version
2.18
. - Fix type-checking mixin elements with
TypeChecker
.
1.2.6 #
- Add support for a
preamble
option tocombining_builder
.
1.2.5 #
- Fix another issue with overly specific types.
1.2.4 #
- Fix overly-specific cast.
1.2.3 #
- Require
analyzer: '>=4.6.0 <6.0.0'
- Require
sdk: '>=2.17.0 <3.0.0'
1.2.2 #
- Enable the fix for single cascade statements when formatting Dart code.
- Individual builders can opt out of this by providing a custom
formatOutput
function to thePartBuilder
orLibraryBuilder
constructors.
- Individual builders can opt out of this by providing a custom
- Allow analyzer version 4.x.
1.2.1 #
- Allow reviving constants which are static fields defined on the class which represents their type. Previously we checked this pattern only for enums, however there are enum-like usages in classes which are not enums.
- Allow the latest version of
package:analyzer
.
1.2.0 #
- Include the
LibraryElement
inLibraryReader.allElements
,LibraryReader.annotatedWith
, andLibraryReader.annotatedWithExact
. RunGeneratorForAnnotation
generators on library elements when thelibrary
statement has the annotation. - Add support for
build_extensions
configuration to thePartBuilder
andLibraryBuilder
. You must forward theBuilderOptions
object to the super constructor for this to work. - Fix a bug finding source locations for reporting unresolved annotations on parameters.
- Fix a bug checking for
part
statements on Windows.
1.1.1 #
- Drop dependency on
package:pedantic
.
1.1.0 #
- Add the
build_extensions
option tocombining_builder
, allowing output files to be generated into a different directory.
1.0.5 #
- Fix a bug with reviving constant expressions which are fields defined on a different class than their type (but in the same library).
1.0.4 #
- Fix warnings with latest analyzer, require analyzer 2.x.
1.0.3 #
- Allow the latest version of
package:analyzer
.
1.0.2 #
- Fix
TypeChecker.fromRuntimeType
for types that come from non-package uris.
1.0.1 #
- Improve the error message for a missing part directive.
- Upgrade to
package:analyzer
version1.7.0
.
1.0.0 #
- Migrate to null safety.
- Drop deprecated APIs:
ConstantReader.isAny
.ConstantReader.anyValue
.LibraryReader.classElements
.
0.9.10+5 #
- Widen
dart_style
range to include v2.x.
0.9.10+4 #
- Upgrade to
package:build
version2.0.0
. - Handle alias types with
DartType.aliasElement
.
0.9.10+3 #
- Allow the latest version of
package:analyzer
.
0.9.10+2 #
- Expand allowed versions for the glob package as source_gen is compatible to break circular dependency issues in the ecosystem.
0.9.10+1 #
- Fix a bug in the early bailout optimization where it wouldn't check for annotations in part files.
0.9.10 #
- Optimize for the case where we have only GeneratorForAnnotation generators, and we know there are no annotations present in the file at all.
0.9.9 #
- Allow
package:analyzer
version0.41.x
.
0.9.8 #
- Add support for
allowSyntaxErrors
flag introduced inpackage:build
version1.4.0
. - Update minimum Dart SDK to
2.10.0
.
0.9.7+1 #
- Allow
package:analyzer
version0.40.x
.
0.9.7 #
- Match Dart language version overrides parts generated by
PartBuilder
.
0.9.6 #
- Add support for
Set
inConstantReader
.- Updated
isLiteral
andliteralValue
to handleSet
. - Added
isSet
andsetValue
members.
- Updated
- Include matching Dart language version overrides in generated parts if the source library has a language version override.
- Streamlined error handling in all builders. There should be no user-visible behavior change.
- Improve the error message when source code formatting fails.
- Update minimum Dart SDK to
2.7.0
. - Changed the behavior of
LibraryReader.allElements
to include extensions.
0.9.5 #
-
Add support for an
ignore_for_file
option tocombining_builder
. -
Expand documentation for
GeneratorForAnnotation
to make it clear that it only targets elements at the top level of a library.
0.9.4+7 #
- Fix an exception during error reporting when the
Element
reported is in a summary file rather than a source file.
0.9.4+6 #
- Allow
package:analyzer
version0.39.x
.
0.9.4+5 #
- Fix a bug for finding the element for a function with recent versions of
analyzer
.
0.9.4+4 #
- Allow
pkg:analyzer
version0.38.x
.
0.9.4+3 #
- Allow
pkg:analyzer
version0.37.x
.
0.9.4+2 #
- Allow
pkg:analyzer
version0.36.x
.
0.9.4+1 #
- Support the latest
pkg:analyzer
.
0.9.4 #
- Use
ParsedLibraryResult
to find source spans for unresolvable annotations.
0.9.3 #
- Rename
LibraryReader.classElements
toLibraryReader.classes
to better reflect the behavior. Deprecate the old name. - Add
LibraryReader.enums
.
0.9.2 #
- Avoid using the AST analyzer model from
LibraryReader
. - Don't create part files with no corresponding library.
- Update analyzer constraint to allow 0.34.x.
0.9.1+3 #
- Support the latest
pkg:analyzer
.
0.9.1+2 #
- Correctly handle properties in
spanForElement
.
0.9.1+1 #
- Allow
package:build
version 1.0.0.
0.9.1 #
-
The result of
ConstantReader.revive()
now returns aRevivable
that assumes access to a private class, constructor, or function instead ofnull
where possible. This allows generators that usepart
files to still use this functionality and allows generators that use separate libraries to emit more actionable error messages (i.e."cannot use private class _X"
). -
Revivable.isPrivate
now returnstrue
when the underlying class was public but the constructor was private, or theRevivable
was pointing to a top-level or static private field or method. Previously it was onlytrue
when referencing a private class.
0.9.0+1 #
- Fix
LibraryReader.classElements
to return classes from parts, if they exist, as well as from the defining library file.
0.9.0 #
- Introduce
SharedPartBuilder
for creating part files that can be merged with a newCombiningBuilder
. Note thatCombiningBuilder
only outputs.g.dart
files. - Breaking
PartBuilder
now requires ageneratedExtensions
argument. The value should not be.g.dart
. To produce.g.dart
files please use theSharedPartBuilder
.
0.8.3+1 #
- Allow using non-dev Dart 2 SDK.
0.8.3 #
GeneratorForAnnotation
generateForAnnotatedElement
now allow multiple return values when implementations return anIterable
orStream
.- Values from
generateForAnnotatedElement
have whitespace trimmed.null
and empty values are ignored. - Duplicate values are collapsed into a single values. This allows emitting shared, top-level members without naming collisions.
0.8.2 #
-
Simplification to the output of generator names in header sections.
-
Update handling of whitespace in generator outputs.
- If the output from a generator has wrapping whitespace, it is trimmed.
- If the output from a generator is empty or whitespace-only, it is ignored.
- These changes will likely have no effect on output, unless you customize the code formatter.
0.8.1+3 #
- More redundant new lines elimination.
0.8.1+2 #
- Eliminate redundant new lines in the core builder. These were almost removed by running the default formatter. Now the unformatted code more closely matches the default output.
0.8.1+1 #
- Support
package:analyzer
0.32.0
.
0.8.1 #
-
Cleanup logging output that duplicates headers provided by
package:build_runner
. -
InvalidGenerationSourceError
added an optionalelement
parameter to support more helpful error messages.
0.8.0 #
-
BREAKING removed the deprecated
requireLibraryDirective
parameter inPartBuilder
. -
Revivable
no longer throws a type error when attempting to revive a reference to a top-level function or static-class method. Now is returns a reference to that function or method, as expected.
0.7.6 #
TypeChecker
now throws anUnresolvedAnnotationException
with a more detailed exception body (and properties useful for further debugging) instead ofCould not resolve @null
.
0.7.5+1 #
LibraryBuilder
andPartBuilder
now have a more readabletoString()
, which is useful when emitting a warning or error in a build system. For example you may seeGenerating .g.dart: MyBuilder
instead ofInstance of LibraryBuilder
in your build logs.
0.7.5 #
-
The
PartBuilder
constructor parameterrequireLibraryDirective
now defaults tofalse
. It will be removed in0.8.0
. -
Require at least Dart
2.0.0-dev.19.0
.
0.7.4+3 #
- Support the latest
analyzer
package.
0.7.4+2 #
-
BUG FIX:
ConstantReader.revive()
now properly returns no URL fragment when the constant expression is resolved from a top-level or static-field. The documentation had said otherwise, and it was impossible to tell the difference between a constructor and a field. Now, fields are always in the form of accessor ={clazz}.{field}
or{topLevelField}
. -
Fix file URIs on windows.
0.7.4+1 #
- Removed a
log.finest
with the output source of each generator. This allows a verbose option (-v
) for tools like bazel or build_runner to be much more readable and debuggable. Files are emitted to disk for inspection in any case.
0.7.4 #
-
Added
typeNameOf
, which is a safe way to get the name of aDartType
, even when the type is aFunctionType
, which has anull
name in newer versions of the Dart analyzer. -
Added
LibraryReader.pathToUrl(Uri|String)
, which computes theimport
orexport
path necessary to reach the provided URL from the current library. Also addedpathToAsset
andpathToElement
as convenience functions. -
Expanded
package:build
support to allow version0.12.0
.
0.7.3 #
- Allow null and empty outputs form
GeneratorForAnnotation
.
0.7.2+1 #
- Allow
package:build
version 0.11.0
0.7.2 #
- Support an optional
header
argument toPartBuilder
andLibraryBuilder
.
0.7.1 #
Generator{ForAnnotation}
#
- Return type of
generate{ForAnnotatedElement}
is nowFutureOr<String>
.
LibraryReader
#
- Added
annotatedElements
to return all elements annotated with something. - Added
classElements
getter for returning allclass
-es in a library.
TypeChecker
#
- Added
hasAnnotationOf
andhasAnnotationOfExact
.
ConstantReader
#
- Added
isAny
(for consistency, but deprecated) andisLiteral
. - Added
literalValue
as an alias for the now deprecatedanyValue
. - Allow
literalValue
to returnnull
if the value is actuallynull
. - Fixed a bug where a
Symbol
would return as aString
foranyValue
. - Fixed a bug where a
List
andMap
were not considered literals.
0.7.0 #
-
Breaking changes: See the wiki for help upgrading.
Generator.generate
now operates on aLibraryReader
rather than being called for everyElement
within a library. Generators can iterate over elements usingLibraryReader.allElements
.GeneratorForAnnotation
will continue to callgenerateForAnnotatedElement
repeatedly for each element.GeneratorForAnnotation
passes in aConstantReader
for the annotation instance rather than re-creating it using mirrors.GeneratorBuilder
is replaced withPartBuilder
andLibraryBuilder
depending on whether the output is meant to be included in apart
file.- Removed
JsonSerializable
and related classes. These are moved topackage:json_serializable
. - Removed
lib/builder.dart
. Import throughsource_gen.dart
instead. - Removed
OutputFormatter
typedef.
-
Add
LibraryReader.allElements
- a utility to iterate across allElement
instances contained in Dart library. -
Add
LibraryReader.element
to get back to theLibraryElement
instance. -
Add
ConstantReader.objectValue
to get back to theDartObject
instance. -
Add
ConstantReader.peek
to read a value that returnsnull
if not found:
// Tries to read the field "token" first, then "_token".
findTokenField(DartObject o) {
final reader = new ConstantReader(o);
final token = o.peek('token') ?? o.read('_token');
}
- Add
throwOnUnresolved
optional parameter toTypeChecker.annotationsOf
,TypeChecker.annotationsOfExact
,TypeChecker.firstAnnotationOf
, andTypeChecker.firstAnnotationOfExact
. Setting this tofalse
will enable you to check for matching annotations with incomplete type information (at your own risk). - Builder logs now log the primary inputs
AssetId
instead of thelibrary
, which is more useful for tracking down the actual files.
0.6.1+1 #
- Tighten constraint on
source_span
.
0.6.1 #
- Added
spanForElement
; returns aSourceSpan
for an analyzerElement
. - Logs a warning to the console when a
GeneratorBuilder
outputs a part file for a given input, but that input does not definepart 'name.g.dart';
.
0.6.0 #
- Breaking change:
TypeChecker#annotationsOf|firstAnnotationOf
now returns annotations that are assignable to theTypeChecker
's type. As a result we've added#annotationsOfExact|firstAnnotationOfExact
which has the old behavior for precise checks. TypeChecker#annotations...
-methods now throw aStateError
if one or more annotations on an element are not resolvable. This is usually a sign of a misspelling, missing import, or missing dependency.- Added
TypeChecker.any
, which delegates to multiple otherTypeChecker
implementations when making a type check.
0.5.10+1 #
- Update minimum
analyzer
package to0.29.10
.
0.5.10 #
- Bug fixes:
- Do not fail when "library" is omitted but nothing would be output.
- Do not fail on extensions that don't end in ".dart" (valid use case).
0.5.9 #
-
Update the minimum Dart SDK to
1.22.1
. -
Deprecated
builder.dart
: importsource_gen.dart
instead. -
Added
TypeChecker
, a high-level API for performing static type checks:import 'package:analyzer/dart/element/type.dart'; import 'package:source_gen/source_gen.dart'; void checkType(DartType dartType) { // Checks compared to runtime type `SomeClass`. print(const TypeChecker.forRuntime(SomeClass).isExactlyType(dartType)); // Checks compared to a known Url/Symbol: const TypeChecker.forUrl('package:foo/foo.dart#SomeClass'); // Checks compared to another resolved `DartType`: const TypeChecker.forStatic(anotherDartType); }
-
Failing to add a
library
directive to a library that is being used as a generator target that generates partial files (part of
) is now an explicit error that gives a hint on how to name and fix your library:> Could not find library identifier so a "part of" cannot be built. > > Consider adding the following to your source file: > > "library foo.bar;"
In Dart SDK
>=1.25.0
this can be relaxed aspart of
can refer to a path. To opt-in,GeneratorBuilder
now has a new flag,requireLibraryDirective
. Set it tofalse
, and also set yoursdk
constraint appropriately:sdk: '>=1.25.0 <2.0.0'
-
Added
LibraryReader
, a utility class forLibraryElement
that exposes high-level APIs, includingfindType
, which traversesexport
directives for publicly exported types. For example, to findGenerator
frompackage:source_gen/source_gen.dart
:void example(LibraryElement pkgSourceGen) { var library = new LibraryReader(pkgSourceGen); // Instead of pkgSourceGen.getType('Generator'), which is null. library.findType('Generator'); }
-
Added
ConstantReader
, a high-level API for reading from constant (static) values from Dart source code (usually represented byDartObject
from theanalyzer
package):abstract class ConstantReader { factory ConstantReader(DartObject object) => ... // Other methods and properties also exist. /// Reads[ field] from the constant as another constant value. ConstantReader read(String field); /// Reads [field] from the constant as a boolean. /// /// If the resulting value is `null`, uses [defaultTo] if defined. bool readBool(String field, {bool defaultTo()}); /// Reads [field] from the constant as an int. /// /// If the resulting value is `null`, uses [defaultTo] if defined. int readInt(String field, {int defaultTo()}); /// Reads [field] from the constant as a string. /// /// If the resulting value is `null`, uses [defaultTo] if defined. String readString(String field, {String defaultTo()}); }
0.5.8 #
- Add
formatOutput
optional parameter to theGeneratorBuilder
constructor. This is a lambda of the formString formatOutput(String originalCode)
which allows you do do custom formatting.
0.5.7 #
- Support for package:analyzer 0.30.0
0.5.6 #
- Support for package:build 0.9.0
0.5.5 #
- Support package:build 0.8.x
- Less verbose errors when analyzer fails to resolve the input.
0.5.4+3 #
- Support the latest release of
pkg/dart_style
.
0.5.4+2 #
- Use the new
log
field instead of the deprecatedbuildStep.logger
0.5.4+1 #
- Give more information when
dartfmt
fails.
0.5.4 #
- Update to latest
build
,build_runner
, andbuild_test
releases.
0.5.3+2 #
- BugFix: Always release the Resolver instance, even when generation does not run
0.5.3+1 #
- Don't throw when running against a non-library asset and getting no LibraryElement
0.5.3 #
- Add matchTypes method. As with anything imported from /src/ this is use-at-your-own-risk since it is not guaranteed to be stable
- Internal cleanup
- Drop some unused utility methods
- Move cli_util to dev_dependencies
- Avoid some deprecated analyzer apis
- Syntax tweaks
- Drop results.dart which had no usages
0.5.2 #
- Use library URIs (not names) to look up annotations in the mirror system.
- Loosen version constraint to allow package:build version 0.6
- Fix a bug against the latest SDK checking whether List implements Iterable
0.5.1+7 #
- Generate valid strong-mode code for typed lists.
0.5.1+6 #
- Support the latest version of
pkg/build
.
0.5.1+5 #
- Remove "experimental" comment in
README.md
.
0.5.1+4 #
- Support
package:analyzer
0.29.0
0.5.1+3 #
- Upgrade to be compatible with the breaking changes in analyzer 0.28.0
0.5.1+2 #
- Avoid calling
computeNode()
while instantiating annotation values
0.5.1+1 #
- Support the latest version of
build
package.
0.5.1 #
- Added GeneratorBuilder option isStandalone to generate files that aren't part of source file.
0.5.0+3 #
- Fixed multi-line error output.
0.5.0+2 #
-
Remove an outdated work-around.
-
Make strong-mode clean.
0.5.0+1 #
- Support the latest version of
pkg/build
.
0.5.0 #
-
Breaking: Switch to the
build
package for runningGenerator
s. This means that the top levelbuild
andgenerate
functions are no longer available, and have been replaced by the top levelbuild
,watch
, andserve
functions from thebuild
package, and theGeneratorBuilder
class. Seetool/build.dart
,tool/watch.dart
, andtool/phases.dart
for usage.- Note that the
build
package is experimental, and likely to change.
- Note that the
-
Breaking: The build package provides an abstraction for reading/writing files via the
BuildStep
class, and that is now also provided toGenerator#generate
andGeneratorForAnnotation#generateForAnnotatedElement
as a second argument. -
Timestamps are no longer included in generated code.
-
There is no longer a need to specify the files related to an individual generator via
AssociatedFileSet
. Simply use theBuildStep
instance to read and write files and thebuild
package will track any files you read in and run incremental rebuilds as necessary.
0.4.8 #
-
Added support for
Symbol
andType
in annotations. -
Improved error output when unable to create an instance from an annotation.
0.4.7+2 #
- Upgrade to
analyzer '^0.27.1'
and removed a work-around for a fixedanalyzer
issue.
0.4.7+1 #
- Upgrade to
analyzer '^0.27.0'
.
0.4.7 #
JsonSerializableGenerator
now supports classes with read-only properties.
0.4.6 #
-
JsonSerializable
: AddedJsonKey
annotation. -
Improved output of generation errors and stack traces.
-
Require
analyzer '^0.26.2'
.
0.4.5+1 #
- Handle
null
values forList
properties.
0.4.5 #
JsonSerializable
: add support forList
values.
0.4.4+1 #
- Updated
README.md
to highlight thebuild_system
package and de-emphasize Dart Editor.
0.4.4 #
-
Added
omitGenerateTimestamp
andfollowLinks
named args tobuild
. -
Added
followLinks
togenerate
.
0.4.3+1 #
- Update tests to use a more reliable method to find the current package root.
0.4.3 #
-
Require Dart
1.12
. -
Add implicit support for
.packages
. If the file exists, it is used. If not, we fall back to using thepackages
directory. -
Support the latest releases of
analyzer
anddart_style
packages.
0.4.2 #
- Use
fromJson
if it's defined in a child field.
0.4.0+1 #
- Support the latest release of
analyzer
andargs
.
0.4.0 #
- Analysis no longer parses function bodies. This greatly speeds up generation, but it could break any usage that needs function bodies.
0.3.0+2 #
- Fixed
README.md
.
0.3.0+1 #
- Updates for move to
dart-lang
org on GitHub.
0.3.0 #
-
BREAKING Returning a descriptive value from
generate
. -
BREAKING Fixed incorrectly named argument
omitGenerateTimestamp
. -
JsonSerializable
: Handledynamic
andvar
as field types.
0.2.4 #
- Added
associatedFileSet
toGenerator
. Allows a generator to specify that changes to any file in a directory next to a Dart source file can initiate a generation run.
0.2.3 #
-
Use
async *
. Requires SDK >=1.9.0-dev.10
-
Protect against crash during code format.
0.2.2 #
-
Added
omitGenerateTimestamp
(incorrectly spelled) named argument togenerate
method. -
Generator.generate
is now called with theLibraryElement
, too.
0.2.1 #
-
Fixed critical bug affecting annotation matching. #35
-
Started using published
dart_style
package.
0.2.0+1 #
- Updated
README.md
with new examples. - Fixed sub-bullet indenting in
CHANGELOG.md
.
0.2.0 #
- BREAKING Moved and renamed JSON serialization classes.
- Added a
JsonLiteral
generator. - Improved handling and reporting of Generator errors.
JsonGenerator
- Learned how to use constructor arguments.
- Learned how to properly handle
DateTime
.
0.1.1 #
- Support for parametrized annotations.
- Add named arguments to
JsonGenerator
.
0.1.0+1 #
README.md
updates.
0.1.0 #
- BREAKING
Generator.generate
is now async – returnsFuture<String>
- Big update to
README.md
.
0.0.1 #
- Ready for experimentation.
0.0.0+1 #
- First play release.