Enforce override annotations (dart-lang/stream_channel#42)
diff --git a/pkgs/stream_channel/analysis_options.yaml b/pkgs/stream_channel/analysis_options.yaml index d19ee84..866c158 100644 --- a/pkgs/stream_channel/analysis_options.yaml +++ b/pkgs/stream_channel/analysis_options.yaml
@@ -8,5 +8,6 @@ linter: rules: + - annotate_overrides - comment_references - prefer_typing_uninitialized_variables
diff --git a/pkgs/stream_channel/lib/src/close_guarantee_channel.dart b/pkgs/stream_channel/lib/src/close_guarantee_channel.dart index b8a3f02..c534a91 100644 --- a/pkgs/stream_channel/lib/src/close_guarantee_channel.dart +++ b/pkgs/stream_channel/lib/src/close_guarantee_channel.dart
@@ -14,9 +14,11 @@ /// /// This is exposed via [new StreamChannel.withCloseGuarantee]. class CloseGuaranteeChannel<T> extends StreamChannelMixin<T> { + @override Stream<T> get stream => _stream; _CloseGuaranteeStream<T> _stream; + @override StreamSink<T> get sink => _sink; _CloseGuaranteeSink<T> _sink; @@ -45,6 +47,7 @@ _CloseGuaranteeStream(this._inner, this._channel); + @override StreamSubscription<T> listen(void onData(T event), {Function onError, void onDone(), bool cancelOnError}) { // If the channel is already disconnected, we shouldn't dispatch anything @@ -73,6 +76,7 @@ _CloseGuaranteeSink(StreamSink<T> inner, this._channel) : super(inner); + @override Future close() { var done = super.close(); _channel._disconnected = true;
diff --git a/pkgs/stream_channel/lib/src/delegating_stream_channel.dart b/pkgs/stream_channel/lib/src/delegating_stream_channel.dart index 4434cf6..4484a59 100644 --- a/pkgs/stream_channel/lib/src/delegating_stream_channel.dart +++ b/pkgs/stream_channel/lib/src/delegating_stream_channel.dart
@@ -14,7 +14,9 @@ /// The inner channel to which methods are forwarded. final StreamChannel<T> _inner; + @override Stream<T> get stream => _inner.stream; + @override StreamSink<T> get sink => _inner.sink; DelegatingStreamChannel(this._inner);
diff --git a/pkgs/stream_channel/lib/src/disconnector.dart b/pkgs/stream_channel/lib/src/disconnector.dart index 9d35cfc..83defb8 100644 --- a/pkgs/stream_channel/lib/src/disconnector.dart +++ b/pkgs/stream_channel/lib/src/disconnector.dart
@@ -40,6 +40,7 @@ }); final _disconnectMemo = AsyncMemoizer(); + @override StreamChannel<T> bind(StreamChannel<T> channel) { return channel.changeSink((innerSink) { var sink = _DisconnectorSink<T>(innerSink); @@ -62,6 +63,7 @@ /// The inner sink. final StreamSink<T> _inner; + @override Future get done => _inner.done; /// Whether [Disconnector.disconnect] has been called. @@ -83,6 +85,7 @@ _DisconnectorSink(this._inner); + @override void add(T data) { if (_closed) throw StateError("Cannot add event after closing."); if (_inAddStream) { @@ -93,6 +96,7 @@ _inner.add(data); } + @override void addError(error, [StackTrace stackTrace]) { if (_closed) throw StateError("Cannot add event after closing."); if (_inAddStream) { @@ -103,6 +107,7 @@ _inner.addError(error, stackTrace); } + @override Future addStream(Stream<T> stream) { if (_closed) throw StateError("Cannot add stream after closing."); if (_inAddStream) { @@ -119,6 +124,7 @@ }); } + @override Future close() { if (_inAddStream) { throw StateError("Cannot close sink while adding stream.");
diff --git a/pkgs/stream_channel/lib/src/guarantee_channel.dart b/pkgs/stream_channel/lib/src/guarantee_channel.dart index e96f5c3..ce7f707 100644 --- a/pkgs/stream_channel/lib/src/guarantee_channel.dart +++ b/pkgs/stream_channel/lib/src/guarantee_channel.dart
@@ -12,8 +12,10 @@ /// /// This is exposed via [new StreamChannel.withGuarantees]. class GuaranteeChannel<T> extends StreamChannelMixin<T> { + @override Stream<T> get stream => _streamController.stream; + @override StreamSink<T> get sink => _sink; _GuaranteeSink<T> _sink; @@ -78,6 +80,7 @@ /// The [GuaranteeChannel] this belongs to. final GuaranteeChannel<T> _channel; + @override Future get done => _doneCompleter.future; final _doneCompleter = Completer(); @@ -110,6 +113,7 @@ _GuaranteeSink(this._inner, this._channel, {bool allowErrors = true}) : _allowErrors = allowErrors; + @override void add(T data) { if (_closed) throw StateError("Cannot add event after closing."); if (_inAddStream) { @@ -120,6 +124,7 @@ _inner.add(data); } + @override void addError(error, [StackTrace stackTrace]) { if (_closed) throw StateError("Cannot add event after closing."); if (_inAddStream) { @@ -151,6 +156,7 @@ _inner.close().catchError((_) {}); } + @override Future addStream(Stream<T> stream) { if (_closed) throw StateError("Cannot add stream after closing."); if (_inAddStream) { @@ -167,6 +173,7 @@ }); } + @override Future close() { if (_inAddStream) { throw StateError("Cannot close sink while adding stream.");
diff --git a/pkgs/stream_channel/lib/src/isolate_channel.dart b/pkgs/stream_channel/lib/src/isolate_channel.dart index c7f573f..8c1b568 100644 --- a/pkgs/stream_channel/lib/src/isolate_channel.dart +++ b/pkgs/stream_channel/lib/src/isolate_channel.dart
@@ -24,7 +24,9 @@ /// ensure that they always close the [sink] of every [IsolateChannel] they use /// to avoid leaving dangling [ReceivePort]s. class IsolateChannel<T> extends StreamChannelMixin<T> { + @override final Stream<T> stream; + @override final StreamSink<T> sink; /// Connects to a remote channel that was created with
diff --git a/pkgs/stream_channel/lib/src/json_document_transformer.dart b/pkgs/stream_channel/lib/src/json_document_transformer.dart index 2a3a86f..a53ac92 100644 --- a/pkgs/stream_channel/lib/src/json_document_transformer.dart +++ b/pkgs/stream_channel/lib/src/json_document_transformer.dart
@@ -35,6 +35,7 @@ JsonDocumentTransformer._(this._codec); + @override StreamChannel<Object> bind(StreamChannel<String> channel) { var stream = channel.stream.map(_codec.decode); var sink = StreamSinkTransformer<Object, String>.fromHandlers(
diff --git a/pkgs/stream_channel/lib/src/multi_channel.dart b/pkgs/stream_channel/lib/src/multi_channel.dart index 139c9ae..d729eb7 100644 --- a/pkgs/stream_channel/lib/src/multi_channel.dart +++ b/pkgs/stream_channel/lib/src/multi_channel.dart
@@ -45,6 +45,7 @@ /// The default input stream. /// /// This connects to the remote [sink]. + @override Stream<T> get stream; /// The default output stream. @@ -52,6 +53,7 @@ /// This connects to the remote [stream]. If this is closed, the remote /// [stream] will close, but other virtual channels will remain open and new /// virtual channels may be opened. + @override StreamSink<T> get sink; /// Creates a new [MultiChannel] that sends and receives messages over @@ -88,7 +90,9 @@ /// The subscription to [_inner].stream. StreamSubscription<dynamic> _innerStreamSubscription; + @override Stream<T> get stream => _mainController.foreign.stream; + @override StreamSink<T> get sink => _mainController.foreign.sink; /// The controller for this channel. @@ -165,6 +169,7 @@ onError: _mainController.local.sink.addError); } + @override VirtualChannel<T> virtualChannel([int id]) { int inputId; int outputId; @@ -256,10 +261,13 @@ /// except that it will be JSON-serializable. final int id; + @override final Stream<T> stream; + @override final StreamSink<T> sink; VirtualChannel._(this._parent, this.id, this.stream, this.sink); + @override VirtualChannel<T> virtualChannel([id]) => _parent.virtualChannel(id); }
diff --git a/pkgs/stream_channel/lib/src/transformer/typed.dart b/pkgs/stream_channel/lib/src/transformer/typed.dart index 9c2d72b..875cdac 100644 --- a/pkgs/stream_channel/lib/src/transformer/typed.dart +++ b/pkgs/stream_channel/lib/src/transformer/typed.dart
@@ -12,6 +12,7 @@ TypeSafeStreamChannelTransformer(this._inner); + @override StreamChannel<S> bind(StreamChannel<T> channel) => _inner.bind(channel).cast(); }
diff --git a/pkgs/stream_channel/lib/stream_channel.dart b/pkgs/stream_channel/lib/stream_channel.dart index b501160..a5cd584 100644 --- a/pkgs/stream_channel/lib/stream_channel.dart +++ b/pkgs/stream_channel/lib/stream_channel.dart
@@ -138,7 +138,9 @@ /// This is distinct from [StreamChannel] so that it can use /// [StreamChannelMixin]. class _StreamChannel<T> extends StreamChannelMixin<T> { + @override final Stream<T> stream; + @override final StreamSink<T> sink; _StreamChannel(this.stream, this.sink); @@ -147,26 +149,33 @@ /// A mixin that implements the instance methods of [StreamChannel] in terms of /// [stream] and [sink]. abstract class StreamChannelMixin<T> implements StreamChannel<T> { + @override void pipe(StreamChannel<T> other) { stream.pipe(other.sink); other.stream.pipe(sink); } + @override StreamChannel<S> transform<S>(StreamChannelTransformer<S, T> transformer) => transformer.bind(this); + @override StreamChannel<T> transformStream(StreamTransformer<T, T> transformer) => changeStream(transformer.bind); + @override StreamChannel<T> transformSink(StreamSinkTransformer<T, T> transformer) => changeSink(transformer.bind); + @override StreamChannel<T> changeStream(Stream<T> change(Stream<T> stream)) => StreamChannel.withCloseGuarantee(change(stream), sink); + @override StreamChannel<T> changeSink(StreamSink<T> change(StreamSink<T> sink)) => StreamChannel.withCloseGuarantee(stream, change(sink)); + @override StreamChannel<S> cast<S>() => StreamChannel( DelegatingStream.typed(stream), DelegatingStreamSink.typed(sink)); }
diff --git a/pkgs/stream_channel/test/disconnector_test.dart b/pkgs/stream_channel/test/disconnector_test.dart index 7b36c29..aefad28 100644 --- a/pkgs/stream_channel/test/disconnector_test.dart +++ b/pkgs/stream_channel/test/disconnector_test.dart
@@ -144,6 +144,7 @@ _CloseCompleterSink(StreamSink inner) : super(inner); + @override Future close() { super.close(); return completer.future;