diff --git a/CHANGELOG.md b/CHANGELOG.md index 97fcdb0bb..dd0bef198 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ All notable changes to this project will be documented in this file. - AS3 - super properties resolving - AS3 - line numbering on pushback string on regexp - AS3 Direct editation - removing method bodies after unsuccessful edit +- [#1936] AS3 - Parentheses around function definition call ## [18.3.2] - 2023-01-10 ### Removed @@ -2879,6 +2880,7 @@ All notable changes to this project will be documented in this file. [#1894]: https://www.free-decompiler.com/flash/issues/1894 [#1801]: https://www.free-decompiler.com/flash/issues/1801 [#1892]: https://www.free-decompiler.com/flash/issues/1892 +[#1936]: https://www.free-decompiler.com/flash/issues/1936 [#1935]: https://www.free-decompiler.com/flash/issues/1935 [#1931]: https://www.free-decompiler.com/flash/issues/1931 [#1934]: https://www.free-decompiler.com/flash/issues/1934 diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/CallAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/CallAVM2Item.java index a56fc716f..813cc4c3b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/CallAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/CallAVM2Item.java @@ -206,7 +206,7 @@ public class CallAVM2Item extends AVM2Item { if (receiver instanceof ThisAVM2Item) { recPart = ""; }*/ - if (function.getPrecedence() > precedence) { + if (function.getPrecedence() > precedence || (function instanceof NewFunctionAVM2Item)) { writer.append("("); function.toString(writer, localData); writer.append(")"); diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicAirDecompileTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicAirDecompileTest.java index 008384201..4b8019f67 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicAirDecompileTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicAirDecompileTest.java @@ -1216,6 +1216,31 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile false); } + @Test + public void testInlineFunctions2() { + decompileMethod("classic_air", "testInlineFunctions2", "var f:* = function(a:int):int\r\n" + + "{\r\n" + + "return a + 1;\r\n" + + "};\r\n" + + "var g:Function = function(a:int):int\r\n" + + "{\r\n" + + "return a + 1;\r\n" + + "};\r\n" + + "var h:Function = (function():*\r\n" + + "{\r\n" + + "var h2:Function;\r\n" + + "return h2 = function(a:int):int\r\n" + + "{\r\n" + + "return a + 1;\r\n" + + "};\r\n" + + "})();\r\n" + + "(function(a:int):int\r\n" + + "{\r\n" + + "return a + 1;\r\n" + + "})(1);\r\n", + false); + } + @Test public void testInnerFunctionScope() { decompileMethod("classic_air", "testInnerFunctionScope", "var innerFunc:Function = function(b:String):*\r\n" @@ -1351,14 +1376,14 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile @Test public void testNamedAnonFunctions() { - decompileMethod("classic_air", "testNamedAnonFunctions", "var test:* = new (function():*\r\n" + decompileMethod("classic_air", "testNamedAnonFunctions", "var test:* = (function():*\r\n" + "{\r\n" + "var testFunc:Function;\r\n" + "return testFunc = function(param1:*, param2:int, param3:Array):Boolean\r\n" + "{\r\n" + "return (param1 as TestClass2).attrib1 == 5;\r\n" + "};\r\n" - + "}())();\r\n", + + "})();\r\n", false); } diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicDecompileTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicDecompileTest.java index b923fdf14..1c22feadd 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicDecompileTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicDecompileTest.java @@ -1216,6 +1216,27 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes false); } + @Test + public void testInlineFunctions2() { + decompileMethod("classic", "testInlineFunctions2", "var f:Function = function(a:int):int\r\n" + + "{\r\n" + + "return a + 1;\r\n" + + "};\r\n" + + "var g:Function = function(a:int):int\r\n" + + "{\r\n" + + "return a + 1;\r\n" + + "};\r\n" + + "var h:Function = function h2(a:int):int\r\n" + + "{\r\n" + + "return a + 1;\r\n" + + "};\r\n" + + "(function(a:int):int\r\n" + + "{\r\n" + + "return a + 1;\r\n" + + "})(1);\r\n", + false); + } + @Test public void testInnerFunctionScope() { decompileMethod("classic", "testInnerFunctionScope", "var innerFunc:Function = function(b:String):*\r\n" @@ -1351,7 +1372,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes @Test public void testNamedAnonFunctions() { - decompileMethod("classic", "testNamedAnonFunctions", "var test:* = new function testFunc(param1:*, param2:int, param3:Array):Boolean\r\n" + decompileMethod("classic", "testNamedAnonFunctions", "var test:* = function testFunc(param1:*, param2:int, param3:Array):Boolean\r\n" + "{\r\n" + "return (param1 as TestClass2).attrib1 == 5;\r\n" + "};\r\n", diff --git a/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.air.swf b/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.air.swf index d3504faf6..2ffaaeb24 100644 Binary files a/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.air.swf and b/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.air.swf differ diff --git a/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.flex.swf b/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.flex.swf index 594f35119..f19e19b3a 100644 Binary files a/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.flex.swf and b/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.flex.swf differ diff --git a/libsrc/ffdec_lib/testdata/as3_new/src/Main.as b/libsrc/ffdec_lib/testdata/as3_new/src/Main.as index d695fddef..cb9e5050f 100644 --- a/libsrc/ffdec_lib/testdata/as3_new/src/Main.as +++ b/libsrc/ffdec_lib/testdata/as3_new/src/Main.as @@ -72,6 +72,7 @@ package TestInc2; TestIncDec; TestInlineFunctions; + TestInlineFunctions2; TestInnerFunctions; TestInnerFunctionScope; TestInnerIf; diff --git a/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestHello.as b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestHello.as index 32a289232..bbce509f0 100644 --- a/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestHello.as +++ b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestHello.as @@ -5,7 +5,7 @@ package tests { public function run():* { - trace("hello"); + trace("hello"); } } } \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestInlineFunctions2.as b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestInlineFunctions2.as new file mode 100644 index 000000000..a06b28530 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestInlineFunctions2.as @@ -0,0 +1,25 @@ +package tests +{ + + public class TestInlineFunctions2 + { + public function run():* + { + function f(a:int):int { + return a + 1; + } + + var g:Function = function(a:int):int { + return a + 1; + }; + + var h:Function = function h2(a:int):int { + return a + 1; + }; + + (function(a:int):int { + return a + 1; + })(1); + } + } +} diff --git a/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestNamedAnonFunctions.as b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestNamedAnonFunctions.as index 4b0b8096b..6e7cb644b 100644 --- a/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestNamedAnonFunctions.as +++ b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestNamedAnonFunctions.as @@ -4,7 +4,7 @@ package tests { public function run() : * { - var test:* = new function testFunc(param1:*, param2:int, param3:Array):Boolean + var test:* = function testFunc(param1:*, param2:int, param3:Array):Boolean { return (param1 as TestClass2).attrib1 == 5; };