diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts
index 782363dd6df..86c9c97bdd5 100644
--- a/src/compiler/binder.ts
+++ b/src/compiler/binder.ts
@@ -2071,7 +2071,7 @@ namespace ts {
seenThisKeyword = true;
return;
case SyntaxKind.TypePredicate:
- return checkTypePredicate(node as TypePredicateNode);
+ break; // Binding the children will handle everything
case SyntaxKind.TypeParameter:
return bindTypeParameter(node as TypeParameterDeclaration);
case SyntaxKind.Parameter:
@@ -2204,17 +2204,6 @@ namespace ts {
return bindAnonymousDeclaration(node, SymbolFlags.TypeLiteral, InternalSymbolName.Type);
}
- function checkTypePredicate(node: TypePredicateNode) {
- const { parameterName, type } = node;
- if (parameterName && parameterName.kind === SyntaxKind.Identifier) {
- checkStrictModeIdentifier(parameterName);
- }
- if (parameterName && parameterName.kind === SyntaxKind.ThisType) {
- seenThisKeyword = true;
- }
- bind(type);
- }
-
function bindSourceFileIfExternalModule() {
setExportContextFlag(file);
if (isExternalModule(file)) {
diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts
index 520b477da0b..587f7eb4837 100644
--- a/src/compiler/checker.ts
+++ b/src/compiler/checker.ts
@@ -260,7 +260,7 @@ namespace ts {
node = getParseTreeNode(node, isJsxOpeningLikeElement);
return node ? getAllAttributesTypeFromJsxOpeningLikeElement(node) : undefined;
},
- getJsxIntrinsicTagNames,
+ getJsxIntrinsicTagNamesAt,
isOptionalParameter: node => {
node = getParseTreeNode(node, isParameter);
return node ? isOptionalParameter(node) : false;
@@ -299,7 +299,7 @@ namespace ts {
resolveName(name, location, meaning, excludeGlobals) {
return resolveName(location, escapeLeadingUnderscores(name), meaning, /*nameNotFoundMessage*/ undefined, /*nameArg*/ undefined, /*isUse*/ false, excludeGlobals);
},
- getJsxNamespace: () => unescapeLeadingUnderscores(getJsxNamespace()),
+ getJsxNamespace: n => unescapeLeadingUnderscores(getJsxNamespace(n)),
getAccessibleSymbolChain,
getTypePredicateOfSignature,
resolveExternalModuleSymbol,
@@ -416,9 +416,6 @@ namespace ts {
let deferredGlobalAsyncIteratorType: GenericType;
let deferredGlobalAsyncIterableIteratorType: GenericType;
let deferredGlobalTemplateStringsArrayType: ObjectType;
- let deferredJsxElementClassType: Type;
- let deferredJsxElementType: Type;
- let deferredJsxStatelessElementType: Type;
let deferredNodes: Node[];
let deferredUnusedIdentifierNodes: Node[];
@@ -544,13 +541,6 @@ namespace ts {
let _jsxNamespace: __String;
let _jsxFactoryEntity: EntityName;
- let _jsxElementPropertiesName: __String;
- let _hasComputedJsxElementPropertiesName = false;
- let _jsxElementChildrenPropertyName: __String;
- let _hasComputedJsxElementChildrenPropertyName = false;
-
- /** Things we lazy load from the JSX namespace */
- const jsxTypes = createUnderscoreEscapedMap();
const subtypeRelation = createMap();
const assignableRelation = createMap();
@@ -765,7 +755,23 @@ namespace ts {
}
}
- function getJsxNamespace(): __String {
+ function getJsxNamespace(location: Node | undefined): __String {
+ if (location) {
+ const file = getSourceFileOfNode(location);
+ if (file) {
+ if (file.localJsxNamespace) {
+ return file.localJsxNamespace;
+ }
+ const jsxPragma = file.pragmas.get("jsx");
+ if (jsxPragma) {
+ const chosenpragma = isArray(jsxPragma) ? jsxPragma[0] : jsxPragma;
+ file.localJsxFactory = parseIsolatedEntityName(chosenpragma.arguments.factory, languageVersion);
+ if (file.localJsxFactory) {
+ return file.localJsxNamespace = getFirstIdentifier(file.localJsxFactory).escapedText;
+ }
+ }
+ }
+ }
if (!_jsxNamespace) {
_jsxNamespace = "React" as __String;
if (compilerOptions.jsxFactory) {
@@ -2750,7 +2756,7 @@ namespace ts {
}
}
- function typeToString(type: Type, enclosingDeclaration?: Node, flags?: TypeFormatFlags, writer: EmitTextWriter = createTextWriter("")): string {
+ function typeToString(type: Type, enclosingDeclaration?: Node, flags: TypeFormatFlags = TypeFormatFlags.AllowUniqueESSymbolType, writer: EmitTextWriter = createTextWriter("")): string {
const typeNode = nodeBuilder.typeToTypeNode(type, enclosingDeclaration, toNodeBuilderFlags(flags) | NodeBuilderFlags.IgnoreErrors, writer);
Debug.assert(typeNode !== undefined, "should always get typenode");
const options = { removeComments: true };
@@ -2882,6 +2888,9 @@ namespace ts {
}
if (type.flags & TypeFlags.UniqueESSymbol) {
if (!(context.flags & NodeBuilderFlags.AllowUniqueESSymbolType)) {
+ if (isValueSymbolAccessible(type.symbol, context.enclosingDeclaration)) {
+ return createTypeQueryNode(symbolToName(type.symbol, context, SymbolFlags.Value, /*expectsIdentifier*/ false));
+ }
if (context.tracker.reportInaccessibleUniqueSymbolError) {
context.tracker.reportInaccessibleUniqueSymbolError();
}
@@ -7503,16 +7512,6 @@ namespace ts {
return symbol && getTypeOfGlobalSymbol(symbol, arity);
}
- /**
- * Returns a type that is inside a namespace at the global scope, e.g.
- * getExportedTypeFromNamespace('JSX', 'Element') returns the JSX.Element type
- */
- function getExportedTypeFromNamespace(namespace: __String, name: __String): Type {
- const namespaceSymbol = getGlobalSymbol(namespace, SymbolFlags.Namespace, /*diagnosticMessage*/ undefined);
- const typeSymbol = namespaceSymbol && getSymbol(namespaceSymbol.exports, name, SymbolFlags.Type);
- return typeSymbol && getDeclaredTypeOfSymbol(typeSymbol);
- }
-
/**
* Instantiates a global type that is generic with some element type, and returns that instantiation.
*/
@@ -11167,6 +11166,10 @@ namespace ts {
}
const result = createSymbol(SymbolFlags.Property | SymbolFlags.Optional, name);
result.type = undefinedType;
+ const associatedKeyType = getLiteralType(unescapeLeadingUnderscores(name));
+ if (associatedKeyType.flags & TypeFlags.StringLiteral) {
+ result.syntheticLiteralTypeOrigin = associatedKeyType as StringLiteralType;
+ }
undefinedProperties.set(name, result);
return result;
}
@@ -11659,7 +11662,7 @@ namespace ts {
}
}
else {
- if (!(priority && InferencePriority.NoConstraints && source.flags & (TypeFlags.Intersection | TypeFlags.Instantiable))) {
+ if (!(priority & InferencePriority.NoConstraints && source.flags & (TypeFlags.Intersection | TypeFlags.Instantiable))) {
source = getApparentType(source);
}
if (source.flags & (TypeFlags.Object | TypeFlags.Intersection)) {
@@ -14360,7 +14363,7 @@ namespace ts {
function getContextualTypeForChildJsxExpression(node: JsxElement) {
const attributesType = getApparentTypeOfContextualType(node.openingElement.tagName);
// JSX expression is in children of JSX Element, we will look for an "children" atttribute (we get the name from JSX.ElementAttributesProperty)
- const jsxChildrenPropertyName = getJsxElementChildrenPropertyName();
+ const jsxChildrenPropertyName = getJsxElementChildrenPropertyName(getJsxNamespaceAt(node));
return attributesType && !isTypeAny(attributesType) && jsxChildrenPropertyName && jsxChildrenPropertyName !== "" ? getTypeOfPropertyOfContextualType(attributesType, jsxChildrenPropertyName) : undefined;
}
@@ -14514,18 +14517,10 @@ namespace ts {
}
const isJs = isInJavaScriptFile(node);
- return mapType(valueType, isJs ? getJsxSignaturesParameterTypesJs : getJsxSignaturesParameterTypes);
+ return mapType(valueType, t => getJsxSignaturesParameterTypes(t, isJs, node));
}
- function getJsxSignaturesParameterTypes(valueType: Type) {
- return getJsxSignaturesParameterTypesInternal(valueType, /*isJs*/ false);
- }
-
- function getJsxSignaturesParameterTypesJs(valueType: Type) {
- return getJsxSignaturesParameterTypesInternal(valueType, /*isJs*/ true);
- }
-
- function getJsxSignaturesParameterTypesInternal(valueType: Type, isJs: boolean) {
+ function getJsxSignaturesParameterTypes(valueType: Type, isJs: boolean, context: Node) {
// If the elemType is a string type, we have to return anyType to prevent an error downstream as we will try to find construct or call signature of the type
if (valueType.flags & TypeFlags.String) {
return anyType;
@@ -14535,7 +14530,7 @@ namespace ts {
// For example:
// var CustomTag: "h1" = "h1";
// Hello World
- const intrinsicElementsType = getJsxType(JsxNames.IntrinsicElements);
+ const intrinsicElementsType = getJsxType(JsxNames.IntrinsicElements, context);
if (intrinsicElementsType !== unknownType) {
const stringLiteralTypeName = (valueType).value;
const intrinsicProp = getPropertyOfType(intrinsicElementsType, escapeLeadingUnderscores(stringLiteralTypeName));
@@ -14563,24 +14558,24 @@ namespace ts {
}
}
- return getUnionType(map(signatures, ctor ? isJs ? getJsxPropsTypeFromConstructSignatureJs : getJsxPropsTypeFromConstructSignature : getJsxPropsTypeFromCallSignature), UnionReduction.None);
+ return getUnionType(map(signatures, ctor ? t => getJsxPropsTypeFromConstructSignature(t, isJs, context) : t => getJsxPropsTypeFromCallSignature(t, context)), UnionReduction.None);
}
- function getJsxPropsTypeFromCallSignature(sig: Signature) {
+ function getJsxPropsTypeFromCallSignature(sig: Signature, context: Node) {
let propsType = getTypeOfFirstParameterOfSignature(sig);
- const intrinsicAttribs = getJsxType(JsxNames.IntrinsicAttributes);
+ const intrinsicAttribs = getJsxType(JsxNames.IntrinsicAttributes, context);
if (intrinsicAttribs !== unknownType) {
propsType = intersectTypes(intrinsicAttribs, propsType);
}
return propsType;
}
- function getJsxPropsTypeFromClassType(hostClassType: Type, isJs: boolean) {
+ function getJsxPropsTypeFromClassType(hostClassType: Type, isJs: boolean, context: Node) {
if (isTypeAny(hostClassType)) {
return hostClassType;
}
- const propsName = getJsxElementPropertiesName();
+ const propsName = getJsxElementPropertiesName(getJsxNamespaceAt(context));
if (propsName === undefined) {
// There is no type ElementAttributesProperty, return 'any'
return anyType;
@@ -14603,7 +14598,7 @@ namespace ts {
else {
// Normal case -- add in IntrinsicClassElements and IntrinsicElements
let apparentAttributesType = attributesType;
- const intrinsicClassAttribs = getJsxType(JsxNames.IntrinsicClassAttributes);
+ const intrinsicClassAttribs = getJsxType(JsxNames.IntrinsicClassAttributes, context);
if (intrinsicClassAttribs !== unknownType) {
const typeParams = getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(intrinsicClassAttribs.symbol);
apparentAttributesType = intersectTypes(
@@ -14614,7 +14609,7 @@ namespace ts {
);
}
- const intrinsicAttribs = getJsxType(JsxNames.IntrinsicAttributes);
+ const intrinsicAttribs = getJsxType(JsxNames.IntrinsicAttributes, context);
if (intrinsicAttribs !== unknownType) {
apparentAttributesType = intersectTypes(intrinsicAttribs, apparentAttributesType);
}
@@ -14624,20 +14619,12 @@ namespace ts {
}
}
- function getJsxPropsTypeFromConstructSignatureJs(sig: Signature) {
- return getJsxPropsTypeFromConstructSignatureInternal(sig, /*isJs*/ true);
- }
-
- function getJsxPropsTypeFromConstructSignature(sig: Signature) {
- return getJsxPropsTypeFromConstructSignatureInternal(sig, /*isJs*/ false);
- }
-
- function getJsxPropsTypeFromConstructSignatureInternal(sig: Signature, isJs: boolean) {
+ function getJsxPropsTypeFromConstructSignature(sig: Signature, isJs: boolean, context: Node) {
const hostClassType = getReturnTypeOfSignature(sig);
if (hostClassType) {
- return getJsxPropsTypeFromClassType(hostClassType, isJs);
+ return getJsxPropsTypeFromClassType(hostClassType, isJs, context);
}
- return getJsxPropsTypeFromCallSignature(sig);
+ return getJsxPropsTypeFromCallSignature(sig, context);
}
@@ -15092,7 +15079,7 @@ namespace ts {
function checkJsxSelfClosingElement(node: JsxSelfClosingElement, checkMode: CheckMode): Type {
checkJsxOpeningLikeElementOrOpeningFragment(node, checkMode);
- return getJsxGlobalElementType() || anyType;
+ return getJsxElementTypeAt(node) || anyType;
}
function checkJsxElement(node: JsxElement, checkMode: CheckMode): Type {
@@ -15107,17 +15094,19 @@ namespace ts {
checkExpression(node.closingElement.tagName);
}
- return getJsxGlobalElementType() || anyType;
+ return getJsxElementTypeAt(node) || anyType;
}
function checkJsxFragment(node: JsxFragment, checkMode: CheckMode): Type {
checkJsxOpeningLikeElementOrOpeningFragment(node.openingFragment, checkMode);
- if (compilerOptions.jsx === JsxEmit.React && compilerOptions.jsxFactory) {
- error(node, Diagnostics.JSX_fragment_is_not_supported_when_using_jsxFactory);
+ if (compilerOptions.jsx === JsxEmit.React && (compilerOptions.jsxFactory || getSourceFileOfNode(node).pragmas.has("jsx"))) {
+ error(node, compilerOptions.jsxFactory
+ ? Diagnostics.JSX_fragment_is_not_supported_when_using_jsxFactory
+ : Diagnostics.JSX_fragment_is_not_supported_when_using_an_inline_JSX_factory_pragma);
}
- return getJsxGlobalElementType() || anyType;
+ return getJsxElementTypeAt(node) || anyType;
}
/**
@@ -15166,7 +15155,7 @@ namespace ts {
let hasSpreadAnyType = false;
let typeToIntersect: Type;
let explicitlySpecifyChildrenAttribute = false;
- const jsxChildrenPropertyName = getJsxElementChildrenPropertyName();
+ const jsxChildrenPropertyName = getJsxElementChildrenPropertyName(getJsxNamespaceAt(openingLikeElement));
for (const attributeDecl of attributes.properties) {
const member = attributeDecl.symbol;
@@ -15282,12 +15271,11 @@ namespace ts {
return createJsxAttributesTypeFromAttributesProperty(node.parent, checkMode);
}
- function getJsxType(name: __String) {
- let jsxType = jsxTypes.get(name);
- if (jsxType === undefined) {
- jsxTypes.set(name, jsxType = getExportedTypeFromNamespace(JsxNames.JSX, name) || unknownType);
- }
- return jsxType;
+ function getJsxType(name: __String, location: Node) {
+ const namespace = getJsxNamespaceAt(location);
+ const exports = namespace && getExportsOfSymbol(namespace);
+ const typeSymbol = exports && getSymbol(exports, name, SymbolFlags.Type);
+ return typeSymbol ? getDeclaredTypeOfSymbol(typeSymbol) : unknownType;
}
/**
@@ -15299,7 +15287,7 @@ namespace ts {
function getIntrinsicTagSymbol(node: JsxOpeningLikeElement | JsxClosingElement): Symbol {
const links = getNodeLinks(node);
if (!links.resolvedSymbol) {
- const intrinsicElementsType = getJsxType(JsxNames.IntrinsicElements);
+ const intrinsicElementsType = getJsxType(JsxNames.IntrinsicElements, node);
if (intrinsicElementsType !== unknownType) {
// Property case
if (!isIdentifier(node.tagName)) throw Debug.fail();
@@ -15371,6 +15359,19 @@ namespace ts {
return getUnionType(map(instantiatedSignatures, getReturnTypeOfSignature), UnionReduction.Subtype);
}
+ function getJsxNamespaceAt(location: Node) {
+ const namespaceName = getJsxNamespace(location);
+ const resolvedNamespace = resolveName(location, namespaceName, SymbolFlags.Namespace, /*diagnosticMessage*/ undefined, namespaceName, /*isUse*/ false);
+ if (resolvedNamespace) {
+ const candidate = getSymbol(getExportsOfSymbol(resolveSymbol(resolvedNamespace)), JsxNames.JSX, SymbolFlags.Namespace);
+ if (candidate) {
+ return candidate;
+ }
+ }
+ // JSX global fallback
+ return getGlobalSymbol(JsxNames.JSX, SymbolFlags.Namespace, /*diagnosticMessage*/ undefined);
+ }
+
/**
* Look into JSX namespace and then look for container with matching name as nameOfAttribPropContainer.
* Get a single property from that container if existed. Report an error if there are more than one property.
@@ -15378,9 +15379,7 @@ namespace ts {
* @param nameOfAttribPropContainer a string of value JsxNames.ElementAttributesPropertyNameContainer or JsxNames.ElementChildrenAttributeNameContainer
* if other string is given or the container doesn't exist, return undefined.
*/
- function getNameFromJsxElementAttributesContainer(nameOfAttribPropContainer: __String): __String {
- // JSX
- const jsxNamespace = getGlobalSymbol(JsxNames.JSX, SymbolFlags.Namespace, /*diagnosticMessage*/ undefined);
+ function getNameFromJsxElementAttributesContainer(nameOfAttribPropContainer: __String, jsxNamespace: Symbol): __String {
// JSX.ElementAttributesProperty | JSX.ElementChildrenAttribute [symbol]
const jsxElementAttribPropInterfaceSym = jsxNamespace && getSymbol(jsxNamespace.exports, nameOfAttribPropContainer, SymbolFlags.Type);
// JSX.ElementAttributesProperty | JSX.ElementChildrenAttribute [type]
@@ -15410,22 +15409,12 @@ namespace ts {
/// non-intrinsic elements' attributes type is 'any'),
/// or '' if it has 0 properties (which means every
/// non-intrinsic elements' attributes type is the element instance type)
- function getJsxElementPropertiesName() {
- if (!_hasComputedJsxElementPropertiesName) {
- _hasComputedJsxElementPropertiesName = true;
- _jsxElementPropertiesName = getNameFromJsxElementAttributesContainer(JsxNames.ElementAttributesPropertyNameContainer);
- }
-
- return _jsxElementPropertiesName;
+ function getJsxElementPropertiesName(jsxNamespace: Symbol) {
+ return getNameFromJsxElementAttributesContainer(JsxNames.ElementAttributesPropertyNameContainer, jsxNamespace);
}
- function getJsxElementChildrenPropertyName(): __String {
- if (!_hasComputedJsxElementChildrenPropertyName) {
- _hasComputedJsxElementChildrenPropertyName = true;
- _jsxElementChildrenPropertyName = getNameFromJsxElementAttributesContainer(JsxNames.ElementChildrenAttributeNameContainer);
- }
-
- return _jsxElementChildrenPropertyName;
+ function getJsxElementChildrenPropertyName(jsxNamespace: Symbol): __String {
+ return getNameFromJsxElementAttributesContainer(JsxNames.ElementChildrenAttributeNameContainer, jsxNamespace);
}
function getApparentTypeOfJsxPropsType(propsType: Type): Type {
@@ -15455,7 +15444,7 @@ namespace ts {
function defaultTryGetJsxStatelessFunctionAttributesType(openingLikeElement: JsxOpeningLikeElement, elementType: Type, elemInstanceType: Type, elementClassType?: Type): Type {
Debug.assert(!(elementType.flags & TypeFlags.Union));
if (!elementClassType || !isTypeAssignableTo(elemInstanceType, elementClassType)) {
- const jsxStatelessElementType = getJsxGlobalStatelessElementType();
+ const jsxStatelessElementType = getJsxStatelessElementTypeAt(openingLikeElement);
if (jsxStatelessElementType) {
// We don't call getResolvedSignature here because we have already resolve the type of JSX Element.
const callSignature = getResolvedJsxStatelessFunctionSignature(openingLikeElement, elementType, /*candidatesOutArray*/ undefined);
@@ -15465,7 +15454,7 @@ namespace ts {
paramType = getApparentTypeOfJsxPropsType(paramType);
if (callReturnType && isTypeAssignableTo(callReturnType, jsxStatelessElementType)) {
// Intersect in JSX.IntrinsicAttributes if it exists
- const intrinsicAttributes = getJsxType(JsxNames.IntrinsicAttributes);
+ const intrinsicAttributes = getJsxType(JsxNames.IntrinsicAttributes, openingLikeElement);
if (intrinsicAttributes !== unknownType) {
paramType = intersectTypes(intrinsicAttributes, paramType);
}
@@ -15491,7 +15480,7 @@ namespace ts {
Debug.assert(!(elementType.flags & TypeFlags.Union));
if (!elementClassType || !isTypeAssignableTo(elemInstanceType, elementClassType)) {
// Is this is a stateless function component? See if its single signature's return type is assignable to the JSX Element Type
- const jsxStatelessElementType = getJsxGlobalStatelessElementType();
+ const jsxStatelessElementType = getJsxStatelessElementTypeAt(openingLikeElement);
if (jsxStatelessElementType) {
// We don't call getResolvedSignature because here we have already resolve the type of JSX Element.
const candidatesOutArray: Signature[] = [];
@@ -15524,7 +15513,7 @@ namespace ts {
result = allMatchingAttributesType;
}
// Intersect in JSX.IntrinsicAttributes if it exists
- const intrinsicAttributes = getJsxType(JsxNames.IntrinsicAttributes);
+ const intrinsicAttributes = getJsxType(JsxNames.IntrinsicAttributes, openingLikeElement);
if (intrinsicAttributes !== unknownType) {
result = intersectTypes(intrinsicAttributes, result);
}
@@ -15573,7 +15562,7 @@ namespace ts {
// For example:
// var CustomTag: "h1" = "h1";
// Hello World
- const intrinsicElementsType = getJsxType(JsxNames.IntrinsicElements);
+ const intrinsicElementsType = getJsxType(JsxNames.IntrinsicElements, openingLikeElement);
if (intrinsicElementsType !== unknownType) {
const stringLiteralTypeName = (elementType).value;
const intrinsicProp = getPropertyOfType(intrinsicElementsType, escapeLeadingUnderscores(stringLiteralTypeName));
@@ -15608,7 +15597,7 @@ namespace ts {
checkTypeRelatedTo(elemInstanceType, elementClassType, assignableRelation, openingLikeElement, Diagnostics.JSX_element_type_0_is_not_a_constructor_function_for_JSX_elements);
}
- return getJsxPropsTypeFromClassType(elemInstanceType, isInJavaScriptFile(openingLikeElement));
+ return getJsxPropsTypeFromClassType(elemInstanceType, isInJavaScriptFile(openingLikeElement), openingLikeElement);
}
/**
@@ -15641,7 +15630,7 @@ namespace ts {
* @param shouldIncludeAllStatelessAttributesType a boolean value used by language service to get all possible attributes type from an overload stateless function component
*/
function getCustomJsxElementAttributesType(node: JsxOpeningLikeElement, shouldIncludeAllStatelessAttributesType: boolean): Type {
- return resolveCustomJsxElementAttributesType(node, shouldIncludeAllStatelessAttributesType, checkExpression(node.tagName), getJsxGlobalElementClassType());
+ return resolveCustomJsxElementAttributesType(node, shouldIncludeAllStatelessAttributesType, checkExpression(node.tagName), getJsxElementClassTypeAt(node));
}
/**
@@ -15685,35 +15674,28 @@ namespace ts {
return prop || unknownSymbol;
}
- function getJsxGlobalElementClassType(): Type {
- if (!deferredJsxElementClassType) {
- deferredJsxElementClassType = getExportedTypeFromNamespace(JsxNames.JSX, JsxNames.ElementClass);
- }
- return deferredJsxElementClassType;
+ function getJsxElementClassTypeAt(location: Node): Type {
+ const type = getJsxType(JsxNames.ElementClass, location);
+ if (type === unknownType) return undefined;
+ return type;
}
- function getJsxGlobalElementType(): Type {
- if (!deferredJsxElementType) {
- deferredJsxElementType = getExportedTypeFromNamespace(JsxNames.JSX, JsxNames.Element);
- }
- return deferredJsxElementType;
+ function getJsxElementTypeAt(location: Node): Type {
+ return getJsxType(JsxNames.Element, location);
}
- function getJsxGlobalStatelessElementType(): Type {
- if (!deferredJsxStatelessElementType) {
- const jsxElementType = getJsxGlobalElementType();
- if (jsxElementType) {
- deferredJsxStatelessElementType = getUnionType([jsxElementType, nullType]);
- }
+ function getJsxStatelessElementTypeAt(location: Node): Type {
+ const jsxElementType = getJsxElementTypeAt(location);
+ if (jsxElementType) {
+ return getUnionType([jsxElementType, nullType]);
}
- return deferredJsxStatelessElementType;
}
/**
* Returns all the properties of the Jsx.IntrinsicElements interface
*/
- function getJsxIntrinsicTagNames(): Symbol[] {
- const intrinsics = getJsxType(JsxNames.IntrinsicElements);
+ function getJsxIntrinsicTagNamesAt(location: Node): Symbol[] {
+ const intrinsics = getJsxType(JsxNames.IntrinsicElements, location);
return intrinsics ? getPropertiesOfType(intrinsics) : emptyArray;
}
@@ -15723,7 +15705,7 @@ namespace ts {
error(errorNode, Diagnostics.Cannot_use_JSX_unless_the_jsx_flag_is_provided);
}
- if (getJsxGlobalElementType() === undefined) {
+ if (getJsxElementTypeAt(errorNode) === undefined) {
if (noImplicitAny) {
error(errorNode, Diagnostics.JSX_element_implicitly_has_type_any_because_the_global_type_JSX_Element_does_not_exist);
}
@@ -15740,7 +15722,7 @@ namespace ts {
// The reactNamespace/jsxFactory's root symbol should be marked as 'used' so we don't incorrectly elide its import.
// And if there is no reactNamespace/jsxFactory's symbol in scope when targeting React emit, we should issue an error.
const reactRefErr = diagnostics && compilerOptions.jsx === JsxEmit.React ? Diagnostics.Cannot_find_name_0 : undefined;
- const reactNamespace = getJsxNamespace();
+ const reactNamespace = getJsxNamespace(node);
const reactLocation = isNodeOpeningLikeElement ? (node).tagName : node;
const reactSym = resolveName(reactLocation, reactNamespace, SymbolFlags.Value, reactRefErr, reactNamespace, /*isUse*/ true);
if (reactSym) {
@@ -15823,7 +15805,7 @@ namespace ts {
// If the targetAttributesType is an emptyObjectType, indicating that there is no property named 'props' on this instance type.
// but there exists a sourceAttributesType, we need to explicitly give an error as normal assignability check allow excess properties and will pass.
if (targetAttributesType === emptyObjectType && (isTypeAny(sourceAttributesType) || getPropertiesOfType(sourceAttributesType).length > 0)) {
- error(openingLikeElement, Diagnostics.JSX_element_class_does_not_support_attributes_because_it_does_not_have_a_0_property, unescapeLeadingUnderscores(getJsxElementPropertiesName()));
+ error(openingLikeElement, Diagnostics.JSX_element_class_does_not_support_attributes_because_it_does_not_have_a_0_property, unescapeLeadingUnderscores(getJsxElementPropertiesName(getJsxNamespaceAt(openingLikeElement))));
}
else {
// Check if sourceAttributesType assignable to targetAttributesType though this check will allow excess properties
@@ -25587,7 +25569,7 @@ namespace ts {
return !!(symbol && getCheckFlags(symbol) & CheckFlags.Late);
},
writeLiteralConstValue,
- getJsxFactoryEntity: () => _jsxFactoryEntity
+ getJsxFactoryEntity: location => location ? (getJsxNamespace(location), (getSourceFileOfNode(location).localJsxFactory || _jsxFactoryEntity)) : _jsxFactoryEntity
};
// defined here to avoid outer scope pollution
diff --git a/src/compiler/declarationEmitter.ts b/src/compiler/declarationEmitter.ts
index a9b3568bfe6..43c635db2f2 100644
--- a/src/compiler/declarationEmitter.ts
+++ b/src/compiler/declarationEmitter.ts
@@ -608,7 +608,12 @@ namespace ts {
"?");
}
write(": ");
- emitType(node.type);
+ if (node.type) {
+ emitType(node.type);
+ }
+ else {
+ write("any");
+ }
write(";");
writeLine();
decreaseIndent();
diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json
index 9801da54a5f..ba69e4db966 100644
--- a/src/compiler/diagnosticMessages.json
+++ b/src/compiler/diagnosticMessages.json
@@ -2602,7 +2602,7 @@
"code": 4083
},
"Conflicting definitions for '{0}' found at '{1}' and '{2}'. Consider installing a specific version of this library to resolve the conflict.": {
- "category": "Message",
+ "category": "Error",
"code": 4090
},
"Parameter '{0}' of index signature from exported interface has or is using name '{1}' from private module '{2}'.": {
@@ -3296,7 +3296,7 @@
"category": "Message",
"code": 6146
},
- "Resolution for module '{0}' was found in cache.": {
+ "Resolution for module '{0}' was found in cache from location '{1}'.": {
"category": "Message",
"code": 6147
},
@@ -3788,6 +3788,10 @@
"category": "Error",
"code": 17016
},
+ "JSX fragment is not supported when using an inline JSX factory pragma": {
+ "category": "Error",
+ "code": 17017
+ },
"Circularity detected while resolving configuration: {0}": {
"category": "Error",
@@ -3806,6 +3810,11 @@
"code": 18003
},
+ "File is a CommonJS module; it may be converted to an ES6 module.": {
+ "category": "Suggestion",
+ "code": 80001
+ },
+
"Add missing 'super()' call": {
"category": "Message",
"code": 90001
diff --git a/src/compiler/factory.ts b/src/compiler/factory.ts
index 92d353aeb0e..bb00a967336 100644
--- a/src/compiler/factory.ts
+++ b/src/compiler/factory.ts
@@ -2375,6 +2375,9 @@ namespace ts {
if (node.resolvedTypeReferenceDirectiveNames !== undefined) updated.resolvedTypeReferenceDirectiveNames = node.resolvedTypeReferenceDirectiveNames;
if (node.imports !== undefined) updated.imports = node.imports;
if (node.moduleAugmentations !== undefined) updated.moduleAugmentations = node.moduleAugmentations;
+ if (node.pragmas !== undefined) updated.pragmas = node.pragmas;
+ if (node.localJsxFactory !== undefined) updated.localJsxFactory = node.localJsxFactory;
+ if (node.localJsxNamespace !== undefined) updated.localJsxNamespace = node.localJsxNamespace;
return updateNode(updated, node);
}
diff --git a/src/compiler/moduleNameResolver.ts b/src/compiler/moduleNameResolver.ts
index ddb0f5cbb5d..de59e640192 100644
--- a/src/compiler/moduleNameResolver.ts
+++ b/src/compiler/moduleNameResolver.ts
@@ -335,8 +335,20 @@ namespace ts {
}
export function createModuleResolutionCache(currentDirectory: string, getCanonicalFileName: (s: string) => string): ModuleResolutionCache {
- const directoryToModuleNameMap = createMap
;
+>p : any
+ }
+}
+export const tree =
+>tree : predom.JSX.Element
+> : predom.JSX.Element
+>MySFC : (props: { x: number; y: number; children?: predom.JSX.Element[]; }) => predom.JSX.Element
+>x : number
+>1 : 1
+>y : number
+>2 : 2
+> : predom.JSX.Element
+>MyClass : typeof MyClass
+>x : number
+>3 : 3
+>y : number
+>4 : 4
+> : predom.JSX.Element
+>MyClass : typeof MyClass
+>x : number
+>5 : 5
+>y : number
+>6 : 6
+>MySFC : (props: { x: number; y: number; children?: predom.JSX.Element[]; }) => predom.JSX.Element
+
+export default
+> : predom.JSX.Element
+>h : any
+>h : any
+
+=== tests/cases/conformance/jsx/inline/index.tsx ===
+/** @jsx dom */
+import { dom } from "./renderer"
+>dom : () => dom.JSX.Element
+
+import prerendered, {MySFC, MyClass, tree} from "./component";
+>prerendered : predom.JSX.Element
+>MySFC : (props: { x: number; y: number; children?: predom.JSX.Element[]; }) => predom.JSX.Element
+>MyClass : typeof MyClass
+>tree : predom.JSX.Element
+
+let elem = prerendered;
+>elem : predom.JSX.Element
+>prerendered : predom.JSX.Element
+
+elem = ; // Expect assignability error here
+>elem = : dom.JSX.Element
+>elem : predom.JSX.Element
+> : dom.JSX.Element
+>h : any
+>h : any
+
+const DOMSFC = (props: {x: number, y: number, children?: dom.JSX.Element[]}) => {props.x} + {props.y} = {props.x + props.y}{props.children}
;
+>DOMSFC : (props: { x: number; y: number; children?: dom.JSX.Element[]; }) => dom.JSX.Element
+>(props: {x: number, y: number, children?: dom.JSX.Element[]}) => {props.x} + {props.y} = {props.x + props.y}{props.children}
: (props: { x: number; y: number; children?: dom.JSX.Element[]; }) => dom.JSX.Element
+>props : { x: number; y: number; children?: dom.JSX.Element[]; }
+>x : number
+>y : number
+>children : dom.JSX.Element[]
+>dom : any
+>JSX : any
+>Element : dom.JSX.Element
+>{props.x} + {props.y} = {props.x + props.y}{props.children}
: dom.JSX.Element
+>p : any
+>props.x : number
+>props : { x: number; y: number; children?: dom.JSX.Element[]; }
+>x : number
+>props.y : number
+>props : { x: number; y: number; children?: dom.JSX.Element[]; }
+>y : number
+>props.x + props.y : number
+>props.x : number
+>props : { x: number; y: number; children?: dom.JSX.Element[]; }
+>x : number
+>props.y : number
+>props : { x: number; y: number; children?: dom.JSX.Element[]; }
+>y : number
+>props.children : dom.JSX.Element[]
+>props : { x: number; y: number; children?: dom.JSX.Element[]; }
+>children : dom.JSX.Element[]
+>p : any
+
+class DOMClass implements dom.JSX.Element {
+>DOMClass : DOMClass
+>dom.JSX.Element : any
+>dom.JSX : any
+>dom : () => dom.JSX.Element
+>JSX : any
+>Element : dom.JSX.Element
+
+ __domBrand!: void;
+>__domBrand : void
+
+ constructor(public props: {x: number, y: number, children?: dom.JSX.Element[]}) {}
+>props : { x: number; y: number; children?: dom.JSX.Element[]; }
+>x : number
+>y : number
+>children : dom.JSX.Element[]
+>dom : any
+>JSX : any
+>Element : dom.JSX.Element
+
+ render() {
+>render : () => dom.JSX.Element
+
+ return {this.props.x} + {this.props.y} = {this.props.x + this.props.y}{...this.props.children}
;
+>{this.props.x} + {this.props.y} = {this.props.x + this.props.y}{...this.props.children}
: dom.JSX.Element
+>p : any
+>this.props.x : number
+>this.props : { x: number; y: number; children?: dom.JSX.Element[]; }
+>this : this
+>props : { x: number; y: number; children?: dom.JSX.Element[]; }
+>x : number
+>this.props.y : number
+>this.props : { x: number; y: number; children?: dom.JSX.Element[]; }
+>this : this
+>props : { x: number; y: number; children?: dom.JSX.Element[]; }
+>y : number
+>this.props.x + this.props.y : number
+>this.props.x : number
+>this.props : { x: number; y: number; children?: dom.JSX.Element[]; }
+>this : this
+>props : { x: number; y: number; children?: dom.JSX.Element[]; }
+>x : number
+>this.props.y : number
+>this.props : { x: number; y: number; children?: dom.JSX.Element[]; }
+>this : this
+>props : { x: number; y: number; children?: dom.JSX.Element[]; }
+>y : number
+>this.props.children : dom.JSX.Element[]
+>this.props : { x: number; y: number; children?: dom.JSX.Element[]; }
+>this : this
+>props : { x: number; y: number; children?: dom.JSX.Element[]; }
+>children : dom.JSX.Element[]
+>p : any
+ }
+}
+
+// Should work, everything is a DOM element
+const _tree =
+>_tree : dom.JSX.Element
+> : dom.JSX.Element
+>DOMSFC : (props: { x: number; y: number; children?: dom.JSX.Element[]; }) => dom.JSX.Element
+>x : number
+>1 : 1
+>y : number
+>2 : 2
+> : dom.JSX.Element
+>DOMClass : typeof DOMClass
+>x : number
+>3 : 3
+>y : number
+>4 : 4
+> : dom.JSX.Element
+>DOMClass : typeof DOMClass
+>x : number
+>5 : 5
+>y : number
+>6 : 6
+>DOMSFC : (props: { x: number; y: number; children?: dom.JSX.Element[]; }) => dom.JSX.Element
+
+// Should fail, no dom elements
+const _brokenTree =
+>_brokenTree : dom.JSX.Element
+> : dom.JSX.Element
+>MySFC : (props: { x: number; y: number; children?: predom.JSX.Element[]; }) => predom.JSX.Element
+>x : number
+>1 : 1
+>y : number
+>2 : 2
+> : dom.JSX.Element
+>MyClass : typeof MyClass
+>x : number
+>3 : 3
+>y : number
+>4 : 4
+> : dom.JSX.Element
+>MyClass : typeof MyClass
+>x : number
+>5 : 5
+>y : number
+>6 : 6
+>MySFC : (props: { x: number; y: number; children?: predom.JSX.Element[]; }) => predom.JSX.Element
+
+// Should fail, nondom isn't allowed as children of dom
+const _brokenTree2 = {tree}{tree}
+>_brokenTree2 : dom.JSX.Element
+>{tree}{tree} : dom.JSX.Element
+>DOMSFC : (props: { x: number; y: number; children?: dom.JSX.Element[]; }) => dom.JSX.Element
+>x : number
+>1 : 1
+>y : number
+>2 : 2
+>tree : predom.JSX.Element
+>tree : predom.JSX.Element
+>DOMSFC : (props: { x: number; y: number; children?: dom.JSX.Element[]; }) => dom.JSX.Element
+
diff --git a/tests/baselines/reference/inlineJsxFactoryLocalTypeGlobalFallback.errors.txt b/tests/baselines/reference/inlineJsxFactoryLocalTypeGlobalFallback.errors.txt
new file mode 100644
index 00000000000..9d4e4e0a026
--- /dev/null
+++ b/tests/baselines/reference/inlineJsxFactoryLocalTypeGlobalFallback.errors.txt
@@ -0,0 +1,51 @@
+tests/cases/conformance/jsx/inline/index.tsx(5,1): error TS2322: Type 'JSX.Element' is not assignable to type 'predom.JSX.Element'.
+ Property '__predomBrand' is missing in type 'Element'.
+
+
+==== tests/cases/conformance/jsx/inline/renderer.d.ts (0 errors) ====
+ declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ [e: string]: {};
+ }
+ interface Element {
+ __domBrand: void;
+ children: Element[];
+ props: {};
+ }
+ interface ElementAttributesProperty { props: any; }
+ interface ElementChildrenAttribute { children: any; }
+ }
+ }
+ export function dom(): JSX.Element;
+==== tests/cases/conformance/jsx/inline/renderer2.d.ts (0 errors) ====
+ export namespace predom {
+ namespace JSX {
+ interface IntrinsicElements {
+ [e: string]: {};
+ }
+ interface Element {
+ __predomBrand: void;
+ children: Element[];
+ props: {};
+ }
+ interface ElementAttributesProperty { props: any; }
+ interface ElementChildrenAttribute { children: any; }
+ }
+ }
+ export function predom(): predom.JSX.Element;
+==== tests/cases/conformance/jsx/inline/component.tsx (0 errors) ====
+ /** @jsx predom */
+ import { predom } from "./renderer2"
+ export default
+
+==== tests/cases/conformance/jsx/inline/index.tsx (1 errors) ====
+ /** @jsx dom */
+ import { dom } from "./renderer"
+ import prerendered from "./component";
+ let elem = prerendered;
+ elem = ; // Expect assignability error here
+ ~~~~
+!!! error TS2322: Type 'JSX.Element' is not assignable to type 'predom.JSX.Element'.
+!!! error TS2322: Property '__predomBrand' is missing in type 'Element'.
+
\ No newline at end of file
diff --git a/tests/baselines/reference/inlineJsxFactoryLocalTypeGlobalFallback.js b/tests/baselines/reference/inlineJsxFactoryLocalTypeGlobalFallback.js
new file mode 100644
index 00000000000..4f5123ed67d
--- /dev/null
+++ b/tests/baselines/reference/inlineJsxFactoryLocalTypeGlobalFallback.js
@@ -0,0 +1,61 @@
+//// [tests/cases/conformance/jsx/inline/inlineJsxFactoryLocalTypeGlobalFallback.tsx] ////
+
+//// [renderer.d.ts]
+declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ [e: string]: {};
+ }
+ interface Element {
+ __domBrand: void;
+ children: Element[];
+ props: {};
+ }
+ interface ElementAttributesProperty { props: any; }
+ interface ElementChildrenAttribute { children: any; }
+ }
+}
+export function dom(): JSX.Element;
+//// [renderer2.d.ts]
+export namespace predom {
+ namespace JSX {
+ interface IntrinsicElements {
+ [e: string]: {};
+ }
+ interface Element {
+ __predomBrand: void;
+ children: Element[];
+ props: {};
+ }
+ interface ElementAttributesProperty { props: any; }
+ interface ElementChildrenAttribute { children: any; }
+ }
+}
+export function predom(): predom.JSX.Element;
+//// [component.tsx]
+/** @jsx predom */
+import { predom } from "./renderer2"
+export default
+
+//// [index.tsx]
+/** @jsx dom */
+import { dom } from "./renderer"
+import prerendered from "./component";
+let elem = prerendered;
+elem = ; // Expect assignability error here
+
+
+//// [component.js]
+"use strict";
+exports.__esModule = true;
+/** @jsx predom */
+var renderer2_1 = require("./renderer2");
+exports["default"] = renderer2_1.predom("h", null);
+//// [index.js]
+"use strict";
+exports.__esModule = true;
+/** @jsx dom */
+var renderer_1 = require("./renderer");
+var component_1 = require("./component");
+var elem = component_1["default"];
+elem = renderer_1.dom("h", null); // Expect assignability error here
diff --git a/tests/baselines/reference/inlineJsxFactoryLocalTypeGlobalFallback.symbols b/tests/baselines/reference/inlineJsxFactoryLocalTypeGlobalFallback.symbols
new file mode 100644
index 00000000000..c4962015871
--- /dev/null
+++ b/tests/baselines/reference/inlineJsxFactoryLocalTypeGlobalFallback.symbols
@@ -0,0 +1,107 @@
+=== tests/cases/conformance/jsx/inline/renderer.d.ts ===
+declare global {
+>global : Symbol(global, Decl(renderer.d.ts, 0, 0))
+
+ namespace JSX {
+>JSX : Symbol(JSX, Decl(renderer.d.ts, 0, 16))
+
+ interface IntrinsicElements {
+>IntrinsicElements : Symbol(IntrinsicElements, Decl(renderer.d.ts, 1, 19))
+
+ [e: string]: {};
+>e : Symbol(e, Decl(renderer.d.ts, 3, 13))
+ }
+ interface Element {
+>Element : Symbol(Element, Decl(renderer.d.ts, 4, 9))
+
+ __domBrand: void;
+>__domBrand : Symbol(Element.__domBrand, Decl(renderer.d.ts, 5, 27))
+
+ children: Element[];
+>children : Symbol(Element.children, Decl(renderer.d.ts, 6, 29))
+>Element : Symbol(Element, Decl(renderer.d.ts, 4, 9))
+
+ props: {};
+>props : Symbol(Element.props, Decl(renderer.d.ts, 7, 32))
+ }
+ interface ElementAttributesProperty { props: any; }
+>ElementAttributesProperty : Symbol(ElementAttributesProperty, Decl(renderer.d.ts, 9, 9))
+>props : Symbol(ElementAttributesProperty.props, Decl(renderer.d.ts, 10, 45))
+
+ interface ElementChildrenAttribute { children: any; }
+>ElementChildrenAttribute : Symbol(ElementChildrenAttribute, Decl(renderer.d.ts, 10, 59))
+>children : Symbol(ElementChildrenAttribute.children, Decl(renderer.d.ts, 11, 44))
+ }
+}
+export function dom(): JSX.Element;
+>dom : Symbol(dom, Decl(renderer.d.ts, 13, 1))
+>JSX : Symbol(JSX, Decl(renderer.d.ts, 0, 16))
+>Element : Symbol(JSX.Element, Decl(renderer.d.ts, 4, 9))
+
+=== tests/cases/conformance/jsx/inline/renderer2.d.ts ===
+export namespace predom {
+>predom : Symbol(predom, Decl(renderer2.d.ts, 0, 0), Decl(renderer2.d.ts, 13, 1))
+
+ namespace JSX {
+>JSX : Symbol(JSX, Decl(renderer2.d.ts, 0, 25))
+
+ interface IntrinsicElements {
+>IntrinsicElements : Symbol(IntrinsicElements, Decl(renderer2.d.ts, 1, 19))
+
+ [e: string]: {};
+>e : Symbol(e, Decl(renderer2.d.ts, 3, 13))
+ }
+ interface Element {
+>Element : Symbol(Element, Decl(renderer2.d.ts, 4, 9))
+
+ __predomBrand: void;
+>__predomBrand : Symbol(Element.__predomBrand, Decl(renderer2.d.ts, 5, 27))
+
+ children: Element[];
+>children : Symbol(Element.children, Decl(renderer2.d.ts, 6, 32))
+>Element : Symbol(Element, Decl(renderer2.d.ts, 4, 9))
+
+ props: {};
+>props : Symbol(Element.props, Decl(renderer2.d.ts, 7, 32))
+ }
+ interface ElementAttributesProperty { props: any; }
+>ElementAttributesProperty : Symbol(ElementAttributesProperty, Decl(renderer2.d.ts, 9, 9))
+>props : Symbol(ElementAttributesProperty.props, Decl(renderer2.d.ts, 10, 45))
+
+ interface ElementChildrenAttribute { children: any; }
+>ElementChildrenAttribute : Symbol(ElementChildrenAttribute, Decl(renderer2.d.ts, 10, 59))
+>children : Symbol(ElementChildrenAttribute.children, Decl(renderer2.d.ts, 11, 44))
+ }
+}
+export function predom(): predom.JSX.Element;
+>predom : Symbol(predom, Decl(renderer2.d.ts, 0, 0), Decl(renderer2.d.ts, 13, 1))
+>predom : Symbol(predom, Decl(renderer2.d.ts, 0, 0), Decl(renderer2.d.ts, 13, 1))
+>JSX : Symbol(predom.JSX, Decl(renderer2.d.ts, 0, 25))
+>Element : Symbol(predom.JSX.Element, Decl(renderer2.d.ts, 4, 9))
+
+=== tests/cases/conformance/jsx/inline/component.tsx ===
+/** @jsx predom */
+import { predom } from "./renderer2"
+>predom : Symbol(predom, Decl(component.tsx, 1, 8))
+
+export default
+>h : Symbol(predom.JSX.IntrinsicElements, Decl(renderer2.d.ts, 1, 19))
+>h : Symbol(predom.JSX.IntrinsicElements, Decl(renderer2.d.ts, 1, 19))
+
+=== tests/cases/conformance/jsx/inline/index.tsx ===
+/** @jsx dom */
+import { dom } from "./renderer"
+>dom : Symbol(dom, Decl(index.tsx, 1, 8))
+
+import prerendered from "./component";
+>prerendered : Symbol(prerendered, Decl(index.tsx, 2, 6))
+
+let elem = prerendered;
+>elem : Symbol(elem, Decl(index.tsx, 3, 3))
+>prerendered : Symbol(prerendered, Decl(index.tsx, 2, 6))
+
+elem = ; // Expect assignability error here
+>elem : Symbol(elem, Decl(index.tsx, 3, 3))
+>h : Symbol(JSX.IntrinsicElements, Decl(renderer.d.ts, 1, 19))
+>h : Symbol(JSX.IntrinsicElements, Decl(renderer.d.ts, 1, 19))
+
diff --git a/tests/baselines/reference/inlineJsxFactoryLocalTypeGlobalFallback.types b/tests/baselines/reference/inlineJsxFactoryLocalTypeGlobalFallback.types
new file mode 100644
index 00000000000..369341f0f7a
--- /dev/null
+++ b/tests/baselines/reference/inlineJsxFactoryLocalTypeGlobalFallback.types
@@ -0,0 +1,110 @@
+=== tests/cases/conformance/jsx/inline/renderer.d.ts ===
+declare global {
+>global : any
+
+ namespace JSX {
+>JSX : any
+
+ interface IntrinsicElements {
+>IntrinsicElements : IntrinsicElements
+
+ [e: string]: {};
+>e : string
+ }
+ interface Element {
+>Element : Element
+
+ __domBrand: void;
+>__domBrand : void
+
+ children: Element[];
+>children : Element[]
+>Element : Element
+
+ props: {};
+>props : {}
+ }
+ interface ElementAttributesProperty { props: any; }
+>ElementAttributesProperty : ElementAttributesProperty
+>props : any
+
+ interface ElementChildrenAttribute { children: any; }
+>ElementChildrenAttribute : ElementChildrenAttribute
+>children : any
+ }
+}
+export function dom(): JSX.Element;
+>dom : () => JSX.Element
+>JSX : any
+>Element : JSX.Element
+
+=== tests/cases/conformance/jsx/inline/renderer2.d.ts ===
+export namespace predom {
+>predom : () => JSX.Element
+
+ namespace JSX {
+>JSX : any
+
+ interface IntrinsicElements {
+>IntrinsicElements : IntrinsicElements
+
+ [e: string]: {};
+>e : string
+ }
+ interface Element {
+>Element : Element
+
+ __predomBrand: void;
+>__predomBrand : void
+
+ children: Element[];
+>children : Element[]
+>Element : Element
+
+ props: {};
+>props : {}
+ }
+ interface ElementAttributesProperty { props: any; }
+>ElementAttributesProperty : ElementAttributesProperty
+>props : any
+
+ interface ElementChildrenAttribute { children: any; }
+>ElementChildrenAttribute : ElementChildrenAttribute
+>children : any
+ }
+}
+export function predom(): predom.JSX.Element;
+>predom : () => predom.JSX.Element
+>predom : any
+>JSX : any
+>Element : predom.JSX.Element
+
+=== tests/cases/conformance/jsx/inline/component.tsx ===
+/** @jsx predom */
+import { predom } from "./renderer2"
+>predom : () => predom.JSX.Element
+
+export default
+> : predom.JSX.Element
+>h : any
+>h : any
+
+=== tests/cases/conformance/jsx/inline/index.tsx ===
+/** @jsx dom */
+import { dom } from "./renderer"
+>dom : () => JSX.Element
+
+import prerendered from "./component";
+>prerendered : predom.JSX.Element
+
+let elem = prerendered;
+>elem : predom.JSX.Element
+>prerendered : predom.JSX.Element
+
+elem = ; // Expect assignability error here
+>elem = : JSX.Element
+>elem : predom.JSX.Element
+> : JSX.Element
+>h : any
+>h : any
+
diff --git a/tests/baselines/reference/inlineJsxFactoryOverridesCompilerOption.js b/tests/baselines/reference/inlineJsxFactoryOverridesCompilerOption.js
new file mode 100644
index 00000000000..fef2e38ee3b
--- /dev/null
+++ b/tests/baselines/reference/inlineJsxFactoryOverridesCompilerOption.js
@@ -0,0 +1,32 @@
+//// [tests/cases/conformance/jsx/inline/inlineJsxFactoryOverridesCompilerOption.tsx] ////
+
+//// [renderer.d.ts]
+declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ [e: string]: any;
+ }
+ }
+}
+export function dom(): void;
+export { dom as p };
+//// [reacty.tsx]
+/** @jsx dom */
+import {dom} from "./renderer";
+
+//// [index.tsx]
+import { p } from "./renderer";
+
+
+
+//// [reacty.js]
+"use strict";
+exports.__esModule = true;
+/** @jsx dom */
+var renderer_1 = require("./renderer");
+renderer_1.dom("h", null);
+//// [index.js]
+"use strict";
+exports.__esModule = true;
+var renderer_1 = require("./renderer");
+renderer_1.p("h", null);
diff --git a/tests/baselines/reference/inlineJsxFactoryOverridesCompilerOption.symbols b/tests/baselines/reference/inlineJsxFactoryOverridesCompilerOption.symbols
new file mode 100644
index 00000000000..d3c513c5876
--- /dev/null
+++ b/tests/baselines/reference/inlineJsxFactoryOverridesCompilerOption.symbols
@@ -0,0 +1,39 @@
+=== tests/cases/conformance/jsx/inline/renderer.d.ts ===
+declare global {
+>global : Symbol(global, Decl(renderer.d.ts, 0, 0))
+
+ namespace JSX {
+>JSX : Symbol(JSX, Decl(renderer.d.ts, 0, 16))
+
+ interface IntrinsicElements {
+>IntrinsicElements : Symbol(IntrinsicElements, Decl(renderer.d.ts, 1, 19))
+
+ [e: string]: any;
+>e : Symbol(e, Decl(renderer.d.ts, 3, 13))
+ }
+ }
+}
+export function dom(): void;
+>dom : Symbol(dom, Decl(renderer.d.ts, 6, 1))
+
+export { dom as p };
+>dom : Symbol(p, Decl(renderer.d.ts, 8, 8))
+>p : Symbol(p, Decl(renderer.d.ts, 8, 8))
+
+=== tests/cases/conformance/jsx/inline/reacty.tsx ===
+/** @jsx dom */
+import {dom} from "./renderer";
+>dom : Symbol(dom, Decl(reacty.tsx, 1, 8))
+
+
+>h : Symbol(JSX.IntrinsicElements, Decl(renderer.d.ts, 1, 19))
+>h : Symbol(JSX.IntrinsicElements, Decl(renderer.d.ts, 1, 19))
+
+=== tests/cases/conformance/jsx/inline/index.tsx ===
+import { p } from "./renderer";
+>p : Symbol(p, Decl(index.tsx, 0, 8))
+
+
+>h : Symbol(JSX.IntrinsicElements, Decl(renderer.d.ts, 1, 19))
+>h : Symbol(JSX.IntrinsicElements, Decl(renderer.d.ts, 1, 19))
+
diff --git a/tests/baselines/reference/inlineJsxFactoryOverridesCompilerOption.types b/tests/baselines/reference/inlineJsxFactoryOverridesCompilerOption.types
new file mode 100644
index 00000000000..36b50405dcb
--- /dev/null
+++ b/tests/baselines/reference/inlineJsxFactoryOverridesCompilerOption.types
@@ -0,0 +1,41 @@
+=== tests/cases/conformance/jsx/inline/renderer.d.ts ===
+declare global {
+>global : any
+
+ namespace JSX {
+>JSX : any
+
+ interface IntrinsicElements {
+>IntrinsicElements : IntrinsicElements
+
+ [e: string]: any;
+>e : string
+ }
+ }
+}
+export function dom(): void;
+>dom : () => void
+
+export { dom as p };
+>dom : () => void
+>p : () => void
+
+=== tests/cases/conformance/jsx/inline/reacty.tsx ===
+/** @jsx dom */
+import {dom} from "./renderer";
+>dom : () => void
+
+
+> : any
+>h : any
+>h : any
+
+=== tests/cases/conformance/jsx/inline/index.tsx ===
+import { p } from "./renderer";
+>p : () => void
+
+
+> : any
+>h : any
+>h : any
+
diff --git a/tests/baselines/reference/inlineJsxFactoryWithFragmentIsError.errors.txt b/tests/baselines/reference/inlineJsxFactoryWithFragmentIsError.errors.txt
new file mode 100644
index 00000000000..b70ddf5f9b9
--- /dev/null
+++ b/tests/baselines/reference/inlineJsxFactoryWithFragmentIsError.errors.txt
@@ -0,0 +1,26 @@
+tests/cases/conformance/jsx/inline/index.tsx(3,1): error TS17017: JSX fragment is not supported when using an inline JSX factory pragma
+tests/cases/conformance/jsx/inline/reacty.tsx(3,1): error TS17017: JSX fragment is not supported when using an inline JSX factory pragma
+
+
+==== tests/cases/conformance/jsx/inline/renderer.d.ts (0 errors) ====
+ declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ [e: string]: any;
+ }
+ }
+ }
+ export function dom(): void;
+ export function createElement(): void;
+==== tests/cases/conformance/jsx/inline/reacty.tsx (1 errors) ====
+ /** @jsx React.createElement */
+ import * as React from "./renderer";
+ <>>
+ ~~~~~~~~~~~~
+!!! error TS17017: JSX fragment is not supported when using an inline JSX factory pragma
+==== tests/cases/conformance/jsx/inline/index.tsx (1 errors) ====
+ /** @jsx dom */
+ import { dom } from "./renderer";
+ <>>
+ ~~~~~~~~~~~~
+!!! error TS17017: JSX fragment is not supported when using an inline JSX factory pragma
\ No newline at end of file
diff --git a/tests/baselines/reference/inlineJsxFactoryWithFragmentIsError.js b/tests/baselines/reference/inlineJsxFactoryWithFragmentIsError.js
new file mode 100644
index 00000000000..3af54bc04e6
--- /dev/null
+++ b/tests/baselines/reference/inlineJsxFactoryWithFragmentIsError.js
@@ -0,0 +1,35 @@
+//// [tests/cases/conformance/jsx/inline/inlineJsxFactoryWithFragmentIsError.tsx] ////
+
+//// [renderer.d.ts]
+declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ [e: string]: any;
+ }
+ }
+}
+export function dom(): void;
+export function createElement(): void;
+//// [reacty.tsx]
+/** @jsx React.createElement */
+import * as React from "./renderer";
+<>>
+//// [index.tsx]
+/** @jsx dom */
+import { dom } from "./renderer";
+<>>
+
+//// [reacty.js]
+"use strict";
+exports.__esModule = true;
+/** @jsx React.createElement */
+var React = require("./renderer");
+React.createElement(React.Fragment, null,
+ React.createElement("h", null));
+//// [index.js]
+"use strict";
+exports.__esModule = true;
+/** @jsx dom */
+var renderer_1 = require("./renderer");
+renderer_1.dom(React.Fragment, null,
+ renderer_1.dom("h", null));
diff --git a/tests/baselines/reference/inlineJsxFactoryWithFragmentIsError.symbols b/tests/baselines/reference/inlineJsxFactoryWithFragmentIsError.symbols
new file mode 100644
index 00000000000..0453bd26105
--- /dev/null
+++ b/tests/baselines/reference/inlineJsxFactoryWithFragmentIsError.symbols
@@ -0,0 +1,39 @@
+=== tests/cases/conformance/jsx/inline/renderer.d.ts ===
+declare global {
+>global : Symbol(global, Decl(renderer.d.ts, 0, 0))
+
+ namespace JSX {
+>JSX : Symbol(JSX, Decl(renderer.d.ts, 0, 16))
+
+ interface IntrinsicElements {
+>IntrinsicElements : Symbol(IntrinsicElements, Decl(renderer.d.ts, 1, 19))
+
+ [e: string]: any;
+>e : Symbol(e, Decl(renderer.d.ts, 3, 13))
+ }
+ }
+}
+export function dom(): void;
+>dom : Symbol(dom, Decl(renderer.d.ts, 6, 1))
+
+export function createElement(): void;
+>createElement : Symbol(createElement, Decl(renderer.d.ts, 7, 28))
+
+=== tests/cases/conformance/jsx/inline/reacty.tsx ===
+/** @jsx React.createElement */
+import * as React from "./renderer";
+>React : Symbol(React, Decl(reacty.tsx, 1, 6))
+
+<>>
+>h : Symbol(JSX.IntrinsicElements, Decl(renderer.d.ts, 1, 19))
+>h : Symbol(JSX.IntrinsicElements, Decl(renderer.d.ts, 1, 19))
+
+=== tests/cases/conformance/jsx/inline/index.tsx ===
+/** @jsx dom */
+import { dom } from "./renderer";
+>dom : Symbol(dom, Decl(index.tsx, 1, 8))
+
+<>>
+>h : Symbol(JSX.IntrinsicElements, Decl(renderer.d.ts, 1, 19))
+>h : Symbol(JSX.IntrinsicElements, Decl(renderer.d.ts, 1, 19))
+
diff --git a/tests/baselines/reference/inlineJsxFactoryWithFragmentIsError.types b/tests/baselines/reference/inlineJsxFactoryWithFragmentIsError.types
new file mode 100644
index 00000000000..e7cd48810b0
--- /dev/null
+++ b/tests/baselines/reference/inlineJsxFactoryWithFragmentIsError.types
@@ -0,0 +1,43 @@
+=== tests/cases/conformance/jsx/inline/renderer.d.ts ===
+declare global {
+>global : any
+
+ namespace JSX {
+>JSX : any
+
+ interface IntrinsicElements {
+>IntrinsicElements : IntrinsicElements
+
+ [e: string]: any;
+>e : string
+ }
+ }
+}
+export function dom(): void;
+>dom : () => void
+
+export function createElement(): void;
+>createElement : () => void
+
+=== tests/cases/conformance/jsx/inline/reacty.tsx ===
+/** @jsx React.createElement */
+import * as React from "./renderer";
+>React : typeof React
+
+<>>
+><>> : any
+> : any
+>h : any
+>h : any
+
+=== tests/cases/conformance/jsx/inline/index.tsx ===
+/** @jsx dom */
+import { dom } from "./renderer";
+>dom : () => void
+
+<>>
+><>> : any
+> : any
+>h : any
+>h : any
+
diff --git a/tests/baselines/reference/library-reference-5.errors.txt b/tests/baselines/reference/library-reference-5.errors.txt
index 173865ed82d..8aead70ff0b 100644
--- a/tests/baselines/reference/library-reference-5.errors.txt
+++ b/tests/baselines/reference/library-reference-5.errors.txt
@@ -1,4 +1,4 @@
-/node_modules/bar/index.d.ts(1,23): message TS4090: Conflicting definitions for 'alpha' found at '/node_modules/bar/node_modules/alpha/index.d.ts' and '/node_modules/foo/node_modules/alpha/index.d.ts'. Consider installing a specific version of this library to resolve the conflict.
+/node_modules/bar/index.d.ts(1,23): error TS4090: Conflicting definitions for 'alpha' found at '/node_modules/bar/node_modules/alpha/index.d.ts' and '/node_modules/foo/node_modules/alpha/index.d.ts'. Consider installing a specific version of this library to resolve the conflict.
==== /src/root.ts (0 errors) ====
@@ -17,7 +17,7 @@
==== /node_modules/bar/index.d.ts (1 errors) ====
///
~~~~~
-!!! message TS4090: Conflicting definitions for 'alpha' found at '/node_modules/bar/node_modules/alpha/index.d.ts' and '/node_modules/foo/node_modules/alpha/index.d.ts'. Consider installing a specific version of this library to resolve the conflict.
+!!! error TS4090: Conflicting definitions for 'alpha' found at '/node_modules/bar/node_modules/alpha/index.d.ts' and '/node_modules/foo/node_modules/alpha/index.d.ts'. Consider installing a specific version of this library to resolve the conflict.
declare var bar: any;
==== /node_modules/bar/node_modules/alpha/index.d.ts (0 errors) ====
diff --git a/tests/baselines/reference/mappedTypeNoTypeNoCrash.errors.txt b/tests/baselines/reference/mappedTypeNoTypeNoCrash.errors.txt
new file mode 100644
index 00000000000..1e32656c699
--- /dev/null
+++ b/tests/baselines/reference/mappedTypeNoTypeNoCrash.errors.txt
@@ -0,0 +1,16 @@
+tests/cases/compiler/mappedTypeNoTypeNoCrash.ts(1,51): error TS2304: Cannot find name 'K'.
+tests/cases/compiler/mappedTypeNoTypeNoCrash.ts(1,51): error TS4081: Exported type alias 'T0' has or is using private name 'K'.
+tests/cases/compiler/mappedTypeNoTypeNoCrash.ts(1,57): error TS2304: Cannot find name 'K'.
+tests/cases/compiler/mappedTypeNoTypeNoCrash.ts(1,57): error TS4081: Exported type alias 'T0' has or is using private name 'K'.
+
+
+==== tests/cases/compiler/mappedTypeNoTypeNoCrash.ts (4 errors) ====
+ type T0 = ({[K in keyof T]}) extends ({[key in K]: T[K]}) ? number : never;
+ ~
+!!! error TS2304: Cannot find name 'K'.
+ ~
+!!! error TS4081: Exported type alias 'T0' has or is using private name 'K'.
+ ~
+!!! error TS2304: Cannot find name 'K'.
+ ~
+!!! error TS4081: Exported type alias 'T0' has or is using private name 'K'.
\ No newline at end of file
diff --git a/tests/baselines/reference/mappedTypeNoTypeNoCrash.js b/tests/baselines/reference/mappedTypeNoTypeNoCrash.js
new file mode 100644
index 00000000000..ad1d9bba0bf
--- /dev/null
+++ b/tests/baselines/reference/mappedTypeNoTypeNoCrash.js
@@ -0,0 +1,4 @@
+//// [mappedTypeNoTypeNoCrash.ts]
+type T0 = ({[K in keyof T]}) extends ({[key in K]: T[K]}) ? number : never;
+
+//// [mappedTypeNoTypeNoCrash.js]
diff --git a/tests/baselines/reference/mappedTypeNoTypeNoCrash.symbols b/tests/baselines/reference/mappedTypeNoTypeNoCrash.symbols
new file mode 100644
index 00000000000..7faf2d7b35f
--- /dev/null
+++ b/tests/baselines/reference/mappedTypeNoTypeNoCrash.symbols
@@ -0,0 +1,9 @@
+=== tests/cases/compiler/mappedTypeNoTypeNoCrash.ts ===
+type T0 = ({[K in keyof T]}) extends ({[key in K]: T[K]}) ? number : never;
+>T0 : Symbol(T0, Decl(mappedTypeNoTypeNoCrash.ts, 0, 0))
+>T : Symbol(T, Decl(mappedTypeNoTypeNoCrash.ts, 0, 8))
+>K : Symbol(K, Decl(mappedTypeNoTypeNoCrash.ts, 0, 16))
+>T : Symbol(T, Decl(mappedTypeNoTypeNoCrash.ts, 0, 8))
+>key : Symbol(key, Decl(mappedTypeNoTypeNoCrash.ts, 0, 43))
+>T : Symbol(T, Decl(mappedTypeNoTypeNoCrash.ts, 0, 8))
+
diff --git a/tests/baselines/reference/mappedTypeNoTypeNoCrash.types b/tests/baselines/reference/mappedTypeNoTypeNoCrash.types
new file mode 100644
index 00000000000..0ec1e7723f8
--- /dev/null
+++ b/tests/baselines/reference/mappedTypeNoTypeNoCrash.types
@@ -0,0 +1,11 @@
+=== tests/cases/compiler/mappedTypeNoTypeNoCrash.ts ===
+type T0 = ({[K in keyof T]}) extends ({[key in K]: T[K]}) ? number : never;
+>T0 : number
+>T : T
+>K : K
+>T : T
+>key : key
+>K : No type information available!
+>T : T
+>K : No type information available!
+
diff --git a/tests/baselines/reference/organizeImports/CoalesceTrivia.ts b/tests/baselines/reference/organizeImports/CoalesceTrivia.ts
index 972df9e18eb..536ee4bdd67 100644
--- a/tests/baselines/reference/organizeImports/CoalesceTrivia.ts
+++ b/tests/baselines/reference/organizeImports/CoalesceTrivia.ts
@@ -10,6 +10,5 @@ F2();
/*A*/ import { /*L*/ F1 /*M*/, /*C*/ F2 /*D*/ } /*E*/ from "lib" /*G*/; /*H*/ //I
-
F1();
F2();
diff --git a/tests/baselines/reference/organizeImports/SortTrivia.ts b/tests/baselines/reference/organizeImports/SortTrivia.ts
index e46c836b966..bbed82c8383 100644
--- a/tests/baselines/reference/organizeImports/SortTrivia.ts
+++ b/tests/baselines/reference/organizeImports/SortTrivia.ts
@@ -7,4 +7,3 @@
/*F*/ import "lib1" /*H*/; /*I*/ //J
/*A*/ import "lib2" /*C*/; /*D*/ //E
-
diff --git a/tests/baselines/reference/organizeImports/UnusedTrivia2.ts b/tests/baselines/reference/organizeImports/UnusedTrivia2.ts
index f853015303e..5575f95fbf4 100644
--- a/tests/baselines/reference/organizeImports/UnusedTrivia2.ts
+++ b/tests/baselines/reference/organizeImports/UnusedTrivia2.ts
@@ -8,5 +8,4 @@ F1();
/*A*/ import { /*C*/ F1 /*D*/ } /*G*/ from "lib" /*I*/; /*J*/ //K
-
F1();
diff --git a/tests/baselines/reference/tsxElementResolution16.errors.txt b/tests/baselines/reference/tsxElementResolution16.errors.txt
index b68c442c36d..07b2ec54b44 100644
--- a/tests/baselines/reference/tsxElementResolution16.errors.txt
+++ b/tests/baselines/reference/tsxElementResolution16.errors.txt
@@ -1,8 +1,7 @@
-tests/cases/conformance/jsx/file.tsx(8,1): error TS2602: JSX element implicitly has type 'any' because the global type 'JSX.Element' does not exist.
tests/cases/conformance/jsx/file.tsx(8,1): error TS7026: JSX element implicitly has type 'any' because no interface 'JSX.IntrinsicElements' exists.
-==== tests/cases/conformance/jsx/file.tsx (2 errors) ====
+==== tests/cases/conformance/jsx/file.tsx (1 errors) ====
declare module JSX {
}
@@ -12,7 +11,5 @@ tests/cases/conformance/jsx/file.tsx(8,1): error TS7026: JSX element implicitly
var obj1: Obj1;
; // Error (JSX.Element is implicit any)
~~~~~~~~~~~~~~~
-!!! error TS2602: JSX element implicitly has type 'any' because the global type 'JSX.Element' does not exist.
- ~~~~~~~~~~~~~~~
!!! error TS7026: JSX element implicitly has type 'any' because no interface 'JSX.IntrinsicElements' exists.
\ No newline at end of file
diff --git a/tests/baselines/reference/typeGuardOnContainerTypeNoHang.js b/tests/baselines/reference/typeGuardOnContainerTypeNoHang.js
new file mode 100644
index 00000000000..238676b7974
--- /dev/null
+++ b/tests/baselines/reference/typeGuardOnContainerTypeNoHang.js
@@ -0,0 +1,18 @@
+//// [typeGuardOnContainerTypeNoHang.ts]
+export namespace TypeGuards {
+ export function IsObject(value: any) : value is {[index:string]:any} {
+ return typeof(value) === 'object'
+ }
+
+}
+
+//// [typeGuardOnContainerTypeNoHang.js]
+"use strict";
+exports.__esModule = true;
+var TypeGuards;
+(function (TypeGuards) {
+ function IsObject(value) {
+ return typeof (value) === 'object';
+ }
+ TypeGuards.IsObject = IsObject;
+})(TypeGuards = exports.TypeGuards || (exports.TypeGuards = {}));
diff --git a/tests/baselines/reference/typeGuardOnContainerTypeNoHang.symbols b/tests/baselines/reference/typeGuardOnContainerTypeNoHang.symbols
new file mode 100644
index 00000000000..eacc6b7f100
--- /dev/null
+++ b/tests/baselines/reference/typeGuardOnContainerTypeNoHang.symbols
@@ -0,0 +1,15 @@
+=== tests/cases/compiler/typeGuardOnContainerTypeNoHang.ts ===
+export namespace TypeGuards {
+>TypeGuards : Symbol(TypeGuards, Decl(typeGuardOnContainerTypeNoHang.ts, 0, 0))
+
+ export function IsObject(value: any) : value is {[index:string]:any} {
+>IsObject : Symbol(IsObject, Decl(typeGuardOnContainerTypeNoHang.ts, 0, 29))
+>value : Symbol(value, Decl(typeGuardOnContainerTypeNoHang.ts, 1, 29))
+>value : Symbol(value, Decl(typeGuardOnContainerTypeNoHang.ts, 1, 29))
+>index : Symbol(index, Decl(typeGuardOnContainerTypeNoHang.ts, 1, 54))
+
+ return typeof(value) === 'object'
+>value : Symbol(value, Decl(typeGuardOnContainerTypeNoHang.ts, 1, 29))
+ }
+
+}
diff --git a/tests/baselines/reference/typeGuardOnContainerTypeNoHang.types b/tests/baselines/reference/typeGuardOnContainerTypeNoHang.types
new file mode 100644
index 00000000000..cc7d90e76df
--- /dev/null
+++ b/tests/baselines/reference/typeGuardOnContainerTypeNoHang.types
@@ -0,0 +1,19 @@
+=== tests/cases/compiler/typeGuardOnContainerTypeNoHang.ts ===
+export namespace TypeGuards {
+>TypeGuards : typeof TypeGuards
+
+ export function IsObject(value: any) : value is {[index:string]:any} {
+>IsObject : (value: any) => value is { [index: string]: any; }
+>value : any
+>value : any
+>index : string
+
+ return typeof(value) === 'object'
+>typeof(value) === 'object' : boolean
+>typeof(value) : "string" | "number" | "boolean" | "symbol" | "undefined" | "object" | "function"
+>(value) : any
+>value : any
+>'object' : "object"
+ }
+
+}
diff --git a/tests/baselines/reference/typeReferenceDirectives12.trace.json b/tests/baselines/reference/typeReferenceDirectives12.trace.json
index 62a3b31fa1c..12f8d938c1d 100644
--- a/tests/baselines/reference/typeReferenceDirectives12.trace.json
+++ b/tests/baselines/reference/typeReferenceDirectives12.trace.json
@@ -16,7 +16,7 @@
"Resolving real path for '/types/lib/index.d.ts', result '/types/lib/index.d.ts'.",
"======== Type reference directive 'lib' was successfully resolved to '/types/lib/index.d.ts', primary: true. ========",
"======== Resolving module './main' from '/mod1.ts'. ========",
- "Resolution for module './main' was found in cache.",
+ "Resolution for module './main' was found in cache from location '/'.",
"======== Module name './main' was successfully resolved to '/main.ts'. ========",
"======== Resolving type reference directive 'lib', containing file '/__inferred type names__.ts', root directory '/types'. ========",
"Resolving with primary search path '/types'.",
diff --git a/tests/baselines/reference/typeReferenceDirectives9.trace.json b/tests/baselines/reference/typeReferenceDirectives9.trace.json
index 62a3b31fa1c..12f8d938c1d 100644
--- a/tests/baselines/reference/typeReferenceDirectives9.trace.json
+++ b/tests/baselines/reference/typeReferenceDirectives9.trace.json
@@ -16,7 +16,7 @@
"Resolving real path for '/types/lib/index.d.ts', result '/types/lib/index.d.ts'.",
"======== Type reference directive 'lib' was successfully resolved to '/types/lib/index.d.ts', primary: true. ========",
"======== Resolving module './main' from '/mod1.ts'. ========",
- "Resolution for module './main' was found in cache.",
+ "Resolution for module './main' was found in cache from location '/'.",
"======== Module name './main' was successfully resolved to '/main.ts'. ========",
"======== Resolving type reference directive 'lib', containing file '/__inferred type names__.ts', root directory '/types'. ========",
"Resolving with primary search path '/types'.",
diff --git a/tests/cases/compiler/indirectUniqueSymbolDeclarationEmit.ts b/tests/cases/compiler/indirectUniqueSymbolDeclarationEmit.ts
new file mode 100644
index 00000000000..5554c5d05c3
--- /dev/null
+++ b/tests/cases/compiler/indirectUniqueSymbolDeclarationEmit.ts
@@ -0,0 +1,8 @@
+// @lib: es6
+// @declaration: true
+export const x = Symbol();
+export const y = Symbol();
+declare function rand(): boolean;
+export function f() {
+ return rand() ? x : y;
+}
\ No newline at end of file
diff --git a/tests/cases/compiler/inferredNonidentifierTypesGetQuotes.ts b/tests/cases/compiler/inferredNonidentifierTypesGetQuotes.ts
new file mode 100644
index 00000000000..70e3296bef6
--- /dev/null
+++ b/tests/cases/compiler/inferredNonidentifierTypesGetQuotes.ts
@@ -0,0 +1,4 @@
+// @declaration: true
+var x = [{ "a-b": "string" }, {}];
+
+var y = [{ ["a-b"]: "string" }, {}];
\ No newline at end of file
diff --git a/tests/cases/compiler/mappedTypeNoTypeNoCrash.ts b/tests/cases/compiler/mappedTypeNoTypeNoCrash.ts
new file mode 100644
index 00000000000..fc9760c7a69
--- /dev/null
+++ b/tests/cases/compiler/mappedTypeNoTypeNoCrash.ts
@@ -0,0 +1,2 @@
+// @declaration: true
+type T0 = ({[K in keyof T]}) extends ({[key in K]: T[K]}) ? number : never;
\ No newline at end of file
diff --git a/tests/cases/compiler/typeGuardOnContainerTypeNoHang.ts b/tests/cases/compiler/typeGuardOnContainerTypeNoHang.ts
new file mode 100644
index 00000000000..faab957a4a2
--- /dev/null
+++ b/tests/cases/compiler/typeGuardOnContainerTypeNoHang.ts
@@ -0,0 +1,6 @@
+export namespace TypeGuards {
+ export function IsObject(value: any) : value is {[index:string]:any} {
+ return typeof(value) === 'object'
+ }
+
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/jsx/inline/inlineJsxFactoryDeclarations.tsx b/tests/cases/conformance/jsx/inline/inlineJsxFactoryDeclarations.tsx
new file mode 100644
index 00000000000..f574c7e9db9
--- /dev/null
+++ b/tests/cases/conformance/jsx/inline/inlineJsxFactoryDeclarations.tsx
@@ -0,0 +1,36 @@
+// @jsx: react
+// @filename: renderer.d.ts
+declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ [e: string]: any;
+ }
+ }
+}
+export function dom(): void;
+export function otherdom(): void;
+export function createElement(): void;
+export { dom as default };
+// @filename: otherreacty.tsx
+/** @jsx React.createElement */
+import * as React from "./renderer";
+
+// @filename: other.tsx
+/** @jsx h */
+import { dom as h } from "./renderer"
+export const prerendered = ;
+// @filename: othernoalias.tsx
+/** @jsx otherdom */
+import { otherdom } from "./renderer"
+export const prerendered2 = ;
+// @filename: reacty.tsx
+import React from "./renderer"
+export const prerendered3 = ;
+
+// @filename: index.tsx
+/** @jsx dom */
+import { dom } from "./renderer"
+
+export * from "./other";
+export * from "./othernoalias";
+export * from "./reacty";
diff --git a/tests/cases/conformance/jsx/inline/inlineJsxFactoryDeclarationsLocalTypes.tsx b/tests/cases/conformance/jsx/inline/inlineJsxFactoryDeclarationsLocalTypes.tsx
new file mode 100644
index 00000000000..009abe2e852
--- /dev/null
+++ b/tests/cases/conformance/jsx/inline/inlineJsxFactoryDeclarationsLocalTypes.tsx
@@ -0,0 +1,86 @@
+// @jsx: react
+// @filename: renderer.d.ts
+export namespace dom {
+ namespace JSX {
+ interface IntrinsicElements {
+ [e: string]: {};
+ }
+ interface Element {
+ __domBrand: void;
+ props: {
+ children?: Element[];
+ };
+ }
+ interface ElementClass extends Element {
+ render(): Element;
+ }
+ interface ElementAttributesProperty { props: any; }
+ interface ElementChildrenAttribute { children: any; }
+ }
+}
+export function dom(): dom.JSX.Element;
+// @filename: renderer2.d.ts
+export namespace predom {
+ namespace JSX {
+ interface IntrinsicElements {
+ [e: string]: {};
+ }
+ interface Element {
+ __predomBrand: void;
+ props: {
+ children?: Element[];
+ };
+ }
+ interface ElementClass extends Element {
+ render(): Element;
+ }
+ interface ElementAttributesProperty { props: any; }
+ interface ElementChildrenAttribute { children: any; }
+ }
+}
+export function predom(): predom.JSX.Element;
+// @filename: component.tsx
+/** @jsx predom */
+import { predom } from "./renderer2"
+
+export const MySFC = (props: {x: number, y: number, children?: predom.JSX.Element[]}) => {props.x} + {props.y} = {props.x + props.y}{...this.props.children}
;
+
+export class MyClass implements predom.JSX.Element {
+ __predomBrand!: void;
+ constructor(public props: {x: number, y: number, children?: predom.JSX.Element[]}) {}
+ render() {
+ return
+ {this.props.x} + {this.props.y} = {this.props.x + this.props.y}
+ {...this.props.children}
+
;
+ }
+}
+export const tree =
+
+export default
+
+// @filename: index.tsx
+/** @jsx dom */
+import { dom } from "./renderer"
+import prerendered, {MySFC, MyClass, tree} from "./component";
+let elem = prerendered;
+elem = ; // Expect assignability error here
+
+const DOMSFC = (props: {x: number, y: number, children?: dom.JSX.Element[]}) => {props.x} + {props.y} = {props.x + props.y}{props.children}
;
+
+class DOMClass implements dom.JSX.Element {
+ __domBrand!: void;
+ constructor(public props: {x: number, y: number, children?: dom.JSX.Element[]}) {}
+ render() {
+ return {this.props.x} + {this.props.y} = {this.props.x + this.props.y}{...this.props.children}
;
+ }
+}
+
+// Should work, everything is a DOM element
+const _tree =
+
+// Should fail, no dom elements
+const _brokenTree =
+
+// Should fail, nondom isn't allowed as children of dom
+const _brokenTree2 = {tree}{tree}
diff --git a/tests/cases/conformance/jsx/inline/inlineJsxFactoryLocalTypeGlobalFallback.tsx b/tests/cases/conformance/jsx/inline/inlineJsxFactoryLocalTypeGlobalFallback.tsx
new file mode 100644
index 00000000000..3f4340f518b
--- /dev/null
+++ b/tests/cases/conformance/jsx/inline/inlineJsxFactoryLocalTypeGlobalFallback.tsx
@@ -0,0 +1,44 @@
+// @jsx: react
+// @filename: renderer.d.ts
+declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ [e: string]: {};
+ }
+ interface Element {
+ __domBrand: void;
+ children: Element[];
+ props: {};
+ }
+ interface ElementAttributesProperty { props: any; }
+ interface ElementChildrenAttribute { children: any; }
+ }
+}
+export function dom(): JSX.Element;
+// @filename: renderer2.d.ts
+export namespace predom {
+ namespace JSX {
+ interface IntrinsicElements {
+ [e: string]: {};
+ }
+ interface Element {
+ __predomBrand: void;
+ children: Element[];
+ props: {};
+ }
+ interface ElementAttributesProperty { props: any; }
+ interface ElementChildrenAttribute { children: any; }
+ }
+}
+export function predom(): predom.JSX.Element;
+// @filename: component.tsx
+/** @jsx predom */
+import { predom } from "./renderer2"
+export default
+
+// @filename: index.tsx
+/** @jsx dom */
+import { dom } from "./renderer"
+import prerendered from "./component";
+let elem = prerendered;
+elem = ; // Expect assignability error here
diff --git a/tests/cases/conformance/jsx/inline/inlineJsxFactoryOverridesCompilerOption.tsx b/tests/cases/conformance/jsx/inline/inlineJsxFactoryOverridesCompilerOption.tsx
new file mode 100644
index 00000000000..4efd32876ad
--- /dev/null
+++ b/tests/cases/conformance/jsx/inline/inlineJsxFactoryOverridesCompilerOption.tsx
@@ -0,0 +1,19 @@
+// @jsx: react
+// @jsxFactory: p
+// @filename: renderer.d.ts
+declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ [e: string]: any;
+ }
+ }
+}
+export function dom(): void;
+export { dom as p };
+// @filename: reacty.tsx
+/** @jsx dom */
+import {dom} from "./renderer";
+
+// @filename: index.tsx
+import { p } from "./renderer";
+
diff --git a/tests/cases/conformance/jsx/inline/inlineJsxFactoryWithFragmentIsError.tsx b/tests/cases/conformance/jsx/inline/inlineJsxFactoryWithFragmentIsError.tsx
new file mode 100644
index 00000000000..280ac26b5ce
--- /dev/null
+++ b/tests/cases/conformance/jsx/inline/inlineJsxFactoryWithFragmentIsError.tsx
@@ -0,0 +1,19 @@
+// @jsx: react
+// @filename: renderer.d.ts
+declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ [e: string]: any;
+ }
+ }
+}
+export function dom(): void;
+export function createElement(): void;
+// @filename: reacty.tsx
+/** @jsx React.createElement */
+import * as React from "./renderer";
+<>>
+// @filename: index.tsx
+/** @jsx dom */
+import { dom } from "./renderer";
+<>>
\ No newline at end of file
diff --git a/tests/cases/fourslash/findAllRefsForModule.ts b/tests/cases/fourslash/findAllRefsForModule.ts
index bff3aa17785..a8641625075 100644
--- a/tests/cases/fourslash/findAllRefsForModule.ts
+++ b/tests/cases/fourslash/findAllRefsForModule.ts
@@ -14,8 +14,6 @@
// @Filename: /d.ts
//// ///
-verify.noErrors();
-
const ranges = test.ranges();
const [r0, r1, r2] = ranges;
verify.referenceGroups(ranges, [{ definition: 'module "/a"', ranges: [r0, r2, r1] }]);
diff --git a/tests/cases/fourslash/fourslash.ts b/tests/cases/fourslash/fourslash.ts
index 4d537661a27..7561ca3793d 100644
--- a/tests/cases/fourslash/fourslash.ts
+++ b/tests/cases/fourslash/fourslash.ts
@@ -347,8 +347,9 @@ declare namespace FourSlashInterface {
start: number;
length: number;
}, displayParts: ts.SymbolDisplayPart[], documentation: ts.SymbolDisplayPart[], tags: ts.JSDocTagInfo[]): void;
- getSyntacticDiagnostics(expected: string): void;
- getSemanticDiagnostics(expected: string): void;
+ getSyntacticDiagnostics(expected: ReadonlyArray): void;
+ getSemanticDiagnostics(expected: ReadonlyArray): void;
+ getSuggestionDiagnostics(expected: ReadonlyArray): void;
ProjectInfo(expected: string[]): void;
allRangesAppearInImplementationList(markerName: string): void;
}
@@ -520,6 +521,13 @@ declare namespace FourSlashInterface {
text: string;
range: Range;
}
+ interface RealizedDiagnostic {
+ message: string;
+ start: number;
+ length: number;
+ category: string;
+ code: number;
+ }
}
declare function verifyOperationIsCancelled(f: any): void;
declare var test: FourSlashInterface.test_;
diff --git a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics1.ts b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics1.ts
index 8c151742b75..20ca5101ba8 100644
--- a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics1.ts
+++ b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics1.ts
@@ -4,12 +4,12 @@
// @Filename: a.js
//// import a = b;
-verify.getSyntacticDiagnostics(`[
+verify.getSyntacticDiagnostics([
{
- "message": "'import ... =' can only be used in a .ts file.",
- "start": 0,
- "length": 13,
- "category": "error",
- "code": 8002
+ message: "'import ... =' can only be used in a .ts file.",
+ start: 0,
+ length: 13,
+ category: "error",
+ code: 8002
}
-]`);
\ No newline at end of file
+]);
\ No newline at end of file
diff --git a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics10.ts b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics10.ts
index 206c1a6e2cf..fb9d68336e0 100644
--- a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics10.ts
+++ b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics10.ts
@@ -4,12 +4,12 @@
// @Filename: a.js
//// function F() { }
-verify.getSyntacticDiagnostics(`[
+verify.getSyntacticDiagnostics([
{
- "message": "'type parameter declarations' can only be used in a .ts file.",
- "start": 11,
- "length": 1,
- "category": "error",
- "code": 8004
+ message: "'type parameter declarations' can only be used in a .ts file.",
+ start: 11,
+ length: 1,
+ category: "error",
+ code: 8004
}
-]`);
\ No newline at end of file
+]);
diff --git a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics11.ts b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics11.ts
index d9b1d35b5c6..4a5dafd1042 100644
--- a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics11.ts
+++ b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics11.ts
@@ -4,12 +4,12 @@
// @Filename: a.js
//// function F(): number { }
-verify.getSyntacticDiagnostics(`[
+verify.getSyntacticDiagnostics([
{
- "message": "'types' can only be used in a .ts file.",
- "start": 14,
- "length": 6,
- "category": "error",
- "code": 8010
+ message: "'types' can only be used in a .ts file.",
+ start: 14,
+ length: 6,
+ category: "error",
+ code: 8010
}
-]`);
\ No newline at end of file
+]);
diff --git a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics12.ts b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics12.ts
index cf244f7cfa2..fc7956d73c9 100644
--- a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics12.ts
+++ b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics12.ts
@@ -4,12 +4,12 @@
// @Filename: a.js
//// declare var v;
-verify.getSyntacticDiagnostics(`[
+verify.getSyntacticDiagnostics([
{
- "message": "'declare' can only be used in a .ts file.",
- "start": 0,
- "length": 7,
- "category": "error",
- "code": 8009
+ message: "'declare' can only be used in a .ts file.",
+ start: 0,
+ length: 7,
+ category: "error",
+ code: 8009
}
-]`);
\ No newline at end of file
+]);
diff --git a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics13.ts b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics13.ts
index aaf3289fcfe..87cc7b37867 100644
--- a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics13.ts
+++ b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics13.ts
@@ -4,12 +4,12 @@
// @Filename: a.js
//// var v: () => number;
-verify.getSyntacticDiagnostics(`[
+verify.getSyntacticDiagnostics([
{
- "message": "'types' can only be used in a .ts file.",
- "start": 7,
- "length": 12,
- "category": "error",
- "code": 8010
+ message: "'types' can only be used in a .ts file.",
+ start: 7,
+ length: 12,
+ category: "error",
+ code: 8010
}
-]`);
\ No newline at end of file
+]);
\ No newline at end of file
diff --git a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics14.ts b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics14.ts
index a41d88dd675..4659897559c 100644
--- a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics14.ts
+++ b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics14.ts
@@ -4,12 +4,12 @@
// @Filename: a.js
//// Foo();
-verify.getSyntacticDiagnostics(`[
+verify.getSyntacticDiagnostics([
{
- "message": "'type arguments' can only be used in a .ts file.",
- "start": 4,
- "length": 6,
- "category": "error",
- "code": 8011
+ message: "'type arguments' can only be used in a .ts file.",
+ start: 4,
+ length: 6,
+ category: "error",
+ code: 8011
}
-]`);
\ No newline at end of file
+]);
diff --git a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics15.ts b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics15.ts
index 93430a9a004..31194e37fcb 100644
--- a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics15.ts
+++ b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics15.ts
@@ -4,12 +4,12 @@
// @Filename: a.js
//// function F(public p) { }
-verify.getSyntacticDiagnostics(`[
+verify.getSyntacticDiagnostics([
{
- "message": "'parameter modifiers' can only be used in a .ts file.",
- "start": 11,
- "length": 6,
- "category": "error",
- "code": 8012
+ message: "'parameter modifiers' can only be used in a .ts file.",
+ start: 11,
+ length: 6,
+ category: "error",
+ code: 8012
}
-]`);
\ No newline at end of file
+]);
\ No newline at end of file
diff --git a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics16.ts b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics16.ts
index 60e0684b106..4d4e3a56287 100644
--- a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics16.ts
+++ b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics16.ts
@@ -4,12 +4,12 @@
// @Filename: a.js
//// function F(p?) { }
-verify.getSyntacticDiagnostics(`[
+verify.getSyntacticDiagnostics([
{
- "message": "'?' can only be used in a .ts file.",
- "start": 12,
- "length": 1,
- "category": "error",
- "code": 8009
+ message: "'?' can only be used in a .ts file.",
+ start: 12,
+ length: 1,
+ category: "error",
+ code: 8009
}
-]`);
\ No newline at end of file
+]);
\ No newline at end of file
diff --git a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics17.ts b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics17.ts
index 3a57917b2ac..f6d4d65a83d 100644
--- a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics17.ts
+++ b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics17.ts
@@ -4,12 +4,12 @@
// @Filename: a.js
//// function F(a: number) { }
-verify.getSyntacticDiagnostics(`[
+verify.getSyntacticDiagnostics([
{
- "message": "'types' can only be used in a .ts file.",
- "start": 14,
- "length": 6,
- "category": "error",
- "code": 8010
+ message: "'types' can only be used in a .ts file.",
+ start: 14,
+ length: 6,
+ category: "error",
+ code: 8010
}
-]`);
\ No newline at end of file
+]);
\ No newline at end of file
diff --git a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics18.ts b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics18.ts
index d253cb63611..71e098b0ee2 100644
--- a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics18.ts
+++ b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics18.ts
@@ -9,15 +9,15 @@
////}
goTo.file("a.js");
-verify.getSyntacticDiagnostics(`[
+verify.getSyntacticDiagnostics([
{
- "message": "\'public\' can only be used in a .ts file.",
- "start": 93,
- "length": 6,
- "category": "error",
- "code": 8009
+ message: "\'public\' can only be used in a .ts file.",
+ start: 93,
+ length: 6,
+ category: "error",
+ code: 8009
}
-]`);
+]);
// @Filename: b.js
////class C {
@@ -25,12 +25,12 @@ verify.getSyntacticDiagnostics(`[
////}
goTo.file("b.js");
-verify.getSyntacticDiagnostics(`[
+verify.getSyntacticDiagnostics([
{
- "message": "'types' can only be used in a .ts file.",
- "start": 17,
- "length": 6,
- "category": "error",
- "code": 8010
+ message: "'types' can only be used in a .ts file.",
+ start: 17,
+ length: 6,
+ category: "error",
+ code: 8010
}
-]`);
+]);
diff --git a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics19.ts b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics19.ts
index 7729a6ea470..fe602056dcb 100644
--- a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics19.ts
+++ b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics19.ts
@@ -4,12 +4,12 @@
// @Filename: a.js
//// enum E { }
-verify.getSyntacticDiagnostics(`[
+verify.getSyntacticDiagnostics([
{
- "message": "'enum declarations' can only be used in a .ts file.",
- "start": 5,
- "length": 1,
- "category": "error",
- "code": 8015
+ message: "'enum declarations' can only be used in a .ts file.",
+ start: 5,
+ length: 1,
+ category: "error",
+ code: 8015
}
-]`);
\ No newline at end of file
+]);
\ No newline at end of file
diff --git a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics2.ts b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics2.ts
index 74e6a9ab089..0a14c8b5ddf 100644
--- a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics2.ts
+++ b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics2.ts
@@ -4,12 +4,12 @@
// @Filename: a.js
//// export = b;
-verify.getSyntacticDiagnostics(`[
+verify.getSyntacticDiagnostics([
{
- "message": "'export=' can only be used in a .ts file.",
- "start": 0,
- "length": 11,
- "category": "error",
- "code": 8003
+ message: "'export=' can only be used in a .ts file.",
+ start: 0,
+ length: 11,
+ category: "error",
+ code: 8003
}
-]`);
\ No newline at end of file
+]);
\ No newline at end of file
diff --git a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics21.ts b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics21.ts
index 8a7120acbb3..b6dc7d3df51 100644
--- a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics21.ts
+++ b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics21.ts
@@ -5,4 +5,4 @@
// @Filename: a.js
//// @internal class C {}
-verify.getSemanticDiagnostics(`[]`);
+verify.getSemanticDiagnostics([]);
diff --git a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics22.ts b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics22.ts
index d4d830d29e9..dc4779eef07 100644
--- a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics22.ts
+++ b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics22.ts
@@ -4,4 +4,4 @@
// @Filename: a.js
//// function foo(...a) {}
-verify.getSemanticDiagnostics(`[]`);
+verify.getSemanticDiagnostics([]);
diff --git a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics23.ts b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics23.ts
index 2524e50e668..a8271dce596 100644
--- a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics23.ts
+++ b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics23.ts
@@ -10,5 +10,5 @@
//// }
//// }
-verify.getSyntacticDiagnostics(`[]`);
-verify.getSemanticDiagnostics(`[]`);
+verify.getSyntacticDiagnostics([]);
+verify.getSemanticDiagnostics([]);
diff --git a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics3.ts b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics3.ts
index 3528f333329..47837864781 100644
--- a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics3.ts
+++ b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics3.ts
@@ -4,12 +4,12 @@
// @Filename: a.js
//// class C { }
-verify.getSyntacticDiagnostics(`[
+verify.getSyntacticDiagnostics([
{
- "message": "'type parameter declarations' can only be used in a .ts file.",
- "start": 8,
- "length": 1,
- "category": "error",
- "code": 8004
+ message: "'type parameter declarations' can only be used in a .ts file.",
+ start: 8,
+ length: 1,
+ category: "error",
+ code: 8004
}
-]`);
\ No newline at end of file
+]);
\ No newline at end of file
diff --git a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics4.ts b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics4.ts
index 3b849b08ae0..efd8fe85964 100644
--- a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics4.ts
+++ b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics4.ts
@@ -4,12 +4,12 @@
// @Filename: a.js
//// public class C { }
-verify.getSyntacticDiagnostics(`[
+verify.getSyntacticDiagnostics([
{
- "message": "'public' can only be used in a .ts file.",
- "start": 0,
- "length": 6,
- "category": "error",
- "code": 8009
+ message: "'public' can only be used in a .ts file.",
+ start: 0,
+ length: 6,
+ category: "error",
+ code: 8009
}
-]`);
\ No newline at end of file
+]);
\ No newline at end of file
diff --git a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics5.ts b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics5.ts
index 985e3284025..0fcc7652101 100644
--- a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics5.ts
+++ b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics5.ts
@@ -4,12 +4,12 @@
// @Filename: a.js
//// class C implements D { }
-verify.getSyntacticDiagnostics(`[
+verify.getSyntacticDiagnostics([
{
- "message": "'implements clauses' can only be used in a .ts file.",
- "start": 8,
- "length": 12,
- "category": "error",
- "code": 8005
+ message: "'implements clauses' can only be used in a .ts file.",
+ start: 8,
+ length: 12,
+ category: "error",
+ code: 8005
}
-]`);
\ No newline at end of file
+]);
\ No newline at end of file
diff --git a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics6.ts b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics6.ts
index a0042a0529b..6d4c7e7dcca 100644
--- a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics6.ts
+++ b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics6.ts
@@ -4,12 +4,12 @@
// @Filename: a.js
//// interface I { }
-verify.getSyntacticDiagnostics(`[
+verify.getSyntacticDiagnostics([
{
- "message": "'interface declarations' can only be used in a .ts file.",
- "start": 10,
- "length": 1,
- "category": "error",
- "code": 8006
+ message: "'interface declarations' can only be used in a .ts file.",
+ start: 10,
+ length: 1,
+ category: "error",
+ code: 8006
}
-]`);
\ No newline at end of file
+]);
\ No newline at end of file
diff --git a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics7.ts b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics7.ts
index 64216d1e364..32ebf6bde0d 100644
--- a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics7.ts
+++ b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics7.ts
@@ -4,12 +4,12 @@
// @Filename: a.js
//// module M { }
-verify.getSyntacticDiagnostics(`[
+verify.getSyntacticDiagnostics([
{
- "message": "'module declarations' can only be used in a .ts file.",
- "start": 7,
- "length": 1,
- "category": "error",
- "code": 8007
+ message: "'module declarations' can only be used in a .ts file.",
+ start: 7,
+ length: 1,
+ category: "error",
+ code: 8007
}
-]`);
\ No newline at end of file
+]);
\ No newline at end of file
diff --git a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics8.ts b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics8.ts
index 296f4f7445e..7ab0db792e8 100644
--- a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics8.ts
+++ b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics8.ts
@@ -4,12 +4,12 @@
// @Filename: a.js
//// type a = b;
-verify.getSyntacticDiagnostics(`[
+verify.getSyntacticDiagnostics([
{
- "message": "'type aliases' can only be used in a .ts file.",
- "start": 5,
- "length": 1,
- "category": "error",
- "code": 8008
+ message: "'type aliases' can only be used in a .ts file.",
+ start: 5,
+ length: 1,
+ category: "error",
+ code: 8008
}
-]`);
\ No newline at end of file
+]);
\ No newline at end of file
diff --git a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics9.ts b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics9.ts
index f2c20a52ee9..c18f32e378e 100644
--- a/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics9.ts
+++ b/tests/cases/fourslash/getJavaScriptSyntacticDiagnostics9.ts
@@ -4,12 +4,12 @@
// @Filename: a.js
//// public function F() { }
-verify.getSyntacticDiagnostics(`[
+verify.getSyntacticDiagnostics([
{
- "message": "'public' can only be used in a .ts file.",
- "start": 0,
- "length": 6,
- "category": "error",
- "code": 8009
+ message: "'public' can only be used in a .ts file.",
+ start: 0,
+ length: 6,
+ category: "error",
+ code: 8009
}
-]`);
\ No newline at end of file
+]);
\ No newline at end of file
diff --git a/tests/cases/fourslash/jsDocAugmentsAndExtends.ts b/tests/cases/fourslash/jsDocAugmentsAndExtends.ts
index 10f33260268..ca703f33025 100644
--- a/tests/cases/fourslash/jsDocAugmentsAndExtends.ts
+++ b/tests/cases/fourslash/jsDocAugmentsAndExtends.ts
@@ -25,13 +25,10 @@
goTo.marker();
verify.quickInfoIs("(local var) x: number");
-verify.getSemanticDiagnostics(
-`[
- {
- "message": "Class declarations cannot have more than one \`@augments\` or \`@extends\` tag.",
- "start": 36,
- "length": 24,
- "category": "error",
- "code": 8025
- }
-]`);
\ No newline at end of file
+verify.getSemanticDiagnostics([{
+ message: "Class declarations cannot have more than one \`@augments\` or \`@extends\` tag.",
+ start: 36,
+ length: 24,
+ category: "error",
+ code: 8025
+}]);
diff --git a/tests/cases/fourslash/jsFileCompilationDuplicateFunctionImplementation.ts b/tests/cases/fourslash/jsFileCompilationDuplicateFunctionImplementation.ts
index 00d03b6e60c..115964b40f0 100644
--- a/tests/cases/fourslash/jsFileCompilationDuplicateFunctionImplementation.ts
+++ b/tests/cases/fourslash/jsFileCompilationDuplicateFunctionImplementation.ts
@@ -12,13 +12,25 @@
////function foo() { return 30; }/*2*/
goTo.marker("1");
-verify.getSemanticDiagnostics('[]');
+verify.getSemanticDiagnostics([]);
goTo.marker("2");
-verify.getSemanticDiagnostics('[\n {\n "message": "Duplicate function implementation.",\n "start": 9,\n "length": 3,\n "category": "error",\n "code": 2393\n }\n]');
+verify.getSemanticDiagnostics([{
+ message: "Duplicate function implementation.",
+ start: 9,
+ length: 3,
+ category: "error",
+ code: 2393
+}]);
verify.verifyGetEmitOutputContentsForCurrentFile([
{ name: "out.js", text: "function foo() { return 10; }\r\nfunction foo() { return 30; }\r\n", writeByteOrderMark: false },
{ name: "out.d.ts", text: "", writeByteOrderMark: false }]);
goTo.marker("2");
-verify.getSemanticDiagnostics('[\n {\n "message": "Duplicate function implementation.",\n "start": 9,\n "length": 3,\n "category": "error",\n "code": 2393\n }\n]');
+verify.getSemanticDiagnostics([{
+ message: "Duplicate function implementation.",
+ start: 9,
+ length: 3,
+ category: "error",
+ code: 2393
+}]);
goTo.marker("1");
-verify.getSemanticDiagnostics('[]');
\ No newline at end of file
+verify.getSemanticDiagnostics([]);
diff --git a/tests/cases/fourslash/refactorConvertToEs6Module_export_alias.ts b/tests/cases/fourslash/refactorConvertToEs6Module_export_alias.ts
index 6529bb64af0..73cd606adf9 100644
--- a/tests/cases/fourslash/refactorConvertToEs6Module_export_alias.ts
+++ b/tests/cases/fourslash/refactorConvertToEs6Module_export_alias.ts
@@ -5,14 +5,11 @@
// @Filename: /a.js
////const exportsAlias = exports;
////exportsAlias.f = function() {};
-/////*a*/module/*b*/.exports = exportsAlias;
+////module.exports = exportsAlias;
-goTo.select("a", "b");
-edit.applyRefactor({
- refactorName: "Convert to ES6 module",
- actionName: "Convert to ES6 module",
- actionDescription: "Convert to ES6 module",
- newContent: `
+verify.codeFix({
+ description: "Convert to ES6 module",
+ newFileContent: `
export function f() { }
`,
});
diff --git a/tests/cases/fourslash/refactorConvertToEs6Module_export_dotDefault.ts b/tests/cases/fourslash/refactorConvertToEs6Module_export_dotDefault.ts
index 1c8633eb4eb..1283b0053a8 100644
--- a/tests/cases/fourslash/refactorConvertToEs6Module_export_dotDefault.ts
+++ b/tests/cases/fourslash/refactorConvertToEs6Module_export_dotDefault.ts
@@ -5,15 +5,13 @@
// @allowJs: true
// @Filename: /a.js
-/////*a*/exports/*b*/.default = 0;
+////exports.default = 0;
////exports.default;
-goTo.select("a", "b");
-edit.applyRefactor({
- refactorName: "Convert to ES6 module",
- actionName: "Convert to ES6 module",
- actionDescription: "Convert to ES6 module",
- newContent: `const _default = 0;
+verify.codeFix({
+ description: "Convert to ES6 module",
+ newFileContent:
+`const _default = 0;
export { _default as default };
_default;`,
});
diff --git a/tests/cases/fourslash/refactorConvertToEs6Module_export_invalidName.ts b/tests/cases/fourslash/refactorConvertToEs6Module_export_invalidName.ts
index 16b48fcd204..83a831effb0 100644
--- a/tests/cases/fourslash/refactorConvertToEs6Module_export_invalidName.ts
+++ b/tests/cases/fourslash/refactorConvertToEs6Module_export_invalidName.ts
@@ -5,15 +5,13 @@
// @allowJs: true
// @Filename: /a.js
-/////*a*/exports/*b*/.class = 0;
+////exports.class = 0;
////exports.async = 1;
-goTo.select("a", "b");
-edit.applyRefactor({
- refactorName: "Convert to ES6 module",
- actionName: "Convert to ES6 module",
- actionDescription: "Convert to ES6 module",
- newContent: `const _class = 0;
+verify.codeFix({
+ description: "Convert to ES6 module",
+ newFileContent:
+`const _class = 0;
export { _class as class };
export const async = 1;`,
});
diff --git a/tests/cases/fourslash/refactorConvertToEs6Module_export_moduleDotExports.ts b/tests/cases/fourslash/refactorConvertToEs6Module_export_moduleDotExports.ts
index ddcf79d0114..3382228babb 100644
--- a/tests/cases/fourslash/refactorConvertToEs6Module_export_moduleDotExports.ts
+++ b/tests/cases/fourslash/refactorConvertToEs6Module_export_moduleDotExports.ts
@@ -3,7 +3,7 @@
// @allowJs: true
// @Filename: /a.js
-/////*a*/module/*b*/.exports = function() {}
+////module.exports = function() {}
////module.exports = function f() {}
////module.exports = class {}
////module.exports = class C {}
@@ -11,16 +11,14 @@
// See also `refactorConvertToEs6Module_export_moduleDotExportsEqualsRequire.ts`
-goTo.select("a", "b");
-edit.applyRefactor({
- refactorName: "Convert to ES6 module",
- actionName: "Convert to ES6 module",
- actionDescription: "Convert to ES6 module",
- newContent: `export default function() { }
+verify.codeFix({
+ description: "Convert to ES6 module",
+ newFileContent:
+`export default function() { }
export default function f() { }
export default class {
}
export default class C {
}
-export default 0;`
+export default 0;`,
});
diff --git a/tests/cases/fourslash/refactorConvertToEs6Module_export_moduleDotExportsEqualsRequire.ts b/tests/cases/fourslash/refactorConvertToEs6Module_export_moduleDotExportsEqualsRequire.ts
index 8d22ea77c2b..81877c8a98b 100644
--- a/tests/cases/fourslash/refactorConvertToEs6Module_export_moduleDotExportsEqualsRequire.ts
+++ b/tests/cases/fourslash/refactorConvertToEs6Module_export_moduleDotExportsEqualsRequire.ts
@@ -18,7 +18,7 @@
// @Filename: /z.js
// Normally -- just `export *`
-/////*a*/module/*b*/.exports = require("./a");
+////module.exports = require("./a");
// If just a default is exported, just `export { default }`
////module.exports = require("./b");
// May need both
@@ -28,12 +28,10 @@
// In untyped case just go with `export *`
////module.exports = require("./unknown");
-goTo.select("a", "b");
-edit.applyRefactor({
- refactorName: "Convert to ES6 module",
- actionName: "Convert to ES6 module",
- actionDescription: "Convert to ES6 module",
- newContent:
+goTo.file("/z.js");
+verify.codeFix({
+ description: "Convert to ES6 module",
+ newFileContent:
`export * from "./a";
export { default } from "./b";
export * from "./c";
diff --git a/tests/cases/fourslash/refactorConvertToEs6Module_export_moduleDotExports_changesImports.ts b/tests/cases/fourslash/refactorConvertToEs6Module_export_moduleDotExports_changesImports.ts
index 7b48bd5f91e..84f081d24b3 100644
--- a/tests/cases/fourslash/refactorConvertToEs6Module_export_moduleDotExports_changesImports.ts
+++ b/tests/cases/fourslash/refactorConvertToEs6Module_export_moduleDotExports_changesImports.ts
@@ -3,7 +3,7 @@
// @allowJs: true
// @Filename: /a.js
-/////*a*/module/*b*/.exports = 0;
+////module.exports = 0;
// @Filename: /b.ts
////import a = require("./a");
@@ -11,12 +11,9 @@
// @Filename: /c.js
////const a = require("./a");
-goTo.select("a", "b");
-edit.applyRefactor({
- refactorName: "Convert to ES6 module",
- actionName: "Convert to ES6 module",
- actionDescription: "Convert to ES6 module",
- newContent: `export default 0;`,
+verify.codeFix({
+ description: "Convert to ES6 module",
+ newFileContent: "export default 0;",
});
goTo.file("/b.ts");
diff --git a/tests/cases/fourslash/refactorConvertToEs6Module_export_named.ts b/tests/cases/fourslash/refactorConvertToEs6Module_export_named.ts
index 8251f90fc0d..03303b1e09e 100644
--- a/tests/cases/fourslash/refactorConvertToEs6Module_export_named.ts
+++ b/tests/cases/fourslash/refactorConvertToEs6Module_export_named.ts
@@ -3,16 +3,22 @@
// @allowJs: true
// @Filename: /a.js
-/////*a*/exports/*b*/.f = function() {}
+////exports.f = function() {}/*diagEnd*/
////exports.C = class {}
////exports.x = 0;
-goTo.select("a", "b");
-edit.applyRefactor({
- refactorName: "Convert to ES6 module",
- actionName: "Convert to ES6 module",
- actionDescription: "Convert to ES6 module",
- newContent: `export function f() { }
+verify.getSuggestionDiagnostics([{
+ message: "File is a CommonJS module; it may be converted to an ES6 module.",
+ start: 0,
+ length: test.marker("diagEnd").position,
+ category: "suggestion",
+ code: 80001,
+}]);
+
+verify.codeFix({
+ description: "Convert to ES6 module",
+ newFileContent:
+`export function f() { }
export class C {
}
export const x = 0;`,
diff --git a/tests/cases/fourslash/refactorConvertToEs6Module_export_namedFunctionExpression.ts b/tests/cases/fourslash/refactorConvertToEs6Module_export_namedFunctionExpression.ts
index a4b0ba24109..dbd4e6a0a4c 100644
--- a/tests/cases/fourslash/refactorConvertToEs6Module_export_namedFunctionExpression.ts
+++ b/tests/cases/fourslash/refactorConvertToEs6Module_export_namedFunctionExpression.ts
@@ -3,15 +3,12 @@
// @allowJs: true
// @Filename: /a.js
-/////*a*/exports/*b*/.f = function g() { g(); }
+////exports.f = function g() { g(); }
////exports.h = function h() { h(); }
-goTo.select("a", "b");
-edit.applyRefactor({
- refactorName: "Convert to ES6 module",
- actionName: "Convert to ES6 module",
- actionDescription: "Convert to ES6 module",
- newContent:
+verify.codeFix({
+ description: "Convert to ES6 module",
+ newFileContent:
`export const f = function g() { g(); };
-export function h() { h(); }`
+export function h() { h(); }`,
});
diff --git a/tests/cases/fourslash/refactorConvertToEs6Module_export_object.ts b/tests/cases/fourslash/refactorConvertToEs6Module_export_object.ts
index b18bc94579d..61c46c98b3c 100644
--- a/tests/cases/fourslash/refactorConvertToEs6Module_export_object.ts
+++ b/tests/cases/fourslash/refactorConvertToEs6Module_export_object.ts
@@ -3,7 +3,7 @@
// @allowJs: true
// @Filename: /a.js
-/////*a*/module/*b*/.exports = {
+////module.exports = {
//// x: 0,
//// f: function() {},
//// g: () => {},
@@ -11,12 +11,10 @@
//// C: class {},
////};
-goTo.select("a", "b");
-edit.applyRefactor({
- refactorName: "Convert to ES6 module",
- actionName: "Convert to ES6 module",
- actionDescription: "Convert to ES6 module",
- newContent: `export const x = 0;
+verify.codeFix({
+ description: "Convert to ES6 module",
+ newFileContent:
+`export const x = 0;
export function f() { }
export function g() { }
export function h() { }
diff --git a/tests/cases/fourslash/refactorConvertToEs6Module_export_object_shorthand.ts b/tests/cases/fourslash/refactorConvertToEs6Module_export_object_shorthand.ts
index 05b4903eda3..f6fe1048820 100644
--- a/tests/cases/fourslash/refactorConvertToEs6Module_export_object_shorthand.ts
+++ b/tests/cases/fourslash/refactorConvertToEs6Module_export_object_shorthand.ts
@@ -6,13 +6,11 @@
// @Filename: /a.js
////function f() {}
-/////*a*/module/*b*/.exports = { f };
+////module.exports = { f };
-goTo.select("a", "b");
-edit.applyRefactor({
- refactorName: "Convert to ES6 module",
- actionName: "Convert to ES6 module",
- actionDescription: "Convert to ES6 module",
- newContent: `function f() {}
+verify.codeFix({
+ description: "Convert to ES6 module",
+ newFileContent:
+`function f() {}
export default { f };`,
});
diff --git a/tests/cases/fourslash/refactorConvertToEs6Module_export_referenced.ts b/tests/cases/fourslash/refactorConvertToEs6Module_export_referenced.ts
index da9976fa7d0..ff87d3c6948 100644
--- a/tests/cases/fourslash/refactorConvertToEs6Module_export_referenced.ts
+++ b/tests/cases/fourslash/refactorConvertToEs6Module_export_referenced.ts
@@ -7,7 +7,7 @@
////exports.x;
////
////const y = 1;
-/////*a*/exports/*b*/.y = y;
+////exports.y = y;
////exports.y;
////
////exports.z = 2;
@@ -15,12 +15,10 @@
//// exports.z;
////}
-goTo.select("a", "b");
-edit.applyRefactor({
- refactorName: "Convert to ES6 module",
- actionName: "Convert to ES6 module",
- actionDescription: "Convert to ES6 module",
- newContent: `export const x = 0;
+verify.codeFix({
+ description: "Convert to ES6 module",
+ newFileContent:
+`export const x = 0;
x;
const y = 1;
diff --git a/tests/cases/fourslash/refactorConvertToEs6Module_expressionToDeclaration.ts b/tests/cases/fourslash/refactorConvertToEs6Module_expressionToDeclaration.ts
index b3b7fbf94c6..746524e849c 100644
--- a/tests/cases/fourslash/refactorConvertToEs6Module_expressionToDeclaration.ts
+++ b/tests/cases/fourslash/refactorConvertToEs6Module_expressionToDeclaration.ts
@@ -3,15 +3,13 @@
// @allowJs: true
// @Filename: /a.js
-/////*a*/exports/*b*/.f = async function* f(p) {}
+////exports.f = async function* f(p) {}
////exports.C = class C extends D { m() {} }
-goTo.select("a", "b");
-edit.applyRefactor({
- refactorName: "Convert to ES6 module",
- actionName: "Convert to ES6 module",
- actionDescription: "Convert to ES6 module",
- newContent: `export async function* f(p) { }
+verify.codeFix({
+ description: "Convert to ES6 module",
+ newFileContent:
+`export async function* f(p) { }
export class C extends D {
m() { }
}`,
diff --git a/tests/cases/fourslash/refactorConvertToEs6Module_import_arrayBindingPattern.ts b/tests/cases/fourslash/refactorConvertToEs6Module_import_arrayBindingPattern.ts
index b33b0a1a160..d7e857b5d5e 100644
--- a/tests/cases/fourslash/refactorConvertToEs6Module_import_arrayBindingPattern.ts
+++ b/tests/cases/fourslash/refactorConvertToEs6Module_import_arrayBindingPattern.ts
@@ -5,11 +5,8 @@
// @Filename: /a.js
////const [x, y] = /*a*/require/*b*/("x");
-goTo.select("a", "b");
-edit.applyRefactor({
- refactorName: "Convert to ES6 module",
- actionName: "Convert to ES6 module",
- actionDescription: "Convert to ES6 module",
- newContent: `import _x from "x";
+verify.codeFix({
+ description: "Convert to ES6 module",
+ newFileContent: `import _x from "x";
const [x, y] = _x;`,
});
diff --git a/tests/cases/fourslash/refactorConvertToEs6Module_import_includeDefaultUses.ts b/tests/cases/fourslash/refactorConvertToEs6Module_import_includeDefaultUses.ts
index 7c5415c1451..0e69f9519ee 100644
--- a/tests/cases/fourslash/refactorConvertToEs6Module_import_includeDefaultUses.ts
+++ b/tests/cases/fourslash/refactorConvertToEs6Module_import_includeDefaultUses.ts
@@ -7,12 +7,10 @@
////x();
////x.y;
-goTo.select("a", "b");
-edit.applyRefactor({
- refactorName: "Convert to ES6 module",
- actionName: "Convert to ES6 module",
- actionDescription: "Convert to ES6 module",
- newContent: `import x, { y } from "x";
+verify.codeFix({
+ description: "Convert to ES6 module",
+ newFileContent:
+`import x, { y } from "x";
x();
y;`,
});
diff --git a/tests/cases/fourslash/refactorConvertToEs6Module_import_multipleUniqueIdentifiers.ts b/tests/cases/fourslash/refactorConvertToEs6Module_import_multipleUniqueIdentifiers.ts
index 321a9cccf8b..a42f1fe5321 100644
--- a/tests/cases/fourslash/refactorConvertToEs6Module_import_multipleUniqueIdentifiers.ts
+++ b/tests/cases/fourslash/refactorConvertToEs6Module_import_multipleUniqueIdentifiers.ts
@@ -4,17 +4,15 @@
// @Filename: /a.js
////const x = require("x");
-////const [a, b] = /*a*/require/*b*/("x");
+////const [a, b] = require("x");
////const {c, ...d} = require("x");
-goTo.select("a", "b");
-edit.applyRefactor({
- refactorName: "Convert to ES6 module",
- actionName: "Convert to ES6 module",
- actionDescription: "Convert to ES6 module",
- newContent: `import x from "x";
+verify.codeFix({
+ description: "Convert to ES6 module",
+ newFileContent:
+`import x from "x";
import _x from "x";
const [a, b] = _x;
import __x from "x";
-const { c, ...d } = __x;`
+const { c, ...d } = __x;`,
});
diff --git a/tests/cases/fourslash/refactorConvertToEs6Module_import_multipleVariableDeclarations.ts b/tests/cases/fourslash/refactorConvertToEs6Module_import_multipleVariableDeclarations.ts
index 37d65ddc622..3c45950c90d 100644
--- a/tests/cases/fourslash/refactorConvertToEs6Module_import_multipleVariableDeclarations.ts
+++ b/tests/cases/fourslash/refactorConvertToEs6Module_import_multipleVariableDeclarations.ts
@@ -5,14 +5,12 @@
// @allowJs: true
// @Filename: /a.js
-////const x = /*a*/require/*b*/("x"), y = 0, { z } = require("z");
+////const x = require("x"), y = 0, { z } = require("z");
-goTo.select("a", "b");
-edit.applyRefactor({
- refactorName: "Convert to ES6 module",
- actionName: "Convert to ES6 module",
- actionDescription: "Convert to ES6 module",
- newContent: `import x from "x";
+verify.codeFix({
+ description: "Convert to ES6 module",
+ newFileContent:
+`import x from "x";
const y = 0;
import { z } from "z";`,
});
diff --git a/tests/cases/fourslash/refactorConvertToEs6Module_import_nameFromModuleSpecifier.ts b/tests/cases/fourslash/refactorConvertToEs6Module_import_nameFromModuleSpecifier.ts
index 0c953b2e7e6..510b610315a 100644
--- a/tests/cases/fourslash/refactorConvertToEs6Module_import_nameFromModuleSpecifier.ts
+++ b/tests/cases/fourslash/refactorConvertToEs6Module_import_nameFromModuleSpecifier.ts
@@ -3,19 +3,17 @@
// @allowJs: true
// @Filename: /a.js
-////const [] = /*a0*/require/*b0*/("a-b");
-////const [] = /*a1*/require/*b1*/("0a");
-////const [] = /*a2*/require/*b2*/("1a");
+////const [] = require("a-b");
+////const [] = require("0a");
+////const [] = require("1a");
-goTo.select("a0", "b0");
-edit.applyRefactor({
- refactorName: "Convert to ES6 module",
- actionName: "Convert to ES6 module",
- actionDescription: "Convert to ES6 module",
- newContent: `import aB from "a-b";
+verify.codeFix({
+ description: "Convert to ES6 module",
+ newFileContent:
+`import aB from "a-b";
const [] = aB;
import A from "0a";
const [] = A;
import _A from "1a";
-const [] = _A;`
+const [] = _A;`,
});
diff --git a/tests/cases/fourslash/refactorConvertToEs6Module_import_objectBindingPattern_complex.ts b/tests/cases/fourslash/refactorConvertToEs6Module_import_objectBindingPattern_complex.ts
index f757db2164a..32df9906964 100644
--- a/tests/cases/fourslash/refactorConvertToEs6Module_import_objectBindingPattern_complex.ts
+++ b/tests/cases/fourslash/refactorConvertToEs6Module_import_objectBindingPattern_complex.ts
@@ -3,13 +3,11 @@
// @allowJs: true
// @Filename: /a.js
-////const { x: { a, b } } = /*a*/require/*b*/("x");
+////const { x: { a, b } } = require("x");
-goTo.select("a", "b");
-edit.applyRefactor({
- refactorName: "Convert to ES6 module",
- actionName: "Convert to ES6 module",
- actionDescription: "Convert to ES6 module",
- newContent: `import x from "x";
+verify.codeFix({
+ description: "Convert to ES6 module",
+ newFileContent:
+`import x from "x";
const { x: { a, b } } = x;`,
});
diff --git a/tests/cases/fourslash/refactorConvertToEs6Module_import_objectBindingPattern_plain.ts b/tests/cases/fourslash/refactorConvertToEs6Module_import_objectBindingPattern_plain.ts
index 474fd4b0f0f..4bff560e530 100644
--- a/tests/cases/fourslash/refactorConvertToEs6Module_import_objectBindingPattern_plain.ts
+++ b/tests/cases/fourslash/refactorConvertToEs6Module_import_objectBindingPattern_plain.ts
@@ -3,12 +3,9 @@
// @allowJs: true
// @Filename: /a.js
-////const { x, y: z } = /*a*/require/*b*/("x");
+////const { x, y: z } = require("x");
-goTo.select("a", "b");
-edit.applyRefactor({
- refactorName: "Convert to ES6 module",
- actionName: "Convert to ES6 module",
- actionDescription: "Convert to ES6 module",
- newContent: 'import { x, y as z } from "x";',
+verify.codeFix({
+ description: "Convert to ES6 module",
+ newFileContent: 'import { x, y as z } from "x";',
});
diff --git a/tests/cases/fourslash/refactorConvertToEs6Module_import_onlyNamedImports.ts b/tests/cases/fourslash/refactorConvertToEs6Module_import_onlyNamedImports.ts
index bf7e207550e..7f66b67685e 100644
--- a/tests/cases/fourslash/refactorConvertToEs6Module_import_onlyNamedImports.ts
+++ b/tests/cases/fourslash/refactorConvertToEs6Module_import_onlyNamedImports.ts
@@ -3,14 +3,12 @@
// @allowJs: true
// @Filename: /a.js
-////const x = /*a*/require/*b*/("x");
+////const x = require("x");
////x.y;
-goTo.select("a", "b");
-edit.applyRefactor({
- refactorName: "Convert to ES6 module",
- actionName: "Convert to ES6 module",
- actionDescription: "Convert to ES6 module",
- newContent: `import { y } from "x";
+verify.codeFix({
+ description: "Convert to ES6 module",
+ newFileContent:
+`import { y } from "x";
y;`,
});
diff --git a/tests/cases/fourslash/refactorConvertToEs6Module_import_propertyAccess.ts b/tests/cases/fourslash/refactorConvertToEs6Module_import_propertyAccess.ts
index 57efd5370f2..34c6ee6aa57 100644
--- a/tests/cases/fourslash/refactorConvertToEs6Module_import_propertyAccess.ts
+++ b/tests/cases/fourslash/refactorConvertToEs6Module_import_propertyAccess.ts
@@ -3,18 +3,16 @@
// @allowJs: true
// @Filename: /a.js
-////const x = /*a*/require/*b*/("x").default;
+////const x = require("x").default;
////const a = require("b").c;
////const a = require("a").a;
////const [a, b] = require("c").d;
////const [a, b] = require("c").a; // Test that we avoid shadowing the earlier local variable 'a' from 'const [a,b] = d;'.
-goTo.select("a", "b");
-edit.applyRefactor({
- refactorName: "Convert to ES6 module",
- actionName: "Convert to ES6 module",
- actionDescription: "Convert to ES6 module",
- newContent: `import x from "x";
+verify.codeFix({
+ description: "Convert to ES6 module",
+ newFileContent:
+`import x from "x";
import { c as a } from "b";
import { a } from "a";
import { d } from "c";
diff --git a/tests/cases/fourslash/refactorConvertToEs6Module_import_shadowing.ts b/tests/cases/fourslash/refactorConvertToEs6Module_import_shadowing.ts
index c389280d75c..dec87859901 100644
--- a/tests/cases/fourslash/refactorConvertToEs6Module_import_shadowing.ts
+++ b/tests/cases/fourslash/refactorConvertToEs6Module_import_shadowing.ts
@@ -3,16 +3,14 @@
// @allowJs: true
// @Filename: /a.js
-////const mod = /*a*/require/*b*/("mod");
+////const mod = require("mod");
////const x = 0;
////mod.x(x);
-goTo.select("a", "b");
-edit.applyRefactor({
- refactorName: "Convert to ES6 module",
- actionName: "Convert to ES6 module",
- actionDescription: "Convert to ES6 module",
- newContent: `import { x as _x } from "mod";
+verify.codeFix({
+ description: "Convert to ES6 module",
+ newFileContent:
+`import { x as _x } from "mod";
const x = 0;
-_x(x);`
+_x(x);`,
});
diff --git a/tests/cases/fourslash/refactorConvertToEs6Module_import_sideEffect.ts b/tests/cases/fourslash/refactorConvertToEs6Module_import_sideEffect.ts
index 2b81c816e20..f729f0a9815 100644
--- a/tests/cases/fourslash/refactorConvertToEs6Module_import_sideEffect.ts
+++ b/tests/cases/fourslash/refactorConvertToEs6Module_import_sideEffect.ts
@@ -7,10 +7,7 @@
// @Filename: /a.js
/////*a*/require/*b*/("foo");
-goTo.select("a", "b");
-edit.applyRefactor({
- refactorName: "Convert to ES6 module",
- actionName: "Convert to ES6 module",
- actionDescription: "Convert to ES6 module",
- newContent: 'import "foo";',
+verify.codeFix({
+ description: "Convert to ES6 module",
+ newFileContent: 'import "foo";',
});
diff --git a/tests/cases/fourslash/refactorConvertToEs6Module_triggers.ts b/tests/cases/fourslash/refactorConvertToEs6Module_triggers.ts
deleted file mode 100644
index 8d441f47dc3..00000000000
--- a/tests/cases/fourslash/refactorConvertToEs6Module_triggers.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-///
-
-// @allowJs: true
-
-// @Filename: /a.js
-////c[|o|]nst [|a|]lias [|=|] [|m|]odule[|.|]export[|s|];
-////[|a|]lias[|.|][|x|] = 0;
-////[|module.exports|];
-////[|require("x")|];
-////[|require("x").y;|];
-
-goTo.eachRange(() => verify.refactorAvailable("Convert to ES6 module"));
-
diff --git a/tests/cases/fourslash/refactorConvertToEs6Module_triggers_declarationList.ts b/tests/cases/fourslash/refactorConvertToEs6Module_triggers_declarationList.ts
deleted file mode 100644
index 36ec32b0561..00000000000
--- a/tests/cases/fourslash/refactorConvertToEs6Module_triggers_declarationList.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-///
-
-// @allowJs: true
-
-// @Filename: /a.js
-////c[|o|]nst;
-////require("x");
-
-goTo.eachRange(() => verify.not.refactorAvailable("Convert to ES6 module"));
diff --git a/tests/cases/fourslash/refactorConvertToEs6Module_triggers_noInitializer.ts b/tests/cases/fourslash/refactorConvertToEs6Module_triggers_noInitializer.ts
deleted file mode 100644
index 23cbdd12aee..00000000000
--- a/tests/cases/fourslash/refactorConvertToEs6Module_triggers_noInitializer.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-///
-
-// @allowJs: true
-
-// @Filename: /a.js
-/////*a*/const/*b*/ alias;
-////require("x");
-
-goTo.select("a", "b");
-verify.not.refactorAvailable("Convert to ES6 module");
-
diff --git a/tests/cases/fourslash/server/getJavaScriptSyntacticDiagnostics01.ts b/tests/cases/fourslash/server/getJavaScriptSyntacticDiagnostics01.ts
index 0aa88ebd90c..d06395186e4 100644
--- a/tests/cases/fourslash/server/getJavaScriptSyntacticDiagnostics01.ts
+++ b/tests/cases/fourslash/server/getJavaScriptSyntacticDiagnostics01.ts
@@ -4,20 +4,20 @@
// @Filename: a.js
//// var ===;
-verify.getSyntacticDiagnostics(`[
+verify.getSyntacticDiagnostics([
{
- "message": "Variable declaration expected.",
- "start": 4,
- "length": 3,
- "category": "error",
- "code": 1134
+ message: "Variable declaration expected.",
+ start: 4,
+ length: 3,
+ category: "error",
+ code: 1134
},
{
- "message": "Expression expected.",
- "start": 7,
- "length": 1,
- "category": "error",
- "code": 1109
- }
-]`);
-verify.getSemanticDiagnostics(`[]`);
\ No newline at end of file
+ message: "Expression expected.",
+ start: 7,
+ length: 1,
+ category: "error",
+ code: 1109
+ },
+]);
+verify.getSemanticDiagnostics([]);
diff --git a/tests/cases/fourslash/server/getJavaScriptSyntacticDiagnostics02.ts b/tests/cases/fourslash/server/getJavaScriptSyntacticDiagnostics02.ts
index a19d170217c..ab12a5c146d 100644
--- a/tests/cases/fourslash/server/getJavaScriptSyntacticDiagnostics02.ts
+++ b/tests/cases/fourslash/server/getJavaScriptSyntacticDiagnostics02.ts
@@ -7,41 +7,41 @@
//// function foo(): string { }
//// var var = "c";
-verify.getSyntacticDiagnostics(`[
+verify.getSyntacticDiagnostics([
{
- "message": "\'types\' can only be used in a .ts file.",
- "start": 20,
- "length": 7,
- "category": "error",
- "code": 8010
+ message: "'types' can only be used in a .ts file.",
+ start: 20,
+ length: 7,
+ category: "error",
+ code: 8010
},
{
- "message": "\'types\' can only be used in a .ts file.",
- "start": 52,
- "length": 6,
- "category": "error",
- "code": 8010
+ message: "\'types\' can only be used in a .ts file.",
+ start: 52,
+ length: 6,
+ category: "error",
+ code: 8010
},
{
- "message": "Variable declaration expected.",
- "start": 67,
- "length": 3,
- "category": "error",
- "code": 1134
+ message: "Variable declaration expected.",
+ start: 67,
+ length: 3,
+ category: "error",
+ code: 1134
},
{
- "message": "Variable declaration expected.",
- "start": 71,
- "length": 1,
- "category": "error",
- "code": 1134
+ message: "Variable declaration expected.",
+ start: 71,
+ length: 1,
+ category: "error",
+ code: 1134
},
{
- "message": "Variable declaration expected.",
- "start": 73,
- "length": 3,
- "category": "error",
- "code": 1134
- }
-]`);
-verify.getSemanticDiagnostics(`[]`);
\ No newline at end of file
+ message: "Variable declaration expected.",
+ start: 73,
+ length: 3,
+ category: "error",
+ code: 1134
+ },
+]);
+verify.getSemanticDiagnostics([]);