From 9fb08e237732ba36a1199606ad816b44ae86a6ab Mon Sep 17 00:00:00 2001 From: Chuck Jazdzewski Date: Wed, 21 Mar 2018 16:59:04 -0700 Subject: [PATCH] ci(language-service): enable language service tests in bazel (#23001) PR Close #23001 --- .../src/diagnostics/typescript_symbols.ts | 16 ++++++++++++++- packages/compiler-cli/test/BUILD.bazel | 5 ++++- packages/language-service/test/BUILD.bazel | 8 +++++++- packages/language-service/test/test_utils.ts | 20 +++++++++++++------ 4 files changed, 40 insertions(+), 9 deletions(-) diff --git a/packages/compiler-cli/src/diagnostics/typescript_symbols.ts b/packages/compiler-cli/src/diagnostics/typescript_symbols.ts index 6490e969ac..95f403a6ee 100644 --- a/packages/compiler-cli/src/diagnostics/typescript_symbols.ts +++ b/packages/compiler-cli/src/diagnostics/typescript_symbols.ts @@ -512,6 +512,9 @@ class PipesTable implements SymbolTable { values(): Symbol[] { return this.pipes.map(pipe => new PipeSymbol(pipe, this.context)); } } +// This matches .d.ts files that look like "...//.d.ts", +const INDEX_PATTERN = /[\\/]([^\\/]+)[\\/]\1\.d\.ts$/; + class PipeSymbol implements Symbol { private _tsType: ts.Type; public readonly kind: DeclarationKind = 'pipe'; @@ -600,7 +603,18 @@ class PipeSymbol implements Symbol { } function findClassSymbolInContext(type: StaticSymbol, context: TypeContext): ts.Symbol|undefined { - const sourceFile = context.program.getSourceFile(type.filePath); + let sourceFile = context.program.getSourceFile(type.filePath); + if (!sourceFile) { + // This handles a case where an /index.d.ts and a /.d.ts + // are in the same directory. If we are looking for / and didn't + // find it, look for /index.d.ts as the program might have found that instead. + const p = type.filePath as string; + const m = p.match(INDEX_PATTERN); + if (m) { + const indexVersion = path.join(path.dirname(p), 'index.d.ts'); + sourceFile = context.program.getSourceFile(indexVersion); + } + } if (sourceFile) { const moduleSymbol = (sourceFile as any).module || (sourceFile as any).symbol; const exports = context.checker.getExportsOfModule(moduleSymbol); diff --git a/packages/compiler-cli/test/BUILD.bazel b/packages/compiler-cli/test/BUILD.bazel index 122700816a..a6c0b2d355 100644 --- a/packages/compiler-cli/test/BUILD.bazel +++ b/packages/compiler-cli/test/BUILD.bazel @@ -10,7 +10,10 @@ ts_library( "mocks.ts", "test_support.ts", ], - visibility = [":__subpackages__"], + visibility = [ + ":__subpackages__", + "//packages/language-service/test:__subpackages__", + ], deps = [ "//packages:types", "//packages/compiler", diff --git a/packages/language-service/test/BUILD.bazel b/packages/language-service/test/BUILD.bazel index 994fe38b82..d4e73e9c0d 100644 --- a/packages/language-service/test/BUILD.bazel +++ b/packages/language-service/test/BUILD.bazel @@ -8,6 +8,7 @@ ts_library( deps = [ "//packages:types", "//packages/compiler", + "//packages/compiler-cli/test:test_utils", "//packages/language-service", ], ) @@ -15,9 +16,14 @@ ts_library( jasmine_node_test( name = "test", bootstrap = ["angular/tools/testing/init_node_spec.js"], + data = [ + "//packages/common:npm_package", + "//packages/core:npm_package", + "//packages/forms:npm_package", + ], # disable since tests are running but not yet passing - tags = ["manual"], deps = [ + ":test_lib", "//tools/testing:node", ], ) diff --git a/packages/language-service/test/test_utils.ts b/packages/language-service/test/test_utils.ts index e26b967bcb..a3357668f1 100644 --- a/packages/language-service/test/test_utils.ts +++ b/packages/language-service/test/test_utils.ts @@ -6,6 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ +import {isInBazel, setup} from '@angular/compiler-cli/test/test_support'; import * as fs from 'fs'; import * as path from 'path'; import * as ts from 'typescript'; @@ -75,12 +76,19 @@ export class MockTypescriptHost implements ts.LanguageServiceHost { private scriptNames: string[], private data: MockData, private node_modules: string = 'node_modules', private myPath: typeof path = path) { const moduleFilename = module.filename.replace(/\\/g, '/'); - let angularIndex = moduleFilename.indexOf('@angular'); - if (angularIndex >= 0) - this.angularPath = moduleFilename.substr(0, angularIndex).replace('/all/', '/all/@angular/'); - let distIndex = moduleFilename.indexOf('/dist/all'); - if (distIndex >= 0) - this.nodeModulesPath = myPath.join(moduleFilename.substr(0, distIndex), 'node_modules'); + if (isInBazel()) { + const support = setup(); + this.nodeModulesPath = path.join(support.basePath, 'node_modules'); + this.angularPath = path.join(this.nodeModulesPath, '@angular'); + } else { + const angularIndex = moduleFilename.indexOf('@angular'); + if (angularIndex >= 0) + this.angularPath = + moduleFilename.substr(0, angularIndex).replace('/all/', '/all/@angular/'); + const distIndex = moduleFilename.indexOf('/dist/all'); + if (distIndex >= 0) + this.nodeModulesPath = myPath.join(moduleFilename.substr(0, distIndex), 'node_modules'); + } this.options = { target: ts.ScriptTarget.ES5, module: ts.ModuleKind.CommonJS,