Skip to content
This repository has been archived by the owner on Aug 31, 2023. It is now read-only.

Commit

Permalink
feat(rome_js_parser): EcmaScript @decorators #4252
Browse files Browse the repository at this point in the history
  • Loading branch information
denbezrukov committed Apr 17, 2023
1 parent 1f319e1 commit 71d67a3
Show file tree
Hide file tree
Showing 16 changed files with 348 additions and 848 deletions.
Expand Up @@ -23,7 +23,7 @@ export default @decorator class {}
-@decorator
+export @decorator
class Foo {}

-export default
-@decorator
-class {}
Expand Down
@@ -1,6 +1,5 @@
---
source: crates/rome_formatter_test/src/snapshot_builder.rs
assertion_line: 212
info: js/decorators/class-expression/arguments.js
---

Expand Down Expand Up @@ -42,41 +41,4 @@ console.log(@deco class Foo {});
console.log(@deco class {});
```

# Errors
```
arguments.js:1:13 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
× expected an expression but instead found '@deco class Foo {}'
> 1 │ console.log(@deco class Foo {})
│ ^^^^^^^^^^^^^^^^^^
2 │ console.log(@deco class {})
3 │
i Expected an expression here
> 1 │ console.log(@deco class Foo {})
│ ^^^^^^^^^^^^^^^^^^
2 │ console.log(@deco class {})
3 │
arguments.js:2:13 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
× expected an expression but instead found '@deco class {}'
1 │ console.log(@deco class Foo {})
> 2 │ console.log(@deco class {})
│ ^^^^^^^^^^^^^^
3 │
i Expected an expression here
1 │ console.log(@deco class Foo {})
> 2 │ console.log(@deco class {})
│ ^^^^^^^^^^^^^^
3 │
```


@@ -1,6 +1,5 @@
---
source: crates/rome_formatter_test/src/snapshot_builder.rs
assertion_line: 212
info: js/decorators/class-expression/class-expression.js
---

Expand Down Expand Up @@ -30,7 +29,7 @@ const b2 = []
```diff
--- Prettier
+++ Rome
@@ -1,35 +1,26 @@
@@ -1,34 +1,18 @@
-const a1 =
- (
- @deco
Expand All @@ -41,292 +40,64 @@ const b2 = []
- @deco
- class {}
- );
+const a1 = (
+@deco class Foo {}
+)
+const a2 = (
+@deco class {}
+)

(
+const a1 = @deco class Foo {};
+const a2 = @deco class {};

-(
- @deco
- class Foo {}
-);
+@deco class Foo {}
+)
(
-(
- @deco
- class {}
-);
+@deco class {}
+)

+(@deco
+class Foo {});
+(@deco
+class {});

const b1 = [];
(
-(
- @deco
- class Foo {}
-);
+@deco class Foo {}
+)

+(@deco
+class Foo {});
const b2 = [];
(
-(
- @deco
- class {}
-);
+@deco class {}
+)

+(@deco
+class {});
// This is not a `ClassExpression` but `ClassDeclaration`
-@deco
-class Foo {}
+@deco class Foo {}
@deco
```

# Output

```js
const a1 = (
@deco class Foo {}
)
const a2 = (
@deco class {}
)
const a1 = @deco class Foo {};
const a2 = @deco class {};

(
@deco class Foo {}
)
(
@deco class {}
)
(@deco
class Foo {});
(@deco
class {});

const b1 = [];
(
@deco class Foo {}
)
(@deco
class Foo {});

const b2 = [];
(
@deco class {}
)
(@deco
class {});

// This is not a `ClassExpression` but `ClassDeclaration`
@deco class Foo {}
```

# Errors
```
class-expression.js:1:13 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
× expected `)` but instead found `@`
> 1 │ const a1 = (@deco class Foo {});
│ ^
2 │ const a2 = (@deco class {});
3 │
i Remove @
class-expression.js:1:31 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
× expected a statement but instead found ')'
> 1 │ const a1 = (@deco class Foo {});
│ ^
2 │ const a2 = (@deco class {});
3 │
i Expected a statement here
> 1 │ const a1 = (@deco class Foo {});
│ ^
2 │ const a2 = (@deco class {});
3 │
class-expression.js:2:13 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
× expected `)` but instead found `@`
1 │ const a1 = (@deco class Foo {});
> 2 │ const a2 = (@deco class {});
│ ^
3 │
4 │ (@deco class Foo {});
i Remove @
class-expression.js:2:19 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
× class declarations must have a name
1 │ const a1 = (@deco class Foo {});
> 2 │ const a2 = (@deco class {});
│ ^^^^^^
3 │
4 │ (@deco class Foo {});
class-expression.js:2:27 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
× expected a statement but instead found ')'
1 │ const a1 = (@deco class Foo {});
> 2 │ const a2 = (@deco class {});
│ ^
3 │
4 │ (@deco class Foo {});
i Expected a statement here
1 │ const a1 = (@deco class Foo {});
> 2 │ const a2 = (@deco class {});
│ ^
3 │
4 │ (@deco class Foo {});
class-expression.js:4:2 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
× expected `)` but instead found `@`
2 │ const a2 = (@deco class {});
3 │
> 4 │ (@deco class Foo {});
│ ^
5 │ (@deco class {});
6 │
i Remove @
class-expression.js:4:20 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
× expected a statement but instead found ')'
2 │ const a2 = (@deco class {});
3 │
> 4 │ (@deco class Foo {});
│ ^
5 │ (@deco class {});
6 │
i Expected a statement here
2 │ const a2 = (@deco class {});
3 │
> 4 │ (@deco class Foo {});
│ ^
5 │ (@deco class {});
6 │
class-expression.js:5:2 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
× expected `)` but instead found `@`
4 │ (@deco class Foo {});
> 5 │ (@deco class {});
│ ^
6 │
7 │ const b1 = []
i Remove @
class-expression.js:5:8 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
× class declarations must have a name
4 │ (@deco class Foo {});
> 5 │ (@deco class {});
│ ^^^^^^
6 │
7 │ const b1 = []
class-expression.js:5:16 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
× expected a statement but instead found ')'
4 │ (@deco class Foo {});
> 5 │ (@deco class {});
│ ^
6 │
7 │ const b1 = []
i Expected a statement here
4 │ (@deco class Foo {});
> 5 │ (@deco class {});
│ ^
6 │
7 │ const b1 = []
class-expression.js:8:3 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
× expected `)` but instead found `@`
7 │ const b1 = []
> 8 │ ;(@deco class Foo {})
│ ^
9 │
10 │ const b2 = []
i Remove @
class-expression.js:8:21 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
× expected a statement but instead found ')'
7 │ const b1 = []
> 8 │ ;(@deco class Foo {})
│ ^
9 │
10 │ const b2 = []
i Expected a statement here
7 │ const b1 = []
> 8 │ ;(@deco class Foo {})
│ ^
9 │
10 │ const b2 = []
class-expression.js:11:3 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
× expected `)` but instead found `@`
10 │ const b2 = []
> 11 │ ;(@deco class {})
│ ^
12 │
13 │ // This is not a `ClassExpression` but `ClassDeclaration`
i Remove @
class-expression.js:11:9 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
× class declarations must have a name
10 │ const b2 = []
> 11 │ ;(@deco class {})
│ ^^^^^^
12 │
13 │ // This is not a `ClassExpression` but `ClassDeclaration`
class-expression.js:11:17 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
× expected a statement but instead found ')'
10 │ const b2 = []
> 11 │ ;(@deco class {})
│ ^
12 │
13 │ // This is not a `ClassExpression` but `ClassDeclaration`
i Expected a statement here
10 │ const b2 = []
> 11 │ ;(@deco class {})
│ ^
12 │
13 │ // This is not a `ClassExpression` but `ClassDeclaration`
@deco
class Foo {}
```


0 comments on commit 71d67a3

Please sign in to comment.