diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 4df840c3241..6d89fb6cc83 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -780,6 +780,8 @@ module ts { return node === (parent).expression; case SyntaxKind.ComputedPropertyName: return node === (parent).expression; + case SyntaxKind.Decorator: + return true; default: if (isExpression(parent)) { return true; diff --git a/tests/baselines/reference/decoratorOnClass1.types b/tests/baselines/reference/decoratorOnClass1.types index 19e066586da..91c9feb4e35 100644 --- a/tests/baselines/reference/decoratorOnClass1.types +++ b/tests/baselines/reference/decoratorOnClass1.types @@ -7,7 +7,7 @@ declare function dec(target: T): T; >T : T @dec ->dec : unknown +>dec : (target: T) => T class C { >C : C diff --git a/tests/baselines/reference/decoratorOnClass2.types b/tests/baselines/reference/decoratorOnClass2.types index 43102ee9122..48565b74b43 100644 --- a/tests/baselines/reference/decoratorOnClass2.types +++ b/tests/baselines/reference/decoratorOnClass2.types @@ -7,7 +7,7 @@ declare function dec(target: T): T; >T : T @dec ->dec : unknown +>dec : (target: T) => T export class C { >C : C diff --git a/tests/baselines/reference/decoratorOnClassAccessor1.types b/tests/baselines/reference/decoratorOnClassAccessor1.types index fd592d7d294..602faf1fd22 100644 --- a/tests/baselines/reference/decoratorOnClassAccessor1.types +++ b/tests/baselines/reference/decoratorOnClassAccessor1.types @@ -14,6 +14,6 @@ class C { >C : C @dec get accessor() { return 1; } ->dec : unknown +>dec : (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor >accessor : number } diff --git a/tests/baselines/reference/decoratorOnClassAccessor2.types b/tests/baselines/reference/decoratorOnClassAccessor2.types index 32bb503d889..e43733db132 100644 --- a/tests/baselines/reference/decoratorOnClassAccessor2.types +++ b/tests/baselines/reference/decoratorOnClassAccessor2.types @@ -14,6 +14,6 @@ class C { >C : C @dec public get accessor() { return 1; } ->dec : unknown +>dec : (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor >accessor : number } diff --git a/tests/baselines/reference/decoratorOnClassAccessor4.types b/tests/baselines/reference/decoratorOnClassAccessor4.types index 40dd43d7e62..59399c5ea31 100644 --- a/tests/baselines/reference/decoratorOnClassAccessor4.types +++ b/tests/baselines/reference/decoratorOnClassAccessor4.types @@ -14,7 +14,7 @@ class C { >C : C @dec set accessor(value: number) { } ->dec : unknown +>dec : (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor >accessor : number >value : number } diff --git a/tests/baselines/reference/decoratorOnClassAccessor5.types b/tests/baselines/reference/decoratorOnClassAccessor5.types index 4b167fe8df1..8fe5ee55368 100644 --- a/tests/baselines/reference/decoratorOnClassAccessor5.types +++ b/tests/baselines/reference/decoratorOnClassAccessor5.types @@ -14,7 +14,7 @@ class C { >C : C @dec public set accessor(value: number) { } ->dec : unknown +>dec : (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor >accessor : number >value : number } diff --git a/tests/baselines/reference/decoratorOnClassConstructorParameter1.types b/tests/baselines/reference/decoratorOnClassConstructorParameter1.types index d5ce51269bc..a325945d8a2 100644 --- a/tests/baselines/reference/decoratorOnClassConstructorParameter1.types +++ b/tests/baselines/reference/decoratorOnClassConstructorParameter1.types @@ -10,6 +10,6 @@ class C { >C : C constructor(@dec p: number) {} ->dec : unknown +>dec : (target: Function, propertyKey: string | symbol, parameterIndex: number) => void >p : number } diff --git a/tests/baselines/reference/decoratorOnClassMethod1.types b/tests/baselines/reference/decoratorOnClassMethod1.types index 760f758bbff..fc7f27c5dfb 100644 --- a/tests/baselines/reference/decoratorOnClassMethod1.types +++ b/tests/baselines/reference/decoratorOnClassMethod1.types @@ -14,6 +14,6 @@ class C { >C : C @dec method() {} ->dec : unknown +>dec : (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor >method : () => void } diff --git a/tests/baselines/reference/decoratorOnClassMethod11.js b/tests/baselines/reference/decoratorOnClassMethod11.js index 71d4298f02c..f8276de2fe3 100644 --- a/tests/baselines/reference/decoratorOnClassMethod11.js +++ b/tests/baselines/reference/decoratorOnClassMethod11.js @@ -1,11 +1,11 @@ //// [decoratorOnClassMethod11.ts] -module M { - class C { - decorator(target: Object, key: string): void { } - - @this.decorator - method() { } - } +module M { + class C { + decorator(target: Object, key: string): void { } + + @this.decorator + method() { } + } } //// [decoratorOnClassMethod11.js] diff --git a/tests/baselines/reference/decoratorOnClassMethod13.types b/tests/baselines/reference/decoratorOnClassMethod13.types index 8c34805792f..1390f5750e6 100644 --- a/tests/baselines/reference/decoratorOnClassMethod13.types +++ b/tests/baselines/reference/decoratorOnClassMethod13.types @@ -14,8 +14,8 @@ class C { >C : C @dec ["1"]() { } ->dec : unknown +>dec : () => (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor @dec ["b"]() { } ->dec : unknown +>dec : () => (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor } diff --git a/tests/baselines/reference/decoratorOnClassMethod2.types b/tests/baselines/reference/decoratorOnClassMethod2.types index 98539648cd0..b83605c9c3c 100644 --- a/tests/baselines/reference/decoratorOnClassMethod2.types +++ b/tests/baselines/reference/decoratorOnClassMethod2.types @@ -14,6 +14,6 @@ class C { >C : C @dec public method() {} ->dec : unknown +>dec : (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor >method : () => void } diff --git a/tests/baselines/reference/decoratorOnClassMethod4.types b/tests/baselines/reference/decoratorOnClassMethod4.types index 6d55e01e97a..5b48b267e1d 100644 --- a/tests/baselines/reference/decoratorOnClassMethod4.types +++ b/tests/baselines/reference/decoratorOnClassMethod4.types @@ -14,5 +14,5 @@ class C { >C : C @dec ["method"]() {} ->dec : unknown +>dec : (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor } diff --git a/tests/baselines/reference/decoratorOnClassMethod6.types b/tests/baselines/reference/decoratorOnClassMethod6.types index 4e6629cd60a..8b167b5fb0f 100644 --- a/tests/baselines/reference/decoratorOnClassMethod6.types +++ b/tests/baselines/reference/decoratorOnClassMethod6.types @@ -14,5 +14,5 @@ class C { >C : C @dec ["method"]() {} ->dec : unknown +>dec : () => (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor } diff --git a/tests/baselines/reference/decoratorOnClassMethod7.types b/tests/baselines/reference/decoratorOnClassMethod7.types index 7e426cb773c..038d3ca7df5 100644 --- a/tests/baselines/reference/decoratorOnClassMethod7.types +++ b/tests/baselines/reference/decoratorOnClassMethod7.types @@ -14,5 +14,5 @@ class C { >C : C @dec public ["method"]() {} ->dec : unknown +>dec : (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor } diff --git a/tests/baselines/reference/decoratorOnClassMethod8.types b/tests/baselines/reference/decoratorOnClassMethod8.types index f932ab8696f..20890b09846 100644 --- a/tests/baselines/reference/decoratorOnClassMethod8.types +++ b/tests/baselines/reference/decoratorOnClassMethod8.types @@ -10,6 +10,6 @@ class C { >C : C @dec method() {} ->dec : unknown +>dec : (target: T) => T >method : () => void } diff --git a/tests/baselines/reference/decoratorOnClassMethodParameter1.types b/tests/baselines/reference/decoratorOnClassMethodParameter1.types index cf7bfd352bf..0b75471471f 100644 --- a/tests/baselines/reference/decoratorOnClassMethodParameter1.types +++ b/tests/baselines/reference/decoratorOnClassMethodParameter1.types @@ -11,6 +11,6 @@ class C { method(@dec p: number) {} >method : (p: number) => void ->dec : unknown +>dec : (target: Function, propertyKey: string | symbol, parameterIndex: number) => void >p : number } diff --git a/tests/baselines/reference/decoratorOnClassProperty1.types b/tests/baselines/reference/decoratorOnClassProperty1.types index 651085c7ac4..e974397e532 100644 --- a/tests/baselines/reference/decoratorOnClassProperty1.types +++ b/tests/baselines/reference/decoratorOnClassProperty1.types @@ -8,6 +8,6 @@ class C { >C : C @dec prop; ->dec : unknown +>dec : (target: any, propertyKey: string) => void >prop : any } diff --git a/tests/baselines/reference/decoratorOnClassProperty11.types b/tests/baselines/reference/decoratorOnClassProperty11.types index 5377e53c31c..5caa467d3ba 100644 --- a/tests/baselines/reference/decoratorOnClassProperty11.types +++ b/tests/baselines/reference/decoratorOnClassProperty11.types @@ -9,6 +9,6 @@ class C { >C : C @dec prop; ->dec : unknown +>dec : () => (target: any, propertyKey: string) => void >prop : any } diff --git a/tests/baselines/reference/decoratorOnClassProperty2.types b/tests/baselines/reference/decoratorOnClassProperty2.types index 2d5c9fe07d7..78d35004f8f 100644 --- a/tests/baselines/reference/decoratorOnClassProperty2.types +++ b/tests/baselines/reference/decoratorOnClassProperty2.types @@ -8,6 +8,6 @@ class C { >C : C @dec public prop; ->dec : unknown +>dec : (target: any, propertyKey: string) => void >prop : any } diff --git a/tests/baselines/reference/decoratorOnClassProperty6.types b/tests/baselines/reference/decoratorOnClassProperty6.types index 2c8c41abf78..59d03678330 100644 --- a/tests/baselines/reference/decoratorOnClassProperty6.types +++ b/tests/baselines/reference/decoratorOnClassProperty6.types @@ -8,6 +8,6 @@ class C { >C : C @dec prop; ->dec : unknown +>dec : (target: Function) => void >prop : any } diff --git a/tests/baselines/reference/sourceMapValidationDecorators.types b/tests/baselines/reference/sourceMapValidationDecorators.types index 8be7f237391..05b512fa439 100644 --- a/tests/baselines/reference/sourceMapValidationDecorators.types +++ b/tests/baselines/reference/sourceMapValidationDecorators.types @@ -43,7 +43,7 @@ declare function ParameterDecorator2(x: number): (target: Function, key: string >paramIndex : number @ClassDecorator1 ->ClassDecorator1 : unknown +>ClassDecorator1 : (target: Function) => void @ClassDecorator2(10) >ClassDecorator2(10) : (target: Function) => void @@ -54,7 +54,7 @@ class Greeter { constructor( @ParameterDecorator1 ->ParameterDecorator1 : unknown +>ParameterDecorator1 : (target: Function, key: string | symbol, paramIndex: number) => void @ParameterDecorator2(20) >ParameterDecorator2(20) : (target: Function, key: string | symbol, paramIndex: number) => void @@ -64,7 +64,7 @@ class Greeter { >greeting : string @ParameterDecorator1 ->ParameterDecorator1 : unknown +>ParameterDecorator1 : (target: Function, key: string | symbol, paramIndex: number) => void @ParameterDecorator2(30) >ParameterDecorator2(30) : (target: Function, key: string | symbol, paramIndex: number) => void @@ -75,7 +75,7 @@ class Greeter { } @PropertyDecorator1 ->PropertyDecorator1 : unknown +>PropertyDecorator1 : (target: Object, key: string | symbol, descriptor?: PropertyDescriptor) => void @PropertyDecorator2(40) >PropertyDecorator2(40) : (target: Object, key: string | symbol, descriptor?: PropertyDescriptor) => void @@ -93,7 +93,7 @@ class Greeter { } @PropertyDecorator1 ->PropertyDecorator1 : unknown +>PropertyDecorator1 : (target: Object, key: string | symbol, descriptor?: PropertyDescriptor) => void @PropertyDecorator2(50) >PropertyDecorator2(50) : (target: Object, key: string | symbol, descriptor?: PropertyDescriptor) => void @@ -103,7 +103,7 @@ class Greeter { >x : string @PropertyDecorator1 ->PropertyDecorator1 : unknown +>PropertyDecorator1 : (target: Object, key: string | symbol, descriptor?: PropertyDescriptor) => void @PropertyDecorator2(60) >PropertyDecorator2(60) : (target: Object, key: string | symbol, descriptor?: PropertyDescriptor) => void @@ -116,7 +116,7 @@ class Greeter { >fn : (x: number) => string @ParameterDecorator1 ->ParameterDecorator1 : unknown +>ParameterDecorator1 : (target: Function, key: string | symbol, paramIndex: number) => void @ParameterDecorator2(70) >ParameterDecorator2(70) : (target: Function, key: string | symbol, paramIndex: number) => void @@ -132,7 +132,7 @@ class Greeter { } @PropertyDecorator1 ->PropertyDecorator1 : unknown +>PropertyDecorator1 : (target: Object, key: string | symbol, descriptor?: PropertyDescriptor) => void @PropertyDecorator2(80) >PropertyDecorator2(80) : (target: Object, key: string | symbol, descriptor?: PropertyDescriptor) => void @@ -151,7 +151,7 @@ class Greeter { >greetings : string @ParameterDecorator1 ->ParameterDecorator1 : unknown +>ParameterDecorator1 : (target: Function, key: string | symbol, paramIndex: number) => void @ParameterDecorator2(90) >ParameterDecorator2(90) : (target: Function, key: string | symbol, paramIndex: number) => void diff --git a/tests/cases/fourslash/findAllRefsOnDecorators.ts b/tests/cases/fourslash/findAllRefsOnDecorators.ts new file mode 100644 index 00000000000..3225bc108ce --- /dev/null +++ b/tests/cases/fourslash/findAllRefsOnDecorators.ts @@ -0,0 +1,19 @@ +/// + +// @Filename: a.ts +////function decorator(target) { +//// return target; +////} +////decorator(); + +// @Filename: b.ts +////@deco/*1*/rator @decorator("again") +////class C { +//// @decorator +//// method() {} +////} + +goTo.file("b.ts"); +goTo.marker("1"); + +verify.referencesCountIs(5); \ No newline at end of file diff --git a/tests/cases/fourslash/getOccurrencesOfDecorators.ts b/tests/cases/fourslash/getOccurrencesOfDecorators.ts new file mode 100644 index 00000000000..207e6877d99 --- /dev/null +++ b/tests/cases/fourslash/getOccurrencesOfDecorators.ts @@ -0,0 +1,14 @@ +/// + +// @Filename: b.ts +////@/*1*/decorator +////class C { +//// @decorator +//// method() {} +////} +////function decorator(target) { +//// return target; +////} + +goTo.marker("1"); +verify.occurrencesAtPositionCount(3); diff --git a/tests/cases/fourslash/goToDefinitionDecorator.ts b/tests/cases/fourslash/goToDefinitionDecorator.ts new file mode 100644 index 00000000000..b0899a9576c --- /dev/null +++ b/tests/cases/fourslash/goToDefinitionDecorator.ts @@ -0,0 +1,26 @@ +/// + +// @Filename: b.ts +////@/*decoratorUse*/decorator +////class C { +//// @decora/*decoratorFactoryUse*/torFactory(a, "22", true) +//// method() {} +////} + + +// @Filename: a.ts +/////*decoratorDefinition*/function decorator(target) { +//// return target; +////} +/////*decoratorFactoryDefinition*/function decoratorFactory(...args) { +//// return target => target; +////} + + +goTo.marker('decoratorUse'); +goTo.definition(); +verify.caretAtMarker('decoratorDefinition'); + +goTo.marker('decoratorFactoryUse'); +goTo.definition(); +verify.caretAtMarker('decoratorFactoryDefinition'); diff --git a/tests/cases/fourslash/quickInfoForDecorators.ts b/tests/cases/fourslash/quickInfoForDecorators.ts new file mode 100644 index 00000000000..14390f3c8ae --- /dev/null +++ b/tests/cases/fourslash/quickInfoForDecorators.ts @@ -0,0 +1,11 @@ +/// + +////@/*1*/decorator +////class C { + +////} +/////** decorator documentation*/ +////var decorator = t=> t; + +goTo.marker("1"); +verify.quickInfoIs("var decorator: (t: any) => any", "decorator documentation"); \ No newline at end of file