Skip to content

Commit 5510e07

Browse files
committed
Merge branch 'master' into typedBindCallApply
# Conflicts: # tests/baselines/reference/tsxTypeArgumentPartialDefinitionStillErrors.errors.txt # tests/baselines/reference/wrappedAndRecursiveConstraints4.errors.txt
2 parents 9414fbe + 471bc64 commit 5510e07

File tree

407 files changed

+25357
-14260
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

407 files changed

+25357
-14260
lines changed

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ branches:
2020
- release-2.8
2121
- release-2.9
2222
- release-3.0
23+
- release-3.1
2324

2425
install:
2526
- npm uninstall typescript --no-save

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
"gulp-typescript": "latest",
7676
"istanbul": "latest",
7777
"jake": "latest",
78+
"lodash": "4.17.10",
7879
"merge2": "latest",
7980
"minimist": "latest",
8081
"mkdirp": "latest",

src/compiler/binder.ts

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -234,13 +234,17 @@ namespace ts {
234234
}
235235

236236
if (symbolFlags & SymbolFlags.Value) {
237-
const { valueDeclaration } = symbol;
238-
if (!valueDeclaration ||
239-
(isAssignmentDeclaration(valueDeclaration) && !isAssignmentDeclaration(node)) ||
240-
(valueDeclaration.kind !== node.kind && isEffectiveModuleDeclaration(valueDeclaration))) {
241-
// other kinds of value declarations take precedence over modules and assignment declarations
242-
symbol.valueDeclaration = node;
243-
}
237+
setValueDeclaration(symbol, node);
238+
}
239+
}
240+
241+
function setValueDeclaration(symbol: Symbol, node: Declaration): void {
242+
const { valueDeclaration } = symbol;
243+
if (!valueDeclaration ||
244+
(isAssignmentDeclaration(valueDeclaration) && !isAssignmentDeclaration(node)) ||
245+
(valueDeclaration.kind !== node.kind && isEffectiveModuleDeclaration(valueDeclaration))) {
246+
// other kinds of value declarations take precedence over modules and assignment declarations
247+
symbol.valueDeclaration = node;
244248
}
245249
}
246250

@@ -2286,14 +2290,19 @@ namespace ts {
22862290
bindAnonymousDeclaration(node, SymbolFlags.Alias, getDeclarationName(node)!);
22872291
}
22882292
else {
2289-
const flags = node.kind === SyntaxKind.ExportAssignment && exportAssignmentIsAlias(node)
2293+
const flags = exportAssignmentIsAlias(node)
22902294
// An export default clause with an EntityNameExpression or a class expression exports all meanings of that identifier or expression;
22912295
? SymbolFlags.Alias
22922296
// An export default clause with any other expression exports a value
22932297
: SymbolFlags.Property;
22942298
// If there is an `export default x;` alias declaration, can't `export default` anything else.
22952299
// (In contrast, you can still have `export default function f() {}` and `export default interface I {}`.)
2296-
declareSymbol(container.symbol.exports, container.symbol, node, flags, SymbolFlags.All);
2300+
const symbol = declareSymbol(container.symbol.exports, container.symbol, node, flags, SymbolFlags.All);
2301+
2302+
if (node.isExportEquals) {
2303+
// Will be an error later, since the module already has other exports. Just make sure this has a valueDeclaration set.
2304+
setValueDeclaration(symbol, node);
2305+
}
22972306
}
22982307
}
22992308

@@ -2456,7 +2465,7 @@ namespace ts {
24562465
node.left.parent = node;
24572466
node.right.parent = node;
24582467
const lhs = node.left as PropertyAccessEntityNameExpression;
2459-
bindPropertyAssignment(lhs, lhs, /*isPrototypeProperty*/ false);
2468+
bindPropertyAssignment(lhs.expression, lhs, /*isPrototypeProperty*/ false);
24602469
}
24612470

