Skip to content

Commit 0548af3

Browse files
committed
Rust: Make manual tweaks to Copilot generated code
1 parent ffa9bf6 commit 0548af3

File tree

2 files changed

+104
-60
lines changed

2 files changed

+104
-60
lines changed

rust/ql/test/library-tests/type-inference/main.rs

+22-56
Original file line numberDiff line numberDiff line change
@@ -928,85 +928,51 @@ mod try_expressions {
928928
#[derive(Debug)]
929929
struct S2;
930930

931-
#[derive(Debug)]
932-
enum MyResult<T, E> {
933-
MyOk(T),
934-
MyErr(E),
935-
}
936-
937-
impl<T, E> MyResult<T, E> {
938-
fn map<U, F>(self, op: F) -> MyResult<U, E>
939-
where
940-
F: FnOnce(T) -> U,
941-
{
942-
match self {
943-
MyResult::MyOk(t) => MyResult::MyOk(op(t)),
944-
MyResult::MyErr(e) => MyResult::MyErr(e),
945-
}
946-
}
947-
948-
fn and_then<U, F>(self, op: F) -> MyResult<U, E>
949-
where
950-
F: FnOnce(T) -> MyResult<U, E>,
951-
{
952-
match self {
953-
MyResult::MyOk(t) => op(t),
954-
MyResult::MyErr(e) => MyResult::MyErr(e),
955-
}
956-
}
957-
}
958-
959-
// For the try operator to work, we need to implement From<E> for OtherE
960-
impl From<S1> for S2 {
961-
fn from(s: S1) -> S2 {
962-
S2
963-
}
964-
}
965-
966931
// Simple function using ? operator with same error types
967-
fn try_same_error() -> MyResult<S1, S1> {
968-
let x = MyResult::MyOk(S1)?; // $ type=x:S1
969-
MyResult::MyOk(x)
932+
fn try_same_error() -> Result<S1, S1> {
933+
let x = Result::Ok(S1)?; // $ MISSING: type=x:S1
934+
Result::Ok(S1)
970935
}
971936

972937
// Function using ? operator with different error types that need conversion
973-
fn try_convert_error() -> MyResult<S1, S2> {
974-
let x: MyResult<S1, S1> = MyResult::MyOk(S1);
975-
let y = x?; // $ type=y:S1
976-
MyResult::MyOk(y)
938+
fn try_convert_error() -> Result<S1, S2> {
939+
let x = Result::Ok(S1);
940+
let y = x?; // $ MISSING: type=y:S1
941+
Result::Ok(S1)
977942
}
978943

979944
// Chained ? operations
980-
fn try_chained() -> MyResult<S1, S2> {
981-
let x: MyResult<MyResult<S1, S1>, S1> = MyResult::MyOk(MyResult::MyOk(S1));
982-
let y = x?.map(|s| s)?; // First ? returns MyResult<S1, S1>, second ? returns S1
983-
MyResult::MyOk(y)
945+
fn try_chained() -> Result<S1, S2> {
946+
let x = Result::Ok(Result::Ok(S1));
947+
// First ? returns Result<S1, S2>, second ? returns S1
948+
let y = x?.map(|s| s)?; // $ MISSING: method=map
949+
Result::Ok(S1)
984950
}
985951

986952
// Function that uses ? with closures and complex error cases
987-
fn try_complex<T: Debug>(input: MyResult<T, S1>) -> MyResult<T, S2> {
988-
let value = input?; // $ method=From::from
989-
let mapped = MyResult::MyOk(value).and_then(|v| {
953+
fn try_complex<T: Debug>(input: Result<T, S1>) -> Result<T, S1> {
954+
let value = input?;
955+
let mapped = Result::Ok(value).and_then(|v| {
990956
println!("{:?}", v);
991-
MyResult::MyOk::<_, S1>(v)
992-
})?; // $ method=From::from
993-
MyResult::MyOk(mapped)
957+
Result::Ok::<_, S1>(v)
958+
})?; // $ method=and_then
959+
Result::Err(S1)
994960
}
995961

996962
pub fn f() {
997-
if let MyResult::MyOk(result) = try_same_error() {
963+
if let Result::Ok(result) = try_same_error() {
998964
println!("{:?}", result);
999965
}
1000966

1001-
if let MyResult::MyOk(result) = try_convert_error() {
967+
if let Result::Ok(result) = try_convert_error() {
1002968
println!("{:?}", result);
1003969
}
1004970

1005-
if let MyResult::MyOk(result) = try_chained() {
971+
if let Result::Ok(result) = try_chained() {
1006972
println!("{:?}", result);
1007973
}
1008974

1009-
if let MyResult::MyOk(result) = try_complex(MyResult::MyOk(S1)) {
975+
if let Result::Ok(result) = try_complex(Result::Ok(S1)) {
1010976
println!("{:?}", result);
1011977
}
1012978
}

rust/ql/test/library-tests/type-inference/type-inference.expected

+82-4
Original file line numberDiff line numberDiff line change
@@ -1005,7 +1005,85 @@ inferType
10051005
| main.rs:918:15:918:16 | &x | | file://:0:0:0:0 | & |
10061006
| main.rs:918:15:918:16 | &x | &T | main.rs:894:5:894:13 | S |
10071007
| main.rs:918:16:918:16 | x | | main.rs:894:5:894:13 | S |
1008-
| main.rs:924:5:924:20 | ...::f(...) | | main.rs:67:5:67:21 | Foo |
1009-
| main.rs:925:5:925:60 | ...::g(...) | | main.rs:67:5:67:21 | Foo |
1010-
| main.rs:925:20:925:38 | ...::Foo {...} | | main.rs:67:5:67:21 | Foo |
1011-
| main.rs:925:41:925:59 | ...::Foo {...} | | main.rs:67:5:67:21 | Foo |
1008+
| main.rs:932:43:935:5 | { ... } | | file://:0:0:0:0 | Result |
1009+
| main.rs:932:43:935:5 | { ... } | E | main.rs:925:5:926:14 | S1 |
1010+
| main.rs:932:43:935:5 | { ... } | T | main.rs:925:5:926:14 | S1 |
1011+
| main.rs:933:17:933:30 | ...::Ok(...) | | file://:0:0:0:0 | Result |
1012+
| main.rs:933:17:933:30 | ...::Ok(...) | T | main.rs:925:5:926:14 | S1 |
1013+
| main.rs:933:28:933:29 | S1 | | main.rs:925:5:926:14 | S1 |
1014+
| main.rs:934:9:934:22 | ...::Ok(...) | | file://:0:0:0:0 | Result |
1015+
| main.rs:934:9:934:22 | ...::Ok(...) | E | main.rs:925:5:926:14 | S1 |
1016+
| main.rs:934:9:934:22 | ...::Ok(...) | T | main.rs:925:5:926:14 | S1 |
1017+
| main.rs:934:20:934:21 | S1 | | main.rs:925:5:926:14 | S1 |
1018+
| main.rs:938:46:942:5 | { ... } | | file://:0:0:0:0 | Result |
1019+
| main.rs:938:46:942:5 | { ... } | E | main.rs:928:5:929:14 | S2 |
1020+
| main.rs:938:46:942:5 | { ... } | T | main.rs:925:5:926:14 | S1 |
1021+
| main.rs:939:13:939:13 | x | | file://:0:0:0:0 | Result |
1022+
| main.rs:939:13:939:13 | x | T | main.rs:925:5:926:14 | S1 |
1023+
| main.rs:939:17:939:30 | ...::Ok(...) | | file://:0:0:0:0 | Result |
1024+
| main.rs:939:17:939:30 | ...::Ok(...) | T | main.rs:925:5:926:14 | S1 |
1025+
| main.rs:939:28:939:29 | S1 | | main.rs:925:5:926:14 | S1 |
1026+
| main.rs:940:17:940:17 | x | | file://:0:0:0:0 | Result |
1027+
| main.rs:940:17:940:17 | x | T | main.rs:925:5:926:14 | S1 |
1028+
| main.rs:941:9:941:22 | ...::Ok(...) | | file://:0:0:0:0 | Result |
1029+
| main.rs:941:9:941:22 | ...::Ok(...) | E | main.rs:928:5:929:14 | S2 |
1030+
| main.rs:941:9:941:22 | ...::Ok(...) | T | main.rs:925:5:926:14 | S1 |
1031+
| main.rs:941:20:941:21 | S1 | | main.rs:925:5:926:14 | S1 |
1032+
| main.rs:945:40:950:5 | { ... } | | file://:0:0:0:0 | Result |
1033+
| main.rs:945:40:950:5 | { ... } | E | main.rs:928:5:929:14 | S2 |
1034+
| main.rs:945:40:950:5 | { ... } | T | main.rs:925:5:926:14 | S1 |
1035+
| main.rs:946:13:946:13 | x | | file://:0:0:0:0 | Result |
1036+
| main.rs:946:13:946:13 | x | T | file://:0:0:0:0 | Result |
1037+
| main.rs:946:13:946:13 | x | T.T | main.rs:925:5:926:14 | S1 |
1038+
| main.rs:946:17:946:42 | ...::Ok(...) | | file://:0:0:0:0 | Result |
1039+
| main.rs:946:17:946:42 | ...::Ok(...) | T | file://:0:0:0:0 | Result |
1040+
| main.rs:946:17:946:42 | ...::Ok(...) | T.T | main.rs:925:5:926:14 | S1 |
1041+
| main.rs:946:28:946:41 | ...::Ok(...) | | file://:0:0:0:0 | Result |
1042+
| main.rs:946:28:946:41 | ...::Ok(...) | T | main.rs:925:5:926:14 | S1 |
1043+
| main.rs:946:39:946:40 | S1 | | main.rs:925:5:926:14 | S1 |
1044+
| main.rs:948:17:948:17 | x | | file://:0:0:0:0 | Result |
1045+
| main.rs:948:17:948:17 | x | T | file://:0:0:0:0 | Result |
1046+
| main.rs:948:17:948:17 | x | T.T | main.rs:925:5:926:14 | S1 |
1047+
| main.rs:949:9:949:22 | ...::Ok(...) | | file://:0:0:0:0 | Result |
1048+
| main.rs:949:9:949:22 | ...::Ok(...) | E | main.rs:928:5:929:14 | S2 |
1049+
| main.rs:949:9:949:22 | ...::Ok(...) | T | main.rs:925:5:926:14 | S1 |
1050+
| main.rs:949:20:949:21 | S1 | | main.rs:925:5:926:14 | S1 |
1051+
| main.rs:953:30:953:34 | input | | file://:0:0:0:0 | Result |
1052+
| main.rs:953:30:953:34 | input | E | main.rs:925:5:926:14 | S1 |
1053+
| main.rs:953:30:953:34 | input | T | main.rs:953:20:953:27 | T |
1054+
| main.rs:953:69:960:5 | { ... } | | file://:0:0:0:0 | Result |
1055+
| main.rs:953:69:960:5 | { ... } | E | main.rs:925:5:926:14 | S1 |
1056+
| main.rs:953:69:960:5 | { ... } | T | main.rs:953:20:953:27 | T |
1057+
| main.rs:954:21:954:25 | input | | file://:0:0:0:0 | Result |
1058+
| main.rs:954:21:954:25 | input | E | main.rs:925:5:926:14 | S1 |
1059+
| main.rs:954:21:954:25 | input | T | main.rs:953:20:953:27 | T |
1060+
| main.rs:955:22:955:38 | ...::Ok(...) | | file://:0:0:0:0 | Result |
1061+
| main.rs:955:22:958:10 | ... .and_then(...) | | file://:0:0:0:0 | Result |
1062+
| main.rs:955:53:958:9 | { ... } | | file://:0:0:0:0 | Result |
1063+
| main.rs:955:53:958:9 | { ... } | E | main.rs:925:5:926:14 | S1 |
1064+
| main.rs:957:13:957:34 | ...::Ok::<...>(...) | | file://:0:0:0:0 | Result |
1065+
| main.rs:957:13:957:34 | ...::Ok::<...>(...) | E | main.rs:925:5:926:14 | S1 |
1066+
| main.rs:959:9:959:23 | ...::Err(...) | | file://:0:0:0:0 | Result |
1067+
| main.rs:959:9:959:23 | ...::Err(...) | E | main.rs:925:5:926:14 | S1 |
1068+
| main.rs:959:9:959:23 | ...::Err(...) | T | main.rs:953:20:953:27 | T |
1069+
| main.rs:959:21:959:22 | S1 | | main.rs:925:5:926:14 | S1 |
1070+
| main.rs:963:37:963:52 | try_same_error(...) | | file://:0:0:0:0 | Result |
1071+
| main.rs:963:37:963:52 | try_same_error(...) | E | main.rs:925:5:926:14 | S1 |
1072+
| main.rs:963:37:963:52 | try_same_error(...) | T | main.rs:925:5:926:14 | S1 |
1073+
| main.rs:967:37:967:55 | try_convert_error(...) | | file://:0:0:0:0 | Result |
1074+
| main.rs:967:37:967:55 | try_convert_error(...) | E | main.rs:928:5:929:14 | S2 |
1075+
| main.rs:967:37:967:55 | try_convert_error(...) | T | main.rs:925:5:926:14 | S1 |
1076+
| main.rs:971:37:971:49 | try_chained(...) | | file://:0:0:0:0 | Result |
1077+
| main.rs:971:37:971:49 | try_chained(...) | E | main.rs:928:5:929:14 | S2 |
1078+
| main.rs:971:37:971:49 | try_chained(...) | T | main.rs:925:5:926:14 | S1 |
1079+
| main.rs:975:37:975:63 | try_complex(...) | | file://:0:0:0:0 | Result |
1080+
| main.rs:975:37:975:63 | try_complex(...) | E | main.rs:925:5:926:14 | S1 |
1081+
| main.rs:975:37:975:63 | try_complex(...) | T | main.rs:925:5:926:14 | S1 |
1082+
| main.rs:975:49:975:62 | ...::Ok(...) | | file://:0:0:0:0 | Result |
1083+
| main.rs:975:49:975:62 | ...::Ok(...) | E | main.rs:925:5:926:14 | S1 |
1084+
| main.rs:975:49:975:62 | ...::Ok(...) | T | main.rs:925:5:926:14 | S1 |
1085+
| main.rs:975:60:975:61 | S1 | | main.rs:925:5:926:14 | S1 |
1086+
| main.rs:983:5:983:20 | ...::f(...) | | main.rs:67:5:67:21 | Foo |
1087+
| main.rs:984:5:984:60 | ...::g(...) | | main.rs:67:5:67:21 | Foo |
1088+
| main.rs:984:20:984:38 | ...::Foo {...} | | main.rs:67:5:67:21 | Foo |
1089+
| main.rs:984:41:984:59 | ...::Foo {...} | | main.rs:67:5:67:21 | Foo |

0 commit comments

Comments
 (0)