From c88c129567a7a98918a3500cd678a1d0fceba11c Mon Sep 17 00:00:00 2001 From: Andrew Casey Date: Fri, 11 May 2018 14:03:57 -0700 Subject: [PATCH 1/6] "gulp" -> "jake" On branch `release-2.8`, `gulp` produces a build error. In practice, `jake` is our supported build tool. --- README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 3200498b0cf..68b589efcce 100644 --- a/README.md +++ b/README.md @@ -61,29 +61,29 @@ Change to the TypeScript directory: cd TypeScript ``` -Install Gulp tools and dev dependencies: +Install Jake tools and dev dependencies: ```bash -npm install -g gulp +npm install -g jake npm install ``` Use one of the following to build and test: ``` -gulp local # Build the compiler into built/local -gulp clean # Delete the built compiler -gulp LKG # Replace the last known good with the built one. +jake local # Build the compiler into built/local +jake clean # Delete the built compiler +jake LKG # Replace the last known good with the built one. # Bootstrapping step to be executed when the built compiler reaches a stable state. -gulp tests # Build the test infrastructure using the built compiler. -gulp runtests # Run tests using the built compiler and test infrastructure. +jake tests # Build the test infrastructure using the built compiler. +jake runtests # Run tests using the built compiler and test infrastructure. # You can override the host or specify a test for this command. # Use host= or tests=. -gulp runtests-browser # Runs the tests using the built run.js file. Syntax is gulp runtests. Optional +jake runtests-browser # Runs the tests using the built run.js file. Syntax is jake runtests. Optional parameters 'host=', 'tests=[regex], reporter=[list|spec|json|]'. -gulp baseline-accept # This replaces the baseline test results with the results obtained from gulp runtests. -gulp lint # Runs tslint on the TypeScript source. -gulp help # List the above commands. +jake baseline-accept # This replaces the baseline test results with the results obtained from jake runtests. +jake lint # Runs tslint on the TypeScript source. +jake help # List the above commands. ``` From 9767fbba092a3fa9fa5c7e6a6d4908c30c4c1565 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=96=87=E7=92=90?= Date: Mon, 4 Jun 2018 15:16:59 +0800 Subject: [PATCH 2/6] allow access protected member in this parameter context --- src/compiler/checker.ts | 13 +- .../thisTypeAccessibility.errors.txt | 44 ++++++ .../reference/thisTypeAccessibility.js | 59 ++++++++ .../reference/thisTypeAccessibility.symbols | 125 +++++++++++++++ .../reference/thisTypeAccessibility.types | 142 ++++++++++++++++++ .../types/thisType/thisTypeAccessibility.ts | 31 ++++ 6 files changed, 411 insertions(+), 3 deletions(-) create mode 100644 tests/baselines/reference/thisTypeAccessibility.errors.txt create mode 100644 tests/baselines/reference/thisTypeAccessibility.js create mode 100644 tests/baselines/reference/thisTypeAccessibility.symbols create mode 100644 tests/baselines/reference/thisTypeAccessibility.types create mode 100644 tests/cases/conformance/types/thisType/thisTypeAccessibility.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 9306907b418..a9243186802 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -17101,14 +17101,21 @@ namespace ts { // Find the first enclosing class that has the declaring classes of the protected constituents // of the property as base classes - const enclosingClass = forEachEnclosingClass(node, enclosingDeclaration => { + let enclosingClass = forEachEnclosingClass(node, enclosingDeclaration => { const enclosingClass = getDeclaredTypeOfSymbol(getSymbolOfNode(enclosingDeclaration)!); return isClassDerivedFromDeclaringClasses(enclosingClass, prop) ? enclosingClass : undefined; }); // A protected property is accessible if the property is within the declaring class or classes derived from it if (!enclosingClass) { - error(errorNode, Diagnostics.Property_0_is_protected_and_only_accessible_within_class_1_and_its_subclasses, symbolToString(prop), typeToString(getDeclaringClass(prop) || type)); - return false; + let thisParameter: ParameterDeclaration | undefined; + const thisContainer = getThisContainer(node, /* includeArrowFunctions */ false); + if (!thisContainer || !isFunctionLike(thisContainer) || !(thisParameter = getThisParameter(thisContainer)) || !thisParameter.type) { + error(errorNode, Diagnostics.Property_0_is_protected_and_only_accessible_within_class_1_and_its_subclasses, symbolToString(prop), typeToString(getDeclaringClass(prop) || type)); + return false; + } + + const thisType = getTypeFromTypeNode(thisParameter.type); + enclosingClass = ((thisType.flags & TypeFlags.TypeParameter) ? getConstraintFromTypeParameter(thisType) : thisType) as InterfaceType; } // No further restrictions for static properties if (flags & ModifierFlags.Static) { diff --git a/tests/baselines/reference/thisTypeAccessibility.errors.txt b/tests/baselines/reference/thisTypeAccessibility.errors.txt new file mode 100644 index 00000000000..bfdc297fa83 --- /dev/null +++ b/tests/baselines/reference/thisTypeAccessibility.errors.txt @@ -0,0 +1,44 @@ +tests/cases/conformance/types/thisType/thisTypeAccessibility.ts(14,10): error TS2341: Property 'p' is private and only accessible within class 'MyClass'. +tests/cases/conformance/types/thisType/thisTypeAccessibility.ts(20,10): error TS2341: Property 'p' is private and only accessible within class 'MyClass'. +tests/cases/conformance/types/thisType/thisTypeAccessibility.ts(26,10): error TS2341: Property 'p' is private and only accessible within class 'MyClass'. + + +==== tests/cases/conformance/types/thisType/thisTypeAccessibility.ts (3 errors) ==== + class MyClass { + private p: number = 123; + protected pp: number = 123; + public ppp: number = 123; + } + + interface MyClass { + extension1(p: number): void; + extension2(p: number): void; + extension3(p: number): void; + } + + MyClass.prototype.extension1 = function (this: MyClass, p: number) { + this.p = p; + ~ +!!! error TS2341: Property 'p' is private and only accessible within class 'MyClass'. + this.pp = p; + this.ppp = p; + } + + MyClass.prototype.extension2 = function (this: T, p: number) { + this.p = p; + ~ +!!! error TS2341: Property 'p' is private and only accessible within class 'MyClass'. + this.pp = p; + this.ppp = p; + } + + function extension3 (this: T, p: number) { + this.p = p; + ~ +!!! error TS2341: Property 'p' is private and only accessible within class 'MyClass'. + this.pp = p; + this.ppp = p; + } + + MyClass.prototype.extension3 = extension3; + \ No newline at end of file diff --git a/tests/baselines/reference/thisTypeAccessibility.js b/tests/baselines/reference/thisTypeAccessibility.js new file mode 100644 index 00000000000..a2695d1d670 --- /dev/null +++ b/tests/baselines/reference/thisTypeAccessibility.js @@ -0,0 +1,59 @@ +//// [thisTypeAccessibility.ts] +class MyClass { + private p: number = 123; + protected pp: number = 123; + public ppp: number = 123; +} + +interface MyClass { + extension1(p: number): void; + extension2(p: number): void; + extension3(p: number): void; +} + +MyClass.prototype.extension1 = function (this: MyClass, p: number) { + this.p = p; + this.pp = p; + this.ppp = p; +} + +MyClass.prototype.extension2 = function (this: T, p: number) { + this.p = p; + this.pp = p; + this.ppp = p; +} + +function extension3 (this: T, p: number) { + this.p = p; + this.pp = p; + this.ppp = p; +} + +MyClass.prototype.extension3 = extension3; + + +//// [thisTypeAccessibility.js] +var MyClass = /** @class */ (function () { + function MyClass() { + this.p = 123; + this.pp = 123; + this.ppp = 123; + } + return MyClass; +}()); +MyClass.prototype.extension1 = function (p) { + this.p = p; + this.pp = p; + this.ppp = p; +}; +MyClass.prototype.extension2 = function (p) { + this.p = p; + this.pp = p; + this.ppp = p; +}; +function extension3(p) { + this.p = p; + this.pp = p; + this.ppp = p; +} +MyClass.prototype.extension3 = extension3; diff --git a/tests/baselines/reference/thisTypeAccessibility.symbols b/tests/baselines/reference/thisTypeAccessibility.symbols new file mode 100644 index 00000000000..0919d83f8e4 --- /dev/null +++ b/tests/baselines/reference/thisTypeAccessibility.symbols @@ -0,0 +1,125 @@ +=== tests/cases/conformance/types/thisType/thisTypeAccessibility.ts === +class MyClass { +>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 4, 1)) + + private p: number = 123; +>p : Symbol(MyClass.p, Decl(thisTypeAccessibility.ts, 0, 15)) + + protected pp: number = 123; +>pp : Symbol(MyClass.pp, Decl(thisTypeAccessibility.ts, 1, 28)) + + public ppp: number = 123; +>ppp : Symbol(MyClass.ppp, Decl(thisTypeAccessibility.ts, 2, 31)) +} + +interface MyClass { +>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 4, 1)) + + extension1(p: number): void; +>extension1 : Symbol(MyClass.extension1, Decl(thisTypeAccessibility.ts, 6, 19)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 7, 15)) + + extension2(p: number): void; +>extension2 : Symbol(MyClass.extension2, Decl(thisTypeAccessibility.ts, 7, 32)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 8, 15)) + + extension3(p: number): void; +>extension3 : Symbol(MyClass.extension3, Decl(thisTypeAccessibility.ts, 8, 32)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 9, 15)) +} + +MyClass.prototype.extension1 = function (this: MyClass, p: number) { +>MyClass.prototype.extension1 : Symbol(MyClass.extension1, Decl(thisTypeAccessibility.ts, 6, 19)) +>MyClass.prototype : Symbol(MyClass.prototype) +>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 4, 1)) +>prototype : Symbol(MyClass.prototype) +>extension1 : Symbol(MyClass.extension1, Decl(thisTypeAccessibility.ts, 6, 19)) +>this : Symbol(this, Decl(thisTypeAccessibility.ts, 12, 41)) +>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 4, 1)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 12, 55)) + + this.p = p; +>this.p : Symbol(MyClass.p, Decl(thisTypeAccessibility.ts, 0, 15)) +>this : Symbol(this, Decl(thisTypeAccessibility.ts, 12, 41)) +>p : Symbol(MyClass.p, Decl(thisTypeAccessibility.ts, 0, 15)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 12, 55)) + + this.pp = p; +>this.pp : Symbol(MyClass.pp, Decl(thisTypeAccessibility.ts, 1, 28)) +>this : Symbol(this, Decl(thisTypeAccessibility.ts, 12, 41)) +>pp : Symbol(MyClass.pp, Decl(thisTypeAccessibility.ts, 1, 28)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 12, 55)) + + this.ppp = p; +>this.ppp : Symbol(MyClass.ppp, Decl(thisTypeAccessibility.ts, 2, 31)) +>this : Symbol(this, Decl(thisTypeAccessibility.ts, 12, 41)) +>ppp : Symbol(MyClass.ppp, Decl(thisTypeAccessibility.ts, 2, 31)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 12, 55)) +} + +MyClass.prototype.extension2 = function (this: T, p: number) { +>MyClass.prototype.extension2 : Symbol(MyClass.extension2, Decl(thisTypeAccessibility.ts, 7, 32)) +>MyClass.prototype : Symbol(MyClass.prototype) +>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 4, 1)) +>prototype : Symbol(MyClass.prototype) +>extension2 : Symbol(MyClass.extension2, Decl(thisTypeAccessibility.ts, 7, 32)) +>T : Symbol(T, Decl(thisTypeAccessibility.ts, 18, 40)) +>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 4, 1)) +>this : Symbol(this, Decl(thisTypeAccessibility.ts, 18, 60)) +>T : Symbol(T, Decl(thisTypeAccessibility.ts, 18, 40)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 18, 68)) + + this.p = p; +>this.p : Symbol(MyClass.p, Decl(thisTypeAccessibility.ts, 0, 15)) +>this : Symbol(this, Decl(thisTypeAccessibility.ts, 18, 60)) +>p : Symbol(MyClass.p, Decl(thisTypeAccessibility.ts, 0, 15)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 18, 68)) + + this.pp = p; +>this.pp : Symbol(MyClass.pp, Decl(thisTypeAccessibility.ts, 1, 28)) +>this : Symbol(this, Decl(thisTypeAccessibility.ts, 18, 60)) +>pp : Symbol(MyClass.pp, Decl(thisTypeAccessibility.ts, 1, 28)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 18, 68)) + + this.ppp = p; +>this.ppp : Symbol(MyClass.ppp, Decl(thisTypeAccessibility.ts, 2, 31)) +>this : Symbol(this, Decl(thisTypeAccessibility.ts, 18, 60)) +>ppp : Symbol(MyClass.ppp, Decl(thisTypeAccessibility.ts, 2, 31)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 18, 68)) +} + +function extension3 (this: T, p: number) { +>extension3 : Symbol(extension3, Decl(thisTypeAccessibility.ts, 22, 1)) +>T : Symbol(T, Decl(thisTypeAccessibility.ts, 24, 20)) +>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 4, 1)) +>this : Symbol(this, Decl(thisTypeAccessibility.ts, 24, 40)) +>T : Symbol(T, Decl(thisTypeAccessibility.ts, 24, 20)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 24, 48)) + + this.p = p; +>this.p : Symbol(MyClass.p, Decl(thisTypeAccessibility.ts, 0, 15)) +>this : Symbol(this, Decl(thisTypeAccessibility.ts, 24, 40)) +>p : Symbol(MyClass.p, Decl(thisTypeAccessibility.ts, 0, 15)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 24, 48)) + + this.pp = p; +>this.pp : Symbol(MyClass.pp, Decl(thisTypeAccessibility.ts, 1, 28)) +>this : Symbol(this, Decl(thisTypeAccessibility.ts, 24, 40)) +>pp : Symbol(MyClass.pp, Decl(thisTypeAccessibility.ts, 1, 28)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 24, 48)) + + this.ppp = p; +>this.ppp : Symbol(MyClass.ppp, Decl(thisTypeAccessibility.ts, 2, 31)) +>this : Symbol(this, Decl(thisTypeAccessibility.ts, 24, 40)) +>ppp : Symbol(MyClass.ppp, Decl(thisTypeAccessibility.ts, 2, 31)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 24, 48)) +} + +MyClass.prototype.extension3 = extension3; +>MyClass.prototype.extension3 : Symbol(MyClass.extension3, Decl(thisTypeAccessibility.ts, 8, 32)) +>MyClass.prototype : Symbol(MyClass.prototype) +>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 4, 1)) +>prototype : Symbol(MyClass.prototype) +>extension3 : Symbol(MyClass.extension3, Decl(thisTypeAccessibility.ts, 8, 32)) +>extension3 : Symbol(extension3, Decl(thisTypeAccessibility.ts, 22, 1)) + diff --git a/tests/baselines/reference/thisTypeAccessibility.types b/tests/baselines/reference/thisTypeAccessibility.types new file mode 100644 index 00000000000..3eb0f46f1b7 --- /dev/null +++ b/tests/baselines/reference/thisTypeAccessibility.types @@ -0,0 +1,142 @@ +=== tests/cases/conformance/types/thisType/thisTypeAccessibility.ts === +class MyClass { +>MyClass : MyClass + + private p: number = 123; +>p : number +>123 : 123 + + protected pp: number = 123; +>pp : number +>123 : 123 + + public ppp: number = 123; +>ppp : number +>123 : 123 +} + +interface MyClass { +>MyClass : MyClass + + extension1(p: number): void; +>extension1 : (p: number) => void +>p : number + + extension2(p: number): void; +>extension2 : (p: number) => void +>p : number + + extension3(p: number): void; +>extension3 : (p: number) => void +>p : number +} + +MyClass.prototype.extension1 = function (this: MyClass, p: number) { +>MyClass.prototype.extension1 = function (this: MyClass, p: number) { this.p = p; this.pp = p; this.ppp = p;} : (this: MyClass, p: number) => void +>MyClass.prototype.extension1 : (p: number) => void +>MyClass.prototype : MyClass +>MyClass : typeof MyClass +>prototype : MyClass +>extension1 : (p: number) => void +>function (this: MyClass, p: number) { this.p = p; this.pp = p; this.ppp = p;} : (this: MyClass, p: number) => void +>this : MyClass +>MyClass : MyClass +>p : number + + this.p = p; +>this.p = p : number +>this.p : number +>this : MyClass +>p : number +>p : number + + this.pp = p; +>this.pp = p : number +>this.pp : number +>this : MyClass +>pp : number +>p : number + + this.ppp = p; +>this.ppp = p : number +>this.ppp : number +>this : MyClass +>ppp : number +>p : number +} + +MyClass.prototype.extension2 = function (this: T, p: number) { +>MyClass.prototype.extension2 = function (this: T, p: number) { this.p = p; this.pp = p; this.ppp = p;} : (this: T, p: number) => void +>MyClass.prototype.extension2 : (p: number) => void +>MyClass.prototype : MyClass +>MyClass : typeof MyClass +>prototype : MyClass +>extension2 : (p: number) => void +>function (this: T, p: number) { this.p = p; this.pp = p; this.ppp = p;} : (this: T, p: number) => void +>T : T +>MyClass : MyClass +>this : T +>T : T +>p : number + + this.p = p; +>this.p = p : number +>this.p : number +>this : T +>p : number +>p : number + + this.pp = p; +>this.pp = p : number +>this.pp : number +>this : T +>pp : number +>p : number + + this.ppp = p; +>this.ppp = p : number +>this.ppp : number +>this : T +>ppp : number +>p : number +} + +function extension3 (this: T, p: number) { +>extension3 : (this: T, p: number) => void +>T : T +>MyClass : MyClass +>this : T +>T : T +>p : number + + this.p = p; +>this.p = p : number +>this.p : number +>this : T +>p : number +>p : number + + this.pp = p; +>this.pp = p : number +>this.pp : number +>this : T +>pp : number +>p : number + + this.ppp = p; +>this.ppp = p : number +>this.ppp : number +>this : T +>ppp : number +>p : number +} + +MyClass.prototype.extension3 = extension3; +>MyClass.prototype.extension3 = extension3 : (this: T, p: number) => void +>MyClass.prototype.extension3 : (p: number) => void +>MyClass.prototype : MyClass +>MyClass : typeof MyClass +>prototype : MyClass +>extension3 : (p: number) => void +>extension3 : (this: T, p: number) => void + diff --git a/tests/cases/conformance/types/thisType/thisTypeAccessibility.ts b/tests/cases/conformance/types/thisType/thisTypeAccessibility.ts new file mode 100644 index 00000000000..28d55222d5a --- /dev/null +++ b/tests/cases/conformance/types/thisType/thisTypeAccessibility.ts @@ -0,0 +1,31 @@ +class MyClass { + private p: number = 123; + protected pp: number = 123; + public ppp: number = 123; +} + +interface MyClass { + extension1(p: number): void; + extension2(p: number): void; + extension3(p: number): void; +} + +MyClass.prototype.extension1 = function (this: MyClass, p: number) { + this.p = p; + this.pp = p; + this.ppp = p; +} + +MyClass.prototype.extension2 = function (this: T, p: number) { + this.p = p; + this.pp = p; + this.ppp = p; +} + +function extension3 (this: T, p: number) { + this.p = p; + this.pp = p; + this.ppp = p; +} + +MyClass.prototype.extension3 = extension3; From 0bcbbbdd582cc44ee0d2a987ced8af1cb0e8349d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=96=87=E7=92=90?= Date: Tue, 5 Jun 2018 18:42:21 +0800 Subject: [PATCH 3/6] disallow static field access --- src/compiler/checker.ts | 4 +- .../thisTypeAccessibility.errors.txt | 36 +++- .../reference/thisTypeAccessibility.js | 24 +++ .../reference/thisTypeAccessibility.symbols | 163 ++++++++++++------ .../reference/thisTypeAccessibility.types | 83 ++++++++- .../types/thisType/thisTypeAccessibility.ts | 12 ++ 6 files changed, 263 insertions(+), 59 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index a9243186802..be8b11bf1f0 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -17109,7 +17109,7 @@ namespace ts { if (!enclosingClass) { let thisParameter: ParameterDeclaration | undefined; const thisContainer = getThisContainer(node, /* includeArrowFunctions */ false); - if (!thisContainer || !isFunctionLike(thisContainer) || !(thisParameter = getThisParameter(thisContainer)) || !thisParameter.type) { + if (flags & ModifierFlags.Static || !thisContainer || !isFunctionLike(thisContainer) || !(thisParameter = getThisParameter(thisContainer)) || !thisParameter.type) { error(errorNode, Diagnostics.Property_0_is_protected_and_only_accessible_within_class_1_and_its_subclasses, symbolToString(prop), typeToString(getDeclaringClass(prop) || type)); return false; } @@ -17121,7 +17121,7 @@ namespace ts { if (flags & ModifierFlags.Static) { return true; } - if (type.flags & TypeFlags.TypeParameter) { + if (type.flags & TypeFlags.TypeParameter) { // get the original type -- represented as the type constraint of the 'this' type type = (type as TypeParameter).isThisType ? getConstraintOfTypeParameter(type)! : getBaseConstraintOfType(type)!; // TODO: GH#18217 Use a different variable that's allowed to be undefined } diff --git a/tests/baselines/reference/thisTypeAccessibility.errors.txt b/tests/baselines/reference/thisTypeAccessibility.errors.txt index bfdc297fa83..915d6f20b82 100644 --- a/tests/baselines/reference/thisTypeAccessibility.errors.txt +++ b/tests/baselines/reference/thisTypeAccessibility.errors.txt @@ -1,13 +1,22 @@ -tests/cases/conformance/types/thisType/thisTypeAccessibility.ts(14,10): error TS2341: Property 'p' is private and only accessible within class 'MyClass'. -tests/cases/conformance/types/thisType/thisTypeAccessibility.ts(20,10): error TS2341: Property 'p' is private and only accessible within class 'MyClass'. +tests/cases/conformance/types/thisType/thisTypeAccessibility.ts(17,10): error TS2341: Property 'p' is private and only accessible within class 'MyClass'. +tests/cases/conformance/types/thisType/thisTypeAccessibility.ts(20,13): error TS2341: Property 'sp' is private and only accessible within class 'MyClass'. +tests/cases/conformance/types/thisType/thisTypeAccessibility.ts(21,13): error TS2445: Property 'spp' is protected and only accessible within class 'MyClass' and its subclasses. tests/cases/conformance/types/thisType/thisTypeAccessibility.ts(26,10): error TS2341: Property 'p' is private and only accessible within class 'MyClass'. +tests/cases/conformance/types/thisType/thisTypeAccessibility.ts(29,13): error TS2341: Property 'sp' is private and only accessible within class 'MyClass'. +tests/cases/conformance/types/thisType/thisTypeAccessibility.ts(30,13): error TS2445: Property 'spp' is protected and only accessible within class 'MyClass' and its subclasses. +tests/cases/conformance/types/thisType/thisTypeAccessibility.ts(35,10): error TS2341: Property 'p' is private and only accessible within class 'MyClass'. +tests/cases/conformance/types/thisType/thisTypeAccessibility.ts(38,13): error TS2341: Property 'sp' is private and only accessible within class 'MyClass'. +tests/cases/conformance/types/thisType/thisTypeAccessibility.ts(39,13): error TS2445: Property 'spp' is protected and only accessible within class 'MyClass' and its subclasses. -==== tests/cases/conformance/types/thisType/thisTypeAccessibility.ts (3 errors) ==== +==== tests/cases/conformance/types/thisType/thisTypeAccessibility.ts (9 errors) ==== class MyClass { private p: number = 123; protected pp: number = 123; public ppp: number = 123; + private static sp: number = 123; + protected static spp: number = 123; + public static sppp: number = 123; } interface MyClass { @@ -22,6 +31,13 @@ tests/cases/conformance/types/thisType/thisTypeAccessibility.ts(26,10): error TS !!! error TS2341: Property 'p' is private and only accessible within class 'MyClass'. this.pp = p; this.ppp = p; + MyClass.sp = p; + ~~ +!!! error TS2341: Property 'sp' is private and only accessible within class 'MyClass'. + MyClass.spp = p; + ~~~ +!!! error TS2445: Property 'spp' is protected and only accessible within class 'MyClass' and its subclasses. + MyClass.sppp = p; } MyClass.prototype.extension2 = function (this: T, p: number) { @@ -30,6 +46,13 @@ tests/cases/conformance/types/thisType/thisTypeAccessibility.ts(26,10): error TS !!! error TS2341: Property 'p' is private and only accessible within class 'MyClass'. this.pp = p; this.ppp = p; + MyClass.sp = p; + ~~ +!!! error TS2341: Property 'sp' is private and only accessible within class 'MyClass'. + MyClass.spp = p; + ~~~ +!!! error TS2445: Property 'spp' is protected and only accessible within class 'MyClass' and its subclasses. + MyClass.sppp = p; } function extension3 (this: T, p: number) { @@ -38,6 +61,13 @@ tests/cases/conformance/types/thisType/thisTypeAccessibility.ts(26,10): error TS !!! error TS2341: Property 'p' is private and only accessible within class 'MyClass'. this.pp = p; this.ppp = p; + MyClass.sp = p; + ~~ +!!! error TS2341: Property 'sp' is private and only accessible within class 'MyClass'. + MyClass.spp = p; + ~~~ +!!! error TS2445: Property 'spp' is protected and only accessible within class 'MyClass' and its subclasses. + MyClass.sppp = p; } MyClass.prototype.extension3 = extension3; diff --git a/tests/baselines/reference/thisTypeAccessibility.js b/tests/baselines/reference/thisTypeAccessibility.js index a2695d1d670..04340cebcd3 100644 --- a/tests/baselines/reference/thisTypeAccessibility.js +++ b/tests/baselines/reference/thisTypeAccessibility.js @@ -3,6 +3,9 @@ class MyClass { private p: number = 123; protected pp: number = 123; public ppp: number = 123; + private static sp: number = 123; + protected static spp: number = 123; + public static sppp: number = 123; } interface MyClass { @@ -15,18 +18,27 @@ MyClass.prototype.extension1 = function (this: MyClass, p: number) { this.p = p; this.pp = p; this.ppp = p; + MyClass.sp = p; + MyClass.spp = p; + MyClass.sppp = p; } MyClass.prototype.extension2 = function (this: T, p: number) { this.p = p; this.pp = p; this.ppp = p; + MyClass.sp = p; + MyClass.spp = p; + MyClass.sppp = p; } function extension3 (this: T, p: number) { this.p = p; this.pp = p; this.ppp = p; + MyClass.sp = p; + MyClass.spp = p; + MyClass.sppp = p; } MyClass.prototype.extension3 = extension3; @@ -39,21 +51,33 @@ var MyClass = /** @class */ (function () { this.pp = 123; this.ppp = 123; } + MyClass.sp = 123; + MyClass.spp = 123; + MyClass.sppp = 123; return MyClass; }()); MyClass.prototype.extension1 = function (p) { this.p = p; this.pp = p; this.ppp = p; + MyClass.sp = p; + MyClass.spp = p; + MyClass.sppp = p; }; MyClass.prototype.extension2 = function (p) { this.p = p; this.pp = p; this.ppp = p; + MyClass.sp = p; + MyClass.spp = p; + MyClass.sppp = p; }; function extension3(p) { this.p = p; this.pp = p; this.ppp = p; + MyClass.sp = p; + MyClass.spp = p; + MyClass.sppp = p; } MyClass.prototype.extension3 = extension3; diff --git a/tests/baselines/reference/thisTypeAccessibility.symbols b/tests/baselines/reference/thisTypeAccessibility.symbols index 0919d83f8e4..bbb62fa57bc 100644 --- a/tests/baselines/reference/thisTypeAccessibility.symbols +++ b/tests/baselines/reference/thisTypeAccessibility.symbols @@ -1,6 +1,6 @@ === tests/cases/conformance/types/thisType/thisTypeAccessibility.ts === class MyClass { ->MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 4, 1)) +>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1)) private p: number = 123; >p : Symbol(MyClass.p, Decl(thisTypeAccessibility.ts, 0, 15)) @@ -10,116 +10,179 @@ class MyClass { public ppp: number = 123; >ppp : Symbol(MyClass.ppp, Decl(thisTypeAccessibility.ts, 2, 31)) + + private static sp: number = 123; +>sp : Symbol(MyClass.sp, Decl(thisTypeAccessibility.ts, 3, 29)) + + protected static spp: number = 123; +>spp : Symbol(MyClass.spp, Decl(thisTypeAccessibility.ts, 4, 36)) + + public static sppp: number = 123; +>sppp : Symbol(MyClass.sppp, Decl(thisTypeAccessibility.ts, 5, 39)) } interface MyClass { ->MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 4, 1)) +>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1)) extension1(p: number): void; ->extension1 : Symbol(MyClass.extension1, Decl(thisTypeAccessibility.ts, 6, 19)) ->p : Symbol(p, Decl(thisTypeAccessibility.ts, 7, 15)) +>extension1 : Symbol(MyClass.extension1, Decl(thisTypeAccessibility.ts, 9, 19)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 10, 15)) extension2(p: number): void; ->extension2 : Symbol(MyClass.extension2, Decl(thisTypeAccessibility.ts, 7, 32)) ->p : Symbol(p, Decl(thisTypeAccessibility.ts, 8, 15)) +>extension2 : Symbol(MyClass.extension2, Decl(thisTypeAccessibility.ts, 10, 32)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 11, 15)) extension3(p: number): void; ->extension3 : Symbol(MyClass.extension3, Decl(thisTypeAccessibility.ts, 8, 32)) ->p : Symbol(p, Decl(thisTypeAccessibility.ts, 9, 15)) +>extension3 : Symbol(MyClass.extension3, Decl(thisTypeAccessibility.ts, 11, 32)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 12, 15)) } MyClass.prototype.extension1 = function (this: MyClass, p: number) { ->MyClass.prototype.extension1 : Symbol(MyClass.extension1, Decl(thisTypeAccessibility.ts, 6, 19)) +>MyClass.prototype.extension1 : Symbol(MyClass.extension1, Decl(thisTypeAccessibility.ts, 9, 19)) >MyClass.prototype : Symbol(MyClass.prototype) ->MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 4, 1)) +>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1)) >prototype : Symbol(MyClass.prototype) ->extension1 : Symbol(MyClass.extension1, Decl(thisTypeAccessibility.ts, 6, 19)) ->this : Symbol(this, Decl(thisTypeAccessibility.ts, 12, 41)) ->MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 4, 1)) ->p : Symbol(p, Decl(thisTypeAccessibility.ts, 12, 55)) +>extension1 : Symbol(MyClass.extension1, Decl(thisTypeAccessibility.ts, 9, 19)) +>this : Symbol(this, Decl(thisTypeAccessibility.ts, 15, 41)) +>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 15, 55)) this.p = p; >this.p : Symbol(MyClass.p, Decl(thisTypeAccessibility.ts, 0, 15)) ->this : Symbol(this, Decl(thisTypeAccessibility.ts, 12, 41)) +>this : Symbol(this, Decl(thisTypeAccessibility.ts, 15, 41)) >p : Symbol(MyClass.p, Decl(thisTypeAccessibility.ts, 0, 15)) ->p : Symbol(p, Decl(thisTypeAccessibility.ts, 12, 55)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 15, 55)) this.pp = p; >this.pp : Symbol(MyClass.pp, Decl(thisTypeAccessibility.ts, 1, 28)) ->this : Symbol(this, Decl(thisTypeAccessibility.ts, 12, 41)) +>this : Symbol(this, Decl(thisTypeAccessibility.ts, 15, 41)) >pp : Symbol(MyClass.pp, Decl(thisTypeAccessibility.ts, 1, 28)) ->p : Symbol(p, Decl(thisTypeAccessibility.ts, 12, 55)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 15, 55)) this.ppp = p; >this.ppp : Symbol(MyClass.ppp, Decl(thisTypeAccessibility.ts, 2, 31)) ->this : Symbol(this, Decl(thisTypeAccessibility.ts, 12, 41)) +>this : Symbol(this, Decl(thisTypeAccessibility.ts, 15, 41)) >ppp : Symbol(MyClass.ppp, Decl(thisTypeAccessibility.ts, 2, 31)) ->p : Symbol(p, Decl(thisTypeAccessibility.ts, 12, 55)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 15, 55)) + + MyClass.sp = p; +>MyClass.sp : Symbol(MyClass.sp, Decl(thisTypeAccessibility.ts, 3, 29)) +>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1)) +>sp : Symbol(MyClass.sp, Decl(thisTypeAccessibility.ts, 3, 29)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 15, 55)) + + MyClass.spp = p; +>MyClass.spp : Symbol(MyClass.spp, Decl(thisTypeAccessibility.ts, 4, 36)) +>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1)) +>spp : Symbol(MyClass.spp, Decl(thisTypeAccessibility.ts, 4, 36)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 15, 55)) + + MyClass.sppp = p; +>MyClass.sppp : Symbol(MyClass.sppp, Decl(thisTypeAccessibility.ts, 5, 39)) +>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1)) +>sppp : Symbol(MyClass.sppp, Decl(thisTypeAccessibility.ts, 5, 39)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 15, 55)) } MyClass.prototype.extension2 = function (this: T, p: number) { ->MyClass.prototype.extension2 : Symbol(MyClass.extension2, Decl(thisTypeAccessibility.ts, 7, 32)) +>MyClass.prototype.extension2 : Symbol(MyClass.extension2, Decl(thisTypeAccessibility.ts, 10, 32)) >MyClass.prototype : Symbol(MyClass.prototype) ->MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 4, 1)) +>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1)) >prototype : Symbol(MyClass.prototype) ->extension2 : Symbol(MyClass.extension2, Decl(thisTypeAccessibility.ts, 7, 32)) ->T : Symbol(T, Decl(thisTypeAccessibility.ts, 18, 40)) ->MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 4, 1)) ->this : Symbol(this, Decl(thisTypeAccessibility.ts, 18, 60)) ->T : Symbol(T, Decl(thisTypeAccessibility.ts, 18, 40)) ->p : Symbol(p, Decl(thisTypeAccessibility.ts, 18, 68)) +>extension2 : Symbol(MyClass.extension2, Decl(thisTypeAccessibility.ts, 10, 32)) +>T : Symbol(T, Decl(thisTypeAccessibility.ts, 24, 40)) +>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1)) +>this : Symbol(this, Decl(thisTypeAccessibility.ts, 24, 60)) +>T : Symbol(T, Decl(thisTypeAccessibility.ts, 24, 40)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 24, 68)) this.p = p; >this.p : Symbol(MyClass.p, Decl(thisTypeAccessibility.ts, 0, 15)) ->this : Symbol(this, Decl(thisTypeAccessibility.ts, 18, 60)) +>this : Symbol(this, Decl(thisTypeAccessibility.ts, 24, 60)) >p : Symbol(MyClass.p, Decl(thisTypeAccessibility.ts, 0, 15)) ->p : Symbol(p, Decl(thisTypeAccessibility.ts, 18, 68)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 24, 68)) this.pp = p; >this.pp : Symbol(MyClass.pp, Decl(thisTypeAccessibility.ts, 1, 28)) ->this : Symbol(this, Decl(thisTypeAccessibility.ts, 18, 60)) +>this : Symbol(this, Decl(thisTypeAccessibility.ts, 24, 60)) >pp : Symbol(MyClass.pp, Decl(thisTypeAccessibility.ts, 1, 28)) ->p : Symbol(p, Decl(thisTypeAccessibility.ts, 18, 68)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 24, 68)) this.ppp = p; >this.ppp : Symbol(MyClass.ppp, Decl(thisTypeAccessibility.ts, 2, 31)) ->this : Symbol(this, Decl(thisTypeAccessibility.ts, 18, 60)) +>this : Symbol(this, Decl(thisTypeAccessibility.ts, 24, 60)) >ppp : Symbol(MyClass.ppp, Decl(thisTypeAccessibility.ts, 2, 31)) ->p : Symbol(p, Decl(thisTypeAccessibility.ts, 18, 68)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 24, 68)) + + MyClass.sp = p; +>MyClass.sp : Symbol(MyClass.sp, Decl(thisTypeAccessibility.ts, 3, 29)) +>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1)) +>sp : Symbol(MyClass.sp, Decl(thisTypeAccessibility.ts, 3, 29)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 24, 68)) + + MyClass.spp = p; +>MyClass.spp : Symbol(MyClass.spp, Decl(thisTypeAccessibility.ts, 4, 36)) +>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1)) +>spp : Symbol(MyClass.spp, Decl(thisTypeAccessibility.ts, 4, 36)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 24, 68)) + + MyClass.sppp = p; +>MyClass.sppp : Symbol(MyClass.sppp, Decl(thisTypeAccessibility.ts, 5, 39)) +>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1)) +>sppp : Symbol(MyClass.sppp, Decl(thisTypeAccessibility.ts, 5, 39)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 24, 68)) } function extension3 (this: T, p: number) { ->extension3 : Symbol(extension3, Decl(thisTypeAccessibility.ts, 22, 1)) ->T : Symbol(T, Decl(thisTypeAccessibility.ts, 24, 20)) ->MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 4, 1)) ->this : Symbol(this, Decl(thisTypeAccessibility.ts, 24, 40)) ->T : Symbol(T, Decl(thisTypeAccessibility.ts, 24, 20)) ->p : Symbol(p, Decl(thisTypeAccessibility.ts, 24, 48)) +>extension3 : Symbol(extension3, Decl(thisTypeAccessibility.ts, 31, 1)) +>T : Symbol(T, Decl(thisTypeAccessibility.ts, 33, 20)) +>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1)) +>this : Symbol(this, Decl(thisTypeAccessibility.ts, 33, 40)) +>T : Symbol(T, Decl(thisTypeAccessibility.ts, 33, 20)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 33, 48)) this.p = p; >this.p : Symbol(MyClass.p, Decl(thisTypeAccessibility.ts, 0, 15)) ->this : Symbol(this, Decl(thisTypeAccessibility.ts, 24, 40)) +>this : Symbol(this, Decl(thisTypeAccessibility.ts, 33, 40)) >p : Symbol(MyClass.p, Decl(thisTypeAccessibility.ts, 0, 15)) ->p : Symbol(p, Decl(thisTypeAccessibility.ts, 24, 48)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 33, 48)) this.pp = p; >this.pp : Symbol(MyClass.pp, Decl(thisTypeAccessibility.ts, 1, 28)) ->this : Symbol(this, Decl(thisTypeAccessibility.ts, 24, 40)) +>this : Symbol(this, Decl(thisTypeAccessibility.ts, 33, 40)) >pp : Symbol(MyClass.pp, Decl(thisTypeAccessibility.ts, 1, 28)) ->p : Symbol(p, Decl(thisTypeAccessibility.ts, 24, 48)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 33, 48)) this.ppp = p; >this.ppp : Symbol(MyClass.ppp, Decl(thisTypeAccessibility.ts, 2, 31)) ->this : Symbol(this, Decl(thisTypeAccessibility.ts, 24, 40)) +>this : Symbol(this, Decl(thisTypeAccessibility.ts, 33, 40)) >ppp : Symbol(MyClass.ppp, Decl(thisTypeAccessibility.ts, 2, 31)) ->p : Symbol(p, Decl(thisTypeAccessibility.ts, 24, 48)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 33, 48)) + + MyClass.sp = p; +>MyClass.sp : Symbol(MyClass.sp, Decl(thisTypeAccessibility.ts, 3, 29)) +>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1)) +>sp : Symbol(MyClass.sp, Decl(thisTypeAccessibility.ts, 3, 29)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 33, 48)) + + MyClass.spp = p; +>MyClass.spp : Symbol(MyClass.spp, Decl(thisTypeAccessibility.ts, 4, 36)) +>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1)) +>spp : Symbol(MyClass.spp, Decl(thisTypeAccessibility.ts, 4, 36)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 33, 48)) + + MyClass.sppp = p; +>MyClass.sppp : Symbol(MyClass.sppp, Decl(thisTypeAccessibility.ts, 5, 39)) +>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1)) +>sppp : Symbol(MyClass.sppp, Decl(thisTypeAccessibility.ts, 5, 39)) +>p : Symbol(p, Decl(thisTypeAccessibility.ts, 33, 48)) } MyClass.prototype.extension3 = extension3; ->MyClass.prototype.extension3 : Symbol(MyClass.extension3, Decl(thisTypeAccessibility.ts, 8, 32)) +>MyClass.prototype.extension3 : Symbol(MyClass.extension3, Decl(thisTypeAccessibility.ts, 11, 32)) >MyClass.prototype : Symbol(MyClass.prototype) ->MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 4, 1)) +>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1)) >prototype : Symbol(MyClass.prototype) ->extension3 : Symbol(MyClass.extension3, Decl(thisTypeAccessibility.ts, 8, 32)) ->extension3 : Symbol(extension3, Decl(thisTypeAccessibility.ts, 22, 1)) +>extension3 : Symbol(MyClass.extension3, Decl(thisTypeAccessibility.ts, 11, 32)) +>extension3 : Symbol(extension3, Decl(thisTypeAccessibility.ts, 31, 1)) diff --git a/tests/baselines/reference/thisTypeAccessibility.types b/tests/baselines/reference/thisTypeAccessibility.types index 3eb0f46f1b7..61e9434e4f0 100644 --- a/tests/baselines/reference/thisTypeAccessibility.types +++ b/tests/baselines/reference/thisTypeAccessibility.types @@ -12,6 +12,18 @@ class MyClass { public ppp: number = 123; >ppp : number +>123 : 123 + + private static sp: number = 123; +>sp : number +>123 : 123 + + protected static spp: number = 123; +>spp : number +>123 : 123 + + public static sppp: number = 123; +>sppp : number >123 : 123 } @@ -32,13 +44,13 @@ interface MyClass { } MyClass.prototype.extension1 = function (this: MyClass, p: number) { ->MyClass.prototype.extension1 = function (this: MyClass, p: number) { this.p = p; this.pp = p; this.ppp = p;} : (this: MyClass, p: number) => void +>MyClass.prototype.extension1 = function (this: MyClass, p: number) { this.p = p; this.pp = p; this.ppp = p; MyClass.sp = p; MyClass.spp = p; MyClass.sppp = p;} : (this: MyClass, p: number) => void >MyClass.prototype.extension1 : (p: number) => void >MyClass.prototype : MyClass >MyClass : typeof MyClass >prototype : MyClass >extension1 : (p: number) => void ->function (this: MyClass, p: number) { this.p = p; this.pp = p; this.ppp = p;} : (this: MyClass, p: number) => void +>function (this: MyClass, p: number) { this.p = p; this.pp = p; this.ppp = p; MyClass.sp = p; MyClass.spp = p; MyClass.sppp = p;} : (this: MyClass, p: number) => void >this : MyClass >MyClass : MyClass >p : number @@ -62,17 +74,38 @@ MyClass.prototype.extension1 = function (this: MyClass, p: number) { >this.ppp : number >this : MyClass >ppp : number +>p : number + + MyClass.sp = p; +>MyClass.sp = p : number +>MyClass.sp : number +>MyClass : typeof MyClass +>sp : number +>p : number + + MyClass.spp = p; +>MyClass.spp = p : number +>MyClass.spp : number +>MyClass : typeof MyClass +>spp : number +>p : number + + MyClass.sppp = p; +>MyClass.sppp = p : number +>MyClass.sppp : number +>MyClass : typeof MyClass +>sppp : number >p : number } MyClass.prototype.extension2 = function (this: T, p: number) { ->MyClass.prototype.extension2 = function (this: T, p: number) { this.p = p; this.pp = p; this.ppp = p;} : (this: T, p: number) => void +>MyClass.prototype.extension2 = function (this: T, p: number) { this.p = p; this.pp = p; this.ppp = p; MyClass.sp = p; MyClass.spp = p; MyClass.sppp = p;} : (this: T, p: number) => void >MyClass.prototype.extension2 : (p: number) => void >MyClass.prototype : MyClass >MyClass : typeof MyClass >prototype : MyClass >extension2 : (p: number) => void ->function (this: T, p: number) { this.p = p; this.pp = p; this.ppp = p;} : (this: T, p: number) => void +>function (this: T, p: number) { this.p = p; this.pp = p; this.ppp = p; MyClass.sp = p; MyClass.spp = p; MyClass.sppp = p;} : (this: T, p: number) => void >T : T >MyClass : MyClass >this : T @@ -98,6 +131,27 @@ MyClass.prototype.extension2 = function (this: T, p: number) >this.ppp : number >this : T >ppp : number +>p : number + + MyClass.sp = p; +>MyClass.sp = p : number +>MyClass.sp : number +>MyClass : typeof MyClass +>sp : number +>p : number + + MyClass.spp = p; +>MyClass.spp = p : number +>MyClass.spp : number +>MyClass : typeof MyClass +>spp : number +>p : number + + MyClass.sppp = p; +>MyClass.sppp = p : number +>MyClass.sppp : number +>MyClass : typeof MyClass +>sppp : number >p : number } @@ -128,6 +182,27 @@ function extension3 (this: T, p: number) { >this.ppp : number >this : T >ppp : number +>p : number + + MyClass.sp = p; +>MyClass.sp = p : number +>MyClass.sp : number +>MyClass : typeof MyClass +>sp : number +>p : number + + MyClass.spp = p; +>MyClass.spp = p : number +>MyClass.spp : number +>MyClass : typeof MyClass +>spp : number +>p : number + + MyClass.sppp = p; +>MyClass.sppp = p : number +>MyClass.sppp : number +>MyClass : typeof MyClass +>sppp : number >p : number } diff --git a/tests/cases/conformance/types/thisType/thisTypeAccessibility.ts b/tests/cases/conformance/types/thisType/thisTypeAccessibility.ts index 28d55222d5a..6cdc9e71225 100644 --- a/tests/cases/conformance/types/thisType/thisTypeAccessibility.ts +++ b/tests/cases/conformance/types/thisType/thisTypeAccessibility.ts @@ -2,6 +2,9 @@ class MyClass { private p: number = 123; protected pp: number = 123; public ppp: number = 123; + private static sp: number = 123; + protected static spp: number = 123; + public static sppp: number = 123; } interface MyClass { @@ -14,18 +17,27 @@ MyClass.prototype.extension1 = function (this: MyClass, p: number) { this.p = p; this.pp = p; this.ppp = p; + MyClass.sp = p; + MyClass.spp = p; + MyClass.sppp = p; } MyClass.prototype.extension2 = function (this: T, p: number) { this.p = p; this.pp = p; this.ppp = p; + MyClass.sp = p; + MyClass.spp = p; + MyClass.sppp = p; } function extension3 (this: T, p: number) { this.p = p; this.pp = p; this.ppp = p; + MyClass.sp = p; + MyClass.spp = p; + MyClass.sppp = p; } MyClass.prototype.extension3 = extension3; From 56d042468f7e84f6ed537e54300fc74bd3054ff1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=96=87=E7=92=90?= Date: Tue, 5 Jun 2018 18:45:36 +0800 Subject: [PATCH 4/6] add commnet --- src/compiler/checker.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index be8b11bf1f0..e2c4c81751c 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -17107,6 +17107,8 @@ namespace ts { }); // A protected property is accessible if the property is within the declaring class or classes derived from it if (!enclosingClass) { + // allow PropertyAccessibility if context is in function with this parameter + // static member access is disallow let thisParameter: ParameterDeclaration | undefined; const thisContainer = getThisContainer(node, /* includeArrowFunctions */ false); if (flags & ModifierFlags.Static || !thisContainer || !isFunctionLike(thisContainer) || !(thisParameter = getThisParameter(thisContainer)) || !thisParameter.type) { From ee310a42f0c20f02f349e4296dbda8b5bde8485e Mon Sep 17 00:00:00 2001 From: kingwl Date: Sat, 9 Jun 2018 03:08:15 +0800 Subject: [PATCH 5/6] move static flag predicate before get container --- src/compiler/checker.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index e2c4c81751c..38cf01ed9b9 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -17110,8 +17110,7 @@ namespace ts { // allow PropertyAccessibility if context is in function with this parameter // static member access is disallow let thisParameter: ParameterDeclaration | undefined; - const thisContainer = getThisContainer(node, /* includeArrowFunctions */ false); - if (flags & ModifierFlags.Static || !thisContainer || !isFunctionLike(thisContainer) || !(thisParameter = getThisParameter(thisContainer)) || !thisParameter.type) { + if (flags & ModifierFlags.Static || !(thisParameter = getThisParameterFromNodeContext(node)) || !thisParameter.type) { error(errorNode, Diagnostics.Property_0_is_protected_and_only_accessible_within_class_1_and_its_subclasses, symbolToString(prop), typeToString(getDeclaringClass(prop) || type)); return false; } @@ -17134,6 +17133,11 @@ namespace ts { return true; } + function getThisParameterFromNodeContext (node: Node) { + const thisContainer = getThisContainer(node, /* includeArrowFunctions */ false); + return thisContainer && isFunctionLike(thisContainer) ? getThisParameter(thisContainer) : undefined; + } + function symbolHasNonMethodDeclaration(symbol: Symbol) { return forEachProperty(symbol, prop => { const propKind = getDeclarationKindFromSymbol(prop); From 153f25a4755e1b166f3db4d8139cb3c082696be0 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Fri, 8 Jun 2018 16:55:49 -0700 Subject: [PATCH 6/6] Updates the graph before checking if file is present in project for error checking When file is moved using getEditsForFileRename, the watch notification could be delayed This could result in project updates in background that could be delayed and result in file not present in the project after its synchronised Fixes #24547 --- .../unittests/tsserverProjectSystem.ts | 146 ++++++++++++++++-- src/server/session.ts | 2 + 2 files changed, 139 insertions(+), 9 deletions(-) diff --git a/src/harness/unittests/tsserverProjectSystem.ts b/src/harness/unittests/tsserverProjectSystem.ts index 70341b18368..9205f7c781e 100644 --- a/src/harness/unittests/tsserverProjectSystem.ts +++ b/src/harness/unittests/tsserverProjectSystem.ts @@ -62,6 +62,18 @@ namespace ts.projectSystem { getLogFileName: () => undefined, }; + function createHasErrorMessageLogger() { + let hasErrorMsg = false; + const { close, hasLevel, loggingEnabled, startGroup, endGroup, info, getLogFileName, perftrc } = nullLogger; + const logger: server.Logger = { + close, hasLevel, loggingEnabled, startGroup, endGroup, info, getLogFileName, perftrc, + msg: () => { + hasErrorMsg = true; + } + }; + return { logger, hasErrorMsg: () => hasErrorMsg }; + } + export class TestTypingsInstaller extends TI.TypingsInstaller implements server.ITypingsInstaller { protected projectService: server.ProjectService; constructor( @@ -2917,14 +2929,7 @@ namespace ts.projectSystem { }); it("Getting errors from closed script info does not throw exception (because of getting project from orphan script info)", () => { - let hasErrorMsg = false; - const { close, hasLevel, loggingEnabled, startGroup, endGroup, info, getLogFileName, perftrc } = nullLogger; - const logger: server.Logger = { - close, hasLevel, loggingEnabled, startGroup, endGroup, info, getLogFileName, perftrc, - msg: () => { - hasErrorMsg = true; - } - }; + const { logger, hasErrorMsg } = createHasErrorMessageLogger(); const f1 = { path: "/a/b/app.ts", content: "let x = 1;" @@ -2954,7 +2959,7 @@ namespace ts.projectSystem { files: [f1.path] } }); - assert.isFalse(hasErrorMsg); + assert.isFalse(hasErrorMsg()); }); it("Changed module resolution reflected when specifying files list", () => { @@ -3320,6 +3325,129 @@ namespace ts.projectSystem { assert.equal(info.containingProjects.length, 0); } }); + + it("handles delayed directory watch invoke on file creation", () => { + const projectRootPath = "/users/username/projects/project"; + const fileB: File = { + path: `${projectRootPath}/b.ts`, + content: "export const b = 10;" + }; + const fileA: File = { + path: `${projectRootPath}/a.ts`, + content: "export const a = 10;" + }; + const fileSubA: File = { + path: `${projectRootPath}/sub/a.ts`, + content: fileA.content + }; + const config: File = { + path: `${projectRootPath}/tsconfig.json`, + content: "{}" + }; + const files = [fileSubA, fileB, config, libFile]; + const host = createServerHost(files); + const { logger, hasErrorMsg } = createHasErrorMessageLogger(); + const session = createSession(host, { canUseEvents: true, noGetErrOnBackgroundUpdate: true, logger }); + openFile(fileB); + openFile(fileSubA); + + const services = session.getProjectService(); + checkNumberOfProjects(services, { configuredProjects: 1 }); + checkProjectActualFiles(services.configuredProjects.get(config.path)!, files.map(f => f.path)); + host.checkTimeoutQueueLengthAndRun(0); + + // This should schedule 2 timeouts for ensuring project structure and ensuring projects for open file + const filesWithFileA = files.map(f => f === fileSubA ? fileA : f); + host.reloadFS(files.map(f => f === fileSubA ? fileA : f)); + host.checkTimeoutQueueLength(2); + + closeFile(fileSubA); + // This should cancel existing updates and schedule new ones + host.checkTimeoutQueueLength(2); + checkNumberOfProjects(services, { configuredProjects: 1 }); + checkProjectActualFiles(services.configuredProjects.get(config.path)!, files.map(f => f.path)); + + // Open the fileA (as if rename) + openFile(fileA); + + // config project is updated to check if fileA is present in it + checkNumberOfProjects(services, { configuredProjects: 1 }); + checkProjectActualFiles(services.configuredProjects.get(config.path)!, filesWithFileA.map(f => f.path)); + + // Run the timeout for updating configured project and ensuring projects for open file + host.checkTimeoutQueueLengthAndRun(2); + checkProjectActualFiles(services.configuredProjects.get(config.path)!, filesWithFileA.map(f => f.path)); + + // file is deleted but watches are not yet invoked + const originalFileExists = host.fileExists; + host.fileExists = s => s === fileA.path ? false : originalFileExists.call(host, s); + closeFile(fileA); + host.checkTimeoutQueueLength(2); // Update configured project and projects for open file + checkProjectActualFiles(services.configuredProjects.get(config.path)!, filesWithFileA.map(f => f.path)); + + // host.fileExists = originalFileExists; + openFile(fileSubA); + // This should create inferred project since fileSubA not on the disk + checkProjectActualFiles(services.configuredProjects.get(config.path)!, mapDefined(filesWithFileA, f => f === fileA ? undefined : f.path)); + checkProjectActualFiles(services.inferredProjects[0], [fileSubA.path, libFile.path]); + + host.checkTimeoutQueueLengthAndRun(2); // Update configured project and projects for open file + host.fileExists = originalFileExists; + + // Actually trigger the file move + host.reloadFS(files); + host.checkTimeoutQueueLength(2); + const fileBErrorTimeoutId = host.getNextTimeoutId(); + + session.executeCommandSeq({ + command: protocol.CommandTypes.Geterr, + arguments: { + files: [fileB.path, fileSubA.path], + delay: 0 + } + }); + const getErrSeqId = session.getSeq(); + host.checkTimeoutQueueLength(3); + + session.clearMessages(); + host.runQueuedTimeoutCallbacks(fileBErrorTimeoutId); + checkErrorMessage(session, "syntaxDiag", { file: fileB.path, diagnostics: [] }); + + session.clearMessages(); + host.runQueuedImmediateCallbacks(); + checkErrorMessage(session, "semanticDiag", { file: fileB.path, diagnostics: [] }); + + session.clearMessages(); + const fileSubAErrorTimeoutId = host.getNextTimeoutId(); + host.runQueuedImmediateCallbacks(); + checkErrorMessage(session, "suggestionDiag", { file: fileB.path, diagnostics: [] }); + + session.clearMessages(); + host.checkTimeoutQueueLength(3); + host.runQueuedTimeoutCallbacks(fileSubAErrorTimeoutId); + checkCompleteEvent(session, 1, getErrSeqId); + assert.isFalse(hasErrorMsg()); + + function openFile(file: File) { + session.executeCommandSeq({ + command: protocol.CommandTypes.Open, + arguments: { + file: file.path, + fileContent: file.content, + projectRootPath + } + }); + } + + function closeFile(file: File) { + session.executeCommandSeq({ + command: protocol.CommandTypes.Close, + arguments: { + file: file.path + } + }); + } + }); }); describe("tsserverProjectSystem Proper errors", () => { diff --git a/src/server/session.ts b/src/server/session.ts index d24e2addd33..2f36759b8f2 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -511,6 +511,8 @@ namespace ts.server { const { fileName, project } = checkList[index]; index++; + // Ensure the project is upto date before checking if this file is present in the project + project.updateGraph(); if (!project.containsFile(fileName, requireOpen)) { return; }