Skip to content

Commit ec5b3ee

Browse files
committed
C#: Add generic test.
1 parent bfd4318 commit ec5b3ee

File tree

4 files changed

+81
-40
lines changed

4 files changed

+81
-40
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
extensionTypeReceiverParameter
22
| extensions.cs:6:5:16:5 | extension(String) | extensions.cs:6:22:6:22 | s |
3+
| extensions.cs:25:5:28:5 | extension(Object)<Object> | file://:0:0:0:0 | t |
4+
| extensions.cs:25:5:28:5 | extension(String)<String> | file://:0:0:0:0 | t |
5+
| extensions.cs:25:5:28:5 | extension(T)`1 | extensions.cs:25:20:25:20 | t |
36
extensionTypeExtendedType
47
| extensions.cs:6:5:16:5 | extension(String) | string |
58
| extensions.cs:18:5:23:5 | extension(Object) | object |
9+
| extensions.cs:25:5:28:5 | extension(Object)<Object> | object |
10+
| extensions.cs:25:5:28:5 | extension(String)<String> | string |
11+
| extensions.cs:25:5:28:5 | extension(T)`1 | T |

csharp/ql/test/library-tests/extension/extensions.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ public static class MyExtensions
2121
public static int StaticObjectM2(string s) { return s.Length; }
2222
public static bool StaticProp => true;
2323
}
24+
25+
extension<T>(T t) where T : class
26+
{
27+
public bool GenericM() => t is not null;
28+
}
2429
}
2530

2631
public static class ClassicExtensions
@@ -34,7 +39,7 @@ public static void CallingExtensions()
3439
{
3540
var s = "Hello World.";
3641

37-
// // Calling the extensions properties
42+
// Calling the extensions properties
3843
var x11 = s.Prop1;
3944
var x12 = s.Prop2;
4045
s.Prop2 = true;
@@ -71,5 +76,12 @@ public static void CallingExtensions()
7176
MyExtensions.get_Prop2(s);
7277
MyExtensions.set_Prop2(s, false);
7378
MyExtensions.get_StaticProp();
79+
80+
// Calling generic extension method
81+
var o = new object();
82+
o.GenericM();
83+
s.GenericM();
84+
MyExtensions.GenericM(o); // NOTE, Not handled in the extractor
85+
MyExtensions.GenericM(s); // NOTE, Not handled in the extractor
7486
}
7587
}
Lines changed: 53 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,64 @@
11
extensionMethodCallArgument
2-
| extensions.cs:45:19:45:24 | call to method M1 | extensions.cs:11:21:11:22 | M1 | extensions.cs:6:22:6:22 | s | 0 | extensions.cs:45:19:45:19 | access to local variable s |
3-
| extensions.cs:46:19:46:29 | call to method M2 | extensions.cs:12:23:12:24 | M2 | extensions.cs:6:22:6:22 | s | 0 | extensions.cs:46:19:46:19 | access to local variable s |
4-
| extensions.cs:46:19:46:29 | call to method M2 | extensions.cs:12:23:12:24 | M2 | extensions.cs:12:33:12:37 | other | 1 | extensions.cs:46:24:46:28 | "!!!" |
5-
| extensions.cs:48:19:48:36 | call to method StaticM2 | extensions.cs:14:27:14:34 | StaticM2 | extensions.cs:14:43:14:43 | x | 0 | extensions.cs:48:35:48:35 | access to local variable s |
6-
| extensions.cs:50:19:50:42 | call to method StaticObjectM2 | extensions.cs:21:27:21:40 | StaticObjectM2 | extensions.cs:21:49:21:49 | s | 0 | extensions.cs:50:41:50:41 | access to local variable s |
7-
| extensions.cs:56:17:56:22 | call to method M3 | extensions.cs:28:24:28:25 | M3 | extensions.cs:28:39:28:39 | s | 0 | extensions.cs:56:17:56:17 | access to local variable s |
8-
| extensions.cs:59:9:59:26 | call to method M1 | extensions.cs:11:21:11:22 | M1 | extensions.cs:6:22:6:22 | s | 0 | extensions.cs:59:25:59:25 | access to local variable s |
9-
| extensions.cs:60:9:60:33 | call to method M2 | extensions.cs:12:23:12:24 | M2 | extensions.cs:6:22:6:22 | s | 0 | extensions.cs:60:25:60:25 | access to local variable s |
10-
| extensions.cs:60:9:60:33 | call to method M2 | extensions.cs:12:23:12:24 | M2 | extensions.cs:12:33:12:37 | other | 1 | extensions.cs:60:28:60:32 | "!!!" |
11-
| extensions.cs:62:9:62:32 | call to method StaticM2 | extensions.cs:14:27:14:34 | StaticM2 | extensions.cs:14:43:14:43 | x | 0 | extensions.cs:62:31:62:31 | access to local variable s |
12-
| extensions.cs:64:9:64:38 | call to method StaticObjectM2 | extensions.cs:21:27:21:40 | StaticObjectM2 | extensions.cs:21:49:21:49 | s | 0 | extensions.cs:64:37:64:37 | access to local variable s |
2+
| extensions.cs:50:19:50:24 | call to method M1 | extensions.cs:11:21:11:22 | M1 | extensions.cs:6:22:6:22 | s | 0 | extensions.cs:50:19:50:19 | access to local variable s |
3+
| extensions.cs:51:19:51:29 | call to method M2 | extensions.cs:12:23:12:24 | M2 | extensions.cs:6:22:6:22 | s | 0 | extensions.cs:51:19:51:19 | access to local variable s |
4+
| extensions.cs:51:19:51:29 | call to method M2 | extensions.cs:12:23:12:24 | M2 | extensions.cs:12:33:12:37 | other | 1 | extensions.cs:51:24:51:28 | "!!!" |
5+
| extensions.cs:53:19:53:36 | call to method StaticM2 | extensions.cs:14:27:14:34 | StaticM2 | extensions.cs:14:43:14:43 | x | 0 | extensions.cs:53:35:53:35 | access to local variable s |
6+
| extensions.cs:55:19:55:42 | call to method StaticObjectM2 | extensions.cs:21:27:21:40 | StaticObjectM2 | extensions.cs:21:49:21:49 | s | 0 | extensions.cs:55:41:55:41 | access to local variable s |
7+
| extensions.cs:61:17:61:22 | call to method M3 | extensions.cs:33:24:33:25 | M3 | extensions.cs:33:39:33:39 | s | 0 | extensions.cs:61:17:61:17 | access to local variable s |
8+
| extensions.cs:64:9:64:26 | call to method M1 | extensions.cs:11:21:11:22 | M1 | extensions.cs:6:22:6:22 | s | 0 | extensions.cs:64:25:64:25 | access to local variable s |
9+
| extensions.cs:65:9:65:33 | call to method M2 | extensions.cs:12:23:12:24 | M2 | extensions.cs:6:22:6:22 | s | 0 | extensions.cs:65:25:65:25 | access to local variable s |
10+
| extensions.cs:65:9:65:33 | call to method M2 | extensions.cs:12:23:12:24 | M2 | extensions.cs:12:33:12:37 | other | 1 | extensions.cs:65:28:65:32 | "!!!" |
11+
| extensions.cs:67:9:67:32 | call to method StaticM2 | extensions.cs:14:27:14:34 | StaticM2 | extensions.cs:14:43:14:43 | x | 0 | extensions.cs:67:31:67:31 | access to local variable s |
12+
| extensions.cs:69:9:69:38 | call to method StaticObjectM2 | extensions.cs:21:27:21:40 | StaticObjectM2 | extensions.cs:21:49:21:49 | s | 0 | extensions.cs:69:37:69:37 | access to local variable s |
13+
| extensions.cs:82:9:82:20 | call to method GenericM | extensions.cs:27:21:27:28 | GenericM | extensions.cs:25:20:25:20 | t | 0 | extensions.cs:82:9:82:9 | access to local variable o |
14+
| extensions.cs:83:9:83:20 | call to method GenericM | extensions.cs:27:21:27:28 | GenericM | extensions.cs:25:20:25:20 | t | 0 | extensions.cs:83:9:83:9 | access to local variable s |
1315
extensionMethodCalls
14-
| extensions.cs:45:19:45:24 | call to method M1 | extensions.cs:11:21:11:22 | M1 | extensions.cs:6:5:16:5 | extension(String) | MyExtensions+extension(String).M1 |
15-
| extensions.cs:46:19:46:29 | call to method M2 | extensions.cs:12:23:12:24 | M2 | extensions.cs:6:5:16:5 | extension(String) | MyExtensions+extension(String).M2 |
16-
| extensions.cs:47:19:47:35 | call to method StaticM1 | extensions.cs:13:27:13:34 | StaticM1 | extensions.cs:6:5:16:5 | extension(String) | MyExtensions+extension(String).StaticM1 |
17-
| extensions.cs:48:19:48:36 | call to method StaticM2 | extensions.cs:14:27:14:34 | StaticM2 | extensions.cs:6:5:16:5 | extension(String) | MyExtensions+extension(String).StaticM2 |
18-
| extensions.cs:49:19:49:41 | call to method StaticObjectM1 | extensions.cs:20:27:20:40 | StaticObjectM1 | extensions.cs:18:5:23:5 | extension(Object) | MyExtensions+extension(Object).StaticObjectM1 |
19-
| extensions.cs:50:19:50:42 | call to method StaticObjectM2 | extensions.cs:21:27:21:40 | StaticObjectM2 | extensions.cs:18:5:23:5 | extension(Object) | MyExtensions+extension(Object).StaticObjectM2 |
20-
| extensions.cs:56:17:56:22 | call to method M3 | extensions.cs:28:24:28:25 | M3 | extensions.cs:26:21:26:37 | ClassicExtensions | ClassicExtensions.M3 |
21-
| extensions.cs:59:9:59:26 | call to method M1 | extensions.cs:11:21:11:22 | M1 | extensions.cs:6:5:16:5 | extension(String) | MyExtensions+extension(String).M1 |
22-
| extensions.cs:60:9:60:33 | call to method M2 | extensions.cs:12:23:12:24 | M2 | extensions.cs:6:5:16:5 | extension(String) | MyExtensions+extension(String).M2 |
23-
| extensions.cs:61:9:61:31 | call to method StaticM1 | extensions.cs:13:27:13:34 | StaticM1 | extensions.cs:6:5:16:5 | extension(String) | MyExtensions+extension(String).StaticM1 |
24-
| extensions.cs:62:9:62:32 | call to method StaticM2 | extensions.cs:14:27:14:34 | StaticM2 | extensions.cs:6:5:16:5 | extension(String) | MyExtensions+extension(String).StaticM2 |
25-
| extensions.cs:63:9:63:37 | call to method StaticObjectM1 | extensions.cs:20:27:20:40 | StaticObjectM1 | extensions.cs:18:5:23:5 | extension(Object) | MyExtensions+extension(Object).StaticObjectM1 |
26-
| extensions.cs:64:9:64:38 | call to method StaticObjectM2 | extensions.cs:21:27:21:40 | StaticObjectM2 | extensions.cs:18:5:23:5 | extension(Object) | MyExtensions+extension(Object).StaticObjectM2 |
16+
| extensions.cs:50:19:50:24 | call to method M1 | extensions.cs:11:21:11:22 | M1 | extensions.cs:6:5:16:5 | extension(String) | MyExtensions+extension(String).M1 |
17+
| extensions.cs:51:19:51:29 | call to method M2 | extensions.cs:12:23:12:24 | M2 | extensions.cs:6:5:16:5 | extension(String) | MyExtensions+extension(String).M2 |
18+
| extensions.cs:52:19:52:35 | call to method StaticM1 | extensions.cs:13:27:13:34 | StaticM1 | extensions.cs:6:5:16:5 | extension(String) | MyExtensions+extension(String).StaticM1 |
19+
| extensions.cs:53:19:53:36 | call to method StaticM2 | extensions.cs:14:27:14:34 | StaticM2 | extensions.cs:6:5:16:5 | extension(String) | MyExtensions+extension(String).StaticM2 |
20+
| extensions.cs:54:19:54:41 | call to method StaticObjectM1 | extensions.cs:20:27:20:40 | StaticObjectM1 | extensions.cs:18:5:23:5 | extension(Object) | MyExtensions+extension(Object).StaticObjectM1 |
21+
| extensions.cs:55:19:55:42 | call to method StaticObjectM2 | extensions.cs:21:27:21:40 | StaticObjectM2 | extensions.cs:18:5:23:5 | extension(Object) | MyExtensions+extension(Object).StaticObjectM2 |
22+
| extensions.cs:61:17:61:22 | call to method M3 | extensions.cs:33:24:33:25 | M3 | extensions.cs:31:21:31:37 | ClassicExtensions | ClassicExtensions.M3 |
23+
| extensions.cs:64:9:64:26 | call to method M1 | extensions.cs:11:21:11:22 | M1 | extensions.cs:6:5:16:5 | extension(String) | MyExtensions+extension(String).M1 |
24+
| extensions.cs:65:9:65:33 | call to method M2 | extensions.cs:12:23:12:24 | M2 | extensions.cs:6:5:16:5 | extension(String) | MyExtensions+extension(String).M2 |
25+
| extensions.cs:66:9:66:31 | call to method StaticM1 | extensions.cs:13:27:13:34 | StaticM1 | extensions.cs:6:5:16:5 | extension(String) | MyExtensions+extension(String).StaticM1 |
26+
| extensions.cs:67:9:67:32 | call to method StaticM2 | extensions.cs:14:27:14:34 | StaticM2 | extensions.cs:6:5:16:5 | extension(String) | MyExtensions+extension(String).StaticM2 |
27+
| extensions.cs:68:9:68:37 | call to method StaticObjectM1 | extensions.cs:20:27:20:40 | StaticObjectM1 | extensions.cs:18:5:23:5 | extension(Object) | MyExtensions+extension(Object).StaticObjectM1 |
28+
| extensions.cs:69:9:69:38 | call to method StaticObjectM2 | extensions.cs:21:27:21:40 | StaticObjectM2 | extensions.cs:18:5:23:5 | extension(Object) | MyExtensions+extension(Object).StaticObjectM2 |
29+
| extensions.cs:82:9:82:20 | call to method GenericM | extensions.cs:27:21:27:28 | GenericM | extensions.cs:25:5:28:5 | extension(Object)<Object> | MyExtensions+extension(Object)<System.Object>.GenericM |
30+
| extensions.cs:83:9:83:20 | call to method GenericM | extensions.cs:27:21:27:28 | GenericM | extensions.cs:25:5:28:5 | extension(String)<String> | MyExtensions+extension(String)<System.String>.GenericM |
31+
extensionParameter
32+
| extensions.cs:11:21:11:22 | M1 | extensions.cs:6:22:6:22 | s | 0 | string | extensions.cs:6:22:6:22 | s |
33+
| extensions.cs:12:23:12:24 | M2 | extensions.cs:6:22:6:22 | s | 0 | string | extensions.cs:6:22:6:22 | s |
34+
| extensions.cs:12:23:12:24 | M2 | extensions.cs:12:33:12:37 | other | 1 | string | extensions.cs:12:33:12:37 | other |
35+
| extensions.cs:14:27:14:34 | StaticM2 | extensions.cs:14:43:14:43 | x | 0 | string | extensions.cs:14:43:14:43 | x |
36+
| extensions.cs:21:27:21:40 | StaticObjectM2 | extensions.cs:21:49:21:49 | s | 0 | string | extensions.cs:21:49:21:49 | s |
37+
| extensions.cs:27:21:27:28 | GenericM | extensions.cs:25:20:25:20 | t | 0 | T | extensions.cs:25:20:25:20 | t |
38+
| extensions.cs:27:21:27:28 | GenericM | extensions.cs:25:20:25:20 | t | 0 | object | extensions.cs:25:20:25:20 | t |
39+
| extensions.cs:27:21:27:28 | GenericM | extensions.cs:25:20:25:20 | t | 0 | string | extensions.cs:25:20:25:20 | t |
40+
| extensions.cs:33:24:33:25 | M3 | extensions.cs:33:39:33:39 | s | 0 | string | extensions.cs:33:39:33:39 | s |
2741
extensionOperatorCallArgument
28-
| extensions.cs:15:39:15:39 | * | extensions.cs:53:19:53:23 | call to operator * | extensions.cs:15:45:15:45 | a | 0 | extensions.cs:53:19:53:19 | 3 |
29-
| extensions.cs:15:39:15:39 | * | extensions.cs:53:19:53:23 | call to operator * | extensions.cs:15:55:15:55 | b | 1 | extensions.cs:53:23:53:23 | access to local variable s |
30-
| extensions.cs:15:39:15:39 | * | extensions.cs:67:9:67:38 | call to operator * | extensions.cs:15:45:15:45 | a | 0 | extensions.cs:67:34:67:34 | 3 |
31-
| extensions.cs:15:39:15:39 | * | extensions.cs:67:9:67:38 | call to operator * | extensions.cs:15:55:15:55 | b | 1 | extensions.cs:67:37:67:37 | access to local variable s |
42+
| extensions.cs:15:39:15:39 | * | extensions.cs:58:19:58:23 | call to operator * | extensions.cs:15:45:15:45 | a | 0 | extensions.cs:58:19:58:19 | 3 |
43+
| extensions.cs:15:39:15:39 | * | extensions.cs:58:19:58:23 | call to operator * | extensions.cs:15:55:15:55 | b | 1 | extensions.cs:58:23:58:23 | access to local variable s |
44+
| extensions.cs:15:39:15:39 | * | extensions.cs:72:9:72:38 | call to operator * | extensions.cs:15:45:15:45 | a | 0 | extensions.cs:72:34:72:34 | 3 |
45+
| extensions.cs:15:39:15:39 | * | extensions.cs:72:9:72:38 | call to operator * | extensions.cs:15:55:15:55 | b | 1 | extensions.cs:72:37:72:37 | access to local variable s |
3246
extensionOperatorCalls
33-
| extensions.cs:53:19:53:23 | call to operator * | extensions.cs:15:39:15:39 | * | extensions.cs:6:5:16:5 | extension(String) | MyExtensions+extension(String).op_Multiply |
34-
| extensions.cs:67:9:67:38 | call to operator * | extensions.cs:15:39:15:39 | * | extensions.cs:6:5:16:5 | extension(String) | MyExtensions+extension(String).op_Multiply |
47+
| extensions.cs:58:19:58:23 | call to operator * | extensions.cs:15:39:15:39 | * | extensions.cs:6:5:16:5 | extension(String) | MyExtensions+extension(String).op_Multiply |
48+
| extensions.cs:72:9:72:38 | call to operator * | extensions.cs:15:39:15:39 | * | extensions.cs:6:5:16:5 | extension(String) | MyExtensions+extension(String).op_Multiply |
3549
extensionProperty
3650
| extensions.cs:8:21:8:25 | Prop1 | extensions.cs:6:5:16:5 | extension(String) |
3751
| extensions.cs:9:21:9:25 | Prop2 | extensions.cs:6:5:16:5 | extension(String) |
3852
| extensions.cs:10:28:10:38 | StaticProp1 | extensions.cs:6:5:16:5 | extension(String) |
3953
| extensions.cs:22:28:22:37 | StaticProp | extensions.cs:18:5:23:5 | extension(Object) |
4054
extensionPropertyCall
41-
| extensions.cs:38:19:38:25 | access to property Prop1 | extensions.cs:8:21:8:25 | Prop1 | extensions.cs:6:5:16:5 | extension(String) | MyExtensions+extension(String).Prop1 |
42-
| extensions.cs:39:19:39:25 | access to property Prop2 | extensions.cs:9:21:9:25 | Prop2 | extensions.cs:6:5:16:5 | extension(String) | MyExtensions+extension(String).Prop2 |
43-
| extensions.cs:40:9:40:15 | access to property Prop2 | extensions.cs:9:21:9:25 | Prop2 | extensions.cs:6:5:16:5 | extension(String) | MyExtensions+extension(String).Prop2 |
44-
| extensions.cs:41:19:41:36 | access to property StaticProp1 | extensions.cs:10:28:10:38 | StaticProp1 | extensions.cs:6:5:16:5 | extension(String) | MyExtensions+extension(String).StaticProp1 |
45-
| extensions.cs:42:19:42:35 | access to property StaticProp | extensions.cs:22:28:22:37 | StaticProp | extensions.cs:18:5:23:5 | extension(Object) | MyExtensions+extension(Object).StaticProp |
55+
| extensions.cs:43:19:43:25 | access to property Prop1 | extensions.cs:8:21:8:25 | Prop1 | extensions.cs:6:5:16:5 | extension(String) | MyExtensions+extension(String).Prop1 |
56+
| extensions.cs:44:19:44:25 | access to property Prop2 | extensions.cs:9:21:9:25 | Prop2 | extensions.cs:6:5:16:5 | extension(String) | MyExtensions+extension(String).Prop2 |
57+
| extensions.cs:45:9:45:15 | access to property Prop2 | extensions.cs:9:21:9:25 | Prop2 | extensions.cs:6:5:16:5 | extension(String) | MyExtensions+extension(String).Prop2 |
58+
| extensions.cs:46:19:46:36 | access to property StaticProp1 | extensions.cs:10:28:10:38 | StaticProp1 | extensions.cs:6:5:16:5 | extension(String) | MyExtensions+extension(String).StaticProp1 |
59+
| extensions.cs:47:19:47:35 | access to property StaticProp | extensions.cs:22:28:22:37 | StaticProp | extensions.cs:18:5:23:5 | extension(Object) | MyExtensions+extension(Object).StaticProp |
4660
extensionAccessorCall
47-
| extensions.cs:70:9:70:33 | call to extension accessor get_Prop1 | extensions.cs:8:30:8:41 | get_Prop1 | extensions.cs:8:21:8:25 | Prop1 | MyExtensions+extension(String).get_Prop1 |
48-
| extensions.cs:71:9:71:33 | call to extension accessor get_Prop2 | extensions.cs:9:29:9:31 | get_Prop2 | extensions.cs:9:21:9:25 | Prop2 | MyExtensions+extension(String).get_Prop2 |
49-
| extensions.cs:72:9:72:40 | call to extension accessor set_Prop2 | extensions.cs:9:50:9:52 | set_Prop2 | extensions.cs:9:21:9:25 | Prop2 | MyExtensions+extension(String).set_Prop2 |
50-
| extensions.cs:73:9:73:37 | call to extension accessor get_StaticProp | extensions.cs:22:42:22:45 | get_StaticProp | extensions.cs:22:28:22:37 | StaticProp | MyExtensions+extension(Object).get_StaticProp |
61+
| extensions.cs:75:9:75:33 | call to extension accessor get_Prop1 | extensions.cs:8:30:8:41 | get_Prop1 | extensions.cs:8:21:8:25 | Prop1 | MyExtensions+extension(String).get_Prop1 |
62+
| extensions.cs:76:9:76:33 | call to extension accessor get_Prop2 | extensions.cs:9:29:9:31 | get_Prop2 | extensions.cs:9:21:9:25 | Prop2 | MyExtensions+extension(String).get_Prop2 |
63+
| extensions.cs:77:9:77:40 | call to extension accessor set_Prop2 | extensions.cs:9:50:9:52 | set_Prop2 | extensions.cs:9:21:9:25 | Prop2 | MyExtensions+extension(String).set_Prop2 |
64+
| extensions.cs:78:9:78:37 | call to extension accessor get_StaticProp | extensions.cs:22:42:22:45 | get_StaticProp | extensions.cs:22:28:22:37 | StaticProp | MyExtensions+extension(Object).get_StaticProp |

csharp/ql/test/library-tests/extension/extensions.ql

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,15 @@ query predicate extensionMethodCalls(
1818
em.getFullyQualifiedNameDebug() = type
1919
}
2020

21+
query predicate extensionParameter(
22+
ExtensionMethod em, Parameter p, int i, string type, Parameter unbound
23+
) {
24+
em.getFile().getBaseName() = "extensions.cs" and
25+
p = em.getParameter(i) and
26+
type = p.getType().toStringWithTypes() and
27+
unbound = p.getUnboundDeclaration()
28+
}
29+
2130
query predicate extensionOperatorCallArgument(
2231
ExtensionOperator op, ExtensionOperatorCall opc, Parameter p, int pos, Expr e
2332
) {

0 commit comments

Comments
 (0)