//// [parserRealSource6.ts] // Copyright (c) Microsoft. All rights reserved. Licensed under the Apache License, Version 2.0. // See LICENSE.txt in the project root for complete license information. /// module TypeScript { export class TypeCollectionContext { public script: Script = null; constructor (public scopeChain: ScopeChain, public checker: TypeChecker) { } } export class MemberScopeContext { public type: Type = null; public ast: AST = null; public scope: SymbolScope; public options = new AstWalkOptions(); constructor (public flow: TypeFlow, public pos: number, public matchFlag: ASTFlags) { } } export class EnclosingScopeContext { public scopeGetter: () => SymbolScope = null; public objectLiteralScopeGetter: () => SymbolScope = null; public scopeStartAST: AST = null; public skipNextFuncDeclForClass = false; public deepestModuleDecl: ModuleDeclaration = null; public enclosingClassDecl: TypeDeclaration = null; public enclosingObjectLit: UnaryExpression = null; public publicsOnly = true; public useFullAst = false; private scriptFragment: Script; constructor (public logger: ILogger, public script: Script, public text: ISourceText, public pos: number, public isMemberCompletion: boolean) { } public getScope(): SymbolScope { return this.scopeGetter(); } public getObjectLiteralScope(): SymbolScope { return this.objectLiteralScopeGetter(); } public getScopeAST() { return this.scopeStartAST; } public getScopePosition() { return this.scopeStartAST.minChar; } public getScriptFragmentStartAST(): AST { return this.scopeStartAST; } public getScriptFragmentPosition(): number { return this.getScriptFragmentStartAST().minChar; } public getScriptFragment(): Script { if (this.scriptFragment == null) { var ast = this.getScriptFragmentStartAST(); var minChar = ast.minChar; var limChar = (this.isMemberCompletion ? this.pos : this.pos + 1); this.scriptFragment = TypeScript.quickParse(this.logger, ast, this.text, minChar, limChar, null/*errorCapture*/).Script; } return this.scriptFragment; } } export function preFindMemberScope(ast: AST, parent: AST, walker: IAstWalker) { var memScope: MemberScopeContext = walker.state; if (hasFlag(ast.flags, memScope.matchFlag) && ((memScope.pos < 0) || (memScope.pos == ast.limChar))) { memScope.ast = ast; if ((ast.type == null) && (memScope.pos >= 0)) { memScope.flow.inScopeTypeCheck(ast, memScope.scope); } memScope.type = ast.type; memScope.options.stopWalk(); } return ast; } export function pushTypeCollectionScope(container: Symbol, valueMembers: ScopedMembers, ambientValueMembers: ScopedMembers, enclosedTypes: ScopedMembers, ambientEnclosedTypes: ScopedMembers, context: TypeCollectionContext, thisType: Type, classType: Type, moduleDecl: ModuleDeclaration) { var builder = new SymbolScopeBuilder(valueMembers, ambientValueMembers, enclosedTypes, ambientEnclosedTypes, null, container); var chain: ScopeChain = new ScopeChain(container, context.scopeChain, builder); chain.thisType = thisType; chain.classType = classType; chain.moduleDecl = moduleDecl; context.scopeChain = chain; } export function popTypeCollectionScope(context: TypeCollectionContext) { context.scopeChain = context.scopeChain.previous; } export function preFindEnclosingScope(ast: AST, parent: AST, walker: IAstWalker) { var context: EnclosingScopeContext = walker.state; var minChar = ast.minChar; var limChar = ast.limChar; // Account for the fact completion list may be called at the end of a file which // is has not been fully re-parsed yet. if (ast.nodeType == NodeType.Script && context.pos > limChar) limChar = context.pos; if ((minChar <= context.pos) && (limChar >= context.pos)) { switch (ast.nodeType) { case NodeType.Script: var script =