Merge branch 'master' into gulpProjectRefs

This commit is contained in:
Ron Buckton 2018-06-21 10:55:35 -07:00
Родитель 2fc014a2d8 22fde18657
Коммит 272e5554c8
88 изменённых файлов: 1052 добавлений и 419 удалений

Просмотреть файл

@ -139,7 +139,6 @@ Michael <maykelchiche@gmail.com>
Mike Busyrev <busyrev@gmail.com>
Mine Starks <minestarks@users.noreply.github.com> Mine Starks <mineyalc@microsoft.com>
Mohamed Hegazy <mhegazy@microsoft.com>
ncoley <nrcoley@gmail.com> # Natalie Coley
Nathan Shively-Sanders <nathansa@microsoft.com> Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com>
Nathan Yee <ny.nathan.yee@gmail.com>
Nima Zahedi <nima.zahedee@gmail.com>

Просмотреть файл

@ -128,7 +128,7 @@ const generatedLCGFile = "built/local/enu/diagnosticMessages.generated.json.lcg"
* 2. 'src\compiler\diagnosticMessages.generated.json' => 'built\local\ENU\diagnosticMessages.generated.json.lcg'
* generate the lcg file (source of messages to localize) from the diagnosticMessages.generated.json
*/
const localizationTargets = ["cs", "de", "es", "fr", "it", "ja", "ko", "pl", "pt-br", "ru", "tr", "zh-cn", "zh-tw"]
const localizationTargets = ["cs", "de", "es", "fr", "it", "ja", "ko", "pl", "pt-BR", "ru", "tr", "zh-CN", "zh-TW"]
.map(f => `built/local/${f}/diagnosticMessages.generated.json`)
.concat(generatedLCGFile);

Просмотреть файл

@ -21,7 +21,7 @@ else if (process.env.PATH !== undefined) {
const host = process.env.TYPESCRIPT_HOST || process.env.host || "node";
const locales = ["cs", "de", "es", "fr", "it", "ja", "ko", "pl", "pt-br", "ru", "tr", "zh-cn", "zh-tw"];
const locales = ["cs", "de", "es", "fr", "it", "ja", "ko", "pl", "pt-BR", "ru", "tr", "zh-CN", "zh-TW"];
const defaultTestTimeout = 40000;
@ -69,10 +69,10 @@ Paths.tsserverLibraryDefinitionFile = "built/local/tsserverlibrary.d.ts";
Paths.baselines = {};
Paths.baselines.local = "tests/baselines/local";
Paths.baselines.localTest262 = "tests/baselines/test262/local";
Paths.baselines.localRwc = "tests/baselines/rwc/local";
Paths.baselines.localRwc = "internal/baselines/rwc/local";
Paths.baselines.reference = "tests/baselines/reference";
Paths.baselines.referenceTest262 = "tests/baselines/test262/reference";
Paths.baselines.referenceRwc = "tests/baselines/rwc/reference";
Paths.baselines.referenceRwc = "internal/baselines/rwc/reference";
Paths.copyright = "CopyrightNotice.txt";
Paths.thirdParty = "ThirdPartyNoticeText.txt";
Paths.processDiagnosticMessagesJs = "scripts/processDiagnosticMessages.js";
@ -174,7 +174,7 @@ task(TaskNames.lkg, [
if (sizeAfter > (sizeBefore * 1.10)) {
throw new Error("The lib folder increased by 10% or more. This likely indicates a bug.");
}
complete();
});
}, { async: true });
@ -349,7 +349,7 @@ file(Paths.servicesDefinitionFile, [TaskNames.coreBuild], function() {
},
files
};
const configFilePath = `built/local/typescriptServices.tsconfig.json`;
fs.writeFileSync(configFilePath, JSON.stringify(config, undefined, 2));
tsbuild(configFilePath, false, () => {
@ -696,8 +696,8 @@ function diagnosticsToString(diagnostics, pretty) {
/**
* Concatenate a list of sourceFiles to a destinationFile
* @param {string} destinationFile
* @param {string[]} sourceFiles
* @param {string} destinationFile
* @param {string[]} sourceFiles
* @param {string} extraContent
*/
function concatenateFiles(destinationFile, sourceFiles, extraContent) {
@ -724,8 +724,8 @@ function appendToFile(path, content) {
}
/**
*
* @param {string} path
*
* @param {string} path
* @returns string
*/
function readFileSync(path) {
@ -742,7 +742,7 @@ function getDiffTool() {
/**
* Replaces const enum declarations with non-const enums
* @param {string} text
* @param {string} text
*/
function removeConstModifierFromEnumDeclarations(text) {
return text.replace(/^(\s*)(export )?const enum (\S+) {(\s*)$/gm, '$1$2enum $3 {$4');

Просмотреть файл

@ -65,11 +65,10 @@ function main(): void {
* There are three exceptions, zh-CN, zh-TW and pt-BR.
*/
function getPreferedLocaleName(localeName: string) {
localeName = localeName.toLowerCase();
switch (localeName) {
case "zh-cn":
case "zh-tw":
case "pt-br":
case "zh-CN":
case "zh-TW":
case "pt-BR":
return localeName;
default:
return localeName.split("-")[0];

Просмотреть файл

@ -2283,16 +2283,24 @@ namespace ts {
}
function errorOnImplicitAnyModule(isError: boolean, errorNode: Node, { packageId, resolvedFileName }: ResolvedModuleFull, moduleReference: string): void {
const errorInfo = packageId && chainDiagnosticMessages(
/*details*/ undefined,
Diagnostics.Try_npm_install_types_Slash_0_if_it_exists_or_add_a_new_declaration_d_ts_file_containing_declare_module_0,
getMangledNameForScopedPackage(packageId.name));
const errorInfo = packageId
? chainDiagnosticMessages(
/*details*/ undefined,
typesPackageExists(packageId.name)
? Diagnostics.If_the_0_package_actually_exposes_this_module_consider_sending_a_pull_request_to_amend_https_Colon_Slash_Slashgithub_com_SlashDefinitelyTyped_SlashDefinitelyTyped_Slashtree_Slashmaster_Slashtypes_Slash_0
: Diagnostics.Try_npm_install_types_Slash_0_if_it_exists_or_add_a_new_declaration_d_ts_file_containing_declare_module_0,
getMangledNameForScopedPackage(packageId.name))
: undefined;
errorOrSuggestion(isError, errorNode, chainDiagnosticMessages(
errorInfo,
Diagnostics.Could_not_find_a_declaration_file_for_module_0_1_implicitly_has_an_any_type,
moduleReference,
resolvedFileName));
}
function typesPackageExists(packageName: string): boolean {
return host.getSourceFiles().some(sf => !!sf.resolvedModules && !!forEachEntry(sf.resolvedModules, r =>
r && r.packageId && r.packageId.name === getTypesPackageName(packageName)));
}
// An external module with an 'export =' declaration resolves to the target of the 'export =' declaration,
// and an external module with no 'export =' declaration resolves to the module itself.
@ -2589,7 +2597,7 @@ namespace ts {
return type;
}
function createBooleanType(trueFalseTypes: Type[]): IntrinsicType & UnionType {
function createBooleanType(trueFalseTypes: ReadonlyArray<Type>): IntrinsicType & UnionType {
const type = <IntrinsicType & UnionType>getUnionType(trueFalseTypes);
type.flags |= TypeFlags.Boolean;
type.intrinsicName = "boolean";
@ -2631,7 +2639,7 @@ namespace ts {
return result || emptyArray;
}
function setStructuredTypeMembers(type: StructuredType, members: SymbolTable, callSignatures: Signature[], constructSignatures: Signature[], stringIndexInfo: IndexInfo | undefined, numberIndexInfo: IndexInfo | undefined): ResolvedType {
function setStructuredTypeMembers(type: StructuredType, members: SymbolTable, callSignatures: ReadonlyArray<Signature>, constructSignatures: ReadonlyArray<Signature>, stringIndexInfo: IndexInfo | undefined, numberIndexInfo: IndexInfo | undefined): ResolvedType {
(<ResolvedType>type).members = members;
(<ResolvedType>type).properties = getNamedMembers(members);
(<ResolvedType>type).callSignatures = callSignatures;
@ -2641,7 +2649,7 @@ namespace ts {
return <ResolvedType>type;
}
function createAnonymousType(symbol: Symbol | undefined, members: SymbolTable, callSignatures: Signature[], constructSignatures: Signature[], stringIndexInfo: IndexInfo | undefined, numberIndexInfo: IndexInfo | undefined): ResolvedType {
function createAnonymousType(symbol: Symbol | undefined, members: SymbolTable, callSignatures: ReadonlyArray<Signature>, constructSignatures: ReadonlyArray<Signature>, stringIndexInfo: IndexInfo | undefined, numberIndexInfo: IndexInfo | undefined): ResolvedType {
return setStructuredTypeMembers(createObjectType(ObjectFlags.Anonymous, symbol),
members, callSignatures, constructSignatures, stringIndexInfo, numberIndexInfo);
}
@ -3387,7 +3395,7 @@ namespace ts {
}
function typeReferenceToTypeNode(type: TypeReference) {
const typeArguments: Type[] = type.typeArguments || emptyArray;
const typeArguments: ReadonlyArray<Type> = type.typeArguments || emptyArray;
if (type.target === globalArrayType) {
if (context.flags & NodeBuilderFlags.WriteArrayAsGenericType) {
const typeArgumentNode = typeToTypeNodeHelper(typeArguments[0], context);
@ -3583,7 +3591,7 @@ namespace ts {
}
}
function mapToTypeNodes(types: Type[] | undefined, context: NodeBuilderContext): TypeNode[] | undefined {
function mapToTypeNodes(types: ReadonlyArray<Type> | undefined, context: NodeBuilderContext): TypeNode[] | undefined {
if (some(types)) {
const result = [];
for (const type of types) {
@ -3992,7 +4000,7 @@ namespace ts {
}
}
function formatUnionTypes(types: Type[]): Type[] {
function formatUnionTypes(types: ReadonlyArray<Type>): Type[] {
const result: Type[] = [];
let flags: TypeFlags = 0;
for (let i = 0; i < types.length; i++) {
@ -4110,15 +4118,14 @@ namespace ts {
if (declaration.parent && declaration.parent.kind === SyntaxKind.VariableDeclaration) {
return declarationNameToString((<VariableDeclaration>declaration.parent).name);
}
if (context && !context.encounteredError && !(context.flags & NodeBuilderFlags.AllowAnonymousIdentifier)) {
context.encounteredError = true;
}
switch (declaration.kind) {
case SyntaxKind.ClassExpression:
return "(Anonymous class)";
case SyntaxKind.FunctionExpression:
case SyntaxKind.ArrowFunction:
return "(Anonymous function)";
if (context && !context.encounteredError && !(context.flags & NodeBuilderFlags.AllowAnonymousIdentifier)) {
context.encounteredError = true;
}
return declaration.kind === SyntaxKind.ClassExpression ? "(Anonymous class)" : "(Anonymous function)";
}
}
const nameType = symbol.nameType;
@ -5393,26 +5400,17 @@ namespace ts {
}
function getBaseTypeNodeOfClass(type: InterfaceType): ExpressionWithTypeArguments | undefined {
const decl = <ClassLikeDeclaration>type.symbol.valueDeclaration;
if (isInJavaScriptFile(decl)) {
// Prefer an @augments tag because it may have type parameters.
const tag = getJSDocAugmentsTag(decl);
if (tag) {
return tag.class;
}
}
return getClassExtendsHeritageClauseElement(decl);
return getEffectiveBaseTypeNode(type.symbol.valueDeclaration as ClassLikeDeclaration);
}
function getConstructorsForTypeArguments(type: Type, typeArgumentNodes: ReadonlyArray<TypeNode> | undefined, location: Node): Signature[] {
function getConstructorsForTypeArguments(type: Type, typeArgumentNodes: ReadonlyArray<TypeNode> | undefined, location: Node): ReadonlyArray<Signature> {
const typeArgCount = length(typeArgumentNodes);
const isJavaScript = isInJavaScriptFile(location);
return filter(getSignaturesOfType(type, SignatureKind.Construct),
sig => (isJavaScript || typeArgCount >= getMinTypeArgumentCount(sig.typeParameters)) && typeArgCount <= length(sig.typeParameters));
}
function getInstantiatedConstructorsForTypeArguments(type: Type, typeArgumentNodes: ReadonlyArray<TypeNode> | undefined, location: Node): Signature[] {
function getInstantiatedConstructorsForTypeArguments(type: Type, typeArgumentNodes: ReadonlyArray<TypeNode> | undefined, location: Node): ReadonlyArray<Signature> {
const signatures = getConstructorsForTypeArguments(type, typeArgumentNodes, location);
const typeArguments = map(typeArgumentNodes, getTypeFromTypeNode);
return sameMap<Signature>(signatures, sig => some(sig.typeParameters) ? getSignatureInstantiation(sig, typeArguments, isInJavaScriptFile(location)) : sig);
@ -5429,7 +5427,7 @@ namespace ts {
function getBaseConstructorTypeOfClass(type: InterfaceType): Type {
if (!type.resolvedBaseConstructorType) {
const decl = <ClassLikeDeclaration>type.symbol.valueDeclaration;
const extended = getClassExtendsHeritageClauseElement(decl);
const extended = getEffectiveBaseTypeNode(decl);
const baseTypeNode = getBaseTypeNodeOfClass(type);
if (!baseTypeNode) {
return type.resolvedBaseConstructorType = undefinedType;
@ -6162,11 +6160,11 @@ namespace ts {
return needApparentType ? getApparentType(type) : type;
}
function resolveObjectTypeMembers(type: ObjectType, source: InterfaceTypeWithDeclaredMembers, typeParameters: TypeParameter[], typeArguments: Type[]) {
function resolveObjectTypeMembers(type: ObjectType, source: InterfaceTypeWithDeclaredMembers, typeParameters: ReadonlyArray<TypeParameter>, typeArguments: ReadonlyArray<Type>) {
let mapper: TypeMapper;
let members: SymbolTable;
let callSignatures: Signature[];
let constructSignatures: Signature[] | undefined;
let callSignatures: ReadonlyArray<Signature>;
let constructSignatures: ReadonlyArray<Signature> | undefined;
let stringIndexInfo: IndexInfo | undefined;
let numberIndexInfo: IndexInfo | undefined;
if (rangeEquals(typeParameters, typeArguments, 0, typeParameters.length)) {
@ -6222,9 +6220,9 @@ namespace ts {
function createSignature(
declaration: SignatureDeclaration | JSDocSignature | undefined,
typeParameters: TypeParameter[] | undefined,
typeParameters: ReadonlyArray<TypeParameter> | undefined,
thisParameter: Symbol | undefined,
parameters: Symbol[],
parameters: ReadonlyArray<Symbol>,
resolvedReturnType: Type | undefined,
resolvedTypePredicate: TypePredicate | undefined,
minArgumentCount: number,
@ -6275,7 +6273,7 @@ namespace ts {
return result;
}
function findMatchingSignature(signatureList: Signature[], signature: Signature, partialMatch: boolean, ignoreThisTypes: boolean, ignoreReturnTypes: boolean): Signature | undefined {
function findMatchingSignature(signatureList: ReadonlyArray<Signature>, signature: Signature, partialMatch: boolean, ignoreThisTypes: boolean, ignoreReturnTypes: boolean): Signature | undefined {
for (const s of signatureList) {
if (compareSignaturesIdentical(s, signature, partialMatch, ignoreThisTypes, ignoreReturnTypes, compareTypesIdentical)) {
return s;
@ -6283,7 +6281,7 @@ namespace ts {
}
}
function findMatchingSignatures(signatureLists: Signature[][], signature: Signature, listIndex: number): Signature[] | undefined {
function findMatchingSignatures(signatureLists: ReadonlyArray<ReadonlyArray<Signature>>, signature: Signature, listIndex: number): Signature[] | undefined {
if (signature.typeParameters) {
// We require an exact match for generic signatures, so we only return signatures from the first
// signature list and only if they have exact matches in the other signature lists.
@ -6313,7 +6311,7 @@ namespace ts {
// Generic signatures must match exactly, but non-generic signatures are allowed to have extra optional
// parameters and may differ in return types. When signatures differ in return types, the resulting return
// type is the union of the constituent return types.
function getUnionSignatures(types: Type[], kind: SignatureKind): Signature[] {
function getUnionSignatures(types: ReadonlyArray<Type>, kind: SignatureKind): Signature[] {
const signatureLists = map(types, t => getSignaturesOfType(t, kind));
let result: Signature[] | undefined;
for (let i = 0; i < signatureLists.length; i++) {
@ -6343,7 +6341,7 @@ namespace ts {
return result || emptyArray;
}
function getUnionIndexInfo(types: Type[], kind: IndexKind): IndexInfo | undefined {
function getUnionIndexInfo(types: ReadonlyArray<Type>, kind: IndexKind): IndexInfo | undefined {
const indexTypes: Type[] = [];
let isAnyReadonly = false;
for (const type of types) {
@ -6383,7 +6381,7 @@ namespace ts {
getUnionType([info1.type, info2.type]), info1.isReadonly || info2.isReadonly);
}
function includeMixinType(type: Type, types: Type[], index: number): Type {
function includeMixinType(type: Type, types: ReadonlyArray<Type>, index: number): Type {
const mixedTypes: Type[] = [];
for (let i = 0; i < types.length; i++) {
if (i === index) {
@ -6399,8 +6397,8 @@ namespace ts {
function resolveIntersectionTypeMembers(type: IntersectionType) {
// The members and properties collections are empty for intersection types. To get all properties of an
// intersection type use getPropertiesOfType (only the language service uses this).
let callSignatures: Signature[] = emptyArray;
let constructSignatures: Signature[] = emptyArray;
let callSignatures: ReadonlyArray<Signature> = emptyArray;
let constructSignatures: ReadonlyArray<Signature> = emptyArray;
let stringIndexInfo: IndexInfo | undefined;
let numberIndexInfo: IndexInfo | undefined;
const types = type.types;
@ -6738,7 +6736,7 @@ namespace ts {
getPropertiesOfObjectType(type);
}
function getAllPossiblePropertiesOfTypes(types: Type[]): Symbol[] {
function getAllPossiblePropertiesOfTypes(types: ReadonlyArray<Type>): Symbol[] {
const unionType = getUnionType(types);
if (!(unionType.flags & TypeFlags.Union)) {
return getAugmentedPropertiesOfType(unionType);
@ -7142,7 +7140,7 @@ namespace ts {
return undefined;
}
function getSignaturesOfStructuredType(type: Type, kind: SignatureKind): Signature[] {
function getSignaturesOfStructuredType(type: Type, kind: SignatureKind): ReadonlyArray<Signature> {
if (type.flags & TypeFlags.StructuredType) {
const resolved = resolveStructuredTypeMembers(<ObjectType>type);
return kind === SignatureKind.Call ? resolved.callSignatures : resolved.constructSignatures;
@ -7154,7 +7152,7 @@ namespace ts {
* Return the signatures of the given kind in the given type. Creates synthetic union signatures when necessary and
* maps primitive types and type parameters are to their apparent types.
*/
function getSignaturesOfType(type: Type, kind: SignatureKind): Signature[] {
function getSignaturesOfType(type: Type, kind: SignatureKind): ReadonlyArray<Signature> {
return getSignaturesOfStructuredType(getApparentType(type), kind);
}
@ -7289,7 +7287,7 @@ namespace ts {
* Gets the minimum number of type arguments needed to satisfy all non-optional type
* parameters.
*/
function getMinTypeArgumentCount(typeParameters: TypeParameter[] | undefined): number {
function getMinTypeArgumentCount(typeParameters: ReadonlyArray<TypeParameter> | undefined): number {
let minTypeArgumentCount = 0;
if (typeParameters) {
for (let i = 0; i < typeParameters.length; i++) {
@ -7309,9 +7307,9 @@ namespace ts {
* @param typeParameters The requested type parameters.
* @param minTypeArgumentCount The minimum number of required type arguments.
*/
function fillMissingTypeArguments(typeArguments: Type[], typeParameters: TypeParameter[] | undefined, minTypeArgumentCount: number, isJavaScriptImplicitAny: boolean): Type[];
function fillMissingTypeArguments(typeArguments: Type[] | undefined, typeParameters: TypeParameter[] | undefined, minTypeArgumentCount: number, isJavaScriptImplicitAny: boolean): Type[] | undefined;
function fillMissingTypeArguments(typeArguments: Type[] | undefined, typeParameters: TypeParameter[] | undefined, minTypeArgumentCount: number, isJavaScriptImplicitAny: boolean) {
function fillMissingTypeArguments(typeArguments: Type[], typeParameters: ReadonlyArray<TypeParameter> | undefined, minTypeArgumentCount: number, isJavaScriptImplicitAny: boolean): Type[];
function fillMissingTypeArguments(typeArguments: Type[] | undefined, typeParameters: ReadonlyArray<TypeParameter> | undefined, minTypeArgumentCount: number, isJavaScriptImplicitAny: boolean): Type[] | undefined;
function fillMissingTypeArguments(typeArguments: Type[] | undefined, typeParameters: ReadonlyArray<TypeParameter> | undefined, minTypeArgumentCount: number, isJavaScriptImplicitAny: boolean) {
const numTypeParameters = length(typeParameters);
if (numTypeParameters) {
const numTypeArguments = length(typeArguments);
@ -7606,7 +7604,9 @@ namespace ts {
}
function getSignatureInstantiation(signature: Signature, typeArguments: Type[] | undefined, isJavascript: boolean): Signature {
typeArguments = fillMissingTypeArguments(typeArguments, signature.typeParameters, getMinTypeArgumentCount(signature.typeParameters), isJavascript)!;
return getSignatureInstantiationWithoutFillingInTypeArguments(signature, fillMissingTypeArguments(typeArguments, signature.typeParameters, getMinTypeArgumentCount(signature.typeParameters), isJavascript));
}
function getSignatureInstantiationWithoutFillingInTypeArguments(signature: Signature, typeArguments: ReadonlyArray<Type> | undefined): Signature {
const instantiations = signature.instantiations || (signature.instantiations = createMap<Signature>());
const id = getTypeListId(typeArguments);
let instantiation = instantiations.get(id);
@ -7616,10 +7616,10 @@ namespace ts {
return instantiation;
}
function createSignatureInstantiation(signature: Signature, typeArguments: Type[]): Signature {
function createSignatureInstantiation(signature: Signature, typeArguments: ReadonlyArray<Type> | undefined): Signature {
return instantiateSignature(signature, createSignatureTypeMapper(signature, typeArguments), /*eraseTypeParameters*/ true);
}
function createSignatureTypeMapper(signature: Signature, typeArguments: Type[]): TypeMapper {
function createSignatureTypeMapper(signature: Signature, typeArguments: ReadonlyArray<Type> | undefined): TypeMapper {
return createTypeMapper(signature.typeParameters!, typeArguments);
}
@ -7776,7 +7776,7 @@ namespace ts {
return getSymbolOfNode(getDeclarationOfKind(typeParameter.symbol, SyntaxKind.TypeParameter)!.parent);
}
function getTypeListId(types: Type[] | undefined) {
function getTypeListId(types: ReadonlyArray<Type> | undefined) {
let result = "";
if (types) {
const length = types.length;
@ -7804,7 +7804,7 @@ namespace ts {
// It is only necessary to do so if a constituent type might be the undefined type, the null type, the type
// of an object literal or the anyFunctionType. This is because there are operations in the type checker
// that care about the presence of such types at arbitrary depth in a containing type.
function getPropagatingFlagsOfTypes(types: Type[], excludeKinds: TypeFlags): TypeFlags {
function getPropagatingFlagsOfTypes(types: ReadonlyArray<Type>, excludeKinds: TypeFlags): TypeFlags {
let result: TypeFlags = 0;
for (const type of types) {
if (!(type.flags & excludeKinds)) {
@ -7814,7 +7814,7 @@ namespace ts {
return result & TypeFlags.PropagatingFlags;
}
function createTypeReference(target: GenericType, typeArguments: Type[] | undefined): TypeReference {
function createTypeReference(target: GenericType, typeArguments: ReadonlyArray<Type> | undefined): TypeReference {
const id = getTypeListId(typeArguments);
let type = target.instantiations.get(id);
if (!type) {
@ -8261,7 +8261,7 @@ namespace ts {
/**
* Instantiates a global type that is generic with some element type, and returns that instantiation.
*/
function createTypeFromGenericGlobalType(genericGlobalType: GenericType, typeArguments: Type[]): ObjectType {
function createTypeFromGenericGlobalType(genericGlobalType: GenericType, typeArguments: ReadonlyArray<Type>): ObjectType {
return genericGlobalType !== emptyGenericType ? createTypeReference(genericGlobalType, typeArguments) : emptyObjectType;
}
@ -8340,7 +8340,7 @@ namespace ts {
return tupleTypes[arity] || (tupleTypes[arity] = createTupleTypeOfArity(arity));
}
function createTupleType(elementTypes: Type[]) {
function createTupleType(elementTypes: ReadonlyArray<Type>) {
return createTypeReference(getTupleTypeOfArity(elementTypes.length), elementTypes);
}
@ -8356,7 +8356,7 @@ namespace ts {
return type.id;
}
function containsType(types: Type[], type: Type): boolean {
function containsType(types: ReadonlyArray<Type>, type: Type): boolean {
return binarySearch(types, type, getTypeId, compareValues) >= 0;
}
@ -8420,14 +8420,14 @@ namespace ts {
// Add the given types to the given type set. Order is preserved, duplicates are removed,
// and nested types of the given kind are flattened into the set.
function addTypesToUnion(typeSet: Type[], includes: TypeFlags, types: Type[]): TypeFlags {
function addTypesToUnion(typeSet: Type[], includes: TypeFlags, types: ReadonlyArray<Type>): TypeFlags {
for (const type of types) {
includes = addTypeToUnion(typeSet, includes, type);
}
return includes;
}
function containsIdenticalType(types: Type[], type: Type) {
function containsIdenticalType(types: ReadonlyArray<Type>, type: Type) {
for (const t of types) {
if (isTypeIdenticalTo(t, type)) {
return true;
@ -8436,7 +8436,7 @@ namespace ts {
return false;
}
function isSubtypeOfAny(source: Type, targets: Type[]): boolean {
function isSubtypeOfAny(source: Type, targets: ReadonlyArray<Type>): boolean {
for (const target of targets) {
if (source !== target && isTypeSubtypeOf(source, target) && (
!(getObjectFlags(getTargetType(source)) & ObjectFlags.Class) ||
@ -8448,7 +8448,7 @@ namespace ts {
return false;
}
function isSetOfLiteralsFromSameEnum(types: Type[]): boolean {
function isSetOfLiteralsFromSameEnum(types: ReadonlyArray<Type>): boolean {
const first = types[0];
if (first.flags & TypeFlags.EnumLiteral) {
const firstEnum = getParentOfSymbol(first.symbol);
@ -8500,7 +8500,7 @@ namespace ts {
// expression constructs such as array literals and the || and ?: operators). Named types can
// circularly reference themselves and therefore cannot be subtype reduced during their declaration.
// For example, "type Item = string | (() => Item" is a named type that circularly references itself.
function getUnionType(types: Type[], unionReduction: UnionReduction = UnionReduction.Literal, aliasSymbol?: Symbol, aliasTypeArguments?: Type[]): Type {
function getUnionType(types: ReadonlyArray<Type>, unionReduction: UnionReduction = UnionReduction.Literal, aliasSymbol?: Symbol, aliasTypeArguments?: ReadonlyArray<Type>): Type {
if (types.length === 0) {
return neverType;
}
@ -8567,7 +8567,7 @@ namespace ts {
}
// This function assumes the constituent type list is sorted and deduplicated.
function getUnionTypeFromSortedList(types: Type[], unionOfUnitTypes: TypeFlags, aliasSymbol?: Symbol, aliasTypeArguments?: Type[]): Type {
function getUnionTypeFromSortedList(types: Type[], unionOfUnitTypes: TypeFlags, aliasSymbol?: Symbol, aliasTypeArguments?: ReadonlyArray<Type>): Type {
if (types.length === 0) {
return neverType;
}
@ -8628,7 +8628,7 @@ namespace ts {
// Add the given types to the given type set. Order is preserved, freshness is removed from literal
// types, duplicates are removed, and nested types of the given kind are flattened into the set.
function addTypesToIntersection(typeSet: Type[], includes: TypeFlags, types: Type[]) {
function addTypesToIntersection(typeSet: Type[], includes: TypeFlags, types: ReadonlyArray<Type>) {
for (const type of types) {
includes = addTypeToIntersection(typeSet, includes, getRegularTypeOfLiteralType(type));
}
@ -8683,7 +8683,7 @@ namespace ts {
// a type alias of the form "type List<T> = T & { next: List<T> }" cannot be reduced during its declaration.
// Also, unlike union types, the order of the constituent types is preserved in order that overload resolution
// for intersections of types with signatures can be deterministic.
function getIntersectionType(types: Type[], aliasSymbol?: Symbol, aliasTypeArguments?: Type[]): Type {
function getIntersectionType(types: ReadonlyArray<Type>, aliasSymbol?: Symbol, aliasTypeArguments?: ReadonlyArray<Type>): Type {
const typeSet: Type[] = [];
const includes = addTypesToIntersection(typeSet, 0, types);
if (includes & TypeFlags.Never) {
@ -9586,9 +9586,9 @@ namespace ts {
}
}
function instantiateList<T>(items: T[], mapper: TypeMapper, instantiator: (item: T, mapper: TypeMapper) => T): T[];
function instantiateList<T>(items: T[] | undefined, mapper: TypeMapper, instantiator: (item: T, mapper: TypeMapper) => T): T[] | undefined;
function instantiateList<T>(items: T[] | undefined, mapper: TypeMapper, instantiator: (item: T, mapper: TypeMapper) => T): T[] | undefined {
function instantiateList<T>(items: ReadonlyArray<T>, mapper: TypeMapper, instantiator: (item: T, mapper: TypeMapper) => T): ReadonlyArray<T>;
function instantiateList<T>(items: ReadonlyArray<T> | undefined, mapper: TypeMapper, instantiator: (item: T, mapper: TypeMapper) => T): ReadonlyArray<T> | undefined;
function instantiateList<T>(items: ReadonlyArray<T> | undefined, mapper: TypeMapper, instantiator: (item: T, mapper: TypeMapper) => T): ReadonlyArray<T> | undefined {
if (items && items.length) {
for (let i = 0; i < items.length; i++) {
const item = items[i];
@ -9606,14 +9606,14 @@ namespace ts {
return items;
}
function instantiateTypes(types: Type[], mapper: TypeMapper): Type[];
function instantiateTypes(types: Type[] | undefined, mapper: TypeMapper): Type[] | undefined;
function instantiateTypes(types: Type[] | undefined, mapper: TypeMapper) {
return instantiateList(types, mapper, instantiateType);
function instantiateTypes(types: ReadonlyArray<Type>, mapper: TypeMapper): ReadonlyArray<Type>;
function instantiateTypes(types: ReadonlyArray<Type> | undefined, mapper: TypeMapper): ReadonlyArray<Type> | undefined;
function instantiateTypes(types: ReadonlyArray<Type> | undefined, mapper: TypeMapper): ReadonlyArray<Type> | undefined {
return instantiateList<Type>(types, mapper, instantiateType);
}
function instantiateSignatures(signatures: Signature[], mapper: TypeMapper): Signature[] {
return instantiateList(signatures, mapper, instantiateSignature);
function instantiateSignatures(signatures: ReadonlyArray<Signature>, mapper: TypeMapper): ReadonlyArray<Signature> {
return instantiateList<Signature>(signatures, mapper, instantiateSignature);
}
function makeUnaryTypeMapper(source: Type, target: Type) {
@ -9624,7 +9624,7 @@ namespace ts {
return (t: Type) => t === source1 ? target1 : t === source2 ? target2 : t;
}
function makeArrayTypeMapper(sources: Type[], targets: Type[] | undefined) {
function makeArrayTypeMapper(sources: ReadonlyArray<Type>, targets: ReadonlyArray<Type> | undefined) {
return (t: Type) => {
for (let i = 0; i < sources.length; i++) {
if (t === sources[i]) {
@ -9635,14 +9635,14 @@ namespace ts {
};
}
function createTypeMapper(sources: TypeParameter[], targets: Type[] | undefined): TypeMapper {
function createTypeMapper(sources: ReadonlyArray<TypeParameter>, targets: ReadonlyArray<Type> | undefined): TypeMapper {
Debug.assert(targets === undefined || sources.length === targets.length);
return sources.length === 1 ? makeUnaryTypeMapper(sources[0], targets ? targets[0] : anyType) :
sources.length === 2 ? makeBinaryTypeMapper(sources[0], targets ? targets[0] : anyType, sources[1], targets ? targets[1] : anyType) :
makeArrayTypeMapper(sources, targets);
}
function createTypeEraser(sources: TypeParameter[]): TypeMapper {
function createTypeEraser(sources: ReadonlyArray<TypeParameter>): TypeMapper {
return createTypeMapper(sources, /*targets*/ undefined);
}
@ -9650,7 +9650,7 @@ namespace ts {
* Maps forward-references to later types parameters to the empty object type.
* This is used during inference when instantiating type parameter defaults.
*/
function createBackreferenceMapper(typeParameters: TypeParameter[], index: number): TypeMapper {
function createBackreferenceMapper(typeParameters: ReadonlyArray<TypeParameter>, index: number): TypeMapper {
return t => typeParameters.indexOf(t) >= index ? emptyObjectType : t;
}
@ -12414,7 +12414,7 @@ namespace ts {
}
}
function createInferenceContext(typeParameters: TypeParameter[], signature: Signature | undefined, flags: InferenceFlags, compareTypes?: TypeComparer, baseInferences?: InferenceInfo[]): InferenceContext {
function createInferenceContext(typeParameters: ReadonlyArray<TypeParameter>, signature: Signature | undefined, flags: InferenceFlags, compareTypes?: TypeComparer, baseInferences?: InferenceInfo[]): InferenceContext {
const inferences = baseInferences ? baseInferences.map(cloneInferenceInfo) : typeParameters.map(createInferenceInfo);
const context = mapper as InferenceContext;
context.typeParameters = typeParameters;
@ -14257,7 +14257,7 @@ namespace ts {
if (!targetType) {
// Target type is type of construct signature
let constructSignatures: Signature[] | undefined;
let constructSignatures: ReadonlyArray<Signature> | undefined;
if (getObjectFlags(rightType) & ObjectFlags.Interface) {
constructSignatures = resolveDeclaredMembers(<InterfaceType>rightType).declaredConstructSignatures;
}
@ -14765,7 +14765,7 @@ namespace ts {
function checkThisBeforeSuper(node: Node, container: Node, diagnosticMessage: DiagnosticMessage) {
const containingClassDecl = <ClassDeclaration>container.parent;
const baseTypeNode = getClassExtendsHeritageClauseElement(containingClassDecl);
const baseTypeNode = getEffectiveBaseTypeNode(containingClassDecl);
// If a containing class does not have extends clause or the class extends null
// skip checking whether super statement is called before "this" accessing.
@ -15041,7 +15041,7 @@ namespace ts {
// at this point the only legal case for parent is ClassLikeDeclaration
const classLikeDeclaration = <ClassLikeDeclaration>container.parent;
if (!getClassExtendsHeritageClauseElement(classLikeDeclaration)) {
if (!getEffectiveBaseTypeNode(classLikeDeclaration)) {
error(node, Diagnostics.super_can_only_be_referenced_in_a_derived_class);
return errorType;
}
@ -16454,7 +16454,7 @@ namespace ts {
return links.resolvedSymbol;
}
function instantiateJsxSignatures(node: JsxOpeningLikeElement, signatures: Signature[]) {
function instantiateJsxSignatures(node: JsxOpeningLikeElement, signatures: ReadonlyArray<Signature>) {
const instantiatedSignatures = [];
let candidateForTypeArgumentError: Signature | undefined;
let hasTypeArgumentError: boolean = !!node.typeArguments;
@ -17684,7 +17684,7 @@ namespace ts {
// interface B extends A { (x: 'foo'): string }
// const b: B;
// b('foo') // <- here overloads should be processed as [(x:'foo'): string, (x: string): void]
function reorderCandidates(signatures: Signature[], result: Signature[]): void {
function reorderCandidates(signatures: ReadonlyArray<Signature>, result: Signature[]): void {
let lastParent: Node | undefined;
let lastSymbol: Symbol | undefined;
let cutoffIndex = 0;
@ -17893,7 +17893,7 @@ namespace ts {
// Above, the type of the 'value' parameter is inferred to be 'A'.
const contextualSignature = getSingleCallSignature(instantiatedType);
const inferenceSourceType = contextualSignature && contextualSignature.typeParameters ?
getOrCreateTypeFromSignature(getSignatureInstantiation(contextualSignature, contextualSignature.typeParameters, isInJavaScriptFile(node))) :
getOrCreateTypeFromSignature(getSignatureInstantiationWithoutFillingInTypeArguments(contextualSignature, contextualSignature.typeParameters)) :
instantiatedType;
const inferenceTargetType = getReturnTypeOfSignature(signature);
// Inferences made from return types have lower priority than all other inferences.
@ -18383,7 +18383,7 @@ namespace ts {
}
}
function getTypeArgumentArityError(node: Node, signatures: Signature[], typeArguments: NodeArray<TypeNode>) {
function getTypeArgumentArityError(node: Node, signatures: ReadonlyArray<Signature>, typeArguments: NodeArray<TypeNode>) {
let min = Infinity;
let max = -Infinity;
for (const sig of signatures) {
@ -18394,7 +18394,7 @@ namespace ts {
return createDiagnosticForNodeArray(getSourceFileOfNode(node), typeArguments, Diagnostics.Expected_0_type_arguments_but_got_1, paramCount, typeArguments.length);
}
function resolveCall(node: CallLikeExpression, signatures: Signature[], candidatesOutArray: Signature[] | undefined, fallbackError?: DiagnosticMessage): Signature {
function resolveCall(node: CallLikeExpression, signatures: ReadonlyArray<Signature>, candidatesOutArray: Signature[] | undefined, fallbackError?: DiagnosticMessage): Signature {
const isTaggedTemplate = node.kind === SyntaxKind.TaggedTemplateExpression;
const isDecorator = node.kind === SyntaxKind.Decorator;
const isJsxOpeningOrSelfClosingElement = isJsxOpeningLikeElement(node);
@ -18679,7 +18679,7 @@ namespace ts {
if (superType !== errorType) {
// In super call, the candidate signatures are the matching arity signatures of the base constructor function instantiated
// with the type arguments specified in the extends clause.
const baseTypeNode = getClassExtendsHeritageClauseElement(getContainingClass(node)!);
const baseTypeNode = getEffectiveBaseTypeNode(getContainingClass(node)!);
if (baseTypeNode) {
const baseConstructors = getInstantiatedConstructorsForTypeArguments(superType, baseTypeNode.typeArguments, baseTypeNode);
return resolveCall(node, baseConstructors, candidatesOutArray);
@ -18979,7 +18979,7 @@ namespace ts {
* but is receiving too many arguments as part of the decorator invocation.
* In those cases, a user may have meant to *call* the expression before using it as a decorator.
*/
function isPotentiallyUncalledDecorator(decorator: Decorator, signatures: Signature[]) {
function isPotentiallyUncalledDecorator(decorator: Decorator, signatures: ReadonlyArray<Signature>) {
return signatures.length && every(signatures, signature =>
signature.minArgumentCount === 0 &&
!signature.hasRestParameter &&
@ -21475,7 +21475,7 @@ namespace ts {
// Constructors of classes with no extends clause may not contain super calls, whereas
// constructors of derived classes must contain at least one super call somewhere in their function body.
const containingClassDecl = <ClassDeclaration>node.parent;
if (getClassExtendsHeritageClauseElement(containingClassDecl)) {
if (getEffectiveBaseTypeNode(containingClassDecl)) {
captureLexicalThis(node.parent, containingClassDecl);
const classExtendsNull = classDeclarationExtendsNull(containingClassDecl);
const superCall = getSuperCallInConstructor(node);
@ -21580,12 +21580,12 @@ namespace ts {
checkDecorators(node);
}
function getEffectiveTypeArguments(node: TypeReferenceNode | ExpressionWithTypeArguments, typeParameters: TypeParameter[]): Type[] {
function getEffectiveTypeArguments(node: TypeReferenceNode | ExpressionWithTypeArguments, typeParameters: ReadonlyArray<TypeParameter>): Type[] {
return fillMissingTypeArguments(map(node.typeArguments!, getTypeFromTypeNode), typeParameters,
getMinTypeArgumentCount(typeParameters), isInJavaScriptFile(node));
}
function checkTypeArgumentConstraints(node: TypeReferenceNode | ExpressionWithTypeArguments, typeParameters: TypeParameter[]): boolean {
function checkTypeArgumentConstraints(node: TypeReferenceNode | ExpressionWithTypeArguments, typeParameters: ReadonlyArray<TypeParameter>): boolean {
let typeArguments: Type[] | undefined;
let mapper: TypeMapper | undefined;
let result = true;
@ -22652,7 +22652,7 @@ namespace ts {
}
const name = getIdentifierFromEntityNameExpression(node.class.expression);
const extend = getClassExtendsHeritageClauseElement(classLike);
const extend = getClassExtendsHeritageElement(classLike);
if (extend) {
const className = getIdentifierFromEntityNameExpression(extend.expression);
if (className && name.escapedText !== className.escapedText) {
@ -22815,11 +22815,7 @@ namespace ts {
addDiagnostic(UnusedKind.Local, createDiagnosticForNode(node, message, name));
}
function parameterNameStartsWithUnderscore(parameterName: DeclarationName) {
return parameterName && isIdentifierThatStartsWithUnderScore(parameterName);
}
function isIdentifierThatStartsWithUnderScore(node: Node) {
function isIdentifierThatStartsWithUnderscore(node: Node) {
return isIdentifier(node) && idText(node).charCodeAt(0) === CharacterCodes._;
}
@ -22867,7 +22863,7 @@ namespace ts {
const typeParameters = getEffectiveTypeParameterDeclarations(node);
if (!(node.flags & NodeFlags.Ambient) && last(getSymbolOfNode(node).declarations) === node) {
for (const typeParameter of typeParameters) {
if (!(getMergedSymbol(typeParameter.symbol).isReferenced! & SymbolFlags.TypeParameter) && !isIdentifierThatStartsWithUnderScore(typeParameter.name)) {
if (!(getMergedSymbol(typeParameter.symbol).isReferenced! & SymbolFlags.TypeParameter) && !isIdentifierThatStartsWithUnderscore(typeParameter.name)) {
addDiagnostic(UnusedKind.Parameter, createDiagnosticForNode(typeParameter.name, Diagnostics._0_is_declared_but_its_value_is_never_read, symbolName(typeParameter.symbol)));
}
}
@ -22905,7 +22901,7 @@ namespace ts {
for (const declaration of local.declarations) {
if (isAmbientModule(declaration) ||
(isVariableDeclaration(declaration) && isForInOrOfStatement(declaration.parent.parent) || isImportedDeclaration(declaration)) && isIdentifierThatStartsWithUnderScore(declaration.name!)) {
(isVariableDeclaration(declaration) && isForInOrOfStatement(declaration.parent.parent) || isImportedDeclaration(declaration)) && isIdentifierThatStartsWithUnderscore(declaration.name!)) {
continue;
}
@ -22924,9 +22920,9 @@ namespace ts {
}
else {
const parameter = local.valueDeclaration && tryGetRootParameterDeclaration(local.valueDeclaration);
if (parameter) {
const name = getNameOfDeclaration(local.valueDeclaration);
if (!isParameterPropertyDeclaration(parameter) && !parameterIsThisKeyword(parameter) && !parameterNameStartsWithUnderscore(name)) {
const name = getNameOfDeclaration(local.valueDeclaration);
if (parameter && name) {
if (!isParameterPropertyDeclaration(parameter) && !parameterIsThisKeyword(parameter) && !isIdentifierThatStartsWithUnderscore(name)) {
addDiagnostic(UnusedKind.Parameter, createDiagnosticForNode(name, Diagnostics._0_is_declared_but_its_value_is_never_read, symbolName(local)));
}
}
@ -24221,18 +24217,19 @@ namespace ts {
}
const propDeclaration = prop.valueDeclaration;
const name = getNameOfDeclaration(propDeclaration);
// index is numeric and property name is not valid numeric literal
if (indexKind === IndexKind.Number && !(propDeclaration ? isNumericName(getNameOfDeclaration(propDeclaration)) : isNumericLiteralName(prop.escapedName))) {
if (indexKind === IndexKind.Number && !(name ? isNumericName(name) : isNumericLiteralName(prop.escapedName))) {
return;
}
// perform property check if property or indexer is declared in 'type'
// this allows us to rule out cases when both property and indexer are inherited from the base class
let errorNode: Node | undefined;
if (propDeclaration &&
if (propDeclaration && name &&
(propDeclaration.kind === SyntaxKind.BinaryExpression ||
getNameOfDeclaration(propDeclaration).kind === SyntaxKind.ComputedPropertyName ||
name.kind === SyntaxKind.ComputedPropertyName ||
prop.parent === containingType.symbol)) {
errorNode = propDeclaration;
}
@ -24427,7 +24424,7 @@ namespace ts {
checkClassForStaticPropertyNameConflicts(node);
}
const baseTypeNode = getClassExtendsHeritageClauseElement(node);
const baseTypeNode = getEffectiveBaseTypeNode(node);
if (baseTypeNode) {
if (languageVersion < ScriptTarget.ES2015) {
checkExternalEmitHelpers(baseTypeNode.parent, ExternalEmitHelpers.Extends);
@ -24440,6 +24437,10 @@ namespace ts {
const staticBaseType = getApparentType(baseConstructorType);
checkBaseTypeAccessibility(staticBaseType, baseTypeNode);
checkSourceElement(baseTypeNode.expression);
const extendsNode = getClassExtendsHeritageElement(node);
if (extendsNode && extendsNode !== baseTypeNode) {
checkExpression(extendsNode.expression);
}
if (some(baseTypeNode.typeArguments)) {
forEach(baseTypeNode.typeArguments, checkSourceElement);
for (const constructor of getConstructorsForTypeArguments(staticBaseType, baseTypeNode.typeArguments, baseTypeNode)) {
@ -27353,7 +27354,7 @@ namespace ts {
}
switch (modifier.kind) {
case SyntaxKind.ConstKeyword:
if (node.kind !== SyntaxKind.EnumDeclaration && node.parent.kind === SyntaxKind.ClassDeclaration) {
if (node.kind !== SyntaxKind.EnumDeclaration) {
return grammarErrorOnNode(node, Diagnostics.A_class_member_cannot_have_the_0_keyword, tokenToString(SyntaxKind.ConstKeyword));
}
break;

Просмотреть файл

@ -44,6 +44,7 @@ namespace ts {
["esnext.array", "lib.esnext.array.d.ts"],
["esnext.symbol", "lib.esnext.symbol.d.ts"],
["esnext.asynciterable", "lib.esnext.asynciterable.d.ts"],
["esnext.intl", "lib.esnext.intl.d.ts"]
];
/**

Просмотреть файл

@ -3636,7 +3636,7 @@
"category": "Message",
"code": 6353
},
"Project '{0}' is up to date with .d.ts files from its dependencies": {
"category": "Message",
"code": 6354
@ -3836,6 +3836,10 @@
"category": "Error",
"code": 7039
},
"If the '{0}' package actually exposes this module, consider sending a pull request to amend 'https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/{0}`": {
"category": "Error",
"code": 7040
},
"You cannot rename this element.": {
"category": "Error",
"code": 8000

Просмотреть файл

@ -192,6 +192,11 @@ namespace ts {
// Setup and perform the transformation to retrieve declarations from the input files
const nonJsFiles = filter(sourceFiles, isSourceFileNotJavaScript);
const inputListOrBundle = (compilerOptions.outFile || compilerOptions.out) ? [createBundle(nonJsFiles, !isSourceFile(sourceFileOrBundle) ? sourceFileOrBundle.prepends : undefined)] : nonJsFiles;
if (emitOnlyDtsFiles && !compilerOptions.declaration) {
// Checker wont collect the linked aliases since thats only done when declaration is enabled.
// Do that here when emitting only dts files
nonJsFiles.forEach(collectLinkedAliases);
}
const declarationTransform = transformNodes(resolver, host, compilerOptions, inputListOrBundle, concatenate([transformDeclarations], declarationTransformers), /*allowDtsFiles*/ false);
if (length(declarationTransform.diagnostics)) {
for (const diagnostic of declarationTransform.diagnostics!) {
@ -221,6 +226,20 @@ namespace ts {
declarationTransform.dispose();
}
function collectLinkedAliases(node: Node) {
if (isExportAssignment(node)) {
if (node.expression.kind === SyntaxKind.Identifier) {
resolver.collectLinkedAliases(node.expression as Identifier, /*setVisibility*/ true);
}
return;
}
else if (isExportSpecifier(node)) {
resolver.collectLinkedAliases(node.propertyName || node.name, /*setVisibility*/ true);
return;
}
forEachChild(node, collectLinkedAliases);
}
function printSourceFileOrBundle(jsFilePath: string, sourceMapFilePath: string | undefined, sourceFileOrBundle: SourceFile | Bundle, bundleInfoPath: string | undefined, printer: Printer, mapRecorder: SourceMapWriter) {
const bundle = sourceFileOrBundle.kind === SyntaxKind.Bundle ? sourceFileOrBundle : undefined;
const sourceFile = sourceFileOrBundle.kind === SyntaxKind.SourceFile ? sourceFileOrBundle : undefined;

Просмотреть файл

@ -194,10 +194,10 @@ namespace ts {
}
/** Create a unique name generated for a node. */
export function getGeneratedNameForNode(node: Node): Identifier;
/* @internal */ export function getGeneratedNameForNode(node: Node, flags: GeneratedIdentifierFlags): Identifier; // tslint:disable-line unified-signatures
export function getGeneratedNameForNode(node: Node, flags?: GeneratedIdentifierFlags): Identifier {
const name = createIdentifier(isIdentifier(node) ? idText(node) : "");
export function getGeneratedNameForNode(node: Node | undefined): Identifier;
/* @internal */ export function getGeneratedNameForNode(node: Node | undefined, flags: GeneratedIdentifierFlags): Identifier; // tslint:disable-line unified-signatures
export function getGeneratedNameForNode(node: Node | undefined, flags?: GeneratedIdentifierFlags): Identifier {
const name = createIdentifier(node && isIdentifier(node) ? idText(node) : "");
name.autoGenerateFlags = GeneratedIdentifierFlags.Node | flags!;
name.autoGenerateId = nextAutoGenerateId;
name.original = node;

Просмотреть файл

@ -1022,7 +1022,7 @@ namespace ts {
}
const members = createNodeArray(concatenate(parameterProperties, visitNodes(input.members, visitDeclarationSubtree)));
const extendsClause = getClassExtendsHeritageClauseElement(input);
const extendsClause = getEffectiveBaseTypeNode(input);
if (extendsClause && !isEntityNameExpression(extendsClause.expression) && extendsClause.expression.kind !== SyntaxKind.NullKeyword) {
// We must add a temporary declaration for the extends clause expression

Просмотреть файл

@ -770,7 +770,7 @@ namespace ts {
enableSubstitutionsForBlockScopedBindings();
}
const extendsClauseElement = getClassExtendsHeritageClauseElement(node);
const extendsClauseElement = getEffectiveBaseTypeNode(node);
const classFunction = createFunctionExpression(
/*modifiers*/ undefined,
/*asteriskToken*/ undefined,

Просмотреть файл

@ -586,7 +586,7 @@ namespace ts {
function getClassFacts(node: ClassDeclaration, staticProperties: ReadonlyArray<PropertyDeclaration>) {
let facts = ClassFacts.None;
if (some(staticProperties)) facts |= ClassFacts.HasStaticInitializedProperties;
const extendsClauseElement = getClassExtendsHeritageClauseElement(node);
const extendsClauseElement = getEffectiveBaseTypeNode(node);
if (extendsClauseElement && skipOuterExpressions(extendsClauseElement.expression).kind !== SyntaxKind.NullKeyword) facts |= ClassFacts.IsDerivedClass;
if (shouldEmitDecorateCallForClass(node)) facts |= ClassFacts.HasConstructorDecorators;
if (childIsDecorated(node)) facts |= ClassFacts.HasMemberDecorators;

Просмотреть файл

@ -2861,7 +2861,7 @@ namespace ts {
getPropertiesOfType(type: Type): Symbol[];
getPropertyOfType(type: Type, propertyName: string): Symbol | undefined;
getIndexInfoOfType(type: Type, kind: IndexKind): IndexInfo | undefined;
getSignaturesOfType(type: Type, kind: SignatureKind): Signature[];
getSignaturesOfType(type: Type, kind: SignatureKind): ReadonlyArray<Signature>;
getIndexTypeOfType(type: Type, kind: IndexKind): Type | undefined;
getBaseTypes(type: InterfaceType): BaseType[];
getBaseTypeOfLiteralType(type: Type): Type;
@ -3073,6 +3073,7 @@ namespace ts {
Subtype
}
// NOTE: If modifying this enum, must modify `TypeFormatFlags` too!
export const enum NodeBuilderFlags {
None = 0,
// Options
@ -3337,7 +3338,7 @@ namespace ts {
getNodeCheckFlags(node: Node): NodeCheckFlags;
isDeclarationVisible(node: Declaration | AnyImportSyntax): boolean;
isLateBound(node: Declaration): node is LateBoundDeclaration;
collectLinkedAliases(node: Identifier): Node[] | undefined;
collectLinkedAliases(node: Identifier, setVisibility?: boolean): Node[] | undefined;
isImplementationOfOverload(node: FunctionLike): boolean | undefined;
isRequiredInitializedParameter(node: ParameterDeclaration): boolean;
isOptionalUninitializedParameterProperty(node: ParameterDeclaration): boolean;
@ -3741,7 +3742,7 @@ namespace ts {
symbol: Symbol; // Symbol associated with type (if any)
pattern?: DestructuringPattern; // Destructuring pattern represented by type (if any)
aliasSymbol?: Symbol; // Alias associated with type
aliasTypeArguments?: Type[]; // Alias type arguments (if any)
aliasTypeArguments?: ReadonlyArray<Type>; // Alias type arguments (if any)
/* @internal */
wildcardInstantiation?: Type; // Instantiation with type parameters mapped to wildcard type
}
@ -3835,7 +3836,7 @@ namespace ts {
*/
export interface TypeReference extends ObjectType {
target: GenericType; // Type reference target
typeArguments?: Type[]; // Type reference type arguments (undefined if none)
typeArguments?: ReadonlyArray<Type>; // Type reference type arguments (undefined if none)
}
/* @internal */
@ -3912,8 +3913,8 @@ namespace ts {
export interface ResolvedType extends ObjectType, UnionOrIntersectionType {
members: SymbolTable; // Properties by name
properties: Symbol[]; // Properties
callSignatures: Signature[]; // Call signatures of type
constructSignatures: Signature[]; // Construct signatures of type
callSignatures: ReadonlyArray<Signature>; // Call signatures of type
constructSignatures: ReadonlyArray<Signature>; // Construct signatures of type
stringIndexInfo?: IndexInfo; // String indexing info
numberIndexInfo?: IndexInfo; // Numeric indexing info
}
@ -4038,8 +4039,8 @@ namespace ts {
export interface Signature {
declaration?: SignatureDeclaration | JSDocSignature; // Originating declaration
typeParameters?: TypeParameter[]; // Type parameters (undefined if non-generic)
parameters: Symbol[]; // Parameters
typeParameters?: ReadonlyArray<TypeParameter>; // Type parameters (undefined if non-generic)
parameters: ReadonlyArray<Symbol>; // Parameters
/* @internal */
thisParameter?: Symbol; // symbol of this-type parameter
/* @internal */
@ -4138,11 +4139,11 @@ namespace ts {
/* @internal */
export interface InferenceContext extends TypeMapper {
typeParameters: TypeParameter[]; // Type parameters for which inferences are made
signature?: Signature; // Generic signature for which inferences are made (if any)
inferences: InferenceInfo[]; // Inferences made for each type parameter
flags: InferenceFlags; // Inference flags
compareTypes: TypeComparer; // Type comparer function
typeParameters: ReadonlyArray<TypeParameter>; // Type parameters for which inferences are made
signature?: Signature; // Generic signature for which inferences are made (if any)
inferences: InferenceInfo[]; // Inferences made for each type parameter
flags: InferenceFlags; // Inference flags
compareTypes: TypeComparer; // Type comparer function
}
/* @internal */

Просмотреть файл

@ -745,8 +745,8 @@ namespace ts {
// Return display name of an identifier
// Computed property names will just be emitted as "[<expr>]", where <expr> is the source
// text of the expression in the computed property.
export function declarationNameToString(name: DeclarationName | QualifiedName) {
return getFullWidth(name) === 0 ? "(Missing)" : getTextOfNode(name);
export function declarationNameToString(name: DeclarationName | QualifiedName | undefined) {
return !name || getFullWidth(name) === 0 ? "(Missing)" : getTextOfNode(name);
}
export function getNameFromIndexInfo(info: IndexInfo): string | undefined {
@ -2067,53 +2067,51 @@ namespace ts {
export function getJSDocCommentsAndTags(hostNode: Node): ReadonlyArray<JSDoc | JSDocTag> {
let result: (JSDoc | JSDocTag)[] | undefined;
getJSDocCommentsAndTagsWorker(hostNode);
return result || emptyArray;
// Pull parameter comments from declaring function as well
if (isVariableLike(hostNode) && hasInitializer(hostNode) && hasJSDocNodes(hostNode.initializer!)) {
result = addRange(result, (hostNode.initializer as HasJSDoc).jsDoc!);
}
function getJSDocCommentsAndTagsWorker(node: Node): void {
const parent = node.parent;
if (!parent) return;
if (parent.kind === SyntaxKind.PropertyAssignment || parent.kind === SyntaxKind.PropertyDeclaration || getNestedModuleDeclaration(parent)) {
getJSDocCommentsAndTagsWorker(parent);
}
// Try to recognize this pattern when node is initializer of variable declaration and JSDoc comments are on containing variable statement.
// /**
// * @param {number} name
// * @returns {number}
// */
// var x = function(name) { return name.length; }
if (parent.parent && (getSingleVariableOfVariableStatement(parent.parent) === node)) {
getJSDocCommentsAndTagsWorker(parent.parent);
}
if (parent.parent && parent.parent.parent &&
(getSingleVariableOfVariableStatement(parent.parent.parent) ||
getSingleInitializerOfVariableStatementOrPropertyDeclaration(parent.parent.parent) === node ||
getSourceOfDefaultedAssignment(parent.parent.parent))) {
getJSDocCommentsAndTagsWorker(parent.parent.parent);
}
if (isBinaryExpression(node) && node.operatorToken.kind === SyntaxKind.EqualsToken ||
isBinaryExpression(parent) && parent.operatorToken.kind === SyntaxKind.EqualsToken ||
node.kind === SyntaxKind.PropertyAccessExpression && node.parent && node.parent.kind === SyntaxKind.ExpressionStatement) {
if (isBinaryExpression(parent)) {
getJSDocCommentsAndTagsWorker(parent.parent);
}
else {
getJSDocCommentsAndTagsWorker(parent);
}
let node: Node | undefined = hostNode;
while (node && node.parent) {
if (hasJSDocNodes(node)) {
result = addRange(result, node.jsDoc!);
}
// Pull parameter comments from declaring function as well
if (node.kind === SyntaxKind.Parameter) {
result = addRange(result, getJSDocParameterTags(node as ParameterDeclaration));
break;
}
node = getNextJSDocCommentLocation(node);
}
return result || emptyArray;
}
if (isVariableLike(node) && hasInitializer(node) && node.initializer !== hostNode && hasJSDocNodes(node.initializer!)) {
result = addRange(result, (node.initializer as HasJSDoc).jsDoc);
}
if (hasJSDocNodes(node)) {
result = addRange(result, node.jsDoc);
}
function getNextJSDocCommentLocation(node: Node) {
const parent = node.parent;
if (parent.kind === SyntaxKind.PropertyAssignment ||
parent.kind === SyntaxKind.PropertyDeclaration ||
parent.kind === SyntaxKind.ExpressionStatement && node.kind === SyntaxKind.PropertyAccessExpression ||
getNestedModuleDeclaration(parent) ||
isBinaryExpression(node) && node.operatorToken.kind === SyntaxKind.EqualsToken) {
return parent;
}
// Try to recognize this pattern when node is initializer of variable declaration and JSDoc comments are on containing variable statement.
// /**
// * @param {number} name
// * @returns {number}
// */
// var x = function(name) { return name.length; }
else if (parent.parent &&
(getSingleVariableOfVariableStatement(parent.parent) === node ||
isBinaryExpression(parent) && parent.operatorToken.kind === SyntaxKind.EqualsToken)) {
return parent.parent;
}
else if (parent.parent && parent.parent.parent &&
(getSingleVariableOfVariableStatement(parent.parent.parent) ||
getSingleInitializerOfVariableStatementOrPropertyDeclaration(parent.parent.parent) === node ||
getSourceOfDefaultedAssignment(parent.parent.parent))) {
return parent.parent.parent;
}
}
@ -2415,7 +2413,18 @@ namespace ts {
return isEntityNameExpression(e) || isClassExpression(e);
}
export function getClassExtendsHeritageClauseElement(node: ClassLikeDeclaration | InterfaceDeclaration) {
export function getEffectiveBaseTypeNode(node: ClassLikeDeclaration | InterfaceDeclaration) {
if (isInJavaScriptFile(node)) {
// Prefer an @augments tag because it may have type parameters.
const tag = getJSDocAugmentsTag(node);
if (tag) {
return tag.class;
}
}
return getClassExtendsHeritageElement(node);
}
export function getClassExtendsHeritageElement(node: ClassLikeDeclaration | InterfaceDeclaration) {
const heritageClause = getHeritageClause(node.heritageClauses, SyntaxKind.ExtendsKeyword);
return heritageClause && heritageClause.types.length > 0 ? heritageClause.types[0] : undefined;
}
@ -2428,7 +2437,7 @@ namespace ts {
/** Returns the node in an `extends` or `implements` clause of a class or interface. */
export function getAllSuperTypeNodes(node: Node): ReadonlyArray<TypeNode> {
return isInterfaceDeclaration(node) ? getInterfaceBaseTypeNodes(node) || emptyArray
: isClassLike(node) ? concatenate(singleElementArray(getClassExtendsHeritageClauseElement(node)), getClassImplementsHeritageClauseElements(node)) || emptyArray
: isClassLike(node) ? concatenate(singleElementArray(getEffectiveBaseTypeNode(node)), getClassImplementsHeritageClauseElements(node)) || emptyArray
: emptyArray;
}
@ -4849,7 +4858,7 @@ namespace ts {
function getDeclarationIdentifier(node: Declaration | Expression): Identifier | undefined {
const name = getNameOfDeclaration(node);
return isIdentifier(name) ? name : undefined;
return name && isIdentifier(name) ? name : undefined;
}
export function getNameOfJSDocTypedef(declaration: JSDocTypedefTag): Identifier | undefined {
@ -4861,16 +4870,15 @@ namespace ts {
return !!(node as NamedDeclaration).name; // A 'name' property should always be a DeclarationName.
}
// TODO: GH#18217 This is often used as if it returns a defined result
export function getNameOfDeclaration(declaration: Declaration | Expression): DeclarationName {
export function getNameOfDeclaration(declaration: Declaration | Expression): DeclarationName | undefined {
if (!declaration) {
return undefined!;
return undefined;
}
switch (declaration.kind) {
case SyntaxKind.ClassExpression:
case SyntaxKind.FunctionExpression:
if (!(declaration as ClassExpression | FunctionExpression).name) {
return getAssignedName(declaration)!;
return getAssignedName(declaration);
}
break;
case SyntaxKind.Identifier:
@ -4892,19 +4900,19 @@ namespace ts {
case SpecialPropertyAssignmentKind.PrototypeProperty:
return (expr.left as PropertyAccessExpression).name;
default:
return undefined!;
return undefined;
}
}
case SyntaxKind.JSDocCallbackTag:
return (declaration as JSDocCallbackTag).name!;
return (declaration as JSDocCallbackTag).name;
case SyntaxKind.JSDocTypedefTag:
return getNameOfJSDocTypedef(declaration as JSDocTypedefTag)!;
return getNameOfJSDocTypedef(declaration as JSDocTypedefTag);
case SyntaxKind.ExportAssignment: {
const { expression } = declaration as ExportAssignment;
return isIdentifier(expression) ? expression : undefined!;
return isIdentifier(expression) ? expression : undefined;
}
}
return (declaration as NamedDeclaration).name!;
return (declaration as NamedDeclaration).name;
}
function getAssignedName(node: Node): DeclarationName | undefined {

Просмотреть файл

@ -3045,6 +3045,10 @@ Actual: ${stringify(fullActual)}`);
}
}
public verifyRefactorsAvailable(names: ReadonlyArray<string>): void {
assert.deepEqual(unique(this.getApplicableRefactors(this.getSelection()), r => r.name), names);
}
public verifyRefactor({ name, actionName, refactors }: FourSlashInterface.VerifyRefactorOptions) {
const actualRefactors = this.getApplicableRefactors(this.getSelection()).filter(r => r.name === name && r.actions.some(a => a.name === actionName));
this.assertObjectsEqual(actualRefactors, refactors);
@ -3815,7 +3819,7 @@ ${code}
}
/** Collects an array of unique outputs. */
function unique<T>(inputs: T[], getOutput: (t: T) => string): string[] {
function unique<T>(inputs: ReadonlyArray<T>, getOutput: (t: T) => string): string[] {
const set = ts.createMap<true>();
for (const input of inputs) {
const out = getOutput(input);
@ -4106,6 +4110,10 @@ namespace FourSlashInterface {
this.state.verifyApplicableRefactorAvailableForRange(this.negative);
}
public refactorsAvailable(names: ReadonlyArray<string>): void {
this.state.verifyRefactorsAvailable(names);
}
public refactor(options: VerifyRefactorOptions) {
this.state.verifyRefactor(options);
}

Просмотреть файл

@ -571,7 +571,9 @@ interface Array<T> {}`
}
private addFileOrFolderInFolder(folder: FsFolder, fileOrDirectory: FsFile | FsFolder | FsSymLink, ignoreWatch?: boolean) {
insertSorted(folder.entries, fileOrDirectory, (a, b) => compareStringsCaseSensitive(getBaseFileName(a.path), getBaseFileName(b.path)));
if (!this.fs.has(fileOrDirectory.path)) {
insertSorted(folder.entries, fileOrDirectory, (a, b) => compareStringsCaseSensitive(getBaseFileName(a.path), getBaseFileName(b.path)));
}
folder.modifiedTime = this.now();
this.fs.set(fileOrDirectory.path, fileOrDirectory);

1
src/lib/esnext.d.ts поставляемый
Просмотреть файл

@ -2,3 +2,4 @@
/// <reference lib="esnext.asynciterable" />
/// <reference lib="esnext.array" />
/// <reference lib="esnext.symbol" />
/// <reference lib="esnext.intl" />

12
src/lib/esnext.intl.d.ts поставляемый Normal file
Просмотреть файл

@ -0,0 +1,12 @@
declare namespace Intl {
type NumberFormatPartTypes = "currency" | "decimal" | "fraction" | "group" | "infinity" | "integer" | "literal" | "minusSign" | "nan" | "plusSign" | "percentSign";
interface NumberFormatPart {
type: NumberFormatPartTypes;
value: string;
}
interface NumberFormat {
formatToParts(number?: number): NumberFormatPart[];
}
}

Просмотреть файл

@ -35,6 +35,7 @@
"esnext.asynciterable",
"esnext.array",
"esnext.symbol",
"esnext.intl",
// Default libraries
"es5.full",
"es2015.full",
@ -50,4 +51,4 @@
"es5.full": "lib.d.ts",
"es2015.full": "lib.es6.d.ts"
}
}
}

Просмотреть файл

@ -487,7 +487,7 @@
<Str Cat="Text">
<Val><![CDATA[A non-dry build would build project '{0}']]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[非 DRY 的組建會建置專案 '{0}']]></Val>
<Val><![CDATA[非 -dry 組建會建置專案 '{0}']]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
@ -496,7 +496,7 @@
<Str Cat="Text">
<Val><![CDATA[A non-dry build would delete the following files: {0}]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[非 DRY 的組建會刪除下列檔案: {0}]]></Val>
<Val><![CDATA[非 -dry 組建會刪除下列檔案: {0}]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />

Просмотреть файл

@ -480,7 +480,7 @@
<Str Cat="Text">
<Val><![CDATA[A non-dry build would build project '{0}']]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Kompilacja inna niż DRY spowodowałaby skompilowanie projektu „{0}”]]></Val>
<Val><![CDATA[Kompilacja inna niż -dry spowodowałaby skompilowanie projektu „{0}”]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
@ -489,7 +489,7 @@
<Str Cat="Text">
<Val><![CDATA[A non-dry build would delete the following files: {0}]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Kompilacja inna niż DRY spowodowałaby usunięcie następujących plików: {0}]]></Val>
<Val><![CDATA[Kompilacja inna niż -dry spowodowałaby usunięcie następujących plików: {0}]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />

Просмотреть файл

@ -480,7 +480,7 @@
<Str Cat="Text">
<Val><![CDATA[A non-dry build would build project '{0}']]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Um build não dry compilaria o projeto '{0}']]></Val>
<Val><![CDATA[Um build não -dry compilaria o projeto '{0}']]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
@ -489,7 +489,7 @@
<Str Cat="Text">
<Val><![CDATA[A non-dry build would delete the following files: {0}]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Um build não dry excluiria os seguintes arquivos: {0}]]></Val>
<Val><![CDATA[Um build não -dry excluiria os seguintes arquivos: {0}]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />

Просмотреть файл

@ -14,7 +14,9 @@ namespace ts.server.protocol {
GetSpanOfEnclosingComment = "getSpanOfEnclosingComment",
Change = "change",
Close = "close",
/** @deprecated Prefer CompletionInfo -- see comment on CompletionsResponse */
Completions = "completions",
CompletionInfo = "completionInfo",
/* @internal */
CompletionsFull = "completions-full",
CompletionDetails = "completionEntryDetails",
@ -1943,10 +1945,22 @@ namespace ts.server.protocol {
source?: SymbolDisplayPart[];
}
/** @deprecated Prefer CompletionInfoResponse, which supports several top-level fields in addition to the array of entries. */
export interface CompletionsResponse extends Response {
body?: CompletionEntry[];
}
export interface CompletionInfoResponse extends Response {
body?: CompletionInfo;
}
export interface CompletionInfo {
readonly isGlobalCompletion: boolean;
readonly isMemberCompletion: boolean;
readonly isNewIdentifierLocation: boolean;
readonly entries: ReadonlyArray<CompletionEntry>;
}
export interface CompletionDetailsResponse extends Response {
body?: CompletionEntryDetails[];
}

Просмотреть файл

@ -1343,8 +1343,7 @@ namespace ts.server {
});
}
private getCompletions(args: protocol.CompletionsRequestArgs, simplifiedResult: boolean): ReadonlyArray<protocol.CompletionEntry> | CompletionInfo | undefined {
const prefix = args.prefix || "";
private getCompletions(args: protocol.CompletionsRequestArgs, kind: protocol.CommandTypes.CompletionInfo | protocol.CommandTypes.Completions | protocol.CommandTypes.CompletionsFull): ReadonlyArray<protocol.CompletionEntry> | protocol.CompletionInfo | CompletionInfo | undefined {
const { file, project } = this.getFileAndProject(args);
const scriptInfo = this.projectService.getScriptInfoForNormalizedPath(file)!;
const position = this.getPosition(args, scriptInfo);
@ -1355,19 +1354,27 @@ namespace ts.server {
includeExternalModuleExports: args.includeExternalModuleExports,
includeInsertTextCompletions: args.includeInsertTextCompletions
});
if (simplifiedResult) {
return mapDefined<CompletionEntry, protocol.CompletionEntry>(completions && completions.entries, entry => {
if (completions!.isMemberCompletion || startsWith(entry.name.toLowerCase(), prefix.toLowerCase())) {
const { name, kind, kindModifiers, sortText, insertText, replacementSpan, hasAction, source, isRecommended } = entry;
const convertedSpan = replacementSpan ? this.toLocationTextSpan(replacementSpan, scriptInfo) : undefined;
// Use `hasAction || undefined` to avoid serializing `false`.
return { name, kind, kindModifiers, sortText, insertText, replacementSpan: convertedSpan, hasAction: hasAction || undefined, source, isRecommended };
}
}).sort((a, b) => compareStringsCaseSensitiveUI(a.name, b.name));
}
else {
return completions;
}
if (completions === undefined) return undefined;
if (kind === protocol.CommandTypes.CompletionsFull) return completions;
const prefix = args.prefix || "";
const entries = mapDefined<CompletionEntry, protocol.CompletionEntry>(completions.entries, entry => {
if (completions.isMemberCompletion || startsWith(entry.name.toLowerCase(), prefix.toLowerCase())) {
const { name, kind, kindModifiers, sortText, insertText, replacementSpan, hasAction, source, isRecommended } = entry;
const convertedSpan = replacementSpan ? this.toLocationTextSpan(replacementSpan, scriptInfo) : undefined;
// Use `hasAction || undefined` to avoid serializing `false`.
return { name, kind, kindModifiers, sortText, insertText, replacementSpan: convertedSpan, hasAction: hasAction || undefined, source, isRecommended };
}
}).sort((a, b) => compareStringsCaseSensitiveUI(a.name, b.name));
if (kind === protocol.CommandTypes.Completions) return entries;
const res: protocol.CompletionInfo = {
...completions,
entries,
};
return res;
}
private getCompletionEntryDetails(args: protocol.CompletionDetailsRequestArgs, simplifiedResult: boolean): ReadonlyArray<protocol.CompletionEntryDetails> | ReadonlyArray<CompletionEntryDetails> {
@ -2035,11 +2042,14 @@ namespace ts.server {
[CommandNames.FormatRangeFull]: (request: protocol.FormatRequest) => {
return this.requiredResponse(this.getFormattingEditsForRangeFull(request.arguments));
},
[CommandNames.CompletionInfo]: (request: protocol.CompletionsRequest) => {
return this.requiredResponse(this.getCompletions(request.arguments, CommandNames.CompletionInfo));
},
[CommandNames.Completions]: (request: protocol.CompletionsRequest) => {
return this.requiredResponse(this.getCompletions(request.arguments, /*simplifiedResult*/ true));
return this.requiredResponse(this.getCompletions(request.arguments, CommandNames.Completions));
},
[CommandNames.CompletionsFull]: (request: protocol.CompletionsRequest) => {
return this.requiredResponse(this.getCompletions(request.arguments, /*simplifiedResult*/ false));
return this.requiredResponse(this.getCompletions(request.arguments, CommandNames.CompletionsFull));
},
[CommandNames.CompletionDetails]: (request: protocol.CompletionDetailsRequest) => {
return this.requiredResponse(this.getCompletionEntryDetails(request.arguments, /*simplifiedResult*/ true));

Просмотреть файл

@ -32,7 +32,7 @@ namespace ts.codefix {
// Always prefer to add a method declaration if possible.
if (call) {
addMethodDeclaration(changes, classDeclarationSourceFile, classDeclaration, token, call, makeStatic, inJs, preferences);
addMethodDeclaration(context, changes, classDeclarationSourceFile, classDeclaration, token, call, makeStatic, inJs, preferences);
}
else {
if (inJs) {
@ -184,11 +184,12 @@ namespace ts.codefix {
inJs: boolean,
preferences: UserPreferences,
): CodeFixAction | undefined {
const changes = textChanges.ChangeTracker.with(context, t => addMethodDeclaration(t, classDeclarationSourceFile, classDeclaration, token, callExpression, makeStatic, inJs, preferences));
const changes = textChanges.ChangeTracker.with(context, t => addMethodDeclaration(context, t, classDeclarationSourceFile, classDeclaration, token, callExpression, makeStatic, inJs, preferences));
return createCodeFixAction(fixName, changes, [makeStatic ? Diagnostics.Declare_static_method_0 : Diagnostics.Declare_method_0, token.text], fixId, Diagnostics.Add_all_missing_members);
}
function addMethodDeclaration(
context: CodeFixContextBase,
changeTracker: textChanges.ChangeTracker,
classDeclarationSourceFile: SourceFile,
classDeclaration: ClassLikeDeclaration,
@ -198,7 +199,7 @@ namespace ts.codefix {
inJs: boolean,
preferences: UserPreferences,
): void {
const methodDeclaration = createMethodFromCallExpression(callExpression, token.text, inJs, makeStatic, preferences);
const methodDeclaration = createMethodFromCallExpression(context, callExpression, token.text, inJs, makeStatic, preferences);
const containingMethodDeclaration = getAncestor(callExpression, SyntaxKind.MethodDeclaration);
if (containingMethodDeclaration && containingMethodDeclaration.parent === classDeclaration) {

Просмотреть файл

@ -33,7 +33,7 @@ namespace ts.codefix {
}
function addMissingMembers(classDeclaration: ClassLikeDeclaration, sourceFile: SourceFile, checker: TypeChecker, changeTracker: textChanges.ChangeTracker, preferences: UserPreferences): void {
const extendsNode = getClassExtendsHeritageClauseElement(classDeclaration)!;
const extendsNode = getEffectiveBaseTypeNode(classDeclaration)!;
const instantiatedExtendsType = checker.getTypeAtLocation(extendsNode)!;
// Note that this is ultimately derived from a map indexed by symbol names,

Просмотреть файл

@ -71,7 +71,7 @@ namespace ts.codefix {
}
function getHeritageClauseSymbolTable (classDeclaration: ClassLikeDeclaration, checker: TypeChecker): SymbolTable {
const heritageClauseNode = getClassExtendsHeritageClauseElement(classDeclaration);
const heritageClauseNode = getEffectiveBaseTypeNode(classDeclaration);
if (!heritageClauseNode) return createSymbolTable();
const heritageClauseType = checker.getTypeAtLocation(heritageClauseNode) as InterfaceType;
const heritageClauseTypeSymbols = checker.getPropertiesOfType(heritageClauseType);

Просмотреть файл

@ -173,8 +173,8 @@ namespace ts.codefix {
const typeParameters = getEffectiveTypeParameterDeclarations(<DeclarationWithTypeParameters>parent.parent);
if (typeParameters.length === 1) {
const { pos, end } = cast(typeParameters, isNodeArray);
const previousToken = getTokenAtPosition(sourceFile, pos - 1, /*includeJsDocComment*/ false);
const nextToken = getTokenAtPosition(sourceFile, end, /*includeJsDocComment*/ false);
const previousToken = getTokenAtPosition(sourceFile, pos - 1, /*includeJsDocComment*/ true);
const nextToken = getTokenAtPosition(sourceFile, end, /*includeJsDocComment*/ true);
Debug.assert(previousToken.kind === SyntaxKind.LessThanToken);
Debug.assert(nextToken.kind === SyntaxKind.GreaterThanToken);

Просмотреть файл

@ -111,12 +111,27 @@ namespace ts.codefix {
}
export function createMethodFromCallExpression(
context: CodeFixContextBase,
{ typeArguments, arguments: args, parent: parent }: CallExpression,
methodName: string,
inJs: boolean,
makeStatic: boolean,
preferences: UserPreferences,
): MethodDeclaration {
const checker = context.program.getTypeChecker();
const types = map(args,
arg => {
let type = checker.getTypeAtLocation(arg);
if (type === undefined) {
return undefined;
}
// Widen the type so we don't emit nonsense annotations like "function fn(x: 3) {"
type = checker.getBaseTypeOfLiteralType(type);
return checker.typeToTypeNode(type);
});
const names = map(args, arg =>
isIdentifier(arg) ? arg.text :
isPropertyAccessExpression(arg) ? arg.name.text : undefined);
return createMethod(
/*decorators*/ undefined,
/*modifiers*/ makeStatic ? [createToken(SyntaxKind.StaticKeyword)] : undefined,
@ -125,12 +140,12 @@ namespace ts.codefix {
/*questionToken*/ undefined,
/*typeParameters*/ inJs ? undefined : map(typeArguments, (_, i) =>
createTypeParameterDeclaration(CharacterCodes.T + typeArguments!.length - 1 <= CharacterCodes.Z ? String.fromCharCode(CharacterCodes.T + i) : `T${i}`)),
/*parameters*/ createDummyParameters(args.length, /*names*/ undefined, /*minArgumentCount*/ undefined, inJs),
/*parameters*/ createDummyParameters(args.length, names, types, /*minArgumentCount*/ undefined, inJs),
/*type*/ inJs ? undefined : createKeywordTypeNode(SyntaxKind.AnyKeyword),
createStubbedMethodBody(preferences));
}
function createDummyParameters(argCount: number, names: string[] | undefined, minArgumentCount: number | undefined, inJs: boolean): ParameterDeclaration[] {
function createDummyParameters(argCount: number, names: (string | undefined)[] | undefined, types: (TypeNode | undefined)[] | undefined, minArgumentCount: number | undefined, inJs: boolean): ParameterDeclaration[] {
const parameters: ParameterDeclaration[] = [];
for (let i = 0; i < argCount; i++) {
const newParameter = createParameter(
@ -139,7 +154,7 @@ namespace ts.codefix {
/*dotDotDotToken*/ undefined,
/*name*/ names && names[i] || `arg${i}`,
/*questionToken*/ minArgumentCount !== undefined && i >= minArgumentCount ? createToken(SyntaxKind.QuestionToken) : undefined,
/*type*/ inJs ? undefined : createKeywordTypeNode(SyntaxKind.AnyKeyword),
/*type*/ inJs ? undefined : types && types[i] || createKeywordTypeNode(SyntaxKind.AnyKeyword),
/*initializer*/ undefined);
parameters.push(newParameter);
}
@ -172,7 +187,7 @@ namespace ts.codefix {
const maxNonRestArgs = maxArgsSignature.parameters.length - (maxArgsSignature.hasRestParameter ? 1 : 0);
const maxArgsParameterSymbolNames = maxArgsSignature.parameters.map(symbol => symbol.name);
const parameters = createDummyParameters(maxNonRestArgs, maxArgsParameterSymbolNames, minArgumentCount, /*inJs*/ false);
const parameters = createDummyParameters(maxNonRestArgs, maxArgsParameterSymbolNames, /* types */ undefined, minArgumentCount, /*inJs*/ false);
if (someSigHasRestParameter) {
const anyArrayType = createArrayTypeNode(createKeywordTypeNode(SyntaxKind.AnyKeyword));

Просмотреть файл

@ -33,8 +33,9 @@ namespace ts.codefix {
const token = getTokenAtPosition(sourceFile, start, /*includeJsDocComment*/ false);
let declaration!: Declaration | undefined;
const changes = textChanges.ChangeTracker.with(context, changes => { declaration = doChange(changes, sourceFile, token, errorCode, program, cancellationToken, /*markSeenseen*/ returnTrue); });
return changes.length === 0 ? undefined
: [createCodeFixAction(fixId, changes, [getDiagnostic(errorCode, token), getNameOfDeclaration(declaration!).getText(sourceFile)], fixId, Diagnostics.Infer_all_types_from_usage)];
const name = getNameOfDeclaration(declaration!);
return !name || changes.length === 0 ? undefined
: [createCodeFixAction(fixId, changes, [getDiagnostic(errorCode, token), name.getText(sourceFile)], fixId, Diagnostics.Infer_all_types_from_usage)];
},
fixIds: [fixId],
getAllCodeActions(context) {

Просмотреть файл

@ -1122,7 +1122,7 @@ namespace ts.Completions {
// If this is e.g. [Symbol.iterator], add a completion for `Symbol`.
const symbolSymbol = firstDefined(symbol.declarations, decl => {
const name = getNameOfDeclaration(decl);
const leftName = name.kind === SyntaxKind.ComputedPropertyName ? getLeftMostName(name.expression) : undefined;
const leftName = name && name.kind === SyntaxKind.ComputedPropertyName ? getLeftMostName(name.expression) : undefined;
return leftName && typeChecker.getSymbolAtLocation(leftName);
});
if (symbolSymbol) {
@ -1966,7 +1966,7 @@ namespace ts.Completions {
// NOTE: if one only performs this step when m.name is an identifier,
// things like '__proto__' are not filtered out.
const name = getNameOfDeclaration(m);
existingName = isPropertyNameLiteral(name) ? getEscapedTextOfIdentifierOrLiteral(name) : undefined;
existingName = name && isPropertyNameLiteral(name) ? getEscapedTextOfIdentifierOrLiteral(name) : undefined;
}
existingMemberNames.set(existingName!, true); // TODO: GH#18217

Просмотреть файл

@ -981,6 +981,7 @@ namespace ts.FindAllReferences.Core {
function getReferenceForShorthandProperty({ flags, valueDeclaration }: Symbol, search: Search, state: State): void {
const shorthandValueSymbol = state.checker.getShorthandAssignmentValueSymbol(valueDeclaration)!;
const name = getNameOfDeclaration(valueDeclaration);
/*
* Because in short-hand property assignment, an identifier which stored as name of the short-hand property assignment
* has two meanings: property name and property value. Therefore when we do findAllReference at the position where
@ -988,8 +989,8 @@ namespace ts.FindAllReferences.Core {
* the position in short-hand property assignment excluding property accessing. However, if we do findAllReference at the
* position of property accessing, the referenceEntry of such position will be handled in the first case.
*/
if (!(flags & SymbolFlags.Transient) && search.includes(shorthandValueSymbol)) {
addReference(getNameOfDeclaration(valueDeclaration), shorthandValueSymbol, state);
if (!(flags & SymbolFlags.Transient) && name && search.includes(shorthandValueSymbol)) {
addReference(name, shorthandValueSymbol, state);
}
}

Просмотреть файл

@ -512,7 +512,10 @@ namespace ts.formatting {
// falls through
case SyntaxKind.PropertyDeclaration:
case SyntaxKind.Parameter:
return getNameOfDeclaration(<Declaration>node).kind;
const name = getNameOfDeclaration(<Declaration>node);
if (name) {
return name.kind;
}
}
}

Просмотреть файл

@ -113,7 +113,7 @@ namespace ts.NavigateTo {
// First, if we started with a computed property name, then add all but the last
// portion into the container array.
const name = getNameOfDeclaration(declaration);
if (name.kind === SyntaxKind.ComputedPropertyName && !tryAddComputedPropertyName(name.expression, containers, /*includeLastPortion*/ false)) {
if (name && name.kind === SyntaxKind.ComputedPropertyName && !tryAddComputedPropertyName(name.expression, containers, /*includeLastPortion*/ false)) {
return undefined;
}

Просмотреть файл

@ -277,7 +277,7 @@ namespace ts.NavigationBar {
case SpecialPropertyAssignmentKind.PrototypeProperty:
case SpecialPropertyAssignmentKind.Prototype:
addNodeWithRecursiveChild(node, (node as BinaryExpression).right);
break;
return;
case SpecialPropertyAssignmentKind.ThisProperty:
case SpecialPropertyAssignmentKind.Property:
case SpecialPropertyAssignmentKind.None:

Просмотреть файл

@ -9,20 +9,19 @@ namespace ts.refactor.generateGetAccessorAndSetAccessor {
type ContainerDeclaration = ClassLikeDeclaration | ObjectLiteralExpression;
interface Info {
container: ContainerDeclaration;
isStatic: boolean;
isReadonly: boolean;
type: TypeNode | undefined;
declaration: AcceptedDeclaration;
fieldName: AcceptedNameType;
accessorName: AcceptedNameType;
originalName: AcceptedNameType;
renameAccessor: boolean;
readonly container: ContainerDeclaration;
readonly isStatic: boolean;
readonly isReadonly: boolean;
readonly type: TypeNode | undefined;
readonly declaration: AcceptedDeclaration;
readonly fieldName: AcceptedNameType;
readonly accessorName: AcceptedNameType;
readonly originalName: AcceptedNameType;
readonly renameAccessor: boolean;
}
function getAvailableActions(context: RefactorContext): ApplicableRefactorInfo[] | undefined {
const { file } = context;
if (!getConvertibleFieldAtPosition(context, file)) return undefined;
if (!getConvertibleFieldAtPosition(context)) return undefined;
return [{
name: actionName,
@ -39,7 +38,7 @@ namespace ts.refactor.generateGetAccessorAndSetAccessor {
function getEditsForAction(context: RefactorContext, _actionName: string): RefactorEditInfo | undefined {
const { file } = context;
const fieldInfo = getConvertibleFieldAtPosition(context, file);
const fieldInfo = getConvertibleFieldAtPosition(context);
if (!fieldInfo) return undefined;
const isJS = isSourceFileJavaScript(file);
@ -117,14 +116,14 @@ namespace ts.refactor.generateGetAccessorAndSetAccessor {
return name.charCodeAt(0) === CharacterCodes._;
}
function getConvertibleFieldAtPosition(context: RefactorContext, file: SourceFile): Info | undefined {
const { startPosition, endPosition } = context;
function getConvertibleFieldAtPosition(context: RefactorContext): Info | undefined {
const { file, startPosition, endPosition } = context;
const node = getTokenAtPosition(file, startPosition, /*includeJsDocComment*/ false);
const declaration = findAncestor(node.parent, isAcceptedDeclaration);
// make sure declaration have AccessibilityModifier or Static Modifier or Readonly Modifier
const meaning = ModifierFlags.AccessibilityModifier | ModifierFlags.Static | ModifierFlags.Readonly;
if (!declaration || !rangeOverlapsWithStartEnd(declaration.name, startPosition, endPosition!) // TODO: GH#18217
if (!declaration || !nodeOverlapsWithStartEnd(declaration.name, file, startPosition, endPosition!) // TODO: GH#18217
|| !isConvertibleName(declaration.name) || (getModifierFlags(declaration) | meaning) !== meaning) return undefined;
const name = declaration.name.text;

Просмотреть файл

@ -391,10 +391,10 @@ namespace ts {
getApparentProperties(): Symbol[] {
return this.checker.getAugmentedPropertiesOfType(this);
}
getCallSignatures(): Signature[] {
getCallSignatures(): ReadonlyArray<Signature> {
return this.checker.getSignaturesOfType(this, SignatureKind.Call);
}
getConstructSignatures(): Signature[] {
getConstructSignatures(): ReadonlyArray<Signature> {
return this.checker.getSignaturesOfType(this, SignatureKind.Construct);
}
getStringIndexType(): Type | undefined {

Просмотреть файл

@ -600,7 +600,7 @@ namespace ts.SymbolDisplay {
}
}
function addSignatureDisplayParts(signature: Signature, allSignatures: Signature[], flags = TypeFormatFlags.None) {
function addSignatureDisplayParts(signature: Signature, allSignatures: ReadonlyArray<Signature>, flags = TypeFormatFlags.None) {
addRange(displayParts, signatureToDisplayParts(typeChecker, signature, enclosingDeclaration, flags | TypeFormatFlags.WriteTypeArgumentsOfSignature));
if (allSignatures.length > 1) {
displayParts.push(spacePart());

Просмотреть файл

@ -44,8 +44,8 @@ namespace ts {
getProperties(): Symbol[];
getProperty(propertyName: string): Symbol | undefined;
getApparentProperties(): Symbol[];
getCallSignatures(): Signature[];
getConstructSignatures(): Signature[];
getCallSignatures(): ReadonlyArray<Signature>;
getConstructSignatures(): ReadonlyArray<Signature>;
getStringIndexType(): Type | undefined;
getNumberIndexType(): Type | undefined;
getBaseTypes(): BaseType[] | undefined;

Просмотреть файл

@ -439,6 +439,10 @@ namespace ts {
return startEndOverlapsWithStartEnd(r1.pos, r1.end, start, end);
}
export function nodeOverlapsWithStartEnd(node: Node, sourceFile: SourceFile, start: number, end: number) {
return startEndOverlapsWithStartEnd(node.getStart(sourceFile), node.end, start, end);
}
export function startEndOverlapsWithStartEnd(start1: number, end1: number, start2: number, end2: number) {
const start = Math.max(start1, start2);
const end = Math.min(end1, end2);
@ -944,7 +948,7 @@ namespace ts {
token = findPrecedingToken(token.getFullStart(), sourceFile);
if (!token || !isIdentifier(token)) return undefined;
if (!remainingLessThanTokens) {
return { called: token, nTypeArguments };
return isDeclarationName(token) ? undefined : { called: token, nTypeArguments };
}
remainingLessThanTokens--;
break;

Просмотреть файл

@ -57,7 +57,7 @@ namespace ts {
assertParseResult(["--lib", "es5,invalidOption", "0.ts"],
{
errors: [{
messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'esnext', 'dom', 'dom.iterable', 'webworker', 'webworker.importscripts', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.intl', 'es2018.promise', 'es2018.regexp', 'esnext.array', 'esnext.symbol', 'esnext.asynciterable'.",
messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'esnext', 'dom', 'dom.iterable', 'webworker', 'webworker.importscripts', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.intl', 'es2018.promise', 'es2018.regexp', 'esnext.array', 'esnext.symbol', 'esnext.asynciterable', 'esnext.intl'.",
category: Diagnostics.Argument_for_0_option_must_be_Colon_1.category,
code: Diagnostics.Argument_for_0_option_must_be_Colon_1.code,
file: undefined,
@ -259,7 +259,7 @@ namespace ts {
assertParseResult(["--lib", "es5,", "es7", "0.ts"],
{
errors: [{
messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'esnext', 'dom', 'dom.iterable', 'webworker', 'webworker.importscripts', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.intl', 'es2018.promise', 'es2018.regexp', 'esnext.array', 'esnext.symbol', 'esnext.asynciterable'.",
messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'esnext', 'dom', 'dom.iterable', 'webworker', 'webworker.importscripts', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.intl', 'es2018.promise', 'es2018.regexp', 'esnext.array', 'esnext.symbol', 'esnext.asynciterable', 'esnext.intl'.",
category: Diagnostics.Argument_for_0_option_must_be_Colon_1.category,
code: Diagnostics.Argument_for_0_option_must_be_Colon_1.code,
file: undefined,
@ -278,7 +278,7 @@ namespace ts {
assertParseResult(["--lib", "es5, ", "es7", "0.ts"],
{
errors: [{
messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'esnext', 'dom', 'dom.iterable', 'webworker', 'webworker.importscripts', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.intl', 'es2018.promise', 'es2018.regexp', 'esnext.array', 'esnext.symbol', 'esnext.asynciterable'.",
messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'esnext', 'dom', 'dom.iterable', 'webworker', 'webworker.importscripts', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.intl', 'es2018.promise', 'es2018.regexp', 'esnext.array', 'esnext.symbol', 'esnext.asynciterable', 'esnext.intl'.",
category: Diagnostics.Argument_for_0_option_must_be_Colon_1.category,
code: Diagnostics.Argument_for_0_option_must_be_Colon_1.code,
file: undefined,

Просмотреть файл

@ -263,7 +263,7 @@ namespace ts {
file: undefined,
start: 0,
length: 0,
messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'esnext', 'dom', 'dom.iterable', 'webworker', 'webworker.importscripts', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.intl', 'es2018.promise', 'es2018.regexp', 'esnext.array', 'esnext.symbol', 'esnext.asynciterable'.",
messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'esnext', 'dom', 'dom.iterable', 'webworker', 'webworker.importscripts', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.intl', 'es2018.promise', 'es2018.regexp', 'esnext.array', 'esnext.symbol', 'esnext.asynciterable', 'esnext.intl'.",
code: Diagnostics.Argument_for_0_option_must_be_Colon_1.code,
category: Diagnostics.Argument_for_0_option_must_be_Colon_1.category
}]
@ -294,7 +294,7 @@ namespace ts {
file: undefined,
start: 0,
length: 0,
messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'esnext', 'dom', 'dom.iterable', 'webworker', 'webworker.importscripts', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.intl', 'es2018.promise', 'es2018.regexp', 'esnext.array', 'esnext.symbol', 'esnext.asynciterable'.",
messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'esnext', 'dom', 'dom.iterable', 'webworker', 'webworker.importscripts', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.intl', 'es2018.promise', 'es2018.regexp', 'esnext.array', 'esnext.symbol', 'esnext.asynciterable', 'esnext.intl'.",
code: Diagnostics.Argument_for_0_option_must_be_Colon_1.code,
category: Diagnostics.Argument_for_0_option_must_be_Colon_1.category
}]
@ -325,7 +325,7 @@ namespace ts {
file: undefined,
start: 0,
length: 0,
messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'esnext', 'dom', 'dom.iterable', 'webworker', 'webworker.importscripts', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.intl', 'es2018.promise', 'es2018.regexp', 'esnext.array', 'esnext.symbol', 'esnext.asynciterable'.",
messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'esnext', 'dom', 'dom.iterable', 'webworker', 'webworker.importscripts', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.intl', 'es2018.promise', 'es2018.regexp', 'esnext.array', 'esnext.symbol', 'esnext.asynciterable', 'esnext.intl'.",
code: Diagnostics.Argument_for_0_option_must_be_Colon_1.code,
category: Diagnostics.Argument_for_0_option_must_be_Colon_1.category
}]
@ -356,7 +356,7 @@ namespace ts {
file: undefined,
start: 0,
length: 0,
messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'esnext', 'dom', 'dom.iterable', 'webworker', 'webworker.importscripts', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.intl', 'es2018.promise', 'es2018.regexp', 'esnext.array', 'esnext.symbol', 'esnext.asynciterable'.",
messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'esnext', 'dom', 'dom.iterable', 'webworker', 'webworker.importscripts', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.intl', 'es2018.promise', 'es2018.regexp', 'esnext.array', 'esnext.symbol', 'esnext.asynciterable', 'esnext.intl'.",
code: Diagnostics.Argument_for_0_option_must_be_Colon_1.code,
category: Diagnostics.Argument_for_0_option_must_be_Colon_1.category
}]

Просмотреть файл

@ -1218,6 +1218,58 @@ namespace ts.tscWatch {
checkWatchedFiles(host, files.map(f => f.path));
}
});
it("updates errors correctly when declaration emit is disabled in compiler options", () => {
const currentDirectory = "/user/username/projects/myproject";
const aFile: File = {
path: `${currentDirectory}/a.ts`,
content: `import test from './b';
test(4, 5);`
};
const bFileContent = `function test(x: number, y: number) {
return x + y / 5;
}
export default test;`;
const bFile: File = {
path: `${currentDirectory}/b.ts`,
content: bFileContent
};
const tsconfigFile: File = {
path: `${currentDirectory}/tsconfig.json`,
content: JSON.stringify({
compilerOptions: {
module: "commonjs",
noEmit: true,
strict: true,
}
})
};
const files = [aFile, bFile, libFile, tsconfigFile];
const host = createWatchedSystem(files, { currentDirectory });
const watch = createWatchOfConfigFile("tsconfig.json", host);
checkOutputErrorsInitial(host, emptyArray);
changeParameterType("x", "string", [
getDiagnosticOfFileFromProgram(watch(), aFile.path, aFile.content.indexOf("4"), 1, Diagnostics.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1, "4", "string")
]);
changeParameterType("y", "string", [
getDiagnosticOfFileFromProgram(watch(), aFile.path, aFile.content.indexOf("5"), 1, Diagnostics.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1, "5", "string"),
getDiagnosticOfFileFromProgram(watch(), bFile.path, bFile.content.indexOf("y /"), 1, Diagnostics.The_left_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_or_an_enum_type)
]);
function changeParameterType(parameterName: string, toType: string, expectedErrors: ReadonlyArray<Diagnostic>) {
const newContent = bFileContent.replace(new RegExp(`${parameterName}\: [a-z]*`), `${parameterName}: ${toType}`);
verifyErrorsWithBFileContents(newContent, expectedErrors);
verifyErrorsWithBFileContents(bFileContent, emptyArray);
}
function verifyErrorsWithBFileContents(content: string, expectedErrors: ReadonlyArray<Diagnostic>) {
host.writeFile(bFile.path, content);
host.runQueuedTimeoutCallbacks();
checkOutputErrorsIncremental(host, expectedErrors);
}
});
});
describe("tsc-watch emit with outFile or out setting", () => {

Просмотреть файл

@ -2552,7 +2552,7 @@ declare namespace ts {
getPropertiesOfType(type: Type): Symbol[];
getPropertyOfType(type: Type, propertyName: string): Symbol | undefined;
getIndexInfoOfType(type: Type, kind: IndexKind): IndexInfo | undefined;
getSignaturesOfType(type: Type, kind: SignatureKind): Signature[];
getSignaturesOfType(type: Type, kind: SignatureKind): ReadonlyArray<Signature>;
getIndexTypeOfType(type: Type, kind: IndexKind): Type | undefined;
getBaseTypes(type: InterfaceType): BaseType[];
getBaseTypeOfLiteralType(type: Type): Type;
@ -2923,7 +2923,7 @@ declare namespace ts {
getNodeCheckFlags(node: Node): NodeCheckFlags;
isDeclarationVisible(node: Declaration | AnyImportSyntax): boolean;
isLateBound(node: Declaration): node is LateBoundDeclaration;
collectLinkedAliases(node: Identifier): Node[] | undefined;
collectLinkedAliases(node: Identifier, setVisibility?: boolean): Node[] | undefined;
isImplementationOfOverload(node: FunctionLike): boolean | undefined;
isRequiredInitializedParameter(node: ParameterDeclaration): boolean;
isOptionalUninitializedParameterProperty(node: ParameterDeclaration): boolean;
@ -3254,7 +3254,7 @@ declare namespace ts {
symbol: Symbol;
pattern?: DestructuringPattern;
aliasSymbol?: Symbol;
aliasTypeArguments?: Type[];
aliasTypeArguments?: ReadonlyArray<Type>;
wildcardInstantiation?: Type;
}
interface IntrinsicType extends Type {
@ -3325,7 +3325,7 @@ declare namespace ts {
*/
interface TypeReference extends ObjectType {
target: GenericType;
typeArguments?: Type[];
typeArguments?: ReadonlyArray<Type>;
}
enum Variance {
Invariant = 0,
@ -3375,8 +3375,8 @@ declare namespace ts {
interface ResolvedType extends ObjectType, UnionOrIntersectionType {
members: SymbolTable;
properties: Symbol[];
callSignatures: Signature[];
constructSignatures: Signature[];
callSignatures: ReadonlyArray<Signature>;
constructSignatures: ReadonlyArray<Signature>;
stringIndexInfo?: IndexInfo;
numberIndexInfo?: IndexInfo;
}
@ -3455,8 +3455,8 @@ declare namespace ts {
}
interface Signature {
declaration?: SignatureDeclaration | JSDocSignature;
typeParameters?: TypeParameter[];
parameters: Symbol[];
typeParameters?: ReadonlyArray<TypeParameter>;
parameters: ReadonlyArray<Symbol>;
thisParameter?: Symbol;
resolvedReturnType?: Type;
resolvedTypePredicate?: TypePredicate;
@ -3522,7 +3522,7 @@ declare namespace ts {
}
type TypeComparer = (s: Type, t: Type, reportErrors?: boolean) => Ternary;
interface InferenceContext extends TypeMapper {
typeParameters: TypeParameter[];
typeParameters: ReadonlyArray<TypeParameter>;
signature?: Signature;
inferences: InferenceInfo[];
flags: InferenceFlags;
@ -5768,6 +5768,7 @@ declare namespace ts {
Enables_emit_interoperability_between_CommonJS_and_ES_Modules_via_creation_of_namespace_objects_for_all_imports_Implies_allowSyntheticDefaultImports: DiagnosticMessage;
Type_originates_at_this_import_A_namespace_style_import_cannot_be_called_or_constructed_and_will_cause_a_failure_at_runtime_Consider_using_a_default_import_or_import_require_here_instead: DiagnosticMessage;
Mapped_object_type_implicitly_has_an_any_template_type: DiagnosticMessage;
If_the_0_package_actually_exposes_this_module_consider_sending_a_pull_request_to_amend_https_Colon_Slash_Slashgithub_com_SlashDefinitelyTyped_SlashDefinitelyTyped_Slashtree_Slashmaster_Slashtypes_Slash_0: DiagnosticMessage;
You_cannot_rename_this_element: DiagnosticMessage;
You_cannot_rename_elements_that_are_defined_in_the_standard_TypeScript_library: DiagnosticMessage;
import_can_only_be_used_in_a_ts_file: DiagnosticMessage;
@ -6122,7 +6123,7 @@ declare namespace ts {
function isLateVisibilityPaintedStatement(node: Node): node is LateVisibilityPaintedStatement;
function isAnyImportOrReExport(node: Node): node is AnyImportOrReExport;
function getEnclosingBlockScopeContainer(node: Node): Node;
function declarationNameToString(name: DeclarationName | QualifiedName): string;
function declarationNameToString(name: DeclarationName | QualifiedName | undefined): string;
function getNameFromIndexInfo(info: IndexInfo): string | undefined;
function getTextOfPropertyName(name: PropertyName): __String;
function entityNameToString(name: EntityNameOrEntityNameExpression): string;
@ -6309,7 +6310,8 @@ declare namespace ts {
function isIdentifierName(node: Identifier): boolean;
function isAliasSymbolDeclaration(node: Node): boolean;
function exportAssignmentIsAlias(node: ExportAssignment | BinaryExpression): boolean;
function getClassExtendsHeritageClauseElement(node: ClassLikeDeclaration | InterfaceDeclaration): ExpressionWithTypeArguments | undefined;
function getEffectiveBaseTypeNode(node: ClassLikeDeclaration | InterfaceDeclaration): ExpressionWithTypeArguments | undefined;
function getClassExtendsHeritageElement(node: ClassLikeDeclaration | InterfaceDeclaration): ExpressionWithTypeArguments | undefined;
function getClassImplementsHeritageClauseElements(node: ClassLikeDeclaration): NodeArray<ExpressionWithTypeArguments> | undefined;
/** Returns the node in an `extends` or `implements` clause of a class or interface. */
function getAllSuperTypeNodes(node: Node): ReadonlyArray<TypeNode>;
@ -6700,7 +6702,7 @@ declare namespace ts {
function isNamedDeclaration(node: Node): node is NamedDeclaration & {
name: DeclarationName;
};
function getNameOfDeclaration(declaration: Declaration | Expression): DeclarationName;
function getNameOfDeclaration(declaration: Declaration | Expression): DeclarationName | undefined;
/**
* Gets the JSDoc parameter tags for the node if present.
*
@ -7717,8 +7719,8 @@ declare namespace ts {
/** Create a unique name based on the supplied text. This does not consider names injected by the transformer. */
function createFileLevelUniqueName(text: string): Identifier;
/** Create a unique name generated for a node. */
function getGeneratedNameForNode(node: Node): Identifier;
function getGeneratedNameForNode(node: Node, flags: GeneratedIdentifierFlags): Identifier;
function getGeneratedNameForNode(node: Node | undefined): Identifier;
function getGeneratedNameForNode(node: Node | undefined, flags: GeneratedIdentifierFlags): Identifier;
function createToken<TKind extends SyntaxKind>(token: TKind): Token<TKind>;
function createSuper(): SuperExpression;
function createThis(): ThisExpression & Token<SyntaxKind.ThisKeyword>;
@ -9813,8 +9815,8 @@ declare namespace ts {
getProperties(): Symbol[];
getProperty(propertyName: string): Symbol | undefined;
getApparentProperties(): Symbol[];
getCallSignatures(): Signature[];
getConstructSignatures(): Signature[];
getCallSignatures(): ReadonlyArray<Signature>;
getConstructSignatures(): ReadonlyArray<Signature>;
getStringIndexType(): Type | undefined;
getNumberIndexType(): Type | undefined;
getBaseTypes(): BaseType[] | undefined;
@ -10684,6 +10686,7 @@ declare namespace ts {
function startEndContainsRange(start: number, end: number, range: TextRange): boolean;
function rangeContainsStartEnd(range: TextRange, start: number, end: number): boolean;
function rangeOverlapsWithStartEnd(r1: TextRange, start: number, end: number): boolean;
function nodeOverlapsWithStartEnd(node: Node, sourceFile: SourceFile, start: number, end: number): boolean;
function startEndOverlapsWithStartEnd(start1: number, end1: number, start2: number, end2: number): boolean;
/**
* Assumes `candidate.start <= position` holds.
@ -11639,7 +11642,7 @@ declare namespace ts.codefix {
* @returns Empty string iff there are no member insertions.
*/
function createMissingMemberNodes(classDeclaration: ClassLikeDeclaration, possiblyMissingSymbols: ReadonlyArray<Symbol>, checker: TypeChecker, preferences: UserPreferences, out: (node: ClassElement) => void): void;
function createMethodFromCallExpression({ typeArguments, arguments: args, parent: parent }: CallExpression, methodName: string, inJs: boolean, makeStatic: boolean, preferences: UserPreferences): MethodDeclaration;
function createMethodFromCallExpression(context: CodeFixContextBase, { typeArguments, arguments: args, parent: parent }: CallExpression, methodName: string, inJs: boolean, makeStatic: boolean, preferences: UserPreferences): MethodDeclaration;
}
declare namespace ts.codefix {
}
@ -12188,6 +12191,7 @@ declare namespace ts.server.protocol {
Change = "change",
Close = "close",
Completions = "completions",
CompletionInfo = "completionInfo",
CompletionsFull = "completions-full",
CompletionDetails = "completionEntryDetails",
CompletionDetailsFull = "completionEntryDetails-full",
@ -12889,6 +12893,15 @@ declare namespace ts.server.protocol {
interface CompletionsResponse extends Response {
body?: CompletionEntry[];
}
interface CompletionInfoResponse extends Response {
body?: CompletionInfo;
}
interface CompletionInfo {
readonly isGlobalCompletion: boolean;
readonly isMemberCompletion: boolean;
readonly isNewIdentifierLocation: boolean;
readonly entries: ReadonlyArray<CompletionEntry>;
}
interface CompletionDetailsResponse extends Response {
body?: CompletionEntryDetails[];
}

18
tests/baselines/reference/api/typescript.d.ts поставляемый
Просмотреть файл

@ -1822,7 +1822,7 @@ declare namespace ts {
getPropertiesOfType(type: Type): Symbol[];
getPropertyOfType(type: Type, propertyName: string): Symbol | undefined;
getIndexInfoOfType(type: Type, kind: IndexKind): IndexInfo | undefined;
getSignaturesOfType(type: Type, kind: SignatureKind): Signature[];
getSignaturesOfType(type: Type, kind: SignatureKind): ReadonlyArray<Signature>;
getIndexTypeOfType(type: Type, kind: IndexKind): Type | undefined;
getBaseTypes(type: InterfaceType): BaseType[];
getBaseTypeOfLiteralType(type: Type): Type;
@ -2198,7 +2198,7 @@ declare namespace ts {
symbol: Symbol;
pattern?: DestructuringPattern;
aliasSymbol?: Symbol;
aliasTypeArguments?: Type[];
aliasTypeArguments?: ReadonlyArray<Type>;
}
interface LiteralType extends Type {
value: string | number;
@ -2263,7 +2263,7 @@ declare namespace ts {
*/
interface TypeReference extends ObjectType {
target: GenericType;
typeArguments?: Type[];
typeArguments?: ReadonlyArray<Type>;
}
interface GenericType extends InterfaceType, TypeReference {
}
@ -2323,8 +2323,8 @@ declare namespace ts {
}
interface Signature {
declaration?: SignatureDeclaration | JSDocSignature;
typeParameters?: TypeParameter[];
parameters: Symbol[];
typeParameters?: ReadonlyArray<TypeParameter>;
parameters: ReadonlyArray<Symbol>;
}
enum IndexKind {
String = 0,
@ -3204,7 +3204,7 @@ declare namespace ts {
*/
function unescapeIdentifier(id: string): string;
function getNameOfJSDocTypedef(declaration: JSDocTypedefTag): Identifier | undefined;
function getNameOfDeclaration(declaration: Declaration | Expression): DeclarationName;
function getNameOfDeclaration(declaration: Declaration | Expression): DeclarationName | undefined;
/**
* Gets the JSDoc parameter tags for the node if present.
*
@ -3639,7 +3639,7 @@ declare namespace ts {
/** Create a unique name based on the supplied text. This does not consider names injected by the transformer. */
function createFileLevelUniqueName(text: string): Identifier;
/** Create a unique name generated for a node. */
function getGeneratedNameForNode(node: Node): Identifier;
function getGeneratedNameForNode(node: Node | undefined): Identifier;
function createToken<TKind extends SyntaxKind>(token: TKind): Token<TKind>;
function createSuper(): SuperExpression;
function createThis(): ThisExpression & Token<SyntaxKind.ThisKeyword>;
@ -4613,8 +4613,8 @@ declare namespace ts {
getProperties(): Symbol[];
getProperty(propertyName: string): Symbol | undefined;
getApparentProperties(): Symbol[];
getCallSignatures(): Signature[];
getConstructSignatures(): Signature[];
getCallSignatures(): ReadonlyArray<Signature>;
getConstructSignatures(): ReadonlyArray<Signature>;
getStringIndexType(): Type | undefined;
getNumberIndexType(): Type | undefined;
getBaseTypes(): BaseType[] | undefined;

Просмотреть файл

@ -0,0 +1,10 @@
tests/cases/compiler/constInClassExpression.ts(2,11): error TS1248: A class member cannot have the 'const' keyword.
==== tests/cases/compiler/constInClassExpression.ts (1 errors) ====
let C = class {
const a = 4;
~
!!! error TS1248: A class member cannot have the 'const' keyword.
};

Просмотреть файл

@ -0,0 +1,13 @@
//// [constInClassExpression.ts]
let C = class {
const a = 4;
};
//// [constInClassExpression.js]
var C = /** @class */ (function () {
function class_1() {
this.a = 4;
}
return class_1;
}());

Просмотреть файл

@ -0,0 +1,9 @@
=== tests/cases/compiler/constInClassExpression.ts ===
let C = class {
>C : Symbol(C, Decl(constInClassExpression.ts, 0, 3))
const a = 4;
>a : Symbol(C.a, Decl(constInClassExpression.ts, 0, 15))
};

Просмотреть файл

@ -0,0 +1,11 @@
=== tests/cases/compiler/constInClassExpression.ts ===
let C = class {
>C : typeof C
>class { const a = 4;} : typeof C
const a = 4;
>a : number
>4 : 4
};

Просмотреть файл

@ -0,0 +1,9 @@
=== tests/cases/conformance/jsdoc/bug25101.js ===
/**
* @template T
* @extends {Set<T>} Should prefer this Set<T>, not the Set in the heritage clause
*/
class My extends Set {}
>My : Symbol(My, Decl(bug25101.js, 0, 0))
>Set : Symbol(Set, Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --))

Просмотреть файл

@ -0,0 +1,9 @@
=== tests/cases/conformance/jsdoc/bug25101.js ===
/**
* @template T
* @extends {Set<T>} Should prefer this Set<T>, not the Set in the heritage clause
*/
class My extends Set {}
>My : My<T>
>Set : Set<T>

Просмотреть файл

@ -0,0 +1,28 @@
tests/cases/conformance/jsdoc/bug25104.js(1,7): error TS2300: Duplicate identifier 'C'.
tests/cases/conformance/jsdoc/bug25104.js(3,19): error TS1005: '}' expected.
tests/cases/conformance/jsdoc/bug25104.js(4,26): error TS2300: Duplicate identifier 'C'.
tests/cases/conformance/jsdoc/bug25104.js(6,18): error TS8024: JSDoc '@param' tag has name '', but there is no parameter with that name.
tests/cases/conformance/jsdoc/bug25104.js(6,18): error TS1005: '}' expected.
==== tests/cases/conformance/jsdoc/bug25104.js (5 errors) ====
class C {
~
!!! error TS2300: Duplicate identifier 'C'.
/**
* @typedef {C~A} C~B
~
!!! error TS1005: '}' expected.
* @typedef {object} C~A
~
!!! error TS2300: Duplicate identifier 'C'.
*/
/** @param {C~A} o */
!!! error TS8024: JSDoc '@param' tag has name '', but there is no parameter with that name.
~
!!! error TS1005: '}' expected.
constructor(o) {
}
}

Просмотреть файл

@ -0,0 +1,14 @@
=== tests/cases/conformance/jsdoc/bug25104.js ===
class C {
>C : Symbol(C, Decl(bug25104.js, 0, 0))
/**
* @typedef {C~A} C~B
* @typedef {object} C~A
*/
/** @param {C~A} o */
constructor(o) {
>o : Symbol(o, Decl(bug25104.js, 6, 16))
}
}

Просмотреть файл

@ -0,0 +1,14 @@
=== tests/cases/conformance/jsdoc/bug25104.js ===
class C {
>C : C
/**
* @typedef {C~A} C~B
* @typedef {object} C~A
*/
/** @param {C~A} o */
constructor(o) {
>o : any
}
}

Просмотреть файл

@ -0,0 +1,35 @@
/a.ts(2,25): error TS7016: Could not find a declaration file for module 'foo/sub'. '/node_modules/foo/sub.js' implicitly has an 'any' type.
If the 'foo' package actually exposes this module, consider sending a pull request to amend 'https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/foo`
/a.ts(3,25): error TS7016: Could not find a declaration file for module 'bar/sub'. '/node_modules/bar/sub.js' implicitly has an 'any' type.
Try `npm install @types/bar` if it exists or add a new declaration (.d.ts) file containing `declare module 'bar';`
==== /a.ts (2 errors) ====
import * as foo from "foo";
import * as fooSub from "foo/sub";
~~~~~~~~~
!!! error TS7016: Could not find a declaration file for module 'foo/sub'. '/node_modules/foo/sub.js' implicitly has an 'any' type.
!!! error TS7016: If the 'foo' package actually exposes this module, consider sending a pull request to amend 'https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/foo`
import * as barSub from "bar/sub";
~~~~~~~~~
!!! error TS7016: Could not find a declaration file for module 'bar/sub'. '/node_modules/bar/sub.js' implicitly has an 'any' type.
!!! error TS7016: Try `npm install @types/bar` if it exists or add a new declaration (.d.ts) file containing `declare module 'bar';`
==== /node_modules/@types/foo/index.d.ts (0 errors) ====
export const foo: number;
==== /node_modules/@types/foo/package.json (0 errors) ====
{ "name": "@types/foo", "version": "1.2.3" }
==== /node_modules/foo/sub.js (0 errors) ====
const x = 0;
==== /node_modules/foo/package.json (0 errors) ====
{ "name": "foo", "version": "1.2.3" }
==== /node_modules/bar/sub.js (0 errors) ====
const x = 0;
==== /node_modules/bar/package.json (0 errors) ====
{ "name": "bar", "version": "1.2.3" }

Просмотреть файл

@ -0,0 +1,29 @@
//// [tests/cases/conformance/moduleResolution/untypedModuleImport_noImplicitAny_typesForPackageExist.ts] ////
//// [index.d.ts]
export const foo: number;
//// [package.json]
{ "name": "@types/foo", "version": "1.2.3" }
//// [sub.js]
const x = 0;
//// [package.json]
{ "name": "foo", "version": "1.2.3" }
//// [sub.js]
const x = 0;
//// [package.json]
{ "name": "bar", "version": "1.2.3" }
//// [a.ts]
import * as foo from "foo";
import * as fooSub from "foo/sub";
import * as barSub from "bar/sub";
//// [a.js]
"use strict";
exports.__esModule = true;

Просмотреть файл

@ -0,0 +1,14 @@
=== /a.ts ===
import * as foo from "foo";
>foo : Symbol(foo, Decl(a.ts, 0, 6))
import * as fooSub from "foo/sub";
>fooSub : Symbol(fooSub, Decl(a.ts, 1, 6))
import * as barSub from "bar/sub";
>barSub : Symbol(barSub, Decl(a.ts, 2, 6))
=== /node_modules/@types/foo/index.d.ts ===
export const foo: number;
>foo : Symbol(foo, Decl(index.d.ts, 0, 12))

Просмотреть файл

@ -0,0 +1,14 @@
=== /a.ts ===
import * as foo from "foo";
>foo : typeof foo
import * as fooSub from "foo/sub";
>fooSub : any
import * as barSub from "bar/sub";
>barSub : any
=== /node_modules/@types/foo/index.d.ts ===
export const foo: number;
>foo : number

Просмотреть файл

@ -1,7 +1,5 @@
Exit Code: 1
Standard output:
node_modules/@types/jquery/index.d.ts(6366,66): error TS2344: Type '"timeout" | "onreadystatechange" | "responseType" | "withCredentials" | "msCaching"' does not satisfy the constraint '"abort" | "open" | "timeout" | "send" | "DONE" | "response" | "getAllResponseHeaders" | "getRespo...'.
Type '"msCaching"' is not assignable to type '"abort" | "open" | "timeout" | "send" | "DONE" | "response" | "getAllResponseHeaders" | "getRespo...'.
node_modules/@types/passport-facebook/index.d.ts(50,31): error TS2689: Cannot extend an interface 'passport.Strategy'. Did you mean 'implements'?

Просмотреть файл

@ -1,95 +1,95 @@
Exit Code: 1
Standard output:
node_modules/uglify-js/lib/ast.js(210,23): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/ast.js(332,33): error TS2339: Property 'transform' does not exist on type 'string'.
node_modules/uglify-js/lib/ast.js(877,5): error TS2322: Type '{ [x: string]: any; _visit: (node: any, descend: any) => any; parent: (n: any) => any; push: type...' is not assignable to type 'TreeWalker'.
node_modules/uglify-js/lib/ast.js(209,23): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/ast.js(331,33): error TS2339: Property 'transform' does not exist on type 'string'.
node_modules/uglify-js/lib/ast.js(872,5): error TS2322: Type '{ [x: string]: any; _visit: (node: any, descend: any) => any; parent: (n: any) => any; push: type...' is not assignable to type 'TreeWalker'.
Object literal may only specify known properties, but '_visit' does not exist in type 'TreeWalker'. Did you mean to write 'visit'?
node_modules/uglify-js/lib/compress.js(165,27): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(514,26): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(829,18): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(1084,38): error TS2339: Property 'parent' does not exist on type 'TreeTransformer'.
node_modules/uglify-js/lib/compress.js(1098,51): error TS2349: Cannot invoke an expression whose type lacks a call signature. Type 'true | ((node: any) => any)' has no compatible call signatures.
node_modules/uglify-js/lib/compress.js(1162,53): error TS2339: Property 'parent' does not exist on type 'TreeTransformer'.
node_modules/uglify-js/lib/compress.js(1204,112): error TS2532: Object is possibly 'undefined'.
node_modules/uglify-js/lib/compress.js(1205,29): error TS2532: Object is possibly 'undefined'.
node_modules/uglify-js/lib/compress.js(1214,87): error TS2322: Type 'false' is not assignable to type 'number'.
node_modules/uglify-js/lib/compress.js(1222,29): error TS2322: Type 'false' is not assignable to type 'never'.
node_modules/uglify-js/lib/compress.js(1325,38): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(1417,38): error TS2339: Property 'parent' does not exist on type 'TreeTransformer'.
node_modules/uglify-js/lib/compress.js(1514,27): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(1546,26): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(1960,44): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(2152,19): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(2412,27): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(3152,23): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(3165,33): error TS2322: Type '"f"' is not assignable to type 'boolean'.
node_modules/uglify-js/lib/compress.js(3302,18): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(3312,33): error TS2339: Property 'add' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3316,32): error TS2339: Property 'add' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3322,40): error TS2339: Property 'add' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3331,41): error TS2339: Property 'add' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3348,14): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(3350,40): error TS2339: Property 'get' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3358,33): error TS2339: Property 'parent' does not exist on type 'TreeTransformer'.
node_modules/uglify-js/lib/compress.js(3432,63): error TS2339: Property 'get' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3621,23): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(3638,36): error TS2339: Property 'parent' does not exist on type 'TreeTransformer'.
node_modules/uglify-js/lib/compress.js(3644,38): error TS2339: Property 'set' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3648,40): error TS2339: Property 'parent' does not exist on type 'TreeTransformer'.
node_modules/uglify-js/lib/compress.js(3673,22): error TS2339: Property 'each' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3678,30): error TS2339: Property 'del' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3683,30): error TS2339: Property 'set' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3694,41): error TS2339: Property 'has' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3696,48): error TS2339: Property 'get' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3708,41): error TS2339: Property 'has' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3710,48): error TS2339: Property 'get' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3816,21): error TS2403: Subsequent variable declarations must have the same type. Variable 'defs' must be of type 'Dictionary', but here has type 'any'.
node_modules/uglify-js/lib/compress.js(3818,36): error TS2339: Property 'get' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3847,22): error TS2339: Property 'set' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3867,17): error TS2447: The '|=' operator is not allowed for boolean types. Consider using '||' instead.
node_modules/uglify-js/lib/compress.js(3892,30): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(4030,18): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(4329,17): error TS2403: Subsequent variable declarations must have the same type. Variable 'body' must be of type 'any[]', but here has type 'any'.
node_modules/uglify-js/lib/compress.js(4413,22): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(4761,30): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(4768,25): error TS2403: Subsequent variable declarations must have the same type. Variable 'code' must be of type 'string', but here has type '{ [x: string]: any; get: () => string; toString: () => string; indent: () => void; indentation: (...'.
node_modules/uglify-js/lib/compress.js(4772,36): error TS2532: Object is possibly 'undefined'.
node_modules/uglify-js/lib/compress.js(4777,41): error TS2339: Property 'get' does not exist on type 'string'.
node_modules/uglify-js/lib/compress.js(5264,18): error TS2454: Variable 'is_strict_comparison' is used before being assigned.
node_modules/uglify-js/lib/compress.js(5703,25): error TS2365: Operator '==' cannot be applied to types 'boolean' and '"f"'.
node_modules/uglify-js/lib/compress.js(5730,32): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(5790,24): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(5862,24): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(5868,26): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(6218,43): error TS2454: Variable 'property' is used before being assigned.
node_modules/uglify-js/lib/compress.js(6232,25): error TS2403: Subsequent variable declarations must have the same type. Variable 'value' must be of type 'number', but here has type 'any'.
node_modules/uglify-js/lib/compress.js(6235,46): error TS2339: Property 'has_side_effects' does not exist on type 'number'.
node_modules/uglify-js/lib/compress.js(6242,25): error TS2403: Subsequent variable declarations must have the same type. Variable 'value' must be of type 'number', but here has type 'any'.
node_modules/uglify-js/lib/compress.js(6295,19): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(501,26): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(816,18): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(1071,38): error TS2339: Property 'parent' does not exist on type 'TreeTransformer'.
node_modules/uglify-js/lib/compress.js(1085,51): error TS2349: Cannot invoke an expression whose type lacks a call signature. Type 'true | ((node: any) => any)' has no compatible call signatures.
node_modules/uglify-js/lib/compress.js(1149,53): error TS2339: Property 'parent' does not exist on type 'TreeTransformer'.
node_modules/uglify-js/lib/compress.js(1191,112): error TS2532: Object is possibly 'undefined'.
node_modules/uglify-js/lib/compress.js(1192,29): error TS2532: Object is possibly 'undefined'.
node_modules/uglify-js/lib/compress.js(1201,87): error TS2322: Type 'false' is not assignable to type 'number'.
node_modules/uglify-js/lib/compress.js(1209,29): error TS2322: Type 'false' is not assignable to type 'never'.
node_modules/uglify-js/lib/compress.js(1312,38): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(1407,38): error TS2339: Property 'parent' does not exist on type 'TreeTransformer'.
node_modules/uglify-js/lib/compress.js(1503,27): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(1535,26): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(1949,44): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(2141,19): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(2401,27): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(3141,23): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(3154,33): error TS2322: Type '"f"' is not assignable to type 'boolean'.
node_modules/uglify-js/lib/compress.js(3291,18): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(3301,33): error TS2339: Property 'add' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3305,32): error TS2339: Property 'add' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3311,40): error TS2339: Property 'add' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3320,41): error TS2339: Property 'add' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3337,14): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(3339,40): error TS2339: Property 'get' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3347,33): error TS2339: Property 'parent' does not exist on type 'TreeTransformer'.
node_modules/uglify-js/lib/compress.js(3421,63): error TS2339: Property 'get' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3608,23): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(3629,24): error TS2339: Property 'parent' does not exist on type 'TreeTransformer'.
node_modules/uglify-js/lib/compress.js(3635,26): error TS2339: Property 'set' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3639,28): error TS2339: Property 'parent' does not exist on type 'TreeTransformer'.
node_modules/uglify-js/lib/compress.js(3657,18): error TS2339: Property 'each' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3662,26): error TS2339: Property 'del' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3667,26): error TS2339: Property 'set' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3678,37): error TS2339: Property 'has' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3680,44): error TS2339: Property 'get' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3692,37): error TS2339: Property 'has' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3694,44): error TS2339: Property 'get' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3798,21): error TS2403: Subsequent variable declarations must have the same type. Variable 'defs' must be of type 'Dictionary', but here has type 'any'.
node_modules/uglify-js/lib/compress.js(3800,36): error TS2339: Property 'get' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3830,22): error TS2339: Property 'set' does not exist on type 'Dictionary'.
node_modules/uglify-js/lib/compress.js(3850,17): error TS2447: The '|=' operator is not allowed for boolean types. Consider using '||' instead.
node_modules/uglify-js/lib/compress.js(3875,30): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(4013,18): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(4312,17): error TS2403: Subsequent variable declarations must have the same type. Variable 'body' must be of type 'any[]', but here has type 'any'.
node_modules/uglify-js/lib/compress.js(4396,22): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(4746,30): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(4753,25): error TS2403: Subsequent variable declarations must have the same type. Variable 'code' must be of type 'string', but here has type '{ [x: string]: any; get: () => string; toString: () => string; indent: () => void; indentation: (...'.
node_modules/uglify-js/lib/compress.js(4757,36): error TS2532: Object is possibly 'undefined'.
node_modules/uglify-js/lib/compress.js(4762,41): error TS2339: Property 'get' does not exist on type 'string'.
node_modules/uglify-js/lib/compress.js(5249,18): error TS2454: Variable 'is_strict_comparison' is used before being assigned.
node_modules/uglify-js/lib/compress.js(5688,25): error TS2365: Operator '==' cannot be applied to types 'boolean' and '"f"'.
node_modules/uglify-js/lib/compress.js(5715,32): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(5775,24): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(5847,24): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(5853,26): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/compress.js(6213,43): error TS2454: Variable 'property' is used before being assigned.
node_modules/uglify-js/lib/compress.js(6228,25): error TS2403: Subsequent variable declarations must have the same type. Variable 'value' must be of type 'number', but here has type 'any'.
node_modules/uglify-js/lib/compress.js(6231,46): error TS2339: Property 'has_side_effects' does not exist on type 'number'.
node_modules/uglify-js/lib/compress.js(6237,25): error TS2403: Subsequent variable declarations must have the same type. Variable 'value' must be of type 'number', but here has type 'any'.
node_modules/uglify-js/lib/compress.js(6290,19): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/minify.js(170,75): error TS2339: Property 'compress' does not exist on type 'Compressor'.
node_modules/uglify-js/lib/mozilla-ast.js(569,18): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/mozilla-ast.js(566,18): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/output.js(481,22): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/output.js(774,23): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/output.js(1186,29): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/output.js(1480,58): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type.
node_modules/uglify-js/lib/parse.js(365,20): error TS2345: Argument of type 'number | undefined' is not assignable to parameter of type 'number'.
node_modules/uglify-js/lib/output.js(1170,29): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/output.js(1452,58): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type.
node_modules/uglify-js/lib/parse.js(367,20): error TS2345: Argument of type 'number | undefined' is not assignable to parameter of type 'number'.
Type 'undefined' is not assignable to type 'number'.
node_modules/uglify-js/lib/parse.js(447,32): error TS2345: Argument of type 'any' is not assignable to parameter of type 'never'.
node_modules/uglify-js/lib/parse.js(458,32): error TS2345: Argument of type 'any' is not assignable to parameter of type 'never'.
node_modules/uglify-js/lib/parse.js(509,20): error TS2339: Property 'raw_source' does not exist on type 'RegExp'.
node_modules/uglify-js/lib/parse.js(620,57): error TS2339: Property 'push' does not exist on type 'never'.
node_modules/uglify-js/lib/parse.js(630,32): error TS2345: Argument of type 'never[]' is not assignable to parameter of type 'never'.
node_modules/uglify-js/lib/parse.js(636,40): error TS2339: Property 'length' does not exist on type 'never'.
node_modules/uglify-js/lib/parse.js(740,13): error TS2531: Object is possibly 'null'.
node_modules/uglify-js/lib/parse.js(772,52): error TS2531: Object is possibly 'null'.
node_modules/uglify-js/lib/parse.js(772,74): error TS2531: Object is possibly 'null'.
node_modules/uglify-js/lib/parse.js(814,31): error TS2531: Object is possibly 'null'.
node_modules/uglify-js/lib/parse.js(820,17): error TS2531: Object is possibly 'null'.
node_modules/uglify-js/lib/parse.js(824,21): error TS2531: Object is possibly 'null'.
node_modules/uglify-js/lib/parse.js(829,43): error TS2531: Object is possibly 'null'.
node_modules/uglify-js/lib/parse.js(848,21): error TS2531: Object is possibly 'null'.
node_modules/uglify-js/lib/parse.js(867,21): error TS2531: Object is possibly 'null'.
node_modules/uglify-js/lib/parse.js(982,23): error TS2345: Argument of type 'any' is not assignable to parameter of type 'never'.
node_modules/uglify-js/lib/parse.js(449,32): error TS2345: Argument of type 'any' is not assignable to parameter of type 'never'.
node_modules/uglify-js/lib/parse.js(460,32): error TS2345: Argument of type 'any' is not assignable to parameter of type 'never'.
node_modules/uglify-js/lib/parse.js(511,20): error TS2339: Property 'raw_source' does not exist on type 'RegExp'.
node_modules/uglify-js/lib/parse.js(622,57): error TS2339: Property 'push' does not exist on type 'never'.
node_modules/uglify-js/lib/parse.js(632,32): error TS2345: Argument of type 'never[]' is not assignable to parameter of type 'never'.
node_modules/uglify-js/lib/parse.js(638,40): error TS2339: Property 'length' does not exist on type 'never'.
node_modules/uglify-js/lib/parse.js(739,13): error TS2531: Object is possibly 'null'.
node_modules/uglify-js/lib/parse.js(771,52): error TS2531: Object is possibly 'null'.
node_modules/uglify-js/lib/parse.js(771,74): error TS2531: Object is possibly 'null'.
node_modules/uglify-js/lib/parse.js(815,31): error TS2531: Object is possibly 'null'.
node_modules/uglify-js/lib/parse.js(821,17): error TS2531: Object is possibly 'null'.
node_modules/uglify-js/lib/parse.js(825,21): error TS2531: Object is possibly 'null'.
node_modules/uglify-js/lib/parse.js(830,43): error TS2531: Object is possibly 'null'.
node_modules/uglify-js/lib/parse.js(849,21): error TS2531: Object is possibly 'null'.
node_modules/uglify-js/lib/parse.js(868,21): error TS2531: Object is possibly 'null'.
node_modules/uglify-js/lib/parse.js(983,23): error TS2345: Argument of type 'any' is not assignable to parameter of type 'never'.
node_modules/uglify-js/lib/parse.js(1097,9): error TS2322: Type 'any[]' is not assignable to type 'never[]'.
Type 'any' is not assignable to type 'never'.
node_modules/uglify-js/lib/parse.js(1156,17): error TS2531: Object is possibly 'null'.
@ -111,8 +111,8 @@ node_modules/uglify-js/lib/scope.js(202,19): error TS2554: Expected 0 arguments,
node_modules/uglify-js/lib/scope.js(410,14): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/scope.js(465,15): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/scope.js(490,15): error TS2554: Expected 0 arguments, but got 1.
node_modules/uglify-js/lib/sourcemap.js(56,25): error TS2304: Cannot find name 'MOZ_SourceMap'.
node_modules/uglify-js/lib/sourcemap.js(62,23): error TS2304: Cannot find name 'MOZ_SourceMap'.
node_modules/uglify-js/lib/sourcemap.js(55,25): error TS2304: Cannot find name 'MOZ_SourceMap'.
node_modules/uglify-js/lib/sourcemap.js(61,23): error TS2304: Cannot find name 'MOZ_SourceMap'.
node_modules/uglify-js/tools/exit.js(7,32): error TS2339: Property 'bufferSize' does not exist on type 'WriteStream'.
node_modules/uglify-js/tools/exit.js(7,61): error TS2339: Property 'bufferSize' does not exist on type 'WriteStream'.
node_modules/uglify-js/tools/node.js(68,27): error TS2339: Property 'minify' does not exist on type 'typeof import("/uglify-js/node_modules/uglify-js/tools/node")'.

Просмотреть файл

@ -0,0 +1,3 @@
let C = class {
const a = 4;
};

Просмотреть файл

@ -0,0 +1,10 @@
// @noEmit: true
// @allowJs: true
// @checkJs: true
// @lib: esnext
// @Filename: bug25101.js
/**
* @template T
* @extends {Set<T>} Should prefer this Set<T>, not the Set in the heritage clause
*/
class My extends Set {}

Просмотреть файл

@ -0,0 +1,13 @@
// @noEmit: true
// @allowJs: true
// @checkJs: true
// @Filename: bug25104.js
class C {
/**
* @typedef {C~A} C~B
* @typedef {object} C~A
*/
/** @param {C~A} o */
constructor(o) {
}
}

Просмотреть файл

@ -0,0 +1,25 @@
// @noImplicitReferences: true
// @strict: true
// @Filename: /node_modules/@types/foo/index.d.ts
export const foo: number;
// @Filename: /node_modules/@types/foo/package.json
{ "name": "@types/foo", "version": "1.2.3" }
// @Filename: /node_modules/foo/sub.js
const x = 0;
// @Filename: /node_modules/foo/package.json
{ "name": "foo", "version": "1.2.3" }
// @Filename: /node_modules/bar/sub.js
const x = 0;
// @Filename: /node_modules/bar/package.json
{ "name": "bar", "version": "1.2.3" }
// @Filename: /a.ts
import * as foo from "foo";
import * as fooSub from "foo/sub";
import * as barSub from "bar/sub";

Просмотреть файл

@ -0,0 +1,25 @@
/// <reference path='fourslash.ts' />
////class C {
//// z: boolean = true;
//// method() {
//// const x = 0;
//// this.y(x, "a", this.z);
//// }
////}
verify.codeFixAll({
fixId: "addMissingMember",
fixAllDescription: "Add all missing members",
newFileContent:
`class C {
z: boolean = true;
method() {
const x = 0;
this.y(x, "a", this.z);
}
y(x: number, arg1: string, z: boolean): any {
throw new Error("Method not implemented.");
}
}`,
});

Просмотреть файл

@ -0,0 +1,25 @@
/// <reference path='fourslash.ts' />
// @Filename: /I.ts
////export interface J {}
////export interface I {
//// x: J;
//// m(): J;
////}
// @Filename: /C.ts
////import { I } from "./I";
////export class C implements I {}
goTo.file("/C.ts");
verify.codeFix({
description: "Implement interface 'I'",
newFileContent:
`import { I } from "./I";
export class C implements I {
x: import("/I").J;
m(): import("/I").J {
throw new Error("Method not implemented.");
}
}`,
});

Просмотреть файл

@ -13,4 +13,13 @@
////}
goTo.file("/b.ts");
verify.not.codeFixAvailable();
verify.codeFix({
index: 0,
description: "Infer type of 'x' from usage",
newFileContent:
`export class C {
set x(val: Promise<typeof import("/a")>) { val; }
method() { this.x = import("./a"); }
}`,
});

Просмотреть файл

@ -10,6 +10,7 @@
//// let c = new X.C;
//// c.m1();
//// c.y = {};
//// c.m2(c);
// @Filename: f1.ts
//// export class C {[|
@ -21,14 +22,18 @@ verify.getAndApplyCodeFix(/*errorCode*/undefined, 0);
verify.getAndApplyCodeFix(/*errorCode*/undefined, 0);
verify.getAndApplyCodeFix(/*errorCode*/undefined, 0);
verify.getAndApplyCodeFix(/*errorCode*/undefined, 0);
verify.getAndApplyCodeFix(/*errorCode*/undefined, 0);
verify.rangeIs(`
m2(c: C): any {
throw new Error("Method not implemented.");
}
y: { [x: string]: any; };
m1(): any {
throw new Error("Method not implemented.");
}
static x: any;
static m0(arg0: any, arg1: any, arg2: any): any {
static m0(arg0: number, arg1: string, arg2: undefined[]): any {
throw new Error("Method not implemented.");
}
`);

Просмотреть файл

@ -0,0 +1,26 @@
/// <reference path='fourslash.ts' />
// @allowJs: true
// @checkJs: true
// @Filename: f3.ts
//// import { C } from "./f1";
//// import { D } from "./f2";
//// const c = new C();
//// c.m0(new D());
// @Filename: f2.ts
//// export class D { }
// @Filename: f1.ts
//// export class C {[|
//// |]x: number;
//// }
verify.getAndApplyCodeFix(/*errorCode*/ undefined, 0);
verify.rangeIs(`
m0(arg0: D): any {
throw new Error("Method not implemented.");
}
`);

Просмотреть файл

@ -20,7 +20,7 @@ verify.codeFix({
this.prop1 = 10;
A.prop2 = "asdf";
}
static m1(arg0: any, arg1: any, arg2: any): any {
static m1(arg0: number, arg1: number, arg2: number): any {
throw new Error("Method not implemented.");
}
}`,
@ -37,10 +37,10 @@ verify.codeFix({
this.prop1 = 10;
A.prop2 = "asdf";
}
static m2(arg0: any, arg1: any): any {
static m2(arg0: number, arg1: number): any {
throw new Error("Method not implemented.");
}
static m1(arg0: any, arg1: any, arg2: any): any {
static m1(arg0: number, arg1: number, arg2: number): any {
throw new Error("Method not implemented.");
}
}`,
@ -58,10 +58,10 @@ verify.codeFix({
this.prop1 = 10;
A.prop2 = "asdf";
}
static m2(arg0: any, arg1: any): any {
static m2(arg0: number, arg1: number): any {
throw new Error("Method not implemented.");
}
static m1(arg0: any, arg1: any, arg2: any): any {
static m1(arg0: number, arg1: number, arg2: number): any {
throw new Error("Method not implemented.");
}
}`,
@ -80,10 +80,10 @@ verify.codeFix({
this.prop1 = 10;
A.prop2 = "asdf";
}
static m2(arg0: any, arg1: any): any {
static m2(arg0: number, arg1: number): any {
throw new Error("Method not implemented.");
}
static m1(arg0: any, arg1: any, arg2: any): any {
static m1(arg0: number, arg1: number, arg2: number): any {
throw new Error("Method not implemented.");
}
}`,

Просмотреть файл

@ -15,7 +15,7 @@ verify.codeFix({
index: 0,
newFileContent:
`class A {
foo1(arg0: any, arg1: any, arg2: any): any {
foo1(arg0: number, arg1: number, arg2: number): any {
throw new Error("Method not implemented.");
}
constructor() {
@ -36,7 +36,7 @@ verify.codeFix({
foo2<T, U, V, W, X, Y, Z>(): any {
throw new Error("Method not implemented.");
}
foo1(arg0: any, arg1: any, arg2: any): any {
foo1(arg0: number, arg1: number, arg2: number): any {
throw new Error("Method not implemented.");
}
constructor() {
@ -60,7 +60,7 @@ verify.codeFix({
foo2<T, U, V, W, X, Y, Z>(): any {
throw new Error("Method not implemented.");
}
foo1(arg0: any, arg1: any, arg2: any): any {
foo1(arg0: number, arg1: number, arg2: number): any {
throw new Error("Method not implemented.");
}
constructor() {

Просмотреть файл

@ -0,0 +1,31 @@
/// <reference path='fourslash.ts' />
//// class A {[|
//// |]constructor() {
//// this.foo1(() => 1, () => "2", () => false);
//// this.foo2((a: number) => a, (b: string) => b, (c: boolean) => c);
//// }
//// }
verify.codeFix({
description: "Declare method 'foo1'",
index: 0,
newRangeContent: `
foo1(arg0: () => number, arg1: () => string, arg2: () => boolean): any {
throw new Error("Method not implemented.");
}
`,
});
verify.codeFix({
description: "Declare method 'foo2'",
index: 0,
newRangeContent: `
foo2(arg0: (a: number) => number, arg1: (b: string) => string, arg2: (c: boolean) => boolean): any {
throw new Error("Method not implemented.");
}
foo1(arg0: () => number, arg1: () => string, arg2: () => boolean): any {
throw new Error("Method not implemented.");
}
`
});

Просмотреть файл

@ -0,0 +1,17 @@
/// <reference path='fourslash.ts' />
//// class A {[|
//// |]constructor() {
//// this.foo1(null, {}, { a: 1, b: "2"});
//// }
//// }
verify.codeFix({
description: "Declare method 'foo1'",
index: 0,
newRangeContent: `
foo1(arg0: null, arg1: {}, arg2: { a: number; b: string; }): any {
throw new Error("Method not implemented.");
}
`
});

Просмотреть файл

@ -572,12 +572,12 @@ verify.quickInfos({
});
goTo.marker('114');
verify.completionListContains("a", "(property) cWithConstructorProperty.a: number", "this is first parameter a\nmore info about a");
verify.quickInfoIs("(property) cWithConstructorProperty.a: number", "this is first parameter a\nmore info about a");
verify.completionListContains("a", "(property) cWithConstructorProperty.a: number", "more info about a\nthis is first parameter a");
verify.quickInfoIs("(property) cWithConstructorProperty.a: number", "more info about a\nthis is first parameter a");
goTo.marker('115');
verify.completionListContains("a", "(parameter) a: number", "this is first parameter a\nmore info about a");
verify.quickInfoIs("(parameter) a: number", "this is first parameter a\nmore info about a");
verify.completionListContains("a", "(parameter) a: number", "more info about a\nthis is first parameter a");
verify.quickInfoIs("(parameter) a: number", "more info about a\nthis is first parameter a");
verify.quickInfos({
116: "this: this",

Просмотреть файл

@ -420,7 +420,7 @@ verify.signatureHelp({ marker: "38", docComment: concatDoc, parameterDocComment:
verify.quickInfoAt("38aq", "(parameter) bar: string", "is second string");
goTo.marker('39');
verify.completionListContains("a", "(parameter) a: number", "it is first parameter\nthis is inline comment for a ");
verify.completionListContains("a", "(parameter) a: number", "this is inline comment for a \nit is first parameter");
verify.completionListContains("b", "(parameter) b: number", "this is inline comment for b");
verify.completionListContains("c", "(parameter) c: number", "it is third parameter");
verify.completionListContains("d", "(parameter) d: number", "");
@ -430,7 +430,7 @@ const jsdocTestTags: ReadonlyArray<FourSlashInterface.JSDocTagInfo> = [
{ name: "param", text: "a it is first parameter" },
{ name: "param", text: "c it is third parameter" },
];
verify.signatureHelp({ marker: "40", docComment: jsdocTestDocComment, parameterDocComment: "it is first parameter\nthis is inline comment for a ", tags: jsdocTestTags });
verify.signatureHelp({ marker: "40", docComment: jsdocTestDocComment, parameterDocComment: "this is inline comment for a \nit is first parameter", tags: jsdocTestTags });
verify.quickInfos({
"40q": [
"function jsDocParamTest(a: number, b: number, c: number, d: number): number",
@ -438,7 +438,7 @@ verify.quickInfos({
],
"40aq": [
"(parameter) a: number",
"it is first parameter\nthis is inline comment for a "
"this is inline comment for a \nit is first parameter"
]
});

Просмотреть файл

@ -32,7 +32,7 @@
////}
////assig/*16*/ned/*17*/(/*18*/"hey");
verify.quickInfoAt("1", "var lambdaFoo: (a: number, b: number) => number", "lambdaFoo var comment\nthis is lambda comment");
verify.quickInfoAt("1", "var lambdaFoo: (a: number, b: number) => number", "this is lambda comment\nlambdaFoo var comment");
goTo.marker('2');
verify.completionListContains('a', '(parameter) a: number', 'param a');
@ -42,18 +42,18 @@ verify.completionListContains('b', '(parameter) b: number', 'param b');
verify.quickInfoAt("3", "var lambddaNoVarComment: (a: number, b: number) => number", "this is lambda multiplication");
goTo.marker('4');
verify.completionListContains('lambdaFoo', 'var lambdaFoo: (a: number, b: number) => number', 'lambdaFoo var comment\nthis is lambda comment');
verify.completionListContains('lambdaFoo', 'var lambdaFoo: (a: number, b: number) => number', "this is lambda comment\nlambdaFoo var comment");
verify.completionListContains('lambddaNoVarComment', 'var lambddaNoVarComment: (a: number, b: number) => number', 'this is lambda multiplication');
verify.signatureHelp(
{
marker: "5",
docComment: "lambdaFoo var comment\nthis is lambda comment",
docComment: "this is lambda comment\nlambdaFoo var comment",
parameterDocComment: "param a",
},
{
marker: "6",
docComment: "lambdaFoo var comment\nthis is lambda comment",
docComment: "this is lambda comment\nlambdaFoo var comment",
parameterDocComment: "param b",
},
);
@ -61,31 +61,31 @@ verify.signatureHelp(
// no documentation from nested lambda
verify.quickInfos({
7: "function anotherFunc(a: number): string",
8: ["(local var) lambdaVar: (b: string) => string", "documentation\ninner docs "],
8: ["(local var) lambdaVar: (b: string) => string", "inner docs \ndocumentation"],
9: ["(parameter) b: string", "inner parameter "],
10: "(local var) localVar: string",
11: "(local var) localVar: string",
12: ["(parameter) b: string", "inner parameter "],
13: ["(local var) lambdaVar: (b: string) => string", "documentation\ninner docs "],
13: ["(local var) lambdaVar: (b: string) => string", "inner docs \ndocumentation"],
14: [
"var assigned: (s: string) => number",
"On variable\nSummary on expression"
"Summary on expression\nOn variable"
]
});
goTo.marker('15');
verify.completionListContains('s', '(parameter) s: string', "the first parameter!\nparam on expression\nOn parameter ");
verify.quickInfoAt("16", "var assigned: (s: string) => number", "On variable\nSummary on expression");
verify.completionListContains('s', '(parameter) s: string', "On parameter \nparam on expression\nthe first parameter!");
verify.quickInfoAt("16", "var assigned: (s: string) => number", "Summary on expression\nOn variable");
goTo.marker('17');
verify.completionListContains("assigned", "var assigned: (s: string) => number", "On variable\nSummary on expression");
verify.completionListContains("assigned", "var assigned: (s: string) => number", "Summary on expression\nOn variable");
verify.signatureHelp({
marker: "18",
docComment: "On variable\nSummary on expression",
parameterDocComment: "the first parameter!\nparam on expression\nOn parameter ",
docComment: "Summary on expression\nOn variable",
parameterDocComment: "On parameter \nparam on expression\nthe first parameter!",
tags: [
{ name: "param", text: "s the first parameter!" },
{ name: "returns", text: "the parameter's length" },
{ name: "param", text: "s param on expression" },
{ name: "returns", text: "return on expression" },
{ name: "param", text: "s the first parameter!" },
{ name: "returns", text: "the parameter's length" },
],
});

Просмотреть файл

@ -0,0 +1,18 @@
/// <reference path='fourslash.ts' />
// @allowJs: true
// @Filename: /a.js
/////**
//// * @type {<T>() => void}
//// */
////export const x = 0;
verify.codeFix({
description: "Remove declaration for: 'T'",
newFileContent:
`/**
* @type {() => void}
*/
export const x = 0;`,
});

Просмотреть файл

@ -190,6 +190,7 @@ declare namespace FourSlashInterface {
applicableRefactorAvailableForRange(): void;
refactorAvailable(name: string, actionName?: string): void;
refactorsAvailable(names: ReadonlyArray<string>): void;
refactor(options: {
name: string;
actionName: string;

Просмотреть файл

@ -0,0 +1,35 @@
/// <reference path="fourslash.ts" />
// @allowJs: true
// @Filename: /a.js
////exports.a = exports.b = exports.c = 0;
verify.navigationTree({
text: "<global>",
kind: "script",
childItems: [
{
text: "a",
kind: "const",
childItems: [
{
text: "b",
kind: "const",
childItems: [{ text: "c", kind: "const" }],
},
],
},
],
});
verify.navigationBar([
{
text: "<global>",
kind: "script",
childItems: [
{ text: "a", kind: "const" },
],
},
]);

Просмотреть файл

@ -0,0 +1,8 @@
/// <reference path='fourslash.ts' />
////class A {
/////*a*/ /*b*/p = 0;
////}
goTo.select("a", "b");
verify.refactorsAvailable([]);

Просмотреть файл

@ -0,0 +1,6 @@
/// <reference path='fourslash.ts' />
////function f</**/
////x
verify.noSignatureHelp("");