We have a class called MultiToken and another called ExistingProvider:
https://github.com/dart-lang/angular/blob/1abcb5c62fc8a8267f1abdb2081d07f40567c56f/angular/lib/src/core/di/opaque_token.dart#L62-L74
https://github.com/dart-lang/angular/blob/1abcb5c62fc8a8267f1abdb2081d07f40567c56f/angular/lib/src/di/providers.dart#L241-L265
This pattern was created in order to correctly "infer" what the type of a given DI provider should be, but also not require manual type annotations (use flowing type inference from OpaqueToken<T> -> ExistingProvider<T> -> Provider<T> (T):
const NG_VALUE_ACCESSOR = const MultiToken<ControlValueAccessor>(
'NgValueAccessor',
);
const DEFAULT_VALUE_ACCESSOR = const ExistingProvider.forToken(
NG_VALUE_ACCESSOR,
DefaultValueAccessor,
);
When analyzing this during our compilation, T of DEFAULT_VALUE_ACCESSOR is dynamic internally (with bazel_codegen) and (correctly) ControlValueAccessor externally (with build_runner). This is causing our sync to fail on travis:
https://api.travis-ci.org/v3/job/342583283/log.txt
If I manually type (don't rely on inference), it works as intended in both places:
const DEFAULT_VALUE_ACCESSOR = const ExistingProvider<ControlValueAccessor>.forToken(
NG_VALUE_ACCESSOR,
DefaultValueAccessor,
);
It's also possible this is due to different analyzer versions/configuration? I know top-level inference is inconsistent without using Dart 2 semantics, but I'm very confused why this works properly externally but not internally.
/cc @natebosch @scheglov @alorenzen