From b95e1ff6d8656693c80ac54a15893c3ad4859762 Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Wed, 30 Sep 2015 16:10:52 -0700 Subject: [PATCH] This is what zero linter errors feels like --- src/compiler/checker.ts | 91 ++++++++++----------- src/compiler/commandLineParser.ts | 2 +- src/compiler/core.ts | 12 +-- src/compiler/declarationEmitter.ts | 8 +- src/compiler/parser.ts | 19 ++--- src/compiler/program.ts | 123 ++++++++++++++--------------- src/compiler/scanner.ts | 4 +- src/compiler/sys.ts | 14 ++-- src/compiler/tsc.ts | 8 +- src/compiler/types.ts | 30 +++---- src/compiler/utilities.ts | 10 +-- 11 files changed, 162 insertions(+), 159 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index ca18446c76c..a9f455c6610 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -2386,7 +2386,7 @@ namespace ts { if (isBindingPattern(declaration.parent)) { return getTypeForBindingElement(declaration); } - + // Use type from type annotation if one is present if (declaration.type) { return getTypeFromTypeNode(declaration.type); @@ -2407,12 +2407,12 @@ namespace ts { return type; } } - + // Use the type of the initializer expression if one is present if (declaration.initializer) { return checkExpressionCached(declaration.initializer); } - + // If it is a short-hand property assignment, use the type of the identifier if (declaration.kind === SyntaxKind.ShorthandPropertyAssignment) { return checkIdentifier(declaration.name); @@ -2507,10 +2507,10 @@ namespace ts { // tools see the actual type. return declaration.kind !== SyntaxKind.PropertyAssignment ? getWidenedType(type) : type; } - + // Rest parameters default to type any[], other parameters default to type any type = declaration.dotDotDotToken ? anyArrayType : anyType; - + // Report implicit any errors unless this is a private property within an ambient declaration if (reportErrors && compilerOptions.noImplicitAny) { let root = getRootDeclaration(declaration); @@ -4501,7 +4501,7 @@ namespace ts { } return t; }; - + mapper.context = context; return mapper; } @@ -4935,7 +4935,7 @@ namespace ts { // We know *exactly* where things went wrong when comparing the types. // Use this property as the error node as this will be more helpful in // reasoning about what went wrong. - errorNode = prop.valueDeclaration + errorNode = prop.valueDeclaration; reportError(Diagnostics.Object_literal_may_only_specify_known_properties_and_0_does_not_exist_in_type_1, symbolToString(prop), typeToString(target)); @@ -5240,7 +5240,7 @@ namespace ts { if (kind === SignatureKind.Construct) { // Only want to compare the construct signatures for abstractness guarantees. - + // Because the "abstractness" of a class is the same across all construct signatures // (internally we are checking the corresponding declaration), it is enough to perform // the check and report an error once over all pairs of source and target construct signatures. @@ -6410,7 +6410,7 @@ namespace ts { return getUnionType(assignableConstituents); } } - + if (isTypeAssignableTo(narrowedTypeCandidate, originalType)) { // Narrow to the target type if it's assignable to the current type return narrowedTypeCandidate; @@ -6637,46 +6637,46 @@ namespace ts { let classType = classDeclaration && getDeclaredTypeOfSymbol(getSymbolOfNode(classDeclaration)); let baseClassType = classType && getBaseTypes(classType)[0]; - let container = getSuperContainer(node, /*includeFunctions*/ true); + let container = getSuperContainer(node, /*includeFunctions*/ true); let needToCaptureLexicalThis = false; - if (!isCallExpression) { + if (!isCallExpression) { // adjust the container reference in case if super is used inside arrow functions with arbitrary deep nesting while (container && container.kind === SyntaxKind.ArrowFunction) { container = getSuperContainer(container, /*includeFunctions*/ true); needToCaptureLexicalThis = languageVersion < ScriptTarget.ES6; } } - + let canUseSuperExpression = isLegalUsageOfSuperExpression(container); let nodeCheckFlag: NodeCheckFlags = 0; - + // always set NodeCheckFlags for 'super' expression node - if (canUseSuperExpression) { + if (canUseSuperExpression) { if ((container.flags & NodeFlags.Static) || isCallExpression) { nodeCheckFlag = NodeCheckFlags.SuperStatic; } else { nodeCheckFlag = NodeCheckFlags.SuperInstance; } - + getNodeLinks(node).flags |= nodeCheckFlag; - + if (needToCaptureLexicalThis) { // call expressions are allowed only in constructors so they should always capture correct 'this' // super property access expressions can also appear in arrow functions - // in this case they should also use correct lexical this captureLexicalThis(node.parent, container); - } + } } - + if (!baseClassType) { if (!classDeclaration || !getClassExtendsHeritageClauseElement(classDeclaration)) { error(node, Diagnostics.super_can_only_be_referenced_in_a_derived_class); } - return unknownType; + return unknownType; } - + if (!canUseSuperExpression) { if (container && container.kind === SyntaxKind.ComputedPropertyName) { error(node, Diagnostics.super_cannot_be_referenced_in_a_computed_property_name); @@ -6687,20 +6687,20 @@ namespace ts { else { error(node, Diagnostics.super_property_access_is_permitted_only_in_a_constructor_member_function_or_member_accessor_of_a_derived_class); } - + return unknownType; } - + if (container.kind === SyntaxKind.Constructor && isInConstructorArgumentInitializer(node, container)) { // issue custom error message for super property access in constructor arguments (to be aligned with old compiler) error(node, Diagnostics.super_cannot_be_referenced_in_constructor_arguments); return unknownType; } - + return nodeCheckFlag === NodeCheckFlags.SuperStatic ? getBaseConstructorTypeOfClass(classType) : baseClassType; - + function isLegalUsageOfSuperExpression(container: Node): boolean { if (!container) { return false; @@ -6736,9 +6736,9 @@ namespace ts { } } } - + return false; - } + } } // Return contextual type of parameter or undefined if no contextual type is available @@ -7251,7 +7251,7 @@ namespace ts { } } } - return createArrayType(elementTypes.length ? getUnionType(elementTypes) : undefinedType) + return createArrayType(elementTypes.length ? getUnionType(elementTypes) : undefinedType); } function isNumericName(name: DeclarationName): boolean { @@ -7522,7 +7522,7 @@ namespace ts { // Maybe there's a string indexer? let indexerType = getIndexTypeOfType(elementAttributesType, IndexKind.String); if (indexerType) { - correspondingPropType = indexerType + correspondingPropType = indexerType; } else { // If there's no corresponding property with this name, error @@ -7590,7 +7590,8 @@ namespace ts { if (!links.resolvedSymbol) { if (isJsxIntrinsicIdentifier(node.tagName)) { links.resolvedSymbol = lookupIntrinsicTag(node); - } else { + } + else { links.resolvedSymbol = lookupClassTag(node); } } @@ -8214,9 +8215,9 @@ namespace ts { function reorderCandidates(signatures: Signature[], result: Signature[]): void { let lastParent: Node; let lastSymbol: Symbol; - let cutoffIndex: number = 0; + let cutoffIndex = 0; let index: number; - let specializedIndex: number = -1; + let specializedIndex = -1; let spliceIndex: number; Debug.assert(!result.length); for (let signature of signatures) { @@ -10815,7 +10816,7 @@ namespace ts { } if (!superCallStatement) { error(node, Diagnostics.A_super_call_must_be_the_first_statement_in_the_constructor_when_a_class_contains_initialized_properties_or_has_parameter_properties); - } + } else { // In such a required super call, it is a compile-time error for argument expressions to reference this. markThisReferencesAsErrors(superCallStatement.expression); @@ -11254,7 +11255,7 @@ namespace ts { // Spaces for anyting not declared a 'default export'. let nonDefaultExportedDeclarationSpaces = exportedDeclarationSpaces | nonExportedDeclarationSpaces; - + let commonDeclarationSpacesForExportsAndLocals = exportedDeclarationSpaces & nonExportedDeclarationSpaces; let commonDeclarationSpacesForDefaultAndNonDefault = defaultExportedDeclarationSpaces & nonDefaultExportedDeclarationSpaces; @@ -11262,7 +11263,7 @@ namespace ts { // declaration spaces for exported and non-exported declarations intersect for (let d of symbol.declarations) { let declarationSpaces = getDeclarationSpaces(d); - + // Only error on the declarations that conributed to the intersecting spaces. if (declarationSpaces & commonDeclarationSpacesForDefaultAndNonDefault) { error(d.name, Diagnostics.Merged_declaration_0_cannot_include_a_default_export_declaration_Consider_adding_a_separate_export_default_0_declaration_instead, declarationNameToString(d.name)); @@ -12089,7 +12090,7 @@ namespace ts { function checkGrammarDisallowedModifiersOnObjectLiteralExpressionMethod(node: Node) { // We only disallow modifier on a method declaration if it is a property of object-literal-expression - if (node.modifiers && node.parent.kind === SyntaxKind.ObjectLiteralExpression){ + if (node.modifiers && node.parent.kind === SyntaxKind.ObjectLiteralExpression) { if (isAsyncFunctionLike(node)) { if (node.modifiers.length > 1) { return grammarErrorOnFirstToken(node, Diagnostics.Modifiers_cannot_appear_here); @@ -13138,7 +13139,7 @@ namespace ts { } const previousEnumMemberIsNonConstant = autoValue === undefined; - + let initializer = member.initializer; if (initializer) { autoValue = computeConstantValueForEnumMemberInitializer(initializer, enumType, enumIsConst, ambient); @@ -13177,7 +13178,7 @@ namespace ts { } else if (ambient) { error(initializer, Diagnostics.In_ambient_enum_declarations_member_initializer_must_be_constant_expression); - } + } else { // Only here do we need to check that the initializer is assignable to the enum type. checkTypeAssignableTo(checkExpression(initializer), enumType, initializer, /*headMessage*/ undefined); @@ -13477,7 +13478,7 @@ namespace ts { Debug.assert(node.kind === SyntaxKind.Identifier); return node; } - + function checkExternalImportOrExportDeclaration(node: ImportDeclaration | ImportEqualsDeclaration | ExportDeclaration): boolean { let moduleName = getExternalModuleName(node); if (!nodeIsMissing(moduleName) && moduleName.kind !== SyntaxKind.StringLiteral) { @@ -14104,11 +14105,11 @@ namespace ts { } break; } - + if (introducesArgumentsExoticObject(location)) { copySymbol(argumentsSymbol, meaning); } - + memberFlags = location.flags; location = location.parent; } @@ -14580,9 +14581,9 @@ namespace ts { } // const enums and modules that contain only const enums are not considered values from the emit perespective // unless 'preserveConstEnums' option is set to true - return target !== unknownSymbol && - target && - target.flags & SymbolFlags.Value && + return target !== unknownSymbol && + target && + target.flags & SymbolFlags.Value && (compilerOptions.preserveConstEnums || !isConstEnumOrConstEnumOnlyModule(target)); } @@ -14653,7 +14654,7 @@ namespace ts { function isFunctionType(type: Type): boolean { return type.flags & TypeFlags.ObjectType && getSignaturesOfType(type, SignatureKind.Call).length > 0; } - + function getTypeReferenceSerializationKind(typeName: EntityName): TypeReferenceSerializationKind { // Resolve the symbol as a value to ensure the type can be reached at runtime during emit. let valueSymbol = resolveEntityName(typeName, SymbolFlags.Value, /*ignoreErrors*/ true); @@ -14666,7 +14667,7 @@ namespace ts { let typeSymbol = resolveEntityName(typeName, SymbolFlags.Type, /*ignoreErrors*/ true); // We might not be able to resolve type symbol so use unknown type in that case (eg error case) if (!typeSymbol) { - return TypeReferenceSerializationKind.ObjectType; + return TypeReferenceSerializationKind.ObjectType; } let type = getDeclaredTypeOfSymbol(typeSymbol); if (type === unknownType) { diff --git a/src/compiler/commandLineParser.ts b/src/compiler/commandLineParser.ts index f1d4b6e31ec..11062983aaa 100644 --- a/src/compiler/commandLineParser.ts +++ b/src/compiler/commandLineParser.ts @@ -470,7 +470,7 @@ namespace ts { fileNames = map(json["files"], s => combinePaths(basePath, s)); } else { - errors.push(createCompilerDiagnostic(Diagnostics.Compiler_option_0_requires_a_value_of_type_1, "files", "Array")); + errors.push(createCompilerDiagnostic(Diagnostics.Compiler_option_0_requires_a_value_of_type_1, "files", "Array")); } } else { diff --git a/src/compiler/core.ts b/src/compiler/core.ts index a1f6565ed1f..ce59c3b3bc6 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -52,7 +52,7 @@ namespace ts { function normalizeKey(key: string) { return getCanonicalFileName(normalizeSlashes(key)); } - + function clear() { files = {}; } @@ -117,7 +117,7 @@ namespace ts { return count; } - export function filter(array: T[], f: (x: T) => boolean): T[]{ + export function filter(array: T[], f: (x: T) => boolean): T[] { let result: T[]; if (array) { result = []; @@ -130,7 +130,7 @@ namespace ts { return result; } - export function map(array: T[], f: (x: T) => U): U[]{ + export function map(array: T[], f: (x: T) => U): U[] { let result: U[]; if (array) { result = []; @@ -148,7 +148,7 @@ namespace ts { return array1.concat(array2); } - export function deduplicate(array: T[]): T[]{ + export function deduplicate(array: T[]): T[] { let result: T[]; if (array) { result = []; @@ -486,7 +486,7 @@ namespace ts { return text1 ? Comparison.GreaterThan : Comparison.LessThan; } - export function sortAndDeduplicateDiagnostics(diagnostics: Diagnostic[]): Diagnostic[]{ + export function sortAndDeduplicateDiagnostics(diagnostics: Diagnostic[]): Diagnostic[] { return deduplicateSortedDiagnostics(diagnostics.sort(compareDiagnostics)); } @@ -795,7 +795,7 @@ namespace ts { VeryAggressive = 3, } - export module Debug { + export namespace Debug { let currentAssertionLevel = AssertionLevel.None; export function shouldAssert(level: AssertionLevel): boolean { diff --git a/src/compiler/declarationEmitter.ts b/src/compiler/declarationEmitter.ts index c9b60492e6e..00085f16086 100644 --- a/src/compiler/declarationEmitter.ts +++ b/src/compiler/declarationEmitter.ts @@ -180,9 +180,11 @@ namespace ts { let nodeToCheck: Node; if (declaration.kind === SyntaxKind.VariableDeclaration) { nodeToCheck = declaration.parent.parent; - } else if (declaration.kind === SyntaxKind.NamedImports || declaration.kind === SyntaxKind.ImportSpecifier || declaration.kind === SyntaxKind.ImportClause) { + } + else if (declaration.kind === SyntaxKind.NamedImports || declaration.kind === SyntaxKind.ImportSpecifier || declaration.kind === SyntaxKind.ImportClause) { Debug.fail("We should be getting ImportDeclaration instead to write"); - } else { + } + else { nodeToCheck = declaration; } @@ -1082,7 +1084,7 @@ namespace ts { // emitted: declare var c: number; // instead of declare var c:number, ; let elements: Node[] = []; for (let element of bindingPattern.elements) { - if (element.kind !== SyntaxKind.OmittedExpression){ + if (element.kind !== SyntaxKind.OmittedExpression) { elements.push(element); } } diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index a78b18b720f..08f21e80e14 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -425,7 +425,7 @@ namespace ts { // Implement the parser as a singleton module. We do this for perf reasons because creating // parser instances can actually be expensive enough to impact us on projects with many source // files. - module Parser { + namespace Parser { // Share a single scanner across all calls to parse a source file. This helps speed things // up by avoiding the cost of creating/compiling scanners over and over again. const scanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ true); @@ -518,7 +518,7 @@ namespace ts { // // Note: any errors at the end of the file that do not precede a regular node, should get // attached to the EOF token. - let parseErrorBeforeNextFinishedNode: boolean = false; + let parseErrorBeforeNextFinishedNode = false; export function parseSourceFile(fileName: string, _sourceText: string, languageVersion: ScriptTarget, _syntaxCursor: IncrementalParser.SyntaxCursor, setParentNodes?: boolean): SourceFile { initializeState(fileName, _sourceText, languageVersion, _syntaxCursor); @@ -3940,7 +3940,8 @@ namespace ts { forOfStatement.expression = allowInAnd(parseAssignmentExpressionOrHigher); parseExpected(SyntaxKind.CloseParenToken); forOrForInOrForOfStatement = forOfStatement; - } else { + } + else { let forStatement = createNode(SyntaxKind.ForStatement, pos); forStatement.initializer = initializer; parseExpected(SyntaxKind.SemicolonToken); @@ -4827,7 +4828,7 @@ namespace ts { return finishNode(node); } - + function parseNameOfClassDeclarationOrExpression(): Identifier { // implements is a future reserved word so // 'class implements' might mean either @@ -4838,11 +4839,11 @@ namespace ts { ? parseIdentifier() : undefined; } - + function isImplementsClause() { - return token === SyntaxKind.ImplementsKeyword && lookAhead(nextTokenIsIdentifierOrKeyword) + return token === SyntaxKind.ImplementsKeyword && lookAhead(nextTokenIsIdentifierOrKeyword); } - + function parseHeritageClauses(isClassHeritageClause: boolean): NodeArray { // ClassTail[Yield,Await] : (Modified) See 14.5 // ClassHeritage[?Yield,?Await]opt { ClassBody[?Yield,?Await]opt } @@ -5317,7 +5318,7 @@ namespace ts { Unknown } - export module JSDocParser { + export namespace JSDocParser { export function isJSDocType() { switch (token) { case SyntaxKind.AsteriskToken: @@ -5962,7 +5963,7 @@ namespace ts { } } - module IncrementalParser { + namespace IncrementalParser { export function updateSourceFile(sourceFile: SourceFile, newText: string, textChangeRange: TextChangeRange, aggressiveChecks: boolean): SourceFile { aggressiveChecks = aggressiveChecks || Debug.shouldAssert(AssertionLevel.Aggressive); diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 3cccb4d477a..c6d3a245a8d 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -9,9 +9,9 @@ namespace ts { /* @internal */ export let ioWriteTime = 0; /** The version of the TypeScript compiler release */ - + let emptyArray: any[] = []; - + export const version = "1.7.0"; export function findConfigFile(searchPath: string): string { @@ -29,36 +29,36 @@ namespace ts { } return undefined; } - + export function resolveTripleslashReference(moduleName: string, containingFile: string): string { let basePath = getDirectoryPath(containingFile); let referencedFileName = isRootedDiskPath(moduleName) ? moduleName : combinePaths(basePath, moduleName); return normalizePath(referencedFileName); } - + export function resolveModuleName(moduleName: string, containingFile: string, compilerOptions: CompilerOptions, host: ModuleResolutionHost): ResolvedModuleWithFailedLookupLocations { - let moduleResolution = compilerOptions.moduleResolution !== undefined + let moduleResolution = compilerOptions.moduleResolution !== undefined ? compilerOptions.moduleResolution : compilerOptions.module === ModuleKind.CommonJS ? ModuleResolutionKind.NodeJs : ModuleResolutionKind.Classic; - + switch (moduleResolution) { case ModuleResolutionKind.NodeJs: return nodeModuleNameResolver(moduleName, containingFile, host); case ModuleResolutionKind.Classic: return classicNameResolver(moduleName, containingFile, compilerOptions, host); } } - + export function nodeModuleNameResolver(moduleName: string, containingFile: string, host: ModuleResolutionHost): ResolvedModuleWithFailedLookupLocations { - let containingDirectory = getDirectoryPath(containingFile); + let containingDirectory = getDirectoryPath(containingFile); if (getRootLength(moduleName) !== 0 || nameStartsWithDotSlashOrDotDotSlash(moduleName)) { let failedLookupLocations: string[] = []; let candidate = normalizePath(combinePaths(containingDirectory, moduleName)); let resolvedFileName = loadNodeModuleFromFile(candidate, /* loadOnlyDts */ false, failedLookupLocations, host); - + if (resolvedFileName) { return { resolvedModule: { resolvedFileName }, failedLookupLocations }; } - + resolvedFileName = loadNodeModuleFromDirectory(candidate, /* loadOnlyDts */ false, failedLookupLocations, host); return resolvedFileName ? { resolvedModule: { resolvedFileName }, failedLookupLocations } @@ -68,7 +68,7 @@ namespace ts { return loadModuleFromNodeModules(moduleName, containingDirectory, host); } } - + function loadNodeModuleFromFile(candidate: string, loadOnlyDts: boolean, failedLookupLocation: string[], host: ModuleResolutionHost): string { if (loadOnlyDts) { return tryLoad(".d.ts"); @@ -76,7 +76,7 @@ namespace ts { else { return forEach(supportedExtensions, tryLoad); } - + function tryLoad(ext: string): string { let fileName = fileExtensionIs(candidate, ext) ? candidate : candidate + ext; if (host.fileExists(fileName)) { @@ -88,13 +88,13 @@ namespace ts { } } } - + function loadNodeModuleFromDirectory(candidate: string, loadOnlyDts: boolean, failedLookupLocation: string[], host: ModuleResolutionHost): string { let packageJsonPath = combinePaths(candidate, "package.json"); if (host.fileExists(packageJsonPath)) { - + let jsonContent: { typings?: string }; - + try { let jsonText = host.readFile(packageJsonPath); jsonContent = jsonText ? <{ typings?: string }>JSON.parse(jsonText) : { typings: undefined }; @@ -103,7 +103,7 @@ namespace ts { // gracefully handle if readFile fails or returns not JSON jsonContent = { typings: undefined }; } - + if (jsonContent.typings) { let result = loadNodeModuleFromFile(normalizePath(combinePaths(candidate, jsonContent.typings)), loadOnlyDts, failedLookupLocation, host); if (result) { @@ -115,12 +115,12 @@ namespace ts { // record package json as one of failed lookup locations - in the future if this file will appear it will invalidate resolution results failedLookupLocation.push(packageJsonPath); } - + return loadNodeModuleFromFile(combinePaths(candidate, "index"), loadOnlyDts, failedLookupLocation, host); } - + function loadModuleFromNodeModules(moduleName: string, directory: string, host: ModuleResolutionHost): ResolvedModuleWithFailedLookupLocations { - let failedLookupLocations: string[] = []; + let failedLookupLocations: string[] = []; directory = normalizeSlashes(directory); while (true) { let baseName = getBaseFileName(directory); @@ -131,36 +131,36 @@ namespace ts { if (result) { return { resolvedModule: { resolvedFileName: result, isExternalLibraryImport: true }, failedLookupLocations }; } - + result = loadNodeModuleFromDirectory(candidate, /* loadOnlyDts */ true, failedLookupLocations, host); if (result) { return { resolvedModule: { resolvedFileName: result, isExternalLibraryImport: true }, failedLookupLocations }; } } - + let parentPath = getDirectoryPath(directory); if (parentPath === directory) { break; } - + directory = parentPath; } - + return { resolvedModule: undefined, failedLookupLocations }; } - + function nameStartsWithDotSlashOrDotDotSlash(name: string) { let i = name.lastIndexOf("./", 1); return i === 0 || (i === 1 && name.charCodeAt(0) === CharacterCodes.dot); } export function classicNameResolver(moduleName: string, containingFile: string, compilerOptions: CompilerOptions, host: ModuleResolutionHost): ResolvedModuleWithFailedLookupLocations { - + // module names that contain '!' are used to reference resources and are not resolved to actual files on disk - if (moduleName.indexOf('!') != -1) { + if (moduleName.indexOf("!") != -1) { return { resolvedModule: undefined, failedLookupLocations: [] }; } - + let searchPath = getDirectoryPath(containingFile); let searchName: string; @@ -175,7 +175,7 @@ namespace ts { // 'logical not' handles both undefined and None cases return undefined; } - + let candidate = searchName + extension; if (host.fileExists(candidate)) { return candidate; @@ -277,8 +277,7 @@ namespace ts { } const newLine = getNewLineCharacter(options); - - + return { getSourceFile, getDefaultLibFileName: options => combinePaths(getDirectoryPath(normalizePath(sys.getExecutingFilePath())), getDefaultLibFileName(options)), @@ -347,26 +346,26 @@ namespace ts { let start = new Date().getTime(); host = host || createCompilerHost(options); - + const resolveModuleNamesWorker = host.resolveModuleNames ? ((moduleNames: string[], containingFile: string) => host.resolveModuleNames(moduleNames, containingFile)) : ((moduleNames: string[], containingFile: string) => map(moduleNames, moduleName => resolveModuleName(moduleName, containingFile, options, host).resolvedModule)); let filesByName = createFileMap(fileName => host.getCanonicalFileName(fileName)); - + if (oldProgram) { // check properties that can affect structure of the program or module resolution strategy // if any of these properties has changed - structure cannot be reused let oldOptions = oldProgram.getCompilerOptions(); - if ((oldOptions.module !== options.module) || - (oldOptions.noResolve !== options.noResolve) || - (oldOptions.target !== options.target) || + if ((oldOptions.module !== options.module) || + (oldOptions.noResolve !== options.noResolve) || + (oldOptions.target !== options.target) || (oldOptions.noLib !== options.noLib) || (oldOptions.jsx !== options.jsx)) { oldProgram = undefined; } } - + if (!tryReuseStructureFromOldProgram()) { forEach(rootNames, name => processRootFile(name, false)); // Do not process the default library if: @@ -427,7 +426,7 @@ namespace ts { if (!oldProgram) { return false; } - + Debug.assert(!oldProgram.structureIsReused); // there is an old program, check if we can reuse its structure @@ -435,7 +434,7 @@ namespace ts { if (!arrayIsEqualTo(oldRootNames, rootNames)) { return false; } - + // check if program source files has changed in the way that can affect structure of the program let newSourceFiles: SourceFile[] = []; let modifiedSourceFiles: SourceFile[] = []; @@ -445,7 +444,7 @@ namespace ts { return false; } - if (oldSourceFile !== newSourceFile) { + if (oldSourceFile !== newSourceFile) { if (oldSourceFile.hasNoDefaultLib !== newSourceFile.hasNoDefaultLib) { // value of no-default-lib has changed // this will affect if default library is injected into the list of files @@ -457,14 +456,14 @@ namespace ts { // tripleslash references has changed return false; } - + // check imports collectExternalModuleReferences(newSourceFile); if (!arrayIsEqualTo(oldSourceFile.imports, newSourceFile.imports, moduleNameIsEqualTo)) { // imports has changed return false; } - + if (resolveModuleNamesWorker) { let moduleNames = map(newSourceFile.imports, name => name.text); let resolutions = resolveModuleNamesWorker(moduleNames, newSourceFile.fileName); @@ -473,11 +472,11 @@ namespace ts { let newResolution = resolutions[i]; let oldResolution = getResolvedModule(oldSourceFile, moduleNames[i]); let resolutionChanged = oldResolution - ? !newResolution || + ? !newResolution || oldResolution.resolvedFileName !== newResolution.resolvedFileName || !!oldResolution.isExternalLibraryImport !== !!newResolution.isExternalLibraryImport : newResolution; - + if (resolutionChanged) { return false; } @@ -491,24 +490,24 @@ namespace ts { // file has no changes - use it as is newSourceFile = oldSourceFile; } - + // if file has passed all checks it should be safe to reuse it newSourceFiles.push(newSourceFile); } - + // update fileName -> file mapping for (let file of newSourceFiles) { filesByName.set(file.fileName, file); } - + files = newSourceFiles; fileProcessingDiagnostics = oldProgram.getFileProcessingDiagnostics(); - + for (let modifiedFile of modifiedSourceFiles) { fileProcessingDiagnostics.reattachFileDiagnostics(modifiedFile); } oldProgram.structureIsReused = true; - + return true; } @@ -554,7 +553,7 @@ namespace ts { // This is because in the -out scenario all files need to be emitted, and therefore all // files need to be type checked. And the way to specify that all files need to be type // checked is to not pass the file to getEmitResolver. - let emitResolver = getDiagnosticsProducingTypeChecker().getEmitResolver((options.outFile || options.out)? undefined : sourceFile); + let emitResolver = getDiagnosticsProducingTypeChecker().getEmitResolver((options.outFile || options.out) ? undefined : sourceFile); let start = new Date().getTime(); @@ -658,7 +657,7 @@ namespace ts { function getOptionsDiagnostics(): Diagnostic[] { let allDiagnostics: Diagnostic[] = []; - addRange(allDiagnostics, fileProcessingDiagnostics.getGlobalDiagnostics()) + addRange(allDiagnostics, fileProcessingDiagnostics.getGlobalDiagnostics()); addRange(allDiagnostics, programDiagnostics.getGlobalDiagnostics()); return sortAndDeduplicateDiagnostics(allDiagnostics); } @@ -675,28 +674,28 @@ namespace ts { function processRootFile(fileName: string, isDefaultLib: boolean) { processSourceFile(normalizePath(fileName), isDefaultLib); - } - + } + function fileReferenceIsEqualTo(a: FileReference, b: FileReference): boolean { return a.fileName === b.fileName; } - + function moduleNameIsEqualTo(a: LiteralExpression, b: LiteralExpression): boolean { return a.text === b.text; } - + function collectExternalModuleReferences(file: SourceFile): void { if (file.imports) { return; } - + let imports: LiteralExpression[]; for (let node of file.statements) { collect(node, /* allowRelativeModuleNames */ true); } file.imports = imports || emptyArray; - + function collect(node: Node, allowRelativeModuleNames: boolean): void { switch (node.kind) { case SyntaxKind.ImportDeclaration: @@ -781,7 +780,7 @@ namespace ts { // We've already looked for this file, use cached result return getSourceFileFromCache(fileName, /*useAbsolutePath*/ false); } - + let normalizedAbsolutePath = getNormalizedAbsolutePath(fileName, host.getCurrentDirectory()); if (filesByName.contains(normalizedAbsolutePath)) { const file = getSourceFileFromCache(normalizedAbsolutePath, /*useAbsolutePath*/ true); @@ -801,14 +800,14 @@ namespace ts { fileProcessingDiagnostics.add(createCompilerDiagnostic(Diagnostics.Cannot_read_file_0_Colon_1, fileName, hostErrorMessage)); } }); - + filesByName.set(fileName, file); if (file) { skipDefaultLib = skipDefaultLib || file.hasNoDefaultLib; // Set the source file for normalized absolute path filesByName.set(normalizedAbsolutePath, file); - + let basePath = getDirectoryPath(fileName); if (!options.noResolve) { processReferencedFiles(file, basePath); @@ -852,7 +851,7 @@ namespace ts { processSourceFile(referencedFileName, /* isDefaultLib */ false, file, ref.pos, ref.end); }); } - + function processImportedModules(file: SourceFile, basePath: string) { collectExternalModuleReferences(file); if (file.imports.length) { @@ -866,11 +865,11 @@ namespace ts { const importedFile = findModuleSourceFile(resolution.resolvedFileName, file.imports[i]); if (importedFile && resolution.isExternalLibraryImport) { if (!isExternalModule(importedFile)) { - let start = getTokenPosOfNode(file.imports[i], file) + let start = getTokenPosOfNode(file.imports[i], file); fileProcessingDiagnostics.add(createFileDiagnostic(file, start, file.imports[i].end - start, Diagnostics.Exported_external_package_typings_file_0_is_not_a_module_Please_contact_the_package_author_to_update_the_package_definition, importedFile.fileName)); } else if (!fileExtensionIs(importedFile.fileName, ".d.ts")) { - let start = getTokenPosOfNode(file.imports[i], file) + let start = getTokenPosOfNode(file.imports[i], file); fileProcessingDiagnostics.add(createFileDiagnostic(file, start, file.imports[i].end - start, Diagnostics.Exported_external_package_typings_can_only_be_in_d_ts_files_Please_contact_the_package_author_to_update_the_package_definition)); } else if (importedFile.referencedFiles.length) { diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index 10027c44e7d..ee4dea04f09 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -224,7 +224,7 @@ namespace ts { } // Perform binary search in one of the Unicode range maps - let lo: number = 0; + let lo = 0; let hi: number = map.length; let mid: number; @@ -657,7 +657,7 @@ namespace ts { export function getTrailingCommentRanges(text: string, pos: number): CommentRange[] { return getCommentRanges(text, pos, /*trailing*/ true); } - + /** Optionally, get the shebang */ export function getShebang(text: string): string { return shebangTriviaRegex.test(text) diff --git a/src/compiler/sys.ts b/src/compiler/sys.ts index 5b46324601b..f3f2b02a30e 100644 --- a/src/compiler/sys.ts +++ b/src/compiler/sys.ts @@ -29,8 +29,8 @@ namespace ts { declare var process: any; declare var global: any; declare var __filename: string; - declare var Buffer: { - new (str: string, encoding?: string): any; + declare var Buffer: { + new (str: string, encoding?: string): any; }; declare class Enumerator { @@ -116,7 +116,7 @@ namespace ts { return path.toLowerCase(); } - function getNames(collection: any): string[]{ + function getNames(collection: any): string[] { let result: string[] = []; for (let e = new Enumerator(collection); !e.atEnd(); e.moveNext()) { result.push(e.item().Name); @@ -270,9 +270,9 @@ namespace ts { args: process.argv.slice(2), newLine: _os.EOL, useCaseSensitiveFileNames: useCaseSensitiveFileNames, - write(s: string): void { - const buffer = new Buffer(s, "utf8"); - let offset: number = 0; + write(s: string): void { + const buffer = new Buffer(s, "utf8"); + let offset = 0; let toWrite: number = buffer.length; let written = 0; // 1 is a standard descriptor for stdout @@ -280,7 +280,7 @@ namespace ts { offset += written; toWrite -= written; } - }, + }, readFile, writeFile, watchFile: (fileName, callback) => { diff --git a/src/compiler/tsc.ts b/src/compiler/tsc.ts index 9d254e6fa25..02b8e636772 100644 --- a/src/compiler/tsc.ts +++ b/src/compiler/tsc.ts @@ -103,7 +103,7 @@ namespace ts { function reportWatchDiagnostic(diagnostic: Diagnostic) { let output = new Date().toLocaleTimeString() + " - "; - + if (diagnostic.file) { let loc = getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start); output += `${ diagnostic.file.fileName }(${ loc.line + 1 },${ loc.character + 1 }): `; @@ -113,7 +113,7 @@ namespace ts { sys.write(output); } - + function padLeft(s: string, length: number) { while (s.length < length) { s = " " + s; @@ -373,7 +373,7 @@ namespace ts { function compileProgram(): ExitStatus { let diagnostics: Diagnostic[]; - + // First get and report any syntactic errors. diagnostics = program.getSyntacticDiagnostics(); @@ -509,7 +509,7 @@ namespace ts { function writeConfigFile(options: CompilerOptions, fileNames: string[]) { let currentDirectory = sys.getCurrentDirectory(); - let file = combinePaths(currentDirectory, 'tsconfig.json'); + let file = combinePaths(currentDirectory, "tsconfig.json"); if (sys.fileExists(file)) { reportDiagnostic(createCompilerDiagnostic(Diagnostics.A_tsconfig_json_file_is_already_defined_at_Colon_0, file)); } diff --git a/src/compiler/types.ts b/src/compiler/types.ts index faf27c23555..5979c4246b1 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -1245,7 +1245,7 @@ namespace ts { moduleName: string; referencedFiles: FileReference[]; languageVariant: LanguageVariant; - + // this map is used by transpiler to supply alternative names for dependencies (i.e. in case of bundling) /* @internal */ renamedDependencies?: Map; @@ -1313,12 +1313,12 @@ namespace ts { } export interface Program extends ScriptReferenceHost { - + /** * Get a list of root file names that were passed to a 'createProgram' */ - getRootFileNames(): string[] - + getRootFileNames(): string[]; + /** * Get a list of files in the program */ @@ -1600,7 +1600,7 @@ namespace ts { getConstantValue(node: EnumMember | PropertyAccessExpression | ElementAccessExpression): number; getBlockScopedVariableId(node: Identifier): number; getReferencedValueDeclaration(reference: Identifier): Declaration; - getTypeReferenceSerializationKind(typeName: EntityName): TypeReferenceSerializationKind; + getTypeReferenceSerializationKind(typeName: EntityName): TypeReferenceSerializationKind; isOptionalParameter(node: ParameterDeclaration): boolean; } @@ -2025,12 +2025,12 @@ namespace ts { Error, Message, } - + export const enum ModuleResolutionKind { Classic = 1, NodeJs = 2 } - + export interface CompilerOptions { allowNonTsExtensions?: boolean; charset?: string; @@ -2072,7 +2072,7 @@ namespace ts { experimentalDecorators?: boolean; experimentalAsyncFunctions?: boolean; emitDecoratorMetadata?: boolean; - moduleResolution?: ModuleResolutionKind + moduleResolution?: ModuleResolutionKind; /* @internal */ stripInternal?: boolean; // Skip checking lib.d.ts to help speed up tests. @@ -2287,15 +2287,15 @@ namespace ts { byteOrderMark = 0xFEFF, tab = 0x09, // \t verticalTab = 0x0B, // \v - } - + } + export interface ModuleResolutionHost { fileExists(fileName: string): boolean; // readFile function is used to read arbitrary text files on disk, i.e. when resolution procedure needs the content of 'package.json' // to determine location of bundled typings for node module readFile(fileName: string): string; } - + export interface ResolvedModule { resolvedFileName: string; /* @@ -2306,12 +2306,12 @@ namespace ts { */ isExternalLibraryImport?: boolean; } - + export interface ResolvedModuleWithFailedLookupLocations { resolvedModule: ResolvedModule; failedLookupLocations: string[]; } - + export interface CompilerHost extends ModuleResolutionHost { getSourceFile(fileName: string, languageVersion: ScriptTarget, onError?: (message: string) => void): SourceFile; getCancellationToken?(): CancellationToken; @@ -2321,7 +2321,7 @@ namespace ts { getCanonicalFileName(fileName: string): string; useCaseSensitiveFileNames(): boolean; getNewLine(): string; - + /* * CompilerHost must either implement resolveModuleNames (in case if it wants to be completely in charge of * module name resolution) or provide implementation for methods from ModuleResolutionHost (in this case compiler @@ -2360,7 +2360,7 @@ namespace ts { // operation caused diagnostics to be returned by storing and comparing the return value // of this method before/after the operation is performed. getModificationCount(): number; - + /* @internal */ reattachFileDiagnostics(newFile: SourceFile): void; } } diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 03afa225d0c..452f59f0f03 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -99,8 +99,8 @@ namespace ts { } return true; - } - + } + export function hasResolvedModule(sourceFile: SourceFile, moduleNameText: string): boolean { return sourceFile.resolvedModules && hasProperty(sourceFile.resolvedModules, moduleNameText); } @@ -996,7 +996,7 @@ namespace ts { } return false; } - + export function isExternalModuleNameRelative(moduleName: string): boolean { // TypeScript 1.0 spec (April 2014): 11.2.1 // An external module name is "relative" if the first term is "." or "..". @@ -1526,12 +1526,12 @@ namespace ts { function getModificationCount() { return modificationCount; } - + function reattachFileDiagnostics(newFile: SourceFile): void { if (!hasProperty(fileDiagnostics, newFile.fileName)) { return; } - + for (let diagnostic of fileDiagnostics[newFile.fileName]) { diagnostic.file = newFile; }