[code-simplifier] refactor: simplify duplicate catch blocks and attribute-loop consistency - #9505

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
code-simplifier/simplify-catch-and-attribute-lookup-eee91e25ec8e606b
Jun 29, 2026
Merged

[code-simplifier] refactor: simplify duplicate catch blocks and attribute-loop consistency#9505
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
code-simplifier/simplify-catch-and-attribute-lookup-eee91e25ec8e606b

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Code Simplification — 2026-06-29

This PR simplifies two small pieces of recently modified code to improve clarity and consistency, without any behavioral change.

Files Simplified

  • src/Platform/Microsoft.Testing.Extensions.PackagedApp/PackagedAppTestHostHandle.cs — combine two identical catch blocks
  • src/Adapter/MSTestAdapter.PlatformServices/SourceGeneration/SourceGeneratedReflectionOperations.cs — align loop pattern with adjacent methods

Improvements Made

1. PackagedAppTestHostHandle — eliminate duplicate catch bodies (from #9454)

The Dispose method had two catch blocks with identical handler bodies:

// Beforecatch(IOExceptionex){Debug.WriteLine($"Best-effort cleanup of deployment directory '{_deploymentDirectory}' failed: {ex}");}catch(UnauthorizedAccessExceptionex){Debug.WriteLine($"Best-effort cleanup of deployment directory '{_deploymentDirectory}' failed: {ex}");}

Combined into a single handler using a C# exception filter, eliminating the duplication:

// Aftercatch(Exceptionex)when(exisIOException or UnauthorizedAccessException){Debug.WriteLine($"Best-effort cleanup of deployment directory '{_deploymentDirectory}' failed: {ex}");}

2. SourceGeneratedReflectionOperations.GetSingleAttributeOrDefault — loop consistency (from #9479)

The GetSingleAttributeOrDefault method used a is not T / continue guard, while the two adjacent methods (IsAttributeDefined and GetFirstAttributeOrDefault) that were introduced in the same PR use a direct positive is T match. Aligned the style:

// Before (uses negated guard + continue)if(attris not TAttributematch){continue;}if(firstis not null){throw ...;}first=match;// After (positive match, consistent with adjacent methods)if(attrisTAttributematch){if(firstis not null){throw ...;}first=match;}

Changes Based On

Recent changes from:

Testing

  • ✅ No functional changes — behavior is identical
  • ✅ No tests need updating; the changes are purely structural

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Code Simplifier workflow. · 217.9 AIC · ⌖ 18.3 AIC · ⊞ 9.3K · [◷]( · )

Add this agentic workflows to your repo

To install this agentic workflow, run

gh aw add githubnext/agentics/workflows/code-simplifier.md@main
  • expires on Jun 30, 2026, 2:46 PM UTC

- PackagedAppTestHostHandle: combine two identical IOException /
UnauthorizedAccessException catch blocks into a single handler using
an exception filter (when ex is IOException or UnauthorizedAccessException).
Both handlers had identical bodies; the combined form eliminates the
duplication and uses idiomatic C# exception filters.
- SourceGeneratedReflectionOperations.GetSingleAttributeOrDefault: replace
the 'is not T / continue' guard with a direct 'is T' positive match,
making the loop consistent with the adjacent IsAttributeDefined and
GetFirstAttributeOrDefault methods which use the same positive-match
pattern.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 29, 2026 14:46
@EvangelinkAmaury Levé (Evangelink) added type/automation Created or maintained by an agentic workflow. type/tech-debt Code health, refactoring, simplification. labels Jun 29, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR applies small, targeted refactors in Microsoft.Testing.Platform and MSTestAdapter.PlatformServices to reduce duplication and align local coding style, without changing observable behavior.

Changes:

  • Consolidate two identical catch blocks in PackagedAppTestHostHandle.Dispose() via an exception filter.
  • Adjust GetSingleAttributeOrDefault<TAttribute>’s loop to use a positive type match pattern consistent with adjacent attribute helpers.
Show a summary per file
FileDescription
src/Platform/Microsoft.Testing.Extensions.PackagedApp/PackagedAppTestHostHandle.csReplaces duplicated IOException/UnauthorizedAccessException handlers with a single filtered catch block.
src/Adapter/MSTestAdapter.PlatformServices/SourceGeneration/SourceGeneratedReflectionOperations.csRefactors the attribute scan loop in GetSingleAttributeOrDefault for consistency with neighboring methods.

Review details

  • Files reviewed: 2/2 changed files
  • Comments generated: 0
  • Review effort level: Low

@Evangelink
Amaury Levé (Evangelink) marked this pull request as ready for review June 29, 2026 14:53
@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jun 29, 2026
@Evangelink
Amaury Levé (Evangelink) merged commit 553a2ed into mainJun 29, 2026
24 of 32 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the code-simplifier/simplify-catch-and-attribute-lookup-eee91e25ec8e606b branch June 29, 2026 14:53

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

✅ 22/22 dimensions clean — no findings.

Scope: 2 files, purely structural refactoring — no behavioral change.

  • SourceGeneratedReflectionOperations.cs: early-continue → nested if (attr is TAttribute match) is semantically identical; logic (duplicate-check, then assign) is preserved in the same order.
  • PackagedAppTestHostHandle.cs: catch (Exception ex) when (ex is IOException or UnauthorizedAccessException) captures exactly the same exception types as the two preceding separate catch blocks, with the same handler body.

No public API surface changed, no threading concerns, no localization regressions, no test-isolation issues. The or pattern in the when clause is C# 9, consistent with the net8.0+-only target of Microsoft.Testing.Extensions.PackagedApp.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.type/automationCreated or maintained by an agentic workflow.type/tech-debtCode health, refactoring, simplification.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Evangelink
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

[code-simplifier] refactor: simplify duplicate catch blocks and attribute-loop consistency - #9505

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
code-simplifier/simplify-catch-and-attribute-lookup-eee91e25ec8e606b
Jun 29, 2026
Merged

[code-simplifier] refactor: simplify duplicate catch blocks and attribute-loop consistency#9505
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
code-simplifier/simplify-catch-and-attribute-lookup-eee91e25ec8e606b

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Code Simplification — 2026-06-29

This PR simplifies two small pieces of recently modified code to improve clarity and consistency, without any behavioral change.

Files Simplified

  • src/Platform/Microsoft.Testing.Extensions.PackagedApp/PackagedAppTestHostHandle.cs — combine two identical catch blocks
  • src/Adapter/MSTestAdapter.PlatformServices/SourceGeneration/SourceGeneratedReflectionOperations.cs — align loop pattern with adjacent methods

Improvements Made

1. PackagedAppTestHostHandle — eliminate duplicate catch bodies (from #9454)

The Dispose method had two catch blocks with identical handler bodies:

// Beforecatch(IOExceptionex){Debug.WriteLine($"Best-effort cleanup of deployment directory '{_deploymentDirectory}' failed: {ex}");}catch(UnauthorizedAccessExceptionex){Debug.WriteLine($"Best-effort cleanup of deployment directory '{_deploymentDirectory}' failed: {ex}");}

Combined into a single handler using a C# exception filter, eliminating the duplication:

// Aftercatch(Exceptionex)when(exisIOException or UnauthorizedAccessException){Debug.WriteLine($"Best-effort cleanup of deployment directory '{_deploymentDirectory}' failed: {ex}");}

2. SourceGeneratedReflectionOperations.GetSingleAttributeOrDefault — loop consistency (from #9479)

The GetSingleAttributeOrDefault method used a is not T / continue guard, while the two adjacent methods (IsAttributeDefined and GetFirstAttributeOrDefault) that were introduced in the same PR use a direct positive is T match. Aligned the style:

// Before (uses negated guard + continue)if(attris not TAttributematch){continue;}if(firstis not null){throw ...;}first=match;// After (positive match, consistent with adjacent methods)if(attrisTAttributematch){if(firstis not null){throw ...;}first=match;}

Changes Based On

Recent changes from:

Testing

  • ✅ No functional changes — behavior is identical
  • ✅ No tests need updating; the changes are purely structural

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Code Simplifier workflow. · 217.9 AIC · ⌖ 18.3 AIC · ⊞ 9.3K · [◷]( · )

Add this agentic workflows to your repo

To install this agentic workflow, run

gh aw add githubnext/agentics/workflows/code-simplifier.md@main
  • expires on Jun 30, 2026, 2:46 PM UTC

- PackagedAppTestHostHandle: combine two identical IOException /
UnauthorizedAccessException catch blocks into a single handler using
an exception filter (when ex is IOException or UnauthorizedAccessException).
Both handlers had identical bodies; the combined form eliminates the
duplication and uses idiomatic C# exception filters.
- SourceGeneratedReflectionOperations.GetSingleAttributeOrDefault: replace
the 'is not T / continue' guard with a direct 'is T' positive match,
making the loop consistent with the adjacent IsAttributeDefined and
GetFirstAttributeOrDefault methods which use the same positive-match
pattern.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 29, 2026 14:46
@EvangelinkAmaury Levé (Evangelink) added type/automation Created or maintained by an agentic workflow. type/tech-debt Code health, refactoring, simplification. labels Jun 29, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR applies small, targeted refactors in Microsoft.Testing.Platform and MSTestAdapter.PlatformServices to reduce duplication and align local coding style, without changing observable behavior.

Changes:

  • Consolidate two identical catch blocks in PackagedAppTestHostHandle.Dispose() via an exception filter.
  • Adjust GetSingleAttributeOrDefault<TAttribute>’s loop to use a positive type match pattern consistent with adjacent attribute helpers.
Show a summary per file
FileDescription
src/Platform/Microsoft.Testing.Extensions.PackagedApp/PackagedAppTestHostHandle.csReplaces duplicated IOException/UnauthorizedAccessException handlers with a single filtered catch block.
src/Adapter/MSTestAdapter.PlatformServices/SourceGeneration/SourceGeneratedReflectionOperations.csRefactors the attribute scan loop in GetSingleAttributeOrDefault for consistency with neighboring methods.

Review details

  • Files reviewed: 2/2 changed files
  • Comments generated: 0
  • Review effort level: Low

@Evangelink
Amaury Levé (Evangelink) marked this pull request as ready for review June 29, 2026 14:53
@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jun 29, 2026
@Evangelink
Amaury Levé (Evangelink) merged commit 553a2ed into mainJun 29, 2026
24 of 32 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the code-simplifier/simplify-catch-and-attribute-lookup-eee91e25ec8e606b branch June 29, 2026 14:53

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

✅ 22/22 dimensions clean — no findings.

Scope: 2 files, purely structural refactoring — no behavioral change.

  • SourceGeneratedReflectionOperations.cs: early-continue → nested if (attr is TAttribute match) is semantically identical; logic (duplicate-check, then assign) is preserved in the same order.
  • PackagedAppTestHostHandle.cs: catch (Exception ex) when (ex is IOException or UnauthorizedAccessException) captures exactly the same exception types as the two preceding separate catch blocks, with the same handler body.

No public API surface changed, no threading concerns, no localization regressions, no test-isolation issues. The or pattern in the when clause is C# 9, consistent with the net8.0+-only target of Microsoft.Testing.Extensions.PackagedApp.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.type/automationCreated or maintained by an agentic workflow.type/tech-debtCode health, refactoring, simplification.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Evangelink
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[code-simplifier] refactor: simplify duplicate catch blocks and attribute-loop consistency - #9505

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
code-simplifier/simplify-catch-and-attribute-lookup-eee91e25ec8e606b
Jun 29, 2026
Merged

[code-simplifier] refactor: simplify duplicate catch blocks and attribute-loop consistency#9505
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
code-simplifier/simplify-catch-and-attribute-lookup-eee91e25ec8e606b

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Code Simplification — 2026-06-29

This PR simplifies two small pieces of recently modified code to improve clarity and consistency, without any behavioral change.

Files Simplified

  • src/Platform/Microsoft.Testing.Extensions.PackagedApp/PackagedAppTestHostHandle.cs — combine two identical catch blocks
  • src/Adapter/MSTestAdapter.PlatformServices/SourceGeneration/SourceGeneratedReflectionOperations.cs — align loop pattern with adjacent methods

Improvements Made

1. PackagedAppTestHostHandle — eliminate duplicate catch bodies (from #9454)

The Dispose method had two catch blocks with identical handler bodies:

// Beforecatch(IOExceptionex){Debug.WriteLine($"Best-effort cleanup of deployment directory '{_deploymentDirectory}' failed: {ex}");}catch(UnauthorizedAccessExceptionex){Debug.WriteLine($"Best-effort cleanup of deployment directory '{_deploymentDirectory}' failed: {ex}");}

Combined into a single handler using a C# exception filter, eliminating the duplication:

// Aftercatch(Exceptionex)when(exisIOException or UnauthorizedAccessException){Debug.WriteLine($"Best-effort cleanup of deployment directory '{_deploymentDirectory}' failed: {ex}");}

2. SourceGeneratedReflectionOperations.GetSingleAttributeOrDefault — loop consistency (from #9479)

The GetSingleAttributeOrDefault method used a is not T / continue guard, while the two adjacent methods (IsAttributeDefined and GetFirstAttributeOrDefault) that were introduced in the same PR use a direct positive is T match. Aligned the style:

// Before (uses negated guard + continue)if(attris not TAttributematch){continue;}if(firstis not null){throw ...;}first=match;// After (positive match, consistent with adjacent methods)if(attrisTAttributematch){if(firstis not null){throw ...;}first=match;}

Changes Based On

Recent changes from:

Testing

  • ✅ No functional changes — behavior is identical
  • ✅ No tests need updating; the changes are purely structural

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Code Simplifier workflow. · 217.9 AIC · ⌖ 18.3 AIC · ⊞ 9.3K · [◷]( · )

Add this agentic workflows to your repo

To install this agentic workflow, run

gh aw add githubnext/agentics/workflows/code-simplifier.md@main
  • expires on Jun 30, 2026, 2:46 PM UTC

- PackagedAppTestHostHandle: combine two identical IOException /
UnauthorizedAccessException catch blocks into a single handler using
an exception filter (when ex is IOException or UnauthorizedAccessException).
Both handlers had identical bodies; the combined form eliminates the
duplication and uses idiomatic C# exception filters.
- SourceGeneratedReflectionOperations.GetSingleAttributeOrDefault: replace
the 'is not T / continue' guard with a direct 'is T' positive match,
making the loop consistent with the adjacent IsAttributeDefined and
GetFirstAttributeOrDefault methods which use the same positive-match
pattern.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 29, 2026 14:46
@EvangelinkAmaury Levé (Evangelink) added type/automation Created or maintained by an agentic workflow. type/tech-debt Code health, refactoring, simplification. labels Jun 29, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR applies small, targeted refactors in Microsoft.Testing.Platform and MSTestAdapter.PlatformServices to reduce duplication and align local coding style, without changing observable behavior.

Changes:

  • Consolidate two identical catch blocks in PackagedAppTestHostHandle.Dispose() via an exception filter.
  • Adjust GetSingleAttributeOrDefault<TAttribute>’s loop to use a positive type match pattern consistent with adjacent attribute helpers.
Show a summary per file
FileDescription
src/Platform/Microsoft.Testing.Extensions.PackagedApp/PackagedAppTestHostHandle.csReplaces duplicated IOException/UnauthorizedAccessException handlers with a single filtered catch block.
src/Adapter/MSTestAdapter.PlatformServices/SourceGeneration/SourceGeneratedReflectionOperations.csRefactors the attribute scan loop in GetSingleAttributeOrDefault for consistency with neighboring methods.

Review details

  • Files reviewed: 2/2 changed files
  • Comments generated: 0
  • Review effort level: Low

@Evangelink
Amaury Levé (Evangelink) marked this pull request as ready for review June 29, 2026 14:53
@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jun 29, 2026
@Evangelink
Amaury Levé (Evangelink) merged commit 553a2ed into mainJun 29, 2026
24 of 32 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the code-simplifier/simplify-catch-and-attribute-lookup-eee91e25ec8e606b branch June 29, 2026 14:53

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

✅ 22/22 dimensions clean — no findings.

Scope: 2 files, purely structural refactoring — no behavioral change.

  • SourceGeneratedReflectionOperations.cs: early-continue → nested if (attr is TAttribute match) is semantically identical; logic (duplicate-check, then assign) is preserved in the same order.
  • PackagedAppTestHostHandle.cs: catch (Exception ex) when (ex is IOException or UnauthorizedAccessException) captures exactly the same exception types as the two preceding separate catch blocks, with the same handler body.

No public API surface changed, no threading concerns, no localization regressions, no test-isolation issues. The or pattern in the when clause is C# 9, consistent with the net8.0+-only target of Microsoft.Testing.Extensions.PackagedApp.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.type/automationCreated or maintained by an agentic workflow.type/tech-debtCode health, refactoring, simplification.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Evangelink
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[code-simplifier] refactor: simplify duplicate catch blocks and attribute-loop consistency - #9505

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
code-simplifier/simplify-catch-and-attribute-lookup-eee91e25ec8e606b
Jun 29, 2026
Merged

[code-simplifier] refactor: simplify duplicate catch blocks and attribute-loop consistency#9505
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
code-simplifier/simplify-catch-and-attribute-lookup-eee91e25ec8e606b

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Code Simplification — 2026-06-29

This PR simplifies two small pieces of recently modified code to improve clarity and consistency, without any behavioral change.

Files Simplified

  • src/Platform/Microsoft.Testing.Extensions.PackagedApp/PackagedAppTestHostHandle.cs — combine two identical catch blocks
  • src/Adapter/MSTestAdapter.PlatformServices/SourceGeneration/SourceGeneratedReflectionOperations.cs — align loop pattern with adjacent methods

Improvements Made

1. PackagedAppTestHostHandle — eliminate duplicate catch bodies (from #9454)

The Dispose method had two catch blocks with identical handler bodies:

// Beforecatch(IOExceptionex){Debug.WriteLine($"Best-effort cleanup of deployment directory '{_deploymentDirectory}' failed: {ex}");}catch(UnauthorizedAccessExceptionex){Debug.WriteLine($"Best-effort cleanup of deployment directory '{_deploymentDirectory}' failed: {ex}");}

Combined into a single handler using a C# exception filter, eliminating the duplication:

// Aftercatch(Exceptionex)when(exisIOException or UnauthorizedAccessException){Debug.WriteLine($"Best-effort cleanup of deployment directory '{_deploymentDirectory}' failed: {ex}");}

2. SourceGeneratedReflectionOperations.GetSingleAttributeOrDefault — loop consistency (from #9479)

The GetSingleAttributeOrDefault method used a is not T / continue guard, while the two adjacent methods (IsAttributeDefined and GetFirstAttributeOrDefault) that were introduced in the same PR use a direct positive is T match. Aligned the style:

// Before (uses negated guard + continue)if(attris not TAttributematch){continue;}if(firstis not null){throw ...;}first=match;// After (positive match, consistent with adjacent methods)if(attrisTAttributematch){if(firstis not null){throw ...;}first=match;}

Changes Based On

Recent changes from:

Testing

  • ✅ No functional changes — behavior is identical
  • ✅ No tests need updating; the changes are purely structural

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Code Simplifier workflow. · 217.9 AIC · ⌖ 18.3 AIC · ⊞ 9.3K · [◷]( · )

Add this agentic workflows to your repo

To install this agentic workflow, run

gh aw add githubnext/agentics/workflows/code-simplifier.md@main
  • expires on Jun 30, 2026, 2:46 PM UTC

- PackagedAppTestHostHandle: combine two identical IOException /
UnauthorizedAccessException catch blocks into a single handler using
an exception filter (when ex is IOException or UnauthorizedAccessException).
Both handlers had identical bodies; the combined form eliminates the
duplication and uses idiomatic C# exception filters.
- SourceGeneratedReflectionOperations.GetSingleAttributeOrDefault: replace
the 'is not T / continue' guard with a direct 'is T' positive match,
making the loop consistent with the adjacent IsAttributeDefined and
GetFirstAttributeOrDefault methods which use the same positive-match
pattern.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 29, 2026 14:46
@EvangelinkAmaury Levé (Evangelink) added type/automation Created or maintained by an agentic workflow. type/tech-debt Code health, refactoring, simplification. labels Jun 29, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR applies small, targeted refactors in Microsoft.Testing.Platform and MSTestAdapter.PlatformServices to reduce duplication and align local coding style, without changing observable behavior.

Changes:

  • Consolidate two identical catch blocks in PackagedAppTestHostHandle.Dispose() via an exception filter.
  • Adjust GetSingleAttributeOrDefault<TAttribute>’s loop to use a positive type match pattern consistent with adjacent attribute helpers.
Show a summary per file
FileDescription
src/Platform/Microsoft.Testing.Extensions.PackagedApp/PackagedAppTestHostHandle.csReplaces duplicated IOException/UnauthorizedAccessException handlers with a single filtered catch block.
src/Adapter/MSTestAdapter.PlatformServices/SourceGeneration/SourceGeneratedReflectionOperations.csRefactors the attribute scan loop in GetSingleAttributeOrDefault for consistency with neighboring methods.

Review details

  • Files reviewed: 2/2 changed files
  • Comments generated: 0
  • Review effort level: Low

@Evangelink
Amaury Levé (Evangelink) marked this pull request as ready for review June 29, 2026 14:53
@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jun 29, 2026
@Evangelink
Amaury Levé (Evangelink) merged commit 553a2ed into mainJun 29, 2026
24 of 32 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the code-simplifier/simplify-catch-and-attribute-lookup-eee91e25ec8e606b branch June 29, 2026 14:53

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

✅ 22/22 dimensions clean — no findings.

Scope: 2 files, purely structural refactoring — no behavioral change.

  • SourceGeneratedReflectionOperations.cs: early-continue → nested if (attr is TAttribute match) is semantically identical; logic (duplicate-check, then assign) is preserved in the same order.
  • PackagedAppTestHostHandle.cs: catch (Exception ex) when (ex is IOException or UnauthorizedAccessException) captures exactly the same exception types as the two preceding separate catch blocks, with the same handler body.

No public API surface changed, no threading concerns, no localization regressions, no test-isolation issues. The or pattern in the when clause is C# 9, consistent with the net8.0+-only target of Microsoft.Testing.Extensions.PackagedApp.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.type/automationCreated or maintained by an agentic workflow.type/tech-debtCode health, refactoring, simplification.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Evangelink
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

[code-simplifier] refactor: simplify duplicate catch blocks and attribute-loop consistency - #9505

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
code-simplifier/simplify-catch-and-attribute-lookup-eee91e25ec8e606b
Jun 29, 2026
Merged

[code-simplifier] refactor: simplify duplicate catch blocks and attribute-loop consistency#9505
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
code-simplifier/simplify-catch-and-attribute-lookup-eee91e25ec8e606b

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Code Simplification — 2026-06-29

This PR simplifies two small pieces of recently modified code to improve clarity and consistency, without any behavioral change.

Files Simplified

  • src/Platform/Microsoft.Testing.Extensions.PackagedApp/PackagedAppTestHostHandle.cs — combine two identical catch blocks
  • src/Adapter/MSTestAdapter.PlatformServices/SourceGeneration/SourceGeneratedReflectionOperations.cs — align loop pattern with adjacent methods

Improvements Made

1. PackagedAppTestHostHandle — eliminate duplicate catch bodies (from #9454)

The Dispose method had two catch blocks with identical handler bodies:

// Beforecatch(IOExceptionex){Debug.WriteLine($"Best-effort cleanup of deployment directory '{_deploymentDirectory}' failed: {ex}");}catch(UnauthorizedAccessExceptionex){Debug.WriteLine($"Best-effort cleanup of deployment directory '{_deploymentDirectory}' failed: {ex}");}

Combined into a single handler using a C# exception filter, eliminating the duplication:

// Aftercatch(Exceptionex)when(exisIOException or UnauthorizedAccessException){Debug.WriteLine($"Best-effort cleanup of deployment directory '{_deploymentDirectory}' failed: {ex}");}

2. SourceGeneratedReflectionOperations.GetSingleAttributeOrDefault — loop consistency (from #9479)

The GetSingleAttributeOrDefault method used a is not T / continue guard, while the two adjacent methods (IsAttributeDefined and GetFirstAttributeOrDefault) that were introduced in the same PR use a direct positive is T match. Aligned the style:

// Before (uses negated guard + continue)if(attris not TAttributematch){continue;}if(firstis not null){throw ...;}first=match;// After (positive match, consistent with adjacent methods)if(attrisTAttributematch){if(firstis not null){throw ...;}first=match;}

Changes Based On

Recent changes from:

Testing

  • ✅ No functional changes — behavior is identical
  • ✅ No tests need updating; the changes are purely structural

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Code Simplifier workflow. · 217.9 AIC · ⌖ 18.3 AIC · ⊞ 9.3K · [◷]( · )

Add this agentic workflows to your repo

To install this agentic workflow, run

gh aw add githubnext/agentics/workflows/code-simplifier.md@main
  • expires on Jun 30, 2026, 2:46 PM UTC

- PackagedAppTestHostHandle: combine two identical IOException /
UnauthorizedAccessException catch blocks into a single handler using
an exception filter (when ex is IOException or UnauthorizedAccessException).
Both handlers had identical bodies; the combined form eliminates the
duplication and uses idiomatic C# exception filters.
- SourceGeneratedReflectionOperations.GetSingleAttributeOrDefault: replace
the 'is not T / continue' guard with a direct 'is T' positive match,
making the loop consistent with the adjacent IsAttributeDefined and
GetFirstAttributeOrDefault methods which use the same positive-match
pattern.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 29, 2026 14:46
@EvangelinkAmaury Levé (Evangelink) added type/automation Created or maintained by an agentic workflow. type/tech-debt Code health, refactoring, simplification. labels Jun 29, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR applies small, targeted refactors in Microsoft.Testing.Platform and MSTestAdapter.PlatformServices to reduce duplication and align local coding style, without changing observable behavior.

Changes:

  • Consolidate two identical catch blocks in PackagedAppTestHostHandle.Dispose() via an exception filter.
  • Adjust GetSingleAttributeOrDefault<TAttribute>’s loop to use a positive type match pattern consistent with adjacent attribute helpers.
Show a summary per file
FileDescription
src/Platform/Microsoft.Testing.Extensions.PackagedApp/PackagedAppTestHostHandle.csReplaces duplicated IOException/UnauthorizedAccessException handlers with a single filtered catch block.
src/Adapter/MSTestAdapter.PlatformServices/SourceGeneration/SourceGeneratedReflectionOperations.csRefactors the attribute scan loop in GetSingleAttributeOrDefault for consistency with neighboring methods.

Review details

  • Files reviewed: 2/2 changed files
  • Comments generated: 0
  • Review effort level: Low

@Evangelink
Amaury Levé (Evangelink) marked this pull request as ready for review June 29, 2026 14:53
@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jun 29, 2026
@Evangelink
Amaury Levé (Evangelink) merged commit 553a2ed into mainJun 29, 2026
24 of 32 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the code-simplifier/simplify-catch-and-attribute-lookup-eee91e25ec8e606b branch June 29, 2026 14:53

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

✅ 22/22 dimensions clean — no findings.

Scope: 2 files, purely structural refactoring — no behavioral change.

  • SourceGeneratedReflectionOperations.cs: early-continue → nested if (attr is TAttribute match) is semantically identical; logic (duplicate-check, then assign) is preserved in the same order.
  • PackagedAppTestHostHandle.cs: catch (Exception ex) when (ex is IOException or UnauthorizedAccessException) captures exactly the same exception types as the two preceding separate catch blocks, with the same handler body.

No public API surface changed, no threading concerns, no localization regressions, no test-isolation issues. The or pattern in the when clause is C# 9, consistent with the net8.0+-only target of Microsoft.Testing.Extensions.PackagedApp.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.type/automationCreated or maintained by an agentic workflow.type/tech-debtCode health, refactoring, simplification.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Evangelink
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[code-simplifier] refactor: simplify duplicate catch blocks and attribute-loop consistency - #9505

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
code-simplifier/simplify-catch-and-attribute-lookup-eee91e25ec8e606b
Jun 29, 2026
Merged

[code-simplifier] refactor: simplify duplicate catch blocks and attribute-loop consistency#9505
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
code-simplifier/simplify-catch-and-attribute-lookup-eee91e25ec8e606b

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Code Simplification — 2026-06-29

This PR simplifies two small pieces of recently modified code to improve clarity and consistency, without any behavioral change.

Files Simplified

  • src/Platform/Microsoft.Testing.Extensions.PackagedApp/PackagedAppTestHostHandle.cs — combine two identical catch blocks
  • src/Adapter/MSTestAdapter.PlatformServices/SourceGeneration/SourceGeneratedReflectionOperations.cs — align loop pattern with adjacent methods

Improvements Made

1. PackagedAppTestHostHandle — eliminate duplicate catch bodies (from #9454)

The Dispose method had two catch blocks with identical handler bodies:

// Beforecatch(IOExceptionex){Debug.WriteLine($"Best-effort cleanup of deployment directory '{_deploymentDirectory}' failed: {ex}");}catch(UnauthorizedAccessExceptionex){Debug.WriteLine($"Best-effort cleanup of deployment directory '{_deploymentDirectory}' failed: {ex}");}

Combined into a single handler using a C# exception filter, eliminating the duplication:

// Aftercatch(Exceptionex)when(exisIOException or UnauthorizedAccessException){Debug.WriteLine($"Best-effort cleanup of deployment directory '{_deploymentDirectory}' failed: {ex}");}

2. SourceGeneratedReflectionOperations.GetSingleAttributeOrDefault — loop consistency (from #9479)

The GetSingleAttributeOrDefault method used a is not T / continue guard, while the two adjacent methods (IsAttributeDefined and GetFirstAttributeOrDefault) that were introduced in the same PR use a direct positive is T match. Aligned the style:

// Before (uses negated guard + continue)if(attris not TAttributematch){continue;}if(firstis not null){throw ...;}first=match;// After (positive match, consistent with adjacent methods)if(attrisTAttributematch){if(firstis not null){throw ...;}first=match;}

Changes Based On

Recent changes from:

Testing

  • ✅ No functional changes — behavior is identical
  • ✅ No tests need updating; the changes are purely structural

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Code Simplifier workflow. · 217.9 AIC · ⌖ 18.3 AIC · ⊞ 9.3K · [◷]( · )

Add this agentic workflows to your repo

To install this agentic workflow, run

gh aw add githubnext/agentics/workflows/code-simplifier.md@main
  • expires on Jun 30, 2026, 2:46 PM UTC

- PackagedAppTestHostHandle: combine two identical IOException /
UnauthorizedAccessException catch blocks into a single handler using
an exception filter (when ex is IOException or UnauthorizedAccessException).
Both handlers had identical bodies; the combined form eliminates the
duplication and uses idiomatic C# exception filters.
- SourceGeneratedReflectionOperations.GetSingleAttributeOrDefault: replace
the 'is not T / continue' guard with a direct 'is T' positive match,
making the loop consistent with the adjacent IsAttributeDefined and
GetFirstAttributeOrDefault methods which use the same positive-match
pattern.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 29, 2026 14:46
@EvangelinkAmaury Levé (Evangelink) added type/automation Created or maintained by an agentic workflow. type/tech-debt Code health, refactoring, simplification. labels Jun 29, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR applies small, targeted refactors in Microsoft.Testing.Platform and MSTestAdapter.PlatformServices to reduce duplication and align local coding style, without changing observable behavior.

Changes:

  • Consolidate two identical catch blocks in PackagedAppTestHostHandle.Dispose() via an exception filter.
  • Adjust GetSingleAttributeOrDefault<TAttribute>’s loop to use a positive type match pattern consistent with adjacent attribute helpers.
Show a summary per file
FileDescription
src/Platform/Microsoft.Testing.Extensions.PackagedApp/PackagedAppTestHostHandle.csReplaces duplicated IOException/UnauthorizedAccessException handlers with a single filtered catch block.
src/Adapter/MSTestAdapter.PlatformServices/SourceGeneration/SourceGeneratedReflectionOperations.csRefactors the attribute scan loop in GetSingleAttributeOrDefault for consistency with neighboring methods.

Review details

  • Files reviewed: 2/2 changed files
  • Comments generated: 0
  • Review effort level: Low

@Evangelink
Amaury Levé (Evangelink) marked this pull request as ready for review June 29, 2026 14:53
@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jun 29, 2026
@Evangelink
Amaury Levé (Evangelink) merged commit 553a2ed into mainJun 29, 2026
24 of 32 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the code-simplifier/simplify-catch-and-attribute-lookup-eee91e25ec8e606b branch June 29, 2026 14:53

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

✅ 22/22 dimensions clean — no findings.

Scope: 2 files, purely structural refactoring — no behavioral change.

  • SourceGeneratedReflectionOperations.cs: early-continue → nested if (attr is TAttribute match) is semantically identical; logic (duplicate-check, then assign) is preserved in the same order.
  • PackagedAppTestHostHandle.cs: catch (Exception ex) when (ex is IOException or UnauthorizedAccessException) captures exactly the same exception types as the two preceding separate catch blocks, with the same handler body.

No public API surface changed, no threading concerns, no localization regressions, no test-isolation issues. The or pattern in the when clause is C# 9, consistent with the net8.0+-only target of Microsoft.Testing.Extensions.PackagedApp.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.type/automationCreated or maintained by an agentic workflow.type/tech-debtCode health, refactoring, simplification.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Evangelink
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[code-simplifier] refactor: simplify duplicate catch blocks and attribute-loop consistency - #9505

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
code-simplifier/simplify-catch-and-attribute-lookup-eee91e25ec8e606b
Jun 29, 2026
Merged

[code-simplifier] refactor: simplify duplicate catch blocks and attribute-loop consistency#9505
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
code-simplifier/simplify-catch-and-attribute-lookup-eee91e25ec8e606b

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Code Simplification — 2026-06-29

This PR simplifies two small pieces of recently modified code to improve clarity and consistency, without any behavioral change.

Files Simplified

  • src/Platform/Microsoft.Testing.Extensions.PackagedApp/PackagedAppTestHostHandle.cs — combine two identical catch blocks
  • src/Adapter/MSTestAdapter.PlatformServices/SourceGeneration/SourceGeneratedReflectionOperations.cs — align loop pattern with adjacent methods

Improvements Made

1. PackagedAppTestHostHandle — eliminate duplicate catch bodies (from #9454)

The Dispose method had two catch blocks with identical handler bodies:

// Beforecatch(IOExceptionex){Debug.WriteLine($"Best-effort cleanup of deployment directory '{_deploymentDirectory}' failed: {ex}");}catch(UnauthorizedAccessExceptionex){Debug.WriteLine($"Best-effort cleanup of deployment directory '{_deploymentDirectory}' failed: {ex}");}

Combined into a single handler using a C# exception filter, eliminating the duplication:

// Aftercatch(Exceptionex)when(exisIOException or UnauthorizedAccessException){Debug.WriteLine($"Best-effort cleanup of deployment directory '{_deploymentDirectory}' failed: {ex}");}

2. SourceGeneratedReflectionOperations.GetSingleAttributeOrDefault — loop consistency (from #9479)

The GetSingleAttributeOrDefault method used a is not T / continue guard, while the two adjacent methods (IsAttributeDefined and GetFirstAttributeOrDefault) that were introduced in the same PR use a direct positive is T match. Aligned the style:

// Before (uses negated guard + continue)if(attris not TAttributematch){continue;}if(firstis not null){throw ...;}first=match;// After (positive match, consistent with adjacent methods)if(attrisTAttributematch){if(firstis not null){throw ...;}first=match;}

Changes Based On

Recent changes from:

Testing

  • ✅ No functional changes — behavior is identical
  • ✅ No tests need updating; the changes are purely structural

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Code Simplifier workflow. · 217.9 AIC · ⌖ 18.3 AIC · ⊞ 9.3K · [◷]( · )

Add this agentic workflows to your repo

To install this agentic workflow, run

gh aw add githubnext/agentics/workflows/code-simplifier.md@main
  • expires on Jun 30, 2026, 2:46 PM UTC

- PackagedAppTestHostHandle: combine two identical IOException /
UnauthorizedAccessException catch blocks into a single handler using
an exception filter (when ex is IOException or UnauthorizedAccessException).
Both handlers had identical bodies; the combined form eliminates the
duplication and uses idiomatic C# exception filters.
- SourceGeneratedReflectionOperations.GetSingleAttributeOrDefault: replace
the 'is not T / continue' guard with a direct 'is T' positive match,
making the loop consistent with the adjacent IsAttributeDefined and
GetFirstAttributeOrDefault methods which use the same positive-match
pattern.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 29, 2026 14:46
@EvangelinkAmaury Levé (Evangelink) added type/automation Created or maintained by an agentic workflow. type/tech-debt Code health, refactoring, simplification. labels Jun 29, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR applies small, targeted refactors in Microsoft.Testing.Platform and MSTestAdapter.PlatformServices to reduce duplication and align local coding style, without changing observable behavior.

Changes:

  • Consolidate two identical catch blocks in PackagedAppTestHostHandle.Dispose() via an exception filter.
  • Adjust GetSingleAttributeOrDefault<TAttribute>’s loop to use a positive type match pattern consistent with adjacent attribute helpers.
Show a summary per file
FileDescription
src/Platform/Microsoft.Testing.Extensions.PackagedApp/PackagedAppTestHostHandle.csReplaces duplicated IOException/UnauthorizedAccessException handlers with a single filtered catch block.
src/Adapter/MSTestAdapter.PlatformServices/SourceGeneration/SourceGeneratedReflectionOperations.csRefactors the attribute scan loop in GetSingleAttributeOrDefault for consistency with neighboring methods.

Review details

  • Files reviewed: 2/2 changed files
  • Comments generated: 0
  • Review effort level: Low

@Evangelink
Amaury Levé (Evangelink) marked this pull request as ready for review June 29, 2026 14:53
@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jun 29, 2026
@Evangelink
Amaury Levé (Evangelink) merged commit 553a2ed into mainJun 29, 2026
24 of 32 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the code-simplifier/simplify-catch-and-attribute-lookup-eee91e25ec8e606b branch June 29, 2026 14:53

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

✅ 22/22 dimensions clean — no findings.

Scope: 2 files, purely structural refactoring — no behavioral change.

  • SourceGeneratedReflectionOperations.cs: early-continue → nested if (attr is TAttribute match) is semantically identical; logic (duplicate-check, then assign) is preserved in the same order.
  • PackagedAppTestHostHandle.cs: catch (Exception ex) when (ex is IOException or UnauthorizedAccessException) captures exactly the same exception types as the two preceding separate catch blocks, with the same handler body.

No public API surface changed, no threading concerns, no localization regressions, no test-isolation issues. The or pattern in the when clause is C# 9, consistent with the net8.0+-only target of Microsoft.Testing.Extensions.PackagedApp.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.type/automationCreated or maintained by an agentic workflow.type/tech-debtCode health, refactoring, simplification.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Evangelink
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

[code-simplifier] refactor: simplify duplicate catch blocks and attribute-loop consistency - #9505

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
code-simplifier/simplify-catch-and-attribute-lookup-eee91e25ec8e606b
Jun 29, 2026
Merged

[code-simplifier] refactor: simplify duplicate catch blocks and attribute-loop consistency#9505
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
code-simplifier/simplify-catch-and-attribute-lookup-eee91e25ec8e606b

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Code Simplification — 2026-06-29

This PR simplifies two small pieces of recently modified code to improve clarity and consistency, without any behavioral change.

Files Simplified

  • src/Platform/Microsoft.Testing.Extensions.PackagedApp/PackagedAppTestHostHandle.cs — combine two identical catch blocks
  • src/Adapter/MSTestAdapter.PlatformServices/SourceGeneration/SourceGeneratedReflectionOperations.cs — align loop pattern with adjacent methods

Improvements Made

1. PackagedAppTestHostHandle — eliminate duplicate catch bodies (from #9454)

The Dispose method had two catch blocks with identical handler bodies:

// Beforecatch(IOExceptionex){Debug.WriteLine($"Best-effort cleanup of deployment directory '{_deploymentDirectory}' failed: {ex}");}catch(UnauthorizedAccessExceptionex){Debug.WriteLine($"Best-effort cleanup of deployment directory '{_deploymentDirectory}' failed: {ex}");}

Combined into a single handler using a C# exception filter, eliminating the duplication:

// Aftercatch(Exceptionex)when(exisIOException or UnauthorizedAccessException){Debug.WriteLine($"Best-effort cleanup of deployment directory '{_deploymentDirectory}' failed: {ex}");}

2. SourceGeneratedReflectionOperations.GetSingleAttributeOrDefault — loop consistency (from #9479)

The GetSingleAttributeOrDefault method used a is not T / continue guard, while the two adjacent methods (IsAttributeDefined and GetFirstAttributeOrDefault) that were introduced in the same PR use a direct positive is T match. Aligned the style:

// Before (uses negated guard + continue)if(attris not TAttributematch){continue;}if(firstis not null){throw ...;}first=match;// After (positive match, consistent with adjacent methods)if(attrisTAttributematch){if(firstis not null){throw ...;}first=match;}

Changes Based On

Recent changes from:

Testing

  • ✅ No functional changes — behavior is identical
  • ✅ No tests need updating; the changes are purely structural

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Code Simplifier workflow. · 217.9 AIC · ⌖ 18.3 AIC · ⊞ 9.3K · [◷]( · )

Add this agentic workflows to your repo

To install this agentic workflow, run

gh aw add githubnext/agentics/workflows/code-simplifier.md@main
  • expires on Jun 30, 2026, 2:46 PM UTC

- PackagedAppTestHostHandle: combine two identical IOException /
UnauthorizedAccessException catch blocks into a single handler using
an exception filter (when ex is IOException or UnauthorizedAccessException).
Both handlers had identical bodies; the combined form eliminates the
duplication and uses idiomatic C# exception filters.
- SourceGeneratedReflectionOperations.GetSingleAttributeOrDefault: replace
the 'is not T / continue' guard with a direct 'is T' positive match,
making the loop consistent with the adjacent IsAttributeDefined and
GetFirstAttributeOrDefault methods which use the same positive-match
pattern.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 29, 2026 14:46
@EvangelinkAmaury Levé (Evangelink) added type/automation Created or maintained by an agentic workflow. type/tech-debt Code health, refactoring, simplification. labels Jun 29, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR applies small, targeted refactors in Microsoft.Testing.Platform and MSTestAdapter.PlatformServices to reduce duplication and align local coding style, without changing observable behavior.

Changes:

  • Consolidate two identical catch blocks in PackagedAppTestHostHandle.Dispose() via an exception filter.
  • Adjust GetSingleAttributeOrDefault<TAttribute>’s loop to use a positive type match pattern consistent with adjacent attribute helpers.
Show a summary per file
FileDescription
src/Platform/Microsoft.Testing.Extensions.PackagedApp/PackagedAppTestHostHandle.csReplaces duplicated IOException/UnauthorizedAccessException handlers with a single filtered catch block.
src/Adapter/MSTestAdapter.PlatformServices/SourceGeneration/SourceGeneratedReflectionOperations.csRefactors the attribute scan loop in GetSingleAttributeOrDefault for consistency with neighboring methods.

Review details

  • Files reviewed: 2/2 changed files
  • Comments generated: 0
  • Review effort level: Low

@Evangelink
Amaury Levé (Evangelink) marked this pull request as ready for review June 29, 2026 14:53
@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jun 29, 2026
@Evangelink
Amaury Levé (Evangelink) merged commit 553a2ed into mainJun 29, 2026
24 of 32 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the code-simplifier/simplify-catch-and-attribute-lookup-eee91e25ec8e606b branch June 29, 2026 14:53

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

✅ 22/22 dimensions clean — no findings.

Scope: 2 files, purely structural refactoring — no behavioral change.

  • SourceGeneratedReflectionOperations.cs: early-continue → nested if (attr is TAttribute match) is semantically identical; logic (duplicate-check, then assign) is preserved in the same order.
  • PackagedAppTestHostHandle.cs: catch (Exception ex) when (ex is IOException or UnauthorizedAccessException) captures exactly the same exception types as the two preceding separate catch blocks, with the same handler body.

No public API surface changed, no threading concerns, no localization regressions, no test-isolation issues. The or pattern in the when clause is C# 9, consistent with the net8.0+-only target of Microsoft.Testing.Extensions.PackagedApp.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.type/automationCreated or maintained by an agentic workflow.type/tech-debtCode health, refactoring, simplification.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Evangelink