diff --git a/scripts/processDiagnosticMessages.ts b/scripts/processDiagnosticMessages.ts
index 9cfde5b296..0a81b99361 100644
--- a/scripts/processDiagnosticMessages.ts
+++ b/scripts/processDiagnosticMessages.ts
@@ -55,7 +55,7 @@ function buildInfoFileOutput(messageTable: InputDiagnosticMessageTable, nameMap:
'// \r\n' +
'/// \r\n' +
'/* @internal */\r\n' +
- 'module ts {\r\n' +
+ 'namespace ts {\r\n' +
' export var Diagnostics = {\r\n';
var names = Utilities.getObjectKeys(messageTable);
for (var i = 0; i < names.length; i++) {
diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts
index d411b840dc..e3cd0da60d 100644
--- a/src/compiler/binder.ts
+++ b/src/compiler/binder.ts
@@ -1,7 +1,7 @@
///
/* @internal */
-module ts {
+namespace ts {
export let bindTime = 0;
export const enum ModuleInstanceState {
@@ -90,10 +90,12 @@ module ts {
let lastContainer: Node;
let symbolCount = 0;
let Symbol = objectAllocator.getSymbolConstructor();
+ let classifiableNames: Map = {};
if (!file.locals) {
bind(file);
file.symbolCount = symbolCount;
+ file.classifiableNames = classifiableNames;
}
return;
@@ -194,6 +196,11 @@ module ts {
symbol = hasProperty(symbolTable, name)
? symbolTable[name]
: (symbolTable[name] = createSymbol(SymbolFlags.None, name));
+
+ if (name && (includes & SymbolFlags.Classifiable)) {
+ classifiableNames[name] = name;
+ }
+
if (symbol.flags & excludes) {
if (node.name) {
node.name.parent = node;
diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts
index a169ee4627..244712da63 100644
--- a/src/compiler/checker.ts
+++ b/src/compiler/checker.ts
@@ -1,7 +1,7 @@
///
/* @internal */
-module ts {
+namespace ts {
let nextSymbolId = 1;
let nextNodeId = 1;
let nextMergeId = 1;
diff --git a/src/compiler/commandLineParser.ts b/src/compiler/commandLineParser.ts
index a3065bd7a4..07bccf4a5e 100644
--- a/src/compiler/commandLineParser.ts
+++ b/src/compiler/commandLineParser.ts
@@ -3,7 +3,7 @@
///
///
-module ts {
+namespace ts {
/* @internal */
export var optionDeclarations: CommandLineOption[] = [
{
diff --git a/src/compiler/core.ts b/src/compiler/core.ts
index dde1e3d6b5..0c0414f3b1 100644
--- a/src/compiler/core.ts
+++ b/src/compiler/core.ts
@@ -1,7 +1,7 @@
///
/* @internal */
-module ts {
+namespace ts {
// Ternary values are defined such that
// x & y is False if either x or y is False.
// x & y is Maybe if either x or y is Maybe, but neither x or y is False.
diff --git a/src/compiler/declarationEmitter.ts b/src/compiler/declarationEmitter.ts
index 5c705f1819..a2edc632de 100644
--- a/src/compiler/declarationEmitter.ts
+++ b/src/compiler/declarationEmitter.ts
@@ -1,7 +1,7 @@
///
/* @internal */
-module ts {
+namespace ts {
interface ModuleElementDeclarationEmitInfo {
node: Node;
outputPos: number;
diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts
index 9f6190ead1..43330935f4 100644
--- a/src/compiler/diagnosticInformationMap.generated.ts
+++ b/src/compiler/diagnosticInformationMap.generated.ts
@@ -1,7 +1,7 @@
//
///
/* @internal */
-module ts {
+namespace ts {
export var Diagnostics = {
Unterminated_string_literal: { code: 1002, category: DiagnosticCategory.Error, key: "Unterminated string literal." },
Identifier_expected: { code: 1003, category: DiagnosticCategory.Error, key: "Identifier expected." },
diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts
index df40d10ddf..8081668f98 100644
--- a/src/compiler/emitter.ts
+++ b/src/compiler/emitter.ts
@@ -2,7 +2,7 @@
///
/* @internal */
-module ts {
+namespace ts {
export function isExternalModuleOrDeclarationFile(sourceFile: SourceFile) {
return isExternalModule(sourceFile) || isDeclarationFile(sourceFile);
}
diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts
index 627893d59e..f964febaf5 100644
--- a/src/compiler/parser.ts
+++ b/src/compiler/parser.ts
@@ -1,7 +1,7 @@
///
///
-module ts {
+namespace ts {
let nodeConstructors = new Array Node>(SyntaxKind.Count);
/* @internal */ export let parseTime = 0;
diff --git a/src/compiler/program.ts b/src/compiler/program.ts
index c09b70a0c6..3478347022 100644
--- a/src/compiler/program.ts
+++ b/src/compiler/program.ts
@@ -1,7 +1,7 @@
///
///
-module ts {
+namespace ts {
/* @internal */ export let programTime = 0;
/* @internal */ export let emitTime = 0;
/* @internal */ export let ioReadTime = 0;
@@ -148,6 +148,7 @@ module ts {
let commonSourceDirectory: string;
let diagnosticsProducingTypeChecker: TypeChecker;
let noDiagnosticsTypeChecker: TypeChecker;
+ let classifiableNames: Map;
let start = new Date().getTime();
@@ -172,6 +173,7 @@ module ts {
getDeclarationDiagnostics,
getCompilerOptionsDiagnostics,
getTypeChecker,
+ getClassifiableNames,
getDiagnosticsProducingTypeChecker,
getCommonSourceDirectory: () => commonSourceDirectory,
emit,
@@ -183,6 +185,20 @@ module ts {
};
return program;
+ function getClassifiableNames() {
+ if (!classifiableNames) {
+ // Initialize a checker so that all our files are bound.
+ getTypeChecker();
+ classifiableNames = {};
+
+ for (let sourceFile of files) {
+ copyMap(sourceFile.classifiableNames, classifiableNames);
+ }
+ }
+
+ return classifiableNames;
+ }
+
function getEmitHost(writeFileCallback?: WriteFileCallback): EmitHost {
return {
getCanonicalFileName: fileName => host.getCanonicalFileName(fileName),
@@ -335,14 +351,17 @@ module ts {
}
}
else {
- if (options.allowNonTsExtensions && !findSourceFile(fileName, isDefaultLib, refFile, refPos, refEnd)) {
- diagnostic = Diagnostics.File_0_not_found;
- diagnosticArgument = [fileName];
- }
- else if (!forEach(supportedExtensions, extension => findSourceFile(fileName + extension, isDefaultLib, refFile, refPos, refEnd))) {
- diagnostic = Diagnostics.File_0_not_found;
- fileName += ".ts";
- diagnosticArgument = [fileName];
+ var nonTsFile: SourceFile = options.allowNonTsExtensions && findSourceFile(fileName, isDefaultLib, refFile, refPos, refEnd);
+ if (!nonTsFile) {
+ if (options.allowNonTsExtensions) {
+ diagnostic = Diagnostics.File_0_not_found;
+ diagnosticArgument = [fileName];
+ }
+ else if (!forEach(supportedExtensions, extension => findSourceFile(fileName + extension, isDefaultLib, refFile, refPos, refEnd))) {
+ diagnostic = Diagnostics.File_0_not_found;
+ fileName += ".ts";
+ diagnosticArgument = [fileName];
+ }
}
}
diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts
index d7e65dff81..fd8883045f 100644
--- a/src/compiler/scanner.ts
+++ b/src/compiler/scanner.ts
@@ -1,7 +1,7 @@
///
///
-module ts {
+namespace ts {
export interface ErrorCallback {
(message: DiagnosticMessage, length: number): void;
}
diff --git a/src/compiler/sys.ts b/src/compiler/sys.ts
index 75e8af357b..a47d6959ba 100644
--- a/src/compiler/sys.ts
+++ b/src/compiler/sys.ts
@@ -1,6 +1,6 @@
///
-module ts {
+namespace ts {
export interface System {
args: string[];
newLine: string;
diff --git a/src/compiler/tsc.ts b/src/compiler/tsc.ts
index 15cc665e35..2903c3a31f 100644
--- a/src/compiler/tsc.ts
+++ b/src/compiler/tsc.ts
@@ -1,7 +1,7 @@
///
///
-module ts {
+namespace ts {
export interface SourceFile {
fileWatcher: FileWatcher;
}
diff --git a/src/compiler/types.ts b/src/compiler/types.ts
index 70962ea13c..8be7c1792a 100644
--- a/src/compiler/types.ts
+++ b/src/compiler/types.ts
@@ -1,4 +1,4 @@
-module ts {
+namespace ts {
export interface Map {
[index: string]: T;
}
@@ -1172,6 +1172,8 @@ module ts {
// Stores a line map for the file.
// This field should never be used directly to obtain line map, use getLineMap function instead.
/* @internal */ lineMap: number[];
+
+ /* @internal */ classifiableNames?: Map;
}
export interface ScriptReferenceHost {
@@ -1223,6 +1225,8 @@ module ts {
// language service).
/* @internal */ getDiagnosticsProducingTypeChecker(): TypeChecker;
+ /* @internal */ getClassifiableNames(): Map;
+
/* @internal */ getNodeCount(): number;
/* @internal */ getIdentifierCount(): number;
/* @internal */ getSymbolCount(): number;
@@ -1519,6 +1523,11 @@ module ts {
PropertyOrAccessor = Property | Accessor,
Export = ExportNamespace | ExportType | ExportValue,
+
+ /* @internal */
+ // The set of things we consider semantically classifiable. Used to speed up the LS during
+ // classification.
+ Classifiable = Class | Enum | TypeAlias | Interface | TypeParameter | Module,
}
export interface Symbol {
diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts
index 6c0943f22f..1aad9d5b06 100644
--- a/src/compiler/utilities.ts
+++ b/src/compiler/utilities.ts
@@ -1,7 +1,7 @@
///
/* @internal */
-module ts {
+namespace ts {
export interface ReferencePathMatchResult {
fileReference?: FileReference
diagnosticMessage?: DiagnosticMessage
@@ -2002,7 +2002,7 @@ module ts {
}
}
-module ts {
+namespace ts {
export function getDefaultLibFileName(options: CompilerOptions): string {
return options.target === ScriptTarget.ES6 ? "lib.es6.d.ts" : "lib.d.ts";
}
diff --git a/src/server/client.ts b/src/server/client.ts
index f1c5e424d4..3546f8339e 100644
--- a/src/server/client.ts
+++ b/src/server/client.ts
@@ -1,6 +1,6 @@
///
-module ts.server {
+namespace ts.server {
export interface SessionClientHost extends LanguageServiceHost {
writeMessage(message: string): void;
diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts
index bc9e685825..9e235e2cc7 100644
--- a/src/server/editorServices.ts
+++ b/src/server/editorServices.ts
@@ -4,7 +4,7 @@
///
///
-module ts.server {
+namespace ts.server {
export interface Logger {
close(): void;
isVerbose(): boolean;
diff --git a/src/server/protocol.d.ts b/src/server/protocol.d.ts
index ef9ad7984f..336bc11c9f 100644
--- a/src/server/protocol.d.ts
+++ b/src/server/protocol.d.ts
@@ -1,7 +1,7 @@
/**
* Declaration module describing the TypeScript Server protocol
*/
-declare module ts.server.protocol {
+declare namespace ts.server.protocol {
/**
* A TypeScript Server message
*/
diff --git a/src/server/server.ts b/src/server/server.ts
index 828deca2b2..b4b35edd3f 100644
--- a/src/server/server.ts
+++ b/src/server/server.ts
@@ -1,7 +1,7 @@
///
///
-module ts.server {
+namespace ts.server {
var nodeproto: typeof NodeJS._debugger = require('_debugger');
var readline: NodeJS.ReadLine = require('readline');
var path: NodeJS.Path = require('path');
diff --git a/src/server/session.ts b/src/server/session.ts
index a4cb3e59b4..f9cfb4f9f7 100644
--- a/src/server/session.ts
+++ b/src/server/session.ts
@@ -4,7 +4,7 @@
///
///
-module ts.server {
+namespace ts.server {
var spaceCache:string[] = [];
interface StackTraceError extends Error {
diff --git a/src/services/breakpoints.ts b/src/services/breakpoints.ts
index 41079c0820..4d3d7d331a 100644
--- a/src/services/breakpoints.ts
+++ b/src/services/breakpoints.ts
@@ -4,7 +4,7 @@
///
/* @internal */
-module ts.BreakpointResolver {
+namespace ts.BreakpointResolver {
/**
* Get the breakpoint span in given sourceFile
*/
diff --git a/src/services/formatting/formatting.ts b/src/services/formatting/formatting.ts
index ef25d23a5c..011f7d7fa5 100644
--- a/src/services/formatting/formatting.ts
+++ b/src/services/formatting/formatting.ts
@@ -4,7 +4,7 @@
///
/* @internal */
-module ts.formatting {
+namespace ts.formatting {
export interface TextRangeWithKind extends TextRange {
kind: SyntaxKind;
diff --git a/src/services/formatting/formattingContext.ts b/src/services/formatting/formattingContext.ts
index 84c09b86bb..c9b9952a49 100644
--- a/src/services/formatting/formattingContext.ts
+++ b/src/services/formatting/formattingContext.ts
@@ -1,7 +1,7 @@
///
/* @internal */
-module ts.formatting {
+namespace ts.formatting {
export class FormattingContext {
public currentTokenSpan: TextRangeWithKind;
public nextTokenSpan: TextRangeWithKind;
diff --git a/src/services/formatting/formattingRequestKind.ts b/src/services/formatting/formattingRequestKind.ts
index 4bdc83ffd4..d0397e4a8d 100644
--- a/src/services/formatting/formattingRequestKind.ts
+++ b/src/services/formatting/formattingRequestKind.ts
@@ -1,7 +1,7 @@
///
/* @internal */
-module ts.formatting {
+namespace ts.formatting {
export const enum FormattingRequestKind {
FormatDocument,
FormatSelection,
diff --git a/src/services/formatting/formattingScanner.ts b/src/services/formatting/formattingScanner.ts
index e09b5dfba9..7e77878051 100644
--- a/src/services/formatting/formattingScanner.ts
+++ b/src/services/formatting/formattingScanner.ts
@@ -2,7 +2,7 @@
///
/* @internal */
-module ts.formatting {
+namespace ts.formatting {
let scanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ false);
export interface FormattingScanner {
@@ -224,7 +224,7 @@ module ts.formatting {
}
function isOnToken(): boolean {
- let current = (lastTokenInfo && lastTokenInfo.token.kind) || scanner.getToken();
+ let current = (lastTokenInfo && lastTokenInfo.token.kind) || scanner.getToken();
let startPos = (lastTokenInfo && lastTokenInfo.token.pos) || scanner.getStartPos();
return startPos < endPos && current !== SyntaxKind.EndOfFileToken && !isTrivia(current);
}
diff --git a/src/services/formatting/rule.ts b/src/services/formatting/rule.ts
index f1bb39e69c..543295f364 100644
--- a/src/services/formatting/rule.ts
+++ b/src/services/formatting/rule.ts
@@ -1,7 +1,7 @@
///
/* @internal */
-module ts.formatting {
+namespace ts.formatting {
export class Rule {
constructor(
public Descriptor: RuleDescriptor,
diff --git a/src/services/formatting/ruleAction.ts b/src/services/formatting/ruleAction.ts
index e5734b1a03..13e9043e1c 100644
--- a/src/services/formatting/ruleAction.ts
+++ b/src/services/formatting/ruleAction.ts
@@ -1,7 +1,7 @@
///
/* @internal */
-module ts.formatting {
+namespace ts.formatting {
export const enum RuleAction {
Ignore = 0x00000001,
Space = 0x00000002,
diff --git a/src/services/formatting/ruleDescriptor.ts b/src/services/formatting/ruleDescriptor.ts
index f3492715f3..96506adc3d 100644
--- a/src/services/formatting/ruleDescriptor.ts
+++ b/src/services/formatting/ruleDescriptor.ts
@@ -1,7 +1,7 @@
///
/* @internal */
-module ts.formatting {
+namespace ts.formatting {
export class RuleDescriptor {
constructor(public LeftTokenRange: Shared.TokenRange, public RightTokenRange: Shared.TokenRange) {
}
diff --git a/src/services/formatting/ruleFlag.ts b/src/services/formatting/ruleFlag.ts
index 4e6e002c18..7619f232ad 100644
--- a/src/services/formatting/ruleFlag.ts
+++ b/src/services/formatting/ruleFlag.ts
@@ -2,7 +2,7 @@
/* @internal */
-module ts.formatting {
+namespace ts.formatting {
export const enum RuleFlags {
None,
CanDeleteNewLines
diff --git a/src/services/formatting/ruleOperation.ts b/src/services/formatting/ruleOperation.ts
index 1cca437e49..e897513bd2 100644
--- a/src/services/formatting/ruleOperation.ts
+++ b/src/services/formatting/ruleOperation.ts
@@ -1,7 +1,7 @@
///
/* @internal */
-module ts.formatting {
+namespace ts.formatting {
export class RuleOperation {
public Context: RuleOperationContext;
public Action: RuleAction;
diff --git a/src/services/formatting/ruleOperationContext.ts b/src/services/formatting/ruleOperationContext.ts
index 69ed3453a7..515250d726 100644
--- a/src/services/formatting/ruleOperationContext.ts
+++ b/src/services/formatting/ruleOperationContext.ts
@@ -1,7 +1,7 @@
///
/* @internal */
-module ts.formatting {
+namespace ts.formatting {
export class RuleOperationContext {
private customContextChecks: { (context: FormattingContext): boolean; }[];
diff --git a/src/services/formatting/rules.ts b/src/services/formatting/rules.ts
index 9cf6d8ff4b..c10e3ee69e 100644
--- a/src/services/formatting/rules.ts
+++ b/src/services/formatting/rules.ts
@@ -1,7 +1,7 @@
///
/* @internal */
-module ts.formatting {
+namespace ts.formatting {
export class Rules {
public getRuleName(rule: Rule) {
let o: ts.Map = this;
@@ -193,7 +193,7 @@ module ts.formatting {
// Insert space after function keyword for anonymous functions
public SpaceAfterAnonymousFunctionKeyword: Rule;
public NoSpaceAfterAnonymousFunctionKeyword: Rule;
-
+
// Insert space after @ in decorator
public SpaceBeforeAt: Rule;
public NoSpaceAfterAt: Rule;
@@ -470,8 +470,9 @@ module ts.formatting {
switch (context.contextNode.kind) {
case SyntaxKind.BinaryExpression:
case SyntaxKind.ConditionalExpression:
+ case SyntaxKind.TypePredicate:
return true;
-
+
// equals in binding elements: function foo([[x, y] = [1, 2]])
case SyntaxKind.BindingElement:
// equals in type X = ...
diff --git a/src/services/formatting/rulesMap.ts b/src/services/formatting/rulesMap.ts
index 5aae6f40fc..4f231bd842 100644
--- a/src/services/formatting/rulesMap.ts
+++ b/src/services/formatting/rulesMap.ts
@@ -1,7 +1,7 @@
///
/* @internal */
-module ts.formatting {
+namespace ts.formatting {
export class RulesMap {
public map: RulesBucket[];
public mapRowLength: number;
diff --git a/src/services/formatting/rulesProvider.ts b/src/services/formatting/rulesProvider.ts
index 0867bcf31c..bd8f4fc3a5 100644
--- a/src/services/formatting/rulesProvider.ts
+++ b/src/services/formatting/rulesProvider.ts
@@ -1,7 +1,7 @@
///
/* @internal */
-module ts.formatting {
+namespace ts.formatting {
export class RulesProvider {
private globalRules: Rules;
private options: ts.FormatCodeOptions;
diff --git a/src/services/formatting/smartIndenter.ts b/src/services/formatting/smartIndenter.ts
index 9cd28a40a5..a82e57f050 100644
--- a/src/services/formatting/smartIndenter.ts
+++ b/src/services/formatting/smartIndenter.ts
@@ -1,7 +1,7 @@
///
/* @internal */
-module ts.formatting {
+namespace ts.formatting {
export module SmartIndenter {
const enum Value {
diff --git a/src/services/formatting/tokenRange.ts b/src/services/formatting/tokenRange.ts
index 712d6f3792..27a43280f2 100644
--- a/src/services/formatting/tokenRange.ts
+++ b/src/services/formatting/tokenRange.ts
@@ -1,7 +1,7 @@
///
/* @internal */
-module ts.formatting {
+namespace ts.formatting {
export module Shared {
export interface ITokenAccess {
GetTokens(): SyntaxKind[];
@@ -112,7 +112,7 @@ module ts.formatting {
static AnyIncludingMultilineComments = TokenRange.FromTokens(TokenRange.Any.GetTokens().concat([SyntaxKind.MultiLineCommentTrivia]));
static Keywords = TokenRange.FromRange(SyntaxKind.FirstKeyword, SyntaxKind.LastKeyword);
static BinaryOperators = TokenRange.FromRange(SyntaxKind.FirstBinaryOperator, SyntaxKind.LastBinaryOperator);
- static BinaryKeywordOperators = TokenRange.FromTokens([SyntaxKind.InKeyword, SyntaxKind.InstanceOfKeyword, SyntaxKind.OfKeyword]);
+ static BinaryKeywordOperators = TokenRange.FromTokens([SyntaxKind.InKeyword, SyntaxKind.InstanceOfKeyword, SyntaxKind.OfKeyword, SyntaxKind.IsKeyword]);
static UnaryPrefixOperators = TokenRange.FromTokens([SyntaxKind.PlusPlusToken, SyntaxKind.MinusMinusToken, SyntaxKind.TildeToken, SyntaxKind.ExclamationToken]);
static UnaryPrefixExpressions = TokenRange.FromTokens([SyntaxKind.NumericLiteral, SyntaxKind.Identifier, SyntaxKind.OpenParenToken, SyntaxKind.OpenBracketToken, SyntaxKind.OpenBraceToken, SyntaxKind.ThisKeyword, SyntaxKind.NewKeyword]);
static UnaryPreincrementExpressions = TokenRange.FromTokens([SyntaxKind.Identifier, SyntaxKind.OpenParenToken, SyntaxKind.ThisKeyword, SyntaxKind.NewKeyword]);
diff --git a/src/services/navigateTo.ts b/src/services/navigateTo.ts
index aec3bdf765..a4cc7ec2ad 100644
--- a/src/services/navigateTo.ts
+++ b/src/services/navigateTo.ts
@@ -1,5 +1,5 @@
/* @internal */
-module ts.NavigateTo {
+namespace ts.NavigateTo {
type RawNavigateToItem = { name: string; fileName: string; matchKind: PatternMatchKind; isCaseSensitive: boolean; declaration: Declaration };
export function getNavigateToItems(program: Program, cancellationToken: CancellationTokenObject, searchValue: string, maxResultCount: number): NavigateToItem[] {
diff --git a/src/services/navigationBar.ts b/src/services/navigationBar.ts
index 8acdbac20c..ead9bc519c 100644
--- a/src/services/navigationBar.ts
+++ b/src/services/navigationBar.ts
@@ -1,7 +1,7 @@
///
/* @internal */
-module ts.NavigationBar {
+namespace ts.NavigationBar {
export function getNavigationBarItems(sourceFile: SourceFile): ts.NavigationBarItem[] {
// If the source file has any child items, then it included in the tree
// and takes lexical ownership of all other top-level items.
diff --git a/src/services/outliningElementsCollector.ts b/src/services/outliningElementsCollector.ts
index d413f61120..08b089cd75 100644
--- a/src/services/outliningElementsCollector.ts
+++ b/src/services/outliningElementsCollector.ts
@@ -1,5 +1,5 @@
/* @internal */
-module ts {
+namespace ts {
export module OutliningElementsCollector {
export function collectElements(sourceFile: SourceFile): OutliningSpan[] {
let elements: OutliningSpan[] = [];
diff --git a/src/services/patternMatcher.ts b/src/services/patternMatcher.ts
index 88cd9fdbb0..d56c7fac97 100644
--- a/src/services/patternMatcher.ts
+++ b/src/services/patternMatcher.ts
@@ -1,5 +1,5 @@
/* @internal */
-module ts {
+namespace ts {
// Note(cyrusn): this enum is ordered from strongest match type to weakest match type.
export enum PatternMatchKind {
exact,
diff --git a/src/services/services.ts b/src/services/services.ts
index 5e8392fa9d..3939e62cfd 100644
--- a/src/services/services.ts
+++ b/src/services/services.ts
@@ -10,7 +10,7 @@
///
///
-module ts {
+namespace ts {
/** The version of the language service API */
export let servicesVersion = "0.4"
@@ -5992,6 +5992,7 @@ module ts {
let typeChecker = program.getTypeChecker();
let result: number[] = [];
+ let classifiableNames = program.getClassifiableNames();
processNode(sourceFile);
return { spans: result, endOfLineState: EndOfLineState.None };
@@ -6004,6 +6005,9 @@ module ts {
function classifySymbol(symbol: Symbol, meaningAtPosition: SemanticMeaning): ClassificationType {
let flags = symbol.getFlags();
+ if ((flags & SymbolFlags.Classifiable) === SymbolFlags.None) {
+ return;
+ }
if (flags & SymbolFlags.Class) {
return ClassificationType.className;
@@ -6048,11 +6052,18 @@ module ts {
// Only walk into nodes that intersect the requested span.
if (node && textSpanIntersectsWith(span, node.getFullStart(), node.getFullWidth())) {
if (node.kind === SyntaxKind.Identifier && !nodeIsMissing(node)) {
- let symbol = typeChecker.getSymbolAtLocation(node);
- if (symbol) {
- let type = classifySymbol(symbol, getMeaningFromLocation(node));
- if (type) {
- pushClassification(node.getStart(), node.getWidth(), type);
+ let identifier = node;
+
+ // Only bother calling into the typechecker if this is an identifier that
+ // could possibly resolve to a type name. This makes classification run
+ // in a third of the time it would normally take.
+ if (classifiableNames[identifier.text]) {
+ let symbol = typeChecker.getSymbolAtLocation(node);
+ if (symbol) {
+ let type = classifySymbol(symbol, getMeaningFromLocation(node));
+ if (type) {
+ pushClassification(node.getStart(), node.getWidth(), type);
+ }
}
}
}
diff --git a/src/services/shims.ts b/src/services/shims.ts
index 004393fb3b..c158b041e9 100644
--- a/src/services/shims.ts
+++ b/src/services/shims.ts
@@ -19,7 +19,7 @@
var debugObjectHost = (this);
/* @internal */
-module ts {
+namespace ts {
export interface ScriptSnapshotShim {
/** Gets a portion of the script snapshot specified by [start, end). */
getText(start: number, end: number): string;
diff --git a/src/services/signatureHelp.ts b/src/services/signatureHelp.ts
index 77aba4c85c..fce4e2c302 100644
--- a/src/services/signatureHelp.ts
+++ b/src/services/signatureHelp.ts
@@ -1,6 +1,6 @@
///
/* @internal */
-module ts.SignatureHelp {
+namespace ts.SignatureHelp {
// A partially written generic type expression is not guaranteed to have the correct syntax tree. the expression could be parsed as less than/greater than expression or a comma expression
// or some other combination depending on what the user has typed so far. For the purposes of signature help we need to consider any location after "<" as a possible generic type reference.
diff --git a/src/services/utilities.ts b/src/services/utilities.ts
index da0a0aa96c..73b88a3df2 100644
--- a/src/services/utilities.ts
+++ b/src/services/utilities.ts
@@ -1,6 +1,6 @@
// These utilities are common to multiple language service features.
/* @internal */
-module ts {
+namespace ts {
export interface ListItemInfo {
listItemIndex: number;
list: Node;
@@ -502,7 +502,7 @@ module ts {
// Display-part writer helpers
/* @internal */
-module ts {
+namespace ts {
export function isFirstDeclarationOfSymbolParameter(symbol: Symbol) {
return symbol.declarations && symbol.declarations.length > 0 && symbol.declarations[0].kind === SyntaxKind.Parameter;
}
diff --git a/tests/cases/fourslash/functionTypePredicateFormatting.ts b/tests/cases/fourslash/functionTypePredicateFormatting.ts
new file mode 100644
index 0000000000..4195e261da
--- /dev/null
+++ b/tests/cases/fourslash/functionTypePredicateFormatting.ts
@@ -0,0 +1,7 @@
+///
+
+//// /**/function bar(a: A): a is B {}
+
+goTo.marker();
+format.document();
+verify.currentLineContentIs("function bar(a: A): a is B { }");
\ No newline at end of file
diff --git a/tests/cases/unittests/transpile.ts b/tests/cases/unittests/transpile.ts
index 7aa9106880..47f8bd04cb 100644
--- a/tests/cases/unittests/transpile.ts
+++ b/tests/cases/unittests/transpile.ts
@@ -3,9 +3,9 @@
module ts {
describe("Transpile", () => {
- function runTest(input: string, compilerOptions: ts.CompilerOptions = {}, moduleName?: string, expectedOutput?: string, expectedDiagnosticCodes: number[] = []): void {
+ function runTest(input: string, compilerOptions: ts.CompilerOptions = {}, fileName?: string, moduleName?: string, expectedOutput?: string, expectedDiagnosticCodes: number[] = []): void {
let diagnostics: Diagnostic[] = [];
- let result = transpile(input, compilerOptions, "file.ts", diagnostics, moduleName);
+ let result = transpile(input, compilerOptions, fileName || "file.ts", diagnostics, moduleName);
for (let i = 0; i < expectedDiagnosticCodes.length; i++) {
assert.equal(expectedDiagnosticCodes[i], diagnostics[i] && diagnostics[i].code, `Could not find expeced diagnostic.`);
@@ -19,41 +19,41 @@ module ts {
it("Generates correct compilerOptions diagnostics", () => {
// Expecting 5047: "Option 'isolatedModules' can only be used when either option'--module' is provided or option 'target' is 'ES6' or higher."
- runTest(`var x = 0;`, {}, /*moduleName*/undefined, /*expectedOutput*/ undefined, /*expectedDiagnosticCodes*/ [5047]);
+ runTest(`var x = 0;`, {}, /*fileName*/ undefined, /*moduleName*/undefined, /*expectedOutput*/ undefined, /*expectedDiagnosticCodes*/ [5047]);
});
it("Generates no diagnostics with valid inputs", () => {
// No errors
- runTest(`var x = 0;`, { module: ModuleKind.CommonJS }, /*moduleName*/undefined, /*expectedOutput*/ undefined, /*expectedDiagnosticCodes*/ []);
+ runTest(`var x = 0;`, { module: ModuleKind.CommonJS }, /*fileName*/ undefined, /*moduleName*/undefined, /*expectedOutput*/ undefined, /*expectedDiagnosticCodes*/ []);
});
it("Generates no diagnostics for missing file references", () => {
runTest(`///
var x = 0;`,
- { module: ModuleKind.CommonJS }, /*moduleName*/undefined, /*expectedOutput*/ undefined, /*expectedDiagnosticCodes*/ []);
+ { module: ModuleKind.CommonJS }, /*fileName*/ undefined, /*moduleName*/undefined, /*expectedOutput*/ undefined, /*expectedDiagnosticCodes*/ []);
});
it("Generates no diagnostics for missing module imports", () => {
runTest(`import {a} from "module2";`,
- { module: ModuleKind.CommonJS }, /*moduleName*/undefined, /*expectedOutput*/ undefined, /*expectedDiagnosticCodes*/ []);
+ { module: ModuleKind.CommonJS }, /*fileName*/ undefined,/*moduleName*/undefined, /*expectedOutput*/ undefined, /*expectedDiagnosticCodes*/ []);
});
it("Generates expected syntactic diagnostics", () => {
runTest(`a b`,
- { module: ModuleKind.CommonJS }, /*moduleName*/undefined, /*expectedOutput*/ undefined, /*expectedDiagnosticCodes*/ [1005]); /// 1005: ';' Expected
+ { module: ModuleKind.CommonJS }, /*fileName*/ undefined, /*moduleName*/undefined, /*expectedOutput*/ undefined, /*expectedDiagnosticCodes*/ [1005]); /// 1005: ';' Expected
});
it("Does not generate semantic diagnostics", () => {
runTest(`var x: string = 0;`,
- { module: ModuleKind.CommonJS }, /*moduleName*/undefined, /*expectedOutput*/ undefined, /*expectedDiagnosticCodes*/ []);
+ { module: ModuleKind.CommonJS }, /*fileName*/ undefined, /*moduleName*/undefined, /*expectedOutput*/ undefined, /*expectedDiagnosticCodes*/ []);
});
it("Generates module output", () => {
- runTest(`var x = 0;`, { module: ModuleKind.AMD }, /*moduleName*/undefined, `define(["require", "exports"], function (require, exports) {\r\n var x = 0;\r\n});\r\n`);
+ runTest(`var x = 0;`, { module: ModuleKind.AMD }, /*fileName*/ undefined, /*moduleName*/undefined, `define(["require", "exports"], function (require, exports) {\r\n var x = 0;\r\n});\r\n`);
});
it("Uses correct newLine character", () => {
- runTest(`var x = 0;`, { module: ModuleKind.CommonJS, newLine: NewLineKind.LineFeed }, /*moduleName*/undefined, `var x = 0;\n`, /*expectedDiagnosticCodes*/ []);
+ runTest(`var x = 0;`, { module: ModuleKind.CommonJS, newLine: NewLineKind.LineFeed }, /*fileName*/ undefined, /*moduleName*/undefined, `var x = 0;\n`, /*expectedDiagnosticCodes*/ []);
});
it("Sets module name", () => {
@@ -66,7 +66,11 @@ var x = 0;`,
` }\n` +
` }\n` +
`});\n`;
- runTest("var x = 1;", { module: ModuleKind.System, newLine: NewLineKind.LineFeed }, "NamedModule", output)
+ runTest("var x = 1;", { module: ModuleKind.System, newLine: NewLineKind.LineFeed }, /*fileName*/ undefined, "NamedModule", output)
});
+ it("No extra errors for file without extension", () => {
+ runTest(`var x = 0;`, { module: ModuleKind.CommonJS }, "file", /*moduleName*/undefined, /*expectedOutput*/ undefined, /*expectedDiagnosticCodes*/[]);
+ });
+
});
}