') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); internal: init: implement automated field usage scanning by Jkhall81 · Pull Request #106 · Rust-for-Linux/pin-init · GitHub
Skip to content

internal: init: implement automated field usage scanning - #106

Closed
Jkhall81 wants to merge 1 commit into
Rust-for-Linux:mainfrom
Jkhall81:feat/auto-accessor-scanning
Closed

internal: init: implement automated field usage scanning#106
Jkhall81 wants to merge 1 commit into
Rust-for-Linux:mainfrom
Jkhall81:feat/auto-accessor-scanning

Conversation

@Jkhall81

Copy link
Copy Markdown

Summary

Automatically scans the initializer to see which fields are actually used, preventing errors on packed structs.

Closes#98

Signed-off-by: jkhall81 <jason.kei.hall@gmail.com>
@Jkhall81
Jkhall81force-pushed the feat/auto-accessor-scanning branch from 6ed15b4 to bc2e3f0CompareFebruary 1, 2026 02:08
@Jkhall81

Copy link
Copy Markdown
Author

Fixed the cargo fmt --check --all stuff, manually. I need to figure out how or make something to do that automatically. There was a ui test failure tests/ui/compile-fail/init/packed_struct.rs. That compiles now. So I deleted the .rs and .stderr for that. Now there is just this MSRV (1.78) issue. What I tried just now didn't fix it. I'll look at it in the morning.

@BennoLossin

Copy link
Copy Markdown
Member

Hey! Sorry for the wait, thanks for the PR!

The issue with 1.78 should be easily resolvible, since we merged #102, you might just need to enable the correct feature in the test.

As for the implementation itself, I'm not sure that we want to do it this way, because it will have both false positives and false negatives:

  • false positive: init!(Struct { field: field::new(), other: 42 }) where field also is a module.
  • false negative: init!(Struct { field: Field::new(), other: dma_read!(field) }) since macro token streams are skipped by visitors by default.

I'm not so sure if it's a good idea to create a very clever parser here to also avoid closure variables and other item definitions. (we wouldn't want a helper function declared inside of a code block that reuses a field name as a parameter to trigger it) I'll have to think a bit more about this.

@BennoLossin

Copy link
Copy Markdown
Member

I totally forgot to inform you about the fact that Gary found an unsoundness related to field accessors. I'm going to merge #111 soon -- the fix for the problem. It conflicts with this PR, since now guards are always required for soundness.

Sorry for the inconvenience and thanks for trying to improve pin-init!

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

Labels

None yet

Development

Successfully merging this pull request may close these issues.

Only create accessors for initialized fields if it would be used

2 participants

@Jkhall81@BennoLossin