') + ')', '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); } })(); })(); chore: adopt unlaxer-dsl 3.0.7 — StringConcat/BooleanEquality operand widening (#32) by opaopa6969 · Pull Request #41 · opaopa6969/tinyexpression · GitHub
Skip to content

chore: adopt unlaxer-dsl 3.0.7 — StringConcat/BooleanEquality operand widening (#32) - #41

Merged
opaopa6969 merged 1 commit into
masterfrom
chore/unlaxer-3.0.7
Jun 26, 2026
Merged

chore: adopt unlaxer-dsl 3.0.7 — StringConcat/BooleanEquality operand widening (#32)#41
opaopa6969 merged 1 commit into
masterfrom
chore/unlaxer-3.0.7

Conversation

@opaopa6969

Copy link
Copy Markdown
Owner

概要

unlaxer-dsl 3.0.7(parser PR #46)を採用。透過 mapped choice を operand に持つ assoc fold が operand を Object と推論し、mapTransparentValue で実 AST ノードへ解決するようになった。これにより StringConcatExpr.rightList<Object>BooleanEqualityExpr.left/rightObject になる。

変更点

  • pom.xml: unlaxer-common / unlaxer-dsl を 3.0.7 に。
  • P4TypedAstEvaluator / P4TypedJavaCodeEmitter / P4DefaultJavaCodeEmitter:
    • evalStringConcatExpr: node.right()List<Object> で受ける(resolveStringLeaf(Object) / renderStringLeaf(Object) は既存)。
    • BooleanEqualityExpr: resolveBooleanSourceOperand / renderBooleanOperandSourceObject オーバーロードを追加。実 AST ノードは直接 eval、それ以外(source テキスト)は従来の source-snippet 経路へフォールバック。if-source shadow は外していない。

string concat / boolean-equality の operand が source 再パースでなく AST 経路で忠実に評価される。

検証

注: Central→repo1 同期ラグ(~15-60分)で CI が一時赤になる場合あり。同期後に rerun。

🤖 Generated with Claude Code

…erands to Object node (#32)
unlaxer-dsl 3.0.7 infers transparent-choice assoc operands as Object and
resolves them to real AST nodes via mapTransparentValue (parser PR #46), so
StringConcatExpr.right and BooleanEqualityExpr.left/right are now Object.
- evalStringConcatExpr: node.right() is List<Object>.
- BooleanEqualityExpr: add Object overload of resolveBooleanSourceOperand /
renderBooleanOperandSource that evals a real node directly and falls back to
the existing source-snippet path for text (if-source shadow unchanged).
String concatenation and boolean-equality operands now evaluate faithfully on
the AST instead of via a source re-parse. mvn verify green (check-test-baseline
gate OK; only known #38 ternary failure remains).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@opaopa6969