Merge pull request #21335 from michaelnebel/csharp14/partialconstrucstors

C# 14: Support for partial constructor declarations.
This commit is contained in:
Michael Nebel
2026-03-02 14:47:56 +01:00
committed by GitHub
18 changed files with 266 additions and 191 deletions

View File

@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.IO;
@@ -12,7 +13,9 @@ namespace Semmle.Extraction.CSharp.Entities
internal class Constructor : Method
{
private readonly List<SyntaxNode> declaringReferenceSyntax;
private readonly Lazy<ConstructorDeclarationSyntax?> ordinaryConstructorSyntaxLazy;
private readonly Lazy<TypeDeclarationSyntax?> primaryConstructorSyntaxLazy;
private readonly Lazy<PrimaryConstructorBaseTypeSyntax?> primaryBaseLazy;
private Constructor(Context cx, IMethodSymbol init)
: base(cx, init)
{
@@ -20,8 +23,28 @@ namespace Semmle.Extraction.CSharp.Entities
Symbol.DeclaringSyntaxReferences
.Select(r => r.GetSyntax())
.ToList();
ordinaryConstructorSyntaxLazy = new Lazy<ConstructorDeclarationSyntax?>(() =>
declaringReferenceSyntax
.OfType<ConstructorDeclarationSyntax>()
.FirstOrDefault());
primaryConstructorSyntaxLazy = new Lazy<TypeDeclarationSyntax?>(() =>
declaringReferenceSyntax
.OfType<TypeDeclarationSyntax>()
.FirstOrDefault(t => t is ClassDeclarationSyntax or StructDeclarationSyntax or RecordDeclarationSyntax));
primaryBaseLazy = new Lazy<PrimaryConstructorBaseTypeSyntax?>(() =>
PrimaryConstructorSyntax?
.BaseList?
.Types
.OfType<PrimaryConstructorBaseTypeSyntax>()
.FirstOrDefault());
}
private ConstructorDeclarationSyntax? OrdinaryConstructorSyntax => ordinaryConstructorSyntaxLazy.Value;
private TypeDeclarationSyntax? PrimaryConstructorSyntax => primaryConstructorSyntaxLazy.Value;
private PrimaryConstructorBaseTypeSyntax? PrimaryBase => primaryBaseLazy.Value;
public override void Populate(TextWriter trapFile)
{
PopulateMethod(trapFile);
@@ -176,23 +199,6 @@ namespace Semmle.Extraction.CSharp.Entities
init.PopulateArguments(trapFile, arguments, 0);
}
private ConstructorDeclarationSyntax? OrdinaryConstructorSyntax =>
declaringReferenceSyntax
.OfType<ConstructorDeclarationSyntax>()
.FirstOrDefault();
private TypeDeclarationSyntax? PrimaryConstructorSyntax =>
declaringReferenceSyntax
.OfType<TypeDeclarationSyntax>()
.FirstOrDefault(t => t is ClassDeclarationSyntax or StructDeclarationSyntax or RecordDeclarationSyntax);
private PrimaryConstructorBaseTypeSyntax? PrimaryBase =>
PrimaryConstructorSyntax?
.BaseList?
.Types
.OfType<PrimaryConstructorBaseTypeSyntax>()
.FirstOrDefault();
private bool IsPrimary => PrimaryConstructorSyntax is not null;
// This is a default constructor in a class or struct declared in source.
@@ -223,7 +229,7 @@ namespace Semmle.Extraction.CSharp.Entities
{
case MethodKind.StaticConstructor:
case MethodKind.Constructor:
return ConstructorFactory.Instance.CreateEntityFromSymbol(cx, constructor);
return ConstructorFactory.Instance.CreateEntityFromSymbol(cx, constructor.GetBodyDeclaringSymbol());
default:
throw new InternalError(constructor, "Attempt to create a Constructor from a symbol that isn't a constructor");
}

View File

@@ -0,0 +1,4 @@
---
category: minorAnalysis
---
* C# 14: Added support for partial constructors.

View File

@@ -122,6 +122,16 @@ 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: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: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: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 |
@@ -255,6 +265,17 @@ 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: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: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 |
@@ -273,6 +294,7 @@ 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: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 |
@@ -288,3 +310,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 |

View File

@@ -145,6 +145,25 @@ public class Constructors
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;

View File

@@ -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 |

View File

@@ -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) |

