Downloading Haxe 4.0.0-preview.4

If your download does not begin automatically please click here.

Support the Haxe Foundation

Thank you for downloading Haxe. If you'd like to support the Haxe Foundation please consider donating to keep our open source efforts thriving.

Monthly Donation Amount

Get Technical Help

Get support directly from the Haxe team. The Haxe Foundation offers several support tiers to help with your organization's technical challenges.

Explore our support plans

What next?

Release Notes

Dear Community,

On behalf of the Haxe Foundation, we are proud to announce the official release of the Haxe 4.0.0-preview.4! It is available along with the changelog at

As a preview release, it should not be considered stable. However, we appreciate anyone testing this version which will help us with the real Haxe 4 release. Please report any issues here:

Thank you very much for your help!

Improved compiler display services

Our focus for this release has been compiler display services. We implemented a new, JSON-RPC-based protocol which is utilized by the vshaxe Visual Studio Code Extension to provide a variety of new features:

  • Support for auto-import
  • Completion on override |
  • Completion for structure field names
  • Support for auto-generating structure declarations, functions, switches and more
  • Context-aware, sorted toplevel completion
  • Reference finding which explores modules that are not necessarily part of the compilation

Improved enum abstracts

Enum abstracts now get the treatment they deserve with a proper enum abstract syntax. Furthermore, values can now be omitted if the enum abstract is defined over Int or String:

enum abstract MyEnum(String) {
    var MyValue; // implicit = "MyValue"

enum abstract MyOtherEnum(Int) {
    var MyValue0; // implicit = 0
    var MyValue1; // implicit = 1
    var MyValue5 = 5;
    var MyValue6; // implicit = 6

Various syntactic improvements

  • extern is now recognized as a field-level modifier and can be used instead of @:extern
  • Metadata names can now use dots, e.g. @:haxe.json becomes a metadata entry named "haxe.json"
  • Structure fields now consistently allow var ?x and final ?x, meaning the same as @:optional var x
  • Type1 & Type2 is now a recognized syntax for intersection types. For the time being, it is only supported to merge structures (replacing the { >Type1, >Type2, } syntax) and for type parameter constraints (replacing T:(Type1, Type2) which has been removed from the language).

Lots of bugfixes

See the changelog for more!

Change Log

2018-06-12: 4.0.0-preview.4

New features:

  • all : added JSON-RPC-based display protocol
  • all : allow enum abstract syntax instead of @:enum abstract (#4282)
  • all : allow extern on fields instead of @:extern
  • all : support signature completion on incomplete structures (#5767)
  • all : support auto-numbering and auto-stringification in enum abstracts (#7139)
  • all : support Type1 & Type2 intersection syntax for type parameter constraints and structures (#7127)

General improvements and optimizations:

  • all : reworked CLI usage/help output (#6862)
  • all : implemented for loop unrolling (#3784)
  • all : metadata can now use ., e.g. @:a.b. This is represented as a string (#3959)
  • all : [breaking] disallow static extensions on implicit this (#6036)
  • all : allow true and false expressions as type parameters (#6958)
  • all : improved display support in many areas
  • all : support override | completion
  • all : make display/references and display/toplevel actually work sometimes
  • all : allow var ?x and final ?x parsing in structures (#6947)
  • all : improved overall robustness of the parser in display mode
  • all : allow @:commutative on non-static abstract functions (#5599)
  • js : added externs for js.Date (#6855)
  • js : respect -D source-map flag to generate source maps in release builds
  • js : enums are now generated as objects instead of arrays (#6350)
  • eval : improved debugger, support conditional breakpoints


  • all : moved haxe.remoting to hx3compat
  • js : moved js.XMLSocket to hx3compat
  • neko : moved to hx3compat
  • all : removed support for T:(A, B) constraint syntax


  • all : fixed various issues with diagnostics
  • all : fixed fields with default values for @:structInit classes (#5449)
  • all : fixed Null<T> inconsistency in if/ternary expressions (#6955)
  • all : fixed visibility check related to private constructors of sibling classes (#6957)
  • all : fixed @:generic naming (#6968)
  • all : fixed handling of type parameters in local functions (#6560)
  • all : fixed resolution order between untyped and type parameters (#7113)
  • all : fixed unification behavior in try/catch expressions (#7120)
  • all : fixed field type being lost for Int expressions on Float fields (#7132)
  • all : cleaned up inline handling (#7155)
  • display : fixed completion in packages starting with underscore (#5417)
  • php : fixed Reflect.callMethod with classes as first argument (#7106)
  • eval : fixed internal exception surfacing in some context calls (#7007)
  • eval : fixed Type.enumEq (#6710)
  • flash : fixed silently swallowing exceptions in getters/setters when invoked with Reflect methods (#5460, #6871)

Standard Library:

  • all : added resize to Array (#6869)
  • all : [breaking] removed return this from some haxe.Http methods (#6980)

Getting Started With Haxe

Now that you've downloaded Haxe, you can get started with a specific platform. Click on a logo to learn how to set up the development environment and how to proceed from there:

For getting started with Haxe, take a look at our introduction, read through the Haxe Manual or look at these use cases for Haxe, including tutorials and popular libraries: