From 93dbec5e710a8cb28ca8b7f0c70b9ade4a8fc911 Mon Sep 17 00:00:00 2001 Date: Sat, 15 Jan 2022 21:39:48 +0800 Subject: [PATCH] test patch --- .../ambient/ambientDeclarations.ts | 1 + .../ambientDeclarationsPatterns.ts | 11 + .../declarations.d.ts | 18 + .../ambient/ambientInsideNonAmbient.ts | 2 + .../ambientInsideNonAmbientExternalModule.ts | 4 +- .../ambientShorthand_merging.ts | 6 + .../declarations1.d.ts | 2 + .../declarations2.d.ts | 4 + .../ambientShorthand_reExport.ts | 5 + .../declarations.d.ts | 2 + .../ambientShorthand_reExport/jquery.d.ts | 2 + .../ambientShorthand_reExport/reExportAll.ts | 2 + .../ambientShorthand_reExport/reExportX.ts | 2 + .../async/es5/asyncMethodWithSuper_es5.ts | 1 + .../asyncOrYieldAsBindingIdentifier1.ts | 49 ++ .../classAbstractAsIdentifier.ts | 2 +- .../classBody/classWithEmptyBody.ts | 4 +- .../classDeclarations/classInsideBlock.ts | 1 + .../classWithPredefinedTypesAsNames.ts | 4 +- .../classWithSemicolonClassElement1.ts | 3 +- .../classWithSemicolonClassElement2.ts | 3 +- .../classExpressions/classExpression2.ts | 4 +- .../classStaticBlock/classStaticBlock1.ts | 11 + .../classStaticBlock/classStaticBlock10.ts | 30 ++ .../classStaticBlock/classStaticBlock11.ts | 15 + .../classStaticBlock/classStaticBlock12.ts | 10 + .../classStaticBlock/classStaticBlock13.ts | 14 + .../classStaticBlock/classStaticBlock14.ts | 15 + .../classStaticBlock/classStaticBlock15.ts | 18 + .../classStaticBlock/classStaticBlock16.ts | 26 + .../classStaticBlock/classStaticBlock17.ts | 33 ++ .../classStaticBlock/classStaticBlock18.ts | 15 + .../classStaticBlock/classStaticBlock19.ts | 6 + .../classStaticBlock/classStaticBlock2.ts | 20 + .../classStaticBlock/classStaticBlock20.ts | 13 + .../classStaticBlock/classStaticBlock21.ts | 7 + .../classStaticBlock/classStaticBlock22.ts | 72 +++ .../classStaticBlock/classStaticBlock23.ts | 21 + .../classStaticBlock/classStaticBlock24.ts | 8 + .../classStaticBlock/classStaticBlock25.ts | 23 + .../classStaticBlock/classStaticBlock26.ts | 30 ++ .../classStaticBlock/classStaticBlock27.ts | 17 + .../classStaticBlock/classStaticBlock3.ts | 19 + .../classStaticBlock/classStaticBlock4.ts | 16 + .../classStaticBlock/classStaticBlock5.ts | 19 + .../classStaticBlock/classStaticBlock6.ts | 62 +++ .../classStaticBlock/classStaticBlock7.ts | 43 ++ .../classStaticBlock/classStaticBlock8.ts | 48 ++ .../classStaticBlock/classStaticBlock9.ts | 8 + .../classStaticBlockUseBeforeDef1.ts | 15 + .../classStaticBlockUseBeforeDef2.ts | 10 + .../classConstructorAccessibility4.ts | 4 +- ...structorImplementationWithDefaultValues.ts | 6 +- .../declarationEmitReadonly.ts | 3 +- .../quotedConstructors.ts | 4 + ...idesIndexersWithAssignmentCompatibility.ts | 4 +- .../superInStaticMembers1.ts | 492 ++++++++++++++++++ .../thisAndSuperInStaticMembers1.ts | 42 ++ .../thisAndSuperInStaticMembers2.ts | 42 ++ .../thisAndSuperInStaticMembers3.ts | 26 + .../thisAndSuperInStaticMembers4.ts | 26 + .../typeOfThisInStaticMembers.ts | 3 +- .../typeOfThisInStaticMembers10.ts | 51 ++ .../typeOfThisInStaticMembers11.ts | 51 ++ .../typeOfThisInStaticMembers12.ts | 10 + .../typeOfThisInStaticMembers13.ts | 10 + .../typeOfThisInStaticMembers3.ts | 12 + .../typeOfThisInStaticMembers4.ts | 12 + .../typeOfThisInStaticMembers5.ts | 9 + .../typeOfThisInStaticMembers6.ts | 7 + .../typeOfThisInStaticMembers7.ts | 12 + .../typeOfThisInStaticMembers8.ts | 19 + .../typeOfThisInStaticMembers9.ts | 22 + .../privateNameComputedPropertyName3.ts | 2 + .../privateNames/privateNameFieldAccess.ts | 1 + .../privateNames/privateNameHashCharName.ts | 11 + .../privateNames/privateNameInInExpression.ts | 119 +++++ .../privateNameInInExpressionTransform.ts | 47 ++ .../privateNameInInExpressionUnused.ts | 13 + .../privateNamesIncompatibleModifiersJs.ts | 65 +++ .../classes/mixinClassesAnnotated.ts | 3 + .../classes/mixinClassesAnonymous.ts | 2 + .../classes/mixinClassesMembers.ts | 5 + .../abstractProperty.ts | 3 + .../abstractPropertyInitializer.ts | 5 + .../instanceMemberInitialization.ts | 7 +- ...instanceMemberWithComputedPropertyName2.ts | 1 + .../staticFactory1.ts | 3 +- .../staticAndNonStaticPropertiesSameName.ts | 3 +- .../staticPropertyAndFunctionWithSameName.ts | 4 +- ...icPropertyNameConflictsInAmbientContext.ts | 10 + .../controlFlow/assertionTypePredicates2.ts | 27 + .../controlFlow/controlFlowAliasing.ts | 285 ++++++++++ .../controlFlowAliasingCatchVariables.ts | 28 + .../controlFlow/controlFlowElementAccess2.ts | 2 +- .../controlFlow/controlFlowForInStatement2.ts | 25 + .../controlFlow/controlFlowInOperator.ts | 26 + .../controlFlowInstanceofExtendsFunction.ts | 4 +- .../controlFlowSuperPropertyAccess.ts | 1 + .../controlFlow/controlFlowTypeofObject.ts | 71 +++ .../dependentDestructuredVariables.ts | 161 ++++++ .../typeGuardsNestedAssignments.ts | 3 +- .../controlFlow/typeGuardsTypeParameters.ts | 1 + .../declarationEmitWorkWithInlineComments.ts | 5 +- .../declarationEmitThisPredicates01.ts | 3 +- ...tionEmitThisPredicatesWithPrivateName01.ts | 3 +- .../typeReferenceRelatedFiles/fs.d.ts | 5 + .../typeReferenceRelatedFiles/main.ts | 2 + .../typeReferenceRelatedFiles/package.json | 4 + .../typeReferenceRelatedFiles.ts | 18 + .../decoratorOnClassConstructorParameter5.ts | 15 + .../class/decoratedBlockScopedClass1.ts | 16 + .../class/decoratedBlockScopedClass2.ts | 19 + .../class/decoratedBlockScopedClass3.ts | 27 + .../class/method/decoratorOnClassMethod14.ts | 14 + .../class/method/decoratorOnClassMethod15.ts | 12 + .../class/method/decoratorOnClassMethod16.ts | 12 + .../class/method/decoratorOnClassMethod17.ts | 11 + .../class/method/decoratorOnClassMethod18.ts | 11 + .../decoratorMetadataWithTypeOnlyImport2.ts | 17 + ...ter.asyncGenerators.classMethods.es2015.ts | 11 + .../conformance/es2018/es2018IntlAPIs.ts | 7 + .../conformance/es2020/es2020IntlAPIs.ts | 45 ++ ...tionWithPropertyAccessInHeritageClause1.ts | 4 +- .../superCallBeforeThisAccessing1.ts | 1 + .../superCallBeforeThisAccessing2.ts | 1 + .../superCallBeforeThisAccessing5.ts | 1 + .../superCallBeforeThisAccessing8.ts | 1 + .../es6/spread/arraySpreadImportHelpers.ts | 16 + ...mplateStringWithCommentsInArrowFunction.ts | 14 + .../expressions/asOperator/asOperatorASI.ts | 1 + .../comparisonOperatorWithIdenticalObjects.ts | 6 +- .../comparisonOperatorWithIntersectionType.ts | 5 + ...nshipObjectsOnInstantiatedCallSignature.ts | 4 +- ...jectsOnInstantiatedConstructorSignature.ts | 4 +- ...peratorWithSubtypeObjectOnCallSignature.ts | 3 +- ...WithSubtypeObjectOnConstructorSignature.ts | 3 +- ...eratorWithSubtypeObjectOnIndexSignature.ts | 3 +- ...ubtypeObjectOnInstantiatedCallSignature.ts | 3 +- ...bjectOnInstantiatedConstructorSignature.ts | 3 +- ...isonOperatorWithSubtypeObjectOnProperty.ts | 6 +- ...anceofOperatorWithInvalidStaticToString.ts | 3 + .../instanceofOperatorWithLHSIsObject.ts | 1 + ...ommaOperatorWithSecondOperandObjectType.ts | 1 + .../conditionalOperatorWithIdenticalBCT.ts | 3 + .../superCallParameterContextualTyping1.ts | 2 + .../superCallParameterContextualTyping3.ts | 3 +- .../functionCalls/callWithSpread.ts | 1 + .../functions/arrowFunctionExpressions.ts | 1 + .../newOperator/newOperatorConformance.ts | 1 + .../expressions/superCalls/superCalls.ts | 2 + .../thisKeyword/typeOfThisGeneral.ts | 178 +++++++ .../typeGuards/TypeGuardWithArrayUnion.ts | 1 + .../typeGuards/typeGuardFunction.ts | 6 +- .../typeGuards/typeGuardFunctionGenerics.ts | 4 +- .../typeGuardOfFormExpr1AndExpr2.ts | 3 +- .../typeGuards/typeGuardOfFormExpr1OrExpr2.ts | 3 +- .../typeGuards/typeGuardOfFormInstanceOf.ts | 45 +- .../typeGuards/typeGuardOfFormIsType.ts | 5 +- .../typeGuardOfFormTypeOfBoolean.ts | 1 + .../typeGuards/typeGuardOfFormTypeOfNumber.ts | 1 + .../typeGuards/typeGuardOfFormTypeOfString.ts | 1 + .../typeGuardOfFromPropNameInUnionType.ts | 9 + .../typeGuards/typeGuardsInClassAccessors.ts | 1 + .../typeGuards/typeGuardsInClassMethods.ts | 1 + .../typeGuards/typeGuardsInProperties.ts | 3 +- .../typeGuards/typeGuardsOnClassProperty.ts | 3 +- .../bitwiseNotOperatorWithNumberType.ts | 3 +- .../bitwiseNotOperatorWithStringType.ts | 3 +- .../externalModules/exportNonVisibleType.ts | 1 + .../moduleResolutionWithoutExtension1.ts | 12 + .../moduleResolutionWithoutExtension2.ts | 6 + .../moduleResolutionWithoutExtension3.ts | 12 + .../moduleResolutionWithoutExtension4.ts | 12 + .../moduleResolutionWithoutExtension5.ts | 6 + .../moduleResolutionWithoutExtension6.ts | 8 + .../moduleResolutionWithoutExtension7.ts | 6 + .../moduleResolutionWithoutExtension8.ts | 6 + .../typeOnly/exportSpecifiers.ts | 21 + .../typeOnly/importDefaultNamedType/a.ts | 2 + .../importDefaultNamedType.ts | 5 + .../typeOnly/importSpecifiers1.ts | 46 ++ .../typeOnly/preserveValueImports.ts | 28 + .../typeOnly/preserveValueImports_errors.ts | 47 ++ ...erveValueImports_importsNotUsedAsValues.ts | 14 + .../preserveValueImports_mixedImports.ts | 13 + .../typeOnly/preserveValueImports_module.ts | 4 + .../importAssertion/importAssertion1.ts | 37 ++ .../importAssertion/importAssertion2.ts | 17 + .../importAssertion/importAssertion3.ts | 15 + .../importAssertion/importAssertion4.ts | 1 + .../importAssertion/importAssertion5.ts | 1 + .../mergedInterfacesWithMultipleBases3.ts | 6 +- .../interfaceExtendsObjectIntersection.ts | 12 + .../interfaceWithPropertyOfEveryType.ts | 3 +- ...duleAndAmbientWithSameNameAndCommonRoot.ts | 1 - ...onAmbientClassWithSameNameAndCommonRoot.ts | 1 + ...ionAndNonExportedFunctionThatShareAName.ts | 4 +- ...ortedAndNonExportedClassesOfTheSameName.ts | 4 + ...rgeEachWithExportedModulesOfTheSameName.ts | 2 + .../codeGeneration/exportCodeGen.ts | 2 + .../codeGeneration/nameCollision.ts | 1 + .../jsdoc/constructorTagOnClassConstructor.ts | 4 +- ...bclassWithExplicitNoArgumentConstructor.ts | 3 +- .../declarations/jsDeclarationsThisTypes.ts | 4 +- .../jsdoc/enumTagImported/enumTagImported.ts | 23 + tests/cases/conformance/jsdoc/extendsTag1.ts | 1 + .../jsdocAugments_qualifiedName.ts | 10 + .../jsdoc/jsdocAugments_withTypeParameter.ts | 1 + .../jsdocImplements_namespacedInterface.ts | 2 + .../jsdoc/jsdocTemplateTagDefault.ts | 71 +++ .../jsdoc/jsdocTemplateTagNameResolution.ts | 16 + .../jsdoc/jsdocTypeReferenceUseBeforeDef.ts | 1 + .../conformance/jsdoc/jsdocVariadicType.ts | 12 + tests/cases/conformance/jsdoc/seeTag3.ts | 7 + tests/cases/conformance/jsdoc/thisTag2.ts | 11 + .../conformance/jsx/jsxParsingError4.tsx | 18 + .../jsx/jsxUnclosedParserRecovery.ts | 140 +++++ .../jsx/tsxReactEmitSpreadAttribute.ts | 32 ++ .../declarationNotFoundPackageBundlesTypes.ts | 23 + .../scopedPackages/index.d.ts | 3 + .../scopedPackages/scopedPackages.ts | 12 + .../moduleResolution/scopedPackages/z.d.ts | 2 + .../scopedPackagesClassic/index.d.ts | 2 + .../scopedPackagesClassic.ts | 9 + .../untypedModuleImport_allowJs.ts | 12 + .../declarations.d.ts | 4 + .../untypedModuleImport_vsAmbient.ts | 12 + .../allowJs/nodeAllowJsPackageSelfName.ts | 24 + .../node/allowJs/nodeModulesAllowJs1.ts | 324 ++++++++++++ .../allowJs/nodeModulesAllowJsCjsFromJs.ts | 8 + ...ModulesAllowJsConditionalPackageExports.ts | 126 +++++ .../nodeModulesAllowJsDynamicImport.ts | 27 + .../nodeModulesAllowJsExportAssignment.ts | 32 ++ ...deModulesAllowJsGeneratedNameCollisions.ts | 29 ++ .../nodeModulesAllowJsImportAssignment.ts | 34 ++ ...eModulesAllowJsImportHelpersCollisions1.ts | 34 ++ ...eModulesAllowJsImportHelpersCollisions2.ts | 30 ++ ...eModulesAllowJsImportHelpersCollisions3.ts | 32 ++ .../allowJs/nodeModulesAllowJsImportMeta.ts | 23 + .../nodeModulesAllowJsPackageExports.ts | 92 ++++ .../nodeModulesAllowJsPackageImports.ts | 41 ++ ...nodeModulesAllowJsPackagePatternExports.ts | 69 +++ ...lesAllowJsPackagePatternExportsTrailers.ts | 69 +++ ...nodeModulesAllowJsSynchronousCallErrors.ts | 37 ++ .../nodeModulesAllowJsTopLevelAwait.ts | 25 + ...lesExportsSpecifierGenerationConditions.ts | 33 ++ tests/cases/conformance/node/nodeModules1.ts | 321 ++++++++++++ ...odeModulesCjsFormatFileAlwaysHasDefault.ts | 19 + .../nodeModulesConditionalPackageExports.ts | 124 +++++ ...tionEmitDynamicImportWithPackageExports.ts | 71 +++ ...odulesDeclarationEmitWithPackageExports.ts | 93 ++++ .../node/nodeModulesDynamicImport.ts | 24 + .../node/nodeModulesExportAssignments.ts | 20 + ...ModulesExportsBlocksSpecifierResolution.ts | 27 + ...lesExportsSpecifierGenerationConditions.ts | 34 ++ ...ulesExportsSpecifierGenerationDirectory.ts | 29 ++ ...odulesExportsSpecifierGenerationPattern.ts | 29 ++ .../node/nodeModulesForbidenSyntax.ts | 67 +++ .../nodeModulesGeneratedNameCollisions.ts | 26 + .../node/nodeModulesImportAssertions.ts | 13 + .../node/nodeModulesImportAssignments.ts | 31 ++ .../nodeModulesImportHelpersCollisions.ts | 31 ++ .../nodeModulesImportHelpersCollisions2.ts | 27 + .../nodeModulesImportHelpersCollisions3.ts | 25 + .../conformance/node/nodeModulesImportMeta.ts | 20 + .../nodeModulesImportResolutionIntoExport.ts | 24 + .../nodeModulesImportResolutionNoCycle.ts | 24 + .../node/nodeModulesPackageExports.ts | 90 ++++ .../node/nodeModulesPackageImports.ts | 38 ++ .../node/nodeModulesPackagePatternExports.ts | 67 +++ ...odeModulesPackagePatternExportsTrailers.ts | 67 +++ .../node/nodeModulesResolveJsonModule.ts | 29 ++ .../node/nodeModulesSynchronousCallErrors.ts | 34 ++ .../node/nodeModulesTopLevelAwait.ts | 22 + .../nodeModulesTypesVersionPackageExports.ts | 53 ++ .../conformance/node/nodePackageSelfName.ts | 21 + .../node/nodePackageSelfNameScoped.ts | 21 + .../cases/conformance/override/override10.ts | 3 +- .../cases/conformance/override/override12.ts | 1 + .../cases/conformance/override/override15.ts | 9 + .../cases/conformance/override/override16.ts | 1 + .../cases/conformance/override/override17.ts | 1 + .../cases/conformance/override/override18.ts | 1 + .../cases/conformance/override/override19.ts | 20 + .../cases/conformance/override/override20.ts | 34 ++ .../conformance/override/override_js1.ts | 4 +- .../conformance/override/override_js4.ts | 14 + .../parserClassDeclaration16.ts | 3 +- .../parserClassDeclaration17.ts | 1 + .../parserClassDeclaration19.ts | 3 +- .../parserClassDeclaration20.ts | 3 +- .../parserClassDeclaration23.ts | 3 +- .../parserClassDeclaration26.ts | 3 +- .../parserClassDeclarationIndexSignature1.ts | 3 +- .../parserConstructorDeclaration1.ts | 3 +- .../parserConstructorDeclaration5.ts | 3 +- .../parserAccessibilityAfterStatic11.ts | 1 + .../parserAccessibilityAfterStatic14.ts | 1 + .../parserAccessibilityAfterStatic2.ts | 1 + .../parserAccessibilityAfterStatic3.ts | 1 + .../parserAccessibilityAfterStatic4.ts | 1 + .../parserAccessibilityAfterStatic5.ts | 1 + .../Generics/parserGenericClass1.ts | 3 +- .../Generics/parserGenericClass2.ts | 3 +- .../Generics/parserGenericConstraint1.ts | 3 +- .../parserIndexMemberDeclaration1.ts | 3 +- .../parserIndexMemberDeclaration2.ts | 3 +- .../parserIndexMemberDeclaration3.ts | 3 +- .../parserIndexMemberDeclaration4.ts | 3 +- .../parserIndexMemberDeclaration6.ts | 3 +- .../parserMemberVariableDeclaration5.ts | 3 +- .../ecmascript5/Protected/Protected3.ts | 3 +- .../ecmascript5/Protected/Protected5.ts | 3 +- .../ecmascript5/Protected/Protected9.ts | 3 +- .../RegressionTests/parser509546.ts | 1 + .../RegressionTests/parser509546_1.ts | 1 + .../RegressionTests/parser509546_2.ts | 1 + .../parser/ecmascript5/parserUnicode3.ts | 3 +- .../Iterators/parserForOfStatement22.ts | 4 + .../Iterators/parserForOfStatement23.ts | 6 + .../Iterators/parserForOfStatement24.ts | 4 + .../inferringClassMembersFromAssignments3.ts | 1 + .../conformance/salsa/plainJSBinderErrors.ts | 44 ++ .../conformance/salsa/plainJSRedeclare.ts | 6 + .../conformance/salsa/plainJSRedeclare2.ts | 7 + .../conformance/salsa/plainJSRedeclare3.ts | 7 + .../salsa/plainJSReservedStrict.ts | 7 + .../conformance/salsa/spellingUncheckedJS.ts | 51 ++ .../salsa/typeFromJSInitializer2.ts | 18 + .../salsa/typeFromJSInitializer3.ts | 18 + .../salsa/typeFromJSInitializer4.ts | 29 ++ .../salsa/typeFromPropertyAssignment23.ts | 3 + .../for-inStatementsAsyncIdentifier.ts | 4 + .../returnStatements/returnStatements.ts | 1 + .../throwInEnclosingStatements.ts | 1 + .../types/any/anyAsGenericFunctionCall.ts | 4 +- .../types/any/assignAnyToEveryType.ts | 4 +- .../types/any/assignEveryTypeToAny.ts | 4 +- .../conformance/types/conditional/variance.ts | 2 + ...tatedFunctionInferenceWithTypeParameter.ts | 3 + .../types/import/importTypeAmbient.ts | 5 +- .../types/import/importTypeGenericTypes.ts | 5 +- .../types/import/importTypeLocal.ts | 5 + .../intersectionOfUnionNarrowing.ts | 16 + .../types/keyof/keyofAndIndexedAccess.ts | 20 + .../types/literal/literalTypes2.ts | 3 + .../types/localTypes/localTypes2.ts | 3 + .../types/localTypes/localTypes3.ts | 3 + .../mapped/mappedTypeAsClauseRelationships.ts | 27 + .../types/mapped/mappedTypeProperties.ts | 42 ++ .../conformance/types/mapped/mappedTypes3.ts | 4 +- .../types/mapped/mappedTypesAndObjects.ts | 2 + .../members/classWithProtectedProperty.ts | 4 +- .../types/members/indexSignatures1.ts | 325 ++++++++++++ .../objectTypeHidingMembersOfObject.ts | 4 +- .../types/members/objectTypePropertyAccess.ts | 2 + .../members/objectTypeWithNumericProperty.ts | 4 +- ...hStringNamedPropertyOfIllegalCharacters.ts | 2 + .../typesWithSpecializedCallSignatures.ts | 5 +- ...typesWithSpecializedConstructSignatures.ts | 5 +- .../namedTypes/classWithOptionalParameter.ts | 5 +- .../types/namedTypes/optionalMethods.ts | 3 + .../conformance/types/never/neverType.ts | 2 + ...ureWithoutReturnTypeAnnotationInference.ts | 6 +- .../callSignaturesWithDuplicateParameters.ts | 4 +- .../callSignaturesWithOptionalParameters.ts | 2 + .../callSignaturesWithOptionalParameters2.ts | 4 +- .../parametersWithNoAnnotationAreAny.ts | 4 +- ...reIsNotSubtypeOfNonSpecializedSignature.ts | 3 + ...atureIsSubtypeOfNonSpecializedSignature.ts | 3 + ...gLiteralTypesInImplementationSignatures.ts | 2 + .../typeParameterAsTypeArgument.ts | 4 +- ...WithOverloadsThatDifferOnlyByReturnType.ts | 5 +- .../indexSignatures/numericIndexingResults.ts | 4 +- .../indexSignatures/stringIndexingResults.ts | 2 + .../propertyNameWithoutTypeAnnotation.ts | 4 +- .../propertyNamesOfReservedWords.ts | 4 +- .../stringNamedPropertyAccess.ts | 4 +- .../number/extendNumberInterface.ts | 2 +- .../undefined/invalidUndefinedValues.ts | 4 +- .../undefined/validUndefinedAssignments.ts | 4 +- .../types/rest/objectRestParameter.ts | 1 + .../typeLiterals/arrayOfFunctionTypes3.ts | 4 +- .../functionLiteralForOverloads2.ts | 5 +- .../typeQueries/typeQueryOnClass.ts | 5 +- .../typeQueries/typeQueryWithReservedWords.ts | 1 + .../typeQueries/typeofClass2.ts | 5 +- .../typeQueries/typeofModuleWithoutExports.ts | 3 +- .../specifyingTypes/typeQueries/typeofThis.ts | 146 ++++++ .../typeQueries/typeofThisWithImplicitThis.ts | 5 + .../types/spread/spreadDuplicate.ts | 21 + .../types/spread/spreadDuplicateExact.ts | 22 + .../conformance/types/spread/spreadUnion4.ts | 4 + .../types/thisType/fluentClasses.ts | 2 + .../types/thisType/thisTypeAndConstraints.ts | 3 + .../types/thisType/thisTypeInClasses.ts | 6 + .../types/thisType/thisTypeInFunctions3.ts | 3 + .../thisType/thisTypeInTaggedTemplateCall.ts | 10 + .../types/tuple/readonlyArraysAndTuples2.ts | 2 + .../circularTypeAliasForUnionWithClass.ts | 4 + .../classDoesNotDependOnBaseTypes.ts | 4 +- .../types/typeAliases/typeAliases.ts | 4 +- ...allGenericFunctionWithZeroTypeArguments.ts | 5 +- .../functionConstraintSatisfaction.ts | 5 +- .../functionConstraintSatisfaction3.ts | 5 +- .../innerTypeParameterShadowingOuterOne2.ts | 4 +- ...rtyAccessOnTypeParameterWithConstraints.ts | 3 +- ...tyAccessOnTypeParameterWithConstraints2.ts | 7 +- ...tyAccessOnTypeParameterWithConstraints3.ts | 4 +- ...AccessOnTypeParameterWithoutConstraints.ts | 4 +- .../typeParameterUsedAsConstraint.ts | 7 + .../anyAssignabilityInInheritance.ts | 6 +- .../anyAssignableToEveryType.ts | 1 + .../anyAssignableToEveryType2.ts | 3 + .../assignmentCompatWithObjectMembers.ts | 5 +- .../assignmentCompatWithObjectMembers2.ts | 2 + .../assignmentCompatWithObjectMembers3.ts | 2 + ...mentCompatWithObjectMembersNumericNames.ts | 2 + ...allSignatureAssignabilityInInheritance2.ts | 6 +- ...allSignatureAssignabilityInInheritance4.ts | 6 +- ...allSignatureAssignabilityInInheritance5.ts | 5 +- ...uctSignatureAssignabilityInInheritance2.ts | 6 +- ...uctSignatureAssignabilityInInheritance4.ts | 5 +- ...uctSignatureAssignabilityInInheritance5.ts | 5 +- .../everyTypeAssignableToAny.ts | 2 + .../nullAssignableToEveryType.ts | 2 +- .../undefinedAssignableToEveryType.ts | 1 + .../bestCommonTypeOfConditionalExpressions.ts | 5 +- ...bestCommonTypeOfConditionalExpressions2.ts | 4 +- .../heterogeneousArrayLiterals.ts | 2 + .../narrowingConstrainedTypeVariable.ts | 3 + .../arrayLiteralsWithRecursiveGenerics.ts | 6 +- .../recursiveTypeInGenericConstraint.ts | 5 +- .../recursiveTypesUsedAsFunctionParameters.ts | 5 +- .../nullIsSubtypeOfEverythingButUndefined.ts | 4 + .../stringLiteralTypeIsSubtypeOfString.ts | 4 +- .../subtypesAndSuperTypes/subtypesOfAny.ts | 5 +- ...subtypesOfTypeParameterWithConstraints2.ts | 5 +- .../subtypingWithCallSignatures2.ts | 6 + .../subtypingWithCallSignatures3.ts | 4 + .../subtypingWithCallSignatures4.ts | 6 +- .../subtypingWithConstructSignatures2.ts | 5 + .../subtypingWithConstructSignatures3.ts | 4 + .../subtypingWithConstructSignatures4.ts | 6 +- .../subtypingWithConstructSignatures5.ts | 6 +- .../subtypingWithObjectMembers4.ts | 6 +- .../undefinedIsSubtypeOfEverything.ts | 25 + .../objectTypesIdentity.ts | 6 +- .../objectTypesIdentity2.ts | 5 +- .../objectTypesIdentityWithCallSignatures.ts | 5 +- .../objectTypesIdentityWithCallSignatures2.ts | 5 +- ...yWithCallSignaturesDifferingParamCounts.ts | 5 +- ...IdentityWithCallSignaturesWithOverloads.ts | 6 +- ...ectTypesIdentityWithConstructSignatures.ts | 6 +- ...ctTypesIdentityWithConstructSignatures2.ts | 4 +- ...ConstructSignaturesDifferingParamCounts.ts | 4 +- ...tTypesIdentityWithGenericCallSignatures.ts | 6 +- ...TypesIdentityWithGenericCallSignatures2.ts | 6 +- ...ricCallSignaturesDifferingByConstraints.ts | 6 +- ...icCallSignaturesDifferingByConstraints2.ts | 6 +- ...icCallSignaturesDifferingByConstraints3.ts | 9 +- ...ericCallSignaturesDifferingByReturnType.ts | 5 +- ...ricCallSignaturesDifferingByReturnType2.ts | 6 +- ...lSignaturesDifferingTypeParameterCounts.ts | 6 +- ...llSignaturesDifferingTypeParameterNames.ts | 5 +- ...WithGenericCallSignaturesOptionalParams.ts | 5 +- ...ithGenericCallSignaturesOptionalParams2.ts | 5 +- ...ithGenericCallSignaturesOptionalParams3.ts | 6 +- ...nstructSignaturesDifferingByConstraints.ts | 2 + ...structSignaturesDifferingByConstraints2.ts | 7 +- ...structSignaturesDifferingByConstraints3.ts | 7 +- ...onstructSignaturesDifferingByReturnType.ts | 4 +- ...nstructSignaturesDifferingByReturnType2.ts | 6 +- ...tSignaturesDifferingTypeParameterCounts.ts | 4 +- ...ctSignaturesDifferingTypeParameterNames.ts | 6 +- ...enericConstructSignaturesOptionalParams.ts | 5 +- ...nericConstructSignaturesOptionalParams2.ts | 5 +- ...nericConstructSignaturesOptionalParams3.ts | 4 +- ...objectTypesIdentityWithNumericIndexers1.ts | 3 + ...objectTypesIdentityWithNumericIndexers2.ts | 5 + ...objectTypesIdentityWithNumericIndexers3.ts | 3 + .../objectTypesIdentityWithOptionality.ts | 6 +- .../objectTypesIdentityWithPrivates.ts | 4 +- .../objectTypesIdentityWithPrivates2.ts | 1 + .../objectTypesIdentityWithPublics.ts | 5 +- .../objectTypesIdentityWithStringIndexers.ts | 3 + .../objectTypesIdentityWithStringIndexers2.ts | 5 + .../typeParametersAreIdenticalToThemselves.ts | 4 +- ...allWithConstraintsTypeArgumentInference.ts | 3 + .../genericCallWithFunctionTypedArguments4.ts | 4 +- .../genericCallWithObjectTypeArgs2.ts | 4 +- ...ricCallWithObjectTypeArgsAndConstraints.ts | 10 +- ...icCallWithObjectTypeArgsAndConstraints2.ts | 1 + ...icClassWithObjectTypeArgsAndConstraints.ts | 7 +- .../keyofInferenceLowerPriorityThanReturn.ts | 4 + .../types/union/discriminatedUnionTypes3.ts | 19 + 497 files changed, 8097 insertions(+), 197 deletions(-) create mode 100644 tests/cases/conformance/ambient/ambientDeclarationsPatterns/ambientDeclarationsPatterns.ts create mode 100644 tests/cases/conformance/ambient/ambientDeclarationsPatterns/declarations.d.ts create mode 100644 tests/cases/conformance/ambient/ambientShorthand_merging/ambientShorthand_merging.ts create mode 100644 tests/cases/conformance/ambient/ambientShorthand_merging/declarations1.d.ts create mode 100644 tests/cases/conformance/ambient/ambientShorthand_merging/declarations2.d.ts create mode 100644 tests/cases/conformance/ambient/ambientShorthand_reExport/ambientShorthand_reExport.ts create mode 100644 tests/cases/conformance/ambient/ambientShorthand_reExport/declarations.d.ts create mode 100644 tests/cases/conformance/ambient/ambientShorthand_reExport/jquery.d.ts create mode 100644 tests/cases/conformance/ambient/ambientShorthand_reExport/reExportAll.ts create mode 100644 tests/cases/conformance/ambient/ambientShorthand_reExport/reExportX.ts create mode 100644 tests/cases/conformance/async/es6/functionDeclarations/asyncOrYieldAsBindingIdentifier1.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock1.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock10.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock11.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock12.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock13.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock14.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock15.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock16.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock17.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock18.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock19.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock2.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock20.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock21.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock22.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock23.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock24.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock25.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock26.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock27.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock3.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock6.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock7.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlockUseBeforeDef1.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlockUseBeforeDef2.ts create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/superInStaticMembers1.ts create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers1.ts create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers2.ts create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers3.ts create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers4.ts create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers10.ts create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers11.ts create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers12.ts create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers13.ts create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers3.ts create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers4.ts create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers5.ts create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers6.ts create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers7.ts create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers8.ts create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers9.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameHashCharName.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameInInExpression.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameInInExpressionTransform.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameInInExpressionUnused.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiersJs.ts create mode 100644 tests/cases/conformance/classes/propertyMemberDeclarations/abstractPropertyInitializer.ts create mode 100644 tests/cases/conformance/controlFlow/assertionTypePredicates2.ts create mode 100644 tests/cases/conformance/controlFlow/controlFlowAliasing.ts create mode 100644 tests/cases/conformance/controlFlow/controlFlowAliasingCatchVariables.ts create mode 100644 tests/cases/conformance/controlFlow/controlFlowForInStatement2.ts create mode 100644 tests/cases/conformance/controlFlow/controlFlowInOperator.ts create mode 100644 tests/cases/conformance/controlFlow/controlFlowTypeofObject.ts create mode 100644 tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts create mode 100644 tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/fs.d.ts create mode 100644 tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/main.ts create mode 100644 tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/package.json create mode 100644 tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/typeReferenceRelatedFiles.ts create mode 100644 tests/cases/conformance/decorators/class/constructor/parameter/decoratorOnClassConstructorParameter5.ts create mode 100644 tests/cases/conformance/decorators/class/decoratedBlockScopedClass1.ts create mode 100644 tests/cases/conformance/decorators/class/decoratedBlockScopedClass2.ts create mode 100644 tests/cases/conformance/decorators/class/decoratedBlockScopedClass3.ts create mode 100644 tests/cases/conformance/decorators/class/method/decoratorOnClassMethod14.ts create mode 100644 tests/cases/conformance/decorators/class/method/decoratorOnClassMethod15.ts create mode 100644 tests/cases/conformance/decorators/class/method/decoratorOnClassMethod16.ts create mode 100644 tests/cases/conformance/decorators/class/method/decoratorOnClassMethod17.ts create mode 100644 tests/cases/conformance/decorators/class/method/decoratorOnClassMethod18.ts create mode 100644 tests/cases/conformance/decorators/decoratorMetadataWithTypeOnlyImport2.ts create mode 100644 tests/cases/conformance/es2018/es2018IntlAPIs.ts create mode 100644 tests/cases/conformance/es2020/es2020IntlAPIs.ts create mode 100644 tests/cases/conformance/es6/spread/arraySpreadImportHelpers.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringWithCommentsInArrowFunction.ts create mode 100644 tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithIntersectionType.ts create mode 100644 tests/cases/conformance/expressions/thisKeyword/typeOfThisGeneral.ts create mode 100644 tests/cases/conformance/externalModules/moduleResolutionWithoutExtension1.ts create mode 100644 tests/cases/conformance/externalModules/moduleResolutionWithoutExtension2.ts create mode 100644 tests/cases/conformance/externalModules/moduleResolutionWithoutExtension3.ts create mode 100644 tests/cases/conformance/externalModules/moduleResolutionWithoutExtension4.ts create mode 100644 tests/cases/conformance/externalModules/moduleResolutionWithoutExtension5.ts create mode 100644 tests/cases/conformance/externalModules/moduleResolutionWithoutExtension6.ts create mode 100644 tests/cases/conformance/externalModules/moduleResolutionWithoutExtension7.ts create mode 100644 tests/cases/conformance/externalModules/moduleResolutionWithoutExtension8.ts create mode 100644 tests/cases/conformance/externalModules/typeOnly/exportSpecifiers.ts create mode 100644 tests/cases/conformance/externalModules/typeOnly/importDefaultNamedType/a.ts create mode 100644 tests/cases/conformance/externalModules/typeOnly/importDefaultNamedType/importDefaultNamedType.ts create mode 100644 tests/cases/conformance/externalModules/typeOnly/importSpecifiers1.ts create mode 100644 tests/cases/conformance/externalModules/typeOnly/preserveValueImports.ts create mode 100644 tests/cases/conformance/externalModules/typeOnly/preserveValueImports_errors.ts create mode 100644 tests/cases/conformance/externalModules/typeOnly/preserveValueImports_importsNotUsedAsValues.ts create mode 100644 tests/cases/conformance/externalModules/typeOnly/preserveValueImports_mixedImports.ts create mode 100644 tests/cases/conformance/externalModules/typeOnly/preserveValueImports_module.ts create mode 100644 tests/cases/conformance/importAssertion/importAssertion1.ts create mode 100644 tests/cases/conformance/importAssertion/importAssertion2.ts create mode 100644 tests/cases/conformance/importAssertion/importAssertion3.ts create mode 100644 tests/cases/conformance/importAssertion/importAssertion4.ts create mode 100644 tests/cases/conformance/importAssertion/importAssertion5.ts create mode 100644 tests/cases/conformance/jsdoc/enumTagImported/enumTagImported.ts create mode 100644 tests/cases/conformance/jsdoc/jsdocAugments_qualifiedName/jsdocAugments_qualifiedName.ts create mode 100644 tests/cases/conformance/jsdoc/jsdocTemplateTagDefault.ts create mode 100644 tests/cases/conformance/jsdoc/jsdocTemplateTagNameResolution.ts create mode 100644 tests/cases/conformance/jsdoc/jsdocVariadicType.ts create mode 100644 tests/cases/conformance/jsdoc/seeTag3.ts create mode 100644 tests/cases/conformance/jsdoc/thisTag2.ts create mode 100644 tests/cases/conformance/jsx/jsxParsingError4.tsx create mode 100644 tests/cases/conformance/jsx/jsxUnclosedParserRecovery.ts create mode 100644 tests/cases/conformance/jsx/tsxReactEmitSpreadAttribute.ts create mode 100644 tests/cases/conformance/moduleResolution/declarationNotFoundPackageBundlesTypes.ts create mode 100644 tests/cases/conformance/moduleResolution/scopedPackages/index.d.ts create mode 100644 tests/cases/conformance/moduleResolution/scopedPackages/scopedPackages.ts create mode 100644 tests/cases/conformance/moduleResolution/scopedPackages/z.d.ts create mode 100644 tests/cases/conformance/moduleResolution/scopedPackagesClassic/index.d.ts create mode 100644 tests/cases/conformance/moduleResolution/scopedPackagesClassic/scopedPackagesClassic.ts create mode 100644 tests/cases/conformance/moduleResolution/untypedModuleImport_allowJs/untypedModuleImport_allowJs.ts create mode 100644 tests/cases/conformance/moduleResolution/untypedModuleImport_vsAmbient/declarations.d.ts create mode 100644 tests/cases/conformance/moduleResolution/untypedModuleImport_vsAmbient/untypedModuleImport_vsAmbient.ts create mode 100644 tests/cases/conformance/node/allowJs/nodeAllowJsPackageSelfName.ts create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJs1.ts create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsCjsFromJs.ts create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsConditionalPackageExports.ts create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsDynamicImport.ts create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsExportAssignment.ts create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsGeneratedNameCollisions.ts create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportAssignment.ts create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportHelpersCollisions1.ts create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportHelpersCollisions2.ts create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportHelpersCollisions3.ts create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportMeta.ts create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackageExports.ts create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackageImports.ts create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackagePatternExports.ts create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackagePatternExportsTrailers.ts create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsSynchronousCallErrors.ts create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsTopLevelAwait.ts create mode 100644 tests/cases/conformance/node/legacyNodeModulesExportsSpecifierGenerationConditions.ts create mode 100644 tests/cases/conformance/node/nodeModules1.ts create mode 100644 tests/cases/conformance/node/nodeModulesCjsFormatFileAlwaysHasDefault.ts create mode 100644 tests/cases/conformance/node/nodeModulesConditionalPackageExports.ts create mode 100644 tests/cases/conformance/node/nodeModulesDeclarationEmitDynamicImportWithPackageExports.ts create mode 100644 tests/cases/conformance/node/nodeModulesDeclarationEmitWithPackageExports.ts create mode 100644 tests/cases/conformance/node/nodeModulesDynamicImport.ts create mode 100644 tests/cases/conformance/node/nodeModulesExportAssignments.ts create mode 100644 tests/cases/conformance/node/nodeModulesExportsBlocksSpecifierResolution.ts create mode 100644 tests/cases/conformance/node/nodeModulesExportsSpecifierGenerationConditions.ts create mode 100644 tests/cases/conformance/node/nodeModulesExportsSpecifierGenerationDirectory.ts create mode 100644 tests/cases/conformance/node/nodeModulesExportsSpecifierGenerationPattern.ts create mode 100644 tests/cases/conformance/node/nodeModulesForbidenSyntax.ts create mode 100644 tests/cases/conformance/node/nodeModulesGeneratedNameCollisions.ts create mode 100644 tests/cases/conformance/node/nodeModulesImportAssertions.ts create mode 100644 tests/cases/conformance/node/nodeModulesImportAssignments.ts create mode 100644 tests/cases/conformance/node/nodeModulesImportHelpersCollisions.ts create mode 100644 tests/cases/conformance/node/nodeModulesImportHelpersCollisions2.ts create mode 100644 tests/cases/conformance/node/nodeModulesImportHelpersCollisions3.ts create mode 100644 tests/cases/conformance/node/nodeModulesImportMeta.ts create mode 100644 tests/cases/conformance/node/nodeModulesImportResolutionIntoExport.ts create mode 100644 tests/cases/conformance/node/nodeModulesImportResolutionNoCycle.ts create mode 100644 tests/cases/conformance/node/nodeModulesPackageExports.ts create mode 100644 tests/cases/conformance/node/nodeModulesPackageImports.ts create mode 100644 tests/cases/conformance/node/nodeModulesPackagePatternExports.ts create mode 100644 tests/cases/conformance/node/nodeModulesPackagePatternExportsTrailers.ts create mode 100644 tests/cases/conformance/node/nodeModulesResolveJsonModule.ts create mode 100644 tests/cases/conformance/node/nodeModulesSynchronousCallErrors.ts create mode 100644 tests/cases/conformance/node/nodeModulesTopLevelAwait.ts create mode 100644 tests/cases/conformance/node/nodeModulesTypesVersionPackageExports.ts create mode 100644 tests/cases/conformance/node/nodePackageSelfName.ts create mode 100644 tests/cases/conformance/node/nodePackageSelfNameScoped.ts create mode 100644 tests/cases/conformance/override/override15.ts create mode 100644 tests/cases/conformance/override/override19.ts create mode 100644 tests/cases/conformance/override/override20.ts create mode 100644 tests/cases/conformance/override/override_js4.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement22.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement23.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement24.ts create mode 100644 tests/cases/conformance/salsa/plainJSBinderErrors.ts create mode 100644 tests/cases/conformance/salsa/plainJSRedeclare.ts create mode 100644 tests/cases/conformance/salsa/plainJSRedeclare2.ts create mode 100644 tests/cases/conformance/salsa/plainJSRedeclare3.ts create mode 100644 tests/cases/conformance/salsa/plainJSReservedStrict.ts create mode 100644 tests/cases/conformance/salsa/spellingUncheckedJS.ts create mode 100644 tests/cases/conformance/salsa/typeFromJSInitializer2.ts create mode 100644 tests/cases/conformance/salsa/typeFromJSInitializer3.ts create mode 100644 tests/cases/conformance/salsa/typeFromJSInitializer4.ts create mode 100644 tests/cases/conformance/statements/for-inStatements/for-inStatementsAsyncIdentifier.ts create mode 100644 tests/cases/conformance/types/intersection/intersectionOfUnionNarrowing.ts create mode 100644 tests/cases/conformance/types/mapped/mappedTypeAsClauseRelationships.ts create mode 100644 tests/cases/conformance/types/mapped/mappedTypeProperties.ts create mode 100644 tests/cases/conformance/types/members/indexSignatures1.ts create mode 100644 tests/cases/conformance/types/specifyingTypes/typeQueries/typeofThis.ts create mode 100644 tests/cases/conformance/types/specifyingTypes/typeQueries/typeofThisWithImplicitThis.ts create mode 100644 tests/cases/conformance/types/spread/spreadDuplicate.ts create mode 100644 tests/cases/conformance/types/spread/spreadDuplicateExact.ts create mode 100644 tests/cases/conformance/types/spread/spreadUnion4.ts create mode 100644 tests/cases/conformance/types/thisType/thisTypeInTaggedTemplateCall.ts create mode 100644 tests/cases/conformance/types/union/discriminatedUnionTypes3.ts diff --git a/tests/cases/conformance/ambient/ambientDeclarations.ts b/tests/cases/conformance/ambient/ambientDeclarations.ts index 379f5a5440..156ca565af 100644 --- a/tests/cases/conformance/ambient/ambientDeclarations.ts +++ b/tests/cases/conformance/ambient/ambientDeclarations.ts @@ -73,3 +73,4 @@ declare module 'external1' { var q; } +let qq2 = new cls(); \ No newline at end of file diff --git a/tests/cases/conformance/ambient/ambientDeclarationsPatterns/ambientDeclarationsPatterns.ts b/tests/cases/conformance/ambient/ambientDeclarationsPatterns/ambientDeclarationsPatterns.ts new file mode 100644 index 0000000000..8b2be7e0b2 --- /dev/null +++ b/tests/cases/conformance/ambient/ambientDeclarationsPatterns/ambientDeclarationsPatterns.ts @@ -0,0 +1,11 @@ +// @Filename: user.ts +///<reference path="declarations.d.ts" /> +import {foo, baz} from "foobarbaz"; +foo(baz); + +import {foos} from "foosball"; +foo(foos); + +// Works with relative file name +import fileText from "./file!text"; +foo(fileText); \ No newline at end of file diff --git a/tests/cases/conformance/ambient/ambientDeclarationsPatterns/declarations.d.ts b/tests/cases/conformance/ambient/ambientDeclarationsPatterns/declarations.d.ts new file mode 100644 index 0000000000..725593c54e --- /dev/null +++ b/tests/cases/conformance/ambient/ambientDeclarationsPatterns/declarations.d.ts @@ -0,0 +1,18 @@ +// @Filename: declarations.d.ts +declare module "foo*baz" { + export function foo(s: string): void; +} +// Augmentations still work +declare module "foo*baz" { + export const baz: string; +} + +// Longest prefix wins +declare module "foos*" { + export const foos: string; +} + +declare module "*!text" { + const x: string; + export default x; +} diff --git a/tests/cases/conformance/ambient/ambientInsideNonAmbient.ts b/tests/cases/conformance/ambient/ambientInsideNonAmbient.ts index e2f24113c9..d07ac13995 100644 --- a/tests/cases/conformance/ambient/ambientInsideNonAmbient.ts +++ b/tests/cases/conformance/ambient/ambientInsideNonAmbient.ts @@ -4,6 +4,7 @@ module M { export declare class C { } export declare enum E { } export declare module M { } + let qq1 = new C(); } module M2 { @@ -12,4 +13,5 @@ module M2 { declare class C { } declare enum E { } declare module M { } + let qq1 = new C(); } \ No newline at end of file diff --git a/tests/cases/conformance/ambient/ambientInsideNonAmbientExternalModule.ts b/tests/cases/conformance/ambient/ambientInsideNonAmbientExternalModule.ts index dbdc315c74..3e1e4bfa35 100644 --- a/tests/cases/conformance/ambient/ambientInsideNonAmbientExternalModule.ts +++ b/tests/cases/conformance/ambient/ambientInsideNonAmbientExternalModule.ts @@ -3,4 +3,6 @@ export declare var x; export declare function f(); export declare class C { } export declare enum E { } -export declare module M { } \ No newline at end of file +export declare module M { } + +let qq1 = new C(); diff --git a/tests/cases/conformance/ambient/ambientShorthand_merging/ambientShorthand_merging.ts b/tests/cases/conformance/ambient/ambientShorthand_merging/ambientShorthand_merging.ts new file mode 100644 index 0000000000..a52d4c04bf --- /dev/null +++ b/tests/cases/conformance/ambient/ambientShorthand_merging/ambientShorthand_merging.ts @@ -0,0 +1,6 @@ +// @Filename: user.ts +///<reference path="declarations1.d.ts" /> +///<reference path="declarations1.d.ts" /> +import foo, {bar} from "foo"; +foo; +bar; diff --git a/tests/cases/conformance/ambient/ambientShorthand_merging/declarations1.d.ts b/tests/cases/conformance/ambient/ambientShorthand_merging/declarations1.d.ts new file mode 100644 index 0000000000..66bdaa0fc8 --- /dev/null +++ b/tests/cases/conformance/ambient/ambientShorthand_merging/declarations1.d.ts @@ -0,0 +1,2 @@ +// @Filename: declarations1.d.ts +declare module "foo"; diff --git a/tests/cases/conformance/ambient/ambientShorthand_merging/declarations2.d.ts b/tests/cases/conformance/ambient/ambientShorthand_merging/declarations2.d.ts new file mode 100644 index 0000000000..ff7233979a --- /dev/null +++ b/tests/cases/conformance/ambient/ambientShorthand_merging/declarations2.d.ts @@ -0,0 +1,4 @@ +// @Filename: declarations2.d.ts +declare module "foo" { + export const bar: number; +} \ No newline at end of file diff --git a/tests/cases/conformance/ambient/ambientShorthand_reExport/ambientShorthand_reExport.ts b/tests/cases/conformance/ambient/ambientShorthand_reExport/ambientShorthand_reExport.ts new file mode 100644 index 0000000000..45ba9cd111 --- /dev/null +++ b/tests/cases/conformance/ambient/ambientShorthand_reExport/ambientShorthand_reExport.ts @@ -0,0 +1,5 @@ +// @Filename: reExportUser.ts +import {x} from "./reExportX"; +import * as $ from "./reExportAll"; +// '$' is not callable, it is an object. +x($); diff --git a/tests/cases/conformance/ambient/ambientShorthand_reExport/declarations.d.ts b/tests/cases/conformance/ambient/ambientShorthand_reExport/declarations.d.ts new file mode 100644 index 0000000000..58d1d8215b --- /dev/null +++ b/tests/cases/conformance/ambient/ambientShorthand_reExport/declarations.d.ts @@ -0,0 +1,2 @@ +// @Filename: declarations.d.ts +declare module "jquery"; \ No newline at end of file diff --git a/tests/cases/conformance/ambient/ambientShorthand_reExport/jquery.d.ts b/tests/cases/conformance/ambient/ambientShorthand_reExport/jquery.d.ts new file mode 100644 index 0000000000..58d1d8215b --- /dev/null +++ b/tests/cases/conformance/ambient/ambientShorthand_reExport/jquery.d.ts @@ -0,0 +1,2 @@ +// @Filename: declarations.d.ts +declare module "jquery"; \ No newline at end of file diff --git a/tests/cases/conformance/ambient/ambientShorthand_reExport/reExportAll.ts b/tests/cases/conformance/ambient/ambientShorthand_reExport/reExportAll.ts new file mode 100644 index 0000000000..ae6c5d4864 --- /dev/null +++ b/tests/cases/conformance/ambient/ambientShorthand_reExport/reExportAll.ts @@ -0,0 +1,2 @@ +// @Filename: reExportAll.ts +export * from "jquery"; \ No newline at end of file diff --git a/tests/cases/conformance/ambient/ambientShorthand_reExport/reExportX.ts b/tests/cases/conformance/ambient/ambientShorthand_reExport/reExportX.ts new file mode 100644 index 0000000000..07420e1616 --- /dev/null +++ b/tests/cases/conformance/ambient/ambientShorthand_reExport/reExportX.ts @@ -0,0 +1,2 @@ +// @Filename: reExportX.ts +export {x} from "jquery"; \ No newline at end of file diff --git a/tests/cases/conformance/async/es5/asyncMethodWithSuper_es5.ts b/tests/cases/conformance/async/es5/asyncMethodWithSuper_es5.ts index c89369d02b..9f7e496b8a 100644 --- a/tests/cases/conformance/async/es5/asyncMethodWithSuper_es5.ts +++ b/tests/cases/conformance/async/es5/asyncMethodWithSuper_es5.ts @@ -55,3 +55,4 @@ class B extends A { ({ f: super["x"] } = { f }); } } +let b1 = new B(); diff --git a/tests/cases/conformance/async/es6/functionDeclarations/asyncOrYieldAsBindingIdentifier1.ts b/tests/cases/conformance/async/es6/functionDeclarations/asyncOrYieldAsBindingIdentifier1.ts new file mode 100644 index 0000000000..31c1c4055c --- /dev/null +++ b/tests/cases/conformance/async/es6/functionDeclarations/asyncOrYieldAsBindingIdentifier1.ts @@ -0,0 +1,49 @@ +// @target: esnext + +function f_let () { + let await = 1 +} + +function f1_var () { + var await = 1 +} + +function f1_const () { + const await = 1 +} + +async function f2_let () { + let await = 1 +} + +async function f2_var () { + var await = 1 +} + +async function f2_const () { + const await = 1 +} + +function f3_let () { + let yield = 2 +} + +function f3_var () { + var yield = 2 +} + +function f3_const () { + const yield = 2 +} + +function * f4_let () { + let yield = 2; +} + +function * f4_var () { + var yield = 2; +} + +function * f4_const () { + const yield = 2; +} \ No newline at end of file diff --git a/tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAsIdentifier.ts b/tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAsIdentifier.ts index 4c251a03c3..1a1aeedd41 100644 --- a/tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAsIdentifier.ts +++ b/tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAsIdentifier.ts @@ -1,5 +1,5 @@ class abstract { foo() { return 1; } } - +let a = new abstract() new abstract; \ No newline at end of file diff --git a/tests/cases/conformance/classes/classDeclarations/classBody/classWithEmptyBody.ts b/tests/cases/conformance/classes/classDeclarations/classBody/classWithEmptyBody.ts index 1a2e456e0f..5437d3a67d 100644 --- a/tests/cases/conformance/classes/classDeclarations/classBody/classWithEmptyBody.ts +++ b/tests/cases/conformance/classes/classDeclarations/classBody/classWithEmptyBody.ts @@ -17,4 +17,6 @@ var d: D; var o: {} = d; d = 1; d = { foo: '' } -d = () => { } \ No newline at end of file +d = () => { } +let cc = new C(); +let dd = new D(); \ No newline at end of file diff --git a/tests/cases/conformance/classes/classDeclarations/classInsideBlock.ts b/tests/cases/conformance/classes/classDeclarations/classInsideBlock.ts index efc3ccff9a..3184fc17d5 100644 --- a/tests/cases/conformance/classes/classDeclarations/classInsideBlock.ts +++ b/tests/cases/conformance/classes/classDeclarations/classInsideBlock.ts @@ -1,3 +1,4 @@ function foo() { class C { } + let a1 = new C() } \ No newline at end of file diff --git a/tests/cases/conformance/classes/classDeclarations/classWithPredefinedTypesAsNames.ts b/tests/cases/conformance/classes/classDeclarations/classWithPredefinedTypesAsNames.ts index 93daf743f8..1d496f4eaf 100644 --- a/tests/cases/conformance/classes/classDeclarations/classWithPredefinedTypesAsNames.ts +++ b/tests/cases/conformance/classes/classDeclarations/classWithPredefinedTypesAsNames.ts @@ -3,4 +3,6 @@ class any { } class number { } class boolean { } -class string { } \ No newline at end of file +class string { } + +let aa = new any(); \ No newline at end of file diff --git a/tests/cases/conformance/classes/classDeclarations/classWithSemicolonClassElement1.ts b/tests/cases/conformance/classes/classDeclarations/classWithSemicolonClassElement1.ts index 6571258d9d..5f049c27e3 100644 --- a/tests/cases/conformance/classes/classDeclarations/classWithSemicolonClassElement1.ts +++ b/tests/cases/conformance/classes/classDeclarations/classWithSemicolonClassElement1.ts @@ -1,3 +1,4 @@ class C { ; -} \ No newline at end of file +} +let c9 = new C() \ No newline at end of file diff --git a/tests/cases/conformance/classes/classDeclarations/classWithSemicolonClassElement2.ts b/tests/cases/conformance/classes/classDeclarations/classWithSemicolonClassElement2.ts index 716c8b58ae..511baa19f9 100644 --- a/tests/cases/conformance/classes/classDeclarations/classWithSemicolonClassElement2.ts +++ b/tests/cases/conformance/classes/classDeclarations/classWithSemicolonClassElement2.ts @@ -1,4 +1,5 @@ class C { ; ; -} \ No newline at end of file +} +let a15 = new C() \ No newline at end of file diff --git a/tests/cases/conformance/classes/classExpressions/classExpression2.ts b/tests/cases/conformance/classes/classExpressions/classExpression2.ts index 6365cd07eb..d39896a361 100644 --- a/tests/cases/conformance/classes/classExpressions/classExpression2.ts +++ b/tests/cases/conformance/classes/classExpressions/classExpression2.ts @@ -1,2 +1,4 @@ class D { } -var v = class C extends D {}; \ No newline at end of file +var v = class C extends D {}; +let dd = new D() +let vv = new v() \ No newline at end of file diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock1.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock1.ts new file mode 100644 index 0000000000..dd9455ad8c --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock1.ts @@ -0,0 +1,11 @@ +// @target: esnext, es2015, es5 +const a = 2; + +class C { + static { + const a = 1; + + a; + } +} +let a1 = new C() diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock10.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock10.ts new file mode 100644 index 0000000000..aa82e1db13 --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock10.ts @@ -0,0 +1,30 @@ +// @target: esnext, es2015, es5 +var a1 = 1; +var a2 = 1; +const b1 = 2; +const b2 = 2; + +function f () { + var a1 = 11; + const b1 = 22; + + class C1 { + static { + var a1 = 111; + var a2 = 111; + const b1 = 222; + const b2 = 222; + } + } + let c1 = new C1(); +} + +class C2 { + static { + var a1 = 111; + var a2 = 111; + const b1 = 222; + const b2 = 222; + } +} +let c2 = new C2(); \ No newline at end of file diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock11.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock11.ts new file mode 100644 index 0000000000..00492ae619 --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock11.ts @@ -0,0 +1,15 @@ +// @target: esnext, es2015 + +let getX; +class C { + #x = 1 + constructor(x: number) { + this.#x = x; + } + + static { + // getX has privileged access to #x + getX = (obj: C) => obj.#x; + } +} +let cc = new C(1); diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock12.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock12.ts new file mode 100644 index 0000000000..436c690665 --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock12.ts @@ -0,0 +1,10 @@ +// @useDefineForClassFields: false +// @target: es2015 + +class C { + static #x = 1; + + static { + C.#x; + } +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock13.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock13.ts new file mode 100644 index 0000000000..8120cc3575 --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock13.ts @@ -0,0 +1,14 @@ +// @target: esnext, es2015 +// @useDefineForClassFields: true + +class C { + static #x = 123; + + static { + console.log(C.#x) + } + + foo () { + return C.#x; + } +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock14.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock14.ts new file mode 100644 index 0000000000..ff510c8436 --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock14.ts @@ -0,0 +1,15 @@ +// @useDefineForClassFields: false +// @target: es2015 + +class C { + static #_1 = 1; + static #_3 = 1; + static #_5 = 1; + + static {} + static {} + static {} + static {} + static {} + static {} +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock15.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock15.ts new file mode 100644 index 0000000000..ec2727660f --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock15.ts @@ -0,0 +1,18 @@ +// @target: esnext, es2015 +// @useDefineForClassFields: true +var _C__1; + +class C { + static #_1 = 1; + static #_3 = 3; + static #_5 = 5; + + static {} + static {} + static {} + static {} + static {} + static {} +} + +console.log(_C__1) diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock16.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock16.ts new file mode 100644 index 0000000000..bc15e5f1ab --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock16.ts @@ -0,0 +1,26 @@ +// @target: es2015 + +let getX: (c: C) => number; +class C { + #x = 1 + constructor(x: number) { + this.#x = x; + } + + static { + // getX has privileged access to #x + getX = (obj: C) => obj.#x; + getY = (obj: D) => obj.#y; + } +} + +let getY: (c: D) => number; +class D { + #y = 1 + + static { + // getY has privileged access to y + getX = (obj: C) => obj.#x; + getY = (obj: D) => obj.#y; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock17.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock17.ts new file mode 100644 index 0000000000..8d26cb4a08 --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock17.ts @@ -0,0 +1,33 @@ +// @target: es2015 + +let friendA: { getX(o: A): number, setX(o: A, v: number): void }; + +class A { + #x: number; + + constructor (v: number) { + this.#x = v; + } + + getX () { + return this.#x; + } + + static { + friendA = { + getX(obj) { return obj.#x }, + setX(obj, value) { obj.#x = value } + }; + } +}; + +class B { + constructor(a: A) { + const x = friendA.getX(a); // ok + friendA.setX(a, x + 1); // ok + } +}; + +const a = new A(41); +const b = new B(a); +a.getX(); \ No newline at end of file diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock18.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock18.ts new file mode 100644 index 0000000000..a36bd50917 --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock18.ts @@ -0,0 +1,15 @@ +// @target: esnext, es2015, es5 + +function foo () { + return class { + static foo = 1; + static { + const c = class { + static bar = 2; + static { + // do + } + } + } + } +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock19.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock19.ts new file mode 100644 index 0000000000..33bb993be6 --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock19.ts @@ -0,0 +1,6 @@ +class C { + @decorator + static { + // something + } +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock2.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock2.ts new file mode 100644 index 0000000000..292d7181bb --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock2.ts @@ -0,0 +1,20 @@ +// @target: esnext, es2015, es5 + +const a = 1; +const b = 2; + +class C { + static { + const a = 11; + + a; + b; + } + + static { + const a = 11; + + a; + b; + } +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock20.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock20.ts new file mode 100644 index 0000000000..72a9d09161 --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock20.ts @@ -0,0 +1,13 @@ +class C { + async static { + // something + } + + public static { + // something + } + + readonly private static { + // something + } +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock21.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock21.ts new file mode 100644 index 0000000000..65422df9cd --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock21.ts @@ -0,0 +1,7 @@ +class C { + /* jsdocs */ + static { + // something + } +} +let cc = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock22.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock22.ts new file mode 100644 index 0000000000..8d3be9861a --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock22.ts @@ -0,0 +1,72 @@ +// @target: esnext + +let await: "any"; +class C { + static { + let await: any; // illegal, cannot declare a new binding for await + } + static { + let { await } = {} as any; // illegal, cannot declare a new binding for await + } + static { + let { await: other } = {} as any; // legal + } + static { + let await; // illegal, cannot declare a new binding for await + } + static { + function await() { }; // illegal + } + static { + class await { }; // illegal + } + + static { + class D { + await = 1; // legal + x = await; // legal (initializers have an implicit function boundary) + }; + } + static { + (function await() { }); // legal, 'await' in function expression name not bound inside of static block + } + static { + (class await { }); // legal, 'await' in class expression name not bound inside of static block + } + static { + (function () { return await; }); // legal, 'await' is inside of a new function boundary + } + static { + (() => await); // legal, 'await' is inside of a new function boundary + } + + static { + class E { + constructor() { await; } + method() { await; } + get accessor() { + await; + return 1; + } + set accessor(v: any) { + await; + } + propLambda = () => { await; } + propFunc = function () { await; } + } + } + static { + class S { + static method() { await; } + static get accessor() { + await; + return 1; + } + static set accessor(v: any) { + await; + } + static propLambda = () => { await; } + static propFunc = function () { await; } + } + } +} \ No newline at end of file diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock23.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock23.ts new file mode 100644 index 0000000000..bb83b27dca --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock23.ts @@ -0,0 +1,21 @@ +// @target: esnext + +const nums = [1, 2, 3].map(n => Promise.resolve(n)) + +class C { + static { + for await (const nn of nums) { + console.log(nn) + } + } +} + +async function foo () { + class C { + static { + for await (const nn of nums) { + console.log(nn) + } + } + } +} \ No newline at end of file diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock24.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock24.ts new file mode 100644 index 0000000000..8132238772 --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock24.ts @@ -0,0 +1,8 @@ +// @module: commonjs, es2015, es2020, UMD, AMD, System, esnext + +export class C { + static x: number; + static { + C.x = 1; + } +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock25.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock25.ts new file mode 100644 index 0000000000..56f99a6122 --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock25.ts @@ -0,0 +1,23 @@ +// @target: esnext +// @declaration: true +// @declarationMap: true +// @sourceMap: true + +const a = 1; +const b = 2; + +class C { + static { + const a = 11; + + a; + b; + } + + static { + const a = 11; + + a; + b; + } +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock26.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock26.ts new file mode 100644 index 0000000000..1081729acd --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock26.ts @@ -0,0 +1,30 @@ +// @target: esnext + +class C { + static { + await; // illegal + } + static { + await (1); // illegal + } + static { + ({ [await]: 1 }); // illegal + } + static { + class D { + [await] = 1; // illegal (computed property names are evaluated outside of a class body + }; + } + static { + ({ await }); // illegal short-hand property reference + } + static { + await: // illegal, 'await' cannot be used as a label + break await; // illegal, 'await' cannot be used as a label + } + static { + function f(await) { } + const ff = (await) => { } + const fff = await => { } + } +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock27.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock27.ts new file mode 100644 index 0000000000..a0429bbb54 --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock27.ts @@ -0,0 +1,17 @@ +// https://github.com/microsoft/TypeScript/issues/44872 + +void class Foo { + static prop = 1 + static { + console.log(Foo.prop); + Foo.prop++; + } + static { + console.log(Foo.prop); + Foo.prop++; + } + static { + console.log(Foo.prop); + Foo.prop++; + } +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock3.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock3.ts new file mode 100644 index 0000000000..84125fdbed --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock3.ts @@ -0,0 +1,19 @@ +// @target: esnext + +const a = 1; + +class C { + static f1 = 1; + + static { + console.log(C.f1, C.f2, C.f3) + } + + static f2 = 2; + + static { + console.log(C.f1, C.f2, C.f3) + } + + static f3 = 3; +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts new file mode 100644 index 0000000000..7a944a4969 --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts @@ -0,0 +1,16 @@ +// @target: esnext + +class C { + static s1 = 1; + + static { + this.s1; + C.s1; + + this.s2; + C.s2; + } + + static s2 = 2; + static ss2 = this.s1; +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts new file mode 100644 index 0000000000..2410b532ab --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts @@ -0,0 +1,19 @@ +// @target: esnext, es2015, es5 + +class B { + static a = 1; + static b = 2; +} + +class C extends B { + static b = 3; + static c = super.a + + static { + this.b; + super.b; + super.a; + } +} + +let cc = new C(); diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock6.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock6.ts new file mode 100644 index 0000000000..cdd0cda2fe --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock6.ts @@ -0,0 +1,62 @@ +class B { + static a = 1; +} + +class C extends B { + static { + let await = 1; + let arguments = 1; + let eval = 1; + } + + static { + await: if (true) { + + } + + arguments; + await; + super(); + } +} + +class CC { + constructor () { + class C extends B { + static { + class CC extends B { + constructor () { + super(); + } + } + super(); + } + } + } +} + +async function foo () { + class C extends B { + static { + arguments; + await; + + async function ff () { + arguments; + await; + } + } + } +} + +function foo1 () { + class C extends B { + static { + arguments; + + function ff () { + arguments; + } + } + } +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock7.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock7.ts new file mode 100644 index 0000000000..727ada0342 --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock7.ts @@ -0,0 +1,43 @@ +class C { + static { + await 1; + yield 1; + return 1; + } +} + +async function f1 () { + class C { + static { + await 1; + + async function ff () { + await 1; + } + } + } +} + +function * f2 () { + class C { + static { + yield 1; + + function * ff () { + yield 1; + } + } + } +} + +function f3 () { + class C { + static { + return 1; + + function ff () { + return 1 + } + } + } +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts new file mode 100644 index 0000000000..d2e5220b83 --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts @@ -0,0 +1,48 @@ +function foo (v: number) { + label: while (v) { + class C { + static { + if (v === 1) { + break label; + } + if (v === 2) { + continue label; + } + if (v === 3) { + break + } + if (v === 4) { + continue + } + } + } + + if (v === 5) { + break label; + } + if (v === 6) { + continue label; + } + if (v === 7) { + break; + } + if (v === 8) { + continue; + } + } + + class C { + static { + outer: break outer; // valid + loop: while (v) { + if (v === 1) break loop; // valid + if (v === 2) continue loop; // valid + if (v === 3) break; // valid + if (v === 4) continue; // valid + } + switch (v) { + default: break; // valid + } + } + } +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts new file mode 100644 index 0000000000..d99157b190 --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts @@ -0,0 +1,8 @@ +// @target: esnext, es2015, es5 +class A { + static bar = A.foo + 1 + static { + A.foo + 2; + } + static foo = 1; +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlockUseBeforeDef1.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlockUseBeforeDef1.ts new file mode 100644 index 0000000000..11f8b7f554 --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlockUseBeforeDef1.ts @@ -0,0 +1,15 @@ +// @target: esnext +// @noEmit: true +// @strict: true + +class C { + static x; + static { + this.x = 1; + } + static y = this.x; + static z; + static { + this.z = this.y; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlockUseBeforeDef2.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlockUseBeforeDef2.ts new file mode 100644 index 0000000000..89658a6ebe --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlockUseBeforeDef2.ts @@ -0,0 +1,10 @@ +// @target: esnext +// @noEmit: true +// @strict: true + +class C { + static { + this.x = 1; + } + static x; +} \ No newline at end of file diff --git a/tests/cases/conformance/classes/constructorDeclarations/classConstructorAccessibility4.ts b/tests/cases/conformance/classes/constructorDeclarations/classConstructorAccessibility4.ts index 3760f2176a..83c7d721b0 100644 --- a/tests/cases/conformance/classes/constructorDeclarations/classConstructorAccessibility4.ts +++ b/tests/cases/conformance/classes/constructorDeclarations/classConstructorAccessibility4.ts @@ -14,6 +14,7 @@ class A { } } } +let aa = new A(); class D { protected constructor() { } @@ -28,4 +29,5 @@ class D { class F extends D { // OK } } -} \ No newline at end of file +} +let dd = new D(); \ No newline at end of file diff --git a/tests/cases/conformance/classes/constructorDeclarations/constructorParameters/constructorImplementationWithDefaultValues.ts b/tests/cases/conformance/classes/constructorDeclarations/constructorParameters/constructorImplementationWithDefaultValues.ts index bdbcd7f959..c75a4f196b 100644 --- a/tests/cases/conformance/classes/constructorDeclarations/constructorParameters/constructorImplementationWithDefaultValues.ts +++ b/tests/cases/conformance/classes/constructorDeclarations/constructorParameters/constructorImplementationWithDefaultValues.ts @@ -17,4 +17,8 @@ class E<T extends Date> { constructor(x: T = null) { var y = x; } -} \ No newline at end of file +} + +let cc = new C(null); +let dd = new D(null); +let ee = new E(null); \ No newline at end of file diff --git a/tests/cases/conformance/classes/constructorDeclarations/constructorParameters/declarationEmitReadonly.ts b/tests/cases/conformance/classes/constructorDeclarations/constructorParameters/declarationEmitReadonly.ts index 76b41eabba..ffd568ede1 100644 --- a/tests/cases/conformance/classes/constructorDeclarations/constructorParameters/declarationEmitReadonly.ts +++ b/tests/cases/conformance/classes/constructorDeclarations/constructorParameters/declarationEmitReadonly.ts @@ -2,4 +2,5 @@ class C { constructor(readonly x: number) {} -} \ No newline at end of file +} +let c7 = new C(1) \ No newline at end of file diff --git a/tests/cases/conformance/classes/constructorDeclarations/quotedConstructors.ts b/tests/cases/conformance/classes/constructorDeclarations/quotedConstructors.ts index c03ce26cc2..e22bf5d126 100644 --- a/tests/cases/conformance/classes/constructorDeclarations/quotedConstructors.ts +++ b/tests/cases/conformance/classes/constructorDeclarations/quotedConstructors.ts @@ -29,3 +29,7 @@ class F { console.log(this); } } +let c3 =new C() +let c4 =new D() +let c5 =new E() +let c6 =new F() \ No newline at end of file diff --git a/tests/cases/conformance/classes/members/inheritanceAndOverriding/derivedClassOverridesIndexersWithAssignmentCompatibility.ts b/tests/cases/conformance/classes/members/inheritanceAndOverriding/derivedClassOverridesIndexersWithAssignmentCompatibility.ts index 20243d55be..7806d4f33e 100644 --- a/tests/cases/conformance/classes/members/inheritanceAndOverriding/derivedClassOverridesIndexersWithAssignmentCompatibility.ts +++ b/tests/cases/conformance/classes/members/inheritanceAndOverriding/derivedClassOverridesIndexersWithAssignmentCompatibility.ts @@ -14,4 +14,6 @@ class Base2 { // ok, use assignment compatibility class Derived2 extends Base2 { [x: number]: any; -} \ No newline at end of file +} +let c1 = new Derived() +let c2 = new Derived2() \ No newline at end of file diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/superInStaticMembers1.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/superInStaticMembers1.ts new file mode 100644 index 0000000000..fd281b1606 --- /dev/null +++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/superInStaticMembers1.ts @@ -0,0 +1,492 @@ +// @target: es5, es2015, es2021, esnext +// @noTypesAndSymbols: true + +// @filename: external.ts +export class Reflect {} +export interface Foo {} +export declare namespace Bar { type _ = unknown; } +export const enum Baz {} +export default class {}; + +// @filename: locals.ts +export {}; +declare class B { static w(): number; } +class C extends B { + static _ = [ + (() => { + var Reflect; // collision (es2015-es2021 only) + super.w(); + })(), + (() => { + var { Reflect } = { Reflect: null }; // collision (es2015-es2021 only) + super.w(); + })(), + (() => { + var [Reflect] = [null]; // collision (es2015-es2021 only) + super.w(); + })(), + (() => { + class Reflect {} // collision (es2015-es2021 only) + super.w(); + })(), + (() => { + function Reflect() {} // collision (es2015-es2021 only) + super.w(); + })(), + (() => { + enum Reflect {} // collision (es2015-es2021 only) + super.w(); + })(), + (() => { + const enum Reflect {} // collision (es2015-es2021 only) + super.w(); + })(), + (() => { + type Reflect = unknown; // no collision + super.w(); + })(), + (() => { + interface Reflect {}; // no collision + super.w(); + })(), + (() => { + (class Reflect {}); // no collision + super.w(); + })(), + (() => { + (function Reflect() {}); // no collision + super.w(); + })(), + ]; + + static { + var { Reflect } = { Reflect: null }; // collision (es2015-es2021 only) + super.w(); + } + + static { + var [Reflect] = [null]; // collision (es2015-es2021 only) + super.w(); + } + + static { + var Reflect; // collision (es2015-es2021 only) + super.w(); + } + + static { + class Reflect {} // collision (es2015-es2021 only) + super.w(); + } + + static { + function Reflect() {} // collision (es2015-es2021 only) + super.w(); + } + + static { + enum Reflect {} // collision (es2015-es2021 only) + super.w(); + } + + static { + const enum Reflect {} // collision (es2015-es2021 only) + super.w(); + } + + static { + type Reflect = unknown; // no collision + super.w(); + } + + static { + interface Reflect {} // no collision + super.w(); + } + + static { + (class Reflect {}) // no collision + super.w(); + } + + static { + (function Reflect() {}) // no collision + super.w(); + } +} + +// @filename: varInContainingScopeStaticField1.ts +export {}; +declare class B { static w(): number; } +var Reflect = null; // collision (es2015-es2021 only) +class C extends B { + static _ = super.w(); +} + +// @filename: varInContainingScopeStaticField2.ts +export {}; +declare class B { static w(): number; } +var { Reflect } = { Reflect: null }; // collision (es2015-es2021 only) +class C extends B { + static _ = super.w(); +} + +// @filename: varInContainingScopeStaticField3.ts +export {}; +declare class B { static w(): number; } +var [Reflect] = [null]; // collision (es2015-es2021 only) +class C extends B { + static _ = super.w(); +} + +// @filename: varInContainingScopeStaticBlock1.ts +export {}; +declare class B { static w(): number; } +var Reflect = null; // collision (es2015-es2021 only) +class C extends B { + static { super.w(); } +} + +// @filename: varInContainingScopeStaticBlock2.ts +export {}; +declare class B { static w(): number; } +var { Reflect } = { Reflect: null }; // collision (es2015-es2021 only) +class C extends B { + static { super.w(); } +} + +// @filename: varInContainingScopeStaticBlock3.ts +export {}; +declare class B { static w(): number; } +var [Reflect] = [null]; // collision (es2015-es2021 only) +class C extends B { + static { super.w(); } +} + +// @filename: classDeclInContainingScopeStaticField.ts +export {}; +declare class B { static w(): number; } +class Reflect {} // collision (es2015-es2021 only) +class C extends B { + static _ = super.w(); +} + +// @filename: classDeclInContainingScopeStaticBlock.ts +export {}; +declare class B { static w(): number; } +class Reflect {} // collision (es2015-es2021 only) +class C extends B { + static { super.w(); } +} + +// @filename: funcDeclInContainingScopeStaticField.ts +export {}; +declare class B { static w(): number; } +function Reflect() {} // collision (es2015-es2021 only) +class C extends B { + static _ = super.w(); +} + +// @filename: funcDeclInContainingScopeStaticBlock.ts +export {}; +declare class B { static w(): number; } +function Reflect() {} // collision (es2015-es2021 only) +class C extends B { + static { super.w(); } +} + +// @filename: valueNamespaceInContainingScopeStaticField.ts +export {}; +declare class B { static w(): number; } +namespace Reflect {} // collision (es2015-es2021 only) +class C extends B { + static _ = super.w(); +} + +// @filename: valueNamespaceInContainingScopeStaticBlock.ts +export {}; +declare class B { static w(): number; } +namespace Reflect {} // collision (es2015-es2021 only) +class C extends B { + static { super.w(); } +} + +// @filename: enumInContainingScopeStaticField.ts +export {}; +declare class B { static w(): number; } +enum Reflect {} // collision (es2015-es2021 only) +class C extends B { + static _ = super.w(); +} + +// @filename: enumInContainingScopeStaticBlock.ts +export {}; +declare class B { static w(): number; } +enum Reflect {} // collision (es2015-es2021 only) +class C extends B { + static { super.w(); } +} + +// @filename: constEnumInContainingScopeStaticField.ts +export {}; +declare class B { static w(): number; } +const enum Reflect {} // collision (es2015-es2021 only) +class C extends B { + static _ = super.w(); +} + +// @filename: constEnumInContainingScopeStaticBlock.ts +export {}; +declare class B { static w(): number; } +const enum Reflect {} // collision (es2015-es2021 only) +class C extends B { + static { super.w(); } +} + +// @filename: namespaceImportInContainingScopeStaticField.ts +export {}; +declare class B { static w(): number; } +import * as Reflect from "./external"; // collision (es2015-es2021 only) +class C extends B { + static _ = super.w(); +} + +// @filename: namespaceImportInContainingScopeStaticBlock.ts +export {}; +declare class B { static w(): number; } +import * as Reflect from "./external"; // collision (es2015-es2021 only) +class C extends B { + static { super.w(); } +} + +// @filename: namedImportInContainingScopeStaticField.ts +export {}; +declare class B { static w(): number; } +import { Reflect } from "./external"; // collision (es2015-es2021 only) +class C extends B { + static _ = super.w(); +} + +// @filename: namedImportInContainingScopeStaticBlock.ts +export {}; +declare class B { static w(): number; } +import { Reflect } from "./external"; // collision (es2015-es2021 only) +class C extends B { + static { super.w(); } +} + +// @filename: namedImportOfInterfaceInContainingScopeStaticField.ts +export {}; +declare class B { static w(): number; } +import { Foo as Reflect } from "./external"; // collision (es2015-es2021 only, not a type-only import) +class C extends B { + static _ = super.w(); +} + +// @filename: namedImportOfInterfaceInContainingScopeStaticBlock.ts +export {}; +declare class B { static w(): number; } +import { Foo as Reflect } from "./external"; // collision (es2015-es2021 only, not a type-only import) +class C extends B { + static { super.w(); } +} + +// @filename: namedImportOfUninstantiatedNamespaceInContainingScopeStaticField.ts +export {}; +declare class B { static w(): number; } +import { Bar as Reflect } from "./external"; // collision (es2015-es2021 only, not a type-only import) +class C extends B { + static _ = super.w(); +} + +// @filename: namedImportOfUninstantiatedNamespaceInContainingScopeStaticBlock.ts +export {}; +declare class B { static w(): number; } +import { Bar as Reflect } from "./external"; // collision (es2015-es2021 only, not a type-only import) +class C extends B { + static { super.w(); } +} + +// @filename: namedImportOfConstEnumInContainingScopeStaticField.ts +export {}; +declare class B { static w(): number; } +import { Baz as Reflect } from "./external"; // collision (es2015-es2021 only) +class C extends B { + static _ = super.w(); +} + +// @filename: namedImportOfConstEnumInContainingScopeStaticBlock.ts +export {}; +declare class B { static w(): number; } +import { Baz as Reflect } from "./external"; // collision (es2015-es2021 only) +class C extends B { + static { super.w(); } +} + +// @filename: typeOnlyNamedImportInContainingScopeStaticField.ts +export {}; +declare class B { static w(): number; } +import type { Reflect } from "./external"; // no collision +class C extends B { + static _ = super.w(); +} + +// @filename: typeOnlyNamedImportInContainingScopeStaticBlock.ts +export {}; +declare class B { static w(): number; } +import type { Reflect } from "./external"; // no collision +class C extends B { + static { super.w(); } +} + +// @filename: defaultImportInContainingScopeStaticField.ts +export {}; +declare class B { static w(): number; } +import Reflect from "./external"; // collision (es2015-es2021 only) +class C extends B { + static _ = super.w(); +} + +// @filename: defaultImportInContainingScopeStaticBlock.ts +export {}; +declare class B { static w(): number; } +import Reflect from "./external"; // collision (es2015-es2021 only) +class C extends B { + static { super.w(); } +} + +// @filename: typeOnlyDefaultImportInContainingScopeStaticField.ts +export {}; +declare class B { static w(): number; } +import type Reflect from "./external"; // no collision +class C extends B { + static _ = super.w(); +} + +// @filename: typeOnlyDefaultImportInContainingScopeStaticBlock.ts +export {}; +declare class B { static w(): number; } +import type Reflect from "./external"; // no collision +class C extends B { + static { super.w(); } +} + +// @filename: typeInContainingScopeStaticField.ts +export {}; +declare class B { static w(): number; } +type Reflect = unknown; // no collision +class C extends B { + static _ = super.w(); +} + +// @filename: typeInContainingScopeStaticBlock.ts +export {}; +declare class B { static w(): number; } +type Reflect = unknown; // no collision +class C extends B { + static { super.w(); } +} + +// @filename: interfaceInContainingScopeStaticField.ts +export {}; +declare class B { static w(): number; } +interface Reflect {}; // no collision +class C extends B { + static _ = super.w(); +} + +// @filename: interfaceInContainingScopeStaticBlock.ts +export {}; +declare class B { static w(): number; } +interface Reflect {}; // no collision +class C extends B { + static { super.w(); } +} + +// @filename: uninstantiatedNamespaceInContainingScopeStaticField.ts +export {}; +declare class B { static w(): number; } +declare namespace Reflect { type _ = unknown; }; // no collision +class C extends B { + static _ = super.w(); +} + +// @filename: uninstantiatedNamespaceInContainingScopeStaticBlock.ts +export {}; +declare class B { static w(): number; } +declare namespace Reflect { type _ = unknown; }; // no collision +class C extends B { + static { super.w(); } +} + +// @filename: classExprInContainingScopeStaticField.ts +export {}; +declare class B { static w(): number; } +(class Reflect {}); // no collision +class C extends B { + static _ = super.w(); +} + +// @filename: classExprInContainingScopeStaticBlock.ts +export {}; +declare class B { static w(): number; } +(class Reflect {}); // no collision +class C extends B { + static { super.w(); } +} + +// @filename: inContainingClassExprStaticField.ts +export {}; +declare class B { static w(): number; } +(class Reflect { // collision (es2015-es2021 only) + static { + class C extends B { + static _ = super.w(); + } + } +}); + +// @filename: inContainingClassExprStaticBlock.ts +export {}; +declare class B { static w(): number; } +(class Reflect { // collision (es2015-es2021 only) + static { + class C extends B { + static { super.w(); } + } + } +}); + +// @filename: funcExprInContainingScopeStaticField.ts +export {}; +declare class B { static w(): number; } +(function Reflect() {}); // no collision +class C extends B { + static _ = super.w(); +} + +// @filename: funcExprInContainingScopeStaticBlock.ts +export {}; +declare class B { static w(): number; } +(function Reflect() {}); // no collision +class C extends B { + static { super.w(); } +} + +// @filename: inContainingFuncExprStaticField.ts +export {}; +declare class B { static w(): number; } +(function Reflect() { // collision (es2015-es2021 only) + class C extends B { + static _ = super.w(); + } +}); + +// @filename: inContainingFuncExprStaticBlock.ts +export {}; +declare class B { static w(): number; } +(function Reflect() { // collision (es2015-es2021 only) + class C extends B { + static { super.w(); } + } +}); diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers1.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers1.ts new file mode 100644 index 0000000000..e3bfff9aed --- /dev/null +++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers1.ts @@ -0,0 +1,42 @@ +// @target: esnext, es2015 +// @useDefineForClassFields: true +// @noTypesAndSymbols: true + +declare class B { + static a: any; + static f(): number; + a: number; + f(): number; +} + +class C extends B { + static x: any = undefined!; + static y1 = this.x; + static y2 = this.x(); + static y3 = this?.x(); + static y4 = this[("x")](); + static y5 = this?.[("x")](); + static z1 = super.a; + static z2 = super["a"]; + static z3 = super.f(); + static z4 = super["f"](); + static z5 = super.a = 0; + static z6 = super.a += 1; + static z7 = (() => { super.a = 0; })(); + static z8 = [super.a] = [0]; + static z9 = [super.a = 0] = [0]; + static z10 = [...super.a] = [0]; + static z11 = { x: super.a } = { x: 0 }; + static z12 = { x: super.a = 0 } = { x: 0 }; + static z13 = { ...super.a } = { x: 0 }; + static z14 = ++super.a; + static z15 = --super.a; + static z16 = ++super[("a")]; + static z17 = super.a++; + static z18 = super.a``; + + // these should be unaffected + x = 1; + y = this.x; + z = super.f(); +} \ No newline at end of file diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers2.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers2.ts new file mode 100644 index 0000000000..7e751c3d67 --- /dev/null +++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers2.ts @@ -0,0 +1,42 @@ +// @target: esnext, es2015 +// @useDefineForClassFields: false +// @noTypesAndSymbols: true + +declare class B { + static a: any; + static f(): number; + a: number; + f(): number; +} + +class C extends B { + static x: any = undefined!; + static y1 = this.x; + static y2 = this.x(); + static y3 = this?.x(); + static y4 = this[("x")](); + static y5 = this?.[("x")](); + static z1 = super.a; + static z2 = super["a"]; + static z3 = super.f(); + static z4 = super["f"](); + static z5 = super.a = 0; + static z6 = super.a += 1; + static z7 = (() => { super.a = 0; })(); + static z8 = [super.a] = [0]; + static z9 = [super.a = 0] = [0]; + static z10 = [...super.a] = [0]; + static z11 = { x: super.a } = { x: 0 }; + static z12 = { x: super.a = 0 } = { x: 0 }; + static z13 = { ...super.a } = { x: 0 }; + static z14 = ++super.a; + static z15 = --super.a; + static z16 = ++super[("a")]; + static z17 = super.a++; + static z18 = super.a``; + + // these should be unaffected + x = 1; + y = this.x; + z = super.f(); +} \ No newline at end of file diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers3.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers3.ts new file mode 100644 index 0000000000..413c7c54bc --- /dev/null +++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers3.ts @@ -0,0 +1,26 @@ +// @target: es5 +// @useDefineForClassFields: true +// @noTypesAndSymbols: true + +declare class B { + static a: any; + static f(): number; + a: number; + f(): number; +} + +class C extends B { + static x: any = undefined!; + static y1 = this.x; + static y2 = this.x(); + static y3 = this?.x(); + static y4 = this[("x")](); + static y5 = this?.[("x")](); + static z3 = super.f(); + static z4 = super["f"](); + + // these should be unaffected + x = 1; + y = this.x; + z = super.f(); +} \ No newline at end of file diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers4.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers4.ts new file mode 100644 index 0000000000..aad82e41dc --- /dev/null +++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers4.ts @@ -0,0 +1,26 @@ +// @target: es5 +// @useDefineForClassFields: false +// @noTypesAndSymbols: true + +declare class B { + static a: any; + static f(): number; + a: number; + f(): number; +} + +class C extends B { + static x: any = undefined!; + static y1 = this.x; + static y2 = this.x(); + static y3 = this?.x(); + static y4 = this[("x")](); + static y5 = this?.[("x")](); + static z3 = super.f(); + static z4 = super["f"](); + + // these should be unaffected + x = 1; + y = this.x; + z = super.f(); +} \ No newline at end of file diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers.ts index dcba533725..f05e58dcb5 100644 --- a/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers.ts +++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers.ts @@ -30,4 +30,5 @@ var t2 = C2.bar(); var r5 = t2.foo + 1; var r6 = t2.bar(); var r7 = new t2(''); - +let b2 = new C(1) +let b3 = new C2('null') diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers10.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers10.ts new file mode 100644 index 0000000000..bb458c87d2 --- /dev/null +++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers10.ts @@ -0,0 +1,51 @@ +// @target: esnext, es6, es5 +// @experimentalDecorators: true +// @useDefineForClassFields: false + +declare const foo: any; + +@foo +class C { + static a = 1; + static b = this.a + 1; +} + +@foo +class D extends C { + static c = 2; + static d = this.c + 1; + static e = super.a + this.c + 1; + static f = () => this.c + 1; + static ff = function () { this.c + 1 } + static foo () { + return this.c + 1; + } + static get fa () { + return this.c + 1; + } + static set fa (v: number) { + this.c = v + 1; + } +} + +class CC { + static a = 1; + static b = this.a + 1; +} + +class DD extends CC { + static c = 2; + static d = this.c + 1; + static e = super.a + this.c + 1; + static f = () => this.c + 1; + static ff = function () { this.c + 1 } + static foo () { + return this.c + 1; + } + static get fa () { + return this.c + 1; + } + static set fa (v: number) { + this.c = v + 1; + } +} diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers11.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers11.ts new file mode 100644 index 0000000000..6c4025bc47 --- /dev/null +++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers11.ts @@ -0,0 +1,51 @@ +// @target: esnext, es6, es5 +// @experimentalDecorators: true +// @useDefineForClassFields: true + +declare const foo: any; + +@foo +class C { + static a = 1; + static b = this.a + 1; +} + +@foo +class D extends C { + static c = 2; + static d = this.c + 1; + static e = super.a + this.c + 1; + static f = () => this.c + 1; + static ff = function () { this.c + 1 } + static foo () { + return this.c + 1; + } + static get fa () { + return this.c + 1; + } + static set fa (v: number) { + this.c = v + 1; + } +} + +class CC { + static a = 1; + static b = this.a + 1; +} + +class DD extends CC { + static c = 2; + static d = this.c + 1; + static e = super.a + this.c + 1; + static f = () => this.c + 1; + static ff = function () { this.c + 1 } + static foo () { + return this.c + 1; + } + static get fa () { + return this.c + 1; + } + static set fa (v: number) { + this.c = v + 1; + } +} diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers12.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers12.ts new file mode 100644 index 0000000000..041089512b --- /dev/null +++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers12.ts @@ -0,0 +1,10 @@ +// @target: esnext, es6, es5 +// @useDefineForClassFields: false + +class C { + static readonly c: "foo" = "foo" + static bar = class Inner { + static [this.c] = 123; + [this.c] = 123; + } +} diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers13.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers13.ts new file mode 100644 index 0000000000..6c965e0e2d --- /dev/null +++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers13.ts @@ -0,0 +1,10 @@ +// @target: esnext, es6, es5 +// @useDefineForClassFields: true + +class C { + static readonly c: "foo" = "foo" + static bar = class Inner { + static [this.c] = 123; + [this.c] = 123; + } +} diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers3.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers3.ts new file mode 100644 index 0000000000..27541ce361 --- /dev/null +++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers3.ts @@ -0,0 +1,12 @@ +// @target: esnext, es6, es5 +// @useDefineForClassFields: false +class C { + static a = 1; + static b = this.a + 1; +} + +class D extends C { + static c = 2; + static d = this.c + 1; + static e = super.a + this.c + 1; +} diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers4.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers4.ts new file mode 100644 index 0000000000..0d08423bb9 --- /dev/null +++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers4.ts @@ -0,0 +1,12 @@ +// @target: esnext, es6, es5 +// @useDefineForClassFields: true +class C { + static a = 1; + static b = this.a + 1; +} + +class D extends C { + static c = 2; + static d = this.c + 1; + static e = super.a + this.c + 1; +} diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers5.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers5.ts new file mode 100644 index 0000000000..db6e8a76c6 --- /dev/null +++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers5.ts @@ -0,0 +1,9 @@ +// @target: esnext, es6, es5 + +class C { + static create = () => new this("yep") + + constructor (private foo: string) { + + } +} diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers6.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers6.ts new file mode 100644 index 0000000000..b27d0855a2 --- /dev/null +++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers6.ts @@ -0,0 +1,7 @@ +class C { + static f = 1 +} + +class D extends C { + static c = super(); +} diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers7.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers7.ts new file mode 100644 index 0000000000..1a2d9cd2e2 --- /dev/null +++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers7.ts @@ -0,0 +1,12 @@ +// @target: esnext, es6, es5 + +class C { + static a = 1; + static b = this.a + 1; +} + +class D extends C { + static c = 2; + static d = this.c + 1; + static e = 1 + (super.a) + (this.c + 1) + 1; +} diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers8.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers8.ts new file mode 100644 index 0000000000..8b26476f14 --- /dev/null +++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers8.ts @@ -0,0 +1,19 @@ +// @target: esnext, es6, es5 + +class C { + static f = 1; + static arrowFunctionBoundary = () => this.f + 1; + static functionExprBoundary = function () { return this.f + 2 }; + static classExprBoundary = class { a = this.f + 3 }; + static functionAndClassDeclBoundary = (() => { + function foo () { + return this.f + 4 + } + class CC { + a = this.f + 5 + method () { + return this.f + 6 + } + } + })(); +} diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers9.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers9.ts new file mode 100644 index 0000000000..0a648d2fa0 --- /dev/null +++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers9.ts @@ -0,0 +1,22 @@ +// @target: esnext, es6, es5 + +class C { + static f = 1 +} + +class D extends C { + static arrowFunctionBoundary = () => super.f + 1; + static functionExprBoundary = function () { return super.f + 2 }; + static classExprBoundary = class { a = super.f + 3 }; + static functionAndClassDeclBoundary = (() => { + function foo () { + return super.f + 4 + } + class C { + a = super.f + 5 + method () { + return super.f +6 + } + } + })(); +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameComputedPropertyName3.ts b/tests/cases/conformance/classes/members/privateNames/privateNameComputedPropertyName3.ts index 09573f98c9..f57d3afc8b 100644 --- a/tests/cases/conformance/classes/members/privateNames/privateNameComputedPropertyName3.ts +++ b/tests/cases/conformance/classes/members/privateNames/privateNameComputedPropertyName3.ts @@ -23,3 +23,5 @@ class Foo { } console.log(new Foo("NAME").getValue(100)); + +let ff = new Foo(null) \ No newline at end of file diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameFieldAccess.ts b/tests/cases/conformance/classes/members/privateNames/privateNameFieldAccess.ts index 4c02159bfa..af502334e7 100644 --- a/tests/cases/conformance/classes/members/privateNames/privateNameFieldAccess.ts +++ b/tests/cases/conformance/classes/members/privateNames/privateNameFieldAccess.ts @@ -6,3 +6,4 @@ class A { console.log(this.#myField); } } +let aa = new A(); diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameHashCharName.ts b/tests/cases/conformance/classes/members/privateNames/privateNameHashCharName.ts new file mode 100644 index 0000000000..4a076565bf --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameHashCharName.ts @@ -0,0 +1,11 @@ +// @target: es6 + +# + +class C { + # + + m() { + this.# + } +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameInInExpression.ts b/tests/cases/conformance/classes/members/privateNames/privateNameInInExpression.ts new file mode 100644 index 0000000000..e274378150 --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameInInExpression.ts @@ -0,0 +1,119 @@ +// @strict: true +// @target: esnext +// @useDefineForClassFields: true + +class Foo { + #field = 1; + static #staticField = 2; + #method() {} + static #staticMethod() {} + + goodRhs(v: any) { + const a = #field in v; + + const b = #field in v.p1.p2; + + const c = #field in (v as {}); + + const d = #field in (v as Foo); + + const e = #field in (v as never); + + for (let f in #field in v as any) { /**/ } // unlikely but valid + } + badRhs(v: any) { + const a = #field in (v as unknown); // Bad - RHS of in must be object type or any + + const b = #fiel in v; // Bad - typo in privateID + + const c = (#field) in v; // Bad - privateID is not an expression on its own + + for (#field in v) { /**/ } // Bad - 'in' not allowed + + for (let d in #field in v) { /**/ } // Bad - rhs of in should be a object/any + } + whitespace(v: any) { + const a = v && /*0*/#field/*1*/ + /*2*/in/*3*/ + /*4*/v/*5*/ + } + flow(u: unknown, n: never, fb: Foo | Bar, fs: FooSub, b: Bar, fsb: FooSub | Bar, fsfb: Foo | FooSub | Bar) { + + if (typeof u === 'object') { + if (#field in n) { + n; // good n is never + } + + if (#field in u) { + u; // good u is Foo + } else { + u; // good u is object | null + } + + if (u !== null) { + if (#field in u) { + u; // good u is Foo + } else { + u; // good u is object + } + + if (#method in u) { + u; // good u is Foo + } + + if (#staticField in u) { + u; // good u is typeof Foo + } + + if (#staticMethod in u) { + u; // good u is typeof Foo + } + } + } + + if (#field in fb) { + fb; // good fb is Foo + } else { + fb; // good fb is Bar + } + + if (#field in fs) { + fs; // good fs is FooSub + } else { + fs; // good fs is never + } + + if (#field in b) { + b; // good b is 'Bar & Foo' + } else { + b; // good b is Bar + } + + if (#field in fsb) { + fsb; // good fsb is FooSub + } else { + fsb; // good fsb is Bar + } + + if (#field in fsfb) { + fsfb; // good fsfb is 'Foo | FooSub' + } else { + fsfb; // good fsfb is Bar + } + + class Nested { + m(v: any) { + if (#field in v) { + v; // good v is Foo + } + } + } + } +} + +class FooSub extends Foo { subTypeOfFoo = true } +class Bar { notFoo = true } + +function badSyntax(v: Foo) { + return #field in v; // Bad - outside of class +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameInInExpressionTransform.ts b/tests/cases/conformance/classes/members/privateNames/privateNameInInExpressionTransform.ts new file mode 100644 index 0000000000..f7be176373 --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameInInExpressionTransform.ts @@ -0,0 +1,47 @@ +// @target: esnext, es2020 + +class Foo { + #field = 1; + #method() {} + static #staticField= 2; + static #staticMethod() {} + + check(v: any) { + #field in v; // expect Foo's 'field' WeakMap + #method in v; // expect Foo's 'instances' WeakSet + #staticField in v; // expect Foo's constructor + #staticMethod in v; // expect Foo's constructor + } + precedence(v: any) { + // '==' and '||' have lower precedence than 'in' + // 'in' naturally has same precedence as 'in' + // '<<' has higher precedence than 'in' + + v == #field in v || v; // Good precedence: (v == (#field in v)) || v + + v << #field in v << v; // Good precedence (SyntaxError): (v << #field) in (v << v) + + v << #field in v == v; // Good precedence (SyntaxError): ((v << #field) in v) == v + + v == #field in v in v; // Good precedence: v == ((#field in v) in v) + + #field in v && #field in v; // Good precedence: (#field in v) && (#field in v) + } + invalidLHS(v: any) { + 'prop' in v = 10; + #field in v = 10; + } +} + +class Bar { + #field = 1; + check(v: any) { + #field in v; // expect Bar's 'field' WeakMap + } +} + +function syntaxError(v: Foo) { + return #field in v; // expect `return in v` so runtime will have a syntax error +} + +export { } diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameInInExpressionUnused.ts b/tests/cases/conformance/classes/members/privateNames/privateNameInInExpressionUnused.ts new file mode 100644 index 0000000000..4b214a2b9e --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameInInExpressionUnused.ts @@ -0,0 +1,13 @@ +// @strict: true +// @noUnusedLocals: true +// @target: esnext + +class Foo { + #unused: undefined; // expect unused error + #brand: undefined; // expect no error + + isFoo(v: any): v is Foo { + // This should count as using/reading '#brand' + return #brand in v; + } +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiersJs.ts b/tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiersJs.ts new file mode 100644 index 0000000000..5154b5e439 --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiersJs.ts @@ -0,0 +1,65 @@ +// @allowJs: true +// @checkJs: true +// @strict: true +// @target: es6 +// @outDir: ./out +// @filename: privateNamesIncompatibleModifiersJs.js + +class A { + /** + * @public + */ + #a = 1; + + /** + * @private + */ + #b = 1; + + /** + * @protected + */ + #c = 1; + + /** + * @public + */ + #aMethod() { return 1; } + + /** + * @private + */ + #bMethod() { return 1; } + + /** + * @protected + */ + #cMethod() { return 1; } + + /** + * @public + */ + get #aProp() { return 1; } + /** + * @public + */ + set #aProp(value) { } + + /** + * @private + */ + get #bProp() { return 1; } + /** + * @private + */ + set #bProp(value) { } + + /** + * @protected + */ + get #cProp() { return 1; } + /** + * @protected + */ + set #cProp(value) { } +} diff --git a/tests/cases/conformance/classes/mixinClassesAnnotated.ts b/tests/cases/conformance/classes/mixinClassesAnnotated.ts index 62f5e30c9a..8bca7d06d1 100644 --- a/tests/cases/conformance/classes/mixinClassesAnnotated.ts +++ b/tests/cases/conformance/classes/mixinClassesAnnotated.ts @@ -36,6 +36,7 @@ function Tagged<T extends Constructor<{}>>(superClass: T): Constructor<Tagged> & this._tag = "hello"; } } + let c = new C(); return C; } @@ -65,3 +66,5 @@ class Thing3 extends Thing2 { this.print(); } } +let der = new Derived(1,1,1); +let th3 = new Thing3(''); \ No newline at end of file diff --git a/tests/cases/conformance/classes/mixinClassesAnonymous.ts b/tests/cases/conformance/classes/mixinClassesAnonymous.ts index 0e42288808..aa639e71e3 100644 --- a/tests/cases/conformance/classes/mixinClassesAnonymous.ts +++ b/tests/cases/conformance/classes/mixinClassesAnonymous.ts @@ -62,3 +62,5 @@ const Timestamped = <CT extends Constructor<object>>(Base: CT) => { timestamp = new Date(); }; } +let aa = new Derived(1,1,1); +let bb = new Thing3(''); \ No newline at end of file diff --git a/tests/cases/conformance/classes/mixinClassesMembers.ts b/tests/cases/conformance/classes/mixinClassesMembers.ts index 905518c88f..7deb2ac30b 100644 --- a/tests/cases/conformance/classes/mixinClassesMembers.ts +++ b/tests/cases/conformance/classes/mixinClassesMembers.ts @@ -97,3 +97,8 @@ class C3 extends Mixed3 { } f() { return super.f(); } } +let aa = new C1(''); +let bb = new M1(); +let cc = new M2(); +let dd = new C2(); +let ee = new C3(); \ No newline at end of file diff --git a/tests/cases/conformance/classes/propertyMemberDeclarations/abstractProperty.ts b/tests/cases/conformance/classes/propertyMemberDeclarations/abstractProperty.ts index 5f7266c0ea..7870b163db 100644 --- a/tests/cases/conformance/classes/propertyMemberDeclarations/abstractProperty.ts +++ b/tests/cases/conformance/classes/propertyMemberDeclarations/abstractProperty.ts @@ -14,3 +14,6 @@ class B extends A { class C extends A { protected get x() { return 'C.x' }; } + +let b = new B(); +let c = new C(); diff --git a/tests/cases/conformance/classes/propertyMemberDeclarations/abstractPropertyInitializer.ts b/tests/cases/conformance/classes/propertyMemberDeclarations/abstractPropertyInitializer.ts new file mode 100644 index 0000000000..42a0999748 --- /dev/null +++ b/tests/cases/conformance/classes/propertyMemberDeclarations/abstractPropertyInitializer.ts @@ -0,0 +1,5 @@ +// @strict: true +// @declaration: true +abstract class C { + abstract prop = 1 +} diff --git a/tests/cases/conformance/classes/propertyMemberDeclarations/instanceMemberInitialization.ts b/tests/cases/conformance/classes/propertyMemberDeclarations/instanceMemberInitialization.ts index 04b44a6835..d7c518964d 100644 --- a/tests/cases/conformance/classes/propertyMemberDeclarations/instanceMemberInitialization.ts +++ b/tests/cases/conformance/classes/propertyMemberDeclarations/instanceMemberInitialization.ts @@ -4,8 +4,8 @@ class C { var c = new C(); c.x = 3; -var c2 = new C(); -var r = c.x === c2.x; +// var c2 = new C(); +// var r = c.x === c2.x; // #31792 @@ -14,4 +14,5 @@ var r = c.x === c2.x; class MyMap<K, V> { constructor(private readonly Map_: { new<K, V>(): any }) {} private readonly store = new this.Map_<K, V>(); -} \ No newline at end of file +} +let mm = new MyMap(null) \ No newline at end of file diff --git a/tests/cases/conformance/classes/propertyMemberDeclarations/instanceMemberWithComputedPropertyName2.ts b/tests/cases/conformance/classes/propertyMemberDeclarations/instanceMemberWithComputedPropertyName2.ts index e597b6b9d9..ed03d54763 100644 --- a/tests/cases/conformance/classes/propertyMemberDeclarations/instanceMemberWithComputedPropertyName2.ts +++ b/tests/cases/conformance/classes/propertyMemberDeclarations/instanceMemberWithComputedPropertyName2.ts @@ -6,3 +6,4 @@ const x = 1; class C { [x]: string; } +let cc = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/classes/propertyMemberDeclarations/memberFunctionDeclarations/staticFactory1.ts b/tests/cases/conformance/classes/propertyMemberDeclarations/memberFunctionDeclarations/staticFactory1.ts index 5d786cd4cf..0277ffa658 100644 --- a/tests/cases/conformance/classes/propertyMemberDeclarations/memberFunctionDeclarations/staticFactory1.ts +++ b/tests/cases/conformance/classes/propertyMemberDeclarations/memberFunctionDeclarations/staticFactory1.ts @@ -10,4 +10,5 @@ class Derived extends Base { } var d = Derived.create(); -d.foo(); \ No newline at end of file +d.foo(); +let b1 =new Derived() \ No newline at end of file diff --git a/tests/cases/conformance/classes/propertyMemberDeclarations/staticAndNonStaticPropertiesSameName.ts b/tests/cases/conformance/classes/propertyMemberDeclarations/staticAndNonStaticPropertiesSameName.ts index 06a784c782..d3b03f9716 100644 --- a/tests/cases/conformance/classes/propertyMemberDeclarations/staticAndNonStaticPropertiesSameName.ts +++ b/tests/cases/conformance/classes/propertyMemberDeclarations/staticAndNonStaticPropertiesSameName.ts @@ -4,4 +4,5 @@ class C { f() { } static f() { } -} \ No newline at end of file +} +let a4 = new C() \ No newline at end of file diff --git a/tests/cases/conformance/classes/propertyMemberDeclarations/staticPropertyAndFunctionWithSameName.ts b/tests/cases/conformance/classes/propertyMemberDeclarations/staticPropertyAndFunctionWithSameName.ts index 4566ce26f0..4a275f4eef 100644 --- a/tests/cases/conformance/classes/propertyMemberDeclarations/staticPropertyAndFunctionWithSameName.ts +++ b/tests/cases/conformance/classes/propertyMemberDeclarations/staticPropertyAndFunctionWithSameName.ts @@ -6,4 +6,6 @@ class C { class D { static f: number; f() { } -} \ No newline at end of file +} +let a2 =new C() +let a3 = new D() \ No newline at end of file diff --git a/tests/cases/conformance/classes/propertyMemberDeclarations/staticPropertyNameConflictsInAmbientContext.ts b/tests/cases/conformance/classes/propertyMemberDeclarations/staticPropertyNameConflictsInAmbientContext.ts index 198c923b0d..d937176b83 100644 --- a/tests/cases/conformance/classes/propertyMemberDeclarations/staticPropertyNameConflictsInAmbientContext.ts +++ b/tests/cases/conformance/classes/propertyMemberDeclarations/staticPropertyNameConflictsInAmbientContext.ts @@ -54,3 +54,13 @@ declare class StaticArgumentsFn { static arguments(): any; // ok arguments(): any; // ok } +let a5 =new StaticName() +let a6 =new StaticNameFn() +let a7 =new StaticLength() +let a8 =new StaticLengthFn() +let a9 =new StaticPrototype() +let a10 =new StaticPrototypeFn() +let a11 =new StaticCaller() +let a12 =new StaticCallerFn() +let a13 =new StaticArguments() +let a14 =new StaticArgumentsFn() \ No newline at end of file diff --git a/tests/cases/conformance/controlFlow/assertionTypePredicates2.ts b/tests/cases/conformance/controlFlow/assertionTypePredicates2.ts new file mode 100644 index 0000000000..915c9ae94f --- /dev/null +++ b/tests/cases/conformance/controlFlow/assertionTypePredicates2.ts @@ -0,0 +1,27 @@ +// @allowJs: true +// @checkJs: true +// @outDir: ./out +// @filename: assertionTypePredicates2.js + +/** + * @typedef {{ x: number }} A + */ + +/** + * @typedef { A & { y: number } } B + */ + +/** + * @param {A} a + * @returns { asserts a is B } + */ +const foo = (a) => { + if (/** @type { B } */ (a).y !== 0) throw TypeError(); + return undefined; +}; + +export const main = () => { + /** @type { A } */ + const a = { x: 1 }; + foo(a); +}; diff --git a/tests/cases/conformance/controlFlow/controlFlowAliasing.ts b/tests/cases/conformance/controlFlow/controlFlowAliasing.ts new file mode 100644 index 0000000000..03b7530921 --- /dev/null +++ b/tests/cases/conformance/controlFlow/controlFlowAliasing.ts @@ -0,0 +1,285 @@ +// @strict: true +// @declaration: true + +// Narrowing by aliased conditional expressions + +function f10(x: string | number) { + const isString = typeof x === "string"; + if (isString) { + let t: string = x; + } + else { + let t: number = x; + } +} + +function f11(x: unknown) { + const isString = typeof x === "string"; + if (isString) { + let t: string = x; + } +} + +function f12(x: string | number | boolean) { + const isString = typeof x === "string"; + const isNumber = typeof x === "number"; + if (isString || isNumber) { + let t: string | number = x; + } + else { + let t: boolean = x; + } +} + +function f13(x: string | number | boolean) { + const isString = typeof x === "string"; + const isNumber = typeof x === "number"; + const isStringOrNumber = isString || isNumber; + if (isStringOrNumber) { + let t: string | number = x; + } + else { + let t: boolean = x; + } +} + +function f14(x: number | null | undefined): number | null { + const notUndefined = x !== undefined; + return notUndefined ? x : 0; +} + +function f15(obj: { readonly x: string | number }) { + const isString = typeof obj.x === 'string'; + if (isString) { + let s: string = obj.x; + } +} + +function f16(obj: { readonly x: string | number }) { + const isString = typeof obj.x === 'string'; + obj = { x: 42 }; + if (isString) { + let s: string = obj.x; // Not narrowed because of is assigned in function body + } +} + +function f17(obj: readonly [string | number]) { + const isString = typeof obj[0] === 'string'; + if (isString) { + let s: string = obj[0]; + } +} + +function f18(obj: readonly [string | number]) { + const isString = typeof obj[0] === 'string'; + obj = [42]; + if (isString) { + let s: string = obj[0]; // Not narrowed because of is assigned in function body + } +} + +function f20(obj: { kind: 'foo', foo: string } | { kind: 'bar', bar: number }) { + const isFoo = obj.kind === 'foo'; + if (isFoo) { + obj.foo; + } + else { + obj.bar; + } +} + +function f21(obj: { kind: 'foo', foo: string } | { kind: 'bar', bar: number }) { + const isFoo: boolean = obj.kind === 'foo'; + if (isFoo) { + obj.foo; // Not narrowed because isFoo has type annotation + } + else { + obj.bar; // Not narrowed because isFoo has type annotation + } +} + +function f22(obj: { kind: 'foo', foo: string } | { kind: 'bar', bar: number }) { + let isFoo = obj.kind === 'foo'; + if (isFoo) { + obj.foo; // Not narrowed because isFoo is mutable + } + else { + obj.bar; // Not narrowed because isFoo is mutable + } +} + +function f23(obj: { kind: 'foo', foo: string } | { kind: 'bar', bar: number }) { + const isFoo = obj.kind === 'foo'; + obj = obj; + if (isFoo) { + obj.foo; // Not narrowed because obj is assigned in function body + } + else { + obj.bar; // Not narrowed because obj is assigned in function body + } +} + +function f24(arg: { kind: 'foo', foo: string } | { kind: 'bar', bar: number }) { + const obj = arg; + const isFoo = obj.kind === 'foo'; + if (isFoo) { + obj.foo; + } + else { + obj.bar; + } +} + +function f25(arg: { kind: 'foo', foo: string } | { kind: 'bar', bar: number }) { + let obj = arg; + const isFoo = obj.kind === 'foo'; + if (isFoo) { + obj.foo; // Not narrowed because obj is mutable + } + else { + obj.bar; // Not narrowed because obj is mutable + } +} + +function f26(outer: { readonly obj: { kind: 'foo', foo: string } | { kind: 'bar', bar: number } }) { + const isFoo = outer.obj.kind === 'foo'; + if (isFoo) { + outer.obj.foo; + } + else { + outer.obj.bar; + } +} + +function f27(outer: { obj: { kind: 'foo', foo: string } | { kind: 'bar', bar: number } }) { + const isFoo = outer.obj.kind === 'foo'; + if (isFoo) { + outer.obj.foo; // Not narrowed because obj is mutable + } + else { + outer.obj.bar; // Not narrowed because obj is mutable + } +} + +function f28(obj?: { kind: 'foo', foo: string } | { kind: 'bar', bar: number }) { + const isFoo = obj && obj.kind === 'foo'; + const isBar = obj && obj.kind === 'bar'; + if (isFoo) { + obj.foo; + } + if (isBar) { + obj.bar; + } +} + +// Narrowing by aliased discriminant property access + +function f30(obj: { kind: 'foo', foo: string } | { kind: 'bar', bar: number }) { + const kind = obj.kind; + if (kind === 'foo') { + obj.foo; + } + else { + obj.bar; + } +} + +function f31(obj: { kind: 'foo', foo: string } | { kind: 'bar', bar: number }) { + const { kind } = obj; + if (kind === 'foo') { + obj.foo; + } + else { + obj.bar; + } +} + +function f32(obj: { kind: 'foo', foo: string } | { kind: 'bar', bar: number }) { + const { kind: k } = obj; + if (k === 'foo') { + obj.foo; + } + else { + obj.bar; + } +} + +function f33(obj: { kind: 'foo', foo: string } | { kind: 'bar', bar: number }) { + const { kind } = obj; + switch (kind) { + case 'foo': obj.foo; break; + case 'bar': obj.bar; break; + } +} + + +class C10 { + constructor(readonly x: string | number) { + const thisX_isString = typeof this.x === 'string'; + const xIsString = typeof x === 'string'; + if (thisX_isString && xIsString) { + let s: string; + s = this.x; + s = x; + } + } +} + +class C11 { + constructor(readonly x: string | number) { + const thisX_isString = typeof this.x === 'string'; + const xIsString = typeof x === 'string'; + if (thisX_isString && xIsString) { + // Some narrowings may be invalidated due to later assignments. + let s: string; + s = this.x; + s = x; + } + else { + this.x = 10; + x = 10; + } + } +} + +// Mixing of aliased discriminants and conditionals + +function f40(obj: { kind: 'foo', foo?: string } | { kind: 'bar', bar?: number }) { + const { kind } = obj; + const isFoo = kind == 'foo'; + if (isFoo && obj.foo) { + let t: string = obj.foo; + } +} + +// Unsupported narrowing of destructured payload by destructured discriminant + +type Data = { kind: 'str', payload: string } | { kind: 'num', payload: number }; + +function gg2(obj: Data) { + if (obj.kind === 'str') { + let t: string = obj.payload; + } + else { + let t: number = obj.payload; + } +} + +function foo({ kind, payload }: Data) { + if (kind === 'str') { + let t: string = payload; + } + else { + let t: number = payload; + } +} + +// Repro from #45830 + +const obj = { + fn: () => true +}; + +if (a) { } + +const a = obj.fn(); diff --git a/tests/cases/conformance/controlFlow/controlFlowAliasingCatchVariables.ts b/tests/cases/conformance/controlFlow/controlFlowAliasingCatchVariables.ts new file mode 100644 index 0000000000..a746fa1cd0 --- /dev/null +++ b/tests/cases/conformance/controlFlow/controlFlowAliasingCatchVariables.ts @@ -0,0 +1,28 @@ +// @useUnknownInCatchVariables: true,false + +try {} +catch (e) { + const isString = typeof e === 'string'; + if (isString) { + e.toUpperCase(); // e string + } + + if (typeof e === 'string') { + e.toUpperCase(); // e string + } +} + +try {} +catch (e) { + const isString = typeof e === 'string'; + + e = 1; + + if (isString) { + e.toUpperCase(); // e any/unknown + } + + if (typeof e === 'string') { + e.toUpperCase(); // e string + } +} diff --git a/tests/cases/conformance/controlFlow/controlFlowElementAccess2.ts b/tests/cases/conformance/controlFlow/controlFlowElementAccess2.ts index fa0592c973..17a2af7895 100644 --- a/tests/cases/conformance/controlFlow/controlFlowElementAccess2.ts +++ b/tests/cases/conformance/controlFlow/controlFlowElementAccess2.ts @@ -10,4 +10,4 @@ if (typeof config['works'] !== 'boolean') { if (typeof config.works !== 'boolean') { config['works'].prop = 'test'; // error, config['works']: boolean | { 'prop': string } config.works.prop = 'test'; // ok -} +} \ No newline at end of file diff --git a/tests/cases/conformance/controlFlow/controlFlowForInStatement2.ts b/tests/cases/conformance/controlFlow/controlFlowForInStatement2.ts new file mode 100644 index 0000000000..450e50cadc --- /dev/null +++ b/tests/cases/conformance/controlFlow/controlFlowForInStatement2.ts @@ -0,0 +1,25 @@ +const keywordA = 'a'; +const keywordB = 'b'; + +type A = { [keywordA]: number }; +type B = { [keywordB]: string }; + +declare const c: A | B; + +if ('a' in c) { + c; // narrowed to `A` +} + +if (keywordA in c) { + c; // also narrowed to `A` +} + +let stringB: string = 'b'; + +if ((stringB as 'b') in c) { + c; // narrowed to `B` +} + +if ((stringB as ('a' | 'b')) in c) { + c; // not narrowed +} \ No newline at end of file diff --git a/tests/cases/conformance/controlFlow/controlFlowInOperator.ts b/tests/cases/conformance/controlFlow/controlFlowInOperator.ts new file mode 100644 index 0000000000..5dc27c45e8 --- /dev/null +++ b/tests/cases/conformance/controlFlow/controlFlowInOperator.ts @@ -0,0 +1,26 @@ +const a = 'a'; +const b = 'b'; +const d = 'd'; + +type A = { [a]: number; }; +type B = { [b]: string; }; + +declare const c: A | B; + +if ('a' in c) { + c; // A + c['a']; // number; +} + +if ('d' in c) { + c; // never +} + +if (a in c) { + c; // A + c[a]; // number; +} + +if (d in c) { + c; // never +} diff --git a/tests/cases/conformance/controlFlow/controlFlowInstanceofExtendsFunction.ts b/tests/cases/conformance/controlFlow/controlFlowInstanceofExtendsFunction.ts index 4a1ff7ff86..8780db0c12 100644 --- a/tests/cases/conformance/controlFlow/controlFlowInstanceofExtendsFunction.ts +++ b/tests/cases/conformance/controlFlow/controlFlowInstanceofExtendsFunction.ts @@ -29,4 +29,6 @@ export const x: X | number = Math.random() > 0.5 ? new X() : 1 if (x instanceof X) { x.why() // should compile -} \ No newline at end of file +} +let xx = new X(); +let yy = new Y(); \ No newline at end of file diff --git a/tests/cases/conformance/controlFlow/controlFlowSuperPropertyAccess.ts b/tests/cases/conformance/controlFlow/controlFlowSuperPropertyAccess.ts index b42af687c0..b3710bae0d 100644 --- a/tests/cases/conformance/controlFlow/controlFlowSuperPropertyAccess.ts +++ b/tests/cases/conformance/controlFlow/controlFlowSuperPropertyAccess.ts @@ -7,3 +7,4 @@ class C extends B { super.m && super.m(); } } +let qq3 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/controlFlow/controlFlowTypeofObject.ts b/tests/cases/conformance/controlFlow/controlFlowTypeofObject.ts new file mode 100644 index 0000000000..db134447ed --- /dev/null +++ b/tests/cases/conformance/controlFlow/controlFlowTypeofObject.ts @@ -0,0 +1,71 @@ +// @strict: true +// @declaration: true + +declare function obj(x: object): void; + +function f1(x: unknown) { + if (!x) { + return; + } + if (typeof x === 'object') { + obj(x); + } +} + +function f2(x: unknown) { + if (x === null) { + return; + } + if (typeof x === 'object') { + obj(x); + } +} + +function f3(x: unknown) { + if (x == null) { + return; + } + if (typeof x === 'object') { + obj(x); + } +} + +function f4(x: unknown) { + if (x == undefined) { + return; + } + if (typeof x === 'object') { + obj(x); + } +} + +function f5(x: unknown) { + if (!!true) { + if (!x) { + return; + } + } + else { + if (x === null) { + return; + } + } + if (typeof x === 'object') { + obj(x); + } +} + +function f6(x: unknown) { + if (x === null) { + x; + } + else { + x; + if (typeof x === 'object') { + obj(x); + } + } + if (typeof x === 'object') { + obj(x); // Error + } +} diff --git a/tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts b/tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts new file mode 100644 index 0000000000..55e95ddf09 --- /dev/null +++ b/tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts @@ -0,0 +1,161 @@ +// @strict: true +// @declaration: true +// @target: es2015 + +type Action = + | { kind: 'A', payload: number } + | { kind: 'B', payload: string }; + +function f10({ kind, payload }: Action) { + if (kind === 'A') { + payload.toFixed(); + } + if (kind === 'B') { + payload.toUpperCase(); + } +} + +function f11(action: Action) { + const { kind, payload } = action; + if (kind === 'A') { + payload.toFixed(); + } + if (kind === 'B') { + payload.toUpperCase(); + } +} + +function f12({ kind, payload }: Action) { + switch (kind) { + case 'A': + payload.toFixed(); + break; + case 'B': + payload.toUpperCase(); + break; + default: + payload; // never + } +} + +type Action2 = + | { kind: 'A', payload: number | undefined } + | { kind: 'B', payload: string | undefined }; + +function f20({ kind, payload }: Action2) { + if (payload) { + if (kind === 'A') { + payload.toFixed(); + } + if (kind === 'B') { + payload.toUpperCase(); + } + } +} + +function f21(action: Action2) { + const { kind, payload } = action; + if (payload) { + if (kind === 'A') { + payload.toFixed(); + } + if (kind === 'B') { + payload.toUpperCase(); + } + } +} + +function f22(action: Action2) { + if (action.payload) { + const { kind, payload } = action; + if (kind === 'A') { + payload.toFixed(); + } + if (kind === 'B') { + payload.toUpperCase(); + } + } +} + +function f23({ kind, payload }: Action2) { + if (payload) { + switch (kind) { + case 'A': + payload.toFixed(); + break; + case 'B': + payload.toUpperCase(); + break; + default: + payload; // never + } + } +} + +type Foo = + | { kind: 'A', isA: true } + | { kind: 'B', isA: false } + | { kind: 'C', isA: false }; + +function f30({ kind, isA }: Foo) { + if (kind === 'A') { + isA; // true + } + if (kind === 'B') { + isA; // false + } + if (kind === 'C') { + isA; // false + } + if (isA) { + kind; // 'A' + } + else { + kind; // 'B' | 'C' + } +} + +// Repro from #35283 + +interface A<T> { variant: 'a', value: T } + +interface B<T> { variant: 'b', value: Array<T> } + +type AB<T> = A<T> | B<T>; + +declare function printValue<T>(t: T): void; + +declare function printValueList<T>(t: Array<T>): void; + +function unrefined1<T>(ab: AB<T>): void { + const { variant, value } = ab; + if (variant === 'a') { + printValue<T>(value); + } + else { + printValueList<T>(value); + } +} + +// Repro from #38020 + +type Action3 = + | {type: 'add', payload: { toAdd: number } } + | {type: 'remove', payload: { toRemove: number } }; + +const reducerBroken = (state: number, { type, payload }: Action3) => { + switch (type) { + case 'add': + return state + payload.toAdd; + case 'remove': + return state - payload.toRemove; + } +} + +// Repro from #46143 + +declare var it: Iterator<number>; +const { value, done } = it.next(); +if (!done) { + value; // number +} diff --git a/tests/cases/conformance/controlFlow/typeGuardsNestedAssignments.ts b/tests/cases/conformance/controlFlow/typeGuardsNestedAssignments.ts index 41e3ffe572..1a42e77ae0 100644 --- a/tests/cases/conformance/controlFlow/typeGuardsNestedAssignments.ts +++ b/tests/cases/conformance/controlFlow/typeGuardsNestedAssignments.ts @@ -44,4 +44,5 @@ let match: RegExpExecArray | null while ((match = re.exec("xxx")) != null) { const length = match[1].length + match[2].length -} \ No newline at end of file +} +let qq4 = new Foo(); \ No newline at end of file diff --git a/tests/cases/conformance/controlFlow/typeGuardsTypeParameters.ts b/tests/cases/conformance/controlFlow/typeGuardsTypeParameters.ts index 169dbc7a7c..708fcceab8 100644 --- a/tests/cases/conformance/controlFlow/typeGuardsTypeParameters.ts +++ b/tests/cases/conformance/controlFlow/typeGuardsTypeParameters.ts @@ -33,3 +33,4 @@ function fun<T>(item: { [P in keyof T]: T[P] }) { } } } +let qq6 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/declarationEmit/declarationEmitWorkWithInlineComments.ts b/tests/cases/conformance/declarationEmit/declarationEmitWorkWithInlineComments.ts index a5b3074a5c..20e4ef968e 100644 --- a/tests/cases/conformance/declarationEmit/declarationEmitWorkWithInlineComments.ts +++ b/tests/cases/conformance/declarationEmit/declarationEmitWorkWithInlineComments.ts @@ -34,4 +34,7 @@ export class Baz { constructor(/* @internal */ public isInternal: string ) {} -} \ No newline at end of file +} +// let ff = new Foo('','','','','','','','','','') +// let bar = new Bar(''); +// let baz = new Baz(''); \ No newline at end of file diff --git a/tests/cases/conformance/declarationEmit/typePredicates/declarationEmitThisPredicates01.ts b/tests/cases/conformance/declarationEmit/typePredicates/declarationEmitThisPredicates01.ts index 69af9c5b07..1b88b5d2bb 100644 --- a/tests/cases/conformance/declarationEmit/typePredicates/declarationEmitThisPredicates01.ts +++ b/tests/cases/conformance/declarationEmit/typePredicates/declarationEmitThisPredicates01.ts @@ -8,4 +8,5 @@ export class C { } export class D extends C { -} \ No newline at end of file +} +let qq6 = new D(); \ No newline at end of file diff --git a/tests/cases/conformance/declarationEmit/typePredicates/declarationEmitThisPredicatesWithPrivateName01.ts b/tests/cases/conformance/declarationEmit/typePredicates/declarationEmitThisPredicatesWithPrivateName01.ts index 461c7d1757..d22941e2f2 100644 --- a/tests/cases/conformance/declarationEmit/typePredicates/declarationEmitThisPredicatesWithPrivateName01.ts +++ b/tests/cases/conformance/declarationEmit/typePredicates/declarationEmitThisPredicatesWithPrivateName01.ts @@ -8,4 +8,5 @@ export class C { } class D extends C { -} \ No newline at end of file +} +let qq7 = new D(); \ No newline at end of file diff --git a/tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/fs.d.ts b/tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/fs.d.ts new file mode 100644 index 0000000000..fe6e6774e2 --- /dev/null +++ b/tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/fs.d.ts @@ -0,0 +1,5 @@ +// @filename: node_modules/@types/node/fs.d.ts +declare module "fs" { + function FSWatcher() + // interface FSWatcher {} +} \ No newline at end of file diff --git a/tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/main.ts b/tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/main.ts new file mode 100644 index 0000000000..38de3dcf37 --- /dev/null +++ b/tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/main.ts @@ -0,0 +1,2 @@ +// @filename: main.ts +/// <reference types="node" /> \ No newline at end of file diff --git a/tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/package.json b/tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/package.json new file mode 100644 index 0000000000..f93a231130 --- /dev/null +++ b/tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/package.json @@ -0,0 +1,4 @@ +{ + "name": "@types/node", + "version": "1.0.0" +} \ No newline at end of file diff --git a/tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/typeReferenceRelatedFiles.ts b/tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/typeReferenceRelatedFiles.ts new file mode 100644 index 0000000000..957e4b37af --- /dev/null +++ b/tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/typeReferenceRelatedFiles.ts @@ -0,0 +1,18 @@ +// @declaration: true +// @filename: node_modules/@types/node/index.d.ts +/// <reference path="fs.d.ts" /> + +// @filename: node_modules/@types/node/package.json +// { +// "name": "@types/node", +// "version": "1.0.0" +// } +// @filename: main.ts +// / <reference types="node" /> +import { FSWatcher } from "fs"; + +FSWatcher(); + +export function f() { + // return {} as FSWatcher; +} diff --git a/tests/cases/conformance/decorators/class/constructor/parameter/decoratorOnClassConstructorParameter5.ts b/tests/cases/conformance/decorators/class/constructor/parameter/decoratorOnClassConstructorParameter5.ts new file mode 100644 index 0000000000..3679047895 --- /dev/null +++ b/tests/cases/conformance/decorators/class/constructor/parameter/decoratorOnClassConstructorParameter5.ts @@ -0,0 +1,15 @@ +// @target: es2018 +// @experimentalDecorators: true +// @noEmitHelpers: true +// @noTypesAndSymbols: true + +// https://github.com/microsoft/TypeScript/issues/44931 +interface IFoo { } +declare const IFoo: any; +class BulkEditPreviewProvider { + static readonly Schema = 'vscode-bulkeditpreview'; + static emptyPreview = { scheme: BulkEditPreviewProvider.Schema }; + constructor( + @IFoo private readonly _modeService: IFoo, + ) { } +} \ No newline at end of file diff --git a/tests/cases/conformance/decorators/class/decoratedBlockScopedClass1.ts b/tests/cases/conformance/decorators/class/decoratedBlockScopedClass1.ts new file mode 100644 index 0000000000..521dd6a31c --- /dev/null +++ b/tests/cases/conformance/decorators/class/decoratedBlockScopedClass1.ts @@ -0,0 +1,16 @@ +// @target: es5 +// @experimentaldecorators: true +// @emitDecoratorMetadata: true +// @filename: a.ts + +function decorator() { + return (target: new (...args: any[]) => any) => {} +} + +@decorator() +class Foo { + public static func(): Foo { + return new Foo(); + } +} +Foo.func(); diff --git a/tests/cases/conformance/decorators/class/decoratedBlockScopedClass2.ts b/tests/cases/conformance/decorators/class/decoratedBlockScopedClass2.ts new file mode 100644 index 0000000000..7d8de6894f --- /dev/null +++ b/tests/cases/conformance/decorators/class/decoratedBlockScopedClass2.ts @@ -0,0 +1,19 @@ +// @target: es5 +// @experimentaldecorators: true +// @emitDecoratorMetadata: true +// @filename: a.ts + +function decorator() { + return (target: new (...args: any[]) => any) => {} +} + +try { + @decorator() + class Foo { + public static func(): Foo { + return new Foo(); + } + } + Foo.func(); +} +catch (e) {} diff --git a/tests/cases/conformance/decorators/class/decoratedBlockScopedClass3.ts b/tests/cases/conformance/decorators/class/decoratedBlockScopedClass3.ts new file mode 100644 index 0000000000..48eebc559f --- /dev/null +++ b/tests/cases/conformance/decorators/class/decoratedBlockScopedClass3.ts @@ -0,0 +1,27 @@ +// @target: es5 +// @experimentaldecorators: true +// @emitDecoratorMetadata: true +// @filename: a.ts + +function decorator() { + return (target: new (...args: any[]) => any) => {} +} + +@decorator() +class Foo { + public static func(): Foo { + return new Foo(); + } +} +Foo.func(); + +try { + @decorator() + class Foo { + public static func(): Foo { + return new Foo(); + } + } + Foo.func(); +} +catch (e) {} diff --git a/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod14.ts b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod14.ts new file mode 100644 index 0000000000..18f3df79bc --- /dev/null +++ b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod14.ts @@ -0,0 +1,14 @@ +// @target: esnext +// @experimentaldecorators: true +// @emitdecoratormetadata: true +declare var decorator: any; + +class Foo { + private prop = () => { + return 0; + } + @decorator + foo() { + return 0; + } +} diff --git a/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod15.ts b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod15.ts new file mode 100644 index 0000000000..70f86b1bbe --- /dev/null +++ b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod15.ts @@ -0,0 +1,12 @@ +// @target: esnext +// @experimentaldecorators: true +// @emitdecoratormetadata: true +declare var decorator: any; + +class Foo { + private prop = 1 + @decorator + foo() { + return 0; + } +} diff --git a/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod16.ts b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod16.ts new file mode 100644 index 0000000000..400d4fbe5a --- /dev/null +++ b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod16.ts @@ -0,0 +1,12 @@ +// @target: esnext +// @experimentaldecorators: true +// @emitdecoratormetadata: true +declare var decorator: any; + +class Foo { + private prop + @decorator + foo() { + return 0; + } +} diff --git a/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod17.ts b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod17.ts new file mode 100644 index 0000000000..1aa25d7f32 --- /dev/null +++ b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod17.ts @@ -0,0 +1,11 @@ +// @target: esnext +// @experimentaldecorators: true +// @emitdecoratormetadata: true +declare var decorator: any; + +class Foo { + private prop @decorator + foo() { + return 0; + } +} diff --git a/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod18.ts b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod18.ts new file mode 100644 index 0000000000..9417c44c5b --- /dev/null +++ b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod18.ts @@ -0,0 +1,11 @@ +// @target: esnext +// @experimentaldecorators: true +// @emitdecoratormetadata: true +declare var decorator: any; + +class Foo { + p1 + + @decorator() + p2; +} diff --git a/tests/cases/conformance/decorators/decoratorMetadataWithTypeOnlyImport2.ts b/tests/cases/conformance/decorators/decoratorMetadataWithTypeOnlyImport2.ts new file mode 100644 index 0000000000..c63fcf1a16 --- /dev/null +++ b/tests/cases/conformance/decorators/decoratorMetadataWithTypeOnlyImport2.ts @@ -0,0 +1,17 @@ +// @experimentalDecorators: true +// @emitDecoratorMetadata: true + + +// @filename: services.ts +export namespace Services { + export class Service {} +} + +// @filename: index.ts +import type { Services } from './services'; + +declare const decorator: any; +export class Main { + @decorator() + field: Services.Service; +} diff --git a/tests/cases/conformance/emitter/es2015/asyncGenerators/emitter.asyncGenerators.classMethods.es2015.ts b/tests/cases/conformance/emitter/es2015/asyncGenerators/emitter.asyncGenerators.classMethods.es2015.ts index fe1bc56dd1..20e20e00dc 100644 --- a/tests/cases/conformance/emitter/es2015/asyncGenerators/emitter.asyncGenerators.classMethods.es2015.ts +++ b/tests/cases/conformance/emitter/es2015/asyncGenerators/emitter.asyncGenerators.classMethods.es2015.ts @@ -58,3 +58,14 @@ class C9 extends B9 { super.g(); } } + +let c1 = new C1(); +let c2 = new C2(); +let c3 = new C3(); +let c4 = new C4(); +let c5 = new C5(); +let c6 = new C6(); +let c7 = new C7(); +let c8 = new C8(); +let c9 = new C9(); + diff --git a/tests/cases/conformance/es2018/es2018IntlAPIs.ts b/tests/cases/conformance/es2018/es2018IntlAPIs.ts new file mode 100644 index 0000000000..c1f6739202 --- /dev/null +++ b/tests/cases/conformance/es2018/es2018IntlAPIs.ts @@ -0,0 +1,7 @@ +// @target: es2018 + +// Sample from +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/PluralRules/supportedLocalesOf +const locales = ['ban', 'id-u-co-pinyin', 'de-ID']; +const options = { localeMatcher: 'lookup' } as const; +console.log(Intl.PluralRules.supportedLocalesOf(locales, options).join(', ')); \ No newline at end of file diff --git a/tests/cases/conformance/es2020/es2020IntlAPIs.ts b/tests/cases/conformance/es2020/es2020IntlAPIs.ts new file mode 100644 index 0000000000..464ecc01ec --- /dev/null +++ b/tests/cases/conformance/es2020/es2020IntlAPIs.ts @@ -0,0 +1,45 @@ +// @target: es2020 + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_identification_and_negotiation +const count = 26254.39; +const date = new Date("2012-05-24"); + +function log(locale: string) { + console.log( + `${new Intl.DateTimeFormat(locale).format(date)} ${new Intl.NumberFormat(locale).format(count)}` + ); +} + +log("en-US"); +// expected output: 5/24/2012 26,254.39 + +log("de-DE"); +// expected output: 24.5.2012 26.254,39 + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat +const rtf1 = new Intl.RelativeTimeFormat('en', { style: 'narrow' }); + +console.log(rtf1.format(3, 'quarter')); +//expected output: "in 3 qtrs." + +console.log(rtf1.format(-1, 'day')); +//expected output: "1 day ago" + +const rtf2 = new Intl.RelativeTimeFormat('es', { numeric: 'auto' }); + +console.log(rtf2.format(2, 'day')); +//expected output: "pasado mañana" + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DisplayNames +const regionNamesInEnglish = new Intl.DisplayNames(['en'], { type: 'region' }); +const regionNamesInTraditionalChinese = new Intl.DisplayNames(['zh-Hant'], { type: 'region' }); + +console.log(regionNamesInEnglish.of('US')); +// expected output: "United States" + +console.log(regionNamesInTraditionalChinese.of('US')); +// expected output: "美國" + +const locales1 = ['ban', 'id-u-co-pinyin', 'de-ID']; +const options1 = { localeMatcher: 'lookup' } as const; +console.log(Intl.DisplayNames.supportedLocalesOf(locales1, options1).join(', ')); \ No newline at end of file diff --git a/tests/cases/conformance/es6/classDeclaration/emitClassDeclarationWithPropertyAccessInHeritageClause1.ts b/tests/cases/conformance/es6/classDeclaration/emitClassDeclarationWithPropertyAccessInHeritageClause1.ts index 5d18229ea0..de26b4fc10 100644 --- a/tests/cases/conformance/es6/classDeclaration/emitClassDeclarationWithPropertyAccessInHeritageClause1.ts +++ b/tests/cases/conformance/es6/classDeclaration/emitClassDeclarationWithPropertyAccessInHeritageClause1.ts @@ -2,4 +2,6 @@ class B {} function foo() { return {B: B}; } -class C extends (foo()).B {} \ No newline at end of file +class C extends (foo()).B {} +let qt6 = new B(); +let qt7 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing1.ts b/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing1.ts index e5d63f2e93..a872204ec7 100644 --- a/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing1.ts +++ b/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing1.ts @@ -13,3 +13,4 @@ class D extends Base { var i = Factory.create(s); } } +let qt2 = new D(); \ No newline at end of file diff --git a/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing2.ts b/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing2.ts index 1b0a0d541e..826baf9d02 100644 --- a/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing2.ts +++ b/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing2.ts @@ -7,3 +7,4 @@ class D extends Base { super(() => { this._t }); // no error. only check when this is directly accessing in constructor } } +let qt5 = new D(); \ No newline at end of file diff --git a/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing5.ts b/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing5.ts index 1782027758..10e7ca31aa 100644 --- a/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing5.ts +++ b/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing5.ts @@ -4,3 +4,4 @@ this._t; // No error } } +let qt4 = new D(); \ No newline at end of file diff --git a/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing8.ts b/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing8.ts index 5742cdab84..3b55dbc70f 100644 --- a/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing8.ts +++ b/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing8.ts @@ -10,3 +10,4 @@ class D extends Base { } } } +let qt3 = new D(); \ No newline at end of file diff --git a/tests/cases/conformance/es6/spread/arraySpreadImportHelpers.ts b/tests/cases/conformance/es6/spread/arraySpreadImportHelpers.ts new file mode 100644 index 0000000000..ebeb117ed0 --- /dev/null +++ b/tests/cases/conformance/es6/spread/arraySpreadImportHelpers.ts @@ -0,0 +1,16 @@ +// @target: es5 +// @importHelpers: true +// @isolatedModules: true +// @noTypesAndSymbols: true +// @noEmit: true +// @filename: main.ts + +export {}; +const k = [1, , 2]; +const o = [3, ...k, 4]; + +// @filename: tslib.d.ts +// this is a pre-TS4.4 versions of emit helper, which always forced array packing +declare module "tslib" { + function __spreadArray(to: any[], from: any[]): any[]; +} diff --git a/tests/cases/conformance/es6/templates/templateStringWithCommentsInArrowFunction.ts b/tests/cases/conformance/es6/templates/templateStringWithCommentsInArrowFunction.ts new file mode 100644 index 0000000000..c344bea1fb --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringWithCommentsInArrowFunction.ts @@ -0,0 +1,14 @@ +// @removeComments: false + +const a = 1; +const f1 = () => + `${ + // a + a + }a`; + +const f2 = () => + `${ + // a + a + }`; diff --git a/tests/cases/conformance/expressions/asOperator/asOperatorASI.ts b/tests/cases/conformance/expressions/asOperator/asOperatorASI.ts index a4dd44a15a..ea325aefaf 100644 --- a/tests/cases/conformance/expressions/asOperator/asOperatorASI.ts +++ b/tests/cases/conformance/expressions/asOperator/asOperatorASI.ts @@ -8,3 +8,4 @@ as `Hello world`; // should not error // Example 2 var y = 20 as(Foo); // should emit +let qw11 = new Foo(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithIdenticalObjects.ts b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithIdenticalObjects.ts index 05b8e135cb..285f41f742 100644 --- a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithIdenticalObjects.ts +++ b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithIdenticalObjects.ts @@ -191,4 +191,8 @@ var r8b3 = b2 !== a2; var r8b4 = b3 !== a3; var r8b5 = b4 !== a4; var r8b6 = b5 !== a5; -var r8b7 = b6 !== a6; \ No newline at end of file +var r8b7 = b6 !== a6; +let qr1 = new A1(); +let qr2 = new B1(); +let qr3 = new A2(); +let qr4 = new B2(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithIntersectionType.ts b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithIntersectionType.ts new file mode 100644 index 0000000000..68900e5f91 --- /dev/null +++ b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithIntersectionType.ts @@ -0,0 +1,5 @@ +declare let a: { a: 1 } +a > 1; + +declare let b: { a: 1 } & { b: number } +b > 1; diff --git a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithNoRelationshipObjectsOnInstantiatedCallSignature.ts b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithNoRelationshipObjectsOnInstantiatedCallSignature.ts index 5670cf8ef1..441748fb1a 100644 --- a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithNoRelationshipObjectsOnInstantiatedCallSignature.ts +++ b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithNoRelationshipObjectsOnInstantiatedCallSignature.ts @@ -146,4 +146,6 @@ var r8b2 = b2 !== a2; var r8b3 = b3 !== a3; var r8b4 = b4 !== a4; var r8b5 = b5 !== a5; -var r8b6 = b6 !== a6; \ No newline at end of file +var r8b6 = b6 !== a6; +let qe5 = new Derived(); +let qe6 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithNoRelationshipObjectsOnInstantiatedConstructorSignature.ts b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithNoRelationshipObjectsOnInstantiatedConstructorSignature.ts index 8f3d914934..3f0d1adb65 100644 --- a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithNoRelationshipObjectsOnInstantiatedConstructorSignature.ts +++ b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithNoRelationshipObjectsOnInstantiatedConstructorSignature.ts @@ -146,4 +146,6 @@ var r8b2 = b2 !== a2; var r8b3 = b3 !== a3; var r8b4 = b4 !== a4; var r8b5 = b5 !== a5; -var r8b6 = b6 !== a6; \ No newline at end of file +var r8b6 = b6 !== a6; +let qe7 = new Derived(); +let qe8 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnCallSignature.ts b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnCallSignature.ts index 6b6ae79015..e60a012739 100644 --- a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnCallSignature.ts +++ b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnCallSignature.ts @@ -256,4 +256,5 @@ var r8b8 = b8 !== a8; var r8b9 = b9 !== a9; var r8b10 = b10 !== a10; var r8b11 = b11 !== a11; -//var r8b12 = b12 !== a12; \ No newline at end of file +//var r8b12 = b12 !== a12; +let qw12 = new Derived(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnConstructorSignature.ts b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnConstructorSignature.ts index 363192f49f..e42a1cc1c1 100644 --- a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnConstructorSignature.ts +++ b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnConstructorSignature.ts @@ -218,4 +218,5 @@ var r8b6 = b6 !== a6; var r8b7 = b7 !== a7; var r8b8 = b8 !== a8; var r8b9 = b9 !== a9; -//var r8b10 = b10 !== a10; \ No newline at end of file +//var r8b10 = b10 !== a10; +let qe9 = new Derived(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnIndexSignature.ts b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnIndexSignature.ts index 8246c6dd18..9154c7f806 100644 --- a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnIndexSignature.ts +++ b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnIndexSignature.ts @@ -104,4 +104,5 @@ var r8a1 = a4 !== b4; var r8b1 = b1 !== a1; var r8b1 = b2 !== a2; var r8b1 = b3 !== a3; -var r8b1 = b4 !== a4; \ No newline at end of file +var r8b1 = b4 !== a4; +let qr5 = new Derived(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnInstantiatedCallSignature.ts b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnInstantiatedCallSignature.ts index da3d4131c6..59f9a78a38 100644 --- a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnInstantiatedCallSignature.ts +++ b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnInstantiatedCallSignature.ts @@ -161,4 +161,5 @@ var r8b3 = b3 !== a3; var r8b4 = b4 !== a4; var r8b5 = b5 !== a5; var r8b6 = b6 !== a6; -//var r8b7 = b7 !== a7; \ No newline at end of file +//var r8b7 = b7 !== a7; +let qw14 = new Derived(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnInstantiatedConstructorSignature.ts b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnInstantiatedConstructorSignature.ts index 5a2356eadb..05f49336bf 100644 --- a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnInstantiatedConstructorSignature.ts +++ b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnInstantiatedConstructorSignature.ts @@ -161,4 +161,5 @@ var r8b3 = b3 !== a3; var r8b4 = b4 !== a4; var r8b5 = b5 !== a5; var r8b6 = b6 !== a6; -//var r8b7 = b7 !== a7; \ No newline at end of file +//var r8b7 = b7 !== a7; +let qw13 = new Derived(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnProperty.ts b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnProperty.ts index 6401feb11c..fb2cd09f76 100644 --- a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnProperty.ts +++ b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnProperty.ts @@ -75,4 +75,8 @@ var rg4 = b2 === a2; var rh1 = a1 !== b1; var rh2 = a2 !== b2; var rh3 = b1 !== a1; -var rh4 = b2 !== a2; \ No newline at end of file +var rh4 = b2 !== a2; +let qe1 = new Derived(); +let qe2 = new A1(); +let qe3 = new B1(); +let qe4 = new B2(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/binaryOperators/instanceofOperator/instanceofOperatorWithInvalidStaticToString.ts b/tests/cases/conformance/expressions/binaryOperators/instanceofOperator/instanceofOperatorWithInvalidStaticToString.ts index b99f8d7114..1399026e80 100644 --- a/tests/cases/conformance/expressions/binaryOperators/instanceofOperator/instanceofOperatorWithInvalidStaticToString.ts +++ b/tests/cases/conformance/expressions/binaryOperators/instanceofOperator/instanceofOperatorWithInvalidStaticToString.ts @@ -19,3 +19,6 @@ declare class NormalToString { function baz(normal: NormalToString) { return normal instanceof NormalToString; } +let qr7 = new StaticToString(); +let qr8 = new StaticToNumber(); +let qr9 = new NormalToString(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/binaryOperators/instanceofOperator/instanceofOperatorWithLHSIsObject.ts b/tests/cases/conformance/expressions/binaryOperators/instanceofOperator/instanceofOperatorWithLHSIsObject.ts index 6b88cd39f2..47a60b104b 100644 --- a/tests/cases/conformance/expressions/binaryOperators/instanceofOperator/instanceofOperatorWithLHSIsObject.ts +++ b/tests/cases/conformance/expressions/binaryOperators/instanceofOperator/instanceofOperatorWithLHSIsObject.ts @@ -12,3 +12,4 @@ var r1 = a instanceof x1; var r2 = b instanceof x2; var r3 = c instanceof x1; var r4 = d instanceof x1; +let qr0 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/commaOperator/commaOperatorWithSecondOperandObjectType.ts b/tests/cases/conformance/expressions/commaOperator/commaOperatorWithSecondOperandObjectType.ts index 0a6a47dfbb..4e2e1e494d 100644 --- a/tests/cases/conformance/expressions/commaOperator/commaOperatorWithSecondOperandObjectType.ts +++ b/tests/cases/conformance/expressions/commaOperator/commaOperatorWithSecondOperandObjectType.ts @@ -38,3 +38,4 @@ var resultIsObject8 = (true, {}); var resultIsObject9 = (!BOOLEAN, { a: 1, b: "s" }); var resultIsObject10 = ("string", new Date()); var resultIsObject11 = (STRING.toLowerCase(), new CLASS()); +let qw10 = new CLASS(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/conditonalOperator/conditionalOperatorWithIdenticalBCT.ts b/tests/cases/conformance/expressions/conditonalOperator/conditionalOperatorWithIdenticalBCT.ts index 11652b023d..93bdd906c6 100644 --- a/tests/cases/conformance/expressions/conditonalOperator/conditionalOperatorWithIdenticalBCT.ts +++ b/tests/cases/conformance/expressions/conditonalOperator/conditionalOperatorWithIdenticalBCT.ts @@ -44,3 +44,6 @@ var result10: (t: X) => any = true ? (m) => m.propertyX1 : (n) => n.propertyX2; //Expr1 and Expr2 are literals var result11: any = true ? 1 : 'string'; + +let qq1 = new A(); +let qq0 = new B(); diff --git a/tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping1.ts b/tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping1.ts index 7bcde9a695..fc8bde2595 100644 --- a/tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping1.ts +++ b/tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping1.ts @@ -9,3 +9,5 @@ class B extends A<number, string> { // Ensure 'value' is of type 'number (and not '{}') by using its 'toExponential()' method. constructor() { super(value => String(value.toExponential())); } } + +let qr17 = new B(); diff --git a/tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping3.ts b/tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping3.ts index 760337f3ef..6eac51e440 100644 --- a/tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping3.ts +++ b/tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping3.ts @@ -28,4 +28,5 @@ class C extends CBase<string> { } }); } -} \ No newline at end of file +} +let qt1 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/functionCalls/callWithSpread.ts b/tests/cases/conformance/expressions/functionCalls/callWithSpread.ts index b1e2ee7578..3ba8aa488a 100644 --- a/tests/cases/conformance/expressions/functionCalls/callWithSpread.ts +++ b/tests/cases/conformance/expressions/functionCalls/callWithSpread.ts @@ -55,3 +55,4 @@ class D extends C { super.foo(1, 2, ...a); } } +let qr13 = new D(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/functions/arrowFunctionExpressions.ts b/tests/cases/conformance/expressions/functions/arrowFunctionExpressions.ts index 707ef02de8..304d6792dc 100644 --- a/tests/cases/conformance/expressions/functions/arrowFunctionExpressions.ts +++ b/tests/cases/conformance/expressions/functions/arrowFunctionExpressions.ts @@ -96,3 +96,4 @@ function tryCatchFn() { var m = () => this + ''; } } +let qr14 = new MyClass(); diff --git a/tests/cases/conformance/expressions/newOperator/newOperatorConformance.ts b/tests/cases/conformance/expressions/newOperator/newOperatorConformance.ts index b50751c7ae..051e4e3c3e 100644 --- a/tests/cases/conformance/expressions/newOperator/newOperatorConformance.ts +++ b/tests/cases/conformance/expressions/newOperator/newOperatorConformance.ts @@ -60,3 +60,4 @@ var t: any; var nested = new (new (new nestedCtor())())(); var n = new nested(); var n = new nested(); +let aa1 = new C1(null,null); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/superCalls/superCalls.ts b/tests/cases/conformance/expressions/superCalls/superCalls.ts index fdebc85906..da0fe9656b 100644 --- a/tests/cases/conformance/expressions/superCalls/superCalls.ts +++ b/tests/cases/conformance/expressions/superCalls/superCalls.ts @@ -27,3 +27,5 @@ class OtherDerived extends OtherBase { super(); } } +let qr15 = new Derived(null); +let qr16 = new OtherDerived(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/thisKeyword/typeOfThisGeneral.ts b/tests/cases/conformance/expressions/thisKeyword/typeOfThisGeneral.ts new file mode 100644 index 0000000000..99d6a50b00 --- /dev/null +++ b/tests/cases/conformance/expressions/thisKeyword/typeOfThisGeneral.ts @@ -0,0 +1,178 @@ +// @target: esnext +// @useDefineForClassFields: false +class MyTestClass { + private canary: number; + static staticCanary: number; + + constructor() { + //type of 'this' in constructor body is the class instance type + var p = this.canary; + var p: number; + this.canary = 3; + } + + //type of 'this' in member function param list is the class instance type + memberFunc(t = this) { + var t: MyTestClass; + + //type of 'this' in member function body is the class instance type + var p = this; + var p: MyTestClass; + } + + //type of 'this' in member accessor(get and set) body is the class instance type + get prop() { + var p = this; + var p: MyTestClass; + return this; + } + set prop(v) { + var p = this; + var p: MyTestClass; + p = v; + v = p; + } + + someFunc = () => { + //type of 'this' in member variable initializer is the class instance type + var t = this; + var t: MyTestClass; + }; + + //type of 'this' in static function param list is constructor function type + static staticFn(t = this) { + var t: typeof MyTestClass; + var t = MyTestClass; + t.staticCanary; + + //type of 'this' in static function body is constructor function type + var p = this; + var p: typeof MyTestClass; + var p = MyTestClass; + p.staticCanary; + } + + static get staticProp() { + //type of 'this' in static accessor body is constructor function type + var p = this; + var p: typeof MyTestClass; + var p = MyTestClass; + p.staticCanary; + return this; + } + static set staticProp(v: typeof MyTestClass) { + //type of 'this' in static accessor body is constructor function type + var p = this; + var p: typeof MyTestClass; + var p = MyTestClass; + p.staticCanary; + } +} + +class MyGenericTestClass<T, U> { + private canary: number; + static staticCanary: number; + + constructor() { + //type of 'this' in constructor body is the class instance type + var p = this.canary; + var p: number; + this.canary = 3; + } + + //type of 'this' in member function param list is the class instance type + memberFunc(t = this) { + var t: MyGenericTestClass<T, U>; + + //type of 'this' in member function body is the class instance type + var p = this; + var p: MyGenericTestClass<T, U>; + } + + //type of 'this' in member accessor(get and set) body is the class instance type + get prop() { + var p = this; + var p: MyGenericTestClass<T, U>; + return this; + } + set prop(v) { + var p = this; + var p: MyGenericTestClass<T, U>; + p = v; + v = p; + } + + someFunc = () => { + //type of 'this' in member variable initializer is the class instance type + var t = this; + var t: MyGenericTestClass<T, U>; + }; + + //type of 'this' in static function param list is constructor function type + static staticFn(t = this) { + var t: typeof MyGenericTestClass; + var t = MyGenericTestClass; + t.staticCanary; + + //type of 'this' in static function body is constructor function type + var p = this; + var p: typeof MyGenericTestClass; + var p = MyGenericTestClass; + p.staticCanary; + } + + static get staticProp() { + //type of 'this' in static accessor body is constructor function type + var p = this; + var p: typeof MyGenericTestClass; + var p = MyGenericTestClass; + p.staticCanary; + return this; + } + static set staticProp(v: typeof MyGenericTestClass) { + //type of 'this' in static accessor body is constructor function type + var p = this; + var p: typeof MyGenericTestClass; + var p = MyGenericTestClass; + p.staticCanary; + } +} + +//type of 'this' in a function declaration param list is Any +function fn(s = this) { + var s: any; + s.spaaaaaaace = 4; + + //type of 'this' in a function declaration body is Any + var t: any; + var t = this; + this.spaaaaace = 4; +} + +//type of 'this' in a function expression param list list is Any +var q1 = function (s = this) { + var s: any; + s.spaaaaaaace = 4; + + //type of 'this' in a function expression body is Any + var t: any; + var t = this; + this.spaaaaace = 4; +} + +//type of 'this' in a fat arrow expression param list is typeof globalThis +var q2 = (s = this) => { + var s: typeof globalThis; + s.spaaaaaaace = 4; + + //type of 'this' in a fat arrow expression body is typeof globalThis + var t: typeof globalThis; + var t = this; + this.spaaaaace = 4; +} + +//type of 'this' in global module is GlobalThis +var t: typeof globalThis; +var t = this; +this.spaaaaace = 4; + diff --git a/tests/cases/conformance/expressions/typeGuards/TypeGuardWithArrayUnion.ts b/tests/cases/conformance/expressions/typeGuards/TypeGuardWithArrayUnion.ts index 8884754b48..c6378e0dc3 100644 --- a/tests/cases/conformance/expressions/typeGuards/TypeGuardWithArrayUnion.ts +++ b/tests/cases/conformance/expressions/typeGuards/TypeGuardWithArrayUnion.ts @@ -7,3 +7,4 @@ function saySize(message: Message | Message[]) { return message.length; // Should have type Message[] here } } +let rr5 = new Message(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardFunction.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardFunction.ts index 57d56ccc3b..0f531ea811 100644 --- a/tests/cases/conformance/expressions/typeGuards/typeGuardFunction.ts +++ b/tests/cases/conformance/expressions/typeGuards/typeGuardFunction.ts @@ -80,4 +80,8 @@ acceptingTypeGuardFunction(isA); // Binary expressions let union2: C | B; -let union3: boolean | B = isA(union2) || union2; \ No newline at end of file +let union3: boolean | B = isA(union2) || union2; + +let ee2 = new B(); +let ee3 = new C(); +let ee4 = new D(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardFunctionGenerics.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardFunctionGenerics.ts index d0e108b573..3511cc54b1 100644 --- a/tests/cases/conformance/expressions/typeGuards/typeGuardFunctionGenerics.ts +++ b/tests/cases/conformance/expressions/typeGuards/typeGuardFunctionGenerics.ts @@ -30,4 +30,6 @@ let test2: B = funC(isB); if (funD(isC, a)) { a.propC; } -let test3: B = funE(isB, 1); \ No newline at end of file +let test3: B = funE(isB, 1); +let qw7 = new B(); +let qw8 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormExpr1AndExpr2.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormExpr1AndExpr2.ts index 1ed8e6ebb0..e14dd79116 100644 --- a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormExpr1AndExpr2.ts +++ b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormExpr1AndExpr2.ts @@ -43,4 +43,5 @@ if (typeof strOrNumOrBool !== "string" && numOrBool !== strOrNumOrBool) { } else { var r3: string | number | boolean = strOrNumOrBool; // string | number | boolean -} \ No newline at end of file +} +let rr1 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormExpr1OrExpr2.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormExpr1OrExpr2.ts index 1d72f35828..3411e32bcf 100644 --- a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormExpr1OrExpr2.ts +++ b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormExpr1OrExpr2.ts @@ -43,4 +43,5 @@ if (typeof strOrNumOrBool === "string" || numOrBool !== strOrNumOrBool) { } else { numOrBool = strOrNumOrBool; // number | boolean -} \ No newline at end of file +} +let qw2 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormInstanceOf.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormInstanceOf.ts index 31514fca74..db3d488209 100644 --- a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormInstanceOf.ts +++ b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormInstanceOf.ts @@ -1,25 +1,25 @@ -// A type guard of the form x instanceof C, where C is of a subtype of the global type 'Function' -// and C has a property named 'prototype' -// - when true, narrows the type of x to the type of the 'prototype' property in C provided -// it is a subtype of the type of x, or -// - when false, has no effect on the type of x. - -class C1 { - p1: string; -} -class C2 { - p2: number; -} -class D1 extends C1 { - p3: number; -} +// A type guard of the form x instanceof C, where C is of a subtype of the global type 'Function' +// and C has a property named 'prototype' +// - when true, narrows the type of x to the type of the 'prototype' property in C provided +// it is a subtype of the type of x, or +// - when false, has no effect on the type of x. + +class C1 { + p1: string; +} +class C2 { + p2: number; +} +class D1 extends C1 { + p3: number; +} class C3 { p4: number; } -var str: string; -var num: number; -var strOrNum: string | number; - +var str: string; +var num: number; +var strOrNum: string | number; + var ctor1: C1 | C2; str = ctor1 instanceof C1 && ctor1.p1; // C1 num = ctor1 instanceof C2 && ctor1.p2; // C2 @@ -31,7 +31,7 @@ num = ctor2 instanceof C2 && ctor2.p2; // C2 num = ctor2 instanceof D1 && ctor2.p3; // D1 str = ctor2 instanceof D1 && ctor2.p1; // D1 var r2: D1 | C2 = ctor2 instanceof C1 && ctor2; // C2 | D1 - + var ctor3: C1 | C2; if (ctor3 instanceof C1) { ctor3.p1; // C1 @@ -64,4 +64,7 @@ if (ctor6 instanceof C1 || ctor6 instanceof C2) { } else { ctor6.p4; // C3 -} \ No newline at end of file +} +let qw4 = new C2(); +let qw3 = new D1(); +let qw5 = new C3(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormIsType.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormIsType.ts index 9f5ca611ee..e0953773d5 100644 --- a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormIsType.ts +++ b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormIsType.ts @@ -34,4 +34,7 @@ var c2Ord1: C2 | D1; num = isC2(c2Ord1) && c2Ord1.p2; // C2 num = isD1(c2Ord1) && c2Ord1.p3; // D1 str = isD1(c2Ord1) && c2Ord1.p1; // D1 -var r2: C2 | D1 = isC1(c2Ord1) && c2Ord1; // C2 | D1 \ No newline at end of file +var r2: C2 | D1 = isC1(c2Ord1) && c2Ord1; // C2 | D1 + +let rr2 = new C2(); +let rr3 = new D1(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormTypeOfBoolean.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormTypeOfBoolean.ts index 37651071b7..610f0da2c8 100644 --- a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormTypeOfBoolean.ts +++ b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormTypeOfBoolean.ts @@ -83,3 +83,4 @@ if (typeof strOrNum !== "boolean") { else { let z2: {} = strOrNum; // {} } +let qw9 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormTypeOfNumber.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormTypeOfNumber.ts index b4cdf81660..f00736781f 100644 --- a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormTypeOfNumber.ts +++ b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormTypeOfNumber.ts @@ -82,3 +82,4 @@ if (typeof strOrBool !== "number") { else { let y2: {} = strOrBool; // {} } +let ee6 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormTypeOfString.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormTypeOfString.ts index f742124708..a20093f868 100644 --- a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormTypeOfString.ts +++ b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormTypeOfString.ts @@ -82,3 +82,4 @@ if (typeof numOrBool !== "string") { else { let x2: {} = numOrBool; // {} } +let rr4 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFromPropNameInUnionType.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFromPropNameInUnionType.ts index e1256e4288..ceee99f7e2 100644 --- a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFromPropNameInUnionType.ts +++ b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFromPropNameInUnionType.ts @@ -103,3 +103,12 @@ function f(i: Indexed) { } return "c" in i && i.c; } +let tt1 = new A(); +let tt2 = new B(); +let tt3 = new C(); +let tt4 = new D(); +let tt5 = new AWithOptionalProp(); +let tt6 = new BWithOptionalProp(); +let tt7 = new ClassWithUnionProp(); +let tt8 = new InMemberOfClass(); +let tt9 = new SelfAssert(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardsInClassAccessors.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardsInClassAccessors.ts index 04b9a6a394..044131068a 100644 --- a/tests/cases/conformance/expressions/typeGuards/typeGuardsInClassAccessors.ts +++ b/tests/cases/conformance/expressions/typeGuards/typeGuardsInClassAccessors.ts @@ -101,3 +101,4 @@ class ClassWithAccessors { num = typeof var2 === "string" && var2.length; // string } } +let ee1 = new ClassWithAccessors(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardsInClassMethods.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardsInClassMethods.ts index cb1327027c..7bb36dfefe 100644 --- a/tests/cases/conformance/expressions/typeGuards/typeGuardsInClassMethods.ts +++ b/tests/cases/conformance/expressions/typeGuards/typeGuardsInClassMethods.ts @@ -65,3 +65,4 @@ class C1 { num = typeof param === "string" && param.length; // string } } +let qw1 = new C1(null); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardsInProperties.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardsInProperties.ts index bffe8d3d1b..b7fd3f9c34 100644 --- a/tests/cases/conformance/expressions/typeGuards/typeGuardsInProperties.ts +++ b/tests/cases/conformance/expressions/typeGuards/typeGuardsInProperties.ts @@ -24,4 +24,5 @@ strOrNum = typeof c1.pp3 === "string" && c1.pp3; // string | number var obj1: { x: string | number; }; -strOrNum = typeof obj1.x === "string" && obj1.x; // string | number \ No newline at end of file +strOrNum = typeof obj1.x === "string" && obj1.x; // string | number +let ee5 = new C1(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardsOnClassProperty.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardsOnClassProperty.ts index 2c26b10c6a..574f2af39c 100644 --- a/tests/cases/conformance/expressions/typeGuards/typeGuardsOnClassProperty.ts +++ b/tests/cases/conformance/expressions/typeGuards/typeGuardsOnClassProperty.ts @@ -25,4 +25,5 @@ var o: { if (typeof o.prop1 === "string" && o.prop1.toLowerCase()) {} var prop1 = o.prop1; -if (typeof prop1 === "string" && prop1.toLocaleLowerCase()) { } \ No newline at end of file +if (typeof prop1 === "string" && prop1.toLocaleLowerCase()) { } +let qw6 = new D(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/unaryOperators/bitwiseNotOperator/bitwiseNotOperatorWithNumberType.ts b/tests/cases/conformance/expressions/unaryOperators/bitwiseNotOperator/bitwiseNotOperatorWithNumberType.ts index b41a114503..87e1d09bea 100644 --- a/tests/cases/conformance/expressions/unaryOperators/bitwiseNotOperator/bitwiseNotOperatorWithNumberType.ts +++ b/tests/cases/conformance/expressions/unaryOperators/bitwiseNotOperator/bitwiseNotOperatorWithNumberType.ts @@ -43,4 +43,5 @@ var ResultIsNumber13 = ~~~(NUMBER + NUMBER); ~foo(); ~objA.a; ~M.n; -~objA.a, M.n; \ No newline at end of file +~objA.a, M.n; +let qr11 = new A(); \ No newline at end of file diff --git a/tests/cases/conformance/expressions/unaryOperators/bitwiseNotOperator/bitwiseNotOperatorWithStringType.ts b/tests/cases/conformance/expressions/unaryOperators/bitwiseNotOperator/bitwiseNotOperatorWithStringType.ts index 0b60c73ef9..4495309b10 100644 --- a/tests/cases/conformance/expressions/unaryOperators/bitwiseNotOperator/bitwiseNotOperatorWithStringType.ts +++ b/tests/cases/conformance/expressions/unaryOperators/bitwiseNotOperator/bitwiseNotOperatorWithStringType.ts @@ -42,4 +42,5 @@ var ResultIsNumber14 = ~~~(STRING + STRING); ~STRING; ~STRING1; ~foo(); -~objA.a,M.n; \ No newline at end of file +~objA.a,M.n; +let qr12 = new A(); \ No newline at end of file diff --git a/tests/cases/conformance/externalModules/exportNonVisibleType.ts b/tests/cases/conformance/externalModules/exportNonVisibleType.ts index 4f4722fd86..cc56bd2f0b 100644 --- a/tests/cases/conformance/externalModules/exportNonVisibleType.ts +++ b/tests/cases/conformance/externalModules/exportNonVisibleType.ts @@ -31,3 +31,4 @@ class C1 { } export = C1; // Should work, private type I1 of visible class C1 only used in private member m1. +let qt8 = new C1(); \ No newline at end of file diff --git a/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension1.ts b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension1.ts new file mode 100644 index 0000000000..83e86fc6c6 --- /dev/null +++ b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension1.ts @@ -0,0 +1,12 @@ +// @moduleResolution: node12 +// @module: node12 + +// @filename: /src/foo.mts +export function foo() { + return ""; +} + +// @filename: /src/bar.mts +// Extensionless relative path ES import in an ES module +import { foo } from "./foo"; // should error, suggest adding ".mjs" +import { baz } from "./baz"; // should error, ask for extension, no extension suggestion diff --git a/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension2.ts b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension2.ts new file mode 100644 index 0000000000..0051e17401 --- /dev/null +++ b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension2.ts @@ -0,0 +1,6 @@ +// @moduleResolution: node12 +// @module: node12 + +// @filename: /src/buzz.mts +// Extensionless relative path cjs import in an ES module +import foo = require("./foo"); // should error, should not ask for extension \ No newline at end of file diff --git a/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension3.ts b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension3.ts new file mode 100644 index 0000000000..2ec3ff1ad0 --- /dev/null +++ b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension3.ts @@ -0,0 +1,12 @@ +// @moduleResolution: nodenext +// @module: nodenext +// @jsx: preserve + +// @filename: /src/foo.tsx +export function foo() { + return ""; +} + +// @filename: /src/bar.mts +// Extensionless relative path ES import in an ES module +import { foo } from "./foo"; // should error, suggest adding ".jsx" diff --git a/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension4.ts b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension4.ts new file mode 100644 index 0000000000..c1eab70f92 --- /dev/null +++ b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension4.ts @@ -0,0 +1,12 @@ +// @moduleResolution: nodenext +// @module: nodenext +// @jsx: react + +// @filename: /src/foo.tsx +export function foo() { + return ""; +} + +// @filename: /src/bar.mts +// Extensionless relative path ES import in an ES module +import { foo } from "./foo"; // should error, suggest adding ".js" diff --git a/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension5.ts b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension5.ts new file mode 100644 index 0000000000..5053a242cd --- /dev/null +++ b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension5.ts @@ -0,0 +1,6 @@ +// @moduleResolution: node12 +// @module: node12 + +// @filename: /src/buzz.mts +// Extensionless relative path dynamic import in an ES module +import("./foo").then(x => x); // should error, ask for extension \ No newline at end of file diff --git a/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension6.ts b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension6.ts new file mode 100644 index 0000000000..2a6ef2645d --- /dev/null +++ b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension6.ts @@ -0,0 +1,8 @@ +// @moduleResolution: node12 +// @module: node12 + +// @filename: /src/bar.cts +// Extensionless relative path import statement in a cjs module +// Import statements are not allowed in cjs files, +// but other errors should not assume that they are allowed +import { foo } from "./foo"; // should error, should not ask for extension \ No newline at end of file diff --git a/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension7.ts b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension7.ts new file mode 100644 index 0000000000..3b10dd6e48 --- /dev/null +++ b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension7.ts @@ -0,0 +1,6 @@ +// @moduleResolution: node12 +// @module: node12 + +// @filename: /src/bar.cts +// Extensionless relative path cjs import in a cjs module +import foo = require("./foo"); // should error, should not ask for extension \ No newline at end of file diff --git a/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension8.ts b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension8.ts new file mode 100644 index 0000000000..fef17b3aa1 --- /dev/null +++ b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension8.ts @@ -0,0 +1,6 @@ +// @moduleResolution: node12 +// @module: node12 + +// @filename: /src/bar.cts +// Extensionless relative path dynamic import in a cjs module +import("./foo").then(x => x); // should error, ask for extension \ No newline at end of file diff --git a/tests/cases/conformance/externalModules/typeOnly/exportSpecifiers.ts b/tests/cases/conformance/externalModules/typeOnly/exportSpecifiers.ts new file mode 100644 index 0000000000..c8c584f66d --- /dev/null +++ b/tests/cases/conformance/externalModules/typeOnly/exportSpecifiers.ts @@ -0,0 +1,21 @@ +// @module: esnext +// @declaration: true + +// @Filename: /imports.ts +import { type, as, something, foo, bar } from "./exports.js"; +type; +as; // Error (used in emitting position) +something; // Error (used in emitting position) +foo; // Error (used in emitting position) +bar; // Error (used in emitting position) + +// @Filename: /exports.ts +const type = 0; +const as = 0; +const something = 0; +export { type }; +export { type as }; +export { type something }; +export { type type as foo }; +export { type as as bar }; +export type { type something as whatever }; // Error diff --git a/tests/cases/conformance/externalModules/typeOnly/importDefaultNamedType/a.ts b/tests/cases/conformance/externalModules/typeOnly/importDefaultNamedType/a.ts new file mode 100644 index 0000000000..3e949a0611 --- /dev/null +++ b/tests/cases/conformance/externalModules/typeOnly/importDefaultNamedType/a.ts @@ -0,0 +1,2 @@ +// @Filename: /a.ts +export default class A {} \ No newline at end of file diff --git a/tests/cases/conformance/externalModules/typeOnly/importDefaultNamedType/importDefaultNamedType.ts b/tests/cases/conformance/externalModules/typeOnly/importDefaultNamedType/importDefaultNamedType.ts new file mode 100644 index 0000000000..3bb8cdfce2 --- /dev/null +++ b/tests/cases/conformance/externalModules/typeOnly/importDefaultNamedType/importDefaultNamedType.ts @@ -0,0 +1,5 @@ + + +// @Filename: /b.ts +import type from './a'; +type; \ No newline at end of file diff --git a/tests/cases/conformance/externalModules/typeOnly/importSpecifiers1.ts b/tests/cases/conformance/externalModules/typeOnly/importSpecifiers1.ts new file mode 100644 index 0000000000..348784befd --- /dev/null +++ b/tests/cases/conformance/externalModules/typeOnly/importSpecifiers1.ts @@ -0,0 +1,46 @@ +// @module: esnext +// @declaration: true + +// @Filename: /mod.ts +export const as = 0; +export const type = 0; +export const something = 0; + +// @Filename: /a.ts +import { type } from "./mod.js"; +import { type as } from "./mod.js"; +type; +as; // Error (used in emitting position) + +// @Filename: /b.ts +import { type as as } from "./mod.js"; +type; // Error (cannot resolve name) +as; + +// @Filename: /c.ts +import { type as as as } from "./mod.js"; +type; // Error (cannot resolve name) +as; // Error (used in emitting position) + +// @Filename: /d.ts +import { type as as as as } from "./mod.js"; // Error + +// @Filename: /e.ts +import { type type as as } from "./mod.js"; +import { type as type } from "./mod.js"; +type; +as; // Error (used in emitting position) + +// @Filename: /f.ts +import { type import } from "./mod.js"; // Error +import { type as export } from "./mod.js"; // Error +import { type as as export } from "./mod.js"; // Error +import { type something } from "./mod.js"; +import { type something as s } from "./mod.js"; +type; // Error (cannot resolve name) +as; // Error (cannot resolve name) +something; // Error (used in emitting position) +s; // Error (used in emitting position) + +// @Filename: /g.ts +import type { type something } from "./mod.js"; // Error diff --git a/tests/cases/conformance/externalModules/typeOnly/preserveValueImports.ts b/tests/cases/conformance/externalModules/typeOnly/preserveValueImports.ts new file mode 100644 index 0000000000..66326cb98b --- /dev/null +++ b/tests/cases/conformance/externalModules/typeOnly/preserveValueImports.ts @@ -0,0 +1,28 @@ +// @preserveValueImports: true +// @isolatedModules: true,false +// @module: esnext + +// @Filename: a.ts +export default {}; +export const b = 0; +export const c = 1; +export interface D {} + +// @Filename: b.ts +import a, { b, c, D } from "./a"; + +// @Filename: c.ts +import * as a from "./a"; + +// @Filename: d.ts +export = {}; + +// @Filename: e.ts +import D = require("./d"); +import DD = require("./d"); +DD; + +// @Filename: f.ts +import type a from "./a"; +import { b, c } from "./a"; +b; diff --git a/tests/cases/conformance/externalModules/typeOnly/preserveValueImports_errors.ts b/tests/cases/conformance/externalModules/typeOnly/preserveValueImports_errors.ts new file mode 100644 index 0000000000..fc2a3612e7 --- /dev/null +++ b/tests/cases/conformance/externalModules/typeOnly/preserveValueImports_errors.ts @@ -0,0 +1,47 @@ +// @preserveValueImports: true +// @isolatedModules: true,false +// @module: esnext + +// @Filename: a.ts +export type A = {}; +export type { A as default }; + +// @Filename: b.ts +class B {}; +export type { B, B as default }; + +// @Filename: c.ts +import DefaultA from "./a"; +import { A } from "./a"; +import DefaultB from "./b"; +import { B } from "./b"; + +// @Filename: c.fixed.ts +import type DefaultA from "./a"; +import type { A } from "./a"; +import type DefaultB from "./b"; +import type { B } from "./b"; + +// @Filename: d.ts +export { A as AA } from "./a"; +export { B as BB } from "./b"; + +// @Filename: d.fixed.ts +export type { A as AA } from "./a"; +export type { B as BB } from "./b"; + +// @Filename: e.ts +import { AA, BB } from "./d"; + +// @Filename: e.fixed.ts +import type { AA, BB } from "./d"; + +// @Filename: f.ts +import type { A } from "./a"; +import type { B } from "./b"; +export { A, B as BB }; + +// @Filename: f.fixed.ts +import type { A } from "./a"; +import type { B } from "./b"; +export type { A, B as BB }; diff --git a/tests/cases/conformance/externalModules/typeOnly/preserveValueImports_importsNotUsedAsValues.ts b/tests/cases/conformance/externalModules/typeOnly/preserveValueImports_importsNotUsedAsValues.ts new file mode 100644 index 0000000000..4797a30727 --- /dev/null +++ b/tests/cases/conformance/externalModules/typeOnly/preserveValueImports_importsNotUsedAsValues.ts @@ -0,0 +1,14 @@ +// @preserveValueImports: true +// @importsNotUsedAsValues: preserve +// @module: esnext + +// @Filename: /mod.ts +export type A = unknown; +export type B = never; +export type C = any; + +// @Filename: /index.ts +import { type A, type B, type C } from "./mod.js"; + +// @Filename: /reexport.ts +export { type A, type B, type C } from "./mod.js"; diff --git a/tests/cases/conformance/externalModules/typeOnly/preserveValueImports_mixedImports.ts b/tests/cases/conformance/externalModules/typeOnly/preserveValueImports_mixedImports.ts new file mode 100644 index 0000000000..85cbae30f7 --- /dev/null +++ b/tests/cases/conformance/externalModules/typeOnly/preserveValueImports_mixedImports.ts @@ -0,0 +1,13 @@ +// @preserveValueImports: true +// @isolatedModules: true +// @module: es2015 + +// @Filename: /exports.ts +export function Component() {} +export interface ComponentProps {} + +// @Filename: /index.ts +import { Component, ComponentProps } from "./exports.js"; + +// @Filename: /index.fixed.ts +import { Component, type ComponentProps } from "./exports.js"; diff --git a/tests/cases/conformance/externalModules/typeOnly/preserveValueImports_module.ts b/tests/cases/conformance/externalModules/typeOnly/preserveValueImports_module.ts new file mode 100644 index 0000000000..27f78f707c --- /dev/null +++ b/tests/cases/conformance/externalModules/typeOnly/preserveValueImports_module.ts @@ -0,0 +1,4 @@ +// @preserveValueImports: true +// @module: amd,system,commonjs,es2015 +// @noTypesAndSymbols: true +export {}; diff --git a/tests/cases/conformance/importAssertion/importAssertion1.ts b/tests/cases/conformance/importAssertion/importAssertion1.ts new file mode 100644 index 0000000000..b547158cf1 --- /dev/null +++ b/tests/cases/conformance/importAssertion/importAssertion1.ts @@ -0,0 +1,37 @@ +// @declaration: true +// @target: es2015 +// @module: es2015, commonjs, esnext + +// @filename: 0.ts +export const a = 1; +export const b = 2; + +// @filename: 1.ts +import './0' assert { type: "json" } +import { a, b } from './0' assert { "type": "json" } +import * as foo from './0' assert { type: "json" } +a; +b; +foo.a; +foo.b; + +// @filename: 2.ts +import { a, b } from './0' assert {} +import { a as c, b as d } from './0' assert { a: "a", b: "b", c: "c" } +a; +b; +c; +d; + +// @filename: 3.ts +const a = import('./0') +const b = import('./0', { assert: { type: "json" } }) +const c = import('./0', { assert: { type: "json", ttype: "typo" } }) +const d = import('./0', { assert: {} }) +const dd = import('./0', {}) +declare function foo(): any; +const e = import('./0', foo()) +const f = import() +const g = import('./0', {}, {}) +const h = import('./0', { assert: { type: "json" }},) + diff --git a/tests/cases/conformance/importAssertion/importAssertion2.ts b/tests/cases/conformance/importAssertion/importAssertion2.ts new file mode 100644 index 0000000000..42a26af43e --- /dev/null +++ b/tests/cases/conformance/importAssertion/importAssertion2.ts @@ -0,0 +1,17 @@ +// @declaration: true +// @target: es2015 +// @module: es2015, commonjs, esnext + +// @filename: 0.ts +export const a = 1; +export const b = 2; + +// @filename: 1.ts +export {} from './0' assert { type: "json" } +export { a, b } from './0' assert { type: "json" } +export * from './0' assert { type: "json" } +export * as ns from './0' assert { type: "json" } + +// @filename: 2.ts +export { a, b } from './0' assert {} +export { a as c, b as d } from './0' assert { a: "a", b: "b", c: "c" } diff --git a/tests/cases/conformance/importAssertion/importAssertion3.ts b/tests/cases/conformance/importAssertion/importAssertion3.ts new file mode 100644 index 0000000000..28479378b1 --- /dev/null +++ b/tests/cases/conformance/importAssertion/importAssertion3.ts @@ -0,0 +1,15 @@ +// @declaration: true +// @target: es2015 +// @module: es2015, esnext + +// @filename: 0.ts +export interface I { } + +// @filename: 1.ts +export type {} from './0' assert { type: "json" } +export type { I } from './0' assert { type: "json" } + +// @filename: 2.ts +import type { I } from './0' assert { type: "json" } +import type * as foo from './0' assert { type: "json" } + diff --git a/tests/cases/conformance/importAssertion/importAssertion4.ts b/tests/cases/conformance/importAssertion/importAssertion4.ts new file mode 100644 index 0000000000..242d7dd375 --- /dev/null +++ b/tests/cases/conformance/importAssertion/importAssertion4.ts @@ -0,0 +1 @@ +import * as f from "./first" assert diff --git a/tests/cases/conformance/importAssertion/importAssertion5.ts b/tests/cases/conformance/importAssertion/importAssertion5.ts new file mode 100644 index 0000000000..ef09d84e66 --- /dev/null +++ b/tests/cases/conformance/importAssertion/importAssertion5.ts @@ -0,0 +1 @@ +import * as f from "./first" assert { diff --git a/tests/cases/conformance/interfaces/declarationMerging/mergedInterfacesWithMultipleBases3.ts b/tests/cases/conformance/interfaces/declarationMerging/mergedInterfacesWithMultipleBases3.ts index e3d076707b..8b95f5e240 100644 --- a/tests/cases/conformance/interfaces/declarationMerging/mergedInterfacesWithMultipleBases3.ts +++ b/tests/cases/conformance/interfaces/declarationMerging/mergedInterfacesWithMultipleBases3.ts @@ -32,4 +32,8 @@ class D implements A<boolean> { d: string; y: boolean; z: boolean; -} \ No newline at end of file +} +let ww1 = new C(); +let ww2 = new C2(); +let ww3 = new C3(); +let ww4 = new C4(); diff --git a/tests/cases/conformance/interfaces/interfaceDeclarations/interfaceExtendsObjectIntersection.ts b/tests/cases/conformance/interfaces/interfaceDeclarations/interfaceExtendsObjectIntersection.ts index 003976a2b2..1ab2942311 100644 --- a/tests/cases/conformance/interfaces/interfaceDeclarations/interfaceExtendsObjectIntersection.ts +++ b/tests/cases/conformance/interfaces/interfaceDeclarations/interfaceExtendsObjectIntersection.ts @@ -53,3 +53,15 @@ class C20 extends Constructor<Partial<T1>>() { x: string } class C21 extends Constructor<Readonly<T1>>() { x: string } class C22 extends Constructor<Identifiable<T1>>() { x: string } class C23 extends Constructor<Identifiable<T1 & { b: number}>>() { x: string } +let c1 = new C1(); +let c2 = new C2(); +let c3 = new C3(); +let c4 = new C4(); +let c5 = new C5(); +let c6 = new C6(); +let c7 = new C7(); +let cx = new CX(); +let c20 = new C20(); +let c21 = new C21(); +let c22 = new C22(); +let c23 = new C23(); \ No newline at end of file diff --git a/tests/cases/conformance/interfaces/interfaceDeclarations/interfaceWithPropertyOfEveryType.ts b/tests/cases/conformance/interfaces/interfaceDeclarations/interfaceWithPropertyOfEveryType.ts index 6979b40579..20d877f7a2 100644 --- a/tests/cases/conformance/interfaces/interfaceDeclarations/interfaceWithPropertyOfEveryType.ts +++ b/tests/cases/conformance/interfaces/interfaceDeclarations/interfaceWithPropertyOfEveryType.ts @@ -39,4 +39,5 @@ var a: Foo = { m: M, n: {}, o: E.A -} \ No newline at end of file +} +let cc = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/internalModules/DeclarationMerging/AmbientModuleAndAmbientWithSameNameAndCommonRoot.ts b/tests/cases/conformance/internalModules/DeclarationMerging/AmbientModuleAndAmbientWithSameNameAndCommonRoot.ts index 12f51f90a7..e1af2f0ac6 100644 --- a/tests/cases/conformance/internalModules/DeclarationMerging/AmbientModuleAndAmbientWithSameNameAndCommonRoot.ts +++ b/tests/cases/conformance/internalModules/DeclarationMerging/AmbientModuleAndAmbientWithSameNameAndCommonRoot.ts @@ -21,4 +21,3 @@ declare module A { var p: { x: number; y: number; } var p = A.Point.Origin; var p = new A.Point(0, 0); // unexpected error here, bug 840000 - \ No newline at end of file diff --git a/tests/cases/conformance/internalModules/DeclarationMerging/AmbientModuleAndNonAmbientClassWithSameNameAndCommonRoot.ts b/tests/cases/conformance/internalModules/DeclarationMerging/AmbientModuleAndNonAmbientClassWithSameNameAndCommonRoot.ts index e923f1f002..b9bb58e89e 100644 --- a/tests/cases/conformance/internalModules/DeclarationMerging/AmbientModuleAndNonAmbientClassWithSameNameAndCommonRoot.ts +++ b/tests/cases/conformance/internalModules/DeclarationMerging/AmbientModuleAndNonAmbientClassWithSameNameAndCommonRoot.ts @@ -13,6 +13,7 @@ module A { export class Point { constructor(public x: number, public y: number) { } } + let pp = new Point(1,1); } // @filename: test.ts diff --git a/tests/cases/conformance/internalModules/DeclarationMerging/ClassAndModuleThatMergeWithStaticFunctionAndNonExportedFunctionThatShareAName.ts b/tests/cases/conformance/internalModules/DeclarationMerging/ClassAndModuleThatMergeWithStaticFunctionAndNonExportedFunctionThatShareAName.ts index d285d9b422..9dca12bc2e 100644 --- a/tests/cases/conformance/internalModules/DeclarationMerging/ClassAndModuleThatMergeWithStaticFunctionAndNonExportedFunctionThatShareAName.ts +++ b/tests/cases/conformance/internalModules/DeclarationMerging/ClassAndModuleThatMergeWithStaticFunctionAndNonExportedFunctionThatShareAName.ts @@ -19,4 +19,6 @@ module A { export module Point { function Origin() { return ""; }// not an error since not exported } -} \ No newline at end of file + let pp = new Point(1,1); +} +let pp1 = new Point(1,1); \ No newline at end of file diff --git a/tests/cases/conformance/internalModules/DeclarationMerging/TwoInternalModulesThatMergeEachWithExportedAndNonExportedClassesOfTheSameName.ts b/tests/cases/conformance/internalModules/DeclarationMerging/TwoInternalModulesThatMergeEachWithExportedAndNonExportedClassesOfTheSameName.ts index 7d88bf6292..71433fbef5 100644 --- a/tests/cases/conformance/internalModules/DeclarationMerging/TwoInternalModulesThatMergeEachWithExportedAndNonExportedClassesOfTheSameName.ts +++ b/tests/cases/conformance/internalModules/DeclarationMerging/TwoInternalModulesThatMergeEachWithExportedAndNonExportedClassesOfTheSameName.ts @@ -3,6 +3,7 @@ module A { x: number; y: number; } + let pp = new Point(); } module A { @@ -11,6 +12,7 @@ module A { return { x: p.x, y: p.y }; } } + let pp1 = new Point(); } // ensure merges as expected @@ -21,6 +23,7 @@ module X.Y.Z { export class Line { length: number; } + let ll = new Line(); } module X { @@ -29,6 +32,7 @@ module X { class Line { name: string; } + let ll1 = new Line() } } } diff --git a/tests/cases/conformance/internalModules/DeclarationMerging/TwoInternalModulesThatMergeEachWithExportedModulesOfTheSameName.ts b/tests/cases/conformance/internalModules/DeclarationMerging/TwoInternalModulesThatMergeEachWithExportedModulesOfTheSameName.ts index 449e6e76a2..a0c9072675 100644 --- a/tests/cases/conformance/internalModules/DeclarationMerging/TwoInternalModulesThatMergeEachWithExportedModulesOfTheSameName.ts +++ b/tests/cases/conformance/internalModules/DeclarationMerging/TwoInternalModulesThatMergeEachWithExportedModulesOfTheSameName.ts @@ -16,6 +16,7 @@ module X.Y.Z { export class Line { length: number; } + let ll = new Line(); } module X { @@ -24,6 +25,7 @@ module X { export class Line { name: string; } + let ll1 = new Line(); } } } diff --git a/tests/cases/conformance/internalModules/codeGeneration/exportCodeGen.ts b/tests/cases/conformance/internalModules/codeGeneration/exportCodeGen.ts index 02398acbbb..321d84cd56 100644 --- a/tests/cases/conformance/internalModules/codeGeneration/exportCodeGen.ts +++ b/tests/cases/conformance/internalModules/codeGeneration/exportCodeGen.ts @@ -39,6 +39,7 @@ module E { export module M { export var x = 42; } + let c1 = new C(); } // validate all exportable statements, @@ -51,4 +52,5 @@ module F { module M { var x = 42; } + let c2 = new C(); } \ No newline at end of file diff --git a/tests/cases/conformance/internalModules/codeGeneration/nameCollision.ts b/tests/cases/conformance/internalModules/codeGeneration/nameCollision.ts index aef48103cd..14d12af759 100644 --- a/tests/cases/conformance/internalModules/codeGeneration/nameCollision.ts +++ b/tests/cases/conformance/internalModules/codeGeneration/nameCollision.ts @@ -15,6 +15,7 @@ module B { class B { name: string; } + let bb = new B(); } module X { diff --git a/tests/cases/conformance/jsdoc/constructorTagOnClassConstructor.ts b/tests/cases/conformance/jsdoc/constructorTagOnClassConstructor.ts index 6d2f3780ee..72a97ff055 100644 --- a/tests/cases/conformance/jsdoc/constructorTagOnClassConstructor.ts +++ b/tests/cases/conformance/jsdoc/constructorTagOnClassConstructor.ts @@ -11,4 +11,6 @@ export class Beta { } } -const arr = [Alpha, Beta]; +// const arr = [Alpha, Beta]; +let aa = new Alpha(); +let be = new Beta(); \ No newline at end of file diff --git a/tests/cases/conformance/jsdoc/declarations/jsDeclarationsSubclassWithExplicitNoArgumentConstructor.ts b/tests/cases/conformance/jsdoc/declarations/jsDeclarationsSubclassWithExplicitNoArgumentConstructor.ts index eb609720d7..b0bf85be74 100644 --- a/tests/cases/conformance/jsdoc/declarations/jsDeclarationsSubclassWithExplicitNoArgumentConstructor.ts +++ b/tests/cases/conformance/jsdoc/declarations/jsDeclarationsSubclassWithExplicitNoArgumentConstructor.ts @@ -16,4 +16,5 @@ export class Sub extends Super { constructor() { super('first', 'second'); } -} \ No newline at end of file +} +let ss = new Sub(); \ No newline at end of file diff --git a/tests/cases/conformance/jsdoc/declarations/jsDeclarationsThisTypes.ts b/tests/cases/conformance/jsdoc/declarations/jsDeclarationsThisTypes.ts index bc2eae7dac..29ba837ef9 100644 --- a/tests/cases/conformance/jsdoc/declarations/jsDeclarationsThisTypes.ts +++ b/tests/cases/conformance/jsdoc/declarations/jsDeclarationsThisTypes.ts @@ -14,4 +14,6 @@ export class A { export default class Base extends A { // This method is required to reproduce #35932 verify() { } -} \ No newline at end of file +} + +let b = new Base(); \ No newline at end of file diff --git a/tests/cases/conformance/jsdoc/enumTagImported/enumTagImported.ts b/tests/cases/conformance/jsdoc/enumTagImported/enumTagImported.ts new file mode 100644 index 0000000000..859c60103b --- /dev/null +++ b/tests/cases/conformance/jsdoc/enumTagImported/enumTagImported.ts @@ -0,0 +1,23 @@ +// @allowJs: true +// @checkJs: true +// @noEmit: true +// @Filename: type.js +/** @typedef {import("./mod1").TestEnum} TE */ +/** @type {TE} */ +const test = 'add' +/** @type {import("./mod1").TestEnum} */ +const tost = 'remove' + +// @Filename: value.js +import { TestEnum } from "./mod1" +/** @type {TestEnum} */ +const tist = TestEnum.ADD + + +// @Filename: mod1.js + +/** @enum {string} */ +// export const TestEnum = { +// ADD: 'add', +// REMOVE: 'remove' +// } diff --git a/tests/cases/conformance/jsdoc/extendsTag1.ts b/tests/cases/conformance/jsdoc/extendsTag1.ts index 194982760e..79b3bc7079 100644 --- a/tests/cases/conformance/jsdoc/extendsTag1.ts +++ b/tests/cases/conformance/jsdoc/extendsTag1.ts @@ -8,3 +8,4 @@ * @extends {Set<T>} Should prefer this Set<T>, not the Set in the heritage clause */ class My extends Set {} +let q4 = new My(); diff --git a/tests/cases/conformance/jsdoc/jsdocAugments_qualifiedName/jsdocAugments_qualifiedName.ts b/tests/cases/conformance/jsdoc/jsdocAugments_qualifiedName/jsdocAugments_qualifiedName.ts new file mode 100644 index 0000000000..ce4fb95ff2 --- /dev/null +++ b/tests/cases/conformance/jsdoc/jsdocAugments_qualifiedName/jsdocAugments_qualifiedName.ts @@ -0,0 +1,10 @@ +// @allowJs: true +// @checkJs: true +// @noEmit: true + + +// @Filename: /b.js +import * as a from "./a"; +let b = a.A; +/** @augments a.A */ +class B {} diff --git a/tests/cases/conformance/jsdoc/jsdocAugments_withTypeParameter.ts b/tests/cases/conformance/jsdoc/jsdocAugments_withTypeParameter.ts index e94df03fbc..aba2b989e7 100644 --- a/tests/cases/conformance/jsdoc/jsdocAugments_withTypeParameter.ts +++ b/tests/cases/conformance/jsdoc/jsdocAugments_withTypeParameter.ts @@ -12,3 +12,4 @@ class B extends A { return this.x; } } +let q7 = new B(); \ No newline at end of file diff --git a/tests/cases/conformance/jsdoc/jsdocImplements_namespacedInterface.ts b/tests/cases/conformance/jsdoc/jsdocImplements_namespacedInterface.ts index c298e6685a..9af8207ba4 100644 --- a/tests/cases/conformance/jsdoc/jsdocImplements_namespacedInterface.ts +++ b/tests/cases/conformance/jsdoc/jsdocImplements_namespacedInterface.ts @@ -26,3 +26,5 @@ class BAT { return ""; } } +let q1 = new B(); +let q2 = new BAT(); diff --git a/tests/cases/conformance/jsdoc/jsdocTemplateTagDefault.ts b/tests/cases/conformance/jsdoc/jsdocTemplateTagDefault.ts new file mode 100644 index 0000000000..c93359a7a6 --- /dev/null +++ b/tests/cases/conformance/jsdoc/jsdocTemplateTagDefault.ts @@ -0,0 +1,71 @@ +// @allowJs: true +// @checkJs: true +// @declaration: true +// @outDir: out +// @Filename: file.js + +/** + * @template {string | number} [T=string] - ok: defaults are permitted + * @typedef {[T]} A + */ + +/** @type {A} */ // ok, default for `T` in `A` is `string` +const aDefault1 = [""]; +/** @type {A} */ // error: `number` is not assignable to string` +const aDefault2 = [0]; +/** @type {A<string>} */ // ok, `T` is provided for `A` +const aString = [""]; +/** @type {A<number>} */ // ok, `T` is provided for `A` +const aNumber = [0]; + +/** + * @template T + * @template [U=T] - ok: default can reference earlier type parameter + * @typedef {[T, U]} B + */ + +/** + * @template {string | number} [T] - error: default requires an `=type` + * @typedef {[T]} C + */ + +/** + * @template {string | number} [T=] - error: default requires a `type` + * @typedef {[T]} D + */ + +/** + * @template {string | number} [T=string] + * @template U - error: Required type parameters cannot follow optional type parameters + * @typedef {[T, U]} E + */ + +/** + * @template [T=U] - error: Type parameter defaults can only reference previously declared type parameters. + * @template [U=T] + * @typedef {[T, U]} G + */ + +/** + * @template T + * @template [U=T] - ok: default can reference earlier type parameter + * @param {T} a + * @param {U} b + */ +function f1(a, b) {} + + /** + * @template {string | number} [T=string] + * @template U - error: Required type parameters cannot follow optional type parameters + * @param {T} a + * @param {U} b + */ +function f2(a, b) {} + +/** + * @template [T=U] - error: Type parameter defaults can only reference previously declared type parameters. + * @template [U=T] + * @param {T} a + * @param {U} b + */ +function f3(a, b) {} diff --git a/tests/cases/conformance/jsdoc/jsdocTemplateTagNameResolution.ts b/tests/cases/conformance/jsdoc/jsdocTemplateTagNameResolution.ts new file mode 100644 index 0000000000..a5b4d052ad --- /dev/null +++ b/tests/cases/conformance/jsdoc/jsdocTemplateTagNameResolution.ts @@ -0,0 +1,16 @@ +// @allowJs: true +// @checkJs: true +// @outDir: out +// @declaration: true +// @Filename: file.js + +/** + * @template T + * @template {keyof T} K + * @typedef {T[K]} Foo + */ + +const x = { a: 1 }; + +/** @type {Foo<typeof x, "a">} */ +const y = "a"; \ No newline at end of file diff --git a/tests/cases/conformance/jsdoc/jsdocTypeReferenceUseBeforeDef.ts b/tests/cases/conformance/jsdoc/jsdocTypeReferenceUseBeforeDef.ts index 93e735e1fa..b38836e7e7 100644 --- a/tests/cases/conformance/jsdoc/jsdocTypeReferenceUseBeforeDef.ts +++ b/tests/cases/conformance/jsdoc/jsdocTypeReferenceUseBeforeDef.ts @@ -6,3 +6,4 @@ const c = null class C { } +let q3 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/jsdoc/jsdocVariadicType.ts b/tests/cases/conformance/jsdoc/jsdocVariadicType.ts new file mode 100644 index 0000000000..cd4e75a54a --- /dev/null +++ b/tests/cases/conformance/jsdoc/jsdocVariadicType.ts @@ -0,0 +1,12 @@ +// @allowJS: true +// @checkJs: true +// @noEmit: true + +// @filename: a.js +/** + * @type {function(boolean, string, ...*):void} + */ +const foo = function (a, b, ...r) { }; + +// @filename: b.ts +foo(false, ''); diff --git a/tests/cases/conformance/jsdoc/seeTag3.ts b/tests/cases/conformance/jsdoc/seeTag3.ts new file mode 100644 index 0000000000..abd16226fe --- /dev/null +++ b/tests/cases/conformance/jsdoc/seeTag3.ts @@ -0,0 +1,7 @@ +// @outdir: out/ +// @checkJs: true +// @filename: seeTag3.js + +/** @see [The typescript web site](https://typescriptlang.org) */ +function theWholeThing() { +} diff --git a/tests/cases/conformance/jsdoc/thisTag2.ts b/tests/cases/conformance/jsdoc/thisTag2.ts new file mode 100644 index 0000000000..187ac9b932 --- /dev/null +++ b/tests/cases/conformance/jsdoc/thisTag2.ts @@ -0,0 +1,11 @@ +// @target: esnext +// @allowJs: true +// @declaration: true +// @emitDeclarationOnly: true +// @filename: a.js + +/** @this {string} */ +export function f1() {} + +/** @this */ +export function f2() {} diff --git a/tests/cases/conformance/jsx/jsxParsingError4.tsx b/tests/cases/conformance/jsx/jsxParsingError4.tsx new file mode 100644 index 0000000000..c4db4fe7ab --- /dev/null +++ b/tests/cases/conformance/jsx/jsxParsingError4.tsx @@ -0,0 +1,18 @@ +// @strict: true, false +// @jsx: react +// @filename: a.tsx + +declare const React: any +declare namespace JSX { + interface IntrinsicElements { + [k: string]: any + } +} + +const a = ( + <public-foo></public-foo> +); + +const b = ( + <public></public> +); diff --git a/tests/cases/conformance/jsx/jsxUnclosedParserRecovery.ts b/tests/cases/conformance/jsx/jsxUnclosedParserRecovery.ts new file mode 100644 index 0000000000..08b6149d37 --- /dev/null +++ b/tests/cases/conformance/jsx/jsxUnclosedParserRecovery.ts @@ -0,0 +1,140 @@ +// @Filename: jsxParserRecovery.tsx +// @jsx: preserve + +// should have no errors here; all these functions should parse and resolve +noName(); noClose(); noCloseTypeArg(); noCloseAttrs(); noCloseTypeArgAttrs(); noCloseBracket(); noCloseBracketTypeArgAttrs(); noSelfclose(); noSelfcloseTypeArgAttrs(); +noNameTrailingTag(); noCloseTrailingTag(); noCloseTypeArgTrailingTag(); noCloseAttrsTrailingTag(); noCloseTypeArgAttrsTrailingTag(); noCloseBracketTrailingTag(); noCloseBracketTypeArgAttrsTrailingTag(); // noSelfcloseTrailingTag(); noSelfcloseTypeArgAttrsTrailingTag(); +noNameTrailingText(); noCloseTrailingText(); noCloseTypeArgTrailingText(); noCloseAttrsTrailingText(); noCloseTypeArgAttrsTrailingText(); noCloseBracketTrailingText(); noCloseBracketTypeArgAttrsTrailingText(); // noSelfcloseTrailingText(); noSelfcloseTypeArgAttrsTrailingText(); + +function diddy() { + return null; +} + +var donkey = <div> + < +</div>; +function noName() { } +var donkey = <div> + <diddy +</div>; +function noClose() { } +var donkey = <div> + <diddy<boolean> +</div>; +function noCloseTypeArg() { } +var donkey = <div> + <diddy bananas="please" +</div>; +function noCloseAttrs() { } +var donkey = <div> + <diddy<boolean> bananas="please" +</div>; +function noCloseTypeArgAttrs() { } +var donkey = <div> + <diddy/ +</div>; +function noCloseBracket() { } +var donkey = <div> + <diddy<boolean> bananas="please"/ +</div>; +function noCloseBracketTypeArgAttrs() { } +var donkey = <div> + <diddy> +</div>; +function noSelfclose() { } +var donkey = <div> + <diddy<boolean> bananas="please"> +</div>; +function noSelfcloseTypeArgAttrs() { } + +var donkey = <div> + < + <diddy/> +</div>; +function noNameTrailingTag() { } +var donkey = <div> + <diddy + <diddy/> +</div>; +function noCloseTrailingTag() { } +var donkey = <div> + <diddy<boolean> + <diddy/> +</div>; +function noCloseTypeArgTrailingTag() { } +var donkey = <div> + <diddy bananas="please" + <diddy/> +</div>; +function noCloseAttrsTrailingTag() { } +var donkey = <div> + <diddy<boolean> bananas="please" + <diddy/> +</div>; +function noCloseTypeArgAttrsTrailingTag() { } +var donkey = <div> + <diddy/ + <diddy/> +</div>; +function noCloseBracketTrailingTag() { } +var donkey = <div> + <diddy<boolean> bananas="please"/ + <diddy/> +</div>; +function noCloseBracketTypeArgAttrsTrailingTag() { } +var donkey = <div> + <diddy> + <diddy/> +</div>; +function noSelfcloseTrailingTag() { } +var donkey = <div> + <diddy<boolean> bananas="please"> + <diddy/> +</div>; +function noSelfcloseTypeArgAttrsTrailingTag() { } + +var donkey = <div> + < + Cranky Wrinkly Funky +</div>; +function noNameTrailingText() { } +var donkey = <div> + <diddy + Cranky Wrinkly Funky +</div>; +function noCloseTrailingText() { } +var donkey = <div> + <diddy<boolean> + Cranky Wrinkly Funky +</div>; +function noCloseTypeArgTrailingText() { } +var donkey = <div> + <diddy bananas="please" + Cranky Wrinkly Funky +</div>; +function noCloseAttrsTrailingText() { } +var donkey = <div> + <diddy<boolean> bananas="please" + Cranky Wrinkly Funky +</div>; +function noCloseTypeArgAttrsTrailingText() { } +var donkey = <div> + <diddy/ + Cranky Wrinkly Funky +</div>; +function noCloseBracketTrailingText() { } +var donkey = <div> + <diddy<boolean> bananas="please"/ + Cranky Wrinkly Funky +</div>; +function noCloseBracketTypeArgAttrsTrailingText() { } +var donkey = <div> + <diddy> + Cranky Wrinkly Funky +</div>; +function noSelfcloseTrailingText() { } +var donkey = <div> + <diddy<boolean> bananas="please"> + Cranky Wrinkly Funky +</div>; +function noSelfcloseTypeArgAttrsTrailingText() { } diff --git a/tests/cases/conformance/jsx/tsxReactEmitSpreadAttribute.ts b/tests/cases/conformance/jsx/tsxReactEmitSpreadAttribute.ts new file mode 100644 index 0000000000..2ddc20ae39 --- /dev/null +++ b/tests/cases/conformance/jsx/tsxReactEmitSpreadAttribute.ts @@ -0,0 +1,32 @@ +// @jsx: react-jsx +// @target: es2015,es2018,esnext +// @filename: test.tsx +/// <reference path="/.lib/react16.d.ts" /> + +export function T1(a: any) { + return <div className={"T1"} { ...a }>T1</div>; +} + +export function T2(a: any, b: any) { + return <div className={"T2"} { ...a } { ...b }>T2</div>; +} + +export function T3(a: any, b: any) { + return <div { ...a } className={"T3"} { ...b }>T3</div>; +} + +export function T4(a: any, b: any) { + return <div className={"T4"} { ...{ ...a, ...b } }>T4</div>; +} + +export function T5(a: any, b: any, c: any, d: any) { + return <div className={"T5"} { ...{ ...a, ...b, ...{ c, d } } }>T5</div>; +} + +export function T6(a: any, b: any, c: any, d: any) { + return <div className={"T6"} { ...{ ...a, ...b, ...{ ...c, ...d } } }>T6</div>; +} + +export function T7(a: any, b: any, c: any, d: any) { + return <div>T7</div>; +} diff --git a/tests/cases/conformance/moduleResolution/declarationNotFoundPackageBundlesTypes.ts b/tests/cases/conformance/moduleResolution/declarationNotFoundPackageBundlesTypes.ts new file mode 100644 index 0000000000..75c681daf0 --- /dev/null +++ b/tests/cases/conformance/moduleResolution/declarationNotFoundPackageBundlesTypes.ts @@ -0,0 +1,23 @@ +// @noImplicitAny: true +// @noImplicitReferences: true + +// @filename: node_modules/foo/package.json +{ + "name": "foo", + "version": "1.0.0" +} + +// @filename: node_modules/foo/index.js +var foo = 0; +module.exports = foo; + +// @filename: node_modules/foo/index.d.ts +declare const foo: any; +export = foo; + +// @filename: node_modules/foo/other.js +module.exports = {}; + +// @filename: index.ts +import * as Foo from "foo"; +import * as Other from "foo/other"/*1*/; \ No newline at end of file diff --git a/tests/cases/conformance/moduleResolution/scopedPackages/index.d.ts b/tests/cases/conformance/moduleResolution/scopedPackages/index.d.ts new file mode 100644 index 0000000000..04d4f15421 --- /dev/null +++ b/tests/cases/conformance/moduleResolution/scopedPackages/index.d.ts @@ -0,0 +1,3 @@ +// @filename: /node_modules/@cow/boy/index.d.ts +export const x: number; +export const y: number; \ No newline at end of file diff --git a/tests/cases/conformance/moduleResolution/scopedPackages/scopedPackages.ts b/tests/cases/conformance/moduleResolution/scopedPackages/scopedPackages.ts new file mode 100644 index 0000000000..80db9778d1 --- /dev/null +++ b/tests/cases/conformance/moduleResolution/scopedPackages/scopedPackages.ts @@ -0,0 +1,12 @@ +// @noImplicitReferences: true +// @traceResolution: true +// @typeRoots: types + + +// @filename: /a.ts +import { x } from "./index"; +import { y } from "./index"; +import { z } from "./z"; +x; +y; +z; \ No newline at end of file diff --git a/tests/cases/conformance/moduleResolution/scopedPackages/z.d.ts b/tests/cases/conformance/moduleResolution/scopedPackages/z.d.ts new file mode 100644 index 0000000000..8af8c4b248 --- /dev/null +++ b/tests/cases/conformance/moduleResolution/scopedPackages/z.d.ts @@ -0,0 +1,2 @@ +// @filename: /node_modules/@types/be__bop/e/z.d.ts +export const z: number; \ No newline at end of file diff --git a/tests/cases/conformance/moduleResolution/scopedPackagesClassic/index.d.ts b/tests/cases/conformance/moduleResolution/scopedPackagesClassic/index.d.ts new file mode 100644 index 0000000000..7cfe77597d --- /dev/null +++ b/tests/cases/conformance/moduleResolution/scopedPackagesClassic/index.d.ts @@ -0,0 +1,2 @@ +// @filename: /node_modules/@types/see__saw/index.d.ts +export const x = 0; diff --git a/tests/cases/conformance/moduleResolution/scopedPackagesClassic/scopedPackagesClassic.ts b/tests/cases/conformance/moduleResolution/scopedPackagesClassic/scopedPackagesClassic.ts new file mode 100644 index 0000000000..4f491b9532 --- /dev/null +++ b/tests/cases/conformance/moduleResolution/scopedPackagesClassic/scopedPackagesClassic.ts @@ -0,0 +1,9 @@ +// @noImplicitReferences: true +// @traceResolution: true +// @typeRoots: types +// @moduleResolution: classic + + +// @filename: /a.ts +import { x } from "./index"; +x; \ No newline at end of file diff --git a/tests/cases/conformance/moduleResolution/untypedModuleImport_allowJs/untypedModuleImport_allowJs.ts b/tests/cases/conformance/moduleResolution/untypedModuleImport_allowJs/untypedModuleImport_allowJs.ts new file mode 100644 index 0000000000..b2c0c1f81c --- /dev/null +++ b/tests/cases/conformance/moduleResolution/untypedModuleImport_allowJs/untypedModuleImport_allowJs.ts @@ -0,0 +1,12 @@ +// @noImplicitReferences: true +// @currentDirectory: / +// @allowJs: true +// @maxNodeModuleJsDepth: 1 +// Same as untypedModuleImport.ts but with --allowJs, so the package will actually be typed. + +// @filename: /node_modules/foo/index.js +// exports.default = { bar() { return 0; } } + +// @filename: /a.ts +import foo from "foo"; +foo.bar(); diff --git a/tests/cases/conformance/moduleResolution/untypedModuleImport_vsAmbient/declarations.d.ts b/tests/cases/conformance/moduleResolution/untypedModuleImport_vsAmbient/declarations.d.ts new file mode 100644 index 0000000000..c54d01514d --- /dev/null +++ b/tests/cases/conformance/moduleResolution/untypedModuleImport_vsAmbient/declarations.d.ts @@ -0,0 +1,4 @@ +// @filename: /declarations.d.ts +declare module "foo" { + export const x: number; +} diff --git a/tests/cases/conformance/moduleResolution/untypedModuleImport_vsAmbient/untypedModuleImport_vsAmbient.ts b/tests/cases/conformance/moduleResolution/untypedModuleImport_vsAmbient/untypedModuleImport_vsAmbient.ts new file mode 100644 index 0000000000..577d258b72 --- /dev/null +++ b/tests/cases/conformance/moduleResolution/untypedModuleImport_vsAmbient/untypedModuleImport_vsAmbient.ts @@ -0,0 +1,12 @@ +// @noImplicitReferences: true +// @currentDirectory: / +// This tests that an ambient module declaration overrides an untyped import. + +// @filename: /node_modules/foo/index.js +// This file is not processed. + + +// @filename: /a.ts +/// <reference path="./declarations.d.ts" /> +import { x } from "foo"; +x; diff --git a/tests/cases/conformance/node/allowJs/nodeAllowJsPackageSelfName.ts b/tests/cases/conformance/node/allowJs/nodeAllowJsPackageSelfName.ts new file mode 100644 index 0000000000..a19a7104ae --- /dev/null +++ b/tests/cases/conformance/node/allowJs/nodeAllowJsPackageSelfName.ts @@ -0,0 +1,24 @@ +// @module: node12,nodenext +// @declaration: true +// @allowJs: true +// @checkJs: true +// @outDir: out +// @filename: index.js +// esm format file +import * as self from "package"; +self; +// @filename: index.mjs +// esm format file +import * as self from "package"; +self; +// @filename: index.cjs +// esm format file +import * as self from "package"; +self; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module", + "exports": "./index.js" +} \ No newline at end of file diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJs1.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJs1.ts new file mode 100644 index 0000000000..113c1fdeb8 --- /dev/null +++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJs1.ts @@ -0,0 +1,324 @@ +// @module: node12,nodenext +// @declaration: true +// @allowJs: true +// @checkJs: true +// @outDir: out +// @filename: subfolder/index.js +// cjs format file +const x = 1; +export {x}; +// @filename: subfolder/index.cjs +// cjs format file +const x = 1; +export {x}; +// @filename: subfolder/index.mjs +// esm format file +const x = 1; +export {x}; +// @filename: subfolder2/index.js +// cjs format file +const x = 1; +export {x}; +// @filename: subfolder2/index.cjs +// cjs format file +const x = 1; +export {x}; +// @filename: subfolder2/index.mjs +// esm format file +const x = 1; +export {x}; +// @filename: subfolder2/another/index.js +// esm format file +const x = 1; +export {x}; +// @filename: subfolder2/another/index.cjs +// cjs format file +const x = 1; +export {x}; +// @filename: subfolder2/another/index.mjs +// esm format file +const x = 1; +export {x}; +// @filename: index.js +import * as m1 from "./index.js"; +import * as m2 from "./index.mjs"; +import * as m3 from "./index.cjs"; +import * as m4 from "./subfolder/index.js"; +import * as m5 from "./subfolder/index.mjs"; +import * as m6 from "./subfolder/index.cjs"; +import * as m7 from "./subfolder2/index.js"; +import * as m8 from "./subfolder2/index.mjs"; +import * as m9 from "./subfolder2/index.cjs"; +import * as m10 from "./subfolder2/another/index.js"; +import * as m11 from "./subfolder2/another/index.mjs"; +import * as m12 from "./subfolder2/another/index.cjs"; +// The next ones shouldn't all work - esm format files have no index resolution or extension resolution +import * as m13 from "./"; +import * as m14 from "./index"; +import * as m15 from "./subfolder"; +import * as m16 from "./subfolder/"; +import * as m17 from "./subfolder/index"; +import * as m18 from "./subfolder2"; +import * as m19 from "./subfolder2/"; +import * as m20 from "./subfolder2/index"; +import * as m21 from "./subfolder2/another"; +import * as m22 from "./subfolder2/another/"; +import * as m23 from "./subfolder2/another/index"; +void m1; +void m2; +void m3; +void m4; +void m5; +void m6; +void m7; +void m8; +void m9; +void m10; +void m11; +void m12; +void m13; +void m14; +void m15; +void m16; +void m17; +void m18; +void m19; +void m20; +void m21; +void m22; +void m23; + +// These should _mostly_ work - `import = require` always desugars to require calls, which do have extension and index resolution (but can't load anything that resolves to esm!) +import m24 = require("./"); +import m25 = require("./index"); +import m26 = require("./subfolder"); +import m27 = require("./subfolder/"); +import m28 = require("./subfolder/index"); +import m29 = require("./subfolder2"); +import m30 = require("./subfolder2/"); +import m31 = require("./subfolder2/index"); +import m32 = require("./subfolder2/another"); +import m33 = require("./subfolder2/another/"); +import m34 = require("./subfolder2/another/index"); +void m24; +void m25; +void m26; +void m27; +void m28; +void m29; +void m30; +void m31; +void m32; +void m33; +void m34; + +// These shouldn't work - dynamic `import()` always uses the esm resolver, which does not have extension resolution +const _m35 = import("./"); +const _m36 = import("./index"); +const _m37 = import("./subfolder"); +const _m38 = import("./subfolder/"); +const _m39 = import("./subfolder/index"); +const _m40 = import("./subfolder2"); +const _m41 = import("./subfolder2/"); +const _m42 = import("./subfolder2/index"); +const _m43 = import("./subfolder2/another"); +const _m44 = import("./subfolder2/another/"); +const _m45 = import("./subfolder2/another/index"); +// esm format file +const x = 1; +export {x}; +// @filename: index.cjs +// ESM-format imports below should issue errors +import * as m1 from "./index.js"; +import * as m2 from "./index.mjs"; +import * as m3 from "./index.cjs"; +import * as m4 from "./subfolder/index.js"; +import * as m5 from "./subfolder/index.mjs"; +import * as m6 from "./subfolder/index.cjs"; +import * as m7 from "./subfolder2/index.js"; +import * as m8 from "./subfolder2/index.mjs"; +import * as m9 from "./subfolder2/index.cjs"; +import * as m10 from "./subfolder2/another/index.js"; +import * as m11 from "./subfolder2/another/index.mjs"; +import * as m12 from "./subfolder2/another/index.cjs"; +// The next ones should _mostly_ work - cjs format files have index resolution and extension resolution (except for those which resolve to an esm format file) +import * as m13 from "./"; +import * as m14 from "./index"; +import * as m15 from "./subfolder"; +import * as m16 from "./subfolder/"; +import * as m17 from "./subfolder/index"; +import * as m18 from "./subfolder2"; +import * as m19 from "./subfolder2/"; +import * as m20 from "./subfolder2/index"; +import * as m21 from "./subfolder2/another"; +import * as m22 from "./subfolder2/another/"; +import * as m23 from "./subfolder2/another/index"; +void m1; +void m2; +void m3; +void m4; +void m5; +void m6; +void m7; +void m8; +void m9; +void m10; +void m11; +void m12; +void m13; +void m14; +void m15; +void m16; +void m17; +void m18; +void m19; +void m20; +void m21; +void m22; +void m23; + +// These should _mostly_ work - `import = require` always desugars to require calls, which do have extension and index resolution (but can't load anything that resolves to esm!) +import m24 = require("./"); +import m25 = require("./index"); +import m26 = require("./subfolder"); +import m27 = require("./subfolder/"); +import m28 = require("./subfolder/index"); +import m29 = require("./subfolder2"); +import m30 = require("./subfolder2/"); +import m31 = require("./subfolder2/index"); +import m32 = require("./subfolder2/another"); +import m33 = require("./subfolder2/another/"); +import m34 = require("./subfolder2/another/index"); +void m24; +void m25; +void m26; +void m27; +void m28; +void m29; +void m30; +void m31; +void m32; +void m33; +void m34; + +// These shouldn't work - dynamic `import()` always uses the esm resolver, which does not have extension resolution +const _m35 = import("./"); +const _m36 = import("./index"); +const _m37 = import("./subfolder"); +const _m38 = import("./subfolder/"); +const _m39 = import("./subfolder/index"); +const _m40 = import("./subfolder2"); +const _m41 = import("./subfolder2/"); +const _m42 = import("./subfolder2/index"); +const _m43 = import("./subfolder2/another"); +const _m44 = import("./subfolder2/another/"); +const _m45 = import("./subfolder2/another/index"); +// cjs format file +const x = 1; +export {x}; +// @filename: index.mjs +import * as m1 from "./index.js"; +import * as m2 from "./index.mjs"; +import * as m3 from "./index.cjs"; +import * as m4 from "./subfolder/index.js"; +import * as m5 from "./subfolder/index.mjs"; +import * as m6 from "./subfolder/index.cjs"; +import * as m7 from "./subfolder2/index.js"; +import * as m8 from "./subfolder2/index.mjs"; +import * as m9 from "./subfolder2/index.cjs"; +import * as m10 from "./subfolder2/another/index.js"; +import * as m11 from "./subfolder2/another/index.mjs"; +import * as m12 from "./subfolder2/another/index.cjs"; +// The next ones should all fail - esm format files have no index resolution or extension resolution +import * as m13 from "./"; +import * as m14 from "./index"; +import * as m15 from "./subfolder"; +import * as m16 from "./subfolder/"; +import * as m17 from "./subfolder/index"; +import * as m18 from "./subfolder2"; +import * as m19 from "./subfolder2/"; +import * as m20 from "./subfolder2/index"; +import * as m21 from "./subfolder2/another"; +import * as m22 from "./subfolder2/another/"; +import * as m23 from "./subfolder2/another/index"; +void m1; +void m2; +void m3; +void m4; +void m5; +void m6; +void m7; +void m8; +void m9; +void m10; +void m11; +void m12; +void m13; +void m14; +void m15; +void m16; +void m17; +void m18; +void m19; +void m20; +void m21; +void m22; +void m23; + +// These should _mostly_ work - `import = require` always desugars to require calls, which do have extension and index resolution (but can't load anything that resolves to esm!) +import m24 = require("./"); +import m25 = require("./index"); +import m26 = require("./subfolder"); +import m27 = require("./subfolder/"); +import m28 = require("./subfolder/index"); +import m29 = require("./subfolder2"); +import m30 = require("./subfolder2/"); +import m31 = require("./subfolder2/index"); +import m32 = require("./subfolder2/another"); +import m33 = require("./subfolder2/another/"); +import m34 = require("./subfolder2/another/index"); +void m24; +void m25; +void m26; +void m27; +void m28; +void m29; +void m30; +void m31; +void m32; +void m33; +void m34; + +// These shouldn't work - dynamic `import()` always uses the esm resolver, which does not have extension resolution +const _m35 = import("./"); +const _m36 = import("./index"); +const _m37 = import("./subfolder"); +const _m38 = import("./subfolder/"); +const _m39 = import("./subfolder/index"); +const _m40 = import("./subfolder2"); +const _m41 = import("./subfolder2/"); +const _m42 = import("./subfolder2/index"); +const _m43 = import("./subfolder2/another"); +const _m44 = import("./subfolder2/another/"); +const _m45 = import("./subfolder2/another/index"); + +// esm format file +const x = 1; +export {x}; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module" +} +// @filename: subfolder/package.json +{ + "type": "commonjs" +} +// @filename: subfolder2/package.json +{ +} +// @filename: subfolder2/another/package.json +{ + "type": "module" +} \ No newline at end of file diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsCjsFromJs.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsCjsFromJs.ts new file mode 100644 index 0000000000..ea0821742f --- /dev/null +++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsCjsFromJs.ts @@ -0,0 +1,8 @@ +// @module: node12,nodenext +// @allowJs: true +// @noEmit: true +// @filename: foo.cjs +exports.foo = "foo" +// @filename: bar.ts +import foo from "./foo.cjs" +foo.foo; \ No newline at end of file diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsConditionalPackageExports.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsConditionalPackageExports.ts new file mode 100644 index 0000000000..1020812d5a --- /dev/null +++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsConditionalPackageExports.ts @@ -0,0 +1,126 @@ +// @module: node12,nodenext +// @declaration: true +// @allowJs: true +// @checkJs: true +// @outDir: out +// @filename: index.js +// esm format file +import * as cjs from "package/cjs"; +import * as mjs from "package/mjs"; +import * as type from "package"; +cjs; +mjs; +type; +import * as cjsi from "inner/a"; +import * as mjsi from "inner/b"; +import * as typei from "inner"; +import * as ts from "inner/types"; +cjsi.mjsSource; +mjsi.mjsSource; +typei.mjsSource; +ts.mjsSource; +// @filename: index.mjs +// esm format file +import * as cjs from "package/cjs"; +import * as mjs from "package/mjs"; +import * as type from "package"; +cjs; +mjs; +type; +import * as cjsi from "inner/a"; +import * as mjsi from "inner/b"; +import * as typei from "inner"; +import * as ts from "inner/types"; +cjsi.mjsSource; +mjsi.mjsSource; +typei.mjsSource; +ts.mjsSource; +// @filename: index.cjs +// cjs format file +import * as cjs from "package/cjs"; +import * as mjs from "package/mjs"; +import * as type from "package"; +cjs; +mjs; +type; +import * as cjsi from "inner/a"; +import * as mjsi from "inner/b"; +import * as typei from "inner"; +import * as ts from "inner/types"; +cjsi.cjsSource; +mjsi.cjsSource; +typei.implicitCjsSource; +ts.cjsSource; +// @filename: node_modules/inner/index.d.ts +// cjs format file +import * as cjs from "inner/a"; +import * as mjs from "inner/b"; +import * as type from "inner"; +import * as ts from "inner/types"; +export { cjs }; +export { mjs }; +export { type }; +export { ts }; +export const implicitCjsSource = true; +// @filename: node_modules/inner/index.d.mts +// esm format file +import * as cjs from "inner/a"; +import * as mjs from "inner/b"; +import * as type from "inner"; +import * as ts from "inner/types"; +export { cjs }; +export { mjs }; +export { type }; +export { ts }; +export const mjsSource = true; +// @filename: node_modules/inner/index.d.cts +// cjs format file +import * as cjs from "inner/a"; +import * as mjs from "inner/b"; +import * as type from "inner"; +import * as ts from "inner/types"; +export { cjs }; +export { mjs }; +export { type }; +export { ts }; +export const cjsSource = true; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module", + "exports": { + "./cjs": "./index.cjs", + "./mjs": "./index.mjs", + ".": "./index.js" + } +} +// @filename: node_modules/inner/package.json +{ + "name": "inner", + "private": true, + "exports": { + "./a": { + "require": "./index.cjs", + "node": "./index.mjs" + }, + "./b": { + "import": "./index.mjs", + "node": "./index.cjs" + }, + ".": { + "import": "./index.mjs", + "node": "./index.js" + }, + "./types": { + "types": { + "import": "./index.d.mts", + "require": "./index.d.cts", + }, + "node": { + "import": "./index.mjs", + "require": "./index.cjs" + } + } + } +} \ No newline at end of file diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsDynamicImport.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsDynamicImport.ts new file mode 100644 index 0000000000..d7032c648b --- /dev/null +++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsDynamicImport.ts @@ -0,0 +1,27 @@ +// @module: node12,nodenext +// @declaration: true +// @allowJs: true +// @checkJs: true +// @outDir: out +// @filename: subfolder/index.js +// cjs format file +export async function main() { + const { readFile } = await import("fs"); +} +// @filename: index.js +// esm format file +export async function main() { + const { readFile } = await import("fs"); +} +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module" +} +// @filename: subfolder/package.json +{ + "type": "commonjs" +} +// @filename: types.d.ts +declare module "fs"; \ No newline at end of file diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsExportAssignment.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsExportAssignment.ts new file mode 100644 index 0000000000..f7d5aaf822 --- /dev/null +++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsExportAssignment.ts @@ -0,0 +1,32 @@ +// @module: node12,nodenext +// @declaration: true +// @allowJs: true +// @checkJs: true +// @outDir: out +// @filename: subfolder/index.js +// cjs format file +const a = {}; +export = a; +// @filename: subfolder/file.js +// cjs format file +const a = {}; +module.exports = a; +// @filename: index.js +// esm format file +const a = {}; +export = a; +// @filename: file.js +// esm format file +import "fs"; +const a = {}; +module.exports = a; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module" +} +// @filename: subfolder/package.json +{ + "type": "commonjs" +} \ No newline at end of file diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsGeneratedNameCollisions.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsGeneratedNameCollisions.ts new file mode 100644 index 0000000000..14783731bf --- /dev/null +++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsGeneratedNameCollisions.ts @@ -0,0 +1,29 @@ +// @module: node12,nodenext +// @declaration: true +// @allowJs: true +// @checkJs: true +// @outDir: out +// @filename: subfolder/index.js +// cjs format file +function require() {} +const exports = {}; +class Object {} +export const __esModule = false; +export {require, exports, Object}; +// @filename: index.js +// esm format file +function require() {} +const exports = {}; +class Object {} +export const __esModule = false; +export {require, exports, Object}; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module" +} +// @filename: subfolder/package.json +{ + "type": "commonjs" +} \ No newline at end of file diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportAssignment.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportAssignment.ts new file mode 100644 index 0000000000..53e6b94450 --- /dev/null +++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportAssignment.ts @@ -0,0 +1,34 @@ +// @module: node12,nodenext +// @declaration: true +// @allowJs: true +// @checkJs: true +// @outDir: out +// @filename: subfolder/index.js +// cjs format file +import fs = require("fs"); +fs.readFile; +export import fs2 = require("fs"); +// @filename: index.js +// esm format file +import fs = require("fs"); +fs.readFile; +export import fs2 = require("fs"); +// @filename: file.js +// esm format file +const __require = null; +const _createRequire = null; +import fs = require("fs"); +fs.readFile; +export import fs2 = require("fs"); +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module" +} +// @filename: subfolder/package.json +{ + "type": "commonjs" +} +// @filename: types.d.ts +declare module "fs"; \ No newline at end of file diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportHelpersCollisions1.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportHelpersCollisions1.ts new file mode 100644 index 0000000000..d5727a3dc7 --- /dev/null +++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportHelpersCollisions1.ts @@ -0,0 +1,34 @@ +// @module: node12,nodenext +// @declaration: true +// @importHelpers: true +// @allowJs: true +// @checkJs: true +// @outDir: out +// @filename: subfolder/index.js +// cjs format file +import {default as _fs} from "fs"; +_fs.readFile; +import * as fs from "fs"; +fs.readFile; +// @filename: index.js +// esm format file +import {default as _fs} from "fs"; +_fs.readFile; +import * as fs from "fs"; +fs.readFile; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module" +} +// @filename: subfolder/package.json +{ + "type": "commonjs" +} +// @filename: types.d.ts +declare module "fs"; +declare module "tslib" { + export {}; + // intentionally missing all helpers +} \ No newline at end of file diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportHelpersCollisions2.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportHelpersCollisions2.ts new file mode 100644 index 0000000000..032290f78b --- /dev/null +++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportHelpersCollisions2.ts @@ -0,0 +1,30 @@ +// @module: node12,nodenext +// @declaration: true +// @importHelpers: true +// @allowJs: true +// @checkJs: true +// @outDir: out +// @filename: subfolder/index.ts +// cjs format file +export * from "fs"; +export * as fs from "fs"; +// @filename: index.js +// esm format file +export * from "fs"; +export * as fs from "fs"; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module" +} +// @filename: subfolder/package.json +{ + "type": "commonjs" +} +// @filename: types.d.ts +declare module "fs"; +declare module "tslib" { + export {}; + // intentionally missing all helpers +} \ No newline at end of file diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportHelpersCollisions3.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportHelpersCollisions3.ts new file mode 100644 index 0000000000..9452e2003a --- /dev/null +++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportHelpersCollisions3.ts @@ -0,0 +1,32 @@ +// @module: node12,nodenext +// @declaration: true +// @importHelpers: true +// @allowJs: true +// @checkJs: true +// @outDir: out +// @filename: subfolder/index.js +// cjs format file +export {default} from "fs"; +export {default as foo} from "fs"; +export {bar as baz} from "fs"; +// @filename: index.js +// esm format file +export {default} from "fs"; +export {default as foo} from "fs"; +export {bar as baz} from "fs"; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module" +} +// @filename: subfolder/package.json +{ + "type": "commonjs" +} +// @filename: types.d.ts +declare module "fs"; +declare module "tslib" { + export {}; + // intentionally missing all helpers +} \ No newline at end of file diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportMeta.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportMeta.ts new file mode 100644 index 0000000000..a8708434b9 --- /dev/null +++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportMeta.ts @@ -0,0 +1,23 @@ +// @module: node12,nodenext +// @declaration: true +// @allowJs: true +// @checkJs: true +// @outDir: out +// @filename: subfolder/index.js +// cjs format file +const x = import.meta.url; +export {x}; +// @filename: index.js +// esm format file +const x = import.meta.url; +export {x}; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module" +} +// @filename: subfolder/package.json +{ + "type": "commonjs" +} \ No newline at end of file diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackageExports.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackageExports.ts new file mode 100644 index 0000000000..65e5721b0b --- /dev/null +++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackageExports.ts @@ -0,0 +1,92 @@ +// @module: node12,nodenext +// @declaration: true +// @allowJs: true +// @checkJs: true +// @outDir: out +// @filename: index.js +// esm format file +import * as cjs from "package/cjs"; +import * as mjs from "package/mjs"; +import * as type from "package"; +cjs; +mjs; +type; +import * as cjsi from "inner/cjs"; +import * as mjsi from "inner/mjs"; +import * as typei from "inner"; +cjsi; +mjsi; +typei; +// @filename: index.mjs +// esm format file +import * as cjs from "package/cjs"; +import * as mjs from "package/mjs"; +import * as type from "package"; +cjs; +mjs; +type; +import * as cjsi from "inner/cjs"; +import * as mjsi from "inner/mjs"; +import * as typei from "inner"; +cjsi; +mjsi; +typei; +// @filename: index.cjs +// cjs format file +import * as cjs from "package/cjs"; +import * as mjs from "package/mjs"; +import * as type from "package"; +cjs; +mjs; +type; +import * as cjsi from "inner/cjs"; +import * as mjsi from "inner/mjs"; +import * as typei from "inner"; +cjsi; +mjsi; +typei; +// @filename: node_modules/inner/index.d.ts +// cjs format file +import * as cjs from "inner/cjs"; +import * as mjs from "inner/mjs"; +import * as type from "inner"; +export { cjs }; +export { mjs }; +export { type }; +// @filename: node_modules/inner/index.d.mts +// esm format file +import * as cjs from "inner/cjs"; +import * as mjs from "inner/mjs"; +import * as type from "inner"; +export { cjs }; +export { mjs }; +export { type }; +// @filename: node_modules/inner/index.d.cts +// cjs format file +import * as cjs from "inner/cjs"; +import * as mjs from "inner/mjs"; +import * as type from "inner"; +export { cjs }; +export { mjs }; +export { type }; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module", + "exports": { + "./cjs": "./index.cjs", + "./mjs": "./index.mjs", + ".": "./index.js" + } +} +// @filename: node_modules/inner/package.json +{ + "name": "inner", + "private": true, + "exports": { + "./cjs": "./index.cjs", + "./mjs": "./index.mjs", + ".": "./index.js" + } +} \ No newline at end of file diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackageImports.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackageImports.ts new file mode 100644 index 0000000000..b9d6027f5d --- /dev/null +++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackageImports.ts @@ -0,0 +1,41 @@ +// @module: node12,nodenext +// @declaration: true +// @allowJs: true +// @checkJs: true +// @outDir: out +// @filename: index.js +// esm format file +import * as cjs from "#cjs"; +import * as mjs from "#mjs"; +import * as type from "#type"; +cjs; +mjs; +type; +// @filename: index.mjs +// esm format file +import * as cjs from "#cjs"; +import * as mjs from "#mjs"; +import * as type from "#type"; +cjs; +mjs; +type; +// @filename: index.cjs +// esm format file +import * as cjs from "#cjs"; +import * as mjs from "#mjs"; +import * as type from "#type"; +cjs; +mjs; +type; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module", + "exports": "./index.js", + "imports": { + "#cjs": "./index.cjs", + "#mjs": "./index.mjs", + "#type": "./index.js" + } +} \ No newline at end of file diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackagePatternExports.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackagePatternExports.ts new file mode 100644 index 0000000000..2691885690 --- /dev/null +++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackagePatternExports.ts @@ -0,0 +1,69 @@ +// @module: node12,nodenext +// @declaration: true +// @allowJs: true +// @checkJs: true +// @outDir: out +// @filename: index.js +// esm format file +import * as cjsi from "inner/cjs/index"; +import * as mjsi from "inner/mjs/index"; +import * as typei from "inner/js/index"; +cjsi; +mjsi; +typei; +// @filename: index.mjs +// esm format file +import * as cjsi from "inner/cjs/index"; +import * as mjsi from "inner/mjs/index"; +import * as typei from "inner/js/index"; +cjsi; +mjsi; +typei; +// @filename: index.cjs +// cjs format file +import * as cjsi from "inner/cjs/index"; +import * as mjsi from "inner/mjs/index"; +import * as typei from "inner/js/index"; +cjsi; +mjsi; +typei; +// @filename: node_modules/inner/index.d.ts +// cjs format file +import * as cjs from "inner/cjs/index"; +import * as mjs from "inner/mjs/index"; +import * as type from "inner/js/index"; +export { cjs }; +export { mjs }; +export { type }; +// @filename: node_modules/inner/index.d.mts +// esm format file +import * as cjs from "inner/cjs/index"; +import * as mjs from "inner/mjs/index"; +import * as type from "inner/js/index"; +export { cjs }; +export { mjs }; +export { type }; +// @filename: node_modules/inner/index.d.cts +// cjs format file +import * as cjs from "inner/cjs/index"; +import * as mjs from "inner/mjs/index"; +import * as type from "inner/js/index"; +export { cjs }; +export { mjs }; +export { type }; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module", +} +// @filename: node_modules/inner/package.json +{ + "name": "inner", + "private": true, + "exports": { + "./cjs/*": "./*.cjs", + "./mjs/*": "./*.mjs", + "./js/*": "./*.js" + } +} \ No newline at end of file diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackagePatternExportsTrailers.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackagePatternExportsTrailers.ts new file mode 100644 index 0000000000..6b96f34758 --- /dev/null +++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackagePatternExportsTrailers.ts @@ -0,0 +1,69 @@ +// @module: node12,nodenext +// @declaration: true +// @allowJs: true +// @checkJs: true +// @outDir: out +// @filename: index.js +// esm format file +import * as cjsi from "inner/cjs/index.cjs"; +import * as mjsi from "inner/mjs/index.mjs"; +import * as typei from "inner/js/index.js"; +cjsi; +mjsi; +typei; +// @filename: index.mjs +// esm format file +import * as cjsi from "inner/cjs/index.cjs"; +import * as mjsi from "inner/mjs/index.mjs"; +import * as typei from "inner/js/index.js"; +cjsi; +mjsi; +typei; +// @filename: index.cjs +// cjs format file +import * as cjsi from "inner/cjs/index.cjs"; +import * as mjsi from "inner/mjs/index.mjs"; +import * as typei from "inner/js/index.js"; +cjsi; +mjsi; +typei; +// @filename: node_modules/inner/index.d.ts +// cjs format file +import * as cjs from "inner/cjs/index.cjs"; +import * as mjs from "inner/mjs/index.mjs"; +import * as type from "inner/js/index.js"; +export { cjs }; +export { mjs }; +export { type }; +// @filename: node_modules/inner/index.d.mts +// esm format file +import * as cjs from "inner/cjs/index.cjs"; +import * as mjs from "inner/mjs/index.mjs"; +import * as type from "inner/js/index.js"; +export { cjs }; +export { mjs }; +export { type }; +// @filename: node_modules/inner/index.d.cts +// cjs format file +import * as cjs from "inner/cjs/index.cjs"; +import * as mjs from "inner/mjs/index.mjs"; +import * as type from "inner/js/index.js"; +export { cjs }; +export { mjs }; +export { type }; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module", +} +// @filename: node_modules/inner/package.json +{ + "name": "inner", + "private": true, + "exports": { + "./cjs/*.cjs": "./*.cjs", + "./mjs/*.mjs": "./*.mjs", + "./js/*.js": "./*.js" + } +} \ No newline at end of file diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsSynchronousCallErrors.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsSynchronousCallErrors.ts new file mode 100644 index 0000000000..15892edbe3 --- /dev/null +++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsSynchronousCallErrors.ts @@ -0,0 +1,37 @@ +// @module: node12,nodenext +// @declaration: true +// @allowJs: true +// @checkJs: true +// @outDir: out +// @filename: subfolder/index.js +// cjs format file +import {h} from "../index.js"; +import mod = require("../index.js"); +import {f as _f} from "./index.js"; +import mod2 = require("./index.js"); +export async function f() { + const mod3 = await import ("../index.js"); + const mod4 = await import ("./index.js"); + h(); +} +// @filename: index.js +// esm format file +import {h as _h} from "./index.js"; +import mod = require("./index.js"); +import {f} from "./subfolder/index.js"; +import mod2 = require("./subfolder/index.js"); +export async function h() { + const mod3 = await import ("./index.js"); + const mod4 = await import ("./subfolder/index.js"); + f(); +} +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module" +} +// @filename: subfolder/package.json +{ + "type": "commonjs" +} \ No newline at end of file diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsTopLevelAwait.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsTopLevelAwait.ts new file mode 100644 index 0000000000..872cad71c9 --- /dev/null +++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsTopLevelAwait.ts @@ -0,0 +1,25 @@ +// @module: node12,nodenext +// @declaration: true +// @allowJs: true +// @checkJs: true +// @outDir: out +// @filename: subfolder/index.js +// cjs format file +const x = await 1; +export {x}; +for await (const y of []) {} +// @filename: index.js +// esm format file +const x = await 1; +export {x}; +for await (const y of []) {} +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module" +} +// @filename: subfolder/package.json +{ + "type": "commonjs" +} \ No newline at end of file diff --git a/tests/cases/conformance/node/legacyNodeModulesExportsSpecifierGenerationConditions.ts b/tests/cases/conformance/node/legacyNodeModulesExportsSpecifierGenerationConditions.ts new file mode 100644 index 0000000000..656465829e --- /dev/null +++ b/tests/cases/conformance/node/legacyNodeModulesExportsSpecifierGenerationConditions.ts @@ -0,0 +1,33 @@ +// @module: commonjs +// @lib: es2020 +// @declaration: true +// @filename: index.ts +export const a = async () => (await import("inner")).x(); +// @filename: node_modules/inner/index.d.ts +export { x } from "./other.js"; +// @filename: node_modules/inner/other.d.ts +import { Thing } from "./private.js" +export const x: () => Thing; +// @filename: node_modules/inner/private.d.ts +export interface Thing {} // not exported in export map, inaccessible under new module modes +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module", + "exports": "./index.js" +} +// @filename: node_modules/inner/package.json +{ + "name": "inner", + "private": true, + "type": "module", + "exports": { + ".": { + "default": "./index.js" + }, + "./other": { + "default": "./other.js" + } + } +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModules1.ts b/tests/cases/conformance/node/nodeModules1.ts new file mode 100644 index 0000000000..698a6efec1 --- /dev/null +++ b/tests/cases/conformance/node/nodeModules1.ts @@ -0,0 +1,321 @@ +// @module: node12,nodenext +// @declaration: true +// @filename: subfolder/index.ts +// cjs format file +const x = 1; +export {x}; +// @filename: subfolder/index.cts +// cjs format file +const x = 1; +export {x}; +// @filename: subfolder/index.mts +// esm format file +const x = 1; +export {x}; +// @filename: subfolder2/index.ts +// cjs format file +const x = 1; +export {x}; +// @filename: subfolder2/index.cts +// cjs format file +const x = 1; +export {x}; +// @filename: subfolder2/index.mts +// esm format file +const x = 1; +export {x}; +// @filename: subfolder2/another/index.ts +// esm format file +const x = 1; +export {x}; +// @filename: subfolder2/another/index.mts +// esm format file +const x = 1; +export {x}; +// @filename: subfolder2/another/index.cts +// cjs format file +const x = 1; +export {x}; +// @filename: index.mts +import * as m1 from "./index.js"; +import * as m2 from "./index.mjs"; +import * as m3 from "./index.cjs"; +import * as m4 from "./subfolder/index.js"; +import * as m5 from "./subfolder/index.mjs"; +import * as m6 from "./subfolder/index.cjs"; +import * as m7 from "./subfolder2/index.js"; +import * as m8 from "./subfolder2/index.mjs"; +import * as m9 from "./subfolder2/index.cjs"; +import * as m10 from "./subfolder2/another/index.js"; +import * as m11 from "./subfolder2/another/index.mjs"; +import * as m12 from "./subfolder2/another/index.cjs"; +// The next ones should all fail - esm format files have no index resolution or extension resolution +import * as m13 from "./"; +import * as m14 from "./index"; +import * as m15 from "./subfolder"; +import * as m16 from "./subfolder/"; +import * as m17 from "./subfolder/index"; +import * as m18 from "./subfolder2"; +import * as m19 from "./subfolder2/"; +import * as m20 from "./subfolder2/index"; +import * as m21 from "./subfolder2/another"; +import * as m22 from "./subfolder2/another/"; +import * as m23 from "./subfolder2/another/index"; +void m1; +void m2; +void m3; +void m4; +void m5; +void m6; +void m7; +void m8; +void m9; +void m10; +void m11; +void m12; +void m13; +void m14; +void m15; +void m16; +void m17; +void m18; +void m19; +void m20; +void m21; +void m22; +void m23; + +// These should _mostly_ work - `import = require` always desugars to require calls, which do have extension and index resolution (but can't load anything that resolves to esm!) +import m24 = require("./"); +import m25 = require("./index"); +import m26 = require("./subfolder"); +import m27 = require("./subfolder/"); +import m28 = require("./subfolder/index"); +import m29 = require("./subfolder2"); +import m30 = require("./subfolder2/"); +import m31 = require("./subfolder2/index"); +import m32 = require("./subfolder2/another"); +import m33 = require("./subfolder2/another/"); +import m34 = require("./subfolder2/another/index"); +void m24; +void m25; +void m26; +void m27; +void m28; +void m29; +void m30; +void m31; +void m32; +void m33; +void m34; + +// These shouldn't work - dynamic `import()` always uses the esm resolver, which does not have extension resolution +const _m35 = import("./"); +const _m36 = import("./index"); +const _m37 = import("./subfolder"); +const _m38 = import("./subfolder/"); +const _m39 = import("./subfolder/index"); +const _m40 = import("./subfolder2"); +const _m41 = import("./subfolder2/"); +const _m42 = import("./subfolder2/index"); +const _m43 = import("./subfolder2/another"); +const _m44 = import("./subfolder2/another/"); +const _m45 = import("./subfolder2/another/index"); + +// esm format file +const x = 1; +export {x}; +// @filename: index.cts +// ESM-format imports below should issue errors +import * as m1 from "./index.js"; +import * as m2 from "./index.mjs"; +import * as m3 from "./index.cjs"; +import * as m4 from "./subfolder/index.js"; +import * as m5 from "./subfolder/index.mjs"; +import * as m6 from "./subfolder/index.cjs"; +import * as m7 from "./subfolder2/index.js"; +import * as m8 from "./subfolder2/index.mjs"; +import * as m9 from "./subfolder2/index.cjs"; +import * as m10 from "./subfolder2/another/index.js"; +import * as m11 from "./subfolder2/another/index.mjs"; +import * as m12 from "./subfolder2/another/index.cjs"; +// The next ones should _mostly_ work - cjs format files have index resolution and extension resolution (except for those which resolve to an esm format file) +import * as m13 from "./"; +import * as m14 from "./index"; +import * as m15 from "./subfolder"; +import * as m16 from "./subfolder/"; +import * as m17 from "./subfolder/index"; +import * as m18 from "./subfolder2"; +import * as m19 from "./subfolder2/"; +import * as m20 from "./subfolder2/index"; +import * as m21 from "./subfolder2/another"; +import * as m22 from "./subfolder2/another/"; +import * as m23 from "./subfolder2/another/index"; +void m1; +void m2; +void m3; +void m4; +void m5; +void m6; +void m7; +void m8; +void m9; +void m10; +void m11; +void m12; +void m13; +void m14; +void m15; +void m16; +void m17; +void m18; +void m19; +void m20; +void m21; +void m22; +void m23; + +// These should _mostly_ work - `import = require` always desugars to require calls, which do have extension and index resolution (but can't load anything that resolves to esm!) +import m24 = require("./"); +import m25 = require("./index"); +import m26 = require("./subfolder"); +import m27 = require("./subfolder/"); +import m28 = require("./subfolder/index"); +import m29 = require("./subfolder2"); +import m30 = require("./subfolder2/"); +import m31 = require("./subfolder2/index"); +import m32 = require("./subfolder2/another"); +import m33 = require("./subfolder2/another/"); +import m34 = require("./subfolder2/another/index"); +void m24; +void m25; +void m26; +void m27; +void m28; +void m29; +void m30; +void m31; +void m32; +void m33; +void m34; + +// These shouldn't work - dynamic `import()` always uses the esm resolver, which does not have extension resolution +const _m35 = import("./"); +const _m36 = import("./index"); +const _m37 = import("./subfolder"); +const _m38 = import("./subfolder/"); +const _m39 = import("./subfolder/index"); +const _m40 = import("./subfolder2"); +const _m41 = import("./subfolder2/"); +const _m42 = import("./subfolder2/index"); +const _m43 = import("./subfolder2/another"); +const _m44 = import("./subfolder2/another/"); +const _m45 = import("./subfolder2/another/index"); +// cjs format file +const x = 1; +export {x}; +// @filename: index.ts +import * as m1 from "./index.js"; +import * as m2 from "./index.mjs"; +import * as m3 from "./index.cjs"; +import * as m4 from "./subfolder/index.js"; +import * as m5 from "./subfolder/index.mjs"; +import * as m6 from "./subfolder/index.cjs"; +import * as m7 from "./subfolder2/index.js"; +import * as m8 from "./subfolder2/index.mjs"; +import * as m9 from "./subfolder2/index.cjs"; +import * as m10 from "./subfolder2/another/index.js"; +import * as m11 from "./subfolder2/another/index.mjs"; +import * as m12 from "./subfolder2/another/index.cjs"; +// The next ones shouldn't all work - esm format files have no index resolution or extension resolution +import * as m13 from "./"; +import * as m14 from "./index"; +import * as m15 from "./subfolder"; +import * as m16 from "./subfolder/"; +import * as m17 from "./subfolder/index"; +import * as m18 from "./subfolder2"; +import * as m19 from "./subfolder2/"; +import * as m20 from "./subfolder2/index"; +import * as m21 from "./subfolder2/another"; +import * as m22 from "./subfolder2/another/"; +import * as m23 from "./subfolder2/another/index"; +void m1; +void m2; +void m3; +void m4; +void m5; +void m6; +void m7; +void m8; +void m9; +void m10; +void m11; +void m12; +void m13; +void m14; +void m15; +void m16; +void m17; +void m18; +void m19; +void m20; +void m21; +void m22; +void m23; + +// These should _mostly_ work - `import = require` always desugars to require calls, which do have extension and index resolution (but can't load anything that resolves to esm!) +import m24 = require("./"); +import m25 = require("./index"); +import m26 = require("./subfolder"); +import m27 = require("./subfolder/"); +import m28 = require("./subfolder/index"); +import m29 = require("./subfolder2"); +import m30 = require("./subfolder2/"); +import m31 = require("./subfolder2/index"); +import m32 = require("./subfolder2/another"); +import m33 = require("./subfolder2/another/"); +import m34 = require("./subfolder2/another/index"); +void m24; +void m25; +void m26; +void m27; +void m28; +void m29; +void m30; +void m31; +void m32; +void m33; +void m34; + +// These shouldn't work - dynamic `import()` always uses the esm resolver, which does not have extension resolution +const _m35 = import("./"); +const _m36 = import("./index"); +const _m37 = import("./subfolder"); +const _m38 = import("./subfolder/"); +const _m39 = import("./subfolder/index"); +const _m40 = import("./subfolder2"); +const _m41 = import("./subfolder2/"); +const _m42 = import("./subfolder2/index"); +const _m43 = import("./subfolder2/another"); +const _m44 = import("./subfolder2/another/"); +const _m45 = import("./subfolder2/another/index"); +// esm format file +const x = 1; +export {x}; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module" +} +// @filename: subfolder/package.json +{ + "type": "commonjs" +} +// @filename: subfolder2/package.json +{ +} +// @filename: subfolder2/another/package.json +{ + "type": "module" +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesCjsFormatFileAlwaysHasDefault.ts b/tests/cases/conformance/node/nodeModulesCjsFormatFileAlwaysHasDefault.ts new file mode 100644 index 0000000000..06c6320d77 --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesCjsFormatFileAlwaysHasDefault.ts @@ -0,0 +1,19 @@ +// @module: node12,nodenext +// @declaration: true +// @filename: subfolder/index.ts +// cjs format file +export const a = 1; +// @filename: index.ts +// esm format file +import mod from "./subfolder/index.js"; +mod; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module" +} +// @filename: subfolder/package.json +{ + "type": "commonjs" +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesConditionalPackageExports.ts b/tests/cases/conformance/node/nodeModulesConditionalPackageExports.ts new file mode 100644 index 0000000000..07bf9d9724 --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesConditionalPackageExports.ts @@ -0,0 +1,124 @@ +// @module: node12,nodenext +// @declaration: true +// @outDir: out +// @filename: index.ts +// esm format file +import * as cjs from "package/cjs"; +import * as mjs from "package/mjs"; +import * as type from "package"; +cjs; +mjs; +type; +import * as cjsi from "inner/a"; +import * as mjsi from "inner/b"; +import * as typei from "inner"; +import * as ts from "inner/types"; +cjsi.mjsSource; +mjsi.mjsSource; +typei.mjsSource; +ts.mjsSource; +// @filename: index.mts +// esm format file +import * as cjs from "package/cjs"; +import * as mjs from "package/mjs"; +import * as type from "package"; +cjs; +mjs; +type; +import * as cjsi from "inner/a"; +import * as mjsi from "inner/b"; +import * as typei from "inner"; +import * as ts from "inner/types"; +cjsi.mjsSource; +mjsi.mjsSource; +typei.mjsSource; +ts.mjsSource; +// @filename: index.cts +// cjs format file +import * as cjs from "package/cjs"; +import * as mjs from "package/mjs"; +import * as type from "package"; +cjs; +mjs; +type; +import * as cjsi from "inner/a"; +import * as mjsi from "inner/b"; +import * as typei from "inner"; +import * as ts from "inner/types"; +cjsi.cjsSource; +mjsi.cjsSource; +typei.implicitCjsSource; +ts.cjsSource; +// @filename: node_modules/inner/index.d.ts +// cjs format file +import * as cjs from "inner/a"; +import * as mjs from "inner/b"; +import * as type from "inner"; +import * as ts from "inner/types"; +export { cjs }; +export { mjs }; +export { type }; +export { ts }; +export const implicitCjsSource = true; +// @filename: node_modules/inner/index.d.mts +// esm format file +import * as cjs from "inner/a"; +import * as mjs from "inner/b"; +import * as type from "inner"; +import * as ts from "inner/types"; +export { cjs }; +export { mjs }; +export { type }; +export { ts }; +export const mjsSource = true; +// @filename: node_modules/inner/index.d.cts +// cjs format file +import * as cjs from "inner/a"; +import * as mjs from "inner/b"; +import * as type from "inner"; +import * as ts from "inner/types"; +export { cjs }; +export { mjs }; +export { type }; +export { ts }; +export const cjsSource = true; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module", + "exports": { + "./cjs": "./index.cjs", + "./mjs": "./index.mjs", + ".": "./index.js" + } +} +// @filename: node_modules/inner/package.json +{ + "name": "inner", + "private": true, + "exports": { + "./a": { + "require": "./index.cjs", + "node": "./index.mjs" + }, + "./b": { + "import": "./index.mjs", + "node": "./index.cjs" + }, + ".": { + "import": "./index.mjs", + "node": "./index.js" + }, + "./types": { + "types": { + "import": "./index.d.mts", + "require": "./index.d.cts", + }, + "node": { + "import": "./index.mjs", + "require": "./index.cjs" + } + } + } +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesDeclarationEmitDynamicImportWithPackageExports.ts b/tests/cases/conformance/node/nodeModulesDeclarationEmitDynamicImportWithPackageExports.ts new file mode 100644 index 0000000000..3f8bae7ffc --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesDeclarationEmitDynamicImportWithPackageExports.ts @@ -0,0 +1,71 @@ +// @module: nodenext +// @declaration: true +// @filename: index.ts +// esm format file +export {}; +// @filename: index.mts +// esm format file +export {}; +// @filename: index.cts +// cjs format file +export {}; +// @filename: other.ts +// esm format file +export const a = await import("package/cjs"); +export const b = await import("package/mjs"); +export const c = await import("package"); +export const f = await import("inner"); +// @filename: other2.ts +// esm format file +export const d = await import("inner/cjs"); +export const e = await import("inner/mjs"); +// @filename: other.mts +// esm format file +export const a = await import("package/cjs"); +export const b = await import("package/mjs"); +export const c = await import("package"); +export const f = await import("inner"); +// @filename: other2.mts +// esm format file +export const d = await import("inner/cjs"); +export const e = await import("inner/mjs"); +// @filename: other.cts +// cjs format file, no TLA +export const a = import("package/cjs"); +export const b = import("package/mjs"); +export const c = import("package"); +export const f = import("inner"); +// @filename: other2.cts +// cjs format file, no TLA +export const d = import("inner/cjs"); +export const e = import("inner/mjs"); +// @filename: node_modules/inner/index.d.ts +// cjs format file +export const cjsMain = true; +// @filename: node_modules/inner/index.d.mts +// esm format file +export const esm = true; +// @filename: node_modules/inner/index.d.cts +// cjs format file +export const cjsNonmain = true; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module", + "exports": { + "./cjs": "./index.cjs", + "./mjs": "./index.mjs", + ".": "./index.js" + } +} +// @filename: node_modules/inner/package.json +{ + "name": "inner", + "private": true, + "exports": { + "./cjs": "./index.cjs", + "./mjs": "./index.mjs", + ".": "./index.js" + } +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesDeclarationEmitWithPackageExports.ts b/tests/cases/conformance/node/nodeModulesDeclarationEmitWithPackageExports.ts new file mode 100644 index 0000000000..2599ff429f --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesDeclarationEmitWithPackageExports.ts @@ -0,0 +1,93 @@ +// @module: node12,nodenext +// @declaration: true +// @outDir: out +// @filename: index.ts +// esm format file +import * as cjs from "package/cjs"; +import * as mjs from "package/mjs"; +import * as type from "package"; +export const a = cjs; +export const b = mjs; +export const c = type; +import * as cjsi from "inner/cjs"; +import * as mjsi from "inner/mjs"; +import * as typei from "inner"; +export const d = cjsi; +export const e = mjsi; +export const f = typei; +// @filename: index.mts +// esm format file +import * as cjs from "package/cjs"; +import * as mjs from "package/mjs"; +import * as type from "package"; +export const a = cjs; +export const b = mjs; +export const c = type; +import * as cjsi from "inner/cjs"; +import * as mjsi from "inner/mjs"; +import * as typei from "inner"; +export const d = cjsi; +export const e = mjsi; +export const f = typei; +// @filename: index.cts +// cjs format file +import * as cjs from "package/cjs"; +import * as mjs from "package/mjs"; +import * as type from "package"; +export const a = cjs; +export const b = mjs; +export const c = type; +import * as cjsi from "inner/cjs"; +import * as mjsi from "inner/mjs"; +import * as typei from "inner"; +export const d = cjsi; +export const e = mjsi; +export const f = typei; +// @filename: node_modules/inner/index.d.ts +// cjs format file +import * as cjs from "inner/cjs"; +import * as mjs from "inner/mjs"; +import * as type from "inner"; +cjs; +mjs; +type; +export const cjsMain = true; +// @filename: node_modules/inner/index.d.mts +// esm format file +import * as cjs from "inner/cjs"; +import * as mjs from "inner/mjs"; +import * as type from "inner"; +cjs; +mjs; +type; +export const esm = true; +// @filename: node_modules/inner/index.d.cts +// cjs format file +import * as cjs from "inner/cjs"; +import * as mjs from "inner/mjs"; +import * as type from "inner"; +cjs; +mjs; +type; +export const cjsNonmain = true; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module", + "exports": { + "./cjs": "./index.cjs", + "./mjs": "./index.mjs", + ".": "./index.js" + } +} +// @filename: node_modules/inner/package.json +{ + "name": "inner", + "private": true, + "exports": { + "./cjs": "./index.cjs", + "./mjs": "./index.mjs", + ".": "./index.js" + } +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesDynamicImport.ts b/tests/cases/conformance/node/nodeModulesDynamicImport.ts new file mode 100644 index 0000000000..46b317ca52 --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesDynamicImport.ts @@ -0,0 +1,24 @@ +// @module: node12,nodenext +// @declaration: true +// @filename: subfolder/index.ts +// cjs format file +export async function main() { + const { readFile } = await import("fs"); +} +// @filename: index.ts +// esm format file +export async function main() { + const { readFile } = await import("fs"); +} +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module" +} +// @filename: subfolder/package.json +{ + "type": "commonjs" +} +// @filename: types.d.ts +declare module "fs"; \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesExportAssignments.ts b/tests/cases/conformance/node/nodeModulesExportAssignments.ts new file mode 100644 index 0000000000..7cbcd200d9 --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesExportAssignments.ts @@ -0,0 +1,20 @@ +// @module: node12,nodenext +// @declaration: true +// @filename: subfolder/index.ts +// cjs format file +const a = {}; +export = a; +// @filename: index.ts +// esm format file +const a = {}; +export = a; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module" +} +// @filename: subfolder/package.json +{ + "type": "commonjs" +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesExportsBlocksSpecifierResolution.ts b/tests/cases/conformance/node/nodeModulesExportsBlocksSpecifierResolution.ts new file mode 100644 index 0000000000..ffc5adf8e0 --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesExportsBlocksSpecifierResolution.ts @@ -0,0 +1,27 @@ +// @module: node12,nodenext +// @declaration: true +// @filename: index.ts +// esm format file +import { Thing } from "inner/other"; +export const a = (await import("inner")).x(); +// @filename: node_modules/inner/index.d.ts +// esm format file +export { x } from "./other.js"; +// @filename: node_modules/inner/other.d.ts +// esm format file +export interface Thing {} +export const x: () => Thing; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module", + "exports": "./index.js" +} +// @filename: node_modules/inner/package.json +{ + "name": "inner", + "private": true, + "type": "module", + "exports": "./index.js" +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesExportsSpecifierGenerationConditions.ts b/tests/cases/conformance/node/nodeModulesExportsSpecifierGenerationConditions.ts new file mode 100644 index 0000000000..2562c7a4a1 --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesExportsSpecifierGenerationConditions.ts @@ -0,0 +1,34 @@ +// @module: node12,nodenext +// @declaration: true +// @filename: index.ts +// esm format file +import { Thing } from "inner/other.js"; // should fail +export const a = (await import("inner")).x(); +// @filename: node_modules/inner/index.d.ts +// esm format file +export { x } from "./other.js"; +// @filename: node_modules/inner/other.d.ts +// esm format file +export interface Thing {} +export const x: () => Thing; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module", + "exports": "./index.js" +} +// @filename: node_modules/inner/package.json +{ + "name": "inner", + "private": true, + "type": "module", + "exports": { + ".": { + "default": "./index.js" + }, + "./other": { + "default": "./other.js" + } + } +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesExportsSpecifierGenerationDirectory.ts b/tests/cases/conformance/node/nodeModulesExportsSpecifierGenerationDirectory.ts new file mode 100644 index 0000000000..2eb8ac58e6 --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesExportsSpecifierGenerationDirectory.ts @@ -0,0 +1,29 @@ +// @module: node12,nodenext +// @declaration: true +// @filename: index.ts +// esm format file +import { Thing } from "inner/other"; +export const a = (await import("inner/index.js")).x(); +// @filename: node_modules/inner/index.d.ts +// esm format file +export { x } from "./other.js"; +// @filename: node_modules/inner/other.d.ts +// esm format file +export interface Thing {} +export const x: () => Thing; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module", + "exports": "./index.js" +} +// @filename: node_modules/inner/package.json +{ + "name": "inner", + "private": true, + "type": "module", + "exports": { + "./": "./" + } +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesExportsSpecifierGenerationPattern.ts b/tests/cases/conformance/node/nodeModulesExportsSpecifierGenerationPattern.ts new file mode 100644 index 0000000000..97812da5b5 --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesExportsSpecifierGenerationPattern.ts @@ -0,0 +1,29 @@ +// @module: node12,nodenext +// @declaration: true +// @filename: index.ts +// esm format file +import { Thing } from "inner/other"; +export const a = (await import("inner/index.js")).x(); +// @filename: node_modules/inner/index.d.ts +// esm format file +export { x } from "./other.js"; +// @filename: node_modules/inner/other.d.ts +// esm format file +export interface Thing {} +export const x: () => Thing; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module", + "exports": "./index.js" +} +// @filename: node_modules/inner/package.json +{ + "name": "inner", + "private": true, + "type": "module", + "exports": { + "./*.js": "./*.js" + } +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesForbidenSyntax.ts b/tests/cases/conformance/node/nodeModulesForbidenSyntax.ts new file mode 100644 index 0000000000..d441627d7d --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesForbidenSyntax.ts @@ -0,0 +1,67 @@ +// @module: node12,nodenext +// @declaration: true +// @filename: subfolder/index.ts +// cjs format file +const x = <T>() => <T><any>(void 0); +export {x}; +// @filename: subfolder/index.cts +// cjs format file +const x = <T>() => <T><any>(void 0); +export {x}; +// @filename: subfolder/index.mts +// esm format file +const x = <T>() => <T><any>(void 0); +export {x}; +// @filename: subfolder2/index.ts +// cjs format file +const x = <T>() => <T><any>(void 0); +export {x}; +// @filename: subfolder2/index.cts +// cjs format file +const x = <T>() => <T><any>(void 0); +export {x}; +// @filename: subfolder2/index.mts +// esm format file +const x = <T>() => <T><any>(void 0); +export {x}; +// @filename: subfolder2/another/index.ts +// esm format file +const x = <T>() => <T><any>(void 0); +export {x}; +// @filename: subfolder2/another/index.mts +// esm format file +const x = <T>() => <T><any>(void 0); +export {x}; +// @filename: subfolder2/another/index.cts +// cjs format file +const x = <T>() => <T><any>(void 0); +export {x}; +// @filename: index.mts +// esm format file +const x = <T>() => <T><any>(void 0); +export {x}; +// @filename: index.cts +// cjs format file +const x = <T>() => <T><any>(void 0); +export {x}; +// @filename: index.ts +// esm format file +const x = <T>() => <T><any>(void 0); +export {x}; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module" +} +// @filename: subfolder/package.json +{ + "type": "commonjs" +} +// @filename: subfolder2/package.json +{ +} +// @filename: subfolder2/another/package.json +{ + "type": "module" +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesGeneratedNameCollisions.ts b/tests/cases/conformance/node/nodeModulesGeneratedNameCollisions.ts new file mode 100644 index 0000000000..e9a9b9d9ed --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesGeneratedNameCollisions.ts @@ -0,0 +1,26 @@ +// @module: node12,nodenext +// @declaration: true +// @filename: subfolder/index.ts +// cjs format file +function require() {} +const exports = {}; +class Object {} +export const __esModule = false; +export {require, exports, Object}; +// @filename: index.ts +// esm format file +function require() {} +const exports = {}; +class Object {} +export const __esModule = false; +export {require, exports, Object}; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module" +} +// @filename: subfolder/package.json +{ + "type": "commonjs" +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesImportAssertions.ts b/tests/cases/conformance/node/nodeModulesImportAssertions.ts new file mode 100644 index 0000000000..0fe1ccdf82 --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesImportAssertions.ts @@ -0,0 +1,13 @@ +// @module: node12,nodenext +// @resolveJsonModule: true +// @filename: index.ts +import json from "./package.json" assert { type: "json" }; +// @filename: otherc.cts +import json from "./package.json" assert { type: "json" }; // should error, cjs mode imports don't support assertions +const json2 = import("./package.json", { assert: { type: "json" } }); // should be fine +// @filename: package.json +{ + "name": "pkg", + "private": true, + "type": "module" +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesImportAssignments.ts b/tests/cases/conformance/node/nodeModulesImportAssignments.ts new file mode 100644 index 0000000000..6c22fe83e0 --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesImportAssignments.ts @@ -0,0 +1,31 @@ +// @module: node12,nodenext +// @declaration: true +// @filename: subfolder/index.ts +// cjs format file +import fs = require("fs"); +fs.readFile; +export import fs2 = require("fs"); +// @filename: index.ts +// esm format file +import fs = require("fs"); +fs.readFile; +export import fs2 = require("fs"); +// @filename: file.ts +// esm format file +const __require = null; +const _createRequire = null; +import fs = require("fs"); +fs.readFile; +export import fs2 = require("fs"); +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module" +} +// @filename: subfolder/package.json +{ + "type": "commonjs" +} +// @filename: types.d.ts +declare module "fs"; \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesImportHelpersCollisions.ts b/tests/cases/conformance/node/nodeModulesImportHelpersCollisions.ts new file mode 100644 index 0000000000..103b583712 --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesImportHelpersCollisions.ts @@ -0,0 +1,31 @@ +// @module: node12,nodenext +// @declaration: true +// @importHelpers: true +// @filename: subfolder/index.ts +// cjs format file +import {default as _fs} from "fs"; +_fs.readFile; +import * as fs from "fs"; +fs.readFile; +// @filename: index.ts +// esm format file +import {default as _fs} from "fs"; +_fs.readFile; +import * as fs from "fs"; +fs.readFile; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module" +} +// @filename: subfolder/package.json +{ + "type": "commonjs" +} +// @filename: types.d.ts +declare module "fs"; +declare module "tslib" { + export {}; + // intentionally missing all helpers +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesImportHelpersCollisions2.ts b/tests/cases/conformance/node/nodeModulesImportHelpersCollisions2.ts new file mode 100644 index 0000000000..7f90947a5f --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesImportHelpersCollisions2.ts @@ -0,0 +1,27 @@ +// @module: node12,nodenext +// @declaration: true +// @importHelpers: true +// @filename: subfolder/index.ts +// cjs format file +export * from "fs"; +export * as fs from "fs"; +// @filename: index.ts +// esm format file +export * from "fs"; +export * as fs from "fs"; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module" +} +// @filename: subfolder/package.json +{ + "type": "commonjs" +} +// @filename: types.d.ts +declare module "fs"; +declare module "tslib" { + export {}; + // intentionally missing all helpers +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesImportHelpersCollisions3.ts b/tests/cases/conformance/node/nodeModulesImportHelpersCollisions3.ts new file mode 100644 index 0000000000..5f6984ad1f --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesImportHelpersCollisions3.ts @@ -0,0 +1,25 @@ +// @module: node12,nodenext +// @declaration: true +// @importHelpers: true +// @filename: subfolder/index.ts +// cjs format file +export {default} from "fs"; +// @filename: index.ts +// esm format file +export {default} from "fs"; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module" +} +// @filename: subfolder/package.json +{ + "type": "commonjs" +} +// @filename: types.d.ts +declare module "fs"; +declare module "tslib" { + export {}; + // intentionally missing all helpers +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesImportMeta.ts b/tests/cases/conformance/node/nodeModulesImportMeta.ts new file mode 100644 index 0000000000..d684c7b5cb --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesImportMeta.ts @@ -0,0 +1,20 @@ +// @module: node12,nodenext +// @declaration: true +// @filename: subfolder/index.ts +// cjs format file +const x = import.meta.url; +export {x}; +// @filename: index.ts +// esm format file +const x = import.meta.url; +export {x}; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module" +} +// @filename: subfolder/package.json +{ + "type": "commonjs" +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesImportResolutionIntoExport.ts b/tests/cases/conformance/node/nodeModulesImportResolutionIntoExport.ts new file mode 100644 index 0000000000..2a407b2bc6 --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesImportResolutionIntoExport.ts @@ -0,0 +1,24 @@ +// @module: node12,nodenext +// @declaration: true +// @filename: index.ts +// esm format file +import * as type from "#type"; +type; +// @filename: index.mts +// esm format file +import * as type from "#type"; +type; +// @filename: index.cts +// esm format file +import * as type from "#type"; +type; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module", + "exports": "./index.cjs", + "imports": { + "#type": "package" + } +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesImportResolutionNoCycle.ts b/tests/cases/conformance/node/nodeModulesImportResolutionNoCycle.ts new file mode 100644 index 0000000000..c0482c86ec --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesImportResolutionNoCycle.ts @@ -0,0 +1,24 @@ +// @module: node12,nodenext +// @declaration: true +// @filename: index.ts +// esm format file +import * as type from "#type"; +type; +// @filename: index.mts +// esm format file +import * as type from "#type"; +type; +// @filename: index.cts +// esm format file +import * as type from "#type"; +type; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module", + "exports": "package", + "imports": { + "#type": "package" + } +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesPackageExports.ts b/tests/cases/conformance/node/nodeModulesPackageExports.ts new file mode 100644 index 0000000000..897d01b07d --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesPackageExports.ts @@ -0,0 +1,90 @@ +// @module: node12,nodenext +// @declaration: true +// @outDir: out +// @filename: index.ts +// esm format file +import * as cjs from "package/cjs"; +import * as mjs from "package/mjs"; +import * as type from "package"; +cjs; +mjs; +type; +import * as cjsi from "inner/cjs"; +import * as mjsi from "inner/mjs"; +import * as typei from "inner"; +cjsi; +mjsi; +typei; +// @filename: index.mts +// esm format file +import * as cjs from "package/cjs"; +import * as mjs from "package/mjs"; +import * as type from "package"; +cjs; +mjs; +type; +import * as cjsi from "inner/cjs"; +import * as mjsi from "inner/mjs"; +import * as typei from "inner"; +cjsi; +mjsi; +typei; +// @filename: index.cts +// cjs format file +import * as cjs from "package/cjs"; +import * as mjs from "package/mjs"; +import * as type from "package"; +cjs; +mjs; +type; +import * as cjsi from "inner/cjs"; +import * as mjsi from "inner/mjs"; +import * as typei from "inner"; +cjsi; +mjsi; +typei; +// @filename: node_modules/inner/index.d.ts +// cjs format file +import * as cjs from "inner/cjs"; +import * as mjs from "inner/mjs"; +import * as type from "inner"; +export { cjs }; +export { mjs }; +export { type }; +// @filename: node_modules/inner/index.d.mts +// esm format file +import * as cjs from "inner/cjs"; +import * as mjs from "inner/mjs"; +import * as type from "inner"; +export { cjs }; +export { mjs }; +export { type }; +// @filename: node_modules/inner/index.d.cts +// cjs format file +import * as cjs from "inner/cjs"; +import * as mjs from "inner/mjs"; +import * as type from "inner"; +export { cjs }; +export { mjs }; +export { type }; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module", + "exports": { + "./cjs": "./index.cjs", + "./mjs": "./index.mjs", + ".": "./index.js" + } +} +// @filename: node_modules/inner/package.json +{ + "name": "inner", + "private": true, + "exports": { + "./cjs": "./index.cjs", + "./mjs": "./index.mjs", + ".": "./index.js" + } +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesPackageImports.ts b/tests/cases/conformance/node/nodeModulesPackageImports.ts new file mode 100644 index 0000000000..cccf930098 --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesPackageImports.ts @@ -0,0 +1,38 @@ +// @module: node12,nodenext +// @declaration: true +// @filename: index.ts +// esm format file +import * as cjs from "#cjs"; +import * as mjs from "#mjs"; +import * as type from "#type"; +cjs; +mjs; +type; +// @filename: index.mts +// esm format file +import * as cjs from "#cjs"; +import * as mjs from "#mjs"; +import * as type from "#type"; +cjs; +mjs; +type; +// @filename: index.cts +// esm format file +import * as cjs from "#cjs"; +import * as mjs from "#mjs"; +import * as type from "#type"; +cjs; +mjs; +type; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module", + "exports": "./index.js", + "imports": { + "#cjs": "./index.cjs", + "#mjs": "./index.mjs", + "#type": "./index.js" + } +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesPackagePatternExports.ts b/tests/cases/conformance/node/nodeModulesPackagePatternExports.ts new file mode 100644 index 0000000000..e22e497a94 --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesPackagePatternExports.ts @@ -0,0 +1,67 @@ +// @module: node12,nodenext +// @declaration: true +// @outDir: out +// @filename: index.ts +// esm format file +import * as cjsi from "inner/cjs/index"; +import * as mjsi from "inner/mjs/index"; +import * as typei from "inner/js/index"; +cjsi; +mjsi; +typei; +// @filename: index.mts +// esm format file +import * as cjsi from "inner/cjs/index"; +import * as mjsi from "inner/mjs/index"; +import * as typei from "inner/js/index"; +cjsi; +mjsi; +typei; +// @filename: index.cts +// cjs format file +import * as cjsi from "inner/cjs/index"; +import * as mjsi from "inner/mjs/index"; +import * as typei from "inner/js/index"; +cjsi; +mjsi; +typei; +// @filename: node_modules/inner/index.d.ts +// cjs format file +import * as cjs from "inner/cjs/index"; +import * as mjs from "inner/mjs/index"; +import * as type from "inner/js/index"; +export { cjs }; +export { mjs }; +export { type }; +// @filename: node_modules/inner/index.d.mts +// esm format file +import * as cjs from "inner/cjs/index"; +import * as mjs from "inner/mjs/index"; +import * as type from "inner/js/index"; +export { cjs }; +export { mjs }; +export { type }; +// @filename: node_modules/inner/index.d.cts +// cjs format file +import * as cjs from "inner/cjs/index"; +import * as mjs from "inner/mjs/index"; +import * as type from "inner/js/index"; +export { cjs }; +export { mjs }; +export { type }; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module", +} +// @filename: node_modules/inner/package.json +{ + "name": "inner", + "private": true, + "exports": { + "./cjs/*": "./*.cjs", + "./mjs/*": "./*.mjs", + "./js/*": "./*.js" + } +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesPackagePatternExportsTrailers.ts b/tests/cases/conformance/node/nodeModulesPackagePatternExportsTrailers.ts new file mode 100644 index 0000000000..3abe36e0d6 --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesPackagePatternExportsTrailers.ts @@ -0,0 +1,67 @@ +// @module: node12,nodenext +// @declaration: true +// @outDir: out +// @filename: index.ts +// esm format file +import * as cjsi from "inner/cjs/index.cjs"; +import * as mjsi from "inner/mjs/index.mjs"; +import * as typei from "inner/js/index.js"; +cjsi; +mjsi; +typei; +// @filename: index.mts +// esm format file +import * as cjsi from "inner/cjs/index.cjs"; +import * as mjsi from "inner/mjs/index.mjs"; +import * as typei from "inner/js/index.js"; +cjsi; +mjsi; +typei; +// @filename: index.cts +// cjs format file +import * as cjsi from "inner/cjs/index.cjs"; +import * as mjsi from "inner/mjs/index.mjs"; +import * as typei from "inner/js/index.js"; +cjsi; +mjsi; +typei; +// @filename: node_modules/inner/index.d.ts +// cjs format file +import * as cjs from "inner/cjs/index.cjs"; +import * as mjs from "inner/mjs/index.mjs"; +import * as type from "inner/js/index.js"; +export { cjs }; +export { mjs }; +export { type }; +// @filename: node_modules/inner/index.d.mts +// esm format file +import * as cjs from "inner/cjs/index.cjs"; +import * as mjs from "inner/mjs/index.mjs"; +import * as type from "inner/js/index.js"; +export { cjs }; +export { mjs }; +export { type }; +// @filename: node_modules/inner/index.d.cts +// cjs format file +import * as cjs from "inner/cjs/index.cjs"; +import * as mjs from "inner/mjs/index.mjs"; +import * as type from "inner/js/index.js"; +export { cjs }; +export { mjs }; +export { type }; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module", +} +// @filename: node_modules/inner/package.json +{ + "name": "inner", + "private": true, + "exports": { + "./cjs/*.cjs": "./*.cjs", + "./mjs/*.mjs": "./*.mjs", + "./js/*.js": "./*.js" + } +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesResolveJsonModule.ts b/tests/cases/conformance/node/nodeModulesResolveJsonModule.ts new file mode 100644 index 0000000000..c298685c22 --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesResolveJsonModule.ts @@ -0,0 +1,29 @@ +// @module: node12,nodenext +// @resolveJsonModule: true +// @outDir: ./out +// @declaration: true +// @filename: index.ts +import pkg from "./package.json" +export const name = pkg.name; +import * as ns from "./package.json"; +export const thing = ns; +export const name2 = ns.default.name; +// @filename: index.cts +import pkg from "./package.json" +export const name = pkg.name; +import * as ns from "./package.json"; +export const thing = ns; +export const name2 = ns.default.name; +// @filename: index.mts +import pkg from "./package.json" +export const name = pkg.name; +import * as ns from "./package.json"; +export const thing = ns; +export const name2 = ns.default.name; +// @filename: package.json +{ + "name": "pkg", + "version": "0.0.1", + "type": "module", + "default": "misedirection" +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesSynchronousCallErrors.ts b/tests/cases/conformance/node/nodeModulesSynchronousCallErrors.ts new file mode 100644 index 0000000000..78aa93ee17 --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesSynchronousCallErrors.ts @@ -0,0 +1,34 @@ +// @module: node12,nodenext +// @declaration: true +// @filename: subfolder/index.ts +// cjs format file +import {h} from "../index.js"; +import mod = require("../index.js"); +import {f as _f} from "./index.js"; +import mod2 = require("./index.js"); +export async function f() { + const mod3 = await import ("../index.js"); + const mod4 = await import ("./index.js"); + h(); +} +// @filename: index.ts +// esm format file +import {h as _h} from "./index.js"; +import mod = require("./index.js"); +import {f} from "./subfolder/index.js"; +import mod2 = require("./subfolder/index.js"); +export async function h() { + const mod3 = await import ("./index.js"); + const mod4 = await import ("./subfolder/index.js"); + f(); +} +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module" +} +// @filename: subfolder/package.json +{ + "type": "commonjs" +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesTopLevelAwait.ts b/tests/cases/conformance/node/nodeModulesTopLevelAwait.ts new file mode 100644 index 0000000000..2fbd5d3b0c --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesTopLevelAwait.ts @@ -0,0 +1,22 @@ +// @module: node12,nodenext +// @declaration: true +// @filename: subfolder/index.ts +// cjs format file +const x = await 1; +export {x}; +for await (const y of []) {} +// @filename: index.ts +// esm format file +const x = await 1; +export {x}; +for await (const y of []) {} +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module" +} +// @filename: subfolder/package.json +{ + "type": "commonjs" +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesTypesVersionPackageExports.ts b/tests/cases/conformance/node/nodeModulesTypesVersionPackageExports.ts new file mode 100644 index 0000000000..52cda091b3 --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesTypesVersionPackageExports.ts @@ -0,0 +1,53 @@ +// @module: node12,nodenext +// @declaration: true +// @outDir: out +// @filename: index.ts +// esm format file +import * as mod from "inner"; +mod.correctVersionApplied; + +// @filename: index.mts +// esm format file +import * as mod from "inner"; +mod.correctVersionApplied; + +// @filename: index.cts +// cjs format file +import * as mod from "inner"; +mod.correctVersionApplied; + +// @filename: node_modules/inner/index.d.ts +// cjs format file +export const noConditionsApplied = true; +// @filename: node_modules/inner/index.d.mts +// esm format file +export const importConditionApplied = true; +// @filename: node_modules/inner/index.d.cts +// cjs format file +export const wrongConditionApplied = true; +// @filename: node_modules/inner/old-types.d.ts +export const noVersionApplied = true; +// @filename: node_modules/inner/new-types.d.ts +export const correctVersionApplied = true; +// @filename: node_modules/inner/future-types.d.ts +export const futureVersionApplied = true; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module", +} +// @filename: node_modules/inner/package.json +{ + "name": "inner", + "private": true, + "exports": { + ".": { + "types@>=10000": "./future-types.d.ts", + "types@>=1": "./new-types.d.ts", + "types": "./old-types.d.ts", + "import": "./index.mjs", + "node": "./index.js" + }, + } +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodePackageSelfName.ts b/tests/cases/conformance/node/nodePackageSelfName.ts new file mode 100644 index 0000000000..099d9c424e --- /dev/null +++ b/tests/cases/conformance/node/nodePackageSelfName.ts @@ -0,0 +1,21 @@ +// @module: node12,nodenext +// @declaration: true +// @filename: index.ts +// esm format file +import * as self from "package"; +self; +// @filename: index.mts +// esm format file +import * as self from "package"; +self; +// @filename: index.cts +// esm format file +import * as self from "package"; +self; +// @filename: package.json +{ + "name": "package", + "private": true, + "type": "module", + "exports": "./index.js" +} \ No newline at end of file diff --git a/tests/cases/conformance/node/nodePackageSelfNameScoped.ts b/tests/cases/conformance/node/nodePackageSelfNameScoped.ts new file mode 100644 index 0000000000..f4ef1e3798 --- /dev/null +++ b/tests/cases/conformance/node/nodePackageSelfNameScoped.ts @@ -0,0 +1,21 @@ +// @module: node12,nodenext +// @declaration: true +// @filename: index.ts +// esm format file +import * as self from "@scope/package"; +self; +// @filename: index.mts +// esm format file +import * as self from "@scope/package"; +self; +// @filename: index.cts +// cjs format file +import * as self from "@scope/package"; +self; +// @filename: package.json +{ + "name": "@scope/package", + "private": true, + "type": "module", + "exports": "./index.js" +} \ No newline at end of file diff --git a/tests/cases/conformance/override/override10.ts b/tests/cases/conformance/override/override10.ts index 3a8eca1632..31b904811c 100644 --- a/tests/cases/conformance/override/override10.ts +++ b/tests/cases/conformance/override/override10.ts @@ -9,4 +9,5 @@ abstract class Base { abstract class Sub extends Base { abstract override foo(): number; bar() { } -} \ No newline at end of file +} +let aa =new Sub(); \ No newline at end of file diff --git a/tests/cases/conformance/override/override12.ts b/tests/cases/conformance/override/override12.ts index 304caf1627..084c248b37 100644 --- a/tests/cases/conformance/override/override12.ts +++ b/tests/cases/conformance/override/override12.ts @@ -24,3 +24,4 @@ class B extends A { override m3(): void {} } +let qq13 = new B(); \ No newline at end of file diff --git a/tests/cases/conformance/override/override15.ts b/tests/cases/conformance/override/override15.ts new file mode 100644 index 0000000000..882cc7eb97 --- /dev/null +++ b/tests/cases/conformance/override/override15.ts @@ -0,0 +1,9 @@ +// @noImplicitOverride: true + +class A { + doSomething() {} +} + +class B extends A { + override doSomethang() {} +} diff --git a/tests/cases/conformance/override/override16.ts b/tests/cases/conformance/override/override16.ts index 4468edfdc4..b869c89311 100644 --- a/tests/cases/conformance/override/override16.ts +++ b/tests/cases/conformance/override/override16.ts @@ -8,3 +8,4 @@ class A { class B extends A { override foo = "string"; } +let qq12 = new B(); \ No newline at end of file diff --git a/tests/cases/conformance/override/override17.ts b/tests/cases/conformance/override/override17.ts index edabe9816d..a5f92ef955 100644 --- a/tests/cases/conformance/override/override17.ts +++ b/tests/cases/conformance/override/override17.ts @@ -25,3 +25,4 @@ class B extends A { override m3(): void {} } +let qq11 = new B(); \ No newline at end of file diff --git a/tests/cases/conformance/override/override18.ts b/tests/cases/conformance/override/override18.ts index 2527449e74..6d4d132193 100644 --- a/tests/cases/conformance/override/override18.ts +++ b/tests/cases/conformance/override/override18.ts @@ -9,3 +9,4 @@ class A { class B extends A { override foo = "string"; } +let qq7 = new B(); \ No newline at end of file diff --git a/tests/cases/conformance/override/override19.ts b/tests/cases/conformance/override/override19.ts new file mode 100644 index 0000000000..63e5cd9994 --- /dev/null +++ b/tests/cases/conformance/override/override19.ts @@ -0,0 +1,20 @@ +// @target: esnext +// @noImplicitOverride: true + +type Foo = abstract new(...args: any) => any; +declare function CreateMixin<C extends Foo, T extends Foo>(Context: C, Base: T): T & { + new (...args: any[]): { context: InstanceType<C> } +} +class Context {} + +class A { + doSomething() {} +} + +class B extends CreateMixin(Context, A) { + override foo() {} // Remove override +} + +class C extends CreateMixin(Context, A) { + override doSomethang() {} // Suggestion 'doSomething' +} diff --git a/tests/cases/conformance/override/override20.ts b/tests/cases/conformance/override/override20.ts new file mode 100644 index 0000000000..9835cd9135 --- /dev/null +++ b/tests/cases/conformance/override/override20.ts @@ -0,0 +1,34 @@ +// @target: esnext +// @noImplicitOverride: true + +const Foo: C1 & C2 = + class { + m1() { } + m2() { } + } + +interface I1 { + m1(): void; +} + +interface I2 { + m1(): void; + m2(): void; +} + +interface C1 { + new(...args: any[]): I1; +} + +interface C2 { + new(...args: any[]): I2; +} + +export class Bar extends Foo { + m1() { + super.m1(); + } + m2() { + super.m2(); + } +} diff --git a/tests/cases/conformance/override/override_js1.ts b/tests/cases/conformance/override/override_js1.ts index 75df72695e..d327d1dbcf 100644 --- a/tests/cases/conformance/override/override_js1.ts +++ b/tests/cases/conformance/override/override_js1.ts @@ -22,4 +22,6 @@ class C { fooo (v) {} /** @override */ bar(v) {} -} \ No newline at end of file +} +let qq8 = new D(); +let qq9 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/override/override_js4.ts b/tests/cases/conformance/override/override_js4.ts new file mode 100644 index 0000000000..f5a7f1b6c4 --- /dev/null +++ b/tests/cases/conformance/override/override_js4.ts @@ -0,0 +1,14 @@ +// @noImplicitOverride: true +// @allowJs: true +// @checkJs: true +// @noEmit: true + +// @Filename: a.js +class A { + doSomething() {} +} + +class B extends A { + /** @override */ + doSomethang() {} +} diff --git a/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration16.ts b/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration16.ts index b345892ec2..39a09037ca 100644 --- a/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration16.ts +++ b/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration16.ts @@ -1,4 +1,5 @@ class C { foo(); foo() { } -} \ No newline at end of file +} +let q19 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration17.ts b/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration17.ts index a709f7d7bc..08f7560759 100644 --- a/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration17.ts +++ b/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration17.ts @@ -5,3 +5,4 @@ declare class Enumerator { public item(): any; constructor (o: any); } +let q22 = new Enumerator(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration19.ts b/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration19.ts index 65d9bd0a57..5ed5520812 100644 --- a/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration19.ts +++ b/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration19.ts @@ -1,4 +1,5 @@ class C { foo(); "foo"() { } -} \ No newline at end of file +} +let q18 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration20.ts b/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration20.ts index 6c8540e833..a2025ab46f 100644 --- a/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration20.ts +++ b/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration20.ts @@ -1,4 +1,5 @@ class C { 0(); "0"() { } -} \ No newline at end of file +} +let q23 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration23.ts b/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration23.ts index 5720f935a6..7ff1604575 100644 --- a/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration23.ts +++ b/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration23.ts @@ -1,2 +1,3 @@ class C\u0032 { -} \ No newline at end of file +} +let q17 = new C\u0032(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration26.ts b/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration26.ts index 4d5395733a..fbefb55710 100644 --- a/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration26.ts +++ b/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration26.ts @@ -1,4 +1,5 @@ class C { var public -} \ No newline at end of file +} +let q20 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclarationIndexSignature1.ts b/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclarationIndexSignature1.ts index b99c0c6f48..bae31847e0 100644 --- a/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclarationIndexSignature1.ts +++ b/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclarationIndexSignature1.ts @@ -1,3 +1,4 @@ class C { [index:number]:number -} \ No newline at end of file +} +let q21 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/ConstructorDeclarations/parserConstructorDeclaration1.ts b/tests/cases/conformance/parser/ecmascript5/ConstructorDeclarations/parserConstructorDeclaration1.ts index b845118647..024f143cad 100644 --- a/tests/cases/conformance/parser/ecmascript5/ConstructorDeclarations/parserConstructorDeclaration1.ts +++ b/tests/cases/conformance/parser/ecmascript5/ConstructorDeclarations/parserConstructorDeclaration1.ts @@ -1,3 +1,4 @@ class C { public constructor() { } -} \ No newline at end of file +} +let q24 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/ConstructorDeclarations/parserConstructorDeclaration5.ts b/tests/cases/conformance/parser/ecmascript5/ConstructorDeclarations/parserConstructorDeclaration5.ts index f445d70c88..7305a4098d 100644 --- a/tests/cases/conformance/parser/ecmascript5/ConstructorDeclarations/parserConstructorDeclaration5.ts +++ b/tests/cases/conformance/parser/ecmascript5/ConstructorDeclarations/parserConstructorDeclaration5.ts @@ -1,3 +1,4 @@ class C { private constructor() { } -} \ No newline at end of file +} +let q25 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic11.ts b/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic11.ts index 5ebd8f13ae..bd99e7cfb1 100644 --- a/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic11.ts +++ b/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic11.ts @@ -2,3 +2,4 @@ class Outer { static public() {} } +let q12 = new Outer(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic14.ts b/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic14.ts index 23fb870f86..474e281b08 100644 --- a/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic14.ts +++ b/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic14.ts @@ -2,3 +2,4 @@ class Outer { static public<T>() {} } +let q14 = new Outer(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic2.ts b/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic2.ts index 30045cf9f0..dfc01652e7 100644 --- a/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic2.ts +++ b/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic2.ts @@ -2,3 +2,4 @@ class Outer { static public; } +let q11 = new Outer(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic3.ts b/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic3.ts index c2f462b71a..f38fc7ee97 100644 --- a/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic3.ts +++ b/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic3.ts @@ -2,3 +2,4 @@ class Outer { static public = 1; } +let q9 = new Outer(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic4.ts b/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic4.ts index fe0ed44cf0..41f075c30c 100644 --- a/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic4.ts +++ b/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic4.ts @@ -2,3 +2,4 @@ class Outer { static public: number; } +let q13 = new Outer(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic5.ts b/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic5.ts index 49db39132c..ea9593bb53 100644 --- a/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic5.ts +++ b/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic5.ts @@ -2,3 +2,4 @@ class Outer { static public } +let q0 = new Outer(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Generics/parserGenericClass1.ts b/tests/cases/conformance/parser/ecmascript5/Generics/parserGenericClass1.ts index 237910839d..a814947c9e 100644 --- a/tests/cases/conformance/parser/ecmascript5/Generics/parserGenericClass1.ts +++ b/tests/cases/conformance/parser/ecmascript5/Generics/parserGenericClass1.ts @@ -1,2 +1,3 @@ class C<T> { -} \ No newline at end of file +} +let q38 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Generics/parserGenericClass2.ts b/tests/cases/conformance/parser/ecmascript5/Generics/parserGenericClass2.ts index 949f220fbd..f4f517c52c 100644 --- a/tests/cases/conformance/parser/ecmascript5/Generics/parserGenericClass2.ts +++ b/tests/cases/conformance/parser/ecmascript5/Generics/parserGenericClass2.ts @@ -1,2 +1,3 @@ class C<K,V> { -} \ No newline at end of file +} +let q40 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Generics/parserGenericConstraint1.ts b/tests/cases/conformance/parser/ecmascript5/Generics/parserGenericConstraint1.ts index 585fa7dbe1..78a9ffb4db 100644 --- a/tests/cases/conformance/parser/ecmascript5/Generics/parserGenericConstraint1.ts +++ b/tests/cases/conformance/parser/ecmascript5/Generics/parserGenericConstraint1.ts @@ -1,2 +1,3 @@ class C<T extends number> { -} \ No newline at end of file +} +let q39 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration1.ts b/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration1.ts index 56ba0579b0..7de740ebab 100644 --- a/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration1.ts +++ b/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration1.ts @@ -1,3 +1,4 @@ class C { [a: string]: number -} \ No newline at end of file +} +let q27 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration2.ts b/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration2.ts index 34108a6e71..f0224e9379 100644 --- a/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration2.ts +++ b/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration2.ts @@ -1,4 +1,5 @@ class C { [a: string]: number public v: number -} \ No newline at end of file +} +let q29 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration3.ts b/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration3.ts index f2180413ca..25ea575259 100644 --- a/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration3.ts +++ b/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration3.ts @@ -1,4 +1,5 @@ class C { [a: string]: number; public v: number -} \ No newline at end of file +} +let q30 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration4.ts b/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration4.ts index 498ad89d82..42622da3af 100644 --- a/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration4.ts +++ b/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration4.ts @@ -1,3 +1,4 @@ class C { [a: string]: number; public v: number -} \ No newline at end of file +} +let q28 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration6.ts b/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration6.ts index af180f585f..b89c199246 100644 --- a/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration6.ts +++ b/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration6.ts @@ -1,3 +1,4 @@ class C { static [x: string]: string; -} \ No newline at end of file +} +let q26 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/MemberVariableDeclarations/parserMemberVariableDeclaration5.ts b/tests/cases/conformance/parser/ecmascript5/MemberVariableDeclarations/parserMemberVariableDeclaration5.ts index 98c4f9a75b..62e5062755 100644 --- a/tests/cases/conformance/parser/ecmascript5/MemberVariableDeclarations/parserMemberVariableDeclaration5.ts +++ b/tests/cases/conformance/parser/ecmascript5/MemberVariableDeclarations/parserMemberVariableDeclaration5.ts @@ -1,3 +1,4 @@ class C { declare Foo; -} \ No newline at end of file +} +let q8 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Protected/Protected3.ts b/tests/cases/conformance/parser/ecmascript5/Protected/Protected3.ts index 2b07e1ca9a..765e7b650a 100644 --- a/tests/cases/conformance/parser/ecmascript5/Protected/Protected3.ts +++ b/tests/cases/conformance/parser/ecmascript5/Protected/Protected3.ts @@ -1,3 +1,4 @@ class C { protected constructor() { } -} \ No newline at end of file +} +let q37 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Protected/Protected5.ts b/tests/cases/conformance/parser/ecmascript5/Protected/Protected5.ts index f0bf235a03..c1d4944d1e 100644 --- a/tests/cases/conformance/parser/ecmascript5/Protected/Protected5.ts +++ b/tests/cases/conformance/parser/ecmascript5/Protected/Protected5.ts @@ -1,3 +1,4 @@ class C { protected static m() { } -} \ No newline at end of file +} +let q34 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Protected/Protected9.ts b/tests/cases/conformance/parser/ecmascript5/Protected/Protected9.ts index 4e24e28ec1..5ce2aa474a 100644 --- a/tests/cases/conformance/parser/ecmascript5/Protected/Protected9.ts +++ b/tests/cases/conformance/parser/ecmascript5/Protected/Protected9.ts @@ -1,3 +1,4 @@ class C { constructor(protected p) { } -} \ No newline at end of file +} +let q35 = new C(null); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509546.ts b/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509546.ts index bfb48ee0e3..29d488ffbc 100644 --- a/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509546.ts +++ b/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509546.ts @@ -1,3 +1,4 @@ export class Logger { public } +let q32 = new Logger(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509546_1.ts b/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509546_1.ts index bfb48ee0e3..18eeed1a6d 100644 --- a/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509546_1.ts +++ b/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509546_1.ts @@ -1,3 +1,4 @@ export class Logger { public } +let q31 = new Logger(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509546_2.ts b/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509546_2.ts index ca1a460120..a4609ba88c 100644 --- a/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509546_2.ts +++ b/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509546_2.ts @@ -3,3 +3,4 @@ export class Logger { public } +let q23 = new Logger(); \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/parserUnicode3.ts b/tests/cases/conformance/parser/ecmascript5/parserUnicode3.ts index bb5f00ea71..99802e72b5 100644 --- a/tests/cases/conformance/parser/ecmascript5/parserUnicode3.ts +++ b/tests/cases/conformance/parser/ecmascript5/parserUnicode3.ts @@ -1,2 +1,3 @@ class 剩下 { -} \ No newline at end of file +} +let q5 = new 剩下(); diff --git a/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement22.ts b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement22.ts new file mode 100644 index 0000000000..87f569dbfb --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement22.ts @@ -0,0 +1,4 @@ +// @target: esnext + +var async; +for (async of [1, 2]) {} diff --git a/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement23.ts b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement23.ts new file mode 100644 index 0000000000..5a3601380b --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement23.ts @@ -0,0 +1,6 @@ +// @target: esnext + +async function foo(x: any) { + var async; + for await (async of x) {} +} diff --git a/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement24.ts b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement24.ts new file mode 100644 index 0000000000..3846bd0a91 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement24.ts @@ -0,0 +1,4 @@ +// @target: esnext + +var async; +for ((async) of [1, 2]); diff --git a/tests/cases/conformance/salsa/inferringClassMembersFromAssignments3.ts b/tests/cases/conformance/salsa/inferringClassMembersFromAssignments3.ts index 800bd368db..f713920ad5 100644 --- a/tests/cases/conformance/salsa/inferringClassMembersFromAssignments3.ts +++ b/tests/cases/conformance/salsa/inferringClassMembersFromAssignments3.ts @@ -14,3 +14,4 @@ class Derived extends Base { this.p = 1 } } +let w1 = new Derived(); \ No newline at end of file diff --git a/tests/cases/conformance/salsa/plainJSBinderErrors.ts b/tests/cases/conformance/salsa/plainJSBinderErrors.ts new file mode 100644 index 0000000000..d2019e3f78 --- /dev/null +++ b/tests/cases/conformance/salsa/plainJSBinderErrors.ts @@ -0,0 +1,44 @@ +// @outdir: out/ +// @target: esnext +// @allowJS: true +// @filename: plainJSBinderErrors.js +export default 12 +export default 13 +const await = 1 +const yield = 2 +async function f() { + const await = 3 +} +function* g() { + const yield = 4 +} +class C { + #constructor = 5 + deleted() { + function container(f) { + delete f + } + var g = 6 + delete g + delete container + } + evalArguments() { + const eval = 7 + const arguments = 8 + } + withOctal() { + const redundant = 010 + with (redundant) { + return toFixed() + } + } + label() { + for(;;) { + label: var x = 1 + break label + } + return x + } +} +const eval = 9 +const arguments = 10 diff --git a/tests/cases/conformance/salsa/plainJSRedeclare.ts b/tests/cases/conformance/salsa/plainJSRedeclare.ts new file mode 100644 index 0000000000..be6831d0cd --- /dev/null +++ b/tests/cases/conformance/salsa/plainJSRedeclare.ts @@ -0,0 +1,6 @@ +// @outdir: out/ +// @allowJS: true +// @filename: plainJSRedeclare.js +const orbitol = 1 +var orbitol = 1 + false +orbitol.toExponential() diff --git a/tests/cases/conformance/salsa/plainJSRedeclare2.ts b/tests/cases/conformance/salsa/plainJSRedeclare2.ts new file mode 100644 index 0000000000..7409b6c8fe --- /dev/null +++ b/tests/cases/conformance/salsa/plainJSRedeclare2.ts @@ -0,0 +1,7 @@ +// @outdir: out/ +// @allowJS: true +// @checkJS: true +// @filename: plainJSRedeclare.js +const orbitol = 1 +var orbitol = 1 + false +orbitol.toExponential() diff --git a/tests/cases/conformance/salsa/plainJSRedeclare3.ts b/tests/cases/conformance/salsa/plainJSRedeclare3.ts new file mode 100644 index 0000000000..1327fcfc17 --- /dev/null +++ b/tests/cases/conformance/salsa/plainJSRedeclare3.ts @@ -0,0 +1,7 @@ +// @outdir: out/ +// @allowJS: true +// @checkJS: false +// @filename: plainJSRedeclare.js +const orbitol = 1 +var orbitol = 1 + false +orbitol.toExponential() diff --git a/tests/cases/conformance/salsa/plainJSReservedStrict.ts b/tests/cases/conformance/salsa/plainJSReservedStrict.ts new file mode 100644 index 0000000000..fbd654927d --- /dev/null +++ b/tests/cases/conformance/salsa/plainJSReservedStrict.ts @@ -0,0 +1,7 @@ +// @outdir: out/ +// @target: esnext +// @allowJS: true +// @filename: plainJSReservedStrict.js +"use strict" +const eval = 1 +const arguments = 2 diff --git a/tests/cases/conformance/salsa/spellingUncheckedJS.ts b/tests/cases/conformance/salsa/spellingUncheckedJS.ts new file mode 100644 index 0000000000..d5a1e8ac56 --- /dev/null +++ b/tests/cases/conformance/salsa/spellingUncheckedJS.ts @@ -0,0 +1,51 @@ +// @noEmit: true +// @allowJs: true +// @filename: spellingUncheckedJS.js +export var inModule = 1 +inmodule.toFixed() + +function f() { + var locals = 2 + true + locale.toFixed() + // @ts-expect-error + localf.toExponential() + // @ts-expect-error + "this is fine" +} +class Classe { + non = 'oui' + methode() { + // no error on 'this' references + return this.none + } +} +class Derivee extends Classe { + methode() { + // no error on 'super' references + return super.none + } +} + + +var object = { + spaaace: 3 +} +object.spaaaace // error on read +object.spaace = 12 // error on write +object.fresh = 12 // OK +other.puuuce // OK, from another file +new Date().getGMTDate() // OK, from another file + +// No suggestions for globals from other files +const atoc = setIntegral(() => console.log('ok'), 500) +AudioBuffin // etc +Jimmy +Jon + +// @filename: other.js +var Jimmy = 1 +var John = 2 +Jon // error, it's from the same file +var other = { + puuce: 4 +} diff --git a/tests/cases/conformance/salsa/typeFromJSInitializer2.ts b/tests/cases/conformance/salsa/typeFromJSInitializer2.ts new file mode 100644 index 0000000000..c1d5857624 --- /dev/null +++ b/tests/cases/conformance/salsa/typeFromJSInitializer2.ts @@ -0,0 +1,18 @@ +// @allowJs: true +// @checkJs: true +// @noEmit: true +// @strictNullChecks: true +// @noImplicitAny: true +// @Filename: a.js + +/** @type {() => undefined} */ +function f1() { + return undefined; +} +const a = f1() + +/** @type {() => null} */ +function f2() { + return null; +} +const b = f2() diff --git a/tests/cases/conformance/salsa/typeFromJSInitializer3.ts b/tests/cases/conformance/salsa/typeFromJSInitializer3.ts new file mode 100644 index 0000000000..c5100df43d --- /dev/null +++ b/tests/cases/conformance/salsa/typeFromJSInitializer3.ts @@ -0,0 +1,18 @@ +// @allowJs: true +// @checkJs: true +// @noEmit: true +// @strictNullChecks: false +// @noImplicitAny: true +// @Filename: a.js + +/** @type {() => undefined} */ +function f1() { + return undefined; +} +const a = f1() + +/** @type {() => null} */ +function f2() { + return null; +} +const b = f2() diff --git a/tests/cases/conformance/salsa/typeFromJSInitializer4.ts b/tests/cases/conformance/salsa/typeFromJSInitializer4.ts new file mode 100644 index 0000000000..02d16c45a2 --- /dev/null +++ b/tests/cases/conformance/salsa/typeFromJSInitializer4.ts @@ -0,0 +1,29 @@ +// @allowJs: true +// @checkJs: true +// @noEmit: true +// @strictNullChecks: false +// @noImplicitAny: true +// @Filename: a.js + +/** @type {number | undefined} */ +var n; + +// should get any on parameter initialisers +function f(a = null, b = n, l = []) { + // a should be any + a = undefined + a = null + a = 1 + a = true + a = {} + a = 'ok' + + // b should be number | undefined, not any + b = 1 + b = undefined + b = 'error' + + // l should be any[] + l.push(1) + l.push('ok') +} diff --git a/tests/cases/conformance/salsa/typeFromPropertyAssignment23.ts b/tests/cases/conformance/salsa/typeFromPropertyAssignment23.ts index 18923e0a5a..1dafa91c28 100644 --- a/tests/cases/conformance/salsa/typeFromPropertyAssignment23.ts +++ b/tests/cases/conformance/salsa/typeFromPropertyAssignment23.ts @@ -35,3 +35,6 @@ class NormalModule extends Module { return 0 } } +let cc = new C(); +let dd = new D(); +let mo = new NormalModule(); \ No newline at end of file diff --git a/tests/cases/conformance/statements/for-inStatements/for-inStatementsAsyncIdentifier.ts b/tests/cases/conformance/statements/for-inStatements/for-inStatementsAsyncIdentifier.ts new file mode 100644 index 0000000000..ae63dd3136 --- /dev/null +++ b/tests/cases/conformance/statements/for-inStatements/for-inStatementsAsyncIdentifier.ts @@ -0,0 +1,4 @@ +// @target: esnext + +var async; +for (async in { a: 1, b: 2 }) {} diff --git a/tests/cases/conformance/statements/returnStatements/returnStatements.ts b/tests/cases/conformance/statements/returnStatements/returnStatements.ts index ce764c1f11..945b98944c 100644 --- a/tests/cases/conformance/statements/returnStatements/returnStatements.ts +++ b/tests/cases/conformance/statements/returnStatements/returnStatements.ts @@ -21,3 +21,4 @@ function fn10(): I { return { id: 12 }; } function fn11(): I { return new C(); } function fn12(): C { return new D(); } function fn13(): C { return null; } +let q41 = new D(); \ No newline at end of file diff --git a/tests/cases/conformance/statements/throwStatements/throwInEnclosingStatements.ts b/tests/cases/conformance/statements/throwStatements/throwInEnclosingStatements.ts index c5875327b5..313b2b7169 100644 --- a/tests/cases/conformance/statements/throwStatements/throwInEnclosingStatements.ts +++ b/tests/cases/conformance/statements/throwStatements/throwInEnclosingStatements.ts @@ -45,3 +45,4 @@ var aa = { throw this; } } +let q42 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/any/anyAsGenericFunctionCall.ts b/tests/cases/conformance/types/any/anyAsGenericFunctionCall.ts index 9529b5b9a3..7996e18343 100644 --- a/tests/cases/conformance/types/any/anyAsGenericFunctionCall.ts +++ b/tests/cases/conformance/types/any/anyAsGenericFunctionCall.ts @@ -7,4 +7,6 @@ var b = x<string>('hello'); class C { foo: string; } var c = x<C>(x); -var d = x<any>(x); \ No newline at end of file +var d = x<any>(x); + +let c1 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/any/assignAnyToEveryType.ts b/tests/cases/conformance/types/any/assignAnyToEveryType.ts index 0af7d94d7b..aba7eb4753 100644 --- a/tests/cases/conformance/types/any/assignAnyToEveryType.ts +++ b/tests/cases/conformance/types/any/assignAnyToEveryType.ts @@ -42,4 +42,6 @@ M = x; function k<T>(a: T) { a = x; -} \ No newline at end of file +} + +let c1 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/any/assignEveryTypeToAny.ts b/tests/cases/conformance/types/any/assignEveryTypeToAny.ts index 8613550fc5..0f7f258e87 100644 --- a/tests/cases/conformance/types/any/assignEveryTypeToAny.ts +++ b/tests/cases/conformance/types/any/assignEveryTypeToAny.ts @@ -52,4 +52,6 @@ x = { f<T>(x: T) { return x; } } function j<T>(a: T) { x = a; -} \ No newline at end of file +} + +let c1 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/conditional/variance.ts b/tests/cases/conformance/types/conditional/variance.ts index 1dd5db5c67..433eab8e01 100644 --- a/tests/cases/conformance/types/conditional/variance.ts +++ b/tests/cases/conformance/types/conditional/variance.ts @@ -25,3 +25,5 @@ class Bar<T extends string> { Bar.instance.push(this); } } + +let ba = new Bar(); diff --git a/tests/cases/conformance/types/contextualTypes/partiallyAnnotatedFunction/partiallyAnnotatedFunctionInferenceWithTypeParameter.ts b/tests/cases/conformance/types/contextualTypes/partiallyAnnotatedFunction/partiallyAnnotatedFunctionInferenceWithTypeParameter.ts index 530d506f64..87069a602d 100644 --- a/tests/cases/conformance/types/contextualTypes/partiallyAnnotatedFunction/partiallyAnnotatedFunctionInferenceWithTypeParameter.ts +++ b/tests/cases/conformance/types/contextualTypes/partiallyAnnotatedFunction/partiallyAnnotatedFunctionInferenceWithTypeParameter.ts @@ -31,3 +31,6 @@ testRest((t1: D, t2, t3) => {}) testRest((t1, t2: D, t3) => {}) testRest((t2: D, ...t3) => {}) testRest((t2, ...t3: D[]) => {}) + + +let d = new D(); diff --git a/tests/cases/conformance/types/import/importTypeAmbient.ts b/tests/cases/conformance/types/import/importTypeAmbient.ts index b1ba463777..3345c3ac06 100644 --- a/tests/cases/conformance/types/import/importTypeAmbient.ts +++ b/tests/cases/conformance/types/import/importTypeAmbient.ts @@ -28,8 +28,8 @@ declare module "foo2" { item: Bar.I; constructor(input: Baz.J); } + } - let y: import("foo2").Bar.I = { a: "", b: 0 }; class Bar2 { @@ -40,3 +40,6 @@ class Bar2 { let shim: typeof import("foo2") = { Bar: Bar2 }; + +var a; +let ba1 = new Bar2(a); diff --git a/tests/cases/conformance/types/import/importTypeGenericTypes.ts b/tests/cases/conformance/types/import/importTypeGenericTypes.ts index 5bc3aa7802..cf808fc6e3 100644 --- a/tests/cases/conformance/types/import/importTypeGenericTypes.ts +++ b/tests/cases/conformance/types/import/importTypeGenericTypes.ts @@ -29,9 +29,10 @@ class Bar<T> { item: Bar.I<T>; constructor(input: Baz.J<T>) {} } +let bbb = new Bar(null); export { Bar } -// @filename: usage.ts +// @filename: usage. export const x: import("./foo")<{x: number}> = { x: 0, y: 0, data: {x: 12} }; export let y: import("./foo2").Bar.I<{x: number}> = { a: "", b: 0, data: {x: 12} }; @@ -43,3 +44,5 @@ export class Bar2<T> { export let shim: typeof import("./foo2") = { Bar: Bar2 }; + +let ba2 = new Bar2(1); diff --git a/tests/cases/conformance/types/import/importTypeLocal.ts b/tests/cases/conformance/types/import/importTypeLocal.ts index 4f29a22285..6fe5ab1c18 100644 --- a/tests/cases/conformance/types/import/importTypeLocal.ts +++ b/tests/cases/conformance/types/import/importTypeLocal.ts @@ -26,8 +26,11 @@ class Bar { item: Bar.I; constructor(input: Baz.J) {} } +let bbb = new Bar(null) export { Bar } + + // @filename: usage.ts export const x: import("./foo") = { x: 0, y: 0 }; export let y: import("./foo2").Bar.I = { a: "", b: 0 }; @@ -40,3 +43,5 @@ export class Bar2 { export let shim: typeof import("./foo2") = { Bar: Bar2 }; + +let ba2 = new Bar2(); \ No newline at end of file diff --git a/tests/cases/conformance/types/intersection/intersectionOfUnionNarrowing.ts b/tests/cases/conformance/types/intersection/intersectionOfUnionNarrowing.ts new file mode 100644 index 0000000000..0f67b66bff --- /dev/null +++ b/tests/cases/conformance/types/intersection/intersectionOfUnionNarrowing.ts @@ -0,0 +1,16 @@ +// @strict: true + +interface X { + a?: { aProp: string }; + b?: { bProp: string }; +} +type AorB = { a: object; b: undefined } | { a: undefined; b: object }; + +declare const q: X & AorB; + +if (q.a !== undefined) { + q.a.aProp; +} else { + // q.b is previously incorrectly inferred as potentially undefined + q.b.bProp; +} diff --git a/tests/cases/conformance/types/keyof/keyofAndIndexedAccess.ts b/tests/cases/conformance/types/keyof/keyofAndIndexedAccess.ts index 56ff157a67..7c7d0b13e0 100644 --- a/tests/cases/conformance/types/keyof/keyofAndIndexedAccess.ts +++ b/tests/cases/conformance/types/keyof/keyofAndIndexedAccess.ts @@ -658,3 +658,23 @@ const cf2 = <T extends { [P in K | "cool"]: string; }, K extends keyof T>(t: T, const s: string = t[k]; t.cool; }; + +let shape = new Shape(); +let ta1 = new TaggedShape(); +let it = new Item(); +let op = new Options(); +let com1 = new Component(); +let c11 = new C(); +let c12 = new C1(); +let ba1 = new Base(); +let per = new Person(1); +let oth = new OtherPerson(1); +var aa; +let com2 = new Component1(aa); +let com3 = new Component2(aa); +let a11 = new A(); +let b11 = new B(); +let fo = new Form(); +let sam = new SampleClass(1); +let ano = new AnotherSampleClass(1); +let unb = new Unbounded(); diff --git a/tests/cases/conformance/types/literal/literalTypes2.ts b/tests/cases/conformance/types/literal/literalTypes2.ts index 57e7a0bc74..46b1479857 100644 --- a/tests/cases/conformance/types/literal/literalTypes2.ts +++ b/tests/cases/conformance/types/literal/literalTypes2.ts @@ -176,3 +176,6 @@ type Bit = 0 | 1; let aa = makeArray<Bit>(0); aa = append(aa, 1); + +let c1 = new C1(); +let c2 = new C2(); diff --git a/tests/cases/conformance/types/localTypes/localTypes2.ts b/tests/cases/conformance/types/localTypes/localTypes2.ts index 79f1402c70..2b81f903ac 100644 --- a/tests/cases/conformance/types/localTypes/localTypes2.ts +++ b/tests/cases/conformance/types/localTypes/localTypes2.ts @@ -3,6 +3,7 @@ function f1() { class C { constructor(public x: number, public y: number) { } } + let c = new C(1,2); return C; } let C = f(); @@ -17,6 +18,7 @@ function f2() { public x = x; constructor(public y: number) { } } + let c = new C(1); return C; } let C = f(10); @@ -31,6 +33,7 @@ function f3() { public x = x; public y = y; } + let c = new C(); return C; } let C = f(10, 20); diff --git a/tests/cases/conformance/types/localTypes/localTypes3.ts b/tests/cases/conformance/types/localTypes/localTypes3.ts index 5eb3cf2850..7b1e536270 100644 --- a/tests/cases/conformance/types/localTypes/localTypes3.ts +++ b/tests/cases/conformance/types/localTypes/localTypes3.ts @@ -3,6 +3,7 @@ function f1() { class C<X, Y> { constructor(public x: X, public y: Y) { } } + let c = new C(1,2); return C; } let C = f(); @@ -17,6 +18,7 @@ function f2() { public x = x; constructor(public y: Y) { } } + let c = new C(1); return C; } let C = f(10); @@ -31,6 +33,7 @@ function f3() { public x = x; public y = y; } + let c = new C(); return C; } let C = f(10, "hello"); diff --git a/tests/cases/conformance/types/mapped/mappedTypeAsClauseRelationships.ts b/tests/cases/conformance/types/mapped/mappedTypeAsClauseRelationships.ts new file mode 100644 index 0000000000..051192159e --- /dev/null +++ b/tests/cases/conformance/types/mapped/mappedTypeAsClauseRelationships.ts @@ -0,0 +1,27 @@ +// From original issue #45212: +type Methods<T> = { [P in keyof T as T[P] extends Function ? P : never]: T[P] }; +type H<T> = T[keyof Methods<T>]; // Ok + +// `Filter<T>` only filters out some keys of `T`. +type Filter<T> = { [P in keyof T as T[P] extends Function ? P : never]: T[P] }; +// `Modify<T>` might modify some keys of `T`. +type Modify<T> = { [P in keyof T as P extends string? `bool${P}`: P]: T[P] }; + +function fun<T>(val: T) { + let x: Filter<T> = val; // Ok + let y: Modify<T> = val; // Error +} + +type FilterInclOpt<T> = { [P in keyof T as T[P] extends Function ? P : never]+?: T[P] }; +type ModifyInclOpt<T> = { [P in keyof T as P extends string? `bool${P}`: never ]+?: T[P] }; +type FilterExclOpt<T> = { [P in keyof T as T[P] extends Function ? P : never]-?: T[P] }; +type ModifyExclOpt<T> = { [P in keyof T as P extends string? `bool${P}`: never ]-?: T[P] }; + +function fun2<T>(val: T) { + let x: FilterInclOpt<T> = val; // Ok + let y: ModifyInclOpt<T> = val; // Ok + let z: FilterExclOpt<T> = val; // Error + let w: ModifyExclOpt<T> = val; // Error +} + + diff --git a/tests/cases/conformance/types/mapped/mappedTypeProperties.ts b/tests/cases/conformance/types/mapped/mappedTypeProperties.ts new file mode 100644 index 0000000000..407e0eaf56 --- /dev/null +++ b/tests/cases/conformance/types/mapped/mappedTypeProperties.ts @@ -0,0 +1,42 @@ +// @declaration: true +export type PlaceType = 'openSky' | 'roofed' | 'garage' +type Before = { + model: 'hour' | 'day'; + [placeType in PlaceType]: void; +} + +type After = { + [placeType in PlaceType]: void; + model: 'hour' | 'day' +} + +type AfterQuestion = { + [placeType in PlaceType]?: void; + model: 'hour' | 'day'; +} +type AfterMethod = { + [placeType in PlaceType]?: void; + model(duration: number): 'hour' | 'day'; +} + +type AfterImplicit = { + [placeType in PlaceType] + model: 'hour' | 'day'; +} +type AfterImplicitQ = { + [placeType in PlaceType]? + model: 'hour' | 'day' +} + +interface I { + [P in PlaceType]: any +} +class C { + [P in PlaceType]: any +} +const D = class { + [P in PlaceType]: any +} +const E = class { + [P in 'a' | 'b']: any +} diff --git a/tests/cases/conformance/types/mapped/mappedTypes3.ts b/tests/cases/conformance/types/mapped/mappedTypes3.ts index bf5a4399b0..6ef1918898 100644 --- a/tests/cases/conformance/types/mapped/mappedTypes3.ts +++ b/tests/cases/conformance/types/mapped/mappedTypes3.ts @@ -37,4 +37,6 @@ function f3(bb: BoxifiedBacon) { let b = unboxify<Bacon>(bb); // Explicit type parameter required let bool = b.isPerfect; let weight = bb.weight; -} \ No newline at end of file +} + +let box = new Box(); \ No newline at end of file diff --git a/tests/cases/conformance/types/mapped/mappedTypesAndObjects.ts b/tests/cases/conformance/types/mapped/mappedTypesAndObjects.ts index b3530b4696..66e25c6091 100644 --- a/tests/cases/conformance/types/mapped/mappedTypesAndObjects.ts +++ b/tests/cases/conformance/types/mapped/mappedTypesAndObjects.ts @@ -43,3 +43,5 @@ interface E3<T> extends Base { class Form<T> { private values: {[P in keyof T]?: T[P]} = {} } + +let f = new Form(); \ No newline at end of file diff --git a/tests/cases/conformance/types/members/classWithProtectedProperty.ts b/tests/cases/conformance/types/members/classWithProtectedProperty.ts index 96bc615c02..a37828eef1 100644 --- a/tests/cases/conformance/types/members/classWithProtectedProperty.ts +++ b/tests/cases/conformance/types/members/classWithProtectedProperty.ts @@ -24,4 +24,6 @@ class D extends C { var r7: string = C.f(); var r8: string = C.g(); } -} \ No newline at end of file +} + +let d = new D(); \ No newline at end of file diff --git a/tests/cases/conformance/types/members/indexSignatures1.ts b/tests/cases/conformance/types/members/indexSignatures1.ts new file mode 100644 index 0000000000..f888275683 --- /dev/null +++ b/tests/cases/conformance/types/members/indexSignatures1.ts @@ -0,0 +1,325 @@ +// @strict: true +// @declaration: true +// @target: esnext + +// Symbol index signature checking + +const sym = Symbol(); + +function gg3(x: { [key: string]: string }, y: { [key: symbol]: string }, z: { [sym]: number }) { + x = z; + y = z; // Error +} + +// Overlapping index signatures + +function gg1(x: { [key: `a${string}`]: string, [key: `${string}a`]: string }, y: { [key: `a${string}a`]: string }) { + x = y; + y = x; +} + +interface IX { [key: `a${string}`]: string, [key: `${string}a`]: string } +interface IY { [key: `a${string}a`]: string } + +function gg2(x: IX, y: IY) { + x = y; // Error + y = x; +} + +// Intersection of multiple applicable index signatures + +declare let combo: { [x: `foo-${string}`]: 'a' | 'b' } & { [x: `${string}-bar`]: 'b' | 'c' }; +const x1 = combo['foo-test']; // 'a' | 'b' +const x2 = combo['test-bar']; // 'b' | 'c' +const x3 = combo['foo-test-bar']; // 'b' (('a' | 'b') & ('b' | 'c')) + +declare var str: string; + +const x4 = combo[`foo-${str}`]; +const x5 = combo[`${str}-bar`]; +const x6 = combo[`foo-${str}-bar`]; + +declare let combo2: { [x: `${string}xxx${string}` & `${string}yyy${string}`]: string }; + +const x7 = combo2['axxxbyyyc']; +const x8 = combo2['ayyyxxxbc']; +const x9 = combo2['axxxbbbyc']; // Error + +// Property access on template pattern index signature + +declare let dom: { [x: `data${string}`]: string }; +const y1 = dom['data123']; +const y2 = dom.data123; + +// Excess property checking for template pattern index signature + +dom = { data123: 'hello' }; +dom = { date123: 'hello' }; // Error + +// Contextual typing by index signature with template literal pattern + +type Funcs = { + [key: `s${string}`]: (x: string) => void, + [key: `n${string}`]: (x: number) => void, +} + +const funcs: Funcs = { + sfoo: x => x.length, // x: string + nfoo: x => x * 2, // n: number +} + +// Duplicate index signature checking + +type Duplicates = { + [key: string | number]: any; // Error + [key: number | symbol]: any; // Error + [key: symbol | `foo${string}`]: any; // Error + [key: `foo${string}`]: any; // Error +} + +// Conflicting index signature checking + +type Conflicting = { + [key: `a${string}`]: 'a'; + [key: `${string}a`]: 'b'; + [key: `a${string}a`]: 'c'; // Error +} + +// Invalid index signatures + +type Invalid<T extends string> = { + [key: 'a' | 'b' | 'c']: string; // Error + [key: T | number]: string; // Error + [key: Error]: string; // Error + [key: T & string]: string; // Error +} + +// Intersections in index signatures + +type Tag1 = { __tag1__: void }; +type Tag2 = { __tag2__: void }; + +type TaggedString1 = string & Tag1; +type TaggedString2 = string & Tag2; + +declare let s0: string; +declare let s1: TaggedString1; +declare let s2: TaggedString2; +declare let s3: TaggedString1 | TaggedString2; +declare let s4: TaggedString1 & TaggedString2; + +interface I1 { [key: TaggedString1]: string } +interface I2 { [key: TaggedString2]: string } +interface I3 { [key: TaggedString1 | TaggedString2]: string } +interface I4 { [key: TaggedString1 & TaggedString2]: string } + +declare let i1: I1; +declare let i2: I2; +declare let i3: I3; +declare let i4: I4; + +i1[s0]; // Error +i1[s1]; +i1[s2]; // Error +i1[s3]; // Error +i1[s4]; + +i2[s0]; // Error +i2[s1]; // Error +i2[s2]; +i2[s3]; // Error +i2[s4]; + +i3[s0]; // Error +i3[s1]; +i3[s2]; +i3[s3]; +i3[s4]; + +i4[s0]; // Error +i4[s1]; // Error +i4[s2]; // Error +i4[s3]; // Error +i4[s4]; + +i1 = i2; // Error +i1 = i3; +i1 = i4; // Error + +i2 = i1; // Error +i2 = i3; +i2 = i4; // Error + +i3 = i1; // Error +i3 = i2; // Error +i3 = i4; // Error + +i4 = i1; +i4 = i2; +i4 = i3; + +declare let o1: { [key: TaggedString1]: string }; +declare let o2: { [key: TaggedString2]: string }; +declare let o3: { [key: TaggedString1 | TaggedString2]: string }; +declare let o4: { [key: TaggedString1 & TaggedString2]: string }; + +o1[s0]; // Error +o1[s1]; +o1[s2]; // Error +o1[s3]; // Error +o1[s4]; + +o2[s0]; // Error +o2[s1]; // Error +o2[s2]; +o2[s3]; // Error +o2[s4]; + +o3[s0]; // Error +o3[s1]; +o3[s2]; +o3[s3]; +o3[s4]; + +o4[s0]; // Error +o4[s1]; // Error +o4[s2]; // Error +o4[s3]; // Error +o4[s4]; + +o1 = o2; +o1 = o3; +o1 = o4; + +o2 = o1; +o2 = o3; +o2 = o4; + +o3 = o1; +o3 = o2; +o3 = o4; + +o4 = o1; +o4 = o2; +o4 = o3; + +// Index signatures inferred from computed property names + +const obj10 = { + ['x']: 0 as const, + ['a' + 'b']: 1 as const, +}; + +const obj11 = { + [1]: 2 as const, + [1 + 2]: 3 as const, +}; + +const obj12 = { + [sym]: 4 as const, + [Symbol()]: 5 as const, +}; + +const obj13 = { + ['x']: 0 as const, + ['a' + 'b']: 1 as const, + [1]: 2 as const, + [1 + 2]: 3 as const, + [sym]: 4 as const, + [Symbol()]: 5 as const, +}; + +// Repros from #1863 + +const system = Symbol('system'); +const SomeSytePlugin = Symbol('SomeSytePlugin'); + +interface Plugs { + [key: symbol]: (...args: any) => unknown; +} + +const plugins = { + "user": {} as Plugs, + [system]: {} as Plugs +}; + +plugins[system][SomeSytePlugin] = () => console.log('awsome'); +plugins[system][SomeSytePlugin](); + +var theAnswer: symbol = Symbol('secret'); +var obj = {} as Record<symbol, number>; +obj[theAnswer] = 42; + +// Repro from #26470 + +const directive = Symbol('directive'); +declare function foo<TArg, TRet, TDir>(options: { [x in string]: (arg: TArg) => TRet } & { [directive]?: TDir }): void; + +let case1 = foo({ + [directive]: (x: string) => 'str', + addOne: (x: number) => x + 1, + double: (x: number) => x + x, +}); + +let case2 = foo({ + addOne: (x: number) => x + 1, + double: (x: number) => x + x, + [directive]: (x: string) => 'str', +}); + +let case3 = foo({ + [directive]: 'str', + addOne: (x: number) => x + 1, + double: (x: number) => x + x, +}); + +// Repros from #42192 + +type Pseudo = `&:${string}`; + +const AmIPseudo1: Pseudo = '&:test'; +const AmIPseudo: Pseudo = '&'; // Error + +type PseudoDeclaration = { [key in Pseudo]: string }; + +const test: PseudoDeclaration = { 'someKey' : 'someValue' }; // Error + +type FieldPattern = `/${string}`; + +const path1: FieldPattern = '/one'; +const path2: FieldPattern = 'two'; // Error + +type PathsObject = { [P in FieldPattern]: object; }; +const pathObject: PathsObject = 123; // Error + +type IdType = `${number}-${number}-${number}-${number}` +const id: IdType = '0000-0000-0000-0001'; + +type A = Record<IdType, string>; + +const a: A = { [id]: 'test' } + +let aid = a[id]; + +// Repro from #44793 + +interface AA { + a?: string; + b?: number; + [key: symbol]: string; +} + +const aa: AA = { [sym]: '123' }; + +const obj1: { [key: symbol]: string } = { [sym]: 'hello '}; +const obj2: { [key: string]: string } = { [sym]: 'hello '}; // Permitted for backwards compatibility +const obj3: { [key: number]: string } = { [sym]: 'hello '}; // Error + +// Repro from #45772 + +type Id = string & { __tag: 'id '}; +type Rec1 = { [key: Id]: number }; +type Rec2 = Record<Id, number>; + +type K1 = keyof Rec1; // Id +type K2 = keyof Rec2; // Id diff --git a/tests/cases/conformance/types/members/objectTypeHidingMembersOfObject.ts b/tests/cases/conformance/types/members/objectTypeHidingMembersOfObject.ts index 1a7d6f2be4..bc489541ae 100644 --- a/tests/cases/conformance/types/members/objectTypeHidingMembersOfObject.ts +++ b/tests/cases/conformance/types/members/objectTypeHidingMembersOfObject.ts @@ -24,4 +24,6 @@ var b: { valueOf(): void; } -var r4: void = b.valueOf(); \ No newline at end of file +var r4: void = b.valueOf(); + +let c1 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/members/objectTypePropertyAccess.ts b/tests/cases/conformance/types/members/objectTypePropertyAccess.ts index a54890fce9..e3c2cca547 100644 --- a/tests/cases/conformance/types/members/objectTypePropertyAccess.ts +++ b/tests/cases/conformance/types/members/objectTypePropertyAccess.ts @@ -26,3 +26,5 @@ var r8 = a.toString(); var r9 = a['toString'](); var r10 = a.foo; var r11 = a['foo']; + +let c1 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/members/objectTypeWithNumericProperty.ts b/tests/cases/conformance/types/members/objectTypeWithNumericProperty.ts index 730ab43ec9..2c1b46b5d1 100644 --- a/tests/cases/conformance/types/members/objectTypeWithNumericProperty.ts +++ b/tests/cases/conformance/types/members/objectTypeWithNumericProperty.ts @@ -40,4 +40,6 @@ var b = { var r1 = b[1]; var r2 = b[1.1]; var r3 = b['1']; -var r4 = b['1.1']; \ No newline at end of file +var r4 = b['1.1']; + +let c1 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/members/objectTypeWithStringNamedPropertyOfIllegalCharacters.ts b/tests/cases/conformance/types/members/objectTypeWithStringNamedPropertyOfIllegalCharacters.ts index 766f56bdd2..d67c011129 100644 --- a/tests/cases/conformance/types/members/objectTypeWithStringNamedPropertyOfIllegalCharacters.ts +++ b/tests/cases/conformance/types/members/objectTypeWithStringNamedPropertyOfIllegalCharacters.ts @@ -50,3 +50,5 @@ var r2 = b[" "]; var r3 = b["a b"]; // BUG 817263 var r4 = b["~!@#$%^&*()_+{}|:'<>?\/.,`"]; + +let c1 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/members/typesWithSpecializedCallSignatures.ts b/tests/cases/conformance/types/members/typesWithSpecializedCallSignatures.ts index 9eef3476f2..9aea8f6a18 100644 --- a/tests/cases/conformance/types/members/typesWithSpecializedCallSignatures.ts +++ b/tests/cases/conformance/types/members/typesWithSpecializedCallSignatures.ts @@ -38,4 +38,7 @@ a = i; var r1: Derived1 = c.foo('hi'); var r2: Derived2 = c.foo('bye'); -var r3: Base = c.foo('hm'); \ No newline at end of file +var r3: Base = c.foo('hm'); + +// let dev1 = new Derived1(); +// let dev2 = new Derived2(); \ No newline at end of file diff --git a/tests/cases/conformance/types/members/typesWithSpecializedConstructSignatures.ts b/tests/cases/conformance/types/members/typesWithSpecializedConstructSignatures.ts index 7c84e76f14..522fad55bf 100644 --- a/tests/cases/conformance/types/members/typesWithSpecializedConstructSignatures.ts +++ b/tests/cases/conformance/types/members/typesWithSpecializedConstructSignatures.ts @@ -36,4 +36,7 @@ a = i; var r1 = new C('hi'); var r2: Derived2 = new i('bye'); -var r3: Base = new a('hm'); \ No newline at end of file +var r3: Base = new a('hm'); + +let dev1 = new Derived1(); +let dev2 = new Derived2(); \ No newline at end of file diff --git a/tests/cases/conformance/types/namedTypes/classWithOptionalParameter.ts b/tests/cases/conformance/types/namedTypes/classWithOptionalParameter.ts index 82e7de4584..97001142ae 100644 --- a/tests/cases/conformance/types/namedTypes/classWithOptionalParameter.ts +++ b/tests/cases/conformance/types/namedTypes/classWithOptionalParameter.ts @@ -8,4 +8,7 @@ class C { class C2<T> { x?: T; f?(x: T) {} -} \ No newline at end of file +} + +let c = new C(); +let c2 = new C2(); \ No newline at end of file diff --git a/tests/cases/conformance/types/namedTypes/optionalMethods.ts b/tests/cases/conformance/types/namedTypes/optionalMethods.ts index 932521425f..dc7fe5cf4c 100644 --- a/tests/cases/conformance/types/namedTypes/optionalMethods.ts +++ b/tests/cases/conformance/types/namedTypes/optionalMethods.ts @@ -56,3 +56,6 @@ class Derived extends Base { a = 1; f(): number { return 1; } } + +let ba1 = new Bar(); +let dev = new Derived(); diff --git a/tests/cases/conformance/types/never/neverType.ts b/tests/cases/conformance/types/never/neverType.ts index d58471d62a..e548194630 100644 --- a/tests/cases/conformance/types/never/neverType.ts +++ b/tests/cases/conformance/types/never/neverType.ts @@ -91,3 +91,5 @@ test(() => "hello"); test(() => fail()); test(() => { throw new Error(); }) test(errorCallback); + +let c1 = new C(); diff --git a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignatureWithoutReturnTypeAnnotationInference.ts b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignatureWithoutReturnTypeAnnotationInference.ts index 1cc499c7d6..16fe9f1bc5 100644 --- a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignatureWithoutReturnTypeAnnotationInference.ts +++ b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignatureWithoutReturnTypeAnnotationInference.ts @@ -77,6 +77,7 @@ module M { export var x = 1; export class C { foo: string } } +let c2 = new M.C(); function foo11() { return M; } @@ -119,4 +120,7 @@ module e1 { export var y = 1; } function foo15() { return e1; } -var r15 = foo15(); \ No newline at end of file +var r15 = foo15(); + +let c = new C(); +let c11 = new c1(1); diff --git a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignaturesWithDuplicateParameters.ts b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignaturesWithDuplicateParameters.ts index d5ff0c1f56..191117eb92 100644 --- a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignaturesWithDuplicateParameters.ts +++ b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignaturesWithDuplicateParameters.ts @@ -35,4 +35,6 @@ var b = { foo(x, x) { }, a: function foo(x: number, x: string) { }, b: <T>(x: T, x: T) => { } -} \ No newline at end of file +} + +let c1 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignaturesWithOptionalParameters.ts b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignaturesWithOptionalParameters.ts index 34edfba671..d285c45d78 100644 --- a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignaturesWithOptionalParameters.ts +++ b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignaturesWithOptionalParameters.ts @@ -52,3 +52,5 @@ b.a(1); b.a(1, 2); b.b(); b.b(1); + +let c1 = new C(); diff --git a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignaturesWithOptionalParameters2.ts b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignaturesWithOptionalParameters2.ts index 4f31726f82..bdd01987b0 100644 --- a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignaturesWithOptionalParameters2.ts +++ b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignaturesWithOptionalParameters2.ts @@ -56,4 +56,6 @@ a(1); a(1, 2); a.foo(1); a.foo(1, 2); -a.foo(1, 2, 3); \ No newline at end of file +a.foo(1, 2, 3); + +let c1 = new C(); diff --git a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/parametersWithNoAnnotationAreAny.ts b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/parametersWithNoAnnotationAreAny.ts index 432c905765..4c09ab1066 100644 --- a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/parametersWithNoAnnotationAreAny.ts +++ b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/parametersWithNoAnnotationAreAny.ts @@ -26,4 +26,6 @@ var b = { return x; }, b: (x) => x -} \ No newline at end of file +} + +let c1 = new C(); diff --git a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/specializedSignatureIsNotSubtypeOfNonSpecializedSignature.ts b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/specializedSignatureIsNotSubtypeOfNonSpecializedSignature.ts index 01f33fbd7b..0aeddb657c 100644 --- a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/specializedSignatureIsNotSubtypeOfNonSpecializedSignature.ts +++ b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/specializedSignatureIsNotSubtypeOfNonSpecializedSignature.ts @@ -62,3 +62,6 @@ var a3: { foo(x: 'a'); foo<T extends String>(x: T); } +let c1 = new C(); +let c2 = new C2(); +let c3 = new C3(); diff --git a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/specializedSignatureIsSubtypeOfNonSpecializedSignature.ts b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/specializedSignatureIsSubtypeOfNonSpecializedSignature.ts index 70735b8edd..06ca07fbe8 100644 --- a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/specializedSignatureIsSubtypeOfNonSpecializedSignature.ts +++ b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/specializedSignatureIsSubtypeOfNonSpecializedSignature.ts @@ -78,3 +78,6 @@ var a3: { foo(x: 'a'); foo<T extends String>(x: T); } +let c1 = new C(); +let c2 = new C2(); +let c3 = new C3(); \ No newline at end of file diff --git a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/stringLiteralTypesInImplementationSignatures.ts b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/stringLiteralTypesInImplementationSignatures.ts index a8bf323850..6ea1c88cfb 100644 --- a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/stringLiteralTypesInImplementationSignatures.ts +++ b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/stringLiteralTypesInImplementationSignatures.ts @@ -23,3 +23,5 @@ var b = { a: function foo(x: 'hi', y: 'hi') { }, b: (x: 'hi') => { } } + +let c1 = new C(); diff --git a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/typeParameterAsTypeArgument.ts b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/typeParameterAsTypeArgument.ts index ef33eef5d5..5e87397a9e 100644 --- a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/typeParameterAsTypeArgument.ts +++ b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/typeParameterAsTypeArgument.ts @@ -24,4 +24,6 @@ interface I<T, U> { //interface I<T, U extends T> { // x: C<U, T>; -//} +//} + +let c1 = new C(); diff --git a/tests/cases/conformance/types/objectTypeLiteral/constructSignatures/constructSignaturesWithOverloadsThatDifferOnlyByReturnType.ts b/tests/cases/conformance/types/objectTypeLiteral/constructSignatures/constructSignaturesWithOverloadsThatDifferOnlyByReturnType.ts index 4ac60bd7f7..9a462477de 100644 --- a/tests/cases/conformance/types/objectTypeLiteral/constructSignatures/constructSignaturesWithOverloadsThatDifferOnlyByReturnType.ts +++ b/tests/cases/conformance/types/objectTypeLiteral/constructSignatures/constructSignaturesWithOverloadsThatDifferOnlyByReturnType.ts @@ -29,4 +29,7 @@ var a: { var b: { new <T>(x: T, y: string): C2<T>; new <T>(x: T, y: string): C; // error -} \ No newline at end of file +} + +let c1 = new C(1); +let c2 = new C2(1); \ No newline at end of file diff --git a/tests/cases/conformance/types/objectTypeLiteral/indexSignatures/numericIndexingResults.ts b/tests/cases/conformance/types/objectTypeLiteral/indexSignatures/numericIndexingResults.ts index 3d7b7eba45..4af4aba5a9 100644 --- a/tests/cases/conformance/types/objectTypeLiteral/indexSignatures/numericIndexingResults.ts +++ b/tests/cases/conformance/types/objectTypeLiteral/indexSignatures/numericIndexingResults.ts @@ -53,4 +53,6 @@ var r2b = b2['2']; var r3 = b2['3']; var r4 = b2[1]; var r5 = b2[2]; -var r6 = b2[3]; \ No newline at end of file +var r6 = b2[3]; + +let c1 = new C(); diff --git a/tests/cases/conformance/types/objectTypeLiteral/indexSignatures/stringIndexingResults.ts b/tests/cases/conformance/types/objectTypeLiteral/indexSignatures/stringIndexingResults.ts index f51b8e461e..48ccea819f 100644 --- a/tests/cases/conformance/types/objectTypeLiteral/indexSignatures/stringIndexingResults.ts +++ b/tests/cases/conformance/types/objectTypeLiteral/indexSignatures/stringIndexingResults.ts @@ -32,3 +32,5 @@ var b: { [x: string]: string } = { y: '' } var r10 = b['y']; var r11 = b['a']; var r12 = b[1]; + +let c1 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/objectTypeLiteral/propertySignatures/propertyNameWithoutTypeAnnotation.ts b/tests/cases/conformance/types/objectTypeLiteral/propertySignatures/propertyNameWithoutTypeAnnotation.ts index 42f42eb312..ce53505fda 100644 --- a/tests/cases/conformance/types/objectTypeLiteral/propertySignatures/propertyNameWithoutTypeAnnotation.ts +++ b/tests/cases/conformance/types/objectTypeLiteral/propertySignatures/propertyNameWithoutTypeAnnotation.ts @@ -18,4 +18,6 @@ var b = { var r1 = (new C()).foo; var r2 = (<I>null).foo; var r3 = a.foo; -var r4 = b.foo; \ No newline at end of file +var r4 = b.foo; + +let c1 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/objectTypeLiteral/propertySignatures/propertyNamesOfReservedWords.ts b/tests/cases/conformance/types/objectTypeLiteral/propertySignatures/propertyNamesOfReservedWords.ts index 6673465381..e8589921f5 100644 --- a/tests/cases/conformance/types/objectTypeLiteral/propertySignatures/propertyNamesOfReservedWords.ts +++ b/tests/cases/conformance/types/objectTypeLiteral/propertySignatures/propertyNamesOfReservedWords.ts @@ -273,4 +273,6 @@ enum E { } var r7 = E.abstract; -var r8 = E.as; \ No newline at end of file +var r8 = E.as; + +let c1 = new C(); diff --git a/tests/cases/conformance/types/objectTypeLiteral/propertySignatures/stringNamedPropertyAccess.ts b/tests/cases/conformance/types/objectTypeLiteral/propertySignatures/stringNamedPropertyAccess.ts index dbea999036..9c6eea5968 100644 --- a/tests/cases/conformance/types/objectTypeLiteral/propertySignatures/stringNamedPropertyAccess.ts +++ b/tests/cases/conformance/types/objectTypeLiteral/propertySignatures/stringNamedPropertyAccess.ts @@ -20,4 +20,6 @@ var r3 = a["a b"]; var b = { "a b": 1 } -var r4 = b["a b"]; \ No newline at end of file +var r4 = b["a b"]; + +let c1 = new C(); diff --git a/tests/cases/conformance/types/primitives/number/extendNumberInterface.ts b/tests/cases/conformance/types/primitives/number/extendNumberInterface.ts index 6aa6325ee3..68641deedd 100644 --- a/tests/cases/conformance/types/primitives/number/extendNumberInterface.ts +++ b/tests/cases/conformance/types/primitives/number/extendNumberInterface.ts @@ -7,4 +7,4 @@ var x = 1; var a: string = x.doStuff(); var b: string = x.doOtherStuff('hm'); var c: string = x['doStuff'](); -var d: string = x['doOtherStuff']('hm'); \ No newline at end of file +var d: string = x['doOtherStuff']('hm'); diff --git a/tests/cases/conformance/types/primitives/undefined/invalidUndefinedValues.ts b/tests/cases/conformance/types/primitives/undefined/invalidUndefinedValues.ts index 58a5a54386..572d96843f 100644 --- a/tests/cases/conformance/types/primitives/undefined/invalidUndefinedValues.ts +++ b/tests/cases/conformance/types/primitives/undefined/invalidUndefinedValues.ts @@ -28,4 +28,6 @@ x = f; enum E { A } x = E; -x = E.A; \ No newline at end of file +x = E.A; + +let c1 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/primitives/undefined/validUndefinedAssignments.ts b/tests/cases/conformance/types/primitives/undefined/validUndefinedAssignments.ts index 71ae9f89a1..a1cad7a4a4 100644 --- a/tests/cases/conformance/types/primitives/undefined/validUndefinedAssignments.ts +++ b/tests/cases/conformance/types/primitives/undefined/validUndefinedAssignments.ts @@ -20,4 +20,6 @@ var h: { f(): void } = x; function i<T>(a: T) { a = x; -} \ No newline at end of file +} + +let c1 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/rest/objectRestParameter.ts b/tests/cases/conformance/types/rest/objectRestParameter.ts index 5b6faeb797..a18f4afc49 100644 --- a/tests/cases/conformance/types/rest/objectRestParameter.ts +++ b/tests/cases/conformance/types/rest/objectRestParameter.ts @@ -19,3 +19,4 @@ function foobar({ bar={}, ...opts }: any = {}) { foobar(); foobar({ baz: 'hello' }); foobar({ bar: { greeting: 'hello' } }); +let t1 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/specifyingTypes/typeLiterals/arrayOfFunctionTypes3.ts b/tests/cases/conformance/types/specifyingTypes/typeLiterals/arrayOfFunctionTypes3.ts index 9746dd287b..a518d15d97 100644 --- a/tests/cases/conformance/types/specifyingTypes/typeLiterals/arrayOfFunctionTypes3.ts +++ b/tests/cases/conformance/types/specifyingTypes/typeLiterals/arrayOfFunctionTypes3.ts @@ -23,4 +23,6 @@ var c2: { (x: number): number; <T>(x: T): any; }; var z2 = [a2, b2, c2]; var r6 = z2[0]; -var r7 = r6(''); // any not string \ No newline at end of file +var r7 = r6(''); // any not string + +let c11 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/specifyingTypes/typeLiterals/functionLiteralForOverloads2.ts b/tests/cases/conformance/types/specifyingTypes/typeLiterals/functionLiteralForOverloads2.ts index 4ba6a76000..1d686dcc89 100644 --- a/tests/cases/conformance/types/specifyingTypes/typeLiterals/functionLiteralForOverloads2.ts +++ b/tests/cases/conformance/types/specifyingTypes/typeLiterals/functionLiteralForOverloads2.ts @@ -25,4 +25,7 @@ var f2: { var f3: { new<T>(x: string): D<T>; new<T>(x: number): D<T>; -} = D; \ No newline at end of file +} = D; + +let c = new C(''); +let d = new D(''); \ No newline at end of file diff --git a/tests/cases/conformance/types/specifyingTypes/typeQueries/typeQueryOnClass.ts b/tests/cases/conformance/types/specifyingTypes/typeQueries/typeQueryOnClass.ts index 3e8ee82c74..4dd74a8b9b 100644 --- a/tests/cases/conformance/types/specifyingTypes/typeQueries/typeQueryOnClass.ts +++ b/tests/cases/conformance/types/specifyingTypes/typeQueries/typeQueryOnClass.ts @@ -53,4 +53,7 @@ class D<T> { var d: D<string>; var r3: typeof D; -var r4: typeof d; \ No newline at end of file +var r4: typeof d; + +let c1 = new C(1); +let d1 = new D(1); \ No newline at end of file diff --git a/tests/cases/conformance/types/specifyingTypes/typeQueries/typeQueryWithReservedWords.ts b/tests/cases/conformance/types/specifyingTypes/typeQueries/typeQueryWithReservedWords.ts index 5fb9d2233f..ce1748f526 100644 --- a/tests/cases/conformance/types/specifyingTypes/typeQueries/typeQueryWithReservedWords.ts +++ b/tests/cases/conformance/types/specifyingTypes/typeQueries/typeQueryWithReservedWords.ts @@ -12,3 +12,4 @@ interface IScope { delete: typeof Controller.prototype.delete; // Should not error var: typeof Controller.prototype.var; // Should not error } +let c2 = new Controller(); diff --git a/tests/cases/conformance/types/specifyingTypes/typeQueries/typeofClass2.ts b/tests/cases/conformance/types/specifyingTypes/typeQueries/typeofClass2.ts index df1898a543..4dcf244525 100644 --- a/tests/cases/conformance/types/specifyingTypes/typeQueries/typeofClass2.ts +++ b/tests/cases/conformance/types/specifyingTypes/typeQueries/typeofClass2.ts @@ -18,4 +18,7 @@ class D extends C { var d: D; var r1: typeof D; -var r2: typeof d; \ No newline at end of file +var r2: typeof d; + +let c = new C(1); +let d1 = new D(1); \ No newline at end of file diff --git a/tests/cases/conformance/types/specifyingTypes/typeQueries/typeofModuleWithoutExports.ts b/tests/cases/conformance/types/specifyingTypes/typeQueries/typeofModuleWithoutExports.ts index 878885a8a9..53d74c3b71 100644 --- a/tests/cases/conformance/types/specifyingTypes/typeQueries/typeofModuleWithoutExports.ts +++ b/tests/cases/conformance/types/specifyingTypes/typeQueries/typeofModuleWithoutExports.ts @@ -3,6 +3,7 @@ module M { class C { foo: number; } + var c = new C(); } -var r: typeof M; \ No newline at end of file +var r: typeof M; diff --git a/tests/cases/conformance/types/specifyingTypes/typeQueries/typeofThis.ts b/tests/cases/conformance/types/specifyingTypes/typeQueries/typeofThis.ts new file mode 100644 index 0000000000..420604c550 --- /dev/null +++ b/tests/cases/conformance/types/specifyingTypes/typeQueries/typeofThis.ts @@ -0,0 +1,146 @@ +// @noImplicitThis: true +// @strict: true + +class Test { + data = {}; + constructor() { + var copy: typeof this.data = {}; + } +} + +class Test1 { + data = { foo: '' }; + ['this'] = ''; + constructor() { + var copy: typeof this.data = { foo: '' }; + var foo: typeof this.data.foo = ''; + + var self: typeof this = this; + self.data; + + var str: typeof this.this = ''; + } +} + + +function Test2() { + let x: typeof this.no = 1; +} + +function Test3(this: { no: number }) { + let x: typeof this.no = 1; +} + +function Test4(this: { no: number } | undefined) { + let x: typeof this.no = 1; +} + +class Test5 { + no = 1; + + f = () => { + // should not capture this. + let x: typeof this.no = 1; + } +} + +namespace Test6 { + export let f = () => { + let x: typeof this.no = 1; + } +} + +module Test7 { + export let f = () => { + let x: typeof this.no = 1; + } +} + +const Test8 = () => { + let x: typeof this.no = 1; +} + +class Test9 { + no = 0; + this = 0; + + f() { + if (this instanceof Test9D1) { + const d1: typeof this = this; + d1.f1(); + } + + if (this instanceof Test9D2) { + const d2: typeof this = this; + d2.f2(); + } + } + + g() { + if (this.no === 1) { + const no: typeof this.no = this.no; + } + + if (this.this === 1) { + const no: typeof this.this = this.this; + } + } +} + +class Test9D1 { + f1() {} +} + +class Test9D2 { + f2() {} +} + +class Test10 { + a?: { b?: string } + + foo() { + let a: typeof this.a = undefined as any; + if (this.a) { + let a: typeof this.a = undefined as any; // should narrow to { b?: string } + let b: typeof this.a.b = undefined as any; + + if (this.a.b) { + let b: typeof this.a.b = undefined as any; // should narrow to string + } + } + } +} + +class Test11 { + this?: { x?: string }; + + foo() { + const o = this; + let bar: typeof o.this = {}; + + if (o.this && o.this.x) { + let y: string = o.this.x; // should narrow to string + } + } +} + +class Tests12 { + test1() { // OK + type Test = typeof this; + } + + test2() { // OK + for (;;) {} + type Test = typeof this; + } + + test3() { // expected no compile errors + for (const dummy in []) {} + type Test = typeof this; + } + + test4() { // expected no compile errors + for (const dummy of []) {} + type Test = typeof this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/types/specifyingTypes/typeQueries/typeofThisWithImplicitThis.ts b/tests/cases/conformance/types/specifyingTypes/typeQueries/typeofThisWithImplicitThis.ts new file mode 100644 index 0000000000..d99cceaa58 --- /dev/null +++ b/tests/cases/conformance/types/specifyingTypes/typeQueries/typeofThisWithImplicitThis.ts @@ -0,0 +1,5 @@ +// @noImplicitThis: false + +function Test1() { + let x: typeof this.no = 1 +} diff --git a/tests/cases/conformance/types/spread/spreadDuplicate.ts b/tests/cases/conformance/types/spread/spreadDuplicate.ts new file mode 100644 index 0000000000..f27a2529f0 --- /dev/null +++ b/tests/cases/conformance/types/spread/spreadDuplicate.ts @@ -0,0 +1,21 @@ +// @strict: true +// @declaration: true + +// Repro from #44438 + +declare let a: { a: string }; +declare let b: { a?: string }; +declare let c: { a: string | undefined }; +declare let d: { a?: string | undefined }; + +declare let t: boolean; + +let a1 = { a: 123, ...a }; // string (Error) +let b1 = { a: 123, ...b }; // string | number +let c1 = { a: 123, ...c }; // string | undefined (Error) +let d1 = { a: 123, ...d }; // string | number + +let a2 = { a: 123, ...(t ? a : {}) }; // string | number +let b2 = { a: 123, ...(t ? b : {}) }; // string | number +let c2 = { a: 123, ...(t ? c : {}) }; // string | number +let d2 = { a: 123, ...(t ? d : {}) }; // string | number diff --git a/tests/cases/conformance/types/spread/spreadDuplicateExact.ts b/tests/cases/conformance/types/spread/spreadDuplicateExact.ts new file mode 100644 index 0000000000..e395af4ce5 --- /dev/null +++ b/tests/cases/conformance/types/spread/spreadDuplicateExact.ts @@ -0,0 +1,22 @@ +// @strict: true +// @exactOptionalPropertyTypes: true +// @declaration: true + +// Repro from #44438 + +declare let a: { a: string }; +declare let b: { a?: string }; +declare let c: { a: string | undefined }; +declare let d: { a?: string | undefined }; + +declare let t: boolean; + +let a1 = { a: 123, ...a }; // string (Error) +let b1 = { a: 123, ...b }; // string | number +let c1 = { a: 123, ...c }; // string | undefined (Error) +let d1 = { a: 123, ...d }; // string | number | undefined + +let a2 = { a: 123, ...(t ? a : {}) }; // string | number +let b2 = { a: 123, ...(t ? b : {}) }; // string | number +let c2 = { a: 123, ...(t ? c : {}) }; // string | number | undefined +let d2 = { a: 123, ...(t ? d : {}) }; // string | number | undefined diff --git a/tests/cases/conformance/types/spread/spreadUnion4.ts b/tests/cases/conformance/types/spread/spreadUnion4.ts new file mode 100644 index 0000000000..6a39ac3a3c --- /dev/null +++ b/tests/cases/conformance/types/spread/spreadUnion4.ts @@ -0,0 +1,4 @@ +declare const a: { x: () => void } +declare const b: { x?: () => void } + +const c = { ...a, ...b }; diff --git a/tests/cases/conformance/types/thisType/fluentClasses.ts b/tests/cases/conformance/types/thisType/fluentClasses.ts index c9e791cb6f..0aad4efe17 100644 --- a/tests/cases/conformance/types/thisType/fluentClasses.ts +++ b/tests/cases/conformance/types/thisType/fluentClasses.ts @@ -15,3 +15,5 @@ class C extends B { } var c: C; var z = c.foo().bar().baz(); // Fluent pattern +let b1 = new B(); +let c1 = new C(); diff --git a/tests/cases/conformance/types/thisType/thisTypeAndConstraints.ts b/tests/cases/conformance/types/thisType/thisTypeAndConstraints.ts index f46b251c3b..c6091fd7a2 100644 --- a/tests/cases/conformance/types/thisType/thisTypeAndConstraints.ts +++ b/tests/cases/conformance/types/thisType/thisTypeAndConstraints.ts @@ -19,3 +19,6 @@ class B<T extends A> { x = x.self(); } } + +let a = new A(); +let b = new B(); diff --git a/tests/cases/conformance/types/thisType/thisTypeInClasses.ts b/tests/cases/conformance/types/thisType/thisTypeInClasses.ts index 6c650341fb..0d3913de7e 100644 --- a/tests/cases/conformance/types/thisType/thisTypeInClasses.ts +++ b/tests/cases/conformance/types/thisType/thisTypeInClasses.ts @@ -47,3 +47,9 @@ class C5 { let x2 = undefined as this; } } + +let c1 = new C1(); +let c2 = new C2(); +let c3 = new C3(); +let c4 = new C4(); +let c5 = new C5(); diff --git a/tests/cases/conformance/types/thisType/thisTypeInFunctions3.ts b/tests/cases/conformance/types/thisType/thisTypeInFunctions3.ts index 01d7fd0430..8fe03ac945 100644 --- a/tests/cases/conformance/types/thisType/thisTypeInFunctions3.ts +++ b/tests/cases/conformance/types/thisType/thisTypeInFunctions3.ts @@ -7,3 +7,6 @@ class Test extends Base { this.check(this); } } + +let te = new Test(); + diff --git a/tests/cases/conformance/types/thisType/thisTypeInTaggedTemplateCall.ts b/tests/cases/conformance/types/thisType/thisTypeInTaggedTemplateCall.ts new file mode 100644 index 0000000000..c46933329b --- /dev/null +++ b/tests/cases/conformance/types/thisType/thisTypeInTaggedTemplateCall.ts @@ -0,0 +1,10 @@ +// @target: esnext + +class Foo { + static m<T>(this: new () => T, strings: TemplateStringsArray | string) { + return new this() + } +} + +Foo.m`test`; +(Foo.m)`test`; diff --git a/tests/cases/conformance/types/tuple/readonlyArraysAndTuples2.ts b/tests/cases/conformance/types/tuple/readonlyArraysAndTuples2.ts index 0f58f1971d..e03bc2a0c6 100644 --- a/tests/cases/conformance/types/tuple/readonlyArraysAndTuples2.ts +++ b/tests/cases/conformance/types/tuple/readonlyArraysAndTuples2.ts @@ -21,3 +21,5 @@ class A { @someDec k: readonly [string, number] = ['foo', 42]; } + +let a = new A(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeAliases/circularTypeAliasForUnionWithClass.ts b/tests/cases/conformance/types/typeAliases/circularTypeAliasForUnionWithClass.ts index e7cca719f4..05fd3be85e 100644 --- a/tests/cases/conformance/types/typeAliases/circularTypeAliasForUnionWithClass.ts +++ b/tests/cases/conformance/types/typeAliases/circularTypeAliasForUnionWithClass.ts @@ -15,3 +15,7 @@ type T4 = string | I4; class I4 { [x: string]: T4; } + +let i0 = new I0(); +let i3 = new I3(); +let i4 = new I4(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeAliases/classDoesNotDependOnBaseTypes.ts b/tests/cases/conformance/types/typeAliases/classDoesNotDependOnBaseTypes.ts index 4cc3a72395..96d1b74b83 100644 --- a/tests/cases/conformance/types/typeAliases/classDoesNotDependOnBaseTypes.ts +++ b/tests/cases/conformance/types/typeAliases/classDoesNotDependOnBaseTypes.ts @@ -9,4 +9,6 @@ var x: StringTree; if (typeof x !== "string") { x[0] = ""; x[0] = new StringTreeCollection; -} \ No newline at end of file +} + +let s1 = new StringTreeCollection(); diff --git a/tests/cases/conformance/types/typeAliases/typeAliases.ts b/tests/cases/conformance/types/typeAliases/typeAliases.ts index b9d28f4cc3..32eb8473bf 100644 --- a/tests/cases/conformance/types/typeAliases/typeAliases.ts +++ b/tests/cases/conformance/types/typeAliases/typeAliases.ts @@ -77,4 +77,6 @@ var x: [string, boolean]; f16(x); var y: StringAndBoolean = ["1", false]; -y[0].toLowerCase(); \ No newline at end of file +y[0].toLowerCase(); + +let c7 = new C7(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeParameters/typeArgumentLists/callGenericFunctionWithZeroTypeArguments.ts b/tests/cases/conformance/types/typeParameters/typeArgumentLists/callGenericFunctionWithZeroTypeArguments.ts index 9a21c48ee1..b4a8dc7ba5 100644 --- a/tests/cases/conformance/types/typeParameters/typeArgumentLists/callGenericFunctionWithZeroTypeArguments.ts +++ b/tests/cases/conformance/types/typeParameters/typeArgumentLists/callGenericFunctionWithZeroTypeArguments.ts @@ -33,4 +33,7 @@ interface I2<T> { f(x: T): T; } var i2: I2<number>; -var r7 = i2.f(1); \ No newline at end of file +var r7 = i2.f(1); + +let c1 = new C(); +let c2 = new C2(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction.ts b/tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction.ts index ba1c5b003f..7490e2bd94 100644 --- a/tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction.ts +++ b/tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction.ts @@ -58,4 +58,7 @@ function foo2<T extends { (): void }, U extends { (): void }>(x: T, y: U) { //function foo2<T extends { (): void }, U extends T>(x: T, y: U) { // foo(x); // foo(y); -//} \ No newline at end of file +//} + +let c11 = new C(); +let c12 = new C2(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction3.ts b/tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction3.ts index 6c32014789..dec6cdd0bd 100644 --- a/tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction3.ts +++ b/tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction3.ts @@ -38,4 +38,7 @@ var c2: { <T>(x: T): T; <T>(x: T, y: T): T }; var r9 = foo(function <U>(x: U) { return x; }); var r10 = foo(<U extends string>(x: U) => x); var r12 = foo(i2); -var r15 = foo(c2); \ No newline at end of file +var r15 = foo(c2); + +let c11 = new C(); +let c12 = new C2() \ No newline at end of file diff --git a/tests/cases/conformance/types/typeParameters/typeParameterLists/innerTypeParameterShadowingOuterOne2.ts b/tests/cases/conformance/types/typeParameters/typeParameterLists/innerTypeParameterShadowingOuterOne2.ts index 60766c7e5e..4bd0b6c27f 100644 --- a/tests/cases/conformance/types/typeParameters/typeParameterLists/innerTypeParameterShadowingOuterOne2.ts +++ b/tests/cases/conformance/types/typeParameters/typeParameterLists/innerTypeParameterShadowingOuterOne2.ts @@ -34,4 +34,6 @@ class C2<T extends Date, U extends Date> { // var x: U; // x.getDate(); // } -//} \ No newline at end of file +//} +let c1 = new C(); +let c2 = new C2(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithConstraints.ts b/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithConstraints.ts index b89016ecff..c10bef3300 100644 --- a/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithConstraints.ts +++ b/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithConstraints.ts @@ -31,4 +31,5 @@ var b = { } } -var r4 = b.foo(new Date()); \ No newline at end of file +var r4 = b.foo(new Date()); +let c = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithConstraints2.ts b/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithConstraints2.ts index 10f3a49884..a9992c5aa1 100644 --- a/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithConstraints2.ts +++ b/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithConstraints2.ts @@ -61,7 +61,7 @@ var a: { var r3 = a<A, A>().foo(); var r3b = a()['foo'](); // parameter supplied for type argument inference to succeed -var aB = new B(); +// var aB = new B(); var r3c = a(aB, aB).foo(); var r3d = a(aB, aB)['foo'](); @@ -78,4 +78,7 @@ var b = { // } //} -var r4 = b.foo(aB, aB); // no inferences for T so constraint isn't satisfied, error \ No newline at end of file +var r4 = b.foo(aB, aB); // no inferences for T so constraint isn't satisfied, error + +let b1 = new B(); +let c1 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithConstraints3.ts b/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithConstraints3.ts index 6167485f1b..73a10ae071 100644 --- a/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithConstraints3.ts +++ b/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithConstraints3.ts @@ -53,4 +53,6 @@ var b = { } } -var r4 = b.foo(new B()); // valid call to an invalid function \ No newline at end of file +var r4 = b.foo(new B()); // valid call to an invalid function +let b1 = new B(); +let c1 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithoutConstraints.ts b/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithoutConstraints.ts index 1660d67a4e..b46569e9a4 100644 --- a/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithoutConstraints.ts +++ b/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithoutConstraints.ts @@ -28,4 +28,6 @@ var b = { } } -var r4 = b.foo(1); \ No newline at end of file +var r4 = b.foo(1); + +let c = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeParameters/typeParameterLists/typeParameterUsedAsConstraint.ts b/tests/cases/conformance/types/typeParameters/typeParameterLists/typeParameterUsedAsConstraint.ts index bade67badd..b9f3e54bb7 100644 --- a/tests/cases/conformance/types/typeParameters/typeParameterLists/typeParameterUsedAsConstraint.ts +++ b/tests/cases/conformance/types/typeParameters/typeParameterLists/typeParameterUsedAsConstraint.ts @@ -32,3 +32,10 @@ var a3: { <T extends Date, U extends T>(): void } var a4: { <T extends U, U extends Date>(): void } var a5: { <T extends U, U extends V, V>(): void } var a6: { <T, U extends T, V extends U>(): void } + +let c1 = new C(); +let c2 = new C2(); +let c3 = new C3(); +let c4 = new C4(); +let c5 = new C5(); +let c6 = new C6(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/anyAssignabilityInInheritance.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/anyAssignabilityInInheritance.ts index cc154308a1..5dfa8f94d3 100644 --- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/anyAssignabilityInInheritance.ts +++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/anyAssignabilityInInheritance.ts @@ -85,4 +85,8 @@ var r3 = foo3(a); // any declare function foo18(x: {}): {}; declare function foo18(x: any): any; -var r3 = foo3(a); // any \ No newline at end of file +var r3 = foo3(a); // any + +let aa1 = new A(); +let aa2 = new A2(); +let ccc = new CC(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/anyAssignableToEveryType.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/anyAssignableToEveryType.ts index 1c3bcc71ce..03e0089697 100644 --- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/anyAssignableToEveryType.ts +++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/anyAssignableToEveryType.ts @@ -38,6 +38,7 @@ function foo<T, U /*extends T*/, V extends Date>(x: T, y: U, z: V) { z = a; } +let cc = new C(); //function foo<T, U extends T, V extends Date>(x: T, y: U, z: V) { // x = a; // y = a; diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/anyAssignableToEveryType2.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/anyAssignableToEveryType2.ts index 26f3eee594..74a517176d 100644 --- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/anyAssignableToEveryType2.ts +++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/anyAssignableToEveryType2.ts @@ -127,3 +127,6 @@ interface I20 { [x: string]: {}; foo: any; } +let aa = new A(); +let aa2 = new A2() +let ccc = new c(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembers.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembers.ts index d7a94cc862..464edb67d3 100644 --- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembers.ts +++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembers.ts @@ -40,6 +40,8 @@ module SimpleTypes { a2 = b; a2 = t2; a2 = t; + let ss = new S(); + let tt = new T(); } module ObjectTypes { @@ -81,5 +83,6 @@ module ObjectTypes { a2 = b; a2 = t2; a2 = t; - + let ss = new S(); + let tt = new T(); } \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembers2.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembers2.ts index a45da06482..a9e3bc6141 100644 --- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembers2.ts +++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembers2.ts @@ -39,3 +39,5 @@ b2 = a2; a2 = b; a2 = t2; a2 = t; +let qu1 = new S(); +let qu2 = new T(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembers3.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembers3.ts index 6e9a210db4..b96693de94 100644 --- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembers3.ts +++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembers3.ts @@ -39,3 +39,5 @@ b2 = a2; a2 = b; a2 = t2; a2 = t; +let qi3 = new S(); +let qi4 = new T(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembersNumericNames.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembersNumericNames.ts index b25c949f42..7372988241 100644 --- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembersNumericNames.ts +++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembersNumericNames.ts @@ -39,3 +39,5 @@ b2 = a2; a2 = b; a2 = t2; a2 = t; +let qi1 = new S(); +let qi2 = new T(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/callSignatureAssignabilityInInheritance2.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/callSignatureAssignabilityInInheritance2.ts index 9e6cd52ac2..c511bfa71a 100644 --- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/callSignatureAssignabilityInInheritance2.ts +++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/callSignatureAssignabilityInInheritance2.ts @@ -66,4 +66,8 @@ interface I extends A { a16: <T extends Base>(x: T) => number[]; // ok a17: <T>(x: (a: T) => T) => T[]; // ok a18: <T>(x: (a: T) => T) => T[]; // ok, no inferences for T but assignable to any -} \ No newline at end of file +} + +let qi14 = new Derived(); +let qi15 = new Derived2(); +let qi16 = new OtherDerived(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/callSignatureAssignabilityInInheritance4.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/callSignatureAssignabilityInInheritance4.ts index dd10ee7646..bb1f737657 100644 --- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/callSignatureAssignabilityInInheritance4.ts +++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/callSignatureAssignabilityInInheritance4.ts @@ -46,4 +46,8 @@ interface I extends A { a16: <T>(x: { a: T; b: T }) => T[]; // ok, more general parameter type a17: <T>(x: (a: T) => T) => T[]; // ok a18: (x: <T>(a: T) => T) => any[]; // ok -} \ No newline at end of file +} + +let qi14 = new Derived(); +let qi15 = new Derived2(); +let qi16 = new OtherDerived(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/callSignatureAssignabilityInInheritance5.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/callSignatureAssignabilityInInheritance5.ts index bf60d6518c..ef4e179af9 100644 --- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/callSignatureAssignabilityInInheritance5.ts +++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/callSignatureAssignabilityInInheritance5.ts @@ -45,4 +45,7 @@ interface I extends B { a12: <T extends Array<Base>>(x: Array<Base>, y: T) => Array<Derived>; // ok, less specific parameter type a13: <T extends Array<Derived>>(x: Array<Base>, y: T) => T; // ok, T = Array<Derived>, satisfies constraint, contextual signature instantiation succeeds a14: <T, U>(x: { a: T; b: U }) => T; // ok -} \ No newline at end of file +} +let qi14 = new Derived(); +let qi15 = new Derived2(); +let qi16 = new OtherDerived(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance2.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance2.ts index 65e4f4c962..8d842b7d7e 100644 --- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance2.ts +++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance2.ts @@ -66,4 +66,8 @@ interface I extends A { a16: new <T extends Base>(x: T) => number[]; // ok a17: new <T>(x: new (a: T) => T) => T[]; // ok a18: new <T>(x: new (a: T) => T) => T[]; // ok, no inferences for T but assignable to any -} \ No newline at end of file +} + +let qi14 = new Derived(); +let qi15 = new Derived2(); +let qi16 = new OtherDerived(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance4.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance4.ts index 9dfcf5548a..8b57d6a8c7 100644 --- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance4.ts +++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance4.ts @@ -56,4 +56,7 @@ interface I extends A { a18: new <T extends Base>(x: T) => number[]; // ok, more general parameter type a19: new <T extends Base>(x: new (a: T) => T) => T[]; // ok a20: new (x: new <T extends Base>(a: T) => T) => any[]; // ok -} \ No newline at end of file +} +let qi14 = new Derived(); +let qi15 = new Derived2(); +let qi16 = new OtherDerived(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance5.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance5.ts index f33820218e..6ba5e454f6 100644 --- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance5.ts +++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance5.ts @@ -45,4 +45,7 @@ interface I extends B { a12: new <T extends Array<Base>>(x: Array<Base>, y: T) => Array<Derived>; // ok, less specific parameter type a13: new <T extends Array<Derived>>(x: Array<Base>, y: T) => T; // ok, T = Array<Derived>, satisfies constraint, contextual signature instantiation succeeds a14: new <T, U>(x: { a: T; b: U }) => T; // ok -} \ No newline at end of file +} +let qi14 = new Derived(); +let qi15 = new Derived2(); +let qi16 = new OtherDerived(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/everyTypeAssignableToAny.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/everyTypeAssignableToAny.ts index 6c8670abaa..407e128678 100644 --- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/everyTypeAssignableToAny.ts +++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/everyTypeAssignableToAny.ts @@ -53,6 +53,8 @@ function foo<T, U /*extends T*/, V extends Date>(x: T, y: U, z: V) { a = y; a = z; } + +let ccc = new C(); //function foo<T, U extends T, V extends Date>(x: T, y: U, z: V) { // a = x; // a = y; diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/nullAssignableToEveryType.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/nullAssignableToEveryType.ts index b0f55331d7..cc755558ff 100644 --- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/nullAssignableToEveryType.ts +++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/nullAssignableToEveryType.ts @@ -35,7 +35,7 @@ function foo<T, U, V extends Date>(x: T, y: U, z: V) { y = null; z = null; } - +let cc = new C(); //function foo<T, U extends T, V extends Date>(x: T, y: U, z: V) { // x = null; // y = null; diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/undefinedAssignableToEveryType.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/undefinedAssignableToEveryType.ts index 5fc14274a1..f296781ef1 100644 --- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/undefinedAssignableToEveryType.ts +++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/undefinedAssignableToEveryType.ts @@ -35,6 +35,7 @@ function foo<T, U, V extends Date>(x: T, y: U, z: V) { y = undefined; z = undefined; } +let cc = new C(); //function foo<T, U extends T, V extends Date>(x: T, y: U, z: V) { // x = undefined; // y = undefined; diff --git a/tests/cases/conformance/types/typeRelationships/bestCommonType/bestCommonTypeOfConditionalExpressions.ts b/tests/cases/conformance/types/typeRelationships/bestCommonType/bestCommonTypeOfConditionalExpressions.ts index 5f02210478..1e1889cc10 100644 --- a/tests/cases/conformance/types/typeRelationships/bestCommonType/bestCommonTypeOfConditionalExpressions.ts +++ b/tests/cases/conformance/types/typeRelationships/bestCommonType/bestCommonTypeOfConditionalExpressions.ts @@ -23,4 +23,7 @@ var r11 = true ? base : derived2; function foo5<T, U>(t: T, u: U): Object { return true ? t : u; // BCT is Object -} \ No newline at end of file +} + +let qy10 = new Derived(); +let qy11 = new Derived2(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/bestCommonType/bestCommonTypeOfConditionalExpressions2.ts b/tests/cases/conformance/types/typeRelationships/bestCommonType/bestCommonTypeOfConditionalExpressions2.ts index 8e6f345ea4..f1512e3536 100644 --- a/tests/cases/conformance/types/typeRelationships/bestCommonType/bestCommonTypeOfConditionalExpressions2.ts +++ b/tests/cases/conformance/types/typeRelationships/bestCommonType/bestCommonTypeOfConditionalExpressions2.ts @@ -21,4 +21,6 @@ function foo2<T extends U, U>(t: T, u: U) { // Error for referencing own type pa function foo3<T extends U, U extends V, V>(t: T, u: U) { return true ? t : u; -} \ No newline at end of file +} +let qy8 = new Derived(); +let qy9 = new Derived2(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/bestCommonType/heterogeneousArrayLiterals.ts b/tests/cases/conformance/types/typeRelationships/bestCommonType/heterogeneousArrayLiterals.ts index 0f498c570a..13ecea225a 100644 --- a/tests/cases/conformance/types/typeRelationships/bestCommonType/heterogeneousArrayLiterals.ts +++ b/tests/cases/conformance/types/typeRelationships/bestCommonType/heterogeneousArrayLiterals.ts @@ -99,6 +99,8 @@ function foo4<T extends Base, U extends Base>(t: T, u: U) { var k: Base[] = [t, u]; } +let qy8 = new Derived(); +let qy9 = new Derived2(); //function foo3<T extends U, U extends Derived>(t: T, u: U) { // var a = [t, t]; // T[] diff --git a/tests/cases/conformance/types/typeRelationships/instanceOf/narrowingConstrainedTypeVariable.ts b/tests/cases/conformance/types/typeRelationships/instanceOf/narrowingConstrainedTypeVariable.ts index 04623503f9..491876d8ff 100644 --- a/tests/cases/conformance/types/typeRelationships/instanceOf/narrowingConstrainedTypeVariable.ts +++ b/tests/cases/conformance/types/typeRelationships/instanceOf/narrowingConstrainedTypeVariable.ts @@ -34,3 +34,6 @@ function f3<T extends E>(v: T | { x: string }) { const y: { x: string } = v; } } +let qy5 = new C(); +let qy6 = new D(); +let qy7 = new E(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/recursiveTypes/arrayLiteralsWithRecursiveGenerics.ts b/tests/cases/conformance/types/typeRelationships/recursiveTypes/arrayLiteralsWithRecursiveGenerics.ts index e7260831a4..35de332a33 100644 --- a/tests/cases/conformance/types/typeRelationships/recursiveTypes/arrayLiteralsWithRecursiveGenerics.ts +++ b/tests/cases/conformance/types/typeRelationships/recursiveTypes/arrayLiteralsWithRecursiveGenerics.ts @@ -22,4 +22,8 @@ var ys = [list, list2]; // {}[] var zs = [list, null]; // List<number>[] var myDerivedList: DerivedList<number>; -var as = [list, myDerivedList]; // List<number>[] \ No newline at end of file +var as = [list, myDerivedList]; // List<number>[] + +let li = new List(); +let der = new DerivedList(); +let my = new MyList(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/recursiveTypes/recursiveTypeInGenericConstraint.ts b/tests/cases/conformance/types/typeRelationships/recursiveTypes/recursiveTypeInGenericConstraint.ts index ac6286bd81..e4d37f2abe 100644 --- a/tests/cases/conformance/types/typeRelationships/recursiveTypes/recursiveTypeInGenericConstraint.ts +++ b/tests/cases/conformance/types/typeRelationships/recursiveTypes/recursiveTypeInGenericConstraint.ts @@ -10,4 +10,7 @@ class D<T> { x: G<G<T>>; } -var c1 = new Foo<D<string>>(); // ok, circularity in assignment compat check causes success \ No newline at end of file +var c1 = new Foo<D<string>>(); // ok, circularity in assignment compat check causes success +let g = new G(); +let foo = new Foo(); +let d = new D(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/recursiveTypes/recursiveTypesUsedAsFunctionParameters.ts b/tests/cases/conformance/types/typeRelationships/recursiveTypes/recursiveTypesUsedAsFunctionParameters.ts index 6eba1f2836..6cdf1db8be 100644 --- a/tests/cases/conformance/types/typeRelationships/recursiveTypes/recursiveTypesUsedAsFunctionParameters.ts +++ b/tests/cases/conformance/types/typeRelationships/recursiveTypes/recursiveTypesUsedAsFunctionParameters.ts @@ -40,4 +40,7 @@ function other<T extends List<U>, U>() { var r = foo5(list); var r2 = foo5(myList); -} \ No newline at end of file +} + +let li = new List(); +let my = new MyList(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/nullIsSubtypeOfEverythingButUndefined.ts b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/nullIsSubtypeOfEverythingButUndefined.ts index 24f2ab71d4..ced02bcefe 100644 --- a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/nullIsSubtypeOfEverythingButUndefined.ts +++ b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/nullIsSubtypeOfEverythingButUndefined.ts @@ -88,3 +88,7 @@ var r19 = true ? null : new Object(); var r20 = true ? {} : null; var r20 = true ? null : {}; + +let c11 = new C1(); +let c12 = new C2(); +let c13 = new c(); diff --git a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/stringLiteralTypeIsSubtypeOfString.ts b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/stringLiteralTypeIsSubtypeOfString.ts index c7e9c0fc8e..0f00bc8c02 100644 --- a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/stringLiteralTypeIsSubtypeOfString.ts +++ b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/stringLiteralTypeIsSubtypeOfString.ts @@ -97,4 +97,6 @@ function f15<T, U extends T>(x: any) { } function f16<T extends String, U extends T>(x: 'a'); function f16<T extends String, U extends T>(x: U); -function f16<T extends String, U extends T>(x: any) { } \ No newline at end of file +function f16<T extends String, U extends T>(x: any) { } + +let ccc = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfAny.ts b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfAny.ts index 0e5df54319..d785a27b7b 100644 --- a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfAny.ts +++ b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfAny.ts @@ -130,4 +130,7 @@ interface I19 { interface I20 { [x: string]: any; foo: {}; -} \ No newline at end of file +} +let a1 = new A(); +let a2 = new A2(); +let c1 = new c(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints2.ts b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints2.ts index 9edf4f5f41..990e4b8cc5 100644 --- a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints2.ts +++ b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints2.ts @@ -154,4 +154,7 @@ function f20<T extends Number>(x: T) { function f21<T extends Number>(x: T) { var r20 = true ? {} : x; // ok var r20 = true ? x : {}; // ok -} \ No newline at end of file +} + +let c1 = new C1(); +let c2 = new C2(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithCallSignatures2.ts b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithCallSignatures2.ts index e8ae73c5fb..4a29484b12 100644 --- a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithCallSignatures2.ts +++ b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithCallSignatures2.ts @@ -5,6 +5,7 @@ class Derived extends Base { bar: string; } class Derived2 extends Derived { baz: string; } class OtherDerived extends Base { bing: string; } + declare function foo1(a: (x: number) => number[]): typeof a; declare function foo1(a: any): any; @@ -169,3 +170,8 @@ var r17arg1 = <T>(x: (a: T) => T) => <T[]>null; var r17 = foo17(r17arg1); // any var r18arg1 = <T>(x: (a: T) => T) => <T[]>null; var r18 = foo18(r18arg1); + + +let der1 = new Derived(); +let der2 = new Derived2(); +let oth = new OtherDerived(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithCallSignatures3.ts b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithCallSignatures3.ts index 505919547f..51c890854f 100644 --- a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithCallSignatures3.ts +++ b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithCallSignatures3.ts @@ -103,6 +103,10 @@ module Errors { var r9arg = <T>(x: (a: T) => T) => <any[]>null; var r9 = foo17(r9arg); // (x: { <T extends Derived >(a: T): T; <T extends Base >(a: T): T; }): any[]; (x: { <T extends Derived2>(a: T): T; <T extends Base>(a: T): T; }): any[]; + let ba = new Base(); + let der1 = new Derived(); + let der2 = new Derived2(); + let oth = new OtherDerived(); } module WithGenericSignaturesInBaseType { diff --git a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithCallSignatures4.ts b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithCallSignatures4.ts index e86fc51d44..e043cec402 100644 --- a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithCallSignatures4.ts +++ b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithCallSignatures4.ts @@ -108,4 +108,8 @@ var r17arg = <T>(x: (a: T) => T) => <T[]>null; var r17 = foo17(r17arg); var r18arg = (x: <T>(a: T) => T) => <any[]>null; -var r18 = foo18(r18arg); \ No newline at end of file +var r18 = foo18(r18arg); + +let der =new Derived(); +let der2 = new Derived2(); +let oth = new OtherDerived(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures2.ts b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures2.ts index 46d1c9e91d..683db9f182 100644 --- a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures2.ts +++ b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures2.ts @@ -169,3 +169,8 @@ var r17arg1: new <T>(x: (a: T) => T) => T[]; var r17 = foo17(r17arg1); // any var r18arg1: new <T>(x: (a: T) => T) => T[]; var r18 = foo18(r18arg1); + + +let der =new Derived(); +let der2 = new Derived2(); +let oth = new OtherDerived(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures3.ts b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures3.ts index 215a5d1d4d..bbaddcabfc 100644 --- a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures3.ts +++ b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures3.ts @@ -105,6 +105,10 @@ module Errors { var r9arg: new <T>(x: new (a: T) => T) => any[]; var r9 = foo17(r9arg); // // (x: { <T extends Derived >(a: T): T; <T extends Base >(a: T): T; }): any[]; (x: { <T extends Derived2>(a: T): T; <T extends Base>(a: T): T; }): any[]; + let ba = new Base(); + let der1 = new Derived(); + let der2 = new Derived2(); + let oth = new OtherDerived(); } module WithGenericSignaturesInBaseType { diff --git a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures4.ts b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures4.ts index 830139d3fa..5d5145d29d 100644 --- a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures4.ts +++ b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures4.ts @@ -108,4 +108,8 @@ var r17arg: new <T>(x: new (a: T) => T) => T[]; var r17 = foo17(r17arg); var r18arg: new (x: new <T>(a: T) => T) => any[]; -var r18 = foo18(r18arg); \ No newline at end of file +var r18 = foo18(r18arg); + +let der =new Derived(); +let der2 = new Derived2(); +let oth = new OtherDerived(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures5.ts b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures5.ts index f33820218e..f3c1c5d20d 100644 --- a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures5.ts +++ b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures5.ts @@ -6,6 +6,7 @@ class Derived extends Base { bar: string; } class Derived2 extends Derived { baz: string; } class OtherDerived extends Base { bing: string; } + interface A { // T // M's a: new (x: number) => number[]; @@ -45,4 +46,7 @@ interface I extends B { a12: new <T extends Array<Base>>(x: Array<Base>, y: T) => Array<Derived>; // ok, less specific parameter type a13: new <T extends Array<Derived>>(x: Array<Base>, y: T) => T; // ok, T = Array<Derived>, satisfies constraint, contextual signature instantiation succeeds a14: new <T, U>(x: { a: T; b: U }) => T; // ok -} \ No newline at end of file +} +let der =new Derived(); +let der2 = new Derived2(); +let oth = new OtherDerived(); diff --git a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithObjectMembers4.ts b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithObjectMembers4.ts index b50e1f7106..2c99af9515 100644 --- a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithObjectMembers4.ts +++ b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithObjectMembers4.ts @@ -30,4 +30,8 @@ class A3 { class B3 extends A3 { '1.1': Derived; // ok, inherits '1' -} \ No newline at end of file +} +let der = new Derived(); +let b1 = new B(); +let b2 = new B2(); +let b3 = new B3(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/undefinedIsSubtypeOfEverything.ts b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/undefinedIsSubtypeOfEverything.ts index 7ee0906ee2..08c7e7d192 100644 --- a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/undefinedIsSubtypeOfEverything.ts +++ b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/undefinedIsSubtypeOfEverything.ts @@ -118,3 +118,28 @@ class D16 extends Base { class D17 extends Base { foo: {}; } + + +let d0 = new D0(); +let da = new DA(); +let d1 = new D1() +let d1a = new D1A() +let d2 = new D2() +let d2a = new D2A() +let d3 = new D3() +let d3a = new D1A() +let d4 = new D4() +let d5 = new D5() +let d6 = new D6() +let d7 = new D7() +let d8 = new D8() +let d9 = new D9() +let d10 = new D10() +let d11 = new D11() +let d12 = new D12() +let c1 = new c() +let d13 = new D13() +let d14 = new D14() +let d15 = new D15() +let d16 = new D16() +let d17 = new D17() diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentity.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentity.ts index 225a974181..acf6300dba 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentity.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentity.ts @@ -85,4 +85,8 @@ function foo13(x: any) { } function foo14(x: I); function foo14(x: typeof b); // error -function foo14(x: any) { } \ No newline at end of file +function foo14(x: any) { } + +let a1 = new A(); +let b1 = new B(); +let c1 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentity2.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentity2.ts index fefde23a69..2427d26180 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentity2.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentity2.ts @@ -62,4 +62,7 @@ function foo13(x: any) { } function foo14(x: I); function foo14(x: typeof b); // ok -function foo14(x: any) { } \ No newline at end of file +function foo14(x: any) { } +let aa = new A(); +let bb = new B(); +let cc = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignatures.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignatures.ts index 94038f6df9..bb5d06c3fc 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignatures.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignatures.ts @@ -97,4 +97,7 @@ function foo14(x: any) { } function foo15(x: I2<string>); function foo15(x: C<number>); // ok -function foo15(x: any) { } \ No newline at end of file +function foo15(x: any) { } +let qy17 = new A(); +let qy18 = new B(); +let qy19 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignatures2.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignatures2.ts index 699f0f73f7..99aafb4b8a 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignatures2.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignatures2.ts @@ -97,4 +97,7 @@ function foo14(x: any) { } function foo15(x: I2<string>); function foo15(x: C<number>); // ok -function foo15(x: any) { } \ No newline at end of file +function foo15(x: any) { } +let aa = new A(); +let bb = new B(); +let cc = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignaturesDifferingParamCounts.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignaturesDifferingParamCounts.ts index b62b558d06..8a23c2c1bd 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignaturesDifferingParamCounts.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignaturesDifferingParamCounts.ts @@ -97,4 +97,7 @@ function foo14(x: any) { } function foo15(x: I2<string>); function foo15(x: C<number>); // ok -function foo15(x: any) { } \ No newline at end of file +function foo15(x: any) { } +let aa = new A(); +let bb = new B(); +let cc = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignaturesWithOverloads.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignaturesWithOverloads.ts index 0aaf7c30f2..cc561aa934 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignaturesWithOverloads.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignaturesWithOverloads.ts @@ -113,4 +113,8 @@ function foo14(x: any) { } function foo15(x: I2<string>); function foo15(x: C<number>); // ok -function foo15(x: any) { } \ No newline at end of file +function foo15(x: any) { } + +let aa = new A(); +let bb = new B(); +let cc = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithConstructSignatures.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithConstructSignatures.ts index efec6a715b..964c2a9d43 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithConstructSignatures.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithConstructSignatures.ts @@ -84,4 +84,8 @@ function foo13(x: any) { } function foo15(x: I2<string>); function foo15(x: C<number>); // ok -function foo15(x: any) { } \ No newline at end of file +function foo15(x: any) { } + +let a1 = new A('1'); +let b1 = new B('1'); +let c1 = new C(1); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithConstructSignatures2.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithConstructSignatures2.ts index 63e5167a4c..09f632da93 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithConstructSignatures2.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithConstructSignatures2.ts @@ -73,4 +73,6 @@ function foo14(x: any) { } function foo15(x: I2<string>); function foo15(x: C<number>); // ok -function foo15(x: any) { } \ No newline at end of file +function foo15(x: any) { } +let qy38 = new B(null); +let qy39 =new C(null); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithConstructSignaturesDifferingParamCounts.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithConstructSignaturesDifferingParamCounts.ts index b8fc424b21..b6af7ec955 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithConstructSignaturesDifferingParamCounts.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithConstructSignaturesDifferingParamCounts.ts @@ -73,4 +73,6 @@ function foo14(x: any) { } function foo15(x: I2<string>); function foo15(x: C<number>); // ok -function foo15(x: any) { } \ No newline at end of file +function foo15(x: any) { } +let qo23 =new B(null,null); +let qo24 =new C(null,null); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignatures.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignatures.ts index d95bc486df..72019e6b9a 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignatures.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignatures.ts @@ -97,4 +97,8 @@ function foo14(x: any) { } function foo15(x: I2); function foo15(x: C<number>); // ok -function foo15(x: any) { } \ No newline at end of file +function foo15(x: any) { } + +let a1 = new A(); +let b1 = new B(); +let c1 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignatures2.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignatures2.ts index 5c009926a0..099927c132 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignatures2.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignatures2.ts @@ -97,4 +97,8 @@ function foo14(x: any) { } function foo15(x: I2); function foo15(x: C<string, number>); // ok -function foo15(x: any) { } \ No newline at end of file +function foo15(x: any) { } + +let a1 = new A(); +let b1 = new B(); +let c1 = new C(); diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByConstraints.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByConstraints.ts index ede6da4040..21f9ed1933 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByConstraints.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByConstraints.ts @@ -99,4 +99,8 @@ function foo14(x: any) { } function foo15(x: I2); function foo15(x: C<String>); // ok -function foo15(x: any) { } \ No newline at end of file +function foo15(x: any) { } + +let a1 = new A(); +let b1 = new B(); +let c1 = new C(); diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByConstraints2.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByConstraints2.ts index 5fb315c4da..c0ce245917 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByConstraints2.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByConstraints2.ts @@ -111,4 +111,8 @@ function foo14(x: any) { } function foo15(x: I2); function foo15(x: C<String, String>); // ok -function foo15(x: any) { } \ No newline at end of file +function foo15(x: any) { } +let a1 = new A(); +let b1 = new B(); +let c1 = new C(); +let d1 = new D(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByConstraints3.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByConstraints3.ts index aaae2cbf33..b341b1f6c2 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByConstraints3.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByConstraints3.ts @@ -120,4 +120,11 @@ function foo14(x: any) { } function foo15(x: I2); function foo15(x: C<Three, Three>); // ok -function foo15(x: any) { } \ No newline at end of file +function foo15(x: any) { } + +let one = new One(); +let two = new Two(); +let a1 = new A(); +let b1 = new B(); +let c1 = new C(); +let d1 = new D(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByReturnType.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByReturnType.ts index 97a657606e..ab7da883ec 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByReturnType.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByReturnType.ts @@ -99,4 +99,7 @@ function foo14(x: any) { } function foo15(x: I2); function foo15(x: C<number>); // ok -function foo15(x: any) { } \ No newline at end of file +function foo15(x: any) { } +let qy12 = new A(); +let qy13 = new B(); +let qy14 = new C(); diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByReturnType2.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByReturnType2.ts index df7533d906..5e419a9b14 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByReturnType2.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByReturnType2.ts @@ -99,4 +99,8 @@ function foo14(x: any) { } function foo15(x: I2); function foo15(x: C<Date>); // ok -function foo15(x: any) { } \ No newline at end of file +function foo15(x: any) { } + +let qo27 = new A(); +let qo28 =new B(); +let qo29 =new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingTypeParameterCounts.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingTypeParameterCounts.ts index e3bd868941..1bda87ea35 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingTypeParameterCounts.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingTypeParameterCounts.ts @@ -97,4 +97,8 @@ function foo14(x: any) { } function foo15(x: I2); function foo15(x: C<number, B<string, string>, B<number, string>>); // ok -function foo15(x: any) { } \ No newline at end of file +function foo15(x: any) { } + +let a1 = new A(); +let b1 = new B(); +let c1 = new C(); diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingTypeParameterNames.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingTypeParameterNames.ts index 9e01aaec49..9b74d14cfc 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingTypeParameterNames.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingTypeParameterNames.ts @@ -97,4 +97,7 @@ function foo14(x: any) { } function foo15(x: I2); function foo15(x: C<number>); // ok -function foo15(x: any) { } \ No newline at end of file +function foo15(x: any) { } +let qo17 = new A(); +let qo18 =new B(); +let qo19 =new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesOptionalParams.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesOptionalParams.ts index c5454cc41e..781a351188 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesOptionalParams.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesOptionalParams.ts @@ -99,4 +99,7 @@ function foo14(x: any) { } function foo15(x: I2); function foo15(x: C<number>); // ok -function foo15(x: any) { } \ No newline at end of file +function foo15(x: any) { } +let qo9 = new A(); +let qo10 = new B(); +let qo11 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesOptionalParams2.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesOptionalParams2.ts index b8620f04d1..ca2a5abb87 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesOptionalParams2.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesOptionalParams2.ts @@ -99,4 +99,7 @@ function foo14(x: any) { } function foo15(x: I2); function foo15(x: C<string, number>); // ok -function foo15(x: any) { } \ No newline at end of file +function foo15(x: any) { } +let a1 = new A(); +let b1 = new B(); +let c1 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesOptionalParams3.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesOptionalParams3.ts index f39d23637a..828b26331c 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesOptionalParams3.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesOptionalParams3.ts @@ -99,4 +99,8 @@ function foo14(x: any) { } function foo15(x: I2); function foo15(x: C<string, number>); // ok -function foo15(x: any) { } \ No newline at end of file +function foo15(x: any) { } + +let a1 = new A(); +let b1 = new B(); +let c1 = new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByConstraints.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByConstraints.ts index 974f53cb9c..8d1aa46bde 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByConstraints.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByConstraints.ts @@ -72,3 +72,5 @@ function foo13(x: any) { } function foo14(x: I<Number>); function foo14(x: typeof b); // ok function foo14(x: any) { } +let qo15 = new B(null); +let qo16 = new C(null); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByConstraints2.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByConstraints2.ts index 47bab5dab8..963aabc746 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByConstraints2.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByConstraints2.ts @@ -83,4 +83,9 @@ function foo13(x: any) { } function foo14(x: I<Number, Number>); function foo14(x: typeof b); // ok -function foo14(x: any) { } \ No newline at end of file +function foo14(x: any) { } + +var aa = [] +let b1 = new B(aa,aa); +let c1 = new C('',''); +let d1 = new D(1,1); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByConstraints3.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByConstraints3.ts index 14f4933a15..b593e623e5 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByConstraints3.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByConstraints3.ts @@ -92,4 +92,9 @@ function foo13(x: any) { } function foo14(x: I<Five<string>, Five<string>>); function foo14(x: typeof b); // ok -function foo14(x: any) { } \ No newline at end of file +function foo14(x: any) { } +let qo1 = new One(); +let qo2 = new Two(); +let qo3 = new B(null,null); +let qo4 = new C(null,null); +let qo5 = new D(null,null); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByReturnType.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByReturnType.ts index 9c072e8936..185dab627d 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByReturnType.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByReturnType.ts @@ -79,4 +79,6 @@ function foo14(x: any) { } function foo15(x: I2); function foo15(x: C<number>); // ok -function foo15(x: any) { } \ No newline at end of file +function foo15(x: any) { } +let qy49 =new B(null); +let qy50 =new C(null); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByReturnType2.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByReturnType2.ts index 2e0a98d557..9e63b81350 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByReturnType2.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByReturnType2.ts @@ -75,4 +75,8 @@ function foo14(x: any) { } function foo15(x: I2); function foo15(x: C<Date>); // ok -function foo15(x: any) { } \ No newline at end of file +function foo15(x: any) { } + +var aa; +let b1 = new B(aa); +let c1 = new C(aa); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingTypeParameterCounts.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingTypeParameterCounts.ts index fe01df2564..8caa853954 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingTypeParameterCounts.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingTypeParameterCounts.ts @@ -69,4 +69,6 @@ function foo13(x: any) { } function foo14(x: I<string, Date, RegExp, boolean>); function foo14(x: typeof b); // ok -function foo14(x: any) { } \ No newline at end of file +function foo14(x: any) { } +let qo6 = new B(null); +let qo7 = new C(null); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingTypeParameterNames.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingTypeParameterNames.ts index 20d7dbab13..7573f3e8b4 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingTypeParameterNames.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingTypeParameterNames.ts @@ -69,4 +69,8 @@ function foo13(x: any) { } function foo14(x: I<string>); function foo14(x: typeof b); // ok -function foo14(x: any) { } \ No newline at end of file +function foo14(x: any) { } + + +let b1 = new B(a); +let c1 = new C(a); diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesOptionalParams.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesOptionalParams.ts index 56dc5a051c..2caea04bc0 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesOptionalParams.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesOptionalParams.ts @@ -71,4 +71,7 @@ function foo13(x: any) { } function foo14(x: I<string>); function foo14(x: typeof b); // ok -function foo14(x: any) { } \ No newline at end of file +function foo14(x: any) { } + +let b1 = new B(a); +let c1 = new C(a); diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesOptionalParams2.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesOptionalParams2.ts index 6c4a282228..d9e2b8c184 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesOptionalParams2.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesOptionalParams2.ts @@ -71,4 +71,7 @@ function foo13(x: any) { } function foo14(x: I<string, number>); function foo14(x: typeof b); // ok -function foo14(x: any) { } \ No newline at end of file +function foo14(x: any) { } + +let b1 = new B(a); +let c1 = new C(a); diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesOptionalParams3.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesOptionalParams3.ts index 8c9a08137f..0683e8d40b 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesOptionalParams3.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesOptionalParams3.ts @@ -71,4 +71,6 @@ function foo13(x: any) { } function foo14(x: I<string, number>); function foo14(x: typeof b); // ok -function foo14(x: any) { } \ No newline at end of file +function foo14(x: any) { } +let qy15 = new B(null,null); +let qy16 = new C(null,null); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithNumericIndexers1.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithNumericIndexers1.ts index 867199d905..0c6b2ca24b 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithNumericIndexers1.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithNumericIndexers1.ts @@ -119,3 +119,6 @@ function foo16(x: I); function foo16(x: PB); // error function foo16(x: any) { } +let c1 = new C(); +let pa = new PA(); +let pb = new PB(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithNumericIndexers2.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithNumericIndexers2.ts index ea9d7d04ee..bf735eb8a5 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithNumericIndexers2.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithNumericIndexers2.ts @@ -122,3 +122,8 @@ function foo16(x: I); function foo16(x: PB); // error function foo16(x: any) { } + +let der = new Derived() +let c1 = new C(); +let pa = new PA(); +let pb = new PB(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithNumericIndexers3.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithNumericIndexers3.ts index d3f22604c4..337ac0b542 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithNumericIndexers3.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithNumericIndexers3.ts @@ -119,3 +119,6 @@ function foo16(x: I); function foo16(x: PB); // error function foo16(x: any) { } +let qo32 =new C(); +let qo30 = new PA(); +let qo31 =new PB(); diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithOptionality.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithOptionality.ts index 7c24195105..21be3c5930 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithOptionality.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithOptionality.ts @@ -53,4 +53,8 @@ function foo13(x: any) { } function foo14(x: I); function foo14(x: typeof b); // ok -function foo14(x: any) { } \ No newline at end of file +function foo14(x: any) { } + +let a1 = new A(); +let b1 = new B(); +let c1 = new C(); diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithPrivates.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithPrivates.ts index b9e390158c..fe547befb2 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithPrivates.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithPrivates.ts @@ -116,4 +116,6 @@ function foo15(x: any) { } function foo16(x: I); function foo16(x: PB); // no error function foo16(x: any) { } - +let qo26 =new C(); +let qo24 = new PA(); +let qo25 =new PB(); diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithPrivates2.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithPrivates2.ts index 769e59f06d..403c1692d7 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithPrivates2.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithPrivates2.ts @@ -35,3 +35,4 @@ function foo6(x: D<number>): string; // error function foo6(x: any): any { } +let d1 = new D(); diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithPublics.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithPublics.ts index 813a8333e5..6f12d3d4e0 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithPublics.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithPublics.ts @@ -85,4 +85,7 @@ function foo13(x: any) { } function foo14(x: I); function foo14(x: typeof b); // error -function foo14(x: any) { } \ No newline at end of file +function foo14(x: any) { } +let qy41 = new A(); +let qy42 =new B(); +let qy43 =new C(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithStringIndexers.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithStringIndexers.ts index f511e56bc3..e6d583aa06 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithStringIndexers.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithStringIndexers.ts @@ -119,3 +119,6 @@ function foo16(x: I); function foo16(x: PB); // error function foo16(x: any) { } +let qo35 =new C(); +let qo33 = new PA(); +let qo34 =new PB(); diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithStringIndexers2.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithStringIndexers2.ts index d8af511910..7c37adc723 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithStringIndexers2.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithStringIndexers2.ts @@ -122,3 +122,8 @@ function foo16(x: I); function foo16(x: PB); // error function foo16(x: any) { } + +let der = new Derived(); +let c1 = new C(); +let pa = new PA(); +let pb = new PB(); diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/typeParametersAreIdenticalToThemselves.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/typeParametersAreIdenticalToThemselves.ts index 0495789326..383623ee14 100644 --- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/typeParametersAreIdenticalToThemselves.ts +++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/typeParametersAreIdenticalToThemselves.ts @@ -73,4 +73,6 @@ interface I2<T extends Date> { foo3<T>(x: T); foo3<T>(x: T); // no error, different declaration for each T -} \ No newline at end of file +} +let qy36 = new C(); +let qy37 =new C2(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithConstraintsTypeArgumentInference.ts b/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithConstraintsTypeArgumentInference.ts index 601f790667..b8526977ef 100644 --- a/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithConstraintsTypeArgumentInference.ts +++ b/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithConstraintsTypeArgumentInference.ts @@ -104,3 +104,6 @@ var r8b = i.foo5(d2, d2); // Derived2 var r9 = i.foo6(); // Derived var r10 = i.foo7(d1); // Base var r11 = i.foo8(); // Base + +let qu12 = new Derived(); +let qu13 = new Derived2(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithFunctionTypedArguments4.ts b/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithFunctionTypedArguments4.ts index 3d68ff7a0d..74c3573627 100644 --- a/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithFunctionTypedArguments4.ts +++ b/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithFunctionTypedArguments4.ts @@ -19,4 +19,6 @@ var b: { new<T>(x: T): any; } -var r2 = foo4(b); // T is {} (candidates boolean and {}), U is any (candidates any and {}) \ No newline at end of file +var r2 = foo4(b); // T is {} (candidates boolean and {}), U is any (candidates any and {}) +let qy3 = new C(); +let qy4 =new D(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgs2.ts b/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgs2.ts index 514df351cc..52f1c5e20f 100644 --- a/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgs2.ts +++ b/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgs2.ts @@ -29,4 +29,6 @@ interface I<T, U> { } var i: I<Base, Derived>; -var r4 = f2(i); // Base => Derived \ No newline at end of file +var r4 = f2(i); // Base => Derived +let qy0 = new Derived(); +let qy1 = new Derived2(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgsAndConstraints.ts b/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgsAndConstraints.ts index e1c91529d7..475dfe3dcb 100644 --- a/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgsAndConstraints.ts +++ b/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgsAndConstraints.ts @@ -19,8 +19,8 @@ function foo<T extends { x: string }>(t: X<T>, t2: X<T>) { return x; } -var c1 = new X<C>(); -var d1 = new X<D>(); +// var c1 = new X<C>(); +// var d1 = new X<D>(); var r = foo(c1, d1); var r2 = foo(c1, c1); @@ -30,4 +30,8 @@ function foo2<T extends C>(t: X<T>, t2: X<T>) { } var r = foo2(c1, d1); -var r2 = foo2(c1, c1); \ No newline at end of file +var r2 = foo2(c1, c1); + +let qu4 = new C(); +let qu5 = new D(); +let qu6 = new X(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgsAndConstraints2.ts b/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgsAndConstraints2.ts index c97915eaf1..5f7fee7daf 100644 --- a/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgsAndConstraints2.ts +++ b/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgsAndConstraints2.ts @@ -35,3 +35,4 @@ var r5 = f3(new Derived(), x => x); var r6 = f3(null, null); // any var r7 = f3(null, x => x); // any +let qu8 = new Derived(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeInference/genericClassWithObjectTypeArgsAndConstraints.ts b/tests/cases/conformance/types/typeRelationships/typeInference/genericClassWithObjectTypeArgsAndConstraints.ts index 1c29b3822b..a52b2b835e 100644 --- a/tests/cases/conformance/types/typeRelationships/typeInference/genericClassWithObjectTypeArgsAndConstraints.ts +++ b/tests/cases/conformance/types/typeRelationships/typeInference/genericClassWithObjectTypeArgsAndConstraints.ts @@ -37,6 +37,8 @@ module Class { var g2: G2<D>; var r = g2.foo2(c1, d1); var r2 = g2.foo2(c1, c1); + var gg1 = new G(); + var gg2 = new G2(); } module Interface { @@ -57,4 +59,7 @@ module Interface { var g2: G2<D>; var r = g2.foo2(c1, d1); var r2 = g2.foo2(c1, c1); -} \ No newline at end of file +} +let c = new C(); +let d = new D(); +let x = new X(); \ No newline at end of file diff --git a/tests/cases/conformance/types/typeRelationships/typeInference/keyofInferenceLowerPriorityThanReturn.ts b/tests/cases/conformance/types/typeRelationships/typeInference/keyofInferenceLowerPriorityThanReturn.ts index 9de110bd1e..7a24403769 100644 --- a/tests/cases/conformance/types/typeRelationships/typeInference/keyofInferenceLowerPriorityThanReturn.ts +++ b/tests/cases/conformance/types/typeRelationships/typeInference/keyofInferenceLowerPriorityThanReturn.ts @@ -44,3 +44,7 @@ function insertOnConflictDoNothing<Req extends object, Def extends object>(_tabl function f() { insertOnConflictDoNothing(bookTable, ConflictTarget.tableColumns(["serial"])); // <-- No error here; should use the type inferred for the return type of `tableColumns` } +let qu9 = new Write(); +let qu10 = new Col(); +let qu11 =new Table(); +let qu12 =new ConflictTarget(); \ No newline at end of file diff --git a/tests/cases/conformance/types/union/discriminatedUnionTypes3.ts b/tests/cases/conformance/types/union/discriminatedUnionTypes3.ts new file mode 100644 index 0000000000..a5e51271bc --- /dev/null +++ b/tests/cases/conformance/types/union/discriminatedUnionTypes3.ts @@ -0,0 +1,19 @@ +// @strict: true + +// Repro from #44435 + +type Correct = { + code: string + property: true + err: undefined +} +type Err = { + err: `${string} is wrong!` +} +type SomeReturnType = Correct | Err; + +const example: SomeReturnType = {} as SomeReturnType; + +if (example.err === undefined) { + example.property; // true +} \ No newline at end of file -- 2.17.1