Skip to content

Commit fa0153b

Browse files
committed
Rust: Make manual tweaks to Copilot generated code
1 parent aa48536 commit fa0153b

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
@@ -955,85 +955,51 @@ mod try_expressions {
955955
#[derive(Debug)]
956956
struct S2;
957957

958-
#[derive(Debug)]
959-
enum MyResult<T, E> {
960-
MyOk(T),
961-
MyErr(E),
962-
}
963-
964-
impl<T, E> MyResult<T, E> {
965-
fn map<U, F>(self, op: F) -> MyResult<U, E>
966-
where
967-
F: FnOnce(T) -> U,
968-
{
969-
match self {
970-
MyResult::MyOk(t) => MyResult::MyOk(op(t)),
971-
MyResult::MyErr(e) => MyResult::MyErr(e),
972-
}
973-
}
974-
975-
fn and_then<U, F>(self, op: F) -> MyResult<U, E>
976-
where
977-
F: FnOnce(T) -> MyResult<U, E>,
978-
{
979-
match self {
980-
MyResult::MyOk(t) => op(t),
981-
MyResult::MyErr(e) => MyResult::MyErr(e),
982-
}
983-
}
984-
}
985-
986-
// For the try operator to work, we need to implement From<E> for OtherE
987-
impl From<S1> for S2 {
988-
fn from(s: S1) -> S2 {
989-
S2
990-
}
991-
}
992-
993958
// Simple function using ? operator with same error types
994-
fn try_same_error() -> MyResult<S1, S1> {
995-
let x = MyResult::MyOk(S1)?; // $ type=x:S1
996-
MyResult::MyOk(x)
959+
fn try_same_error() -> Result<S1, S1> {
960+
let x = Result::Ok(S1)?; // $ MISSING: type=x:S1
961+
Result::Ok(S1)
997962
}
998963

999964
// Function using ? operator with different error types that need conversion
1000-
fn try_convert_error() -> MyResult<S1, S2> {
1001-
let x: MyResult<S1, S1> = MyResult::MyOk(S1);
1002-
let y = x?; // $ type=y:S1
1003-
MyResult::MyOk(y)
965+
fn try_convert_error() -> Result<S1, S2> {
966+
let x = Result::Ok(S1);
967+
let y = x?; // $ MISSING: type=y:S1
968+
Result::Ok(S1)
1004969
}
1005970

1006971
// Chained ? operations
1007-
fn try_chained() -> MyResult<S1, S2> {
1008-
let x: MyResult<MyResult<S1, S1>, S1> = MyResult::MyOk(MyResult::MyOk(S1));
1009-
let y = x?.map(|s| s)?; // First ? returns MyResult<S1, S1>, second ? returns S1
1010-
MyResult::MyOk(y)
972+
fn try_chained() -> Result<S1, S2> {
973+
let x = Result::Ok(Result::Ok(S1));
974+
// First ? returns Result<S1, S2>, second ? returns S1
975+
let y = x?.map(|s| s)?; // $ MISSING: method=map
976+
Result::Ok(S1)
1011977
}
1012978

1013979
// Function that uses ? with closures and complex error cases
1014-
fn try_complex<T: Debug>(input: MyResult<T, S1>) -> MyResult<T, S2> {
1015-
let value = input?; // $ method=From::from
1016-
let mapped = MyResult::MyOk(value).and_then(|v| {
980+
fn try_complex<T: Debug>(input: Result<T, S1>) -> Result<T, S1> {
981+
let value = input?;
982+
let mapped = Result::Ok(value).and_then(|v| {
1017983
println!("{:?}", v);
1018-
MyResult::MyOk::<_, S1>(v)
1019-
})?; // $ method=From::from
1020-
MyResult::MyOk(mapped)
984+
Result::Ok::<_, S1>(v)
985+
})?; // $ method=and_then
986+
Result::Err(S1)
1021987
}
1022988

1023989
pub fn f() {
1024-
if let MyResult::MyOk(result) = try_same_error() {
990+
if let Result::Ok(result) = try_same_error() {
1025991
println!("{:?}", result);
1026992
}
1027993

1028-
if let MyResult::MyOk(result) = try_convert_error() {
994+
if let Result::Ok(result) = try_convert_error() {
1029995
println!("{:?}", result);
1030996
}
1031997

1032-
if let MyResult::MyOk(result) = try_chained() {
998+
if let Result::Ok(result) = try_chained() {
1033999
println!("{:?}", result);
10341000
}
10351001

1036-
if let MyResult::MyOk(result) = try_complex(MyResult::MyOk(S1)) {
1002+
if let Result::Ok(result) = try_complex(Result::Ok(S1)) {
10371003
println!("{:?}", result);
10381004
}
10391005
}

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

+82-4
Original file line numberDiff line numberDiff line change
@@ -1015,7 +1015,85 @@ inferType
10151015
| main.rs:944:17:944:18 | S1 | | main.rs:923:5:924:14 | S1 |
10161016
| main.rs:945:26:945:26 | x | | main.rs:923:5:924:14 | S1 |
10171017
| main.rs:945:26:945:31 | x.m1() | | main.rs:923:5:924:14 | S1 |
1018-
| main.rs:951:5:951:20 | ...::f(...) | | main.rs:67:5:67:21 | Foo |
1019-
| main.rs:952:5:952:60 | ...::g(...) | | main.rs:67:5:67:21 | Foo |
1020-
| main.rs:952:20:952:38 | ...::Foo {...} | | main.rs:67:5:67:21 | Foo |
1021-
| main.rs:952:41:952:59 | ...::Foo {...} | | main.rs:67:5:67:21 | Foo |
1018+
| main.rs:959:43:962:5 | { ... } | | file://:0:0:0:0 | Result |
1019+
| main.rs:959:43:962:5 | { ... } | E | main.rs:952:5:953:14 | S1 |
1020+
| main.rs:959:43:962:5 | { ... } | T | main.rs:952:5:953:14 | S1 |
1021+
| main.rs:960:17:960:30 | ...::Ok(...) | | file://:0:0:0:0 | Result |
1022+
| main.rs:960:17:960:30 | ...::Ok(...) | T | main.rs:952:5:953:14 | S1 |
1023+
| main.rs:960:28:960:29 | S1 | | main.rs:952:5:953:14 | S1 |
1024+
| main.rs:961:9:961:22 | ...::Ok(...) | | file://:0:0:0:0 | Result |
1025+
| main.rs:961:9:961:22 | ...::Ok(...) | E | main.rs:952:5:953:14 | S1 |
1026+
| main.rs:961:9:961:22 | ...::Ok(...) | T | main.rs:952:5:953:14 | S1 |
1027+
| main.rs:961:20:961:21 | S1 | | main.rs:952:5:953:14 | S1 |
1028+
| main.rs:965:46:969:5 | { ... } | | file://:0:0:0:0 | Result |
1029+
| main.rs:965:46:969:5 | { ... } | E | main.rs:955:5:956:14 | S2 |
1030+
| main.rs:965:46:969:5 | { ... } | T | main.rs:952:5:953:14 | S1 |
1031+
| main.rs:966:13:966:13 | x | | file://:0:0:0:0 | Result |
1032+
| main.rs:966:13:966:13 | x | T | main.rs:952:5:953:14 | S1 |
1033+
| main.rs:966:17:966:30 | ...::Ok(...) | | file://:0:0:0:0 | Result |
1034+
| main.rs:966:17:966:30 | ...::Ok(...) | T | main.rs:952:5:953:14 | S1 |
1035+
| main.rs:966:28:966:29 | S1 | | main.rs:952:5:953:14 | S1 |
1036+
| main.rs:967:17:967:17 | x | | file://:0:0:0:0 | Result |
1037+
| main.rs:967:17:967:17 | x | T | main.rs:952:5:953:14 | S1 |
1038+
| main.rs:968:9:968:22 | ...::Ok(...) | | file://:0:0:0:0 | Result |
1039+
| main.rs:968:9:968:22 | ...::Ok(...) | E | main.rs:955:5:956:14 | S2 |
1040+
| main.rs:968:9:968:22 | ...::Ok(...) | T | main.rs:952:5:953:14 | S1 |
1041+
| main.rs:968:20:968:21 | S1 | | main.rs:952:5:953:14 | S1 |
1042+
| main.rs:972:40:977:5 | { ... } | | file://:0:0:0:0 | Result |
1043+
| main.rs:972:40:977:5 | { ... } | E | main.rs:955:5:956:14 | S2 |
1044+
| main.rs:972:40:977:5 | { ... } | T | main.rs:952:5:953:14 | S1 |
1045+
| main.rs:973:13:973:13 | x | | file://:0:0:0:0 | Result |
1046+
| main.rs:973:13:973:13 | x | T | file://:0:0:0:0 | Result |
1047+
| main.rs:973:13:973:13 | x | T.T | main.rs:952:5:953:14 | S1 |
1048+
| main.rs:973:17:973:42 | ...::Ok(...) | | file://:0:0:0:0 | Result |
1049+
| main.rs:973:17:973:42 | ...::Ok(...) | T | file://:0:0:0:0 | Result |
1050+
| main.rs:973:17:973:42 | ...::Ok(...) | T.T | main.rs:952:5:953:14 | S1 |
1051+
| main.rs:973:28:973:41 | ...::Ok(...) | | file://:0:0:0:0 | Result |
1052+
| main.rs:973:28:973:41 | ...::Ok(...) | T | main.rs:952:5:953:14 | S1 |
1053+
| main.rs:973:39:973:40 | S1 | | main.rs:952:5:953:14 | S1 |
1054+
| main.rs:975:17:975:17 | x | | file://:0:0:0:0 | Result |
1055+
| main.rs:975:17:975:17 | x | T | file://:0:0:0:0 | Result |
1056+
| main.rs:975:17:975:17 | x | T.T | main.rs:952:5:953:14 | S1 |
1057+
| main.rs:976:9:976:22 | ...::Ok(...) | | file://:0:0:0:0 | Result |
1058+
| main.rs:976:9:976:22 | ...::Ok(...) | E | main.rs:955:5:956:14 | S2 |
1059+
| main.rs:976:9:976:22 | ...::Ok(...) | T | main.rs:952:5:953:14 | S1 |
1060+
| main.rs:976:20:976:21 | S1 | | main.rs:952:5:953:14 | S1 |
1061+
| main.rs:980:30:980:34 | input | | file://:0:0:0:0 | Result |
1062+
| main.rs:980:30:980:34 | input | E | main.rs:952:5:953:14 | S1 |
1063+
| main.rs:980:30:980:34 | input | T | main.rs:980:20:980:27 | T |
1064+
| main.rs:980:69:987:5 | { ... } | | file://:0:0:0:0 | Result |
1065+
| main.rs:980:69:987:5 | { ... } | E | main.rs:952:5:953:14 | S1 |
1066+
| main.rs:980:69:987:5 | { ... } | T | main.rs:980:20:980:27 | T |
1067+
| main.rs:981:21:981:25 | input | | file://:0:0:0:0 | Result |
1068+
| main.rs:981:21:981:25 | input | E | main.rs:952:5:953:14 | S1 |
1069+
| main.rs:981:21:981:25 | input | T | main.rs:980:20:980:27 | T |
1070+
| main.rs:982:22:982:38 | ...::Ok(...) | | file://:0:0:0:0 | Result |
1071+
| main.rs:982:22:985:10 | ... .and_then(...) | | file://:0:0:0:0 | Result |
1072+
| main.rs:982:53:985:9 | { ... } | | file://:0:0:0:0 | Result |
1073+
| main.rs:982:53:985:9 | { ... } | E | main.rs:952:5:953:14 | S1 |
1074+
| main.rs:984:13:984:34 | ...::Ok::<...>(...) | | file://:0:0:0:0 | Result |
1075+
| main.rs:984:13:984:34 | ...::Ok::<...>(...) | E | main.rs:952:5:953:14 | S1 |
1076+
| main.rs:986:9:986:23 | ...::Err(...) | | file://:0:0:0:0 | Result |
1077+
| main.rs:986:9:986:23 | ...::Err(...) | E | main.rs:952:5:953:14 | S1 |
1078+
| main.rs:986:9:986:23 | ...::Err(...) | T | main.rs:980:20:980:27 | T |
1079+
| main.rs:986:21:986:22 | S1 | | main.rs:952:5:953:14 | S1 |
1080+
| main.rs:990:37:990:52 | try_same_error(...) | | file://:0:0:0:0 | Result |
1081+
| main.rs:990:37:990:52 | try_same_error(...) | E | main.rs:952:5:953:14 | S1 |
1082+
| main.rs:990:37:990:52 | try_same_error(...) | T | main.rs:952:5:953:14 | S1 |
1083+
| main.rs:994:37:994:55 | try_convert_error(...) | | file://:0:0:0:0 | Result |
1084+
| main.rs:994:37:994:55 | try_convert_error(...) | E | main.rs:955:5:956:14 | S2 |
1085+
| main.rs:994:37:994:55 | try_convert_error(...) | T | main.rs:952:5:953:14 | S1 |
1086+
| main.rs:998:37:998:49 | try_chained(...) | | file://:0:0:0:0 | Result |
1087+
| main.rs:998:37:998:49 | try_chained(...) | E | main.rs:955:5:956:14 | S2 |
1088+
| main.rs:998:37:998:49 | try_chained(...) | T | main.rs:952:5:953:14 | S1 |
1089+
| main.rs:1002:37:1002:63 | try_complex(...) | | file://:0:0:0:0 | Result |
1090+
| main.rs:1002:37:1002:63 | try_complex(...) | E | main.rs:952:5:953:14 | S1 |
1091+
| main.rs:1002:37:1002:63 | try_complex(...) | T | main.rs:952:5:953:14 | S1 |
1092+
| main.rs:1002:49:1002:62 | ...::Ok(...) | | file://:0:0:0:0 | Result |
1093+
| main.rs:1002:49:1002:62 | ...::Ok(...) | E | main.rs:952:5:953:14 | S1 |
1094+
| main.rs:1002:49:1002:62 | ...::Ok(...) | T | main.rs:952:5:953:14 | S1 |
1095+
| main.rs:1002:60:1002:61 | S1 | | main.rs:952:5:953:14 | S1 |
1096+
| main.rs:1010:5:1010:20 | ...::f(...) | | main.rs:67:5:67:21 | Foo |
1097+
| main.rs:1011:5:1011:60 | ...::g(...) | | main.rs:67:5:67:21 | Foo |
1098+
| main.rs:1011:20:1011:38 | ...::Foo {...} | | main.rs:67:5:67:21 | Foo |
1099+
| main.rs:1011:41:1011:59 | ...::Foo {...} | | main.rs:67:5:67:21 | Foo |

0 commit comments

Comments
 (0)