ソースを参照

Merge pull request #2796 from shohei909/fix-template

Fix haxe.Template macro parsing
Simon Krajewski 11 年 前
コミット
b7e65c87d2
2 ファイル変更29 行追加6 行削除
  1. 16 6
      std/haxe/Template.hx
  2. 13 0
      tests/unit/unitstd/haxe/Template.unit.hx

+ 16 - 6
std/haxe/Template.hx

@@ -139,17 +139,27 @@ class Template {
 			// macro parse
 			var parp = p.pos + p.len;
 			var npar = 1;
-			while( npar > 0 ) {
+			var params = [];
+			var part = "";
+			while( true ) {
 				var c = data.charCodeAt(parp);
-				if( c == 40 )
+				parp++;
+				if( c == 40 ) {
 					npar++;
-				else if( c == 41 )
+				} else if( c == 41 ) {
 					npar--;
-				else if( c == null )
+					if (npar <= 0) break;
+				} else if( c == null ){
 					throw "Unclosed macro parenthesis";
-				parp++;
+				}
+				if ( c == 44 && npar == 1) {
+					params.push(part);
+					part = "";
+				} else {
+					part += String.fromCharCode(c);
+				}
 			}
-			var params = data.substr(p.pos+p.len,parp - (p.pos+p.len) - 1).split(",");
+			params.push(part);
 			tokens.add({ p : splitter.matched(2), s : false, l : params });
 			data = data.substr(parp,data.length - parp);
 		}

+ 13 - 0
tests/unit/unitstd/haxe/Template.unit.hx

@@ -20,4 +20,17 @@ function myfun( resolve : String -> Dynamic, title : String, p : Int ) {
 var t1 = new haxe.Template("Call macro : $$myfun(Hello,::param::)");
 var str = t1.execute({ param : 55, mult : 2 },{ myfun : myfun });
 str == "Call macro : [Hello=110]";
+
+var mcr = {
+	a : function (resolver, s) { return "#" + s; },
+	b : function (resolver, s1, s2) { return "_" + s1 + ":" + s2; }
+};
+
+tpl = new haxe.Template( "$$b(a,$$a(b))" );
+var out3 = tpl.execute({}, mcr);
+out3 == "_a:#b";
+
+tpl = new haxe.Template( "$$a($$b(::a::,b))" );
+var out4 = tpl.execute({a:"abc"}, mcr);
+out4 == "#_abc:b";
 #end