diff --git a/Jakefile b/Jakefile index e754f5baad95a..b803f23eae8ac 100644 --- a/Jakefile +++ b/Jakefile @@ -43,7 +43,6 @@ var compilerSources = [ var servicesSources = [ "core.ts", - "sys.ts", "types.ts", "scanner.ts", "parser.ts", diff --git a/bin/tsc.js b/bin/tsc.js index 55ddea3cb8656..5efd7065d8ef6 100644 --- a/bin/tsc.js +++ b/bin/tsc.js @@ -2207,10 +2207,6 @@ var ts; return pathLen > extLen && path.substr(pathLen - extLen, extLen) === extension; } ts.fileExtensionIs = fileExtensionIs; - function getCanonicalFileName(fileName) { - return sys.useCaseSensitiveFileNames ? fileName : fileName.toLowerCase(); - } - ts.getCanonicalFileName = getCanonicalFileName; function Symbol(flags, name) { this.flags = flags; this.name = name; @@ -2591,6 +2587,7 @@ var ts; } } ts.getJsDocComments = getJsDocComments; + ts.fullTripleSlashReferencePathRegEx = /^(\/\/\/\s*/; function forEachChild(node, cbNode, cbNodes) { function child(node) { if (node) @@ -5252,8 +5249,7 @@ var ts; file.hasNoDefaultLib = true; } else { - var fullReferenceRegEx = /^(\/\/\/\s*/; - var matchResult = fullReferenceRegEx.exec(comment); + var matchResult = ts.fullTripleSlashReferencePathRegEx.exec(comment); if (!matchResult) { var start = range.pos; var length = range.end - start; @@ -6025,7 +6021,7 @@ var ts; } } else { - writer.writeLiteral(sys.newLine); + writer.writeLiteral(newLine); } } function calculateIndent(pos, end) { @@ -6059,6 +6055,8 @@ var ts; var detachedCommentsInfo; var emitDetachedComments = compilerOptions.removeComments ? function (node) { } : emitDetachedCommentsAtPosition; + var emitPinnedOrTripleSlashComments = compilerOptions.removeComments ? function (node) { + } : emitPinnedOrTripleSlashCommentsOfNode; var writeComment = writeCommentRange; var emit = emitNode; var emitStart = function (node) { @@ -6854,8 +6852,9 @@ var ts; emitTrailingComments(node); } function emitFunctionDeclaration(node) { - if (!node.body) - return; + if (!node.body) { + return emitPinnedOrTripleSlashComments(node); + } if (node.kind !== 116 /* Method */) { emitLeadingComments(node); } @@ -7014,8 +7013,9 @@ var ts; function emitMemberFunctions(node) { ts.forEach(node.members, function (member) { if (member.kind === 116 /* Method */) { - if (!member.body) - return; + if (!member.body) { + return emitPinnedOrTripleSlashComments(member); + } writeLine(); emitLeadingComments(member); emitStart(member); @@ -7136,6 +7136,11 @@ var ts; } emitTrailingComments(node); function emitConstructorOfClass() { + ts.forEach(node.members, function (member) { + if (member.kind === 117 /* Constructor */ && !member.body) { + emitPinnedOrTripleSlashComments(member); + } + }); var ctor = getFirstConstructorWithBody(node); if (ctor) { emitLeadingComments(ctor); @@ -7191,6 +7196,9 @@ var ts; } } } + function emitInterfaceDeclaration(node) { + emitPinnedOrTripleSlashComments(node); + } function emitEnumDeclaration(node) { emitLeadingComments(node); if (!(node.flags & 1 /* Export */)) { @@ -7263,8 +7271,9 @@ var ts; } } function emitModuleDeclaration(node) { - if (!ts.isInstantiated(node)) - return; + if (!ts.isInstantiated(node)) { + return emitPinnedOrTripleSlashComments(node); + } emitLeadingComments(node); if (!(node.flags & 1 /* Export */)) { emitStart(node); @@ -7477,8 +7486,12 @@ var ts; } } function emitNode(node) { - if (!node || node.flags & 2 /* Ambient */) + if (!node) { return; + } + if (node.flags & 2 /* Ambient */) { + return emitPinnedOrTripleSlashComments(node); + } switch (node.kind) { case 55 /* Identifier */: return emitIdentifier(node); @@ -7582,6 +7595,8 @@ var ts; return emitVariableDeclaration(node); case 169 /* ClassDeclaration */: return emitClassDeclaration(node); + case 170 /* InterfaceDeclaration */: + return emitInterfaceDeclaration(node); case 171 /* EnumDeclaration */: return emitEnumDeclaration(node); case 172 /* ModuleDeclaration */: @@ -7605,7 +7620,7 @@ var ts; } return leadingComments; } - function emitLeadingDeclarationComments(node) { + function getLeadingCommentsToEmit(node) { if (node.parent.kind === 177 /* SourceFile */ || node.pos !== node.parent.pos) { var leadingComments; if (hasDetachedComments(node.pos)) { @@ -7614,10 +7629,14 @@ var ts; else { leadingComments = ts.getLeadingCommentsOfNode(node, currentSourceFile); } - emitNewLineBeforeLeadingComments(node, leadingComments, writer); - emitComments(leadingComments, true, writer, writeComment); + return leadingComments; } } + function emitLeadingDeclarationComments(node) { + var leadingComments = getLeadingCommentsToEmit(node); + emitNewLineBeforeLeadingComments(node, leadingComments, writer); + emitComments(leadingComments, true, writer, writeComment); + } function emitTrailingDeclarationComments(node) { if (node.parent.kind === 177 /* SourceFile */ || node.end !== node.parent.end) { var trailingComments = ts.getTrailingComments(currentSourceFile.text, node.end); @@ -7651,7 +7670,7 @@ var ts; detachedComments.push(comment); lastComment = comment; }); - if (detachedComments && detachedComments.length) { + if (detachedComments.length) { var lastCommentLine = getLineOfLocalPosition(detachedComments[detachedComments.length - 1].end); var astLine = getLineOfLocalPosition(ts.skipTrivia(currentSourceFile.text, node.pos)); if (astLine >= lastCommentLine + 2) { @@ -7668,6 +7687,19 @@ var ts; } } } + function emitPinnedOrTripleSlashCommentsOfNode(node) { + var pinnedComments = ts.filter(getLeadingCommentsToEmit(node), isPinnedOrTripleSlashComment); + function isPinnedOrTripleSlashComment(comment) { + if (currentSourceFile.text.charCodeAt(comment.pos + 1) === 42 /* asterisk */) { + return currentSourceFile.text.charCodeAt(comment.pos + 2) === 33 /* exclamation */; + } + else if (currentSourceFile.text.charCodeAt(comment.pos + 1) === 47 /* slash */ && comment.pos + 2 < comment.end && currentSourceFile.text.charCodeAt(comment.pos + 2) === 47 /* slash */ && currentSourceFile.text.substring(comment.pos, comment.end).match(ts.fullTripleSlashReferencePathRegEx)) { + return true; + } + } + emitNewLineBeforeLeadingComments(node, pinnedComments, writer); + emitComments(pinnedComments, true, writer, writeComment); + } if (compilerOptions.sourceMap) { initializeEmitterWithSourceMaps(); } @@ -9102,7 +9134,7 @@ var ts; } return symbol.name; } - if (enclosingDeclaration && !(symbol.flags & ts.SymbolFlags.PropertyOrAccessor & ts.SymbolFlags.Signature & 4096 /* Constructor */ & 2048 /* Method */ & 262144 /* TypeParameter */)) { + if (enclosingDeclaration && !(symbol.flags & (ts.SymbolFlags.PropertyOrAccessor | ts.SymbolFlags.Signature | 4096 /* Constructor */ | 2048 /* Method */ | 262144 /* TypeParameter */))) { var symbolName; while (symbol) { var isFirstName = !symbolName; @@ -10257,13 +10289,12 @@ var ts; return emptyObjectType; } var type = getDeclaredTypeOfSymbol(symbol); - var name = symbol.name; if (!(type.flags & ts.TypeFlags.ObjectType)) { - error(getTypeDeclaration(symbol), ts.Diagnostics.Global_type_0_must_be_a_class_or_interface_type, name); + error(getTypeDeclaration(symbol), ts.Diagnostics.Global_type_0_must_be_a_class_or_interface_type, symbol.name); return emptyObjectType; } if ((type.typeParameters ? type.typeParameters.length : 0) !== arity) { - error(getTypeDeclaration(symbol), ts.Diagnostics.Global_type_0_must_have_1_type_parameter_s, name, arity); + error(getTypeDeclaration(symbol), ts.Diagnostics.Global_type_0_must_have_1_type_parameter_s, symbol.name, arity); return emptyObjectType; } return type; @@ -11395,7 +11426,8 @@ var ts; } return false; } - function checkSuperExpression(node, isCallExpression) { + function checkSuperExpression(node) { + var isCallExpression = node.parent.kind === 132 /* CallExpression */ && node.parent.func === node; var enclosingClass = getAncestor(node, 169 /* ClassDeclaration */); var baseClass; if (enclosingClass && enclosingClass.baseType) { @@ -11897,7 +11929,7 @@ var ts; } function resolveCallExpression(node) { if (node.func.kind === 81 /* SuperKeyword */) { - var superType = checkSuperExpression(node.func, true); + var superType = checkSuperExpression(node.func); if (superType !== unknownType) { return resolveCall(node, getSignaturesOfType(superType, 1 /* Construct */)); } @@ -12370,7 +12402,7 @@ var ts; case 83 /* ThisKeyword */: return checkThisExpression(node); case 81 /* SuperKeyword */: - return checkSuperExpression(node, false); + return checkSuperExpression(node); case 79 /* NullKeyword */: return nullType; case 85 /* TrueKeyword */: @@ -13811,6 +13843,7 @@ var ts; case 114 /* Parameter */: case 115 /* Property */: case 176 /* EnumMember */: + case 129 /* PropertyAssignment */: return parent.initializer === node; case 146 /* ExpressionStatement */: case 147 /* IfStatement */: @@ -13913,6 +13946,9 @@ var ts; if (entityName.parent.kind === 175 /* ExportAssignment */) { return resolveEntityName(entityName.parent.parent, entityName, ts.SymbolFlags.Value | ts.SymbolFlags.Type | ts.SymbolFlags.Namespace | 4194304 /* Import */); } + if (isInRightSideOfImportOrExportAssignment(entityName)) { + return getSymbolOfPartOfRightHandSideOfImport(entityName); + } if (isRightSideOfQualifiedNameOrPropertyAccess(entityName)) { entityName = entityName.parent; } @@ -14001,8 +14037,7 @@ var ts; return getTypeOfSymbol(symbol); } if (isInRightSideOfImportOrExportAssignment(node)) { - var symbol; - symbol = node.parent.kind === 175 /* ExportAssignment */ ? getSymbolInfo(node) : getSymbolOfPartOfRightHandSideOfImport(node); + var symbol = getSymbolInfo(node); var declaredType = getDeclaredTypeOfSymbol(symbol); return declaredType !== unknownType ? declaredType : getTypeOfSymbol(symbol); } @@ -14138,7 +14173,8 @@ var ts; function isImplementationOfOverload(node) { if (node.body) { var symbol = getSymbolOfNode(node); - return getSignaturesOfSymbol(symbol).length > 1; + var signaturesOfSymbol = getSignaturesOfSymbol(symbol); + return signaturesOfSymbol.length > 1 || (signaturesOfSymbol.length === 1 && signaturesOfSymbol[0].declaration !== node); } return false; } @@ -14528,6 +14564,9 @@ var ts; function createCompilerHost(options) { var currentDirectory; var existingDirectories = {}; + function getCanonicalFileName(fileName) { + return sys.useCaseSensitiveFileNames ? fileName : fileName.toLowerCase(); + } function getSourceFile(filename, languageVersion, onError) { try { var text = sys.readFile(filename, options.charset); @@ -14573,7 +14612,7 @@ var ts; writeFile: writeFile, getCurrentDirectory: function () { return currentDirectory || (currentDirectory = sys.getCurrentDirectory()); }, useCaseSensitiveFileNames: function () { return sys.useCaseSensitiveFileNames; }, - getCanonicalFileName: ts.getCanonicalFileName, + getCanonicalFileName: getCanonicalFileName, getNewLine: function () { return sys.newLine; } }; } diff --git a/bin/typescriptServices.js b/bin/typescriptServices.js index a4456620a4bd6..d9b53be63cf8e 100644 --- a/bin/typescriptServices.js +++ b/bin/typescriptServices.js @@ -2207,10 +2207,6 @@ var ts; return pathLen > extLen && path.substr(pathLen - extLen, extLen) === extension; } ts.fileExtensionIs = fileExtensionIs; - function getCanonicalFileName(fileName) { - return sys.useCaseSensitiveFileNames ? fileName : fileName.toLowerCase(); - } - ts.getCanonicalFileName = getCanonicalFileName; function Symbol(flags, name) { this.flags = flags; this.name = name; @@ -2268,201 +2264,6 @@ var ts; })(ts.Debug || (ts.Debug = {})); var Debug = ts.Debug; })(ts || (ts = {})); -var sys = (function () { - function getWScriptSystem() { - var fso = new ActiveXObject("Scripting.FileSystemObject"); - var fileStream = new ActiveXObject("ADODB.Stream"); - fileStream.Type = 2; - var binaryStream = new ActiveXObject("ADODB.Stream"); - binaryStream.Type = 1; - var args = []; - for (var i = 0; i < WScript.Arguments.length; i++) { - args[i] = WScript.Arguments.Item(i); - } - function readFile(fileName, encoding) { - if (!fso.FileExists(fileName)) { - return undefined; - } - fileStream.Open(); - try { - if (encoding) { - fileStream.Charset = encoding; - fileStream.LoadFromFile(fileName); - } - else { - fileStream.Charset = "x-ansi"; - fileStream.LoadFromFile(fileName); - var bom = fileStream.ReadText(2) || ""; - fileStream.Position = 0; - fileStream.Charset = bom.length >= 2 && (bom.charCodeAt(0) === 0xFF && bom.charCodeAt(1) === 0xFE || bom.charCodeAt(0) === 0xFE && bom.charCodeAt(1) === 0xFF) ? "unicode" : "utf-8"; - } - return fileStream.ReadText(); - } - catch (e) { - throw e.number === -2147024809 ? new Error(ts.Diagnostics.Unsupported_file_encoding.key) : e; - } - finally { - fileStream.Close(); - } - } - function writeFile(fileName, data, writeByteOrderMark) { - fileStream.Open(); - binaryStream.Open(); - try { - fileStream.Charset = "utf-8"; - fileStream.WriteText(data); - if (writeByteOrderMark) { - fileStream.Position = 0; - } - else { - fileStream.Position = 3; - } - fileStream.CopyTo(binaryStream); - binaryStream.SaveToFile(fileName, 2); - } - finally { - binaryStream.Close(); - fileStream.Close(); - } - } - return { - args: args, - newLine: "\r\n", - useCaseSensitiveFileNames: false, - write: function (s) { - WScript.StdOut.Write(s); - }, - readFile: readFile, - writeFile: writeFile, - resolvePath: function (path) { - return fso.GetAbsolutePathName(path); - }, - fileExists: function (path) { - return fso.FileExists(path); - }, - directoryExists: function (path) { - return fso.FolderExists(path); - }, - createDirectory: function (directoryName) { - if (!this.directoryExists(directoryName)) { - fso.CreateFolder(directoryName); - } - }, - getExecutingFilePath: function () { - return WScript.ScriptFullName; - }, - getCurrentDirectory: function () { - return new ActiveXObject("WScript.Shell").CurrentDirectory; - }, - exit: function (exitCode) { - try { - WScript.Quit(exitCode); - } - catch (e) { - } - } - }; - } - function getNodeSystem() { - var _fs = require("fs"); - var _path = require("path"); - var _os = require('os'); - var platform = _os.platform(); - var useCaseSensitiveFileNames = platform !== "win32" && platform !== "win64" && platform !== "darwin"; - function readFile(fileName, encoding) { - if (!_fs.existsSync(fileName)) { - return undefined; - } - var buffer = _fs.readFileSync(fileName); - var len = buffer.length; - if (len >= 2 && buffer[0] === 0xFE && buffer[1] === 0xFF) { - len &= ~1; - for (var i = 0; i < len; i += 2) { - var temp = buffer[i]; - buffer[i] = buffer[i + 1]; - buffer[i + 1] = temp; - } - return buffer.toString("utf16le", 2); - } - if (len >= 2 && buffer[0] === 0xFF && buffer[1] === 0xFE) { - return buffer.toString("utf16le", 2); - } - if (len >= 3 && buffer[0] === 0xEF && buffer[1] === 0xBB && buffer[2] === 0xBF) { - return buffer.toString("utf8", 3); - } - return buffer.toString("utf8"); - } - function writeFile(fileName, data, writeByteOrderMark) { - if (writeByteOrderMark) { - data = '\uFEFF' + data; - } - _fs.writeFileSync(fileName, data, "utf8"); - } - return { - args: process.argv.slice(2), - newLine: _os.EOL, - useCaseSensitiveFileNames: useCaseSensitiveFileNames, - write: function (s) { - _fs.writeSync(1, s); - }, - readFile: readFile, - writeFile: writeFile, - watchFile: function (fileName, callback) { - _fs.watchFile(fileName, { persistent: true, interval: 250 }, fileChanged); - return { - close: function () { - _fs.unwatchFile(fileName, fileChanged); - } - }; - function fileChanged(curr, prev) { - if (+curr.mtime <= +prev.mtime) { - return; - } - callback(fileName); - } - ; - }, - resolvePath: function (path) { - return _path.resolve(path); - }, - fileExists: function (path) { - return _fs.existsSync(path); - }, - directoryExists: function (path) { - return _fs.existsSync(path) && _fs.statSync(path).isDirectory(); - }, - createDirectory: function (directoryName) { - if (!this.directoryExists(directoryName)) { - _fs.mkdirSync(directoryName); - } - }, - getExecutingFilePath: function () { - return process.mainModule.filename; - }, - getCurrentDirectory: function () { - return process.cwd(); - }, - getMemoryUsage: function () { - if (global.gc) { - global.gc(); - } - return process.memoryUsage().heapUsed; - }, - exit: function (exitCode) { - process.exit(exitCode); - } - }; - } - if (typeof WScript !== "undefined" && typeof ActiveXObject === "function") { - return getWScriptSystem(); - } - else if (typeof module !== "undefined" && module.exports) { - return getNodeSystem(); - } - else { - return undefined; - } -})(); var ts; (function (ts) { var nodeConstructors = new Array(180 /* Count */); @@ -2591,6 +2392,7 @@ var ts; } } ts.getJsDocComments = getJsDocComments; + ts.fullTripleSlashReferencePathRegEx = /^(\/\/\/\s*/; function forEachChild(node, cbNode, cbNodes) { function child(node) { if (node) @@ -5252,8 +5054,7 @@ var ts; file.hasNoDefaultLib = true; } else { - var fullReferenceRegEx = /^(\/\/\/\s*/; - var matchResult = fullReferenceRegEx.exec(comment); + var matchResult = ts.fullTripleSlashReferencePathRegEx.exec(comment); if (!matchResult) { var start = range.pos; var length = range.end - start; @@ -6025,7 +5826,7 @@ var ts; } } else { - writer.writeLiteral(sys.newLine); + writer.writeLiteral(newLine); } } function calculateIndent(pos, end) { @@ -6059,6 +5860,8 @@ var ts; var detachedCommentsInfo; var emitDetachedComments = compilerOptions.removeComments ? function (node) { } : emitDetachedCommentsAtPosition; + var emitPinnedOrTripleSlashComments = compilerOptions.removeComments ? function (node) { + } : emitPinnedOrTripleSlashCommentsOfNode; var writeComment = writeCommentRange; var emit = emitNode; var emitStart = function (node) { @@ -6854,8 +6657,9 @@ var ts; emitTrailingComments(node); } function emitFunctionDeclaration(node) { - if (!node.body) - return; + if (!node.body) { + return emitPinnedOrTripleSlashComments(node); + } if (node.kind !== 116 /* Method */) { emitLeadingComments(node); } @@ -7014,8 +6818,9 @@ var ts; function emitMemberFunctions(node) { ts.forEach(node.members, function (member) { if (member.kind === 116 /* Method */) { - if (!member.body) - return; + if (!member.body) { + return emitPinnedOrTripleSlashComments(member); + } writeLine(); emitLeadingComments(member); emitStart(member); @@ -7136,6 +6941,11 @@ var ts; } emitTrailingComments(node); function emitConstructorOfClass() { + ts.forEach(node.members, function (member) { + if (member.kind === 117 /* Constructor */ && !member.body) { + emitPinnedOrTripleSlashComments(member); + } + }); var ctor = getFirstConstructorWithBody(node); if (ctor) { emitLeadingComments(ctor); @@ -7191,6 +7001,9 @@ var ts; } } } + function emitInterfaceDeclaration(node) { + emitPinnedOrTripleSlashComments(node); + } function emitEnumDeclaration(node) { emitLeadingComments(node); if (!(node.flags & 1 /* Export */)) { @@ -7263,8 +7076,9 @@ var ts; } } function emitModuleDeclaration(node) { - if (!ts.isInstantiated(node)) - return; + if (!ts.isInstantiated(node)) { + return emitPinnedOrTripleSlashComments(node); + } emitLeadingComments(node); if (!(node.flags & 1 /* Export */)) { emitStart(node); @@ -7477,8 +7291,12 @@ var ts; } } function emitNode(node) { - if (!node || node.flags & 2 /* Ambient */) + if (!node) { return; + } + if (node.flags & 2 /* Ambient */) { + return emitPinnedOrTripleSlashComments(node); + } switch (node.kind) { case 55 /* Identifier */: return emitIdentifier(node); @@ -7582,6 +7400,8 @@ var ts; return emitVariableDeclaration(node); case 169 /* ClassDeclaration */: return emitClassDeclaration(node); + case 170 /* InterfaceDeclaration */: + return emitInterfaceDeclaration(node); case 171 /* EnumDeclaration */: return emitEnumDeclaration(node); case 172 /* ModuleDeclaration */: @@ -7605,7 +7425,7 @@ var ts; } return leadingComments; } - function emitLeadingDeclarationComments(node) { + function getLeadingCommentsToEmit(node) { if (node.parent.kind === 177 /* SourceFile */ || node.pos !== node.parent.pos) { var leadingComments; if (hasDetachedComments(node.pos)) { @@ -7614,10 +7434,14 @@ var ts; else { leadingComments = ts.getLeadingCommentsOfNode(node, currentSourceFile); } - emitNewLineBeforeLeadingComments(node, leadingComments, writer); - emitComments(leadingComments, true, writer, writeComment); + return leadingComments; } } + function emitLeadingDeclarationComments(node) { + var leadingComments = getLeadingCommentsToEmit(node); + emitNewLineBeforeLeadingComments(node, leadingComments, writer); + emitComments(leadingComments, true, writer, writeComment); + } function emitTrailingDeclarationComments(node) { if (node.parent.kind === 177 /* SourceFile */ || node.end !== node.parent.end) { var trailingComments = ts.getTrailingComments(currentSourceFile.text, node.end); @@ -7651,7 +7475,7 @@ var ts; detachedComments.push(comment); lastComment = comment; }); - if (detachedComments && detachedComments.length) { + if (detachedComments.length) { var lastCommentLine = getLineOfLocalPosition(detachedComments[detachedComments.length - 1].end); var astLine = getLineOfLocalPosition(ts.skipTrivia(currentSourceFile.text, node.pos)); if (astLine >= lastCommentLine + 2) { @@ -7668,6 +7492,19 @@ var ts; } } } + function emitPinnedOrTripleSlashCommentsOfNode(node) { + var pinnedComments = ts.filter(getLeadingCommentsToEmit(node), isPinnedOrTripleSlashComment); + function isPinnedOrTripleSlashComment(comment) { + if (currentSourceFile.text.charCodeAt(comment.pos + 1) === 42 /* asterisk */) { + return currentSourceFile.text.charCodeAt(comment.pos + 2) === 33 /* exclamation */; + } + else if (currentSourceFile.text.charCodeAt(comment.pos + 1) === 47 /* slash */ && comment.pos + 2 < comment.end && currentSourceFile.text.charCodeAt(comment.pos + 2) === 47 /* slash */ && currentSourceFile.text.substring(comment.pos, comment.end).match(ts.fullTripleSlashReferencePathRegEx)) { + return true; + } + } + emitNewLineBeforeLeadingComments(node, pinnedComments, writer); + emitComments(pinnedComments, true, writer, writeComment); + } if (compilerOptions.sourceMap) { initializeEmitterWithSourceMaps(); } @@ -9102,7 +8939,7 @@ var ts; } return symbol.name; } - if (enclosingDeclaration && !(symbol.flags & ts.SymbolFlags.PropertyOrAccessor & ts.SymbolFlags.Signature & 4096 /* Constructor */ & 2048 /* Method */ & 262144 /* TypeParameter */)) { + if (enclosingDeclaration && !(symbol.flags & (ts.SymbolFlags.PropertyOrAccessor | ts.SymbolFlags.Signature | 4096 /* Constructor */ | 2048 /* Method */ | 262144 /* TypeParameter */))) { var symbolName; while (symbol) { var isFirstName = !symbolName; @@ -10257,13 +10094,12 @@ var ts; return emptyObjectType; } var type = getDeclaredTypeOfSymbol(symbol); - var name = symbol.name; if (!(type.flags & ts.TypeFlags.ObjectType)) { - error(getTypeDeclaration(symbol), ts.Diagnostics.Global_type_0_must_be_a_class_or_interface_type, name); + error(getTypeDeclaration(symbol), ts.Diagnostics.Global_type_0_must_be_a_class_or_interface_type, symbol.name); return emptyObjectType; } if ((type.typeParameters ? type.typeParameters.length : 0) !== arity) { - error(getTypeDeclaration(symbol), ts.Diagnostics.Global_type_0_must_have_1_type_parameter_s, name, arity); + error(getTypeDeclaration(symbol), ts.Diagnostics.Global_type_0_must_have_1_type_parameter_s, symbol.name, arity); return emptyObjectType; } return type; @@ -11395,7 +11231,8 @@ var ts; } return false; } - function checkSuperExpression(node, isCallExpression) { + function checkSuperExpression(node) { + var isCallExpression = node.parent.kind === 132 /* CallExpression */ && node.parent.func === node; var enclosingClass = getAncestor(node, 169 /* ClassDeclaration */); var baseClass; if (enclosingClass && enclosingClass.baseType) { @@ -11897,7 +11734,7 @@ var ts; } function resolveCallExpression(node) { if (node.func.kind === 81 /* SuperKeyword */) { - var superType = checkSuperExpression(node.func, true); + var superType = checkSuperExpression(node.func); if (superType !== unknownType) { return resolveCall(node, getSignaturesOfType(superType, 1 /* Construct */)); } @@ -12370,7 +12207,7 @@ var ts; case 83 /* ThisKeyword */: return checkThisExpression(node); case 81 /* SuperKeyword */: - return checkSuperExpression(node, false); + return checkSuperExpression(node); case 79 /* NullKeyword */: return nullType; case 85 /* TrueKeyword */: @@ -13811,6 +13648,7 @@ var ts; case 114 /* Parameter */: case 115 /* Property */: case 176 /* EnumMember */: + case 129 /* PropertyAssignment */: return parent.initializer === node; case 146 /* ExpressionStatement */: case 147 /* IfStatement */: @@ -13913,6 +13751,9 @@ var ts; if (entityName.parent.kind === 175 /* ExportAssignment */) { return resolveEntityName(entityName.parent.parent, entityName, ts.SymbolFlags.Value | ts.SymbolFlags.Type | ts.SymbolFlags.Namespace | 4194304 /* Import */); } + if (isInRightSideOfImportOrExportAssignment(entityName)) { + return getSymbolOfPartOfRightHandSideOfImport(entityName); + } if (isRightSideOfQualifiedNameOrPropertyAccess(entityName)) { entityName = entityName.parent; } @@ -14001,8 +13842,7 @@ var ts; return getTypeOfSymbol(symbol); } if (isInRightSideOfImportOrExportAssignment(node)) { - var symbol; - symbol = node.parent.kind === 175 /* ExportAssignment */ ? getSymbolInfo(node) : getSymbolOfPartOfRightHandSideOfImport(node); + var symbol = getSymbolInfo(node); var declaredType = getDeclaredTypeOfSymbol(symbol); return declaredType !== unknownType ? declaredType : getTypeOfSymbol(symbol); } @@ -14138,7 +13978,8 @@ var ts; function isImplementationOfOverload(node) { if (node.body) { var symbol = getSymbolOfNode(node); - return getSignaturesOfSymbol(symbol).length > 1; + var signaturesOfSymbol = getSignaturesOfSymbol(symbol); + return signaturesOfSymbol.length > 1 || (signaturesOfSymbol.length === 1 && signaturesOfSymbol[0].declaration !== node); } return false; } @@ -15393,7 +15234,7 @@ var TypeScript; })(Location); TypeScript.Diagnostic = Diagnostic; function newLine() { - return sys.newLine ? sys.newLine : "\r\n"; + return "\r\n"; } TypeScript.newLine = newLine; function getLargestIndex(diagnostic) { diff --git a/src/compiler/core.ts b/src/compiler/core.ts index b042b7e6cc825..fbf767b91a91f 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -509,12 +509,6 @@ module ts { return pathLen > extLen && path.substr(pathLen - extLen, extLen) === extension; } - export function getCanonicalFileName(fileName: string): string { - // if underlying system can distinguish between two files whose names differs only in cases then file name already in canonical form. - // otherwise use toLowerCase as a canonical form. - return sys.useCaseSensitiveFileNames ? fileName : fileName.toLowerCase(); - } - export interface ObjectAllocator { getNodeConstructor(kind: SyntaxKind): new () => Node; getSymbolConstructor(): new (flags: SymbolFlags, name: string) => Symbol; diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index ee616c2c4cad6..fc3f845dc4512 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -290,7 +290,7 @@ module ts { } else { // Empty string - make sure we write empty line - writer.writeLiteral(sys.newLine); + writer.writeLiteral(newLine); } } diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index f6a9506542a64..6bdbbe6750416 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -1,4 +1,3 @@ -/// /// /// /// diff --git a/src/compiler/tsc.ts b/src/compiler/tsc.ts index 202864c72a094..8188cb8e4d12e 100644 --- a/src/compiler/tsc.ts +++ b/src/compiler/tsc.ts @@ -137,6 +137,12 @@ module ts { var currentDirectory: string; var existingDirectories: Map = {}; + function getCanonicalFileName(fileName: string): string { + // if underlying system can distinguish between two files whose names differs only in cases then file name already in canonical form. + // otherwise use toLowerCase as a canonical form. + return sys.useCaseSensitiveFileNames ? fileName : fileName.toLowerCase(); + } + function getSourceFile(filename: string, languageVersion: ScriptTarget, onError?: (message: string) => void): SourceFile { try { var text = sys.readFile(filename, options.charset); @@ -323,6 +329,7 @@ module ts { function compile(commandLine: ParsedCommandLine, compilerHost: CompilerHost) { var parseStart = new Date().getTime(); var program = createProgram(commandLine.filenames, commandLine.options, compilerHost); + var bindStart = new Date().getTime(); var errors = program.getDiagnostics(); if (errors.length) { diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index dd6d240ec8b7e..81187039ba852 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -1893,9 +1893,9 @@ module FourSlash { fourslashSourceFile = fourslashSourceFile || ts.createSourceFile(tsFn, Harness.IO.readFile(tsFn), ts.ScriptTarget.ES5, /*version*/ "0", /*isOpen*/ false); var files: { [filename: string]: ts.SourceFile; } = {}; - files[ts.getCanonicalFileName(fourslashFilename)] = fourslashSourceFile; - files[ts.getCanonicalFileName(fileName)] = ts.createSourceFile(fileName, content, ts.ScriptTarget.ES5, /*version*/ "0", /*isOpen*/ false); - files[ts.getCanonicalFileName(Harness.Compiler.defaultLibFileName)] = Harness.Compiler.defaultLibSourceFile; + files[Harness.Compiler.getCanonicalFileName(fourslashFilename)] = fourslashSourceFile; + files[Harness.Compiler.getCanonicalFileName(fileName)] = ts.createSourceFile(fileName, content, ts.ScriptTarget.ES5, /*version*/ "0", /*isOpen*/ false); + files[Harness.Compiler.getCanonicalFileName(Harness.Compiler.defaultLibFileName)] = Harness.Compiler.defaultLibSourceFile; var host = Harness.Compiler.createCompilerHost(files, (fn, contents) => result = contents); var program = ts.createProgram([fourslashFilename, fileName], { out: "fourslashTestOutput.js" }, host); diff --git a/src/harness/harness.ts b/src/harness/harness.ts index 1a115fbddd4ec..f2488c06b482a 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -534,13 +534,17 @@ module Harness { export var defaultLibFileName = 'lib.d.ts'; export var defaultLibSourceFile = ts.createSourceFile(defaultLibFileName, IO.readFile(libFolder + 'lib.core.d.ts'), /*languageVersion*/ ts.ScriptTarget.ES5, /*version:*/ "0"); + export function getCanonicalFileName(fileName: string): string { + return sys.useCaseSensitiveFileNames ? fileName : fileName.toLowerCase(); + } + export function createCompilerHost(filemap: { [filename: string]: ts.SourceFile; }, writeFile: (fn: string, contents: string, writeByteOrderMark:boolean) => void): ts.CompilerHost { return { getCurrentDirectory: sys.getCurrentDirectory, getCancellationToken: (): any => undefined, getSourceFile: (fn, languageVersion) => { - if (Object.prototype.hasOwnProperty.call(filemap, ts.getCanonicalFileName(fn))) { - return filemap[ts.getCanonicalFileName(fn)]; + if (Object.prototype.hasOwnProperty.call(filemap, getCanonicalFileName(fn))) { + return filemap[getCanonicalFileName(fn)]; } else { var lib = defaultLibFileName; if (fn === defaultLibFileName) { @@ -552,7 +556,7 @@ module Harness { }, getDefaultLibFilename: () => defaultLibFileName, writeFile: writeFile, - getCanonicalFileName: ts.getCanonicalFileName, + getCanonicalFileName: getCanonicalFileName, useCaseSensitiveFileNames: () => sys.useCaseSensitiveFileNames, getNewLine: ()=> sys.newLine }; @@ -729,7 +733,7 @@ module Harness { var filemap: { [name: string]: ts.SourceFile; } = {}; var register = (file: { unitName: string; content: string; }) => { var filename = Path.switchToForwardSlashes(file.unitName); - filemap[ts.getCanonicalFileName(filename)] = ts.createSourceFile(filename, file.content, options.target, /*version:*/ "0"); + filemap[getCanonicalFileName(filename)] = ts.createSourceFile(filename, file.content, options.target, /*version:*/ "0"); }; inputFiles.forEach(register); otherFiles.forEach(register); diff --git a/src/harness/projectsRunner.ts b/src/harness/projectsRunner.ts index b6d25b558f86d..b0f3e939d30d6 100644 --- a/src/harness/projectsRunner.ts +++ b/src/harness/projectsRunner.ts @@ -187,7 +187,7 @@ class ProjectRunner extends RunnerBase { getDefaultLibFilename: () => "lib.d.ts", writeFile: writeFile, getCurrentDirectory: getCurrentDirectory, - getCanonicalFileName: ts.getCanonicalFileName, + getCanonicalFileName: Harness.Compiler.getCanonicalFileName, useCaseSensitiveFileNames: () => sys.useCaseSensitiveFileNames, getNewLine: () => sys.newLine }; diff --git a/src/services/core/diagnosticCore.ts b/src/services/core/diagnosticCore.ts index 0c12a354933ac..b4d95a1c60bd8 100644 --- a/src/services/core/diagnosticCore.ts +++ b/src/services/core/diagnosticCore.ts @@ -120,7 +120,7 @@ module TypeScript { // TODO: We need to expose an extensibility point on our hosts to have them tell us what // they want the newline string to be. That way we can get the correct result regardless // of which host we use - return sys.newLine ? sys.newLine : "\r\n"; + return "\r\n"; } function getLargestIndex(diagnostic: string): number {