as3hx
Convert ActionScript 3 to Haxe 3 code.
Note: This repository is no longer actively maintained. Please refer to https://github.com/innogames/ax3 as an alternative!
Build
You'll need Haxe 3.* to build the project and Neko 2.* to run it.
haxe --no-traces as3hx.hxml
Build the as3hx tool.
haxe -debug as3hx.hxml
Build with debug output when converting files.
Use
neko run.n test/ out/
This will take all the ActionScript 3 files in the test/ directory and generate the corresponding Haxe files in out/
To generate the tests you can also use :
make run-test
This will generate the tests in test-out
To get the basic tool usage :
neko run.n -help
Config
There are many configuration options to choose how the Haxe code is generated, check the src/as3hx/Config.hx file for the full list.
as3hx looks for, or creates, a config file in your home directory called ".as3hx_config.xml". You can also create one in the directory you are running as3hx from, which will override the home file.
Licence
MIT, see LICENCE.md
Current failures:
'delete' keyword:
In ActionScript, the delete
keyword will cause an intentional failure in the
generated .hx file. Take a close look at the object being deleted.
- if it is a local variable, replace
delete varname
withvarname = null
- if it is a class member variable, remove the
delete
entirely - it it is an E4X (FastXML), well, hmmm... still working on that one.
Senocular did a little writeup on delete
that might make it more clear
http://www.kirupa.com/forum/showthread.php?223798-ActionScript-3-Tip-of-the-Day/page3
E4X:
E4X is currently partly done. This will fail in some cases, just examine source and output carefully.
For Initializations:
The output of
if (true) {
for (var i:uint = 0; i < 7; i++)
val += "0";
} else {
for (i = 0; i < 8; i++)
val += "0";
}
is
if (true) {
var i:UInt = 0;
while (i < 7) {
val += "0";
i++;
}
} else {
i = 0;
while (i < 8) {
val += "0";
i++;
}
}
As you can see, the scope of i
in Flash is not the same as in Haxe,
so the else
section will produce Unknown identifier : i. The solution
is to move the var i : UInt = 0;
outside of the blocks in the generated
code.
This can not be avoided by always creating the i
variable, as the code
for (var i:uint = 0; i < 7; i++)
val += "0";
for (i = 0; i < 8; i++)
val += "0";
would then produce a double initialization of i
, also causing a compiler error.
var i:UInt = 0;
while (i < 7) {
val += "0";
i++;
}
var i = 0;
while (i < 8) {
val += "0";
i++;
}