Releases: prettier-solidity/prettier-plugin-solidity
v2.0.0-beta.7
What's Changed
Full Changelog: 2.0.0-beta.6...v2.0.0-beta.7
v1.4.2
New features
Format changes
// Original
import * as SomeSymbol from "AnotherFile.sol";
// [email protected]
import "AnotherFile.sol" as SomeSymbol;
// [email protected]
import * as SomeSymbol from "AnotherFile.sol";Breaking changes
Full Changelog: v1.4.1...v1.4.2
v2.0.0-beta.5
Smaller bundled file size and performance improvements.
v2.0.0-beta.4
Fix a bug in the previous release with the unpkg endpoint.
v2.0.0-beta.3
Features
- Support for Slang 18
- Support for the browser was added back
Breaking changes
- Slang provides a wasm endpoint that relies on ESM features. Therefore we had to drop UMD and CommonJS support in order to bundle a package for the browser.
v2.0.0-beta.2
Moving closer to a release candidate, this pre-release adds the following features:
- Support for
@nomicfoundation/[email protected]#1043 - Infer solidity version from source code #1047
v1.4.1
@pcaversaccio let us know that one of our formatting decisions was formatting an expected result so this was quickly reverted to the previous standard.
// Input
contract Comments {
function ifElse() public {
if (condition) {
// ...
} // Reason for else case
else {
// ...
}
}
}
// v1.4.0
contract Comments {
function ifElse() public {
if (condition) {
// ...
} else {
// Reason for else case
// ...
}
}
}
// v1.4.1
contract Comments {
function ifElse() public {
if (condition) {
// ...
} // Reason for else case
else {
// ...
}
}
}v1.4.0
As we are preparing for a version 2.0.0 of this plugin there were a few tweaks in the formatting that we needed to address before proceeding forward.
Empty assembly blocks
// Input
contract Assembly {
function assemblyEmptyBlocks() public {
assembly {}
assembly {
for {} lt(x, y) {} {}
}
}
}
// v1.3.1
contract Assembly {
function assemblyEmptyBlocks() public {
assembly {
}
assembly {
for {
} lt(x, y) {
} {
}
}
}
}
// v1.4.0
contract Assembly {
function assemblyEmptyBlocks() public {
assembly {}
assembly {
for {} lt(x, y) {} {}
}
}
}Assembly stack assignments
In versions of Solidity prior to v0.5.0 there was a syntax called stack assignment where the last value of the stack would be allocated to a variable. This statement is independent of what happens before it but in some cases the developer could write it in the same line as the last statement.
So far we have been formatting this in the same line as the previous statement but since in v2.0.0 we will have access to an AST much closer to the actual grammar of solidity, it makes more sense to keep it in a separate statement.
// Input
contract Assembly {
function stackAssignment() public {
assembly {
4 =: y
}
}
}
// v1.3.1
contract Assembly {
function assemblyEmptyBlocks() public {
assembly {
4 =: y
}
}
}
// v1.4.0
contract Assembly {
function assemblyEmptyBlocks() public {
assembly {
4
=: y
}
}
}HexLiterals in multiple lines
Solidity allows to declare long HexLiterals as a list of HexLiterals separated by white space. The only reason for using this feature is to display said HexLiteral in multiple lines.
// Input
contract HexLiteral {
bytes8 hex1 = hex'Dead' hex'Beef';
}
// v1.3.1
contract Assembly {
bytes8 hex1 = hex'Dead' hex'Beef';
}
// v1.4.0
contract Assembly {
bytes8 hex1 =
hex'Dead'
hex'Beef';
}Modifier Definitions and Function TypeNames
These 2 cases should format in the same way a function definition does but they remained with separate behaviours.
// Input
contract ModifierDefinitions {
modifier long() override(Foo , Bar, Baz, Very, VeryVery, VeryLong, OverrideList) { _; }
modifier threeParams(uint a, uint b, uint c) {}
}
// v1.3.1
contract ModifierDefinitions {
modifier long()
override(
Foo,
Bar,
Baz,
Very,
VeryVery,
VeryLong,
OverrideList
) {
_;
}
modifier threeParams(
uint a,
uint b,
uint c
) {}
}
// v1.4.0
contract ModifierDefinitions {
modifier long()
override(
Foo,
Bar,
Baz,
Very,
VeryVery,
VeryLong,
OverrideList
)
{
_;
}
modifier threeParams(uint a, uint b, uint c) {}
}// Input
contract FunctionTypeNames {
struct StructWithFunctionTypes {
function(bytes32, bytes32, bytes32, bytes32, bytes32, bytes32) internal view[] d;
}
}
// v1.3.1
contract FunctionTypeNames {
struct StructWithFunctionTypes {
function(bytes32, bytes32, bytes32, bytes32, bytes32, bytes32)
internal
view[] d;
}
}
// v1.4.0
contract FunctionTypeNames {
struct StructWithFunctionTypes {
function(
bytes32,
bytes32,
bytes32,
bytes32,
bytes32,
bytes32
) internal view[] d;
}
}There are no comments for the else keyword
As we moved into v2.0.0 we got to review many of the formatting prettier inspired us that were in the backlog.
This particular decision had already been changed prettier and we base our work on old code released by prettier. @pcaversaccio very diligently let us notice that this could not be reproduced in prettier, therefore it was quickly reverted in v1.4.1
// Input
contract Comments {
function ifElse() public {
if (condition) {
// ...
} // Reason for else case
else {
// ...
}
}
}
// v1.3.1
contract Comments {
function ifElse() public {
if (condition) {
// ...
} // Reason for else case
else {
// ...
}
}
}
// v1.4.0
contract Comments {
function ifElse() public {
if (condition) {
// ...
} else {
// Reason for else case
// ...
}
}
}v1.3.1
Needed to put a specific experimentalTernaries behaviour behind a feature flag. (thanks @pcaversaccio)
v1.3.0
This version ships with 2 substantial changes.
- The parser had a great improvement in size package making our bundled size go from 773.5 KB to 417 KB and 90 KB gzipped, making our support for browser more impactful. (#967)
- We embraced prettier's ternaries formatting improvements and support the new option
externalTernaries, so we invite people to start experimenting with it and give us some feedback. (#953)