Merge pull request #6736 from Microsoft/crossFileDeclarationMerging
fix access check issues when declaration is in multiple files
This commit is contained in:
commit
b037419f52
9 changed files with 171 additions and 1 deletions
|
@ -8776,7 +8776,7 @@ namespace ts {
|
|||
*/
|
||||
function checkClassPropertyAccess(node: PropertyAccessExpression | QualifiedName, left: Expression | QualifiedName, type: Type, prop: Symbol): boolean {
|
||||
const flags = getDeclarationFlagsFromSymbol(prop);
|
||||
const declaringClass = <InterfaceType>getDeclaredTypeOfSymbol(prop.parent);
|
||||
const declaringClass = <InterfaceType>getDeclaredTypeOfSymbol(getMergedSymbol(prop.parent));
|
||||
|
||||
if (left.kind === SyntaxKind.SuperKeyword) {
|
||||
const errorNode = node.kind === SyntaxKind.PropertyAccessExpression ?
|
||||
|
|
21
tests/baselines/reference/declarationMerging1.js
Normal file
21
tests/baselines/reference/declarationMerging1.js
Normal file
|
@ -0,0 +1,21 @@
|
|||
//// [tests/cases/compiler/declarationMerging1.ts] ////
|
||||
|
||||
//// [file1.ts]
|
||||
class A {
|
||||
protected _f: number;
|
||||
getF() { return this._f; }
|
||||
}
|
||||
|
||||
//// [file2.ts]
|
||||
interface A {
|
||||
run();
|
||||
}
|
||||
|
||||
//// [file1.js]
|
||||
var A = (function () {
|
||||
function A() {
|
||||
}
|
||||
A.prototype.getF = function () { return this._f; };
|
||||
return A;
|
||||
}());
|
||||
//// [file2.js]
|
21
tests/baselines/reference/declarationMerging1.symbols
Normal file
21
tests/baselines/reference/declarationMerging1.symbols
Normal file
|
@ -0,0 +1,21 @@
|
|||
=== tests/cases/compiler/file1.ts ===
|
||||
class A {
|
||||
>A : Symbol(A, Decl(file1.ts, 0, 0), Decl(file2.ts, 0, 0))
|
||||
|
||||
protected _f: number;
|
||||
>_f : Symbol(_f, Decl(file1.ts, 0, 9))
|
||||
|
||||
getF() { return this._f; }
|
||||
>getF : Symbol(getF, Decl(file1.ts, 1, 25))
|
||||
>this._f : Symbol(_f, Decl(file1.ts, 0, 9))
|
||||
>this : Symbol(A, Decl(file1.ts, 0, 0), Decl(file2.ts, 0, 0))
|
||||
>_f : Symbol(_f, Decl(file1.ts, 0, 9))
|
||||
}
|
||||
|
||||
=== tests/cases/compiler/file2.ts ===
|
||||
interface A {
|
||||
>A : Symbol(A, Decl(file1.ts, 0, 0), Decl(file2.ts, 0, 0))
|
||||
|
||||
run();
|
||||
>run : Symbol(run, Decl(file2.ts, 0, 13))
|
||||
}
|
21
tests/baselines/reference/declarationMerging1.types
Normal file
21
tests/baselines/reference/declarationMerging1.types
Normal file
|
@ -0,0 +1,21 @@
|
|||
=== tests/cases/compiler/file1.ts ===
|
||||
class A {
|
||||
>A : A
|
||||
|
||||
protected _f: number;
|
||||
>_f : number
|
||||
|
||||
getF() { return this._f; }
|
||||
>getF : () => number
|
||||
>this._f : number
|
||||
>this : this
|
||||
>_f : number
|
||||
}
|
||||
|
||||
=== tests/cases/compiler/file2.ts ===
|
||||
interface A {
|
||||
>A : A
|
||||
|
||||
run();
|
||||
>run : () => any
|
||||
}
|
32
tests/baselines/reference/declarationMerging2.js
Normal file
32
tests/baselines/reference/declarationMerging2.js
Normal file
|
@ -0,0 +1,32 @@
|
|||
//// [tests/cases/compiler/declarationMerging2.ts] ////
|
||||
|
||||
//// [a.ts]
|
||||
|
||||
export class A {
|
||||
protected _f: number;
|
||||
getF() { return this._f; }
|
||||
}
|
||||
|
||||
//// [b.ts]
|
||||
export {}
|
||||
declare module "./a" {
|
||||
interface A {
|
||||
run();
|
||||
}
|
||||
}
|
||||
|
||||
//// [a.js]
|
||||
define(["require", "exports"], function (require, exports) {
|
||||
"use strict";
|
||||
var A = (function () {
|
||||
function A() {
|
||||
}
|
||||
A.prototype.getF = function () { return this._f; };
|
||||
return A;
|
||||
}());
|
||||
exports.A = A;
|
||||
});
|
||||
//// [b.js]
|
||||
define(["require", "exports"], function (require, exports) {
|
||||
"use strict";
|
||||
});
|
25
tests/baselines/reference/declarationMerging2.symbols
Normal file
25
tests/baselines/reference/declarationMerging2.symbols
Normal file
|
@ -0,0 +1,25 @@
|
|||
=== tests/cases/compiler/a.ts ===
|
||||
|
||||
export class A {
|
||||
>A : Symbol(A, Decl(a.ts, 0, 0), Decl(b.ts, 1, 22))
|
||||
|
||||
protected _f: number;
|
||||
>_f : Symbol(_f, Decl(a.ts, 1, 16))
|
||||
|
||||
getF() { return this._f; }
|
||||
>getF : Symbol(getF, Decl(a.ts, 2, 25))
|
||||
>this._f : Symbol(_f, Decl(a.ts, 1, 16))
|
||||
>this : Symbol(A, Decl(a.ts, 0, 0), Decl(b.ts, 1, 22))
|
||||
>_f : Symbol(_f, Decl(a.ts, 1, 16))
|
||||
}
|
||||
|
||||
=== tests/cases/compiler/b.ts ===
|
||||
export {}
|
||||
declare module "./a" {
|
||||
interface A {
|
||||
>A : Symbol(A, Decl(a.ts, 0, 0), Decl(b.ts, 1, 22))
|
||||
|
||||
run();
|
||||
>run : Symbol(run, Decl(b.ts, 2, 17))
|
||||
}
|
||||
}
|
25
tests/baselines/reference/declarationMerging2.types
Normal file
25
tests/baselines/reference/declarationMerging2.types
Normal file
|
@ -0,0 +1,25 @@
|
|||
=== tests/cases/compiler/a.ts ===
|
||||
|
||||
export class A {
|
||||
>A : A
|
||||
|
||||
protected _f: number;
|
||||
>_f : number
|
||||
|
||||
getF() { return this._f; }
|
||||
>getF : () => number
|
||||
>this._f : number
|
||||
>this : this
|
||||
>_f : number
|
||||
}
|
||||
|
||||
=== tests/cases/compiler/b.ts ===
|
||||
export {}
|
||||
declare module "./a" {
|
||||
interface A {
|
||||
>A : A
|
||||
|
||||
run();
|
||||
>run : () => any
|
||||
}
|
||||
}
|
10
tests/cases/compiler/declarationMerging1.ts
Normal file
10
tests/cases/compiler/declarationMerging1.ts
Normal file
|
@ -0,0 +1,10 @@
|
|||
// @filename: file1.ts
|
||||
class A {
|
||||
protected _f: number;
|
||||
getF() { return this._f; }
|
||||
}
|
||||
|
||||
// @filename: file2.ts
|
||||
interface A {
|
||||
run();
|
||||
}
|
15
tests/cases/compiler/declarationMerging2.ts
Normal file
15
tests/cases/compiler/declarationMerging2.ts
Normal file
|
@ -0,0 +1,15 @@
|
|||
// @module: amd
|
||||
|
||||
// @filename: a.ts
|
||||
export class A {
|
||||
protected _f: number;
|
||||
getF() { return this._f; }
|
||||
}
|
||||
|
||||
// @filename: b.ts
|
||||
export {}
|
||||
declare module "./a" {
|
||||
interface A {
|
||||
run();
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue