fix: avoid variable shadowing in nested mixin calls with same parameter name
When a mixin calls another mixin passing a variable with the same name as the parameter (e.g., +alert(message) where alert has param message), skip generating redundant const declaration since the variable is already in scope. Also adds missing alert.pug mixin for demo project.
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
.{
|
.{
|
||||||
.name = .pugz,
|
.name = .pugz,
|
||||||
.version = "0.1.5",
|
.version = "0.1.6",
|
||||||
.fingerprint = 0x822db0790e17621d, // Changing this has security and trust implications.
|
.fingerprint = 0x822db0790e17621d, // Changing this has security and trust implications.
|
||||||
.minimum_zig_version = "0.15.2",
|
.minimum_zig_version = "0.15.2",
|
||||||
.dependencies = .{},
|
.dependencies = .{},
|
||||||
|
|||||||
5
examples/demo/views/mixins/alert.pug
Normal file
5
examples/demo/views/mixins/alert.pug
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
mixin alert(message)
|
||||||
|
div.alert(role="alert" class!=attributes.class)
|
||||||
|
svg(xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 shrink-0 stroke-current" fill="none" viewBox="0 0 24 24")
|
||||||
|
path(stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z")
|
||||||
|
span= message
|
||||||
2
examples/demo/views/mixins/alert_error.pug
Normal file
2
examples/demo/views/mixins/alert_error.pug
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
mixin alert_error(message)
|
||||||
|
+alert(message)(class="alert-error")
|
||||||
@@ -24,3 +24,5 @@ block content
|
|||||||
br
|
br
|
||||||
+input_text("lastName", "Last Name", "last name")
|
+input_text("lastName", "Last Name", "last name")
|
||||||
submit sumit
|
submit sumit
|
||||||
|
if error
|
||||||
|
+alert_error(error)
|
||||||
|
|||||||
@@ -1336,21 +1336,26 @@ const Compiler = struct {
|
|||||||
var ident_buf: [64]u8 = undefined;
|
var ident_buf: [64]u8 = undefined;
|
||||||
const safe_param = escapeIdent(param, &ident_buf);
|
const safe_param = escapeIdent(param, &ident_buf);
|
||||||
|
|
||||||
try self.writeIndent();
|
|
||||||
if (i < call.args.len) {
|
if (i < call.args.len) {
|
||||||
// Argument provided
|
// Argument provided
|
||||||
const arg = call.args[i];
|
const arg = call.args[i];
|
||||||
// Check if it's a string literal
|
// Check if it's a string literal
|
||||||
if (arg.len >= 2 and (arg[0] == '"' or arg[0] == '\'')) {
|
if (arg.len >= 2 and (arg[0] == '"' or arg[0] == '\'')) {
|
||||||
|
try self.writeIndent();
|
||||||
try self.writer.print("const {s} = {s};\n", .{ safe_param, arg });
|
try self.writer.print("const {s} = {s};\n", .{ safe_param, arg });
|
||||||
} else {
|
} else {
|
||||||
// It's a variable reference
|
// It's a variable reference
|
||||||
var accessor_buf: [512]u8 = undefined;
|
var accessor_buf: [512]u8 = undefined;
|
||||||
const accessor = self.buildAccessor(arg, &accessor_buf);
|
const accessor = self.buildAccessor(arg, &accessor_buf);
|
||||||
try self.writer.print("const {s} = {s};\n", .{ safe_param, accessor });
|
// Skip declaration if accessor equals param name (already in scope)
|
||||||
|
if (!std.mem.eql(u8, accessor, safe_param)) {
|
||||||
|
try self.writeIndent();
|
||||||
|
try self.writer.print("const {s} = {s};\n", .{ safe_param, accessor });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (i < mixin_def.defaults.len) {
|
} else if (i < mixin_def.defaults.len) {
|
||||||
// Use default value
|
// Use default value
|
||||||
|
try self.writeIndent();
|
||||||
if (mixin_def.defaults[i]) |default| {
|
if (mixin_def.defaults[i]) |default| {
|
||||||
try self.writer.print("const {s} = {s};\n", .{ safe_param, default });
|
try self.writer.print("const {s} = {s};\n", .{ safe_param, default });
|
||||||
} else {
|
} else {
|
||||||
@@ -1358,6 +1363,7 @@ const Compiler = struct {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// No value - use empty string
|
// No value - use empty string
|
||||||
|
try self.writeIndent();
|
||||||
try self.writer.print("const {s} = \"\";\n", .{safe_param});
|
try self.writer.print("const {s} = \"\";\n", .{safe_param});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user