Release 1.4.0
Added
- The bitwise NOT operation (
~
): PR #337 - Augmented assignment bitwise operators
|=
,&=
,^=
: PR #350 - Traversing maps from contract storage and structs is now allowed: PR #389
- The
loadBool
method forSlice
type: PR #412 - CLI flag
--with-decompilation
to turn on decompilation of BoC files at the end of the compilation pipeline: PR #417 - Support more Tact expressions in the constant evaluator: conditional expressions, struct instances, struct field accesses,
emptyMap()
: PR #432 and PR #445 - The
fromCell
andfromSlice
methods for struct and message parsing: PR #418 and PR #454 - The
return
-statement reachability analysis now takes into account thethrow
andnativeThrow
functions: PR #447
Changed
- Trailing semicolons in struct and message declarations are optional now: PR #395
- Tests are refactored and renamed to convey the sense of what is being tested and to reduce the amount of merge conflicts during development: PR #402
let
-statements can now be used without an explicit type declaration and determine the type automatically if it was not specified: PR #198 and PR #438- The outdated TextMate-style grammar files for text editors have been removed (the most recent grammar files can be found in the tact-sublime repo): PR #404
- The JSON schema for
tact.config.json
has been moved to theschemas
project folder: PR #404 - Allow underscores as unused variable identifiers: PR #338
- The default compilation mode does not decompile BoC files anymore, to additionally perform decompilation at the end of the pipeline, set the
fullWithDecompilation
mode in themode
project properties oftact.config.json
: PR #417 - Trait lists, parameters and arguments in the Tact grammar were assigned their own names in the grammar for better readability and code deduplication: PR #422
- The semicolon (
;
) terminating a statement is optional if the statement is the last one in the statement block: PR #434
Fixed
- Return type of
skipBits
now matches FunC and does not lead to compilation errors: PR #388 - Typechecking of conditional expressions when one branch's type is a subtype of another, i.e. for optionals and maps/
null
: PR #394 - Typechecking of conditional expressions when the types of their branches can be generalized, i.e. for non-optionals and
null
can be inferred an optional type: PR #429 - External fallback receivers now work properly: PR #408
Int as coins
as a value type of a map in persistent storage does not throw compilation error anymore: PR #413- The semantics of the Tact arithmetic operations in the constant evaluator to perform rounding towards negative infinity: PR #432
- Better error messages for the
void
type: PR #442 - Fixed the native function binding for the stdlib function
nativeThrowWhen
(it needed to bethrow_if
instead ofthrow_when
) and also renamed it tonativeThrowIf
for consistency with FunC: PR #451
Release contributors
Special thanks
For opening numerous issues and making thoughtful suggestions we'd like to thank