Merge pull request #3946 from Microsoft/disambiguating
Fix resolution when block-scoped variable names collide with those of other entities
This commit is contained in:
commit
0a9fb1a7b5
21 changed files with 230 additions and 1 deletions
|
@ -592,7 +592,19 @@ namespace ts {
|
|||
declarationNameToString(propertyName), typeof nameArg === "string" ? nameArg : declarationNameToString(nameArg));
|
||||
return undefined;
|
||||
}
|
||||
if (result.flags & SymbolFlags.BlockScopedVariable) {
|
||||
|
||||
// Only check for block-scoped variable if we are looking for the
|
||||
// name with variable meaning
|
||||
// For example,
|
||||
// declare module foo {
|
||||
// interface bar {}
|
||||
// }
|
||||
// let foo/*1*/: foo/*2*/.bar;
|
||||
// The foo at /*1*/ and /*2*/ will share same symbol with two meaning
|
||||
// block - scope variable and namespace module. However, only when we
|
||||
// try to resolve name in /*1*/ which is used in variable position,
|
||||
// we want to check for block- scoped
|
||||
if (meaning & SymbolFlags.BlockScopedVariable && result.flags & SymbolFlags.BlockScopedVariable) {
|
||||
checkResolvedBlockScopedVariable(result, errorLocation);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
//// [resolveInterfaceNameWithSameLetDeclarationName1.ts]
|
||||
interface bar { }
|
||||
let bar: bar;
|
||||
|
||||
|
||||
//// [resolveInterfaceNameWithSameLetDeclarationName1.js]
|
||||
var bar;
|
|
@ -0,0 +1,8 @@
|
|||
=== tests/cases/compiler/resolveInterfaceNameWithSameLetDeclarationName1.ts ===
|
||||
interface bar { }
|
||||
>bar : Symbol(bar, Decl(resolveInterfaceNameWithSameLetDeclarationName1.ts, 0, 0), Decl(resolveInterfaceNameWithSameLetDeclarationName1.ts, 1, 3))
|
||||
|
||||
let bar: bar;
|
||||
>bar : Symbol(bar, Decl(resolveInterfaceNameWithSameLetDeclarationName1.ts, 0, 0), Decl(resolveInterfaceNameWithSameLetDeclarationName1.ts, 1, 3))
|
||||
>bar : Symbol(bar, Decl(resolveInterfaceNameWithSameLetDeclarationName1.ts, 0, 0), Decl(resolveInterfaceNameWithSameLetDeclarationName1.ts, 1, 3))
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
=== tests/cases/compiler/resolveInterfaceNameWithSameLetDeclarationName1.ts ===
|
||||
interface bar { }
|
||||
>bar : bar
|
||||
|
||||
let bar: bar;
|
||||
>bar : bar
|
||||
>bar : bar
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
//// [resolveInterfaceNameWithSameLetDeclarationName2.ts]
|
||||
interface foo { }
|
||||
interface bar { }
|
||||
let bar: bar | foo;
|
||||
let foo: bar | foo;
|
||||
|
||||
//// [resolveInterfaceNameWithSameLetDeclarationName2.js]
|
||||
var bar;
|
||||
var foo;
|
|
@ -0,0 +1,17 @@
|
|||
=== tests/cases/compiler/resolveInterfaceNameWithSameLetDeclarationName2.ts ===
|
||||
interface foo { }
|
||||
>foo : Symbol(foo, Decl(resolveInterfaceNameWithSameLetDeclarationName2.ts, 0, 0), Decl(resolveInterfaceNameWithSameLetDeclarationName2.ts, 3, 3))
|
||||
|
||||
interface bar { }
|
||||
>bar : Symbol(bar, Decl(resolveInterfaceNameWithSameLetDeclarationName2.ts, 0, 17), Decl(resolveInterfaceNameWithSameLetDeclarationName2.ts, 2, 3))
|
||||
|
||||
let bar: bar | foo;
|
||||
>bar : Symbol(bar, Decl(resolveInterfaceNameWithSameLetDeclarationName2.ts, 0, 17), Decl(resolveInterfaceNameWithSameLetDeclarationName2.ts, 2, 3))
|
||||
>bar : Symbol(bar, Decl(resolveInterfaceNameWithSameLetDeclarationName2.ts, 0, 17), Decl(resolveInterfaceNameWithSameLetDeclarationName2.ts, 2, 3))
|
||||
>foo : Symbol(foo, Decl(resolveInterfaceNameWithSameLetDeclarationName2.ts, 0, 0), Decl(resolveInterfaceNameWithSameLetDeclarationName2.ts, 3, 3))
|
||||
|
||||
let foo: bar | foo;
|
||||
>foo : Symbol(foo, Decl(resolveInterfaceNameWithSameLetDeclarationName2.ts, 0, 0), Decl(resolveInterfaceNameWithSameLetDeclarationName2.ts, 3, 3))
|
||||
>bar : Symbol(bar, Decl(resolveInterfaceNameWithSameLetDeclarationName2.ts, 0, 17), Decl(resolveInterfaceNameWithSameLetDeclarationName2.ts, 2, 3))
|
||||
>foo : Symbol(foo, Decl(resolveInterfaceNameWithSameLetDeclarationName2.ts, 0, 0), Decl(resolveInterfaceNameWithSameLetDeclarationName2.ts, 3, 3))
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
=== tests/cases/compiler/resolveInterfaceNameWithSameLetDeclarationName2.ts ===
|
||||
interface foo { }
|
||||
>foo : foo
|
||||
|
||||
interface bar { }
|
||||
>bar : bar
|
||||
|
||||
let bar: bar | foo;
|
||||
>bar : bar | foo
|
||||
>bar : bar
|
||||
>foo : foo
|
||||
|
||||
let foo: bar | foo;
|
||||
>foo : bar | foo
|
||||
>bar : bar
|
||||
>foo : foo
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
//// [resolveModuleNameWithSameLetDeclarationName1.ts]
|
||||
declare module foo {
|
||||
|
||||
interface Bar {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
let foo: foo.Bar;
|
||||
|
||||
//// [resolveModuleNameWithSameLetDeclarationName1.js]
|
||||
var foo;
|
|
@ -0,0 +1,15 @@
|
|||
=== tests/cases/compiler/resolveModuleNameWithSameLetDeclarationName1.ts ===
|
||||
declare module foo {
|
||||
>foo : Symbol(foo, Decl(resolveModuleNameWithSameLetDeclarationName1.ts, 0, 0), Decl(resolveModuleNameWithSameLetDeclarationName1.ts, 7, 3))
|
||||
|
||||
interface Bar {
|
||||
>Bar : Symbol(Bar, Decl(resolveModuleNameWithSameLetDeclarationName1.ts, 0, 20))
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
let foo: foo.Bar;
|
||||
>foo : Symbol(foo, Decl(resolveModuleNameWithSameLetDeclarationName1.ts, 0, 0), Decl(resolveModuleNameWithSameLetDeclarationName1.ts, 7, 3))
|
||||
>foo : Symbol(foo, Decl(resolveModuleNameWithSameLetDeclarationName1.ts, 0, 0), Decl(resolveModuleNameWithSameLetDeclarationName1.ts, 7, 3))
|
||||
>Bar : Symbol(foo.Bar, Decl(resolveModuleNameWithSameLetDeclarationName1.ts, 0, 20))
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
=== tests/cases/compiler/resolveModuleNameWithSameLetDeclarationName1.ts ===
|
||||
declare module foo {
|
||||
>foo : Bar
|
||||
|
||||
interface Bar {
|
||||
>Bar : Bar
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
let foo: foo.Bar;
|
||||
>foo : foo.Bar
|
||||
>foo : any
|
||||
>Bar : foo.Bar
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
//// [resolveModuleNameWithSameLetDeclarationName2.ts]
|
||||
declare module "punycode" {
|
||||
interface ucs2 {
|
||||
decode(string: string): string;
|
||||
encode(codePoints: number[]): string;
|
||||
}
|
||||
|
||||
export let ucs2: ucs2;
|
||||
}
|
||||
|
||||
//// [resolveModuleNameWithSameLetDeclarationName2.js]
|
|
@ -0,0 +1,18 @@
|
|||
=== tests/cases/compiler/resolveModuleNameWithSameLetDeclarationName2.ts ===
|
||||
declare module "punycode" {
|
||||
interface ucs2 {
|
||||
>ucs2 : Symbol(ucs2, Decl(resolveModuleNameWithSameLetDeclarationName2.ts, 0, 27), Decl(resolveModuleNameWithSameLetDeclarationName2.ts, 6, 14))
|
||||
|
||||
decode(string: string): string;
|
||||
>decode : Symbol(decode, Decl(resolveModuleNameWithSameLetDeclarationName2.ts, 1, 20))
|
||||
>string : Symbol(string, Decl(resolveModuleNameWithSameLetDeclarationName2.ts, 2, 15))
|
||||
|
||||
encode(codePoints: number[]): string;
|
||||
>encode : Symbol(encode, Decl(resolveModuleNameWithSameLetDeclarationName2.ts, 2, 39))
|
||||
>codePoints : Symbol(codePoints, Decl(resolveModuleNameWithSameLetDeclarationName2.ts, 3, 15))
|
||||
}
|
||||
|
||||
export let ucs2: ucs2;
|
||||
>ucs2 : Symbol(ucs2, Decl(resolveModuleNameWithSameLetDeclarationName2.ts, 0, 27), Decl(resolveModuleNameWithSameLetDeclarationName2.ts, 6, 14))
|
||||
>ucs2 : Symbol(ucs2, Decl(resolveModuleNameWithSameLetDeclarationName2.ts, 0, 27), Decl(resolveModuleNameWithSameLetDeclarationName2.ts, 6, 14))
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
=== tests/cases/compiler/resolveModuleNameWithSameLetDeclarationName2.ts ===
|
||||
declare module "punycode" {
|
||||
interface ucs2 {
|
||||
>ucs2 : ucs2
|
||||
|
||||
decode(string: string): string;
|
||||
>decode : (string: string) => string
|
||||
>string : string
|
||||
|
||||
encode(codePoints: number[]): string;
|
||||
>encode : (codePoints: number[]) => string
|
||||
>codePoints : number[]
|
||||
}
|
||||
|
||||
export let ucs2: ucs2;
|
||||
>ucs2 : ucs2
|
||||
>ucs2 : ucs2
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
//// [resolveTypeAliasWithSameLetDeclarationName1.ts]
|
||||
class C { }
|
||||
type baz = C;
|
||||
let baz: baz;
|
||||
|
||||
|
||||
//// [resolveTypeAliasWithSameLetDeclarationName1.js]
|
||||
var C = (function () {
|
||||
function C() {
|
||||
}
|
||||
return C;
|
||||
})();
|
||||
var baz;
|
|
@ -0,0 +1,12 @@
|
|||
=== tests/cases/compiler/resolveTypeAliasWithSameLetDeclarationName1.ts ===
|
||||
class C { }
|
||||
>C : Symbol(C, Decl(resolveTypeAliasWithSameLetDeclarationName1.ts, 0, 0))
|
||||
|
||||
type baz = C;
|
||||
>baz : Symbol(baz, Decl(resolveTypeAliasWithSameLetDeclarationName1.ts, 0, 11), Decl(resolveTypeAliasWithSameLetDeclarationName1.ts, 2, 3))
|
||||
>C : Symbol(C, Decl(resolveTypeAliasWithSameLetDeclarationName1.ts, 0, 0))
|
||||
|
||||
let baz: baz;
|
||||
>baz : Symbol(baz, Decl(resolveTypeAliasWithSameLetDeclarationName1.ts, 0, 11), Decl(resolveTypeAliasWithSameLetDeclarationName1.ts, 2, 3))
|
||||
>baz : Symbol(baz, Decl(resolveTypeAliasWithSameLetDeclarationName1.ts, 0, 11), Decl(resolveTypeAliasWithSameLetDeclarationName1.ts, 2, 3))
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
=== tests/cases/compiler/resolveTypeAliasWithSameLetDeclarationName1.ts ===
|
||||
class C { }
|
||||
>C : C
|
||||
|
||||
type baz = C;
|
||||
>baz : C
|
||||
>C : C
|
||||
|
||||
let baz: baz;
|
||||
>baz : C
|
||||
>baz : C
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
interface bar { }
|
||||
let bar: bar;
|
|
@ -0,0 +1,4 @@
|
|||
interface foo { }
|
||||
interface bar { }
|
||||
let bar: bar | foo;
|
||||
let foo: bar | foo;
|
|
@ -0,0 +1,8 @@
|
|||
declare module foo {
|
||||
|
||||
interface Bar {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
let foo: foo.Bar;
|
|
@ -0,0 +1,8 @@
|
|||
declare module "punycode" {
|
||||
interface ucs2 {
|
||||
decode(string: string): string;
|
||||
encode(codePoints: number[]): string;
|
||||
}
|
||||
|
||||
export let ucs2: ucs2;
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
class C { }
|
||||
type baz = C;
|
||||
let baz: baz;
|
Loading…
Reference in a new issue