Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitd91b46e

Browse files
Fix crashes in decorators transform compiling VS Code (#2378)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>Co-authored-by: DanielRosenwasser <972891+DanielRosenwasser@users.noreply.github.com>
1 parent6c175a0 commitd91b46e

13 files changed

+198
-53
lines changed

‎internal/transformers/tstransforms/legacydecorators.go‎

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -109,10 +109,7 @@ func moveRangePastModifiers(node *ast.Node) core.TextRange {
109109

110110
varlastModifier*ast.Node
111111
ifast.CanHaveModifiers(node) {
112-
nodes:=node.ModifierNodes()
113-
ifnodes!=nil {
114-
lastModifier=nodes[0]
115-
}
112+
lastModifier=core.LastOrNil(node.ModifierNodes())
116113
}
117114

118115
iflastModifier!=nil&&!ast.PositionIsSynthesized(lastModifier.End()) {
@@ -710,7 +707,7 @@ func getAllDecoratorsOfAccessors(accessor *ast.Node, parent *ast.ClassDeclaratio
710707
varfirstAccessorWithDecorators*ast.Node
711708
ifast.HasDecorators(decls.FirstAccessor) {
712709
firstAccessorWithDecorators=decls.FirstAccessor
713-
}elseifast.HasDecorators(decls.SecondAccessor) {
710+
}elseifdecls.SecondAccessor!=nil&&ast.HasDecorators(decls.SecondAccessor) {
714711
firstAccessorWithDecorators=decls.SecondAccessor
715712
}
716713

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
//// [tests/cases/compiler/legacyDecoratorClassWithoutModifiers.ts] ////
2+
3+
//// [legacyDecoratorClassWithoutModifiers.ts]
4+
// Test case for decorated class without modifiers
5+
declarefunctionclassDec(target:any):any;
6+
7+
@classDec
8+
classC{
9+
}
10+
11+
12+
//// [legacyDecoratorClassWithoutModifiers.js]
13+
var__decorate=(this&&this.__decorate)||function(decorators,target,key,desc){
14+
varc=arguments.length,r=c<3 ?target :desc===null ?desc=Object.getOwnPropertyDescriptor(target,key) :desc,d;
15+
if(typeofReflect==="object"&&typeofReflect.decorate==="function")r=Reflect.decorate(decorators,target,key,desc);
16+
elsefor(vari=decorators.length-1;i>=0;i--)if(d=decorators[i])r=(c<3 ?d(r) :c>3 ?d(target,key,r) :d(target,key))||r;
17+
returnc>3&&r&&Object.defineProperty(target,key,r),r;
18+
};
19+
letC=classC{
20+
};
21+
C=__decorate([
22+
classDec
23+
],C);
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//// [tests/cases/compiler/legacyDecoratorClassWithoutModifiers.ts] ////
2+
3+
=== legacyDecoratorClassWithoutModifiers.ts ===
4+
// Test case for decorated class without modifiers
5+
declare function classDec(target: any): any;
6+
>classDec : Symbol(classDec, Decl(legacyDecoratorClassWithoutModifiers.ts, 0, 0))
7+
>target : Symbol(target, Decl(legacyDecoratorClassWithoutModifiers.ts, 1, 26))
8+
9+
@classDec
10+
>classDec : Symbol(classDec, Decl(legacyDecoratorClassWithoutModifiers.ts, 0, 0))
11+
12+
class C {
13+
>C : Symbol(C, Decl(legacyDecoratorClassWithoutModifiers.ts, 1, 44))
14+
}
15+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//// [tests/cases/compiler/legacyDecoratorClassWithoutModifiers.ts] ////
2+
3+
=== legacyDecoratorClassWithoutModifiers.ts ===
4+
// Test case for decorated class without modifiers
5+
declare function classDec(target: any): any;
6+
>classDec : (target: any) => any
7+
>target : any
8+
9+
@classDec
10+
>classDec : (target: any) => any
11+
12+
class C {
13+
>C : C
14+
}
15+
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
//// [tests/cases/compiler/legacyDecoratorsSingleAccessor.ts] ////
2+
3+
//// [legacyDecoratorsSingleAccessor.ts]
4+
declarefunctiondec(target:any,propertyKey:string,descriptor:PropertyDescriptor):PropertyDescriptor;
5+
6+
// Test case for single getter without setter
7+
classC1{
8+
@decgetaccessor(){return1;}
9+
}
10+
11+
// Test case for single setter without getter
12+
classC2{
13+
@decsetaccessor(value:number){}
14+
}
15+
16+
17+
//// [legacyDecoratorsSingleAccessor.js]
18+
var__decorate=(this&&this.__decorate)||function(decorators,target,key,desc){
19+
varc=arguments.length,r=c<3 ?target :desc===null ?desc=Object.getOwnPropertyDescriptor(target,key) :desc,d;
20+
if(typeofReflect==="object"&&typeofReflect.decorate==="function")r=Reflect.decorate(decorators,target,key,desc);
21+
elsefor(vari=decorators.length-1;i>=0;i--)if(d=decorators[i])r=(c<3 ?d(r) :c>3 ?d(target,key,r) :d(target,key))||r;
22+
returnc>3&&r&&Object.defineProperty(target,key,r),r;
23+
};
24+
// Test case for single getter without setter
25+
classC1{
26+
getaccessor(){return1;}
27+
}
28+
__decorate([
29+
dec
30+
],C1.prototype,"accessor",null);
31+
// Test case for single setter without getter
32+
classC2{
33+
setaccessor(value){}
34+
}
35+
__decorate([
36+
dec
37+
],C2.prototype,"accessor",null);
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
//// [tests/cases/compiler/legacyDecoratorsSingleAccessor.ts] ////
2+
3+
=== legacyDecoratorsSingleAccessor.ts ===
4+
declare function dec(target: any, propertyKey: string, descriptor: PropertyDescriptor): PropertyDescriptor;
5+
>dec : Symbol(dec, Decl(legacyDecoratorsSingleAccessor.ts, 0, 0))
6+
>target : Symbol(target, Decl(legacyDecoratorsSingleAccessor.ts, 0, 21))
7+
>propertyKey : Symbol(propertyKey, Decl(legacyDecoratorsSingleAccessor.ts, 0, 33))
8+
>descriptor : Symbol(descriptor, Decl(legacyDecoratorsSingleAccessor.ts, 0, 54))
9+
>PropertyDescriptor : Symbol(PropertyDescriptor, Decl(lib.es5.d.ts, --, --))
10+
>PropertyDescriptor : Symbol(PropertyDescriptor, Decl(lib.es5.d.ts, --, --))
11+
12+
// Test case for single getter without setter
13+
class C1 {
14+
>C1 : Symbol(C1, Decl(legacyDecoratorsSingleAccessor.ts, 0, 107))
15+
16+
@dec get accessor() { return 1; }
17+
>dec : Symbol(dec, Decl(legacyDecoratorsSingleAccessor.ts, 0, 0))
18+
>accessor : Symbol(C1.accessor, Decl(legacyDecoratorsSingleAccessor.ts, 3, 10))
19+
}
20+
21+
// Test case for single setter without getter
22+
class C2 {
23+
>C2 : Symbol(C2, Decl(legacyDecoratorsSingleAccessor.ts, 5, 1))
24+
25+
@dec set accessor(value: number) { }
26+
>dec : Symbol(dec, Decl(legacyDecoratorsSingleAccessor.ts, 0, 0))
27+
>accessor : Symbol(C2.accessor, Decl(legacyDecoratorsSingleAccessor.ts, 8, 10))
28+
>value : Symbol(value, Decl(legacyDecoratorsSingleAccessor.ts, 9, 22))
29+
}
30+
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
//// [tests/cases/compiler/legacyDecoratorsSingleAccessor.ts] ////
2+
3+
=== legacyDecoratorsSingleAccessor.ts ===
4+
declare function dec(target: any, propertyKey: string, descriptor: PropertyDescriptor): PropertyDescriptor;
5+
>dec : (target: any, propertyKey: string, descriptor: PropertyDescriptor) => PropertyDescriptor
6+
>target : any
7+
>propertyKey : string
8+
>descriptor : PropertyDescriptor
9+
10+
// Test case for single getter without setter
11+
class C1 {
12+
>C1 : C1
13+
14+
@dec get accessor() { return 1; }
15+
>dec : (target: any, propertyKey: string, descriptor: PropertyDescriptor) => PropertyDescriptor
16+
>accessor : number
17+
>1 : 1
18+
}
19+
20+
// Test case for single setter without getter
21+
class C2 {
22+
>C2 : C2
23+
24+
@dec set accessor(value: number) { }
25+
>dec : (target: any, propertyKey: string, descriptor: PropertyDescriptor) => PropertyDescriptor
26+
>accessor : number
27+
>value : number
28+
}
29+

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp