| 
									
										
										
										
											2017-07-07 09:47:28 -06:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							|  |  |  |  * Copyright Google Inc. All Rights Reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Use of this source code is governed by an MIT-style license that can be | 
					
						
							|  |  |  |  * found in the LICENSE file at https://angular.io/license
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import {StaticSymbol} from '@angular/compiler'; | 
					
						
							| 
									
										
										
										
											2017-09-13 16:55:42 -07:00
										 |  |  | import {CompilerHost} from '@angular/compiler-cli'; | 
					
						
							| 
									
										
										
										
											2017-07-07 09:47:28 -06:00
										 |  |  | import {EmittingCompilerHost, MockAotCompilerHost, MockCompilerHost, MockData, MockDirectory, MockMetadataBundlerHost, arrayToMockDir, arrayToMockMap, isSource, settings, setup, toMockFileArray} from '@angular/compiler/test/aot/test_util'; | 
					
						
							| 
									
										
										
										
											2017-10-20 09:46:41 -07:00
										 |  |  | import {ReflectorHost} from '@angular/language-service/src/reflector_host'; | 
					
						
							| 
									
										
										
										
											2017-07-07 09:47:28 -06:00
										 |  |  | import * as ts from 'typescript'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import {Symbol, SymbolQuery, SymbolTable} from '../../src/diagnostics/symbols'; | 
					
						
							|  |  |  | import {getSymbolQuery} from '../../src/diagnostics/typescript_symbols'; | 
					
						
							| 
									
										
										
										
											2017-09-13 16:55:42 -07:00
										 |  |  | import {CompilerOptions} from '../../src/transformers/api'; | 
					
						
							| 
									
										
										
										
											2017-07-07 09:47:28 -06:00
										 |  |  | import {Directory} from '../mocks'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import {DiagnosticContext, MockLanguageServiceHost} from './mocks'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function emptyPipes(): SymbolTable { | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     size: 0, | 
					
						
							|  |  |  |     get(key: string) { return undefined; }, | 
					
						
							|  |  |  |     has(key: string) { return false; }, | 
					
						
							|  |  |  |     values(): Symbol[]{return [];} | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | describe('symbol query', () => { | 
					
						
							|  |  |  |   let program: ts.Program; | 
					
						
							|  |  |  |   let checker: ts.TypeChecker; | 
					
						
							|  |  |  |   let sourceFile: ts.SourceFile; | 
					
						
							|  |  |  |   let query: SymbolQuery; | 
					
						
							|  |  |  |   let context: DiagnosticContext; | 
					
						
							|  |  |  |   beforeEach(() => { | 
					
						
							|  |  |  |     const registry = ts.createDocumentRegistry(false, '/src'); | 
					
						
							|  |  |  |     const host = new MockLanguageServiceHost( | 
					
						
							|  |  |  |         ['/quickstart/app/app.component.ts'], QUICKSTART, '/quickstart'); | 
					
						
							|  |  |  |     const service = ts.createLanguageService(host, registry); | 
					
						
							|  |  |  |     program = service.getProgram(); | 
					
						
							|  |  |  |     checker = program.getTypeChecker(); | 
					
						
							| 
									
										
										
										
											2018-02-08 08:59:25 -08:00
										 |  |  |     sourceFile = program.getSourceFile('/quickstart/app/app.component.ts') !; | 
					
						
							| 
									
										
										
										
											2017-09-13 16:55:42 -07:00
										 |  |  |     const options: CompilerOptions = Object.create(host.getCompilationSettings()); | 
					
						
							| 
									
										
										
										
											2017-07-07 09:47:28 -06:00
										 |  |  |     options.genDir = '/dist'; | 
					
						
							|  |  |  |     options.basePath = '/quickstart'; | 
					
						
							| 
									
										
										
										
											2017-10-20 09:46:41 -07:00
										 |  |  |     const symbolResolverHost = new ReflectorHost(() => program, host, options); | 
					
						
							|  |  |  |     context = new DiagnosticContext(service, program, checker, symbolResolverHost); | 
					
						
							| 
									
										
										
										
											2017-07-27 16:13:16 -07:00
										 |  |  |     query = getSymbolQuery(program, checker, sourceFile, emptyPipes); | 
					
						
							| 
									
										
										
										
											2017-07-07 09:47:28 -06:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should be able to get undefined for an unknown symbol', () => { | 
					
						
							|  |  |  |     const unknownType = context.getStaticSymbol('/unkonwn/file.ts', 'UnknownType'); | 
					
						
							|  |  |  |     const symbol = query.getTypeSymbol(unknownType); | 
					
						
							|  |  |  |     expect(symbol).toBeUndefined(); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function appComponentSource(template: string): string { | 
					
						
							|  |  |  |   return `
 | 
					
						
							|  |  |  |     import {Component} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     export interface Person { | 
					
						
							|  |  |  |       name: string; | 
					
						
							|  |  |  |       address: Address; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     export interface Address { | 
					
						
							|  |  |  |       street: string; | 
					
						
							|  |  |  |       city: string; | 
					
						
							|  |  |  |       state: string; | 
					
						
							|  |  |  |       zip: string; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @Component({ | 
					
						
							|  |  |  |       template: '${template}' | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  |     export class AppComponent { | 
					
						
							|  |  |  |       name = 'Angular'; | 
					
						
							|  |  |  |       person: Person; | 
					
						
							|  |  |  |       people: Person[]; | 
					
						
							|  |  |  |       maybePerson?: Person; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       getName(): string { return this.name; } | 
					
						
							|  |  |  |       getPerson(): Person { return this.person; } | 
					
						
							|  |  |  |       getMaybePerson(): Person | undefined { this.maybePerson; } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   `;
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const QUICKSTART: Directory = { | 
					
						
							|  |  |  |   quickstart: { | 
					
						
							|  |  |  |     app: { | 
					
						
							|  |  |  |       'app.component.ts': appComponentSource('<h1>Hello {{name}}</h1>'), | 
					
						
							|  |  |  |       'app.module.ts': `
 | 
					
						
							|  |  |  |         import { NgModule }      from '@angular/core'; | 
					
						
							|  |  |  |         import { toString }      from './utils'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         import { AppComponent }  from './app.component'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         @NgModule({ | 
					
						
							|  |  |  |           declarations: [ AppComponent ], | 
					
						
							|  |  |  |           bootstrap:    [ AppComponent ] | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |         export class AppModule { } | 
					
						
							|  |  |  |       `
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }; |