diff --git a/src/services/compiler/precompile.ts b/src/services/compiler/precompile.ts deleted file mode 100644 index ea4f6364eff..00000000000 --- a/src/services/compiler/precompile.ts +++ /dev/null @@ -1,44 +0,0 @@ -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -module TypeScript { - export interface ILineAndCharacter { - line: number; - character: number; - } - - // Note: This is being using by the host (VS) and is marshaled back and forth. When changing this make sure the changes - // are reflected in the managed side as well - export interface IFileReference extends ILineAndCharacter { - path: string; - isResident: boolean; - position: number; - length: number; - } - - export interface IPreProcessedFileInfo { - referencedFiles: IFileReference[]; - importedFiles: IFileReference[]; - diagnostics: TypeScript.Diagnostic[]; - isLibFile: boolean - } - - interface ITripleSlashDirectiveProperties { - noDefaultLib: boolean; - diagnostics: TypeScript.Diagnostic[]; - referencedFiles: IFileReference[]; - } - -} // Tools \ No newline at end of file diff --git a/src/services/core/lineMap.ts b/src/services/core/lineMap.ts index 8820f55b920..e66198876a9 100644 --- a/src/services/core/lineMap.ts +++ b/src/services/core/lineMap.ts @@ -1,6 +1,11 @@ /// module TypeScript { + export interface ILineAndCharacter { + line: number; + character: number; + } + export class LineMap { public static empty = new LineMap(() => [0], 0); private _lineStarts: number[] = null; diff --git a/src/services/services.ts b/src/services/services.ts index b64a5207b85..a9a9ec7bf30 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -80,10 +80,20 @@ module ts { /// /// Pre-processing /// - interface ITripleSlashDirectiveProperties { - noDefaultLib: boolean; + // Note: This is being using by the host (VS) and is marshaled back and forth. When changing this make sure the changes + // are reflected in the managed side as well + // TODO (yuisu) : Consider merge with FileReference in types.ts + export interface IFileReference { + path: string; + position: number; + length: number; + } + + export interface PreProcessedFileInfo { + referencedFiles: IFileReference[]; + importedFiles: IFileReference[]; diagnostics: TypeScript.Diagnostic[]; - referencedFiles: TypeScript.IFileReference[]; + isLibFile: boolean } var scanner: Scanner = createScanner(ScriptTarget.ES5, /*skipTrivia*/ true); @@ -1905,159 +1915,94 @@ module ts { } export var tripleSlashReferenceRegExp = /^(\/\/\/\s*/; - export function preProcessFile(fileName: string, sourceText: TypeScript.IScriptSnapshot, readImportFiles = true): TypeScript.IPreProcessedFileInfo { + export function preProcessFile(fileName: string, sourceText: TypeScript.IScriptSnapshot, readImportFiles = true): PreProcessedFileInfo { + var reportDiagnostic = () => { } + var text = sourceText.getText(0, sourceText.getLength()); + var referencedFiles: IFileReference[] = []; + var importedFiles: IFileReference[] = []; + function isNoDefaultLibMatch(comment: string): RegExpExecArray { var isNoDefaultLibRegex = /^(\/\/\/\s*/gim; return isNoDefaultLibRegex.exec(comment); } - function getFileReferenceFromReferencePath(fileName: string, text: TypeScript.ISimpleText, position: number, comment: string, diagnostics: TypeScript.Diagnostic[]): TypeScript.IFileReference { - // First, just see if they've written: /// = 7 && fullReference[6] === "true"; return { - line: 0, - character: 0, + // TODO (yuisu) : Move the function to util + path: TypeScript.switchToForwardSlashes(adjustedPath), position: 0, length: 0, - path: TypeScript.switchToForwardSlashes(adjustedPath), - isResident: isResident }; } } } - - return null; } - function processImports(text: TypeScript.ISimpleText, scanner: TypeScript.Scanner.IScanner, token: TypeScript.ISyntaxToken, importedFiles: TypeScript.IFileReference[]): void { - var lineChar = { line: -1, character: -1 }; + function processTripleSlashDirectives(): void { + var commentRanges = getLeadingCommentRanges(text, 0); + forEach(commentRanges, commentRange => { + var comment = text.substring(commentRange.pos, commentRange.end); + var referencedFile = getFileReferenceFromReferencePath(comment); + if (referencedFile) { + referencedFile.position = commentRange.pos; + referencedFile.length = commentRange.end - commentRange.pos; + referencedFiles.push(referencedFile); + } + }); + } - var lineMap = text.lineMap(); - var start = new Date().getTime(); + function processImport(): void { + var scanner = createScanner(getDefaultCompilerOptions().target, /*skipTrivia*/true, text); + + var token = scanner.scan(); // Look for: - // import foo = module("foo") - while (token.kind() !== TypeScript.SyntaxKind.EndOfFileToken) { - if (token.kind() === TypeScript.SyntaxKind.ImportKeyword) { - var importToken = token; - token = scanner.scan(/*allowRegularExpression:*/ false); - - if (TypeScript.SyntaxFacts.isIdentifierNameOrAnyKeyword(token)) { - token = scanner.scan(/*allowRegularExpression:*/ false); - - if (token.kind() === TypeScript.SyntaxKind.EqualsToken) { - token = scanner.scan(/*allowRegularExpression:*/ false); - - if (token.kind() === TypeScript.SyntaxKind.ModuleKeyword || token.kind() === TypeScript.SyntaxKind.RequireKeyword) { - token = scanner.scan(/*allowRegularExpression:*/ false); - - if (token.kind() === TypeScript.SyntaxKind.OpenParenToken) { - token = scanner.scan(/*allowRegularExpression:*/ false); - - lineMap.fillLineAndCharacterFromPosition(TypeScript.start(importToken, text), lineChar); - - if (token.kind() === TypeScript.SyntaxKind.StringLiteral) { - var ref = { - line: lineChar.line, - character: lineChar.character, - position: TypeScript.start(token, text), - length: TypeScript.width(token), - path: TypeScript.stripStartAndEndQuotes(TypeScript.switchToForwardSlashes(token.text())), - isResident: false + // import foo = module("foo"); + while (token !== SyntaxKind.EndOfFileToken) { + if (token === SyntaxKind.ImportKeyword) { + var startPosition = scanner.getTokenPos(); + token = scanner.scan(); + if (token === SyntaxKind.Identifier) { + token = scanner.scan(); + if (token === SyntaxKind.EqualsToken) { + token = scanner.scan(); + if (token === SyntaxKind.RequireKeyword) { + token = scanner.scan(); + if (token === SyntaxKind.OpenParenToken) { + token = scanner.scan(); + if (token === SyntaxKind.StringLiteral) { + var importPath = scanner.getTokenValue(); + var referencedFile = { + // TODO (yuisu) : Move the function to util + path: TypeScript.switchToForwardSlashes(importPath), + position: startPosition, + length: importPath.length }; - importedFiles.push(ref); + importedFiles.push(referencedFile); } } } } } } - - token = scanner.scan(/*allowRegularExpression:*/ false); + token = scanner.scan(); } - - var totalTime = new Date().getTime() - start; - //TypeScript.fileResolutionScanImportsTime += totalTime } - - function processTripleSlashDirectives(fileName: string, text: TypeScript.ISimpleText, firstToken: TypeScript.ISyntaxToken): ITripleSlashDirectiveProperties { - var leadingTrivia = firstToken.leadingTrivia(text); - - var position = 0; - var lineChar = { line: -1, character: -1 }; - var noDefaultLib = false; - var diagnostics: TypeScript.Diagnostic[] = []; - var referencedFiles: TypeScript.IFileReference[] = []; - var lineMap = text.lineMap(); - - for (var i = 0, n = leadingTrivia.count(); i < n; i++) { - var trivia = leadingTrivia.syntaxTriviaAt(i); - - if (trivia.kind() === TypeScript.SyntaxKind.SingleLineCommentTrivia) { - var triviaText = trivia.fullText(); - var referencedCode = getFileReferenceFromReferencePath(fileName, text, position, triviaText, diagnostics); - - if (referencedCode) { - lineMap.fillLineAndCharacterFromPosition(position, lineChar); - referencedCode.position = position; - referencedCode.length = trivia.fullWidth(); - referencedCode.line = lineChar.line; - referencedCode.character = lineChar.character; - - referencedFiles.push(referencedCode); - } - - // is it a lib file? - var isNoDefaultLib = isNoDefaultLibMatch(triviaText); - if (isNoDefaultLib) { - noDefaultLib = isNoDefaultLib[3] === "true"; - } - } - - position += trivia.fullWidth(); - } - - return { noDefaultLib: noDefaultLib, diagnostics: diagnostics, referencedFiles: referencedFiles }; - } - - var text = TypeScript.SimpleText.fromScriptSnapshot(sourceText); - var scanner = TypeScript.Scanner.createScanner(ts.ScriptTarget.ES5, text, reportDiagnostic); - - var firstToken = scanner.scan(/*allowRegularExpression:*/ false); - - // only search out dynamic mods - // if you find a dynamic mod, ignore every other mod inside, until you balance rcurlies - // var position - - var importedFiles: TypeScript.IFileReference[] = []; - if (readImportFiles) { - processImports(text, scanner, firstToken, importedFiles); - } - - var properties = processTripleSlashDirectives(fileName, text, firstToken); - - return { referencedFiles: properties.referencedFiles, importedFiles: importedFiles, isLibFile: properties.noDefaultLib, diagnostics: properties.diagnostics }; + processImport(); + processTripleSlashDirectives(); + return { referencedFiles: referencedFiles, importedFiles: importedFiles, isLibFile: false, diagnostics: [] }; } /// Helpers diff --git a/src/services/shims.ts b/src/services/shims.ts index 4a31dc62331..1f4af295788 100644 --- a/src/services/shims.ts +++ b/src/services/shims.ts @@ -16,7 +16,6 @@ /// /// -/// var debugObjectHost = (this); @@ -847,7 +846,7 @@ module ts { return this.forwardJSONCall( "getPreProcessedFileInfo('" + fileName + "')", () => { - var result = ts.preProcessFile(fileName, sourceText); //TypeScript.preProcessFile(fileName, sourceText); + var result = preProcessFile(fileName, sourceText); //TypeScript.preProcessFile(fileName, sourceText); return result; }); }