blob: e428fece035b0c290eefe46124e7246ac1dda254 [file] [log] [blame] [view]
<!-- WARNING: This file is machine generated by //src/tests/fidl/source_compatibility/gen, do not edit. -->
Note: This document covers API impact only. For more details, see the
[ABI compatibility page](/docs/development/languages/fidl/guides/compatibility/README.md)
# Remove a protocol method
## Overview
-|[init](#init)|[step 1](#step-1)|[step 2](#step-2)|[step 3](#step-3)|[step 4](#step-4)
---|---|---|---|---|---
fidl|[link](#fidl-init)|[link](#fidl-1)||[link](#fidl-3)|
dart|[link](#dart-init)||[link](#dart-2)||
go|[link](#go-init)||[link](#go-2)||[link](#go-4)
hlcpp|[link](#hlcpp-init)||[link](#hlcpp-2)||
llcpp|[link](#llcpp-init)||[link](#llcpp-2)||
rust|[link](#rust-init)||[link](#rust-2)||[link](#rust-4)
## Initial State {#init}
### FIDL {#fidl-init}
```fidl
protocol Example {
ExistingMethod();
OldMethod();
};
```
### Dart {#dart-init}
```dart
class Server extends fidllib.Example {
@override
Future<void> existingMethod() async {}
@override
Future<void> oldMethod() async {}
}
void client(fidllib.ExampleProxy client) async {
await client.existingMethod();
await client.oldMethod();
}
```
### Go {#go-init}
```go
type client struct {
removeMethod *lib.ExampleWithCtxInterface
}
func (c client) test() {
c.removeMethod.ExistingMethod(context.Background())
c.removeMethod.OldMethod(context.Background())
}
type server struct{}
// Assert that server implements the Example interface
var _ lib.ExampleWithCtx = &server{}
func (*server) ExistingMethod(fidl.Context) error {
return nil
}
func (*server) OldMethod(fidl.Context) error {
return nil
}
```
### HLCPP {#hlcpp-init}
```cpp
class Server : public fidl_test::Example {
void ExistingMethod() final {}
void OldMethod() final {}
};
void client(fidl_test::ExamplePtr client) {
client->ExistingMethod();
client->OldMethod();
}
```
### LLCPP {#llcpp-init}
```cpp
class Server final : public fidl::WireServer<fidl_test::Example> {
public:
void ExistingMethod(ExistingMethodRequestView request,
ExistingMethodCompleter::Sync& completer) final {}
void OldMethod(OldMethodRequestView request, OldMethodCompleter::Sync& completer) final {}
};
void client(fidl::WireClient<fidl_test::Example> client) {
client->ExistingMethod();
client->OldMethod();
}
```
### Rust {#rust-init}
```rust
struct ExampleFakeProxy;
impl fidl_lib::ExampleProxyInterface for ExampleFakeProxy {
fn existing_method(&self) -> Result<(), fidl::Error> {
Ok(())
}
fn old_method(&self) -> Result<(), fidl::Error> {
Ok(())
}
}
async fn example_service(chan: fasync::Channel) -> Result<(), fidl::Error> {
let mut stream = fidl_lib::ExampleRequestStream::from_channel(chan);
while let Some(req) = stream.try_next().await? {
match req {
fidl_lib::ExampleRequest::ExistingMethod { .. } => {}
fidl_lib::ExampleRequest::OldMethod { .. } => {}
}
}
Ok(())
}
```
## Update FIDL Library {#step-1}
- Mark the method that is being removed with the `[Transitional]` attribute.
```diff
protocol Example {
ExistingMethod();
+ @transitional
OldMethod();
};
```
## Update Source Code {#step-2}
### Dart {#dart-2}
- Remove references to the method in client code and server code.
```diff
class Server extends fidllib.Example {
@override
Future<void> existingMethod() async {}
-
- @override
- Future<void> oldMethod() async {}
}
void client(fidllib.ExampleProxy client) async {
await client.existingMethod();
- await client.oldMethod();
}
```
### Go {#go-2}
- Embed the protocol's `WithCtxTransitionBase` struct into the server type.
- Remove the implementation for the method being removed from the server.
- Remove any references to the method in client code (e.g. request calls being made)
```diff
type client struct {
removeMethod *lib.ExampleWithCtxInterface
}
func (c client) test() {
c.removeMethod.ExistingMethod(context.Background())
- c.removeMethod.OldMethod(context.Background())
}
- type server struct{}
+ type server struct {
+ lib.ExampleWithCtxInterface
+ }
// Assert that server implements the Example interface
var _ lib.ExampleWithCtx = &server{}
func (*server) ExistingMethod(fidl.Context) error {
return nil
}
- func (*server) OldMethod(fidl.Context) error {
- return nil
- }
-
```
### HLCPP {#hlcpp-2}
- Remove references to the method in client code and server code.
```diff
class Server : public fidl_test::Example {
void ExistingMethod() final {}
- void OldMethod() final {}
};
- void client(fidl_test::ExamplePtr client) {
- client->ExistingMethod();
- client->OldMethod();
- }
+ void client(fidl_test::ExamplePtr client) { client->ExistingMethod(); }
```
### LLCPP {#llcpp-2}
- Remove references to the method in client code and server code.
```diff
class Server final : public fidl::WireServer<fidl_test::Example> {
public:
void ExistingMethod(ExistingMethodRequestView request,
ExistingMethodCompleter::Sync& completer) final {}
- void OldMethod(OldMethodRequestView request, OldMethodCompleter::Sync& completer) final {}
};
- void client(fidl::WireClient<fidl_test::Example> client) {
- client->ExistingMethod();
- client->OldMethod();
- }
+ void client(fidl::WireClient<fidl_test::Example> client) { client->ExistingMethod(); }
```
### Rust {#rust-2}
- Add #[allow(unreachable_patterns)] to the server's request stream match.
- Replace the match arm for the method that is being removed with a catchall (`_`) arm.
- Remove any references to the method in client code (e.g. as part of implementations of the `ProxyInterface`).
```diff
struct ExampleFakeProxy;
impl fidl_lib::ExampleProxyInterface for ExampleFakeProxy {
fn existing_method(&self) -> Result<(), fidl::Error> {
- Ok(())
- }
- fn old_method(&self) -> Result<(), fidl::Error> {
Ok(())
}
}
async fn example_service(chan: fasync::Channel) -> Result<(), fidl::Error> {
let mut stream = fidl_lib::ExampleRequestStream::from_channel(chan);
while let Some(req) = stream.try_next().await? {
+ #[allow(unreachable_patterns)]
match req {
fidl_lib::ExampleRequest::ExistingMethod { .. } => {}
- fidl_lib::ExampleRequest::OldMethod { .. } => {}
+ _ => {}
}
}
Ok(())
}
```
## Update FIDL Library {#step-3}
- Remove the method.
```diff
protocol Example {
ExistingMethod();
- @transitional
- OldMethod();
};
```
## Update Source Code {#step-4}
### Go {#go-4}
- Remove the embedded `WithCtxInterface` struct.
```diff
type client struct {
removeMethod *lib.ExampleWithCtxInterface
}
func (c client) test() {
c.removeMethod.ExistingMethod(context.Background())
}
- type server struct {
- lib.ExampleWithCtxInterface
- }
+ type server struct{}
// Assert that server implements the Example interface
var _ lib.ExampleWithCtx = &server{}
func (*server) ExistingMethod(fidl.Context) error {
return nil
}
```
### Rust {#rust-4}
- Remove the `#[allow(unreachable_patterns)]` attribute and the catch-all match arm.
```diff
struct ExampleFakeProxy;
impl fidl_lib::ExampleProxyInterface for ExampleFakeProxy {
fn existing_method(&self) -> Result<(), fidl::Error> {
Ok(())
}
}
async fn example_service(chan: fasync::Channel) -> Result<(), fidl::Error> {
let mut stream = fidl_lib::ExampleRequestStream::from_channel(chan);
while let Some(req) = stream.try_next().await? {
- #[allow(unreachable_patterns)]
match req {
fidl_lib::ExampleRequest::ExistingMethod { .. } => {}
- _ => {}
}
}
Ok(())
}
```