From 95a407d9dd238479fcc481ca55d3929a44e4342d Mon Sep 17 00:00:00 2001 From: Keen Yee Liau Date: Wed, 29 Apr 2020 15:08:22 -0700 Subject: [PATCH] build: Add entry point for Ivy language service (#36864) This commit adds a new entry point for the Ivy version of language service. The entry point is just a shell for now, implementation will be added in subsequent PRs. The Ivy version of language service could be loaded from the NPM package via `require(@angular/language-service/bundles/ivy.umd.js)` PR Close #36864 --- packages/language-service/BUILD.bazel | 1 + packages/language-service/bundles/BUILD.bazel | 15 +++++++++ packages/language-service/ivy/BUILD.bazel | 11 +++++++ .../language-service/ivy/language_service.ts | 17 ++++++++++ packages/language-service/ivy/ts_plugin.ts | 31 +++++++++++++++++++ 5 files changed, 75 insertions(+) create mode 100644 packages/language-service/ivy/BUILD.bazel create mode 100644 packages/language-service/ivy/language_service.ts create mode 100644 packages/language-service/ivy/ts_plugin.ts diff --git a/packages/language-service/BUILD.bazel b/packages/language-service/BUILD.bazel index 73d29a011a..24336820a8 100644 --- a/packages/language-service/BUILD.bazel +++ b/packages/language-service/BUILD.bazel @@ -35,5 +35,6 @@ pkg_npm( ":language-service", # min bundle is not used at the moment; omit from package to speed up build "//packages/language-service/bundles:language-service.umd.js", + "//packages/language-service/bundles:ivy.umd.js", ], ) diff --git a/packages/language-service/bundles/BUILD.bazel b/packages/language-service/bundles/BUILD.bazel index 027480e3c1..ba95926d85 100644 --- a/packages/language-service/bundles/BUILD.bazel +++ b/packages/language-service/bundles/BUILD.bazel @@ -18,6 +18,21 @@ ls_rollup_bundle( ], ) +ls_rollup_bundle( + name = "ivy", + entry_point = "//packages/language-service/ivy:ts_plugin.ts", + globals = { + "fs": "fs", + "path": "path", + "typescript/lib/tsserverlibrary": "ts", + }, + license_banner = ":banner", + visibility = ["//packages/language-service:__pkg__"], + deps = [ + "//packages/language-service/ivy", + ], +) + genrule( name = "banner", srcs = ["banner.js"], diff --git a/packages/language-service/ivy/BUILD.bazel b/packages/language-service/ivy/BUILD.bazel new file mode 100644 index 0000000000..849916eb81 --- /dev/null +++ b/packages/language-service/ivy/BUILD.bazel @@ -0,0 +1,11 @@ +load("//tools:defaults.bzl", "ts_library") + +package(default_visibility = ["//visibility:public"]) + +ts_library( + name = "ivy", + srcs = glob(["*.ts"]), + deps = [ + "@npm//typescript", + ], +) diff --git a/packages/language-service/ivy/language_service.ts b/packages/language-service/ivy/language_service.ts new file mode 100644 index 0000000000..3c51444754 --- /dev/null +++ b/packages/language-service/ivy/language_service.ts @@ -0,0 +1,17 @@ +/** + * @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 * as ts from 'typescript/lib/tsserverlibrary'; + +export class LanguageService { + constructor(private readonly tsLS: ts.LanguageService) {} + + getSemanticDiagnostics(fileName: string): ts.Diagnostic[] { + return []; + } +} diff --git a/packages/language-service/ivy/ts_plugin.ts b/packages/language-service/ivy/ts_plugin.ts new file mode 100644 index 0000000000..46ba8a49f9 --- /dev/null +++ b/packages/language-service/ivy/ts_plugin.ts @@ -0,0 +1,31 @@ +/** + * @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 * as ts from 'typescript/lib/tsserverlibrary'; +import {LanguageService} from './language_service'; + +export function create(info: ts.server.PluginCreateInfo): ts.LanguageService { + const {languageService: tsLS, config} = info; + const angularOnly = config?.angularOnly === true; + + const ngLS = new LanguageService(tsLS); + + function getSemanticDiagnostics(fileName: string): ts.Diagnostic[] { + const diagnostics: ts.Diagnostic[] = []; + if (!angularOnly) { + diagnostics.push(...tsLS.getSemanticDiagnostics(fileName)); + } + diagnostics.push(...ngLS.getSemanticDiagnostics(fileName)); + return diagnostics; + } + + return { + ...tsLS, + getSemanticDiagnostics, + }; +}