Skip to content

Commit cf4e300

Browse files
author
Paul van Brenk
committed
Merge branch 'master' into pvb/codeaction/api
2 parents 1cc9732 + a31415d commit cf4e300

38 files changed

Lines changed: 23526 additions & 91 deletions

Gulpfile.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -725,16 +725,16 @@ declare module "convert-source-map" {
725725
}
726726

727727
gulp.task("browserify", "Runs browserify on run.js to produce a file suitable for running tests in the browser", [servicesFile], (done) => {
728-
const testProject = tsc.createProject("src/harness/tsconfig.json", getCompilerSettings({ outFile: "built/local/bundle.js" }, /*useBuiltCompiler*/ true));
728+
const testProject = tsc.createProject("src/harness/tsconfig.json", getCompilerSettings({ outFile: "../../built/local/bundle.js" }, /*useBuiltCompiler*/ true));
729729
return testProject.src()
730730
.pipe(newer("built/local/bundle.js"))
731731
.pipe(sourcemaps.init())
732-
.pipe(testProject)
732+
.pipe(testProject())
733733
.pipe(through2.obj((file, enc, next) => {
734734
const originalMap = file.sourceMap;
735735
const prebundledContent = file.contents.toString();
736736
// Make paths absolute to help sorcery deal with all the terrible paths being thrown around
737-
originalMap.sources = originalMap.sources.map(s => path.resolve("src", s));
737+
originalMap.sources = originalMap.sources.map(s => path.resolve(s));
738738
// intoStream (below) makes browserify think the input file is named this, so this is what it puts in the sourcemap
739739
originalMap.file = "built/local/_stream_0.js";
740740

scripts/processDiagnosticMessages.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ function buildInfoFileOutput(messageTable: InputDiagnosticMessageTable, nameMap:
8686
'/// <reference path="types.ts" />\r\n' +
8787
'/* @internal */\r\n' +
8888
'namespace ts {\r\n' +
89-
' export var Diagnostics = {\r\n';
89+
' export const Diagnostics = {\r\n';
9090
var names = Utilities.getObjectKeys(messageTable);
9191
for (var i = 0; i < names.length; i++) {
9292
var name = names[i];

src/compiler/binder.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2432,8 +2432,7 @@ namespace ts {
24322432
}
24332433

24342434
// If the parameter's name is 'this', then it is TypeScript syntax.
2435-
if (subtreeFlags & TransformFlags.ContainsDecorators
2436-
|| (name && isIdentifier(name) && name.originalKeywordKind === SyntaxKind.ThisKeyword)) {
2435+
if (subtreeFlags & TransformFlags.ContainsDecorators || isThisIdentifier(name)) {
24372436
transformFlags |= TransformFlags.AssertTypeScript;
24382437
}
24392438

src/compiler/checker.ts

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2183,9 +2183,14 @@ namespace ts {
21832183
// The specified symbol flags need to be reinterpreted as type flags
21842184
buildSymbolDisplay(type.symbol, writer, enclosingDeclaration, SymbolFlags.Type, SymbolFormatFlags.None, nextFlags);
21852185
}
2186-
else if (!(flags & TypeFormatFlags.InTypeAlias) && type.flags & (TypeFlags.Anonymous | TypeFlags.UnionOrIntersection) && type.aliasSymbol &&
2186+
else if (!(flags & TypeFormatFlags.InTypeAlias) && ((type.flags & TypeFlags.Anonymous && !(<AnonymousType>type).target) || type.flags & TypeFlags.UnionOrIntersection) && type.aliasSymbol &&
21872187
isSymbolAccessible(type.aliasSymbol, enclosingDeclaration, SymbolFlags.Type, /*shouldComputeAliasesToMakeVisible*/ false).accessibility === SymbolAccessibility.Accessible) {
2188-
// Only write out inferred type with its corresponding type-alias if type-alias is visible
2188+
// We emit inferred type as type-alias at the current localtion if all the following is true
2189+
// the input type is has alias symbol that is accessible
2190+
// the input type is a union, intersection or anonymous type that is fully instantiated (if not we want to keep dive into)
2191+
// e.g.: export type Bar<X, Y> = () => [X, Y];
2192+
// export type Foo<Y> = Bar<any, Y>;
2193+
// export const y = (x: Foo<string>) => 1 // we want to emit as ...x: () => [any, string])
21892194
const typeArguments = type.aliasTypeArguments;
21902195
writeSymbolTypeReference(type.aliasSymbol, typeArguments, 0, typeArguments ? typeArguments.length : 0, nextFlags);
21912196
}
@@ -5446,7 +5451,26 @@ namespace ts {
54465451
return false;
54475452
}
54485453

5454+
function isSetOfLiteralsFromSameEnum(types: TypeSet): boolean {
5455+
const first = types[0];
5456+
if (first.flags & TypeFlags.EnumLiteral) {
5457+
const firstEnum = getParentOfSymbol(first.symbol);
5458+
for (let i = 1; i < types.length; i++) {
5459+
const other = types[i];
5460+
if (!(other.flags & TypeFlags.EnumLiteral) || (firstEnum !== getParentOfSymbol(other.symbol))) {
5461+
return false;
5462+
}
5463+
}
5464+
return true;
5465+
}
5466+
5467+
return false;
5468+
}
5469+
54495470
function removeSubtypes(types: TypeSet) {
5471+
if (types.length === 0 || isSetOfLiteralsFromSameEnum(types)) {
5472+
return;
5473+
}
54505474
let i = types.length;
54515475
while (i > 0) {
54525476
i--;
@@ -9354,7 +9378,7 @@ namespace ts {
93549378
captureLexicalThis(node, container);
93559379
}
93569380
if (isFunctionLike(container) &&
9357-
(!isInParameterInitializerBeforeContainingFunction(node) || getFunctionLikeThisParameter(container))) {
9381+
(!isInParameterInitializerBeforeContainingFunction(node) || getThisParameter(container))) {
93589382
// Note: a parameter initializer should refer to class-this unless function-this is explicitly annotated.
93599383

93609384
// If this is a function in a JS file, it might be a class method. Check if it's the RHS
@@ -15538,10 +15562,6 @@ namespace ts {
1553815562
}
1553915563
}
1554015564

15541-
function parameterIsThisKeyword(parameter: ParameterDeclaration) {
15542-
return parameter.name && (<Identifier>parameter.name).originalKeywordKind === SyntaxKind.ThisKeyword;
15543-
}
15544-
1554515565
function parameterNameStartsWithUnderscore(parameter: ParameterDeclaration) {
1554615566
return parameter.name && parameter.name.kind === SyntaxKind.Identifier && (<Identifier>parameter.name).text.charCodeAt(0) === CharacterCodes._;
1554715567
}
@@ -20122,18 +20142,8 @@ namespace ts {
2012220142
}
2012320143

2012420144
function getAccessorThisParameter(accessor: AccessorDeclaration): ParameterDeclaration {
20125-
if (accessor.parameters.length === (accessor.kind === SyntaxKind.GetAccessor ? 1 : 2) &&
20126-
accessor.parameters[0].name.kind === SyntaxKind.Identifier &&
20127-
(<Identifier>accessor.parameters[0].name).originalKeywordKind === SyntaxKind.ThisKeyword) {
20128-
return accessor.parameters[0];
20129-
}
20130-
}
20131-
20132-
function getFunctionLikeThisParameter(func: FunctionLikeDeclaration) {
20133-
if (func.parameters.length &&
20134-
func.parameters[0].name.kind === SyntaxKind.Identifier &&
20135-
(<Identifier>func.parameters[0].name).originalKeywordKind === SyntaxKind.ThisKeyword) {
20136-
return func.parameters[0];
20145+
if (accessor.parameters.length === (accessor.kind === SyntaxKind.GetAccessor ? 1 : 2)) {
20146+
return getThisParameter(accessor);
2013720147
}
2013820148
}
2013920149

src/compiler/core.ts

Lines changed: 3 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ namespace ts {
212212
* true for all elements, otherwise returns a new array instance containing the filtered subset.
213213
*/
214214
export function filter<T, U extends T>(array: T[], f: (x: T) => x is U): U[];
215-
export function filter<T>(array: T[], f: (x: T) => boolean): T[]
215+
export function filter<T>(array: T[], f: (x: T) => boolean): T[];
216216
export function filter<T>(array: T[], f: (x: T) => boolean): T[] {
217217
if (array) {
218218
const len = array.length;
@@ -1867,10 +1867,10 @@ namespace ts {
18671867
declare var process: any;
18681868
declare var require: any;
18691869

1870-
let currentAssertionLevel: AssertionLevel;
1870+
export let currentAssertionLevel = AssertionLevel.None;
18711871

18721872
export function shouldAssert(level: AssertionLevel): boolean {
1873-
return getCurrentAssertionLevel() >= level;
1873+
return currentAssertionLevel >= level;
18741874
}
18751875

18761876
export function assert(expression: boolean, message?: string, verboseDebugInfo?: () => string): void {
@@ -1887,35 +1887,6 @@ namespace ts {
18871887
export function fail(message?: string): void {
18881888
Debug.assert(/*expression*/ false, message);
18891889
}
1890-
1891-
function getCurrentAssertionLevel() {
1892-
if (currentAssertionLevel !== undefined) {
1893-
return currentAssertionLevel;
1894-
}
1895-
1896-
if (sys === undefined) {
1897-
return AssertionLevel.None;
1898-
}
1899-
1900-
const developmentMode = /^development$/i.test(getEnvironmentVariable("NODE_ENV"));
1901-
currentAssertionLevel = developmentMode
1902-
? AssertionLevel.Normal
1903-
: AssertionLevel.None;
1904-
1905-
return currentAssertionLevel;
1906-
}
1907-
}
1908-
1909-
export function getEnvironmentVariable(name: string, host?: CompilerHost) {
1910-
if (host && host.getEnvironmentVariable) {
1911-
return host.getEnvironmentVariable(name);
1912-
}
1913-
1914-
if (sys && sys.getEnvironmentVariable) {
1915-
return sys.getEnvironmentVariable(name);
1916-
}
1917-
1918-
return "";
19191890
}
19201891

19211892
/** Remove an item from an array, moving everything to its right one space left. */

src/compiler/parser.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1394,8 +1394,8 @@ namespace ts {
13941394
// Tokens other than ')' and ']' (the latter for index signatures) are here for better error recovery
13951395
return token() === SyntaxKind.CloseParenToken || token() === SyntaxKind.CloseBracketToken /*|| token === SyntaxKind.OpenBraceToken*/;
13961396
case ParsingContext.TypeArguments:
1397-
// Tokens other than '>' are here for better error recovery
1398-
return token() === SyntaxKind.GreaterThanToken || token() === SyntaxKind.OpenParenToken;
1397+
// All other tokens should cause the type-argument to terminate except comma token
1398+
return token() !== SyntaxKind.CommaToken;
13991399
case ParsingContext.HeritageClauses:
14001400
return token() === SyntaxKind.OpenBraceToken || token() === SyntaxKind.CloseBraceToken;
14011401
case ParsingContext.JsxAttributes:

src/compiler/program.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ namespace ts {
206206
readFile: fileName => sys.readFile(fileName),
207207
trace: (s: string) => sys.write(s + newLine),
208208
directoryExists: directoryName => sys.directoryExists(directoryName),
209-
getEnvironmentVariable: name => getEnvironmentVariable(name, /*host*/ undefined),
209+
getEnvironmentVariable: name => sys.getEnvironmentVariable ? sys.getEnvironmentVariable(name) : "",
210210
getDirectories: (path: string) => sys.getDirectories(path),
211211
realpath
212212
};

src/compiler/sys.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ namespace ts {
8383
getEnvironmentVariable?(name: string): string;
8484
};
8585

86-
export var sys: System = (function() {
86+
export let sys: System = (function() {
8787

8888
function getWScriptSystem(): System {
8989

@@ -637,4 +637,10 @@ namespace ts {
637637
}
638638
return sys;
639639
})();
640+
641+
if (sys && sys.getEnvironmentVariable) {
642+
Debug.currentAssertionLevel = /^development$/i.test(sys.getEnvironmentVariable("NODE_ENV"))
643+
? AssertionLevel.Normal
644+
: AssertionLevel.None;
645+
}
640646
}

src/compiler/transformers/ts.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2374,7 +2374,7 @@ namespace ts {
23742374
* @param node The parameter declaration node.
23752375
*/
23762376
function visitParameter(node: ParameterDeclaration) {
2377-
if (node.name && isIdentifier(node.name) && node.name.originalKeywordKind === SyntaxKind.ThisKeyword) {
2377+
if (parameterIsThisKeyword(node)) {
23782378
return undefined;
23792379
}
23802380

src/compiler/utilities.ts

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2707,15 +2707,35 @@ namespace ts {
27072707
});
27082708
}
27092709

2710-
export function getSetAccessorTypeAnnotationNode(accessor: AccessorDeclaration): TypeNode {
2710+
/** Get the type annotaion for the value parameter. */
2711+
export function getSetAccessorTypeAnnotationNode(accessor: SetAccessorDeclaration): TypeNode {
27112712
if (accessor && accessor.parameters.length > 0) {
2712-
const hasThis = accessor.parameters.length === 2 &&
2713-
accessor.parameters[0].name.kind === SyntaxKind.Identifier &&
2714-
(accessor.parameters[0].name as Identifier).originalKeywordKind === SyntaxKind.ThisKeyword;
2713+
const hasThis = accessor.parameters.length === 2 && parameterIsThisKeyword(accessor.parameters[0]);
27152714
return accessor.parameters[hasThis ? 1 : 0].type;
27162715
}
27172716
}
27182717

2718+
export function getThisParameter(signature: SignatureDeclaration): ParameterDeclaration | undefined {
2719+
if (signature.parameters.length) {
2720+
const thisParameter = signature.parameters[0];
2721+
if (parameterIsThisKeyword(thisParameter)) {
2722+
return thisParameter;
2723+
}
2724+
}
2725+
}
2726+
2727+
export function parameterIsThisKeyword(parameter: ParameterDeclaration): boolean {
2728+
return isThisIdentifier(parameter.name);
2729+
}
2730+
2731+
export function isThisIdentifier(node: Node | undefined): boolean {
2732+
return node && node.kind === SyntaxKind.Identifier && identifierIsThisKeyword(node as Identifier);
2733+
}
2734+
2735+
export function identifierIsThisKeyword(id: Identifier): boolean {
2736+
return id.originalKeywordKind === SyntaxKind.ThisKeyword;
2737+
}
2738+
27192739
export interface AllAccessorDeclarations {
27202740
firstAccessor: AccessorDeclaration;
27212741
secondAccessor: AccessorDeclaration;

0 commit comments

Comments
 (0)