refactor(compiler-cli): Move diagnostics files to language service (#33809)
The following files are consumed only by the language service and do not have to be in compiler-cli: 1. expression_diagnostics.ts 2. expression_type.ts 3. typescript_symbols.ts 4. symbols.ts PR Close #33809
This commit is contained in:
parent
784fd26473
commit
9935aa43ad
|
@ -8,10 +8,6 @@
|
|||
import {NodeJSFileSystem, setFileSystem} from './src/ngtsc/file_system';
|
||||
|
||||
export {AotCompilerHost, AotCompilerHost as StaticReflectorHost, StaticReflector, StaticSymbol} from '@angular/compiler';
|
||||
export {DiagnosticTemplateInfo, getExpressionScope, getTemplateExpressionDiagnostics} from './src/diagnostics/expression_diagnostics';
|
||||
export {AstType, ExpressionDiagnosticsContext} from './src/diagnostics/expression_type';
|
||||
export {BuiltinType, DeclarationKind, Definition, PipeInfo, Pipes, Signature, Span, Symbol, SymbolDeclaration, SymbolQuery, SymbolTable} from './src/diagnostics/symbols';
|
||||
export {getClassMembersFromDeclaration, getPipesTable, getSymbolQuery} from './src/diagnostics/typescript_symbols';
|
||||
export {VERSION} from './src/version';
|
||||
|
||||
export * from './src/metadata';
|
||||
|
|
|
@ -14,10 +14,6 @@ Angular modules and Typescript as this will indirectly add a dependency
|
|||
to the language service.
|
||||
|
||||
*/
|
||||
export {DiagnosticTemplateInfo, ExpressionDiagnostic, getExpressionDiagnostics, getExpressionScope, getTemplateExpressionDiagnostics} from './diagnostics/expression_diagnostics';
|
||||
export {AstType, DiagnosticKind, ExpressionDiagnosticsContext, TypeDiagnostic} from './diagnostics/expression_type';
|
||||
export {BuiltinType, DeclarationKind, Definition, Location, PipeInfo, Pipes, Signature, Span, Symbol, SymbolDeclaration, SymbolQuery, SymbolTable} from './diagnostics/symbols';
|
||||
export {getClassFromStaticSymbol, getClassMembers, getClassMembersFromDeclaration, getPipesTable, getSymbolQuery} from './diagnostics/typescript_symbols';
|
||||
export {MetadataCollector, ModuleMetadata} from './metadata';
|
||||
export {CompilerOptions} from './transformers/api';
|
||||
export {MetadataReaderCache, MetadataReaderHost, createMetadataReaderCache, readMetadata} from './transformers/metadata_reader';
|
||||
|
|
|
@ -1,28 +1,11 @@
|
|||
load("//tools:defaults.bzl", "jasmine_node_test", "ts_library")
|
||||
|
||||
ts_library(
|
||||
name = "mocks",
|
||||
testonly = True,
|
||||
srcs = [
|
||||
"mocks.ts",
|
||||
],
|
||||
deps = [
|
||||
"//packages:types",
|
||||
"//packages/compiler",
|
||||
"//packages/compiler-cli",
|
||||
"//packages/compiler-cli/test:test_utils",
|
||||
"//packages/core",
|
||||
"@npm//typescript",
|
||||
],
|
||||
)
|
||||
|
||||
# check_types_spec
|
||||
ts_library(
|
||||
name = "check_types_lib",
|
||||
testonly = True,
|
||||
srcs = ["check_types_spec.ts"],
|
||||
deps = [
|
||||
":mocks",
|
||||
"//packages/compiler-cli",
|
||||
"//packages/compiler-cli/test:test_utils",
|
||||
"@npm//typescript",
|
||||
|
@ -49,69 +32,6 @@ jasmine_node_test(
|
|||
],
|
||||
)
|
||||
|
||||
# expression_diagnostics_spec
|
||||
ts_library(
|
||||
name = "expression_diagnostics_lib",
|
||||
testonly = True,
|
||||
srcs = ["expression_diagnostics_spec.ts"],
|
||||
deps = [
|
||||
":mocks",
|
||||
"//packages/compiler",
|
||||
"//packages/compiler-cli",
|
||||
"//packages/compiler-cli/test:test_utils",
|
||||
"//packages/language-service",
|
||||
"@npm//typescript",
|
||||
],
|
||||
)
|
||||
|
||||
jasmine_node_test(
|
||||
name = "expression_diagnostics",
|
||||
bootstrap = ["angular/tools/testing/init_node_spec.js"],
|
||||
data = [
|
||||
"//packages/common:npm_package",
|
||||
"//packages/core:npm_package",
|
||||
"//packages/forms:npm_package",
|
||||
],
|
||||
tags = [
|
||||
# Disabled as these tests pertain to diagnostics in the old ngc compiler. The Ivy ngtsc
|
||||
# compiler has its own tests for diagnostics.
|
||||
"no-ivy-aot",
|
||||
],
|
||||
deps = [
|
||||
":expression_diagnostics_lib",
|
||||
"//packages/core",
|
||||
"//tools/testing:node",
|
||||
],
|
||||
)
|
||||
|
||||
# typescript_symbols_spec
|
||||
ts_library(
|
||||
name = "typescript_symbols_lib",
|
||||
testonly = True,
|
||||
srcs = ["typescript_symbols_spec.ts"],
|
||||
deps = [
|
||||
":mocks",
|
||||
"//packages/compiler",
|
||||
"//packages/compiler-cli",
|
||||
"//packages/compiler-cli/test:test_utils",
|
||||
"//packages/compiler/test:test_utils",
|
||||
"//packages/language-service",
|
||||
"@npm//typescript",
|
||||
],
|
||||
)
|
||||
|
||||
jasmine_node_test(
|
||||
name = "typescript_symbols",
|
||||
bootstrap = ["angular/tools/testing/init_node_spec.js"],
|
||||
data = [
|
||||
],
|
||||
deps = [
|
||||
":typescript_symbols_lib",
|
||||
"//packages/core",
|
||||
"//tools/testing:node",
|
||||
],
|
||||
)
|
||||
|
||||
# typescript_version_spec
|
||||
ts_library(
|
||||
name = "typescript_version_lib",
|
||||
|
|
|
@ -7,10 +7,10 @@
|
|||
*/
|
||||
|
||||
import {AST, AstPath, Attribute, BoundDirectivePropertyAst, BoundElementPropertyAst, BoundEventAst, BoundTextAst, CssSelector, Element, ElementAst, ImplicitReceiver, NAMED_ENTITIES, Node as HtmlAst, NullTemplateVisitor, ParseSpan, PropertyRead, TagContentType, Text, findNode, getHtmlTagDefinition} from '@angular/compiler';
|
||||
import {getExpressionScope} from '@angular/compiler-cli/src/language_services';
|
||||
import {$$, $_, isAsciiLetter, isDigit} from '@angular/compiler/src/chars';
|
||||
|
||||
import {AstResult} from './common';
|
||||
import {getExpressionScope} from './expression_diagnostics';
|
||||
import {getExpressionCompletions} from './expressions';
|
||||
import {attributeNames, elementNames, eventNames, propertyNames} from './html_info';
|
||||
import {InlineTemplate} from './template';
|
||||
|
|
|
@ -7,15 +7,16 @@
|
|||
*/
|
||||
|
||||
import {NgAnalyzedModules} from '@angular/compiler';
|
||||
import {getTemplateExpressionDiagnostics} from '@angular/compiler-cli/src/language_services';
|
||||
import * as path from 'path';
|
||||
import * as ts from 'typescript';
|
||||
|
||||
import {AstResult} from './common';
|
||||
import {getTemplateExpressionDiagnostics} from './expression_diagnostics';
|
||||
import * as ng from './types';
|
||||
import {TypeScriptServiceHost} from './typescript_host';
|
||||
import {findPropertyValueOfType, findTightestNode, offsetSpan, spanOf} from './utils';
|
||||
|
||||
|
||||
/**
|
||||
* Return diagnostic information for the parsed AST of the template.
|
||||
* @param ast contains HTML and template AST
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
*/
|
||||
|
||||
import {AST, ASTWithSource, AstPath as AstPathBase, NullAstVisitor, visitAstChildren} from '@angular/compiler';
|
||||
import {AstType} from '@angular/compiler-cli/src/language_services';
|
||||
import {AstType} from './expression_type';
|
||||
|
||||
import {BuiltinType, Span, Symbol, SymbolQuery, SymbolTable} from './types';
|
||||
import {inSpan} from './utils';
|
||||
|
|
|
@ -7,9 +7,9 @@
|
|||
*/
|
||||
|
||||
import {AST, Attribute, BoundDirectivePropertyAst, BoundEventAst, CompileTypeSummary, CssSelector, DirectiveAst, ElementAst, SelectorMatcher, TemplateAstPath, findNode, tokenReference} from '@angular/compiler';
|
||||
import {getExpressionScope} from '@angular/compiler-cli/src/language_services';
|
||||
|
||||
import {AstResult} from './common';
|
||||
import {getExpressionScope} from './expression_diagnostics';
|
||||
import {getExpressionSymbol} from './expressions';
|
||||
import {Definition, DirectiveKind, Span, Symbol} from './types';
|
||||
import {diagnosticInfoFromTemplateInfo, findTemplateAstAt, inSpan, offsetSpan, spanOf} from './utils';
|
||||
|
|
|
@ -6,13 +6,14 @@
|
|||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import {getClassMembersFromDeclaration, getPipesTable, getSymbolQuery} from '@angular/compiler-cli';
|
||||
import * as ts from 'typescript';
|
||||
|
||||
import {isAstResult} from './common';
|
||||
import {createGlobalSymbolTable} from './global_symbols';
|
||||
import * as ng from './types';
|
||||
import {TypeScriptServiceHost} from './typescript_host';
|
||||
import {getClassMembersFromDeclaration, getPipesTable, getSymbolQuery} from './typescript_symbols';
|
||||
|
||||
|
||||
/**
|
||||
* A base class to represent a template and which component class it is
|
||||
|
|
|
@ -7,9 +7,9 @@
|
|||
*/
|
||||
|
||||
import {CompileDirectiveMetadata, NgAnalyzedModules, StaticSymbol} from '@angular/compiler';
|
||||
import {BuiltinType, DeclarationKind, Definition, PipeInfo, Pipes, Signature, Span, Symbol, SymbolDeclaration, SymbolQuery, SymbolTable} from '@angular/compiler-cli/src/language_services';
|
||||
|
||||
import {AstResult} from './common';
|
||||
import {BuiltinType, DeclarationKind, Definition, PipeInfo, Pipes, Signature, Span, Symbol, SymbolDeclaration, SymbolQuery, SymbolTable} from './symbols';
|
||||
|
||||
export {
|
||||
BuiltinType,
|
||||
|
@ -26,6 +26,7 @@ export {
|
|||
SymbolTable
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* The information `LanguageService` needs from the `LanguageServiceHost` to describe the content of
|
||||
* a template and the language context the template is in.
|
||||
|
|
|
@ -11,7 +11,6 @@ import * as path from 'path';
|
|||
import * as ts from 'typescript';
|
||||
|
||||
import {BuiltinType, DeclarationKind, Definition, Signature, Span, Symbol, SymbolDeclaration, SymbolQuery, SymbolTable} from './symbols';
|
||||
import {isVersionBetween} from './typescript_version';
|
||||
|
||||
// In TypeScript 2.1 these flags moved
|
||||
// These helpers work for both 2.0 and 2.1.
|
||||
|
@ -396,33 +395,18 @@ class SignatureResultOverride implements Signature {
|
|||
get result(): Symbol { return this.resultType; }
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicates the lower bound TypeScript version supporting `SymbolTable` as an ES6 `Map`.
|
||||
* For lower versions, `SymbolTable` is implemented as a dictionary
|
||||
*/
|
||||
const MIN_TS_VERSION_SUPPORTING_MAP = '2.2';
|
||||
|
||||
export const toSymbolTableFactory = (tsVersion: string) => (symbols: ts.Symbol[]) => {
|
||||
if (isVersionBetween(tsVersion, MIN_TS_VERSION_SUPPORTING_MAP)) {
|
||||
// ∀ Typescript version >= 2.2, `SymbolTable` is implemented as an ES6 `Map`
|
||||
const result = new Map<string, ts.Symbol>();
|
||||
for (const symbol of symbols) {
|
||||
result.set(symbol.name, symbol);
|
||||
}
|
||||
// First, tell the compiler that `result` is of type `any`. Then, use a second type assertion
|
||||
// to `ts.SymbolTable`.
|
||||
// Otherwise, `Map<string, ts.Symbol>` and `ts.SymbolTable` will be considered as incompatible
|
||||
// types by the compiler
|
||||
return <ts.SymbolTable>(<any>result);
|
||||
}
|
||||
|
||||
// ∀ Typescript version < 2.2, `SymbolTable` is implemented as a dictionary
|
||||
const result: {[name: string]: ts.Symbol} = {};
|
||||
export function toSymbolTableFactory(symbols: ts.Symbol[]) {
|
||||
// ∀ Typescript version >= 2.2, `SymbolTable` is implemented as an ES6 `Map`
|
||||
const result = new Map<string, ts.Symbol>();
|
||||
for (const symbol of symbols) {
|
||||
result[symbol.name] = symbol;
|
||||
result.set(symbol.name, symbol);
|
||||
}
|
||||
// First, tell the compiler that `result` is of type `any`. Then, use a second type assertion
|
||||
// to `ts.SymbolTable`.
|
||||
// Otherwise, `Map<string, ts.Symbol>` and `ts.SymbolTable` will be considered as incompatible
|
||||
// types by the compiler
|
||||
return <ts.SymbolTable>(<any>result);
|
||||
};
|
||||
}
|
||||
|
||||
function toSymbols(symbolTable: ts.SymbolTable | undefined): ts.Symbol[] {
|
||||
if (!symbolTable) return [];
|
||||
|
@ -456,8 +440,7 @@ class SymbolTableWrapper implements SymbolTable {
|
|||
|
||||
if (Array.isArray(symbols)) {
|
||||
this.symbols = symbols;
|
||||
const toSymbolTable = toSymbolTableFactory(ts.version);
|
||||
this.symbolTable = toSymbolTable(symbols);
|
||||
this.symbolTable = toSymbolTableFactory(symbols);
|
||||
} else {
|
||||
this.symbols = toSymbols(symbols);
|
||||
this.symbolTable = symbols;
|
|
@ -7,10 +7,10 @@
|
|||
*/
|
||||
|
||||
import {AstPath, CompileDirectiveSummary, CompileTypeMetadata, CssSelector, DirectiveAst, ElementAst, EmbeddedTemplateAst, ParseSourceSpan, RecursiveTemplateAstVisitor, TemplateAst, TemplateAstPath, identifierName, templateVisitAll} from '@angular/compiler';
|
||||
import {DiagnosticTemplateInfo} from '@angular/compiler-cli/src/language_services';
|
||||
import * as ts from 'typescript';
|
||||
|
||||
import {AstResult, SelectorInfo} from './common';
|
||||
import {DiagnosticTemplateInfo} from './expression_diagnostics';
|
||||
import {Span} from './types';
|
||||
|
||||
export interface SpanHolder {
|
||||
|
|
|
@ -3,15 +3,25 @@ load("//tools:defaults.bzl", "jasmine_node_test", "ts_library")
|
|||
ts_library(
|
||||
name = "test_lib",
|
||||
testonly = True,
|
||||
srcs = glob(
|
||||
include = ["**/*.ts"],
|
||||
exclude = ["project/**/*"],
|
||||
),
|
||||
srcs = [
|
||||
"completions_spec.ts",
|
||||
"definitions_spec.ts",
|
||||
"diagnostics_spec.ts",
|
||||
"global_symbols_spec.ts",
|
||||
"hover_spec.ts",
|
||||
"html_info_spec.ts",
|
||||
"language_service_spec.ts",
|
||||
"reflector_host_spec.ts",
|
||||
"template_references_spec.ts",
|
||||
"template_spec.ts",
|
||||
"test_utils.ts",
|
||||
"ts_plugin_spec.ts",
|
||||
"typescript_host_spec.ts",
|
||||
"utils_spec.ts",
|
||||
],
|
||||
data = glob(["project/**/*"]),
|
||||
deps = [
|
||||
"//packages:types",
|
||||
"//packages/compiler",
|
||||
"//packages/compiler-cli",
|
||||
"//packages/compiler-cli/test:test_utils",
|
||||
"//packages/language-service",
|
||||
"@npm//typescript",
|
||||
|
@ -32,3 +42,37 @@ jasmine_node_test(
|
|||
":test_lib",
|
||||
],
|
||||
)
|
||||
|
||||
ts_library(
|
||||
name = "diagnostics_lib",
|
||||
testonly = True,
|
||||
srcs = [
|
||||
"expression_diagnostics_spec.ts",
|
||||
"mocks.ts",
|
||||
"typescript_symbols_spec.ts",
|
||||
],
|
||||
deps = [
|
||||
"//packages/compiler",
|
||||
"//packages/compiler-cli/test:test_utils",
|
||||
"//packages/core",
|
||||
"//packages/language-service",
|
||||
"@npm//typescript",
|
||||
],
|
||||
)
|
||||
|
||||
jasmine_node_test(
|
||||
name = "diagnostics",
|
||||
data = [
|
||||
"//packages/common:npm_package",
|
||||
"//packages/core:npm_package",
|
||||
"//packages/forms:npm_package",
|
||||
],
|
||||
tags = [
|
||||
# Disabled as these tests pertain to diagnostics in the old ngc compiler. The Ivy ngtsc
|
||||
# compiler has its own tests for diagnostics.
|
||||
"no-ivy-aot",
|
||||
],
|
||||
deps = [
|
||||
":diagnostics_lib",
|
||||
],
|
||||
)
|
||||
|
|
|
@ -7,11 +7,11 @@
|
|||
*/
|
||||
|
||||
import {StaticSymbol} from '@angular/compiler';
|
||||
import {Directory} from '@angular/compiler-cli/test/mocks';
|
||||
import {ReflectorHost} from '@angular/language-service/src/reflector_host';
|
||||
import * as ts from 'typescript';
|
||||
|
||||
import {getTemplateExpressionDiagnostics} from '../../src/diagnostics/expression_diagnostics';
|
||||
import {Directory} from '../mocks';
|
||||
import {getTemplateExpressionDiagnostics} from '../src/expression_diagnostics';
|
||||
|
||||
import {DiagnosticContext, MockLanguageServiceHost, getDiagnosticTemplateInfo} from './mocks';
|
||||
|
|
@ -6,10 +6,10 @@
|
|||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import {getSymbolQuery} from '@angular/compiler-cli';
|
||||
import * as ts from 'typescript/lib/tsserverlibrary';
|
||||
|
||||
import {EMPTY_SYMBOL_TABLE, createGlobalSymbolTable} from '../src/global_symbols';
|
||||
import {getSymbolQuery} from '../src/typescript_symbols';
|
||||
|
||||
import {MockTypescriptHost} from './test_utils';
|
||||
|
||||
|
|
|
@ -7,15 +7,15 @@
|
|||
*/
|
||||
|
||||
import {AotSummaryResolver, CompileMetadataResolver, CompilerConfig, DEFAULT_INTERPOLATION_CONFIG, DirectiveNormalizer, DirectiveResolver, DomElementSchemaRegistry, HtmlParser, I18NHtmlParser, InterpolationConfig, JitSummaryResolver, Lexer, NgAnalyzedModules, NgModuleResolver, ParseTreeResult, Parser, PipeResolver, ResourceLoader, StaticReflector, StaticSymbol, StaticSymbolCache, StaticSymbolResolver, StaticSymbolResolverHost, SummaryResolver, TemplateParser, analyzeNgModules, createOfflineCompileUrlResolver} from '@angular/compiler';
|
||||
import {Directory, MockAotContext} from '@angular/compiler-cli/test/mocks';
|
||||
import {setup} from '@angular/compiler-cli/test/test_support';
|
||||
import {ViewEncapsulation, ɵConsole as Console} from '@angular/core';
|
||||
import * as fs from 'fs';
|
||||
import * as path from 'path';
|
||||
import * as ts from 'typescript';
|
||||
|
||||
import {DiagnosticTemplateInfo} from '../../src/diagnostics/expression_diagnostics';
|
||||
import {getClassMembers, getPipesTable, getSymbolQuery} from '../../src/diagnostics/typescript_symbols';
|
||||
import {Directory, MockAotContext} from '../mocks';
|
||||
import {setup} from '../test_support';
|
||||
import {DiagnosticTemplateInfo} from '../src/expression_diagnostics';
|
||||
import {getClassMembers, getPipesTable, getSymbolQuery} from '../src/typescript_symbols';
|
||||
|
||||
const realFiles = new Map<string, string>();
|
||||
|
|
@ -6,12 +6,12 @@
|
|||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import {Directory} from '@angular/compiler-cli/test/mocks';
|
||||
import {ReflectorHost} from '@angular/language-service/src/reflector_host';
|
||||
import * as ts from 'typescript';
|
||||
|
||||
import {BuiltinType, Symbol, SymbolQuery, SymbolTable} from '../../src/diagnostics/symbols';
|
||||
import {getSymbolQuery, toSymbolTableFactory} from '../../src/diagnostics/typescript_symbols';
|
||||
import {Directory} from '../mocks';
|
||||
import {BuiltinType, Symbol, SymbolQuery, SymbolTable} from '../src/symbols';
|
||||
import {getSymbolQuery, toSymbolTableFactory} from '../src/typescript_symbols';
|
||||
|
||||
import {DiagnosticContext, MockLanguageServiceHost} from './mocks';
|
||||
|
||||
|
@ -74,15 +74,10 @@ describe('symbol query', () => {
|
|||
});
|
||||
|
||||
describe('toSymbolTableFactory(tsVersion)', () => {
|
||||
it('should return a Map for versions of TypeScript >= 2.2 and a dictionary otherwise', () => {
|
||||
it('should return a Map for versions of TypeScript >= 2.2', () => {
|
||||
const a = { name: 'a' } as ts.Symbol;
|
||||
const b = { name: 'b' } as ts.Symbol;
|
||||
|
||||
expect(toSymbolTableFactory('2.1')([a, b]) instanceof Map).toEqual(false);
|
||||
expect(toSymbolTableFactory('2.4')([a, b]) instanceof Map).toEqual(true);
|
||||
|
||||
// Check that for the lower bound version `2.2`, toSymbolTableFactory('2.2') returns a map
|
||||
expect(toSymbolTableFactory('2.2')([a, b]) instanceof Map).toEqual(true);
|
||||
expect(toSymbolTableFactory([a, b]) instanceof Map).toEqual(true);
|
||||
});
|
||||
});
|
||||
|
Loading…
Reference in New Issue