View File

@@ -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; }
@@ -700,6 +701,7 @@ public class C23
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 { } }
@@ -727,5 +729,8 @@ public class C23
// Viable callable: Partial1.remove_Event
p.Event -= (sender, e) => { };
// Viable callable: Partial1.Partial1(object)
var p0 = new Partial1(new object());
}
}

View File

@@ -1,8 +1,8 @@
| Partial.cs:7:18:7:42 | PartialMethodWithoutBody1 | true |
| Partial.cs:8:17:8:23 | Method2 | false |
| Partial.cs:19:18:19:39 | PartialMethodWithBody1 | true |
| Partial.cs:20:27:20:48 | PartialMethodWithBody2 | true |
| Partial.cs:24:17:24:23 | Method3 | false |
| Partial.cs:46:18:46:42 | PartialMethodWithoutBody2 | true |
| Partial.cs:47:17:47:23 | Method4 | false |
| Partial.cs:52:17:52:23 | Method5 | false |
| Partial.cs:9:18:9:42 | PartialMethodWithoutBody1 | true |
| Partial.cs:10:17:10:23 | Method2 | false |
| Partial.cs:23:18:23:39 | PartialMethodWithBody1 | true |
| Partial.cs:24:27:24:48 | PartialMethodWithBody2 | true |
| Partial.cs:28:17:28:23 | Method3 | false |
| Partial.cs:50:18:50:42 | PartialMethodWithoutBody2 | true |
| Partial.cs:51:17:51:23 | Method4 | false |
| Partial.cs:57:17:57:23 | Method5 | false |

View File

@@ -2,6 +2,8 @@ using System;
partial class TwoPartClass
{
// Declaring declaration.
public partial TwoPartClass(object obj);
partial void PartialMethodWithBody1();
public partial object PartialMethodWithBody2(object obj);
partial void PartialMethodWithoutBody1();
@@ -16,6 +18,8 @@ partial class TwoPartClass
partial class TwoPartClass
{
// Implementation declaration.
public partial TwoPartClass(object obj) { }
partial void PartialMethodWithBody1() { }
public partial object PartialMethodWithBody2(object obj)
{
@@ -49,6 +53,7 @@ partial class OnePartPartialClass
class NonPartialClass
{
public NonPartialClass(object obj) { }
public void Method5() { }
public object Property { get; set; }
public object this[int index]

View File

@@ -1,18 +1,19 @@
| Partial.cs:3:15:3:26 | TwoPartClass |
| Partial.cs:7:18:7:42 | PartialMethodWithoutBody1 |
| Partial.cs:17:15:17:26 | TwoPartClass |
| Partial.cs:19:18:19:39 | PartialMethodWithBody1 |
| Partial.cs:20:27:20:48 | PartialMethodWithBody2 |
| Partial.cs:27:27:27:42 | PartialProperty1 |
| Partial.cs:29:9:29:11 | get_PartialProperty1 |
| Partial.cs:30:9:30:11 | set_PartialProperty1 |
| Partial.cs:34:27:34:30 | Item |
| Partial.cs:36:9:36:11 | get_Item |
| Partial.cs:37:9:37:11 | set_Item |
| Partial.cs:41:39:41:51 | PartialEvent1 |
| Partial.cs:41:55:41:57 | add_PartialEvent1 |
| Partial.cs:41:63:41:68 | remove_PartialEvent1 |
| Partial.cs:44:15:44:33 | OnePartPartialClass |
| Partial.cs:46:18:46:42 | PartialMethodWithoutBody2 |
| Partial.cs:9:18:9:42 | PartialMethodWithoutBody1 |
| Partial.cs:19:15:19:26 | TwoPartClass |
| Partial.cs:22:20:22:31 | TwoPartClass |
| Partial.cs:23:18:23:39 | PartialMethodWithBody1 |
| Partial.cs:24:27:24:48 | PartialMethodWithBody2 |
| Partial.cs:31:27:31:42 | PartialProperty1 |
| Partial.cs:33:9:33:11 | get_PartialProperty1 |
| Partial.cs:34:9:34:11 | set_PartialProperty1 |
| Partial.cs:38:27:38:30 | Item |
| Partial.cs:40:9:40:11 | get_Item |
| Partial.cs:41:9:41:11 | set_Item |
| Partial.cs:45:39:45:51 | PartialEvent1 |
| Partial.cs:45:55:45:57 | add_PartialEvent1 |
| Partial.cs:45:63:45:68 | remove_PartialEvent1 |
| Partial.cs:48:15:48:33 | OnePartPartialClass |
| Partial.cs:50:18:50:42 | PartialMethodWithoutBody2 |
| PartialMultipleFiles1.cs:1:22:1:41 | PartialMultipleFiles |
| PartialMultipleFiles2.cs:1:22:1:41 | PartialMultipleFiles |

View File

@@ -1,17 +1,17 @@
| Partial.cs:3:15:3:26 | TwoPartClass | Partial.cs:3:15:3:26 | <object initializer> |
| Partial.cs:3:15:3:26 | TwoPartClass | Partial.cs:7:18:7:42 | PartialMethodWithoutBody1 |
| Partial.cs:3:15:3:26 | TwoPartClass | Partial.cs:8:17:8:23 | Method2 |
| Partial.cs:3:15:3:26 | TwoPartClass | Partial.cs:19:18:19:39 | PartialMethodWithBody1 |
| Partial.cs:3:15:3:26 | TwoPartClass | Partial.cs:20:27:20:48 | PartialMethodWithBody2 |
| Partial.cs:3:15:3:26 | TwoPartClass | Partial.cs:24:17:24:23 | Method3 |
| Partial.cs:17:15:17:26 | TwoPartClass | Partial.cs:3:15:3:26 | <object initializer> |
| Partial.cs:17:15:17:26 | TwoPartClass | Partial.cs:7:18:7:42 | PartialMethodWithoutBody1 |
| Partial.cs:17:15:17:26 | TwoPartClass | Partial.cs:8:17:8:23 | Method2 |
| Partial.cs:17:15:17:26 | TwoPartClass | Partial.cs:19:18:19:39 | PartialMethodWithBody1 |
| Partial.cs:17:15:17:26 | TwoPartClass | Partial.cs:20:27:20:48 | PartialMethodWithBody2 |
| Partial.cs:17:15:17:26 | TwoPartClass | Partial.cs:24:17:24:23 | Method3 |
| Partial.cs:44:15:44:33 | OnePartPartialClass | Partial.cs:44:15:44:33 | <object initializer> |
| Partial.cs:44:15:44:33 | OnePartPartialClass | Partial.cs:46:18:46:42 | PartialMethodWithoutBody2 |
| Partial.cs:44:15:44:33 | OnePartPartialClass | Partial.cs:47:17:47:23 | Method4 |
| Partial.cs:3:15:3:26 | TwoPartClass | Partial.cs:9:18:9:42 | PartialMethodWithoutBody1 |
| Partial.cs:3:15:3:26 | TwoPartClass | Partial.cs:10:17:10:23 | Method2 |
| Partial.cs:3:15:3:26 | TwoPartClass | Partial.cs:23:18:23:39 | PartialMethodWithBody1 |
| Partial.cs:3:15:3:26 | TwoPartClass | Partial.cs:24:27:24:48 | PartialMethodWithBody2 |
| Partial.cs:3:15:3:26 | TwoPartClass | Partial.cs:28:17:28:23 | Method3 |
| Partial.cs:19:15:19:26 | TwoPartClass | Partial.cs:3:15:3:26 | <object initializer> |
| Partial.cs:19:15:19:26 | TwoPartClass | Partial.cs:9:18:9:42 | PartialMethodWithoutBody1 |
| Partial.cs:19:15:19:26 | TwoPartClass | Partial.cs:10:17:10:23 | Method2 |
| Partial.cs:19:15:19:26 | TwoPartClass | Partial.cs:23:18:23:39 | PartialMethodWithBody1 |
| Partial.cs:19:15:19:26 | TwoPartClass | Partial.cs:24:27:24:48 | PartialMethodWithBody2 |
| Partial.cs:19:15:19:26 | TwoPartClass | Partial.cs:28:17:28:23 | Method3 |
| Partial.cs:48:15:48:33 | OnePartPartialClass | Partial.cs:48:15:48:33 | <object initializer> |
| Partial.cs:48:15:48:33 | OnePartPartialClass | Partial.cs:50:18:50:42 | PartialMethodWithoutBody2 |
| Partial.cs:48:15:48:33 | OnePartPartialClass | Partial.cs:51:17:51:23 | Method4 |
| PartialMultipleFiles1.cs:1:22:1:41 | PartialMultipleFiles | PartialMultipleFiles1.cs:1:22:1:41 | <object initializer> |
| PartialMultipleFiles2.cs:1:22:1:41 | PartialMultipleFiles | PartialMultipleFiles1.cs:1:22:1:41 | <object initializer> |

View File

@@ -1,12 +1,12 @@
| Partial.cs:29:9:29:11 | get_PartialProperty1 | true |
| Partial.cs:30:9:30:11 | set_PartialProperty1 | true |
| Partial.cs:36:9:36:11 | get_Item | true |
| Partial.cs:37:9:37:11 | set_Item | true |
| Partial.cs:41:55:41:57 | add_PartialEvent1 | true |
| Partial.cs:41:63:41:68 | remove_PartialEvent1 | true |
| Partial.cs:53:30:53:32 | get_Property | false |
| Partial.cs:53:35:53:37 | set_Property | false |
| Partial.cs:56:9:56:11 | get_Item | false |
| Partial.cs:57:9:57:11 | set_Item | false |
| Partial.cs:59:31:59:35 | add_Event | false |
| Partial.cs:59:31:59:35 | remove_Event | false |
| Partial.cs:33:9:33:11 | get_PartialProperty1 | true |
| Partial.cs:34:9:34:11 | set_PartialProperty1 | true |
| Partial.cs:40:9:40:11 | get_Item | true |
| Partial.cs:41:9:41:11 | set_Item | true |
| Partial.cs:45:55:45:57 | add_PartialEvent1 | true |
| Partial.cs:45:63:45:68 | remove_PartialEvent1 | true |
| Partial.cs:58:30:58:32 | get_Property | false |
| Partial.cs:58:35:58:37 | set_Property | false |
| Partial.cs:61:9:61:11 | get_Item | false |
| Partial.cs:62:9:62:11 | set_Item | false |
| Partial.cs:64:31:64:35 | add_Event | false |
| Partial.cs:64:31:64:35 | remove_Event | false |

View File

@@ -1,4 +1,4 @@
| Partial.cs:3:15:3:26 | TwoPartClass | Partial.cs:3:15:3:26 | {...} |
| Partial.cs:44:15:44:33 | OnePartPartialClass | Partial.cs:44:15:44:33 | {...} |
| Partial.cs:50:7:50:21 | NonPartialClass | Partial.cs:50:7:50:21 | {...} |
| Partial.cs:22:20:22:31 | TwoPartClass | Partial.cs:22:45:22:47 | {...} |
| Partial.cs:48:15:48:33 | OnePartPartialClass | Partial.cs:48:15:48:33 | {...} |
| Partial.cs:56:12:56:26 | NonPartialClass | Partial.cs:56:40:56:42 | {...} |
| PartialMultipleFiles1.cs:1:22:1:41 | PartialMultipleFiles | PartialMultipleFiles1.cs:1:22:1:41 | {...} |

View File

@@ -1,2 +1,2 @@
| Partial.cs:41:39:41:51 | PartialEvent1 | true |
| Partial.cs:59:31:59:35 | Event | false |
| Partial.cs:45:39:45:51 | PartialEvent1 | true |
| Partial.cs:64:31:64:35 | Event | false |

View File

@@ -1,2 +1,2 @@
| Partial.cs:34:27:34:30 | Item | true |
| Partial.cs:54:19:54:22 | Item | false |
| Partial.cs:38:27:38:30 | Item | true |
| Partial.cs:59:19:59:22 | Item | false |

View File

@@ -1,4 +1,4 @@
| Partial.cs:7:18:7:42 | PartialMethodWithoutBody1 | false | 0 |
| Partial.cs:19:18:19:39 | PartialMethodWithBody1 | true | 1 |
| Partial.cs:20:27:20:48 | PartialMethodWithBody2 | true | 1 |
| Partial.cs:46:18:46:42 | PartialMethodWithoutBody2 | false | 0 |
| Partial.cs:9:18:9:42 | PartialMethodWithoutBody1 | false | 0 |
| Partial.cs:23:18:23:39 | PartialMethodWithBody1 | true | 1 |
| Partial.cs:24:27:24:48 | PartialMethodWithBody2 | true | 1 |
| Partial.cs:50:18:50:42 | PartialMethodWithoutBody2 | false | 0 |

View File

@@ -1,2 +1,2 @@
| Partial.cs:27:27:27:42 | PartialProperty1 | true |
| Partial.cs:53:19:53:26 | Property | false |
| Partial.cs:31:27:31:42 | PartialProperty1 | true |
| Partial.cs:58:19:58:26 | Property | false |

View File

@@ -1,116 +1,126 @@
Partial.cs:
# 3| [Class] TwoPartClass
# 7| 6: [Method] PartialMethodWithoutBody1
# 7| -1: [TypeMention] Void
# 8| 7: [Method] Method2
# 8| -1: [TypeMention] Void
# 8| 4: [BlockStmt] {...}
# 19| 8: [Method] PartialMethodWithBody1
# 19| -1: [TypeMention] Void
# 19| 4: [BlockStmt] {...}
# 20| 9: [Method] PartialMethodWithBody2
# 20| -1: [TypeMention] object
# 9| 5: [Method] PartialMethodWithoutBody1
# 9| -1: [TypeMention] Void
# 10| 6: [Method] Method2
# 10| -1: [TypeMention] Void
# 10| 4: [BlockStmt] {...}
# 22| 7: [InstanceConstructor] TwoPartClass
#-----| 2: (Parameters)
# 20| 0: [Parameter] obj
# 20| -1: [TypeMention] object
# 21| 4: [BlockStmt] {...}
# 22| 0: [ReturnStmt] return ...;
# 22| 0: [ParameterAccess] access to parameter obj
# 24| 10: [Method] Method3
# 24| -1: [TypeMention] Void
# 24| 4: [BlockStmt] {...}
# 25| 11: [Field] _backingField
# 25| -1: [TypeMention] object
# 27| 12: [Property] PartialProperty1
# 27| -1: [TypeMention] object
# 29| 3: [Getter] get_PartialProperty1
# 29| 4: [BlockStmt] {...}
# 29| 0: [ReturnStmt] return ...;
# 29| 0: [FieldAccess] access to field _backingField
# 30| 4: [Setter] set_PartialProperty1
# 22| 0: [Parameter] obj
# 22| -1: [TypeMention] object
# 22| 4: [BlockStmt] {...}
# 23| 8: [Method] PartialMethodWithBody1
# 23| -1: [TypeMention] Void
# 23| 4: [BlockStmt] {...}
# 24| 9: [Method] PartialMethodWithBody2
# 24| -1: [TypeMention] object
#-----| 2: (Parameters)
# 24| 0: [Parameter] obj
# 24| -1: [TypeMention] object
# 25| 4: [BlockStmt] {...}
# 26| 0: [ReturnStmt] return ...;
# 26| 0: [ParameterAccess] access to parameter obj
# 28| 10: [Method] Method3
# 28| -1: [TypeMention] Void
# 28| 4: [BlockStmt] {...}
# 29| 11: [Field] _backingField
# 29| -1: [TypeMention] object
# 31| 12: [Property] PartialProperty1
# 31| -1: [TypeMention] object
# 33| 3: [Getter] get_PartialProperty1
# 33| 4: [BlockStmt] {...}
# 33| 0: [ReturnStmt] return ...;
# 33| 0: [FieldAccess] access to field _backingField
# 34| 4: [Setter] set_PartialProperty1
#-----| 2: (Parameters)
# 30| 0: [Parameter] value
# 30| 4: [BlockStmt] {...}
# 30| 0: [ExprStmt] ...;
# 30| 0: [AssignExpr] ... = ...
# 30| 0: [FieldAccess] access to field _backingField
# 30| 1: [ParameterAccess] access to parameter value
# 32| 13: [Field] _backingArray
# 32| -1: [TypeMention] Object[]
# 32| 1: [TypeMention] object
# 34| 14: [Indexer] Item
# 34| -1: [TypeMention] object
# 34| 0: [Parameter] value
# 34| 4: [BlockStmt] {...}
# 34| 0: [ExprStmt] ...;
# 34| 0: [AssignExpr] ... = ...
# 34| 0: [FieldAccess] access to field _backingField
# 34| 1: [ParameterAccess] access to parameter value
# 36| 13: [Field] _backingArray
# 36| -1: [TypeMention] Object[]
# 36| 1: [TypeMention] object
# 38| 14: [Indexer] Item
# 38| -1: [TypeMention] object
#-----| 1: (Parameters)
# 34| 0: [Parameter] index
# 34| -1: [TypeMention] int
# 36| 3: [Getter] get_Item
# 38| 0: [Parameter] index
# 38| -1: [TypeMention] int
# 40| 3: [Getter] get_Item
#-----| 2: (Parameters)
# 34| 0: [Parameter] index
# 36| 4: [BlockStmt] {...}
# 36| 0: [ReturnStmt] return ...;
# 36| 0: [ArrayAccess] access to array element
# 36| -1: [FieldAccess] access to field _backingArray
# 36| 0: [ParameterAccess] access to parameter index
# 37| 4: [Setter] set_Item
# 38| 0: [Parameter] index
# 40| 4: [BlockStmt] {...}
# 40| 0: [ReturnStmt] return ...;
# 40| 0: [ArrayAccess] access to array element
# 40| -1: [FieldAccess] access to field _backingArray
# 40| 0: [ParameterAccess] access to parameter index
# 41| 4: [Setter] set_Item
#-----| 2: (Parameters)
# 34| 0: [Parameter] index
# 37| 1: [Parameter] value
# 37| 4: [BlockStmt] {...}
# 37| 0: [ExprStmt] ...;
# 37| 0: [AssignExpr] ... = ...
# 37| 0: [ArrayAccess] access to array element
# 37| -1: [FieldAccess] access to field _backingArray
# 37| 0: [ParameterAccess] access to parameter index
# 37| 1: [ParameterAccess] access to parameter value
# 41| 15: [Event] PartialEvent1
# 41| 3: [AddEventAccessor] add_PartialEvent1
#-----| 2: (Parameters)
# 41| 0: [Parameter] value
# 38| 0: [Parameter] index
# 41| 1: [Parameter] value
# 41| 4: [BlockStmt] {...}
# 41| 4: [RemoveEventAccessor] remove_PartialEvent1
# 41| 0: [ExprStmt] ...;
# 41| 0: [AssignExpr] ... = ...
# 41| 0: [ArrayAccess] access to array element
# 41| -1: [FieldAccess] access to field _backingArray
# 41| 0: [ParameterAccess] access to parameter index
# 41| 1: [ParameterAccess] access to parameter value
# 45| 15: [Event] PartialEvent1
# 45| 3: [AddEventAccessor] add_PartialEvent1
#-----| 2: (Parameters)
# 41| 0: [Parameter] value
# 41| 4: [BlockStmt] {...}
# 44| [Class] OnePartPartialClass
# 46| 6: [Method] PartialMethodWithoutBody2
# 46| -1: [TypeMention] Void
# 47| 7: [Method] Method4
# 47| -1: [TypeMention] Void
# 47| 4: [BlockStmt] {...}
# 50| [Class] NonPartialClass
# 52| 6: [Method] Method5
# 52| -1: [TypeMention] Void
# 52| 4: [BlockStmt] {...}
# 53| 7: [Property] Property
# 53| -1: [TypeMention] object
# 53| 3: [Getter] get_Property
# 53| 4: [Setter] set_Property
# 45| 0: [Parameter] value
# 45| 4: [BlockStmt] {...}
# 45| 4: [RemoveEventAccessor] remove_PartialEvent1
#-----| 2: (Parameters)
# 53| 0: [Parameter] value
# 54| 8: [Indexer] Item
# 54| -1: [TypeMention] object
# 45| 0: [Parameter] value
# 45| 4: [BlockStmt] {...}
# 48| [Class] OnePartPartialClass
# 50| 6: [Method] PartialMethodWithoutBody2
# 50| -1: [TypeMention] Void
# 51| 7: [Method] Method4
# 51| -1: [TypeMention] Void
# 51| 4: [BlockStmt] {...}
# 54| [Class] NonPartialClass
# 56| 5: [InstanceConstructor] NonPartialClass
#-----| 2: (Parameters)
# 56| 0: [Parameter] obj
# 56| -1: [TypeMention] object
# 56| 4: [BlockStmt] {...}
# 57| 6: [Method] Method5
# 57| -1: [TypeMention] Void
# 57| 4: [BlockStmt] {...}
# 58| 7: [Property] Property
# 58| -1: [TypeMention] object
# 58| 3: [Getter] get_Property
# 58| 4: [Setter] set_Property
#-----| 2: (Parameters)
# 58| 0: [Parameter] value
# 59| 8: [Indexer] Item
# 59| -1: [TypeMention] object
#-----| 1: (Parameters)
# 54| 0: [Parameter] index
# 54| -1: [TypeMention] int
# 56| 3: [Getter] get_Item
# 59| 0: [Parameter] index
# 59| -1: [TypeMention] int
# 61| 3: [Getter] get_Item
#-----| 2: (Parameters)
# 54| 0: [Parameter] index
# 56| 4: [BlockStmt] {...}
# 56| 0: [ReturnStmt] return ...;
# 56| 0: [NullLiteral] null
# 57| 4: [Setter] set_Item
# 59| 0: [Parameter] index
# 61| 4: [BlockStmt] {...}
# 61| 0: [ReturnStmt] return ...;
# 61| 0: [NullLiteral] null
# 62| 4: [Setter] set_Item
#-----| 2: (Parameters)
# 54| 0: [Parameter] index
# 57| 1: [Parameter] value
# 57| 4: [BlockStmt] {...}
# 59| 9: [Event] Event
# 59| -1: [TypeMention] EventHandler
# 59| 3: [AddEventAccessor] add_Event
# 59| 0: [Parameter] index
# 62| 1: [Parameter] value
# 62| 4: [BlockStmt] {...}
# 64| 9: [Event] Event
# 64| -1: [TypeMention] EventHandler
# 64| 3: [AddEventAccessor] add_Event
#-----| 2: (Parameters)
# 59| 0: [Parameter] value
# 59| 4: [RemoveEventAccessor] remove_Event
# 64| 0: [Parameter] value
# 64| 4: [RemoveEventAccessor] remove_Event
#-----| 2: (Parameters)
# 59| 0: [Parameter] value
# 64| 0: [Parameter] value
PartialMultipleFiles1.cs:
# 1| [Class] PartialMultipleFiles
PartialMultipleFiles2.cs: