fix: hoist our/state declarations in statement modifiers (if/unless)#490
Merged
fix: hoist our/state declarations in statement modifiers (if/unless)#490
Conversation
The parser's handleStatementModifierWithMy only handled 'my' declarations, not 'our' or 'state'. This caused 'our $DEBUG = 0 unless defined $DEBUG' to be transformed into 'defined($DEBUG) || (our $DEBUG = 0)', placing the $DEBUG reference before the our declaration. Under use strict, this produced "Global symbol requires explicit package name". The fix extends the check to handle my, our, and state uniformly: our $X = EXPR unless COND -> (our $X, COND || ($X = EXPR)) This unblocks Template Toolkit 3.102 which uses this pattern in 16 files. Generated with [Devin](https://cli.devin.ai/docs) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
58e3da9 to
c8d065d
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
ourandstatevariable declarations with statement modifiers (if/unless)handleStatementModifierWithMyonly handledmydeclarations, causingour $DEBUG = 0 unless defined $DEBUGto fail underuse strictwith "Global symbol requires explicit package name"my,our, andstateuniformly by hoisting the declaration before the condition:our $X = EXPR unless COND→(our $X, COND || ($X = EXPR)).pmfiles —Makefile.PLnow runs successfullydev/modules/template.mdwith Fix 10 and current statusFiles changed
StatementResolver.javahandleStatementModifierWithMyto handleour/statestatement.tour/statewithif/unlessmodifierstemplate.mdTest plan
makepasses (all unit tests green)./jperl -e 'use strict; our $X = 1 unless defined $X; print "ok\n"'works./jcpan -t Templategets past Makefile.PL and runs full test suiteourwithunless,ourwithif,ourpreserving pre-defined values, andstatewithunlessNote on remaining Template Toolkit failures
After this fix, 85/106 Template Toolkit tests pass. The 21 failing tests are all caused by premature
DESTROYfiring onTemplate::Context— a separate refCount tracking issue being fixed on another branch.Generated with Devin