{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":667901590,"defaultBranch":"main","name":"memory-analyzers","ownerLogin":"jonathanpeppers","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2023-07-18T14:56:17.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/840039?v=4","public":true,"private":false,"isOrgOwned":false},"refInfo":{"name":"","listCacheKey":"v0:1698693288.0","currentOid":""},"activityList":{"items":[{"before":"b26a74624f26e15cf43a39506356c2fa062bfd83","after":null,"ref":"refs/heads/SpecialType","pushedAt":"2023-10-30T15:41:36.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"}},{"before":"992b5474ec265c16bf4e71f1f3d35e2dcb9efd7e","after":"2bc83bcb6ab0fd4673a646f1b7bbb2e574cdeac5","ref":"refs/heads/main","pushedAt":"2023-10-30T15:41:33.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"},"commit":{"message":"Refactor: use `SpecialType` (#11)\n\nContext: https://learn.microsoft.com/dotnet/api/microsoft.codeanalysis.specialtype\r\n\r\nI found the `SpecialType` property, I can use instead of comparing `string` values.","shortMessageHtmlLink":"Refactor: use SpecialType (#11)"}},{"before":"e1648be7f2e76619c151a44f4edfa7e6672dace1","after":null,"ref":"refs/heads/interfaces","pushedAt":"2023-10-30T15:40:38.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"}},{"before":"e551c7c498014436dd6b36b36a7d33cc4b9cd44b","after":"992b5474ec265c16bf4e71f1f3d35e2dcb9efd7e","ref":"refs/heads/main","pushedAt":"2023-10-30T15:40:35.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"},"commit":{"message":"Emit warnings for C# interfaces (#10)\n\nContext: https://github.com/dotnet/maui/pull/18434#discussion_r1376401448\r\n\r\nThis situation came up in .NET MAUI. You can create circular references\r\nwith interfaces, as any `NSObject` can implement an interface. Warn\r\nabout interfaces.","shortMessageHtmlLink":"Emit warnings for C# interfaces (#10)"}},{"before":null,"after":"b26a74624f26e15cf43a39506356c2fa062bfd83","ref":"refs/heads/SpecialType","pushedAt":"2023-10-30T15:39:56.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"},"commit":{"message":"Refactor: use `SpecialType`\n\nContext: https://learn.microsoft.com/dotnet/api/microsoft.codeanalysis.specialtype\n\nI found the `SpecialType` property, I can use instead of comparing `string` values.","shortMessageHtmlLink":"Refactor: use SpecialType"}},{"before":null,"after":"e1648be7f2e76619c151a44f4edfa7e6672dace1","ref":"refs/heads/interfaces","pushedAt":"2023-10-30T15:37:29.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"},"commit":{"message":"Emit warnings for C# interfaces\n\nContext: https://github.com/dotnet/maui/pull/18434#discussion_r1376401448\n\nThis situation came up in .NET MAUI. You can create circular references\nwith interfaces, as any `NSObject` can implement an interface. Warn\nabout interfaces.","shortMessageHtmlLink":"Emit warnings for C# interfaces"}},{"before":"9ee4de267d58f98f87c0ec49e0deb2e7db86df1e","after":"e551c7c498014436dd6b36b36a7d33cc4b9cd44b","ref":"refs/heads/main","pushedAt":"2023-10-24T21:36:08.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"},"commit":{"message":"Bump to 0.1.0-beta.5","shortMessageHtmlLink":"Bump to 0.1.0-beta.5"}},{"before":"c92916059baab289a752975acaa422fa5e61faf7","after":"9ee4de267d58f98f87c0ec49e0deb2e7db86df1e","ref":"refs/heads/main","pushedAt":"2023-10-24T21:18:19.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"},"commit":{"message":"Fix `AnalyzerReleases.Shipped.md` for next release","shortMessageHtmlLink":"Fix AnalyzerReleases.Shipped.md for next release"}},{"before":"52725dd639b0415d1d7d176c630616017fc6f00b","after":null,"ref":"refs/heads/MEM","pushedAt":"2023-10-24T17:02:22.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"}},{"before":"3db449e77d2f607a9f8fc7fcc01301ab1ec353d1","after":"c92916059baab289a752975acaa422fa5e61faf7","ref":"refs/heads/main","pushedAt":"2023-10-24T17:02:19.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"},"commit":{"message":"Use `MEM0001`, `MEM0002`, `MEM0003` error codes (#9)\n\nFixes: https://github.com/jonathanpeppers/memory-analyzers/issues/6\r\n\r\nI still support `MA0001`, etc. as a way to silence the warnings. This will make it easier to migrate the dotnet/maui repo.","shortMessageHtmlLink":"Use MEM0001, MEM0002, MEM0003 error codes (#9)"}},{"before":null,"after":"52725dd639b0415d1d7d176c630616017fc6f00b","ref":"refs/heads/MEM","pushedAt":"2023-10-24T16:59:17.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"},"commit":{"message":"Use `MEM0001`, `MEM0002`, `MEM0003` error codes\n\nFixes: https://github.com/jonathanpeppers/memory-analyzers/issues/6\n\nI still support `MA0001`, etc. as a way to silence the warnings. This will make it easier to migrate the dotnet/maui repo.","shortMessageHtmlLink":"Use MEM0001, MEM0002, MEM0003 error codes"}},{"before":"31d0fd38d0734a78f1901658e081ef762ecc1045","after":"3db449e77d2f607a9f8fc7fcc01301ab1ec353d1","ref":"refs/heads/main","pushedAt":"2023-10-24T14:55:07.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"},"commit":{"message":"Update Microsoft.NET.Test.Sdk to 17.7.2\n\nVS wasn't finding tests otherwise.","shortMessageHtmlLink":"Update Microsoft.NET.Test.Sdk to 17.7.2"}},{"before":"ee5cde5fc2dec354a4e0a1332ce8055edb5b9ed2","after":"31d0fd38d0734a78f1901658e081ef762ecc1045","ref":"refs/heads/main","pushedAt":"2023-08-28T18:06:28.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"},"commit":{"message":"Update README.md\n\nNotes and links about \"circular references\"","shortMessageHtmlLink":"Update README.md"}},{"before":"f409d32cbb48c7be654befe6396782b9b65fdff1","after":"ee5cde5fc2dec354a4e0a1332ce8055edb5b9ed2","ref":"refs/heads/main","pushedAt":"2023-08-27T18:07:53.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"},"commit":{"message":"Add NuGet Badge to README (#5)","shortMessageHtmlLink":"Add NuGet Badge to README (#5)"}},{"before":"a0cd6009fe22fbd13a35546dead0f34cc3dc33cc","after":null,"ref":"refs/heads/NSString","pushedAt":"2023-08-15T16:56:43.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"}},{"before":"ea25f036fe75f1c08fe9effb6df789701ed22264","after":"f409d32cbb48c7be654befe6396782b9b65fdff1","ref":"refs/heads/main","pushedAt":"2023-08-15T16:56:40.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"},"commit":{"message":"Don't warn about `Foundation.NSString` (#4)\n\nExamples like this are fine:\r\n\r\n\tclass MyCustomCell : UITableViewCell\r\n\t{\r\n\t\tstatic readonly NSString MyCellId = new NSString(\"MyCustomCell\");\r\n\t}","shortMessageHtmlLink":"Don't warn about Foundation.NSString (#4)"}},{"before":null,"after":"a0cd6009fe22fbd13a35546dead0f34cc3dc33cc","ref":"refs/heads/NSString","pushedAt":"2023-08-15T16:55:05.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"},"commit":{"message":"Don't warn about `Foundation.NSString`\n\nExamples like this are fine:\n\n\tclass MyCustomCell : UITableViewCell\n\t{\n\t\tstatic readonly NSString MyCellId = new NSString(\"MyCustomCell\");\n\t}","shortMessageHtmlLink":"Don't warn about Foundation.NSString"}},{"before":"464abe895527ebeeab237156e050e763184b943b","after":"ea25f036fe75f1c08fe9effb6df789701ed22264","ref":"refs/heads/main","pushedAt":"2023-08-15T16:46:39.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"},"commit":{"message":"Bump to 0.1.0-beta.4","shortMessageHtmlLink":"Bump to 0.1.0-beta.4"}},{"before":"32b1cbb22b41b281e2983a44d05f2038a5ceb00c","after":null,"ref":"refs/heads/MA0003Suppression","pushedAt":"2023-08-10T16:29:14.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"}},{"before":"3699191d5b9c44af085345eb899c9c5241c13fc8","after":"464abe895527ebeeab237156e050e763184b943b","ref":"refs/heads/main","pushedAt":"2023-08-10T16:29:11.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"},"commit":{"message":"Make a way to suppress MA0003 (#3)\n\nI add a test to allow:\r\n\r\n new UITextField().EditingDidBegin += _proxy.OnEditingDidBegin;\r\n\r\n // This should warn, because it is NSObject\r\n class UITextFieldProxy : NSObject\r\n {\r\n // But then we suppressed the warning\r\n [UnconditionalSuppressMessage(\"Memory\", \"MA0003\")]\r\n public void OnEditingDidBegin(object sender, EventArgs e) { }\r\n }\r\n\r\nI added code to look up the attribute on the method from this statement:\r\n\r\n new UITextField().EditingDidBegin += _proxy.OnEditingDidBegin;\r\n\r\nThis also uncovered a bug in the analyzer:\r\n\r\n --if (attribute.AttributeClass.ContainingNamespace.Name != \"System.Diagnostics.CodeAnalysis\")\r\n ++if (attribute.AttributeClass.ContainingNamespace.ToString() != \"System.Diagnostics.CodeAnalysis\")\r\n\r\nIn this example `Name` was just `\"CodeAnalysis\"`. I have no idea why,\r\nbut using `.ToString()` instead was successful. All tests pass with this\r\nchange, so I'm going with it.","shortMessageHtmlLink":"Make a way to suppress MA0003 (#3)"}},{"before":null,"after":"32b1cbb22b41b281e2983a44d05f2038a5ceb00c","ref":"refs/heads/MA0003Suppression","pushedAt":"2023-08-10T16:25:11.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"},"commit":{"message":"Make a way to suppress MA0003\n\nI add a test to allow:\n\n new UITextField().EditingDidBegin += _proxy.OnEditingDidBegin;\n\n // This should warn, because it is NSObject\n class UITextFieldProxy : NSObject\n {\n // But then we suppressed the warning\n [UnconditionalSuppressMessage(\"Memory\", \"MA0003\")]\n public void OnEditingDidBegin(object sender, EventArgs e) { }\n }\n\nI added code to look up the attribute on the method from this statement:\n\n new UITextField().EditingDidBegin += _proxy.OnEditingDidBegin;\n\nThis also uncovered a bug in the analyzer:\n\n --if (attribute.AttributeClass.ContainingNamespace.Name != \"System.Diagnostics.CodeAnalysis\")\n ++if (attribute.AttributeClass.ContainingNamespace.ToString() != \"System.Diagnostics.CodeAnalysis\")\n\nIn this example `Name` was just `\"CodeAnalysis\"`. I have no idea why,\nbut using `.ToString()` instead was successful. All tests pass with this\nchange, so I'm going with it.","shortMessageHtmlLink":"Make a way to suppress MA0003"}},{"before":"54d2e777c00f790abd670abf668c138245d2865d","after":null,"ref":"refs/heads/MA0003","pushedAt":"2023-08-10T16:17:09.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"}},{"before":"fbb22a3a378eb24c3064ecc0b125768ff44ad557","after":"3699191d5b9c44af085345eb899c9c5241c13fc8","ref":"refs/heads/main","pushedAt":"2023-08-10T16:17:07.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"},"commit":{"message":"Better heuristics for MA0003 (#2)\n\n.NET MAUI is getting some warnings like:\r\n\r\n src\\Core\\src\\Platform\\iOS\\MauiSearchBar.cs(73,31):\r\n error MA0003: Subscribing to events with instance method 'OnEditingChanged' could cause memory leaks in an NSObject subclass. Remove the subscription or convert the method to a static method.\r\n\r\nBut this is a pattern that is OK:\r\n\r\n picker.ValueChanged += _proxy.OnValueChanged;\r\n //...\r\n class UIDatePickerProxy\r\n {\r\n public void OnValueChanged(object? sender, EventArgs e) { }\r\n }\r\n\r\nAdded some logic to allow this pattern.\r\n\r\nI continued to emit MA0003 if `UIDatePickerProxy` is an\r\n`NSObject`-subclass.","shortMessageHtmlLink":"Better heuristics for MA0003 (#2)"}},{"before":null,"after":"54d2e777c00f790abd670abf668c138245d2865d","ref":"refs/heads/MA0003","pushedAt":"2023-08-10T16:14:44.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"},"commit":{"message":"Better heuristics for MA0003\n\n.NET MAUI is getting some warnings like:\n\n src\\Core\\src\\Platform\\iOS\\MauiSearchBar.cs(73,31):\n error MA0003: Subscribing to events with instance method 'OnEditingChanged' could cause memory leaks in an NSObject subclass. Remove the subscription or convert the method to a static method.\n\nBut this is a pattern that is OK:\n\n picker.ValueChanged += _proxy.OnValueChanged;\n //...\n class UIDatePickerProxy\n {\n public void OnValueChanged(object? sender, EventArgs e) { }\n }\n\nAdded some logic to allow this pattern.\n\nI continued to emit MA0003 if `UIDatePickerProxy` is an\n`NSObject`-subclass.","shortMessageHtmlLink":"Better heuristics for MA0003"}},{"before":"8e80ebd57e8ee8eefff3cf0a4f6e7b6d58381286","after":"fbb22a3a378eb24c3064ecc0b125768ff44ad557","ref":"refs/heads/main","pushedAt":"2023-08-10T15:53:12.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"},"commit":{"message":"Bump to 0.1.0-beta.3","shortMessageHtmlLink":"Bump to 0.1.0-beta.3"}},{"before":"01083b06d516287914f60df6ff57a5eb3d93d6da","after":"8e80ebd57e8ee8eefff3cf0a4f6e7b6d58381286","ref":"refs/heads/main","pushedAt":"2023-07-27T21:27:20.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"},"commit":{"message":"Skip MA0001 for any random `add` statement\n\nThis should allow `WeakEventManager`.","shortMessageHtmlLink":"Skip MA0001 for any random add statement"}},{"before":"f56b0dc375806f8c56e8e7d89efc5cd2ded2689a","after":"01083b06d516287914f60df6ff57a5eb3d93d6da","ref":"refs/heads/main","pushedAt":"2023-07-26T14:01:31.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"},"commit":{"message":"Remove auto-using System.Diagnostics.CodeAnalysis\n\nI think this causes IDEs to act strangely when you apply the code fix.","shortMessageHtmlLink":"Remove auto-using System.Diagnostics.CodeAnalysis"}},{"before":"a1778cc5aa507f00816f29c2d31023aeaacdfcb3","after":"f56b0dc375806f8c56e8e7d89efc5cd2ded2689a","ref":"refs/heads/main","pushedAt":"2023-07-25T18:52:16.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"},"commit":{"message":"UIImage is OK","shortMessageHtmlLink":"UIImage is OK"}},{"before":"051f34d6b4db0ab9b6e29521ce36387e4a6e5d1a","after":"a1778cc5aa507f00816f29c2d31023aeaacdfcb3","ref":"refs/heads/main","pushedAt":"2023-07-25T15:47:44.000Z","pushType":"push","commitsCount":7,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"},"commit":{"message":"UIWindow in IUIWindowSceneDelegate is OK","shortMessageHtmlLink":"UIWindow in IUIWindowSceneDelegate is OK"}},{"before":"e81eeeb2cb89bd3634e40addb097d9a673735fa1","after":"051f34d6b4db0ab9b6e29521ce36387e4a6e5d1a","ref":"refs/heads/main","pushedAt":"2023-07-24T21:16:30.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"jonathanpeppers","name":"Jonathan Peppers","path":"/jonathanpeppers","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/840039?s=80&v=4"},"commit":{"message":"[UnconditionalSuppressMessage] Add missing using if needed","shortMessageHtmlLink":"[UnconditionalSuppressMessage] Add missing using if needed"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAADozHopwA","startCursor":null,"endCursor":null}},"title":"Activity ยท jonathanpeppers/memory-analyzers"}