24622471
/**
@@ -2513,7 +2522,7 @@ namespace ts {
25132522
const isToplevel = isBinaryExpression(propertyAccess.parent)
25142523
? getParentOfBinaryExpression(propertyAccess.parent).parent.kind === SyntaxKind.SourceFile
25152524
: propertyAccess.parent.parent.kind === SyntaxKind.SourceFile;
2516-
if (!isPrototypeProperty && (!namespaceSymbol || !(namespaceSymbol.flags & SymbolFlags.Namespace)) && isToplevel) {
2525+
if (isToplevel && !isPrototypeProperty && (!namespaceSymbol || !(namespaceSymbol.flags & SymbolFlags.Namespace))) {
25172526
// make symbols or add declarations for intermediate containers
25182527
const flags = SymbolFlags.Module | SymbolFlags.Assignment;
25192528
const excludeFlags = SymbolFlags.ValueModuleExcludes & ~SymbolFlags.Assignment;
@@ -2523,7 +2532,9 @@ namespace ts {
25232532
return symbol;
25242533
}
25252534
else {
2526-
return declareSymbol(parent ? parent.exports! : container.locals!, parent, id, flags, excludeFlags);
2535+
const table = parent ? parent.exports! :
2536+
file.jsGlobalAugmentations || (file.jsGlobalAugmentations = createSymbolTable());
2537+
return declareSymbol(table, parent, id, flags, excludeFlags);
25272538
}
25282539
});
25292540
}
@@ -2657,7 +2668,7 @@ namespace ts {
26572668
}
26582669

26592670
if (!isBindingPattern(node.name)) {
2660-
const isEnum = !!getJSDocEnumTag(node);
2671+
const isEnum = isInJSFile(node) && !!getJSDocEnumTag(node);
26612672
const enumFlags = (isEnum ? SymbolFlags.RegularEnum : SymbolFlags.None);
26622673
const enumExcludes = (isEnum ? SymbolFlags.RegularEnumExcludes : SymbolFlags.None);
26632674
if (isBlockOrCatchScoped(node)) {
@@ -2892,6 +2903,9 @@ namespace ts {
28922903
if (local) {
28932904
return local.exportSymbol || local;
28942905
}
2906+
if (isSourceFile(container) && container.jsGlobalAugmentations && container.jsGlobalAugmentations.has(name)) {
2907+
return container.jsGlobalAugmentations.get(name);
2908+
}
28952909
return container.symbol && container.symbol.exports && container.symbol.exports.get(name);
28962910
}
28972911

src/compiler/builder.ts

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ namespace ts {
294294
configFileParsingDiagnostics: ReadonlyArray<Diagnostic>;
295295
}
296296

297-
export function getBuilderCreationParameters(newProgramOrRootNames: Program | ReadonlyArray<string> | undefined, hostOrOptions: BuilderProgramHost | CompilerOptions | undefined, oldProgramOrHost?: BuilderProgram | CompilerHost, configFileParsingDiagnosticsOrOldProgram?: ReadonlyArray<Diagnostic> | BuilderProgram, configFileParsingDiagnostics?: ReadonlyArray<Diagnostic>): BuilderCreationParameters {
297+
export function getBuilderCreationParameters(newProgramOrRootNames: Program | ReadonlyArray<string> | undefined, hostOrOptions: BuilderProgramHost | CompilerOptions | undefined, oldProgramOrHost?: BuilderProgram | CompilerHost, configFileParsingDiagnosticsOrOldProgram?: ReadonlyArray<Diagnostic> | BuilderProgram, configFileParsingDiagnostics?: ReadonlyArray<Diagnostic>, projectReferences?: ReadonlyArray<ProjectReference>): BuilderCreationParameters {
298298
let host: BuilderProgramHost;
299299
let newProgram: Program;
300300
let oldProgram: BuilderProgram;
@@ -307,7 +307,14 @@ namespace ts {
307307
}
308308
else if (isArray(newProgramOrRootNames)) {
309309
oldProgram = configFileParsingDiagnosticsOrOldProgram as BuilderProgram;
310-
newProgram = createProgram(newProgramOrRootNames, hostOrOptions as CompilerOptions, oldProgramOrHost as CompilerHost, oldProgram && oldProgram.getProgram(), configFileParsingDiagnostics);
310+
newProgram = createProgram({
311+
rootNames: newProgramOrRootNames,
312+
options: hostOrOptions as CompilerOptions,
313+
host: oldProgramOrHost as CompilerHost,
314+
oldProgram: oldProgram && oldProgram.getProgram(),
315+
configFileParsingDiagnostics,
316+
projectReferences
317+
});
311318
host = oldProgramOrHost as CompilerHost;
312319
}
313320
else {
@@ -623,28 +630,28 @@ namespace ts {
623630
* Create the builder to manage semantic diagnostics and cache them
624631
*/
625632
export function createSemanticDiagnosticsBuilderProgram(newProgram: Program, host: BuilderProgramHost, oldProgram?: SemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: ReadonlyArray<Diagnostic>): SemanticDiagnosticsBuilderProgram;
626-
export function createSemanticDiagnosticsBuilderProgram(rootNames: ReadonlyArray<string> | undefined, options: CompilerOptions | undefined, host?: CompilerHost, oldProgram?: SemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: ReadonlyArray<Diagnostic>): SemanticDiagnosticsBuilderProgram;
627-
export function createSemanticDiagnosticsBuilderProgram(newProgramOrRootNames: Program | ReadonlyArray<string> | undefined, hostOrOptions: BuilderProgramHost | CompilerOptions | undefined, oldProgramOrHost?: CompilerHost | SemanticDiagnosticsBuilderProgram, configFileParsingDiagnosticsOrOldProgram?: ReadonlyArray<Diagnostic> | SemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: ReadonlyArray<Diagnostic>) {
628-
return createBuilderProgram(BuilderProgramKind.SemanticDiagnosticsBuilderProgram, getBuilderCreationParameters(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, configFileParsingDiagnosticsOrOldProgram, configFileParsingDiagnostics));
633+
export function createSemanticDiagnosticsBuilderProgram(rootNames: ReadonlyArray<string> | undefined, options: CompilerOptions | undefined, host?: CompilerHost, oldProgram?: SemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: ReadonlyArray<Diagnostic>, projectReferences?: ReadonlyArray<ProjectReference>): SemanticDiagnosticsBuilderProgram;
634+
export function createSemanticDiagnosticsBuilderProgram(newProgramOrRootNames: Program | ReadonlyArray<string> | undefined, hostOrOptions: BuilderProgramHost | CompilerOptions | undefined, oldProgramOrHost?: CompilerHost | SemanticDiagnosticsBuilderProgram, configFileParsingDiagnosticsOrOldProgram?: ReadonlyArray<Diagnostic> | SemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: ReadonlyArray<Diagnostic>, projectReferences?: ReadonlyArray<ProjectReference>) {
635+
return createBuilderProgram(BuilderProgramKind.SemanticDiagnosticsBuilderProgram, getBuilderCreationParameters(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, configFileParsingDiagnosticsOrOldProgram, configFileParsingDiagnostics, projectReferences));
629636
}
630637

631638
/**
632639
* Create the builder that can handle the changes in program and iterate through changed files
633640
* to emit the those files and manage semantic diagnostics cache as well
634641
*/
635642
export function createEmitAndSemanticDiagnosticsBuilderProgram(newProgram: Program, host: BuilderProgramHost, oldProgram?: EmitAndSemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: ReadonlyArray<Diagnostic>): EmitAndSemanticDiagnosticsBuilderProgram;
636-
export function createEmitAndSemanticDiagnosticsBuilderProgram(rootNames: ReadonlyArray<string> | undefined, options: CompilerOptions | undefined, host?: CompilerHost, oldProgram?: EmitAndSemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: ReadonlyArray<Diagnostic>): EmitAndSemanticDiagnosticsBuilderProgram;
637-
export function createEmitAndSemanticDiagnosticsBuilderProgram(newProgramOrRootNames: Program | ReadonlyArray<string> | undefined, hostOrOptions: BuilderProgramHost | CompilerOptions | undefined, oldProgramOrHost?: CompilerHost | EmitAndSemanticDiagnosticsBuilderProgram, configFileParsingDiagnosticsOrOldProgram?: ReadonlyArray<Diagnostic> | EmitAndSemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: ReadonlyArray<Diagnostic>) {
638-
return createBuilderProgram(BuilderProgramKind.EmitAndSemanticDiagnosticsBuilderProgram, getBuilderCreationParameters(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, configFileParsingDiagnosticsOrOldProgram, configFileParsingDiagnostics));
643+
export function createEmitAndSemanticDiagnosticsBuilderProgram(rootNames: ReadonlyArray<string> | undefined, options: CompilerOptions | undefined, host?: CompilerHost, oldProgram?: EmitAndSemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: ReadonlyArray<Diagnostic>, projectReferences?: ReadonlyArray<ProjectReference>): EmitAndSemanticDiagnosticsBuilderProgram;
644+
export function createEmitAndSemanticDiagnosticsBuilderProgram(newProgramOrRootNames: Program | ReadonlyArray<string> | undefined, hostOrOptions: BuilderProgramHost | CompilerOptions | undefined, oldProgramOrHost?: CompilerHost | EmitAndSemanticDiagnosticsBuilderProgram, configFileParsingDiagnosticsOrOldProgram?: ReadonlyArray<Diagnostic> | EmitAndSemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: ReadonlyArray<Diagnostic>, projectReferences?: ReadonlyArray<ProjectReference>) {
645+
return createBuilderProgram(BuilderProgramKind.EmitAndSemanticDiagnosticsBuilderProgram, getBuilderCreationParameters(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, configFileParsingDiagnosticsOrOldProgram, configFileParsingDiagnostics, projectReferences));
639646
}
640647

641648
/**
642649
* Creates a builder thats just abstraction over program and can be used with watch
643650
*/
644651
export function createAbstractBuilder(newProgram: Program, host: BuilderProgramHost, oldProgram?: BuilderProgram, configFileParsingDiagnostics?: ReadonlyArray<Diagnostic>): BuilderProgram;
645-
export function createAbstractBuilder(rootNames: ReadonlyArray<string> | undefined, options: CompilerOptions | undefined, host?: CompilerHost, oldProgram?: BuilderProgram, configFileParsingDiagnostics?: ReadonlyArray<Diagnostic>): BuilderProgram;
646-
export function createAbstractBuilder(newProgramOrRootNames: Program | ReadonlyArray<string> | undefined, hostOrOptions: BuilderProgramHost | CompilerOptions | undefined, oldProgramOrHost?: CompilerHost | BuilderProgram, configFileParsingDiagnosticsOrOldProgram?: ReadonlyArray<Diagnostic> | BuilderProgram, configFileParsingDiagnostics?: ReadonlyArray<Diagnostic>): BuilderProgram {
647-
const { newProgram: program } = getBuilderCreationParameters(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, configFileParsingDiagnosticsOrOldProgram, configFileParsingDiagnostics);
652+
export function createAbstractBuilder(rootNames: ReadonlyArray<string> | undefined, options: CompilerOptions | undefined, host?: CompilerHost, oldProgram?: BuilderProgram, configFileParsingDiagnostics?: ReadonlyArray<Diagnostic>, projectReferences?: ReadonlyArray<ProjectReference>): BuilderProgram;
653+
export function createAbstractBuilder(newProgramOrRootNames: Program | ReadonlyArray<string> | undefined, hostOrOptions: BuilderProgramHost | CompilerOptions | undefined, oldProgramOrHost?: CompilerHost | BuilderProgram, configFileParsingDiagnosticsOrOldProgram?: ReadonlyArray<Diagnostic> | BuilderProgram, configFileParsingDiagnostics?: ReadonlyArray<Diagnostic>, projectReferences?: ReadonlyArray<ProjectReference>): BuilderProgram {
654+
const { newProgram: program } = getBuilderCreationParameters(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, configFileParsingDiagnosticsOrOldProgram, configFileParsingDiagnostics, projectReferences);
648655
return {
649656
// Only return program, all other methods are not implemented
650657
getProgram: () => program,

src/compiler/builderState.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ namespace ts.BuilderState {
8888
function getReferencedFileFromImportedModuleSymbol(symbol: Symbol) {
8989
if (symbol.declarations && symbol.declarations[0]) {
9090
const declarationSourceFile = getSourceFileOfNode(symbol.declarations[0]);
91-
return declarationSourceFile && declarationSourceFile.path;
91+
return declarationSourceFile && declarationSourceFile.resolvedPath;
9292
}
9393
}
9494

@@ -100,6 +100,13 @@ namespace ts.BuilderState {
100100
return symbol && getReferencedFileFromImportedModuleSymbol(symbol);
101101
}
102102

103+
/**
104+
* Gets the path to reference file from file name, it could be resolvedPath if present otherwise path
105+
*/
106+
function getReferencedFileFromFileName(program: Program, fileName: string, sourceFileDirectory: Path, getCanonicalFileName: GetCanonicalFileName): Path {
107+
return toPath(program.getProjectReferenceRedirect(fileName) || fileName, sourceFileDirectory, getCanonicalFileName);
108+
}
109+
103110
/**
104111
* Gets the referenced files for a file from the program with values for the keys as referenced file's path to be true
105112
*/
@@ -123,7 +130,7 @@ namespace ts.BuilderState {
123130
// Handle triple slash references
124131
if (sourceFile.referencedFiles && sourceFile.referencedFiles.length > 0) {
125132
for (const referencedFile of sourceFile.referencedFiles) {
126-
const referencedPath = toPath(referencedFile.fileName, sourceFileDirectory, getCanonicalFileName);
133+
const referencedPath = getReferencedFileFromFileName(program, referencedFile.fileName, sourceFileDirectory, getCanonicalFileName);
127134
addReferencedFile(referencedPath);
128135
}
129136
}
@@ -136,7 +143,7 @@ namespace ts.BuilderState {
136143
}
137144

138145
const fileName = resolvedTypeReferenceDirective.resolvedFileName!; // TODO: GH#18217
139-
const typeFilePath = toPath(fileName, sourceFileDirectory, getCanonicalFileName);
146+
const typeFilePath = getReferencedFileFromFileName(program, fileName, sourceFileDirectory, getCanonicalFileName);
140147
addReferencedFile(typeFilePath);
141148
});
142149
}

0 commit comments

Comments
 (0)