Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ private Constructor(Context cx, IMethodSymbol init)
.ToList();
}

protected override IMethodSymbol BodyDeclaringSymbol => Symbol.PartialImplementationPart ?? Symbol;

public override void Populate(TextWriter trapFile)
{
PopulateMethod(trapFile);
Expand Down Expand Up @@ -176,6 +178,14 @@ private void ExtractSourceInitializer(TextWriter trapFile, ITypeSymbol? type, IM
init.PopulateArguments(trapFile, arguments, 0);
}

private ConstructorDeclarationSyntax? OrdinaryConstructorSyntaxForLocation =>
BodyDeclaringSymbol
.DeclaringSyntaxReferences
.Select(r => r.GetSyntax())
.ToList()
.OfType<ConstructorDeclarationSyntax>()
.FirstOrDefault();

private ConstructorDeclarationSyntax? OrdinaryConstructorSyntax =>
declaringReferenceSyntax
.OfType<ConstructorDeclarationSyntax>()
Expand Down Expand Up @@ -253,14 +263,14 @@ public override Microsoft.CodeAnalysis.Location? ReportingLocation
{
get
{
if (OrdinaryConstructorSyntax is not null)
if (OrdinaryConstructorSyntaxForLocation is ConstructorDeclarationSyntax constructor)
{
return OrdinaryConstructorSyntax.Identifier.GetLocation();
return constructor.Identifier.GetLocation();
}

if (PrimaryConstructorSyntax is not null)
if (PrimaryConstructorSyntax is TypeDeclarationSyntax primary)
{
return PrimaryConstructorSyntax.Identifier.GetLocation();
return primary.Identifier.GetLocation();
}

if (Symbol.IsImplicitlyDeclared)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,22 @@ edges
| Constructors.cs:143:29:143:30 | access to local variable o2 : Object | Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj2] : Object | provenance | |
| Constructors.cs:144:14:144:15 | access to local variable r1 : R1 [property Obj1] : Object | Constructors.cs:144:14:144:20 | access to property Obj1 | provenance | |
| Constructors.cs:145:14:145:15 | access to local variable r1 : R1 [property Obj2] : Object | Constructors.cs:145:14:145:20 | access to property Obj2 | provenance | |
| Constructors.cs:152:40:152:40 | o : Object | Constructors.cs:157:52:157:52 | access to parameter o : Object | provenance | |
| Constructors.cs:152:40:152:40 | o : Object | Constructors.cs:157:52:157:52 | access to parameter o : Object | provenance | |
| Constructors.cs:157:40:157:40 | o : Object | Constructors.cs:157:52:157:52 | access to parameter o : Object | provenance | |
| Constructors.cs:157:40:157:40 | o : Object | Constructors.cs:157:52:157:52 | access to parameter o : Object | provenance | |
| Constructors.cs:157:46:157:48 | [post] this access : CPartial [property Obj] : Object | Constructors.cs:157:24:157:31 | this [Return] : CPartial [property Obj] : Object | provenance | |
| Constructors.cs:157:46:157:48 | [post] this access : CPartial [property Obj] : Object | Constructors.cs:157:24:157:31 | this [Return] : CPartial [property Obj] : Object | provenance | |
| Constructors.cs:157:52:157:52 | access to parameter o : Object | Constructors.cs:157:46:157:48 | [post] this access : CPartial [property Obj] : Object | provenance | |
| Constructors.cs:157:52:157:52 | access to parameter o : Object | Constructors.cs:157:46:157:48 | [post] this access : CPartial [property Obj] : Object | provenance | |
| Constructors.cs:162:13:162:13 | access to local variable o : Object | Constructors.cs:163:37:163:37 | access to local variable o : Object | provenance | |
| Constructors.cs:162:17:162:34 | call to method Source<Object> : Object | Constructors.cs:162:13:162:13 | access to local variable o : Object | provenance | |
| Constructors.cs:163:13:163:20 | access to local variable cPartial : CPartial [property Obj] : Object | Constructors.cs:164:14:164:21 | access to local variable cPartial : CPartial [property Obj] : Object | provenance | |
| Constructors.cs:163:24:163:38 | object creation of type CPartial : CPartial [property Obj] : Object | Constructors.cs:163:13:163:20 | access to local variable cPartial : CPartial [property Obj] : Object | provenance | |
| Constructors.cs:163:37:163:37 | access to local variable o : Object | Constructors.cs:152:40:152:40 | o : Object | provenance | |
| Constructors.cs:163:37:163:37 | access to local variable o : Object | Constructors.cs:157:40:157:40 | o : Object | provenance | |
| Constructors.cs:163:37:163:37 | access to local variable o : Object | Constructors.cs:163:24:163:38 | object creation of type CPartial : CPartial [property Obj] : Object | provenance | |
| Constructors.cs:164:14:164:21 | access to local variable cPartial : CPartial [property Obj] : Object | Constructors.cs:164:14:164:25 | access to property Obj | provenance | |
nodes
| Constructors.cs:3:18:3:26 | [post] this access : C_no_ctor [field s1] : Object | semmle.label | [post] this access : C_no_ctor [field s1] : Object |
| Constructors.cs:5:24:5:25 | [post] this access : C_no_ctor [field s1] : Object | semmle.label | [post] this access : C_no_ctor [field s1] : Object |
Expand Down Expand Up @@ -255,6 +271,20 @@ nodes
| Constructors.cs:144:14:144:20 | access to property Obj1 | semmle.label | access to property Obj1 |
| Constructors.cs:145:14:145:15 | access to local variable r1 : R1 [property Obj2] : Object | semmle.label | access to local variable r1 : R1 [property Obj2] : Object |
| Constructors.cs:145:14:145:20 | access to property Obj2 | semmle.label | access to property Obj2 |
| Constructors.cs:152:40:152:40 | o : Object | semmle.label | o : Object |
| Constructors.cs:157:24:157:31 | this [Return] : CPartial [property Obj] : Object | semmle.label | this [Return] : CPartial [property Obj] : Object |
| Constructors.cs:157:40:157:40 | o : Object | semmle.label | o : Object |
| Constructors.cs:157:46:157:48 | [post] this access : CPartial [property Obj] : Object | semmle.label | [post] this access : CPartial [property Obj] : Object |
| Constructors.cs:157:46:157:48 | [post] this access : CPartial [property Obj] : Object | semmle.label | [post] this access : CPartial [property Obj] : Object |
| Constructors.cs:157:52:157:52 | access to parameter o : Object | semmle.label | access to parameter o : Object |
| Constructors.cs:157:52:157:52 | access to parameter o : Object | semmle.label | access to parameter o : Object |
| Constructors.cs:162:13:162:13 | access to local variable o : Object | semmle.label | access to local variable o : Object |
| Constructors.cs:162:17:162:34 | call to method Source<Object> : Object | semmle.label | call to method Source<Object> : Object |
| Constructors.cs:163:13:163:20 | access to local variable cPartial : CPartial [property Obj] : Object | semmle.label | access to local variable cPartial : CPartial [property Obj] : Object |
| Constructors.cs:163:24:163:38 | object creation of type CPartial : CPartial [property Obj] : Object | semmle.label | object creation of type CPartial : CPartial [property Obj] : Object |
| Constructors.cs:163:37:163:37 | access to local variable o : Object | semmle.label | access to local variable o : Object |
| Constructors.cs:164:14:164:21 | access to local variable cPartial : CPartial [property Obj] : Object | semmle.label | access to local variable cPartial : CPartial [property Obj] : Object |
| Constructors.cs:164:14:164:25 | access to property Obj | semmle.label | access to property Obj |
subpaths
| Constructors.cs:44:18:44:19 | this access : C2 [parameter o21param] : Object | Constructors.cs:46:23:46:27 | this access : C2 [parameter o21param] : Object | Constructors.cs:46:23:46:27 | [post] this access : C2 [field Obj21] : Object | Constructors.cs:44:18:44:19 | [post] this access : C2 [field Obj21] : Object |
| Constructors.cs:64:37:64:37 | access to parameter o : Object | Constructors.cs:57:54:57:55 | o2 : Object | Constructors.cs:59:13:59:14 | access to parameter o1 : Object | Constructors.cs:64:27:64:34 | access to parameter o22param : Object |
Expand All @@ -273,6 +303,8 @@ subpaths
| Constructors.cs:132:29:132:30 | access to local variable o2 : Object | Constructors.cs:121:38:121:40 | oc2 : Object | Constructors.cs:121:16:121:17 | this [Return] : C4 [property Obj2] : Object | Constructors.cs:132:18:132:31 | object creation of type C4 : C4 [property Obj2] : Object |
| Constructors.cs:143:25:143:26 | access to local variable o1 : Object | Constructors.cs:137:29:137:32 | Obj1 : Object | Constructors.cs:137:19:137:20 | this [Return] : R1 [property Obj1] : Object | Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj1] : Object |
| Constructors.cs:143:29:143:30 | access to local variable o2 : Object | Constructors.cs:137:42:137:45 | Obj2 : Object | Constructors.cs:137:19:137:20 | this [Return] : R1 [property Obj2] : Object | Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj2] : Object |
| Constructors.cs:163:37:163:37 | access to local variable o : Object | Constructors.cs:152:40:152:40 | o : Object | Constructors.cs:157:24:157:31 | this [Return] : CPartial [property Obj] : Object | Constructors.cs:163:24:163:38 | object creation of type CPartial : CPartial [property Obj] : Object |
| Constructors.cs:163:37:163:37 | access to local variable o : Object | Constructors.cs:157:40:157:40 | o : Object | Constructors.cs:157:24:157:31 | this [Return] : CPartial [property Obj] : Object | Constructors.cs:163:24:163:38 | object creation of type CPartial : CPartial [property Obj] : Object |
testFailures
#select
| Constructors.cs:15:18:15:19 | access to field s1 | Constructors.cs:5:29:5:45 | call to method Source<Object> : Object | Constructors.cs:15:18:15:19 | access to field s1 | $@ | Constructors.cs:5:29:5:45 | call to method Source<Object> : Object | call to method Source<Object> : Object |
Expand All @@ -288,3 +320,4 @@ testFailures
| Constructors.cs:134:14:134:20 | access to property Obj2 | Constructors.cs:131:18:131:34 | call to method Source<Object> : Object | Constructors.cs:134:14:134:20 | access to property Obj2 | $@ | Constructors.cs:131:18:131:34 | call to method Source<Object> : Object | call to method Source<Object> : Object |
| Constructors.cs:144:14:144:20 | access to property Obj1 | Constructors.cs:141:18:141:34 | call to method Source<Object> : Object | Constructors.cs:144:14:144:20 | access to property Obj1 | $@ | Constructors.cs:141:18:141:34 | call to method Source<Object> : Object | call to method Source<Object> : Object |
| Constructors.cs:145:14:145:20 | access to property Obj2 | Constructors.cs:142:18:142:35 | call to method Source<Object> : Object | Constructors.cs:145:14:145:20 | access to property Obj2 | $@ | Constructors.cs:142:18:142:35 | call to method Source<Object> : Object | call to method Source<Object> : Object |
| Constructors.cs:164:14:164:25 | access to property Obj | Constructors.cs:162:17:162:34 | call to method Source<Object> : Object | Constructors.cs:164:14:164:25 | access to property Obj | $@ | Constructors.cs:162:17:162:34 | call to method Source<Object> : Object | call to method Source<Object> : Object |
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,25 @@ public void M7()
Sink(r1.Obj2); // $ hasValueFlow=10
}

public partial class CPartial
{
public object Obj { get; }

public partial CPartial(object o);
}

public partial class CPartial
{
public partial CPartial(object o) => Obj = o;
}

public void M8()
{
var o = Source<object>(11);
var cPartial = new CPartial(o);
Sink(cPartial.Obj); // $ hasValueFlow=11
}

public static void Sink(object o) { }

public static T Source<T>(object source) => throw null;
Expand Down
13 changes: 7 additions & 6 deletions csharp/ql/test/library-tests/dispatch/CallGraph.expected
Original file line number Diff line number Diff line change
Expand Up @@ -270,9 +270,10 @@
| ViableCallable.cs:679:17:679:20 | Run3 | ViableCallable.cs:637:21:637:21 | M |
| ViableCallable.cs:679:17:679:20 | Run3 | ViableCallable.cs:646:21:646:21 | M |
| ViableCallable.cs:679:17:679:20 | Run3 | ViableCallable.cs:648:21:648:21 | M |
| ViableCallable.cs:709:17:709:20 | Run1 | ViableCallable.cs:703:42:703:44 | get_Property |
| ViableCallable.cs:709:17:709:20 | Run1 | ViableCallable.cs:703:63:703:65 | set_Property |
| ViableCallable.cs:709:17:709:20 | Run1 | ViableCallable.cs:705:49:705:51 | get_Item |
| ViableCallable.cs:709:17:709:20 | Run1 | ViableCallable.cs:705:70:705:72 | set_Item |
| ViableCallable.cs:709:17:709:20 | Run1 | ViableCallable.cs:706:51:706:53 | add_Event |
| ViableCallable.cs:709:17:709:20 | Run1 | ViableCallable.cs:706:59:706:64 | remove_Event |
| ViableCallable.cs:711:17:711:20 | Run1 | ViableCallable.cs:704:24:704:31 | Partial1 |
| ViableCallable.cs:711:17:711:20 | Run1 | ViableCallable.cs:705:42:705:44 | get_Property |
| ViableCallable.cs:711:17:711:20 | Run1 | ViableCallable.cs:705:63:705:65 | set_Property |
| ViableCallable.cs:711:17:711:20 | Run1 | ViableCallable.cs:707:49:707:51 | get_Item |
| ViableCallable.cs:711:17:711:20 | Run1 | ViableCallable.cs:707:70:707:72 | set_Item |
| ViableCallable.cs:711:17:711:20 | Run1 | ViableCallable.cs:708:51:708:53 | add_Event |
| ViableCallable.cs:711:17:711:20 | Run1 | ViableCallable.cs:708:59:708:64 | remove_Event |
Original file line number Diff line number Diff line change
Expand Up @@ -518,9 +518,10 @@
| ViableCallable.cs:683:9:683:16 | call to method M | C22+TestOverloadResolution2<System.Int32>.M(Int32[]) |
| ViableCallable.cs:687:9:687:16 | call to method M | C22+TestOverloadResolution1<System.Int32>.M(List<int>) |
| ViableCallable.cs:687:9:687:16 | call to method M | C22+TestOverloadResolution2<System.Int32>.M(List<int>) |
| ViableCallable.cs:714:9:714:18 | access to property Property | C23+Partial1.set_Property(object) |
| ViableCallable.cs:717:13:717:22 | access to property Property | C23+Partial1.get_Property() |
| ViableCallable.cs:720:9:720:12 | access to indexer | C23+Partial1.set_Item(int, object) |
| ViableCallable.cs:723:13:723:16 | access to indexer | C23+Partial1.get_Item(int) |
| ViableCallable.cs:726:9:726:15 | access to event Event | C23+Partial1.add_Event(EventHandler) |
| ViableCallable.cs:729:9:729:15 | access to event Event | C23+Partial1.remove_Event(EventHandler) |
| ViableCallable.cs:716:9:716:18 | access to property Property | C23+Partial1.set_Property(object) |
| ViableCallable.cs:719:13:719:22 | access to property Property | C23+Partial1.get_Property() |
| ViableCallable.cs:722:9:722:12 | access to indexer | C23+Partial1.set_Item(int, object) |
| ViableCallable.cs:725:13:725:16 | access to indexer | C23+Partial1.get_Item(int) |
| ViableCallable.cs:728:9:728:15 | access to event Event | C23+Partial1.add_Event(EventHandler) |
| ViableCallable.cs:731:9:731:15 | access to event Event | C23+Partial1.remove_Event(EventHandler) |
| ViableCallable.cs:734:18:734:43 | object creation of type Partial1 | C23+Partial1.Partial1(object) |
5 changes: 5 additions & 0 deletions csharp/ql/test/library-tests/dispatch/ViableCallable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -692,6 +692,7 @@ public class C23
{
public partial class Partial1
{
public partial Partial1(object obj);
public partial object Property { get; set; }

public partial object this[int index] { get; set; }
Expand All @@ -700,6 +701,7 @@ public partial class Partial1

public partial class Partial1
{
public partial Partial1(object obj) { }
public partial object Property { get { return null; } set { } }

public partial object this[int index] { get { return null; } set { } }
Expand Down Expand Up @@ -727,5 +729,8 @@ public void Run1(Partial1 p)

// Viable callable: Partial1.remove_Event
p.Event -= (sender, e) => { };

// Viable callable: Partial1.Partial1(object)
var p0 = new Partial1(new object());
}
}
14 changes: 7 additions & 7 deletions csharp/ql/test/library-tests/partial/MethodIsPartial.expected
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
| Partial.cs:6:18:6:42 | PartialMethodWithoutBody1 | true |
| Partial.cs:7:17:7:23 | Method2 | false |
| Partial.cs:18:18:18:39 | PartialMethodWithBody1 | true |
| Partial.cs:19:17:19:23 | Method3 | false |
| Partial.cs:41:18:41:42 | PartialMethodWithoutBody2 | true |
| Partial.cs:42:17:42:23 | Method4 | false |
| Partial.cs:47:17:47:23 | Method5 | false |
| Partial.cs:8:18:8:42 | PartialMethodWithoutBody1 | true |
| Partial.cs:9:17:9:23 | Method2 | false |
| Partial.cs:22:18:22:39 | PartialMethodWithBody1 | true |
| Partial.cs:23:17:23:23 | Method3 | false |
| Partial.cs:45:18:45:42 | PartialMethodWithoutBody2 | true |
| Partial.cs:46:17:46:23 | Method4 | false |
| Partial.cs:52:17:52:23 | Method5 | false |
5 changes: 5 additions & 0 deletions csharp/ql/test/library-tests/partial/Partial.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

partial class TwoPartClass
{
// Declaring declaration.
public partial TwoPartClass(object obj);
partial void PartialMethodWithBody1();
partial void PartialMethodWithoutBody1();
public void Method2() { }
Expand All @@ -15,6 +17,8 @@ public void Method2() { }

partial class TwoPartClass
{
// Implementation declaration.
public partial TwoPartClass(object obj) { }
partial void PartialMethodWithBody1() { }
public void Method3() { }
private object _backingField;
Expand Down Expand Up @@ -44,6 +48,7 @@ public void Method4() { }

class NonPartialClass
{
public NonPartialClass(object obj) { }
public void Method5() { }
public object Property { get; set; }
public object this[int index]
Expand Down
29 changes: 15 additions & 14 deletions csharp/ql/test/library-tests/partial/Partial1.expected
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
| Partial.cs:3:15:3:26 | TwoPartClass |
| Partial.cs:6:18:6:42 | PartialMethodWithoutBody1 |
| Partial.cs:16:15:16:26 | TwoPartClass |
| Partial.cs:18:18:18:39 | PartialMethodWithBody1 |
| Partial.cs:22:27:22:42 | PartialProperty1 |
| Partial.cs:24:9:24:11 | get_PartialProperty1 |
| Partial.cs:25:9:25:11 | set_PartialProperty1 |
| Partial.cs:29:27:29:30 | Item |
| Partial.cs:31:9:31:11 | get_Item |
| Partial.cs:32:9:32:11 | set_Item |
| Partial.cs:36:39:36:51 | PartialEvent1 |
| Partial.cs:36:55:36:57 | add_PartialEvent1 |
| Partial.cs:36:63:36:68 | remove_PartialEvent1 |
| Partial.cs:39:15:39:33 | OnePartPartialClass |
| Partial.cs:41:18:41:42 | PartialMethodWithoutBody2 |
| Partial.cs:8:18:8:42 | PartialMethodWithoutBody1 |
| Partial.cs:18:15:18:26 | TwoPartClass |
| Partial.cs:21:20:21:31 | TwoPartClass |
| Partial.cs:22:18:22:39 | PartialMethodWithBody1 |
| Partial.cs:26:27:26:42 | PartialProperty1 |
| Partial.cs:28:9:28:11 | get_PartialProperty1 |
| Partial.cs:29:9:29:11 | set_PartialProperty1 |
| Partial.cs:33:27:33:30 | Item |
| Partial.cs:35:9:35:11 | get_Item |
| Partial.cs:36:9:36:11 | set_Item |
| Partial.cs:40:39:40:51 | PartialEvent1 |
| Partial.cs:40:55:40:57 | add_PartialEvent1 |
| Partial.cs:40:63:40:68 | remove_PartialEvent1 |
| Partial.cs:43:15:43:33 | OnePartPartialClass |
| Partial.cs:45:18:45:42 | PartialMethodWithoutBody2 |
| PartialMultipleFiles1.cs:1:22:1:41 | PartialMultipleFiles |
| PartialMultipleFiles2.cs:1:22:1:41 | PartialMultipleFiles |
Loading