mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
Merge branch 'master' into mappedTypes
# Conflicts: # src/compiler/checker.ts
This commit is contained in:
@@ -71,6 +71,7 @@ var compilerSources = [
|
||||
"transformers/destructuring.ts",
|
||||
"transformers/ts.ts",
|
||||
"transformers/jsx.ts",
|
||||
"transformers/esnext.ts",
|
||||
"transformers/es2017.ts",
|
||||
"transformers/es2016.ts",
|
||||
"transformers/es2015.ts",
|
||||
@@ -107,6 +108,7 @@ var servicesSources = [
|
||||
"transformers/destructuring.ts",
|
||||
"transformers/ts.ts",
|
||||
"transformers/jsx.ts",
|
||||
"transformers/esnext.ts",
|
||||
"transformers/es2017.ts",
|
||||
"transformers/es2016.ts",
|
||||
"transformers/es2015.ts",
|
||||
|
||||
+89
-20
@@ -1139,8 +1139,8 @@ namespace ts {
|
||||
}
|
||||
else if (node.kind === SyntaxKind.ArrayLiteralExpression) {
|
||||
for (const e of (<ArrayLiteralExpression>node).elements) {
|
||||
if (e.kind === SyntaxKind.SpreadElementExpression) {
|
||||
bindAssignmentTargetFlow((<SpreadElementExpression>e).expression);
|
||||
if (e.kind === SyntaxKind.SpreadElement) {
|
||||
bindAssignmentTargetFlow((<SpreadElement>e).expression);
|
||||
}
|
||||
else {
|
||||
bindDestructuringTargetFlow(e);
|
||||
@@ -1155,6 +1155,9 @@ namespace ts {
|
||||
else if (p.kind === SyntaxKind.ShorthandPropertyAssignment) {
|
||||
bindAssignmentTargetFlow((<ShorthandPropertyAssignment>p).name);
|
||||
}
|
||||
else if (p.kind === SyntaxKind.SpreadAssignment) {
|
||||
bindAssignmentTargetFlow((<SpreadAssignment>p).expression);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1918,6 +1921,9 @@ namespace ts {
|
||||
return bindParameter(<ParameterDeclaration>node);
|
||||
case SyntaxKind.VariableDeclaration:
|
||||
case SyntaxKind.BindingElement:
|
||||
if ((node as BindingElement).dotDotDotToken && node.parent.kind === SyntaxKind.ObjectBindingPattern) {
|
||||
emitFlags |= NodeFlags.HasRestAttribute;
|
||||
}
|
||||
return bindVariableDeclarationOrBindingElement(<VariableDeclaration | BindingElement>node);
|
||||
case SyntaxKind.PropertyDeclaration:
|
||||
case SyntaxKind.PropertySignature:
|
||||
@@ -1931,8 +1937,21 @@ namespace ts {
|
||||
case SyntaxKind.EnumMember:
|
||||
return bindPropertyOrMethodOrAccessor(<Declaration>node, SymbolFlags.EnumMember, SymbolFlags.EnumMemberExcludes);
|
||||
|
||||
case SyntaxKind.SpreadAssignment:
|
||||
case SyntaxKind.JsxSpreadAttribute:
|
||||
emitFlags |= NodeFlags.HasJsxSpreadAttributes;
|
||||
let root = container;
|
||||
let hasRest = false;
|
||||
while (root.parent) {
|
||||
if (root.kind === SyntaxKind.ObjectLiteralExpression &&
|
||||
root.parent.kind === SyntaxKind.BinaryExpression &&
|
||||
(root.parent as BinaryExpression).operatorToken.kind === SyntaxKind.EqualsToken &&
|
||||
(root.parent as BinaryExpression).left === root) {
|
||||
hasRest = true;
|
||||
break;
|
||||
}
|
||||
root = root.parent;
|
||||
}
|
||||
emitFlags |= hasRest ? NodeFlags.HasRestAttribute : NodeFlags.HasSpreadAttribute;
|
||||
return;
|
||||
|
||||
case SyntaxKind.CallSignature:
|
||||
@@ -2498,9 +2517,9 @@ namespace ts {
|
||||
transformFlags |= TransformFlags.AssertTypeScript;
|
||||
}
|
||||
|
||||
if (subtreeFlags & TransformFlags.ContainsSpreadElementExpression
|
||||
if (subtreeFlags & TransformFlags.ContainsSpreadExpression
|
||||
|| isSuperOrSuperProperty(expression, expressionKind)) {
|
||||
// If the this node contains a SpreadElementExpression, or is a super call, then it is an ES6
|
||||
// If the this node contains a SpreadExpression, or is a super call, then it is an ES6
|
||||
// node.
|
||||
transformFlags |= TransformFlags.AssertES2015;
|
||||
}
|
||||
@@ -2529,7 +2548,7 @@ namespace ts {
|
||||
if (node.typeArguments) {
|
||||
transformFlags |= TransformFlags.AssertTypeScript;
|
||||
}
|
||||
if (subtreeFlags & TransformFlags.ContainsSpreadElementExpression) {
|
||||
if (subtreeFlags & TransformFlags.ContainsSpreadExpression) {
|
||||
// If the this node contains a SpreadElementExpression then it is an ES6
|
||||
// node.
|
||||
transformFlags |= TransformFlags.AssertES2015;
|
||||
@@ -2544,10 +2563,13 @@ namespace ts {
|
||||
const operatorTokenKind = node.operatorToken.kind;
|
||||
const leftKind = node.left.kind;
|
||||
|
||||
if (operatorTokenKind === SyntaxKind.EqualsToken
|
||||
&& (leftKind === SyntaxKind.ObjectLiteralExpression
|
||||
|| leftKind === SyntaxKind.ArrayLiteralExpression)) {
|
||||
// Destructuring assignments are ES6 syntax.
|
||||
if (operatorTokenKind === SyntaxKind.EqualsToken && leftKind === SyntaxKind.ObjectLiteralExpression) {
|
||||
// Destructuring object assignments with are ES2015 syntax
|
||||
// and possibly ESNext if they contain rest
|
||||
transformFlags |= TransformFlags.AssertESNext | TransformFlags.AssertES2015 | TransformFlags.AssertDestructuringAssignment;
|
||||
}
|
||||
else if (operatorTokenKind === SyntaxKind.EqualsToken && leftKind === SyntaxKind.ArrayLiteralExpression) {
|
||||
// Destructuring assignments are ES2015 syntax.
|
||||
transformFlags |= TransformFlags.AssertES2015 | TransformFlags.AssertDestructuringAssignment;
|
||||
}
|
||||
else if (operatorTokenKind === SyntaxKind.AsteriskAsteriskToken
|
||||
@@ -2581,6 +2603,11 @@ namespace ts {
|
||||
transformFlags |= TransformFlags.AssertTypeScript | TransformFlags.ContainsParameterPropertyAssignments;
|
||||
}
|
||||
|
||||
// parameters with object rest destructuring are ES Next syntax
|
||||
if (subtreeFlags & TransformFlags.ContainsSpreadExpression) {
|
||||
transformFlags |= TransformFlags.AssertESNext;
|
||||
}
|
||||
|
||||
// If a parameter has an initializer, a binding pattern or a dotDotDot token, then
|
||||
// it is ES6 syntax and its container must emit default value assignments or parameter destructuring downlevel.
|
||||
if (subtreeFlags & TransformFlags.ContainsBindingPattern || initializer || dotDotDotToken) {
|
||||
@@ -2814,6 +2841,11 @@ namespace ts {
|
||||
transformFlags |= TransformFlags.AssertES2017;
|
||||
}
|
||||
|
||||
// function declarations with object rest destructuring are ES Next syntax
|
||||
if (subtreeFlags & TransformFlags.ContainsSpreadExpression) {
|
||||
transformFlags |= TransformFlags.AssertESNext;
|
||||
}
|
||||
|
||||
// If a FunctionDeclaration's subtree has marked the container as needing to capture the
|
||||
// lexical this, or the function contains parameters with initializers, then this node is
|
||||
// ES6 syntax.
|
||||
@@ -2851,6 +2883,12 @@ namespace ts {
|
||||
transformFlags |= TransformFlags.AssertES2017;
|
||||
}
|
||||
|
||||
// function expressions with object rest destructuring are ES Next syntax
|
||||
if (subtreeFlags & TransformFlags.ContainsSpreadExpression) {
|
||||
transformFlags |= TransformFlags.AssertESNext;
|
||||
}
|
||||
|
||||
|
||||
// If a FunctionExpression's subtree has marked the container as needing to capture the
|
||||
// lexical this, or the function contains parameters with initializers, then this node is
|
||||
// ES6 syntax.
|
||||
@@ -2888,6 +2926,11 @@ namespace ts {
|
||||
transformFlags |= TransformFlags.AssertES2017;
|
||||
}
|
||||
|
||||
// arrow functions with object rest destructuring are ES Next syntax
|
||||
if (subtreeFlags & TransformFlags.ContainsSpreadExpression) {
|
||||
transformFlags |= TransformFlags.AssertESNext;
|
||||
}
|
||||
|
||||
// If an ArrowFunction contains a lexical this, its container must capture the lexical this.
|
||||
if (subtreeFlags & TransformFlags.ContainsLexicalThis) {
|
||||
transformFlags |= TransformFlags.ContainsCapturedLexicalThis;
|
||||
@@ -2916,8 +2959,13 @@ namespace ts {
|
||||
let transformFlags = subtreeFlags;
|
||||
const nameKind = node.name.kind;
|
||||
|
||||
// A VariableDeclaration with a binding pattern is ES6 syntax.
|
||||
if (nameKind === SyntaxKind.ObjectBindingPattern || nameKind === SyntaxKind.ArrayBindingPattern) {
|
||||
// A VariableDeclaration with an object binding pattern is ES2015 syntax
|
||||
// and possibly ESNext syntax if it contains an object binding pattern
|
||||
if (nameKind === SyntaxKind.ObjectBindingPattern) {
|
||||
transformFlags |= TransformFlags.AssertESNext | TransformFlags.AssertES2015 | TransformFlags.ContainsBindingPattern;
|
||||
}
|
||||
// A VariableDeclaration with an object binding pattern is ES2015 syntax.
|
||||
else if (nameKind === SyntaxKind.ArrayBindingPattern) {
|
||||
transformFlags |= TransformFlags.AssertES2015 | TransformFlags.ContainsBindingPattern;
|
||||
}
|
||||
|
||||
@@ -3058,6 +3106,10 @@ namespace ts {
|
||||
transformFlags |= TransformFlags.AssertJsx;
|
||||
break;
|
||||
|
||||
case SyntaxKind.ForOfStatement:
|
||||
// for-of might be ESNext if it has a rest destructuring
|
||||
transformFlags |= TransformFlags.AssertESNext;
|
||||
// FALLTHROUGH
|
||||
case SyntaxKind.NoSubstitutionTemplateLiteral:
|
||||
case SyntaxKind.TemplateHead:
|
||||
case SyntaxKind.TemplateMiddle:
|
||||
@@ -3065,7 +3117,6 @@ namespace ts {
|
||||
case SyntaxKind.TemplateExpression:
|
||||
case SyntaxKind.TaggedTemplateExpression:
|
||||
case SyntaxKind.ShorthandPropertyAssignment:
|
||||
case SyntaxKind.ForOfStatement:
|
||||
case SyntaxKind.StaticKeyword:
|
||||
// These nodes are ES6 syntax.
|
||||
transformFlags |= TransformFlags.AssertES2015;
|
||||
@@ -3130,11 +3181,18 @@ namespace ts {
|
||||
}
|
||||
break;
|
||||
|
||||
case SyntaxKind.SpreadElementExpression:
|
||||
// This node is ES6 syntax, but is handled by a containing node.
|
||||
transformFlags |= TransformFlags.ContainsSpreadElementExpression;
|
||||
case SyntaxKind.SpreadElement:
|
||||
case SyntaxKind.SpreadAssignment:
|
||||
// This node is ES6 or ES next syntax, but is handled by a containing node.
|
||||
transformFlags |= TransformFlags.ContainsSpreadExpression;
|
||||
break;
|
||||
|
||||
case SyntaxKind.BindingElement:
|
||||
if ((node as BindingElement).dotDotDotToken) {
|
||||
// this node is ES2015 or ES next syntax, but is handled by a containing node.
|
||||
transformFlags |= TransformFlags.ContainsSpreadExpression;
|
||||
}
|
||||
|
||||
case SyntaxKind.SuperKeyword:
|
||||
// This node is ES6 syntax.
|
||||
transformFlags |= TransformFlags.AssertES2015;
|
||||
@@ -3147,8 +3205,13 @@ namespace ts {
|
||||
|
||||
case SyntaxKind.ObjectBindingPattern:
|
||||
case SyntaxKind.ArrayBindingPattern:
|
||||
// These nodes are ES6 syntax.
|
||||
transformFlags |= TransformFlags.AssertES2015 | TransformFlags.ContainsBindingPattern;
|
||||
// These nodes are ES2015 or ES Next syntax.
|
||||
if (subtreeFlags & TransformFlags.ContainsSpreadExpression) {
|
||||
transformFlags |= TransformFlags.AssertESNext | TransformFlags.ContainsBindingPattern;
|
||||
}
|
||||
else {
|
||||
transformFlags |= TransformFlags.AssertES2015 | TransformFlags.ContainsBindingPattern;
|
||||
}
|
||||
break;
|
||||
|
||||
case SyntaxKind.Decorator:
|
||||
@@ -3170,13 +3233,19 @@ namespace ts {
|
||||
transformFlags |= TransformFlags.ContainsLexicalThis;
|
||||
}
|
||||
|
||||
if (subtreeFlags & TransformFlags.ContainsSpreadExpression) {
|
||||
// If an ObjectLiteralExpression contains a spread element, then it
|
||||
// is an ES next node.
|
||||
transformFlags |= TransformFlags.AssertESNext;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case SyntaxKind.ArrayLiteralExpression:
|
||||
case SyntaxKind.NewExpression:
|
||||
excludeFlags = TransformFlags.ArrayLiteralOrCallOrNewExcludes;
|
||||
if (subtreeFlags & TransformFlags.ContainsSpreadElementExpression) {
|
||||
// If the this node contains a SpreadElementExpression, then it is an ES6
|
||||
if (subtreeFlags & TransformFlags.ContainsSpreadExpression) {
|
||||
// If the this node contains a SpreadExpression, then it is an ES6
|
||||
// node.
|
||||
transformFlags |= TransformFlags.AssertES2015;
|
||||
}
|
||||
|
||||
+250
-86
@@ -335,6 +335,9 @@ namespace ts {
|
||||
});
|
||||
|
||||
let jsxElementType: Type;
|
||||
let _jsxNamespace: string;
|
||||
let _jsxFactoryEntity: EntityName;
|
||||
|
||||
/** Things we lazy load from the JSX namespace */
|
||||
const jsxTypes = createMap<Type>();
|
||||
const JsxNames = {
|
||||
@@ -372,6 +375,22 @@ namespace ts {
|
||||
|
||||
return checker;
|
||||
|
||||
function getJsxNamespace(): string {
|
||||
if (_jsxNamespace === undefined) {
|
||||
_jsxNamespace = "React";
|
||||
if (compilerOptions.jsxFactory) {
|
||||
_jsxFactoryEntity = parseIsolatedEntityName(compilerOptions.jsxFactory, languageVersion);
|
||||
if (_jsxFactoryEntity) {
|
||||
_jsxNamespace = getFirstIdentifier(_jsxFactoryEntity).text;
|
||||
}
|
||||
}
|
||||
else if (compilerOptions.reactNamespace) {
|
||||
_jsxNamespace = compilerOptions.reactNamespace;
|
||||
}
|
||||
}
|
||||
return _jsxNamespace;
|
||||
}
|
||||
|
||||
function getEmitResolver(sourceFile: SourceFile, cancellationToken: CancellationToken) {
|
||||
// Ensure we have all the type information in place for this file so that all the
|
||||
// emitter questions of this resolver will return the right information.
|
||||
@@ -2501,6 +2520,13 @@ namespace ts {
|
||||
writePunctuation(writer, SyntaxKind.OpenBraceToken);
|
||||
writer.writeLine();
|
||||
writer.increaseIndent();
|
||||
writeObjectLiteralType(resolved);
|
||||
writer.decreaseIndent();
|
||||
writePunctuation(writer, SyntaxKind.CloseBraceToken);
|
||||
inObjectTypeLiteral = saveInObjectTypeLiteral;
|
||||
}
|
||||
|
||||
function writeObjectLiteralType(resolved: ResolvedType) {
|
||||
for (const signature of resolved.callSignatures) {
|
||||
buildSignatureDisplay(signature, writer, enclosingDeclaration, globalFlagsToPass, /*kind*/ undefined, symbolStack);
|
||||
writePunctuation(writer, SyntaxKind.SemicolonToken);
|
||||
@@ -2533,9 +2559,6 @@ namespace ts {
|
||||
writer.writeLine();
|
||||
}
|
||||
}
|
||||
writer.decreaseIndent();
|
||||
writePunctuation(writer, SyntaxKind.CloseBraceToken);
|
||||
inObjectTypeLiteral = saveInObjectTypeLiteral;
|
||||
}
|
||||
|
||||
function writeMappedType(type: MappedType) {
|
||||
@@ -3006,26 +3029,31 @@ namespace ts {
|
||||
return symbol && getSymbolLinks(symbol).type || getTypeForVariableLikeDeclaration(node, /*includeOptionality*/ false);
|
||||
}
|
||||
|
||||
function getTextOfPropertyName(name: PropertyName): string {
|
||||
switch (name.kind) {
|
||||
case SyntaxKind.Identifier:
|
||||
return (<Identifier>name).text;
|
||||
case SyntaxKind.StringLiteral:
|
||||
case SyntaxKind.NumericLiteral:
|
||||
return (<LiteralExpression>name).text;
|
||||
case SyntaxKind.ComputedPropertyName:
|
||||
if (isStringOrNumericLiteral((<ComputedPropertyName>name).expression.kind)) {
|
||||
return (<LiteralExpression>(<ComputedPropertyName>name).expression).text;
|
||||
}
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
function isComputedNonLiteralName(name: PropertyName): boolean {
|
||||
return name.kind === SyntaxKind.ComputedPropertyName && !isStringOrNumericLiteral((<ComputedPropertyName>name).expression.kind);
|
||||
}
|
||||
|
||||
function getRestType(source: Type, properties: PropertyName[], symbol: Symbol): Type {
|
||||
Debug.assert(!!(source.flags & TypeFlags.Object), "Rest types only support object types right now.");
|
||||
const members = createMap<Symbol>();
|
||||
const names = createMap<true>();
|
||||
for (const name of properties) {
|
||||
names[getTextOfPropertyName(name)] = true;
|
||||
}
|
||||
for (const prop of getPropertiesOfType(source)) {
|
||||
const inNamesToRemove = prop.name in names;
|
||||
const isPrivate = getDeclarationModifierFlagsFromSymbol(prop) & (ModifierFlags.Private | ModifierFlags.Protected);
|
||||
const isMethod = prop.flags & SymbolFlags.Method;
|
||||
const isSetOnlyAccessor = prop.flags & SymbolFlags.SetAccessor && !(prop.flags & SymbolFlags.GetAccessor);
|
||||
if (!inNamesToRemove && !isPrivate && !isMethod && !isSetOnlyAccessor) {
|
||||
members[prop.name] = prop;
|
||||
}
|
||||
}
|
||||
const stringIndexInfo = getIndexInfoOfType(source, IndexKind.String);
|
||||
const numberIndexInfo = getIndexInfoOfType(source, IndexKind.Number);
|
||||
return createAnonymousType(symbol, members, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo);
|
||||
}
|
||||
|
||||
/** Return the inferred type for a binding element */
|
||||
function getTypeForBindingElement(declaration: BindingElement): Type {
|
||||
const pattern = <BindingPattern>declaration.parent;
|
||||
@@ -3046,26 +3074,41 @@ namespace ts {
|
||||
|
||||
let type: Type;
|
||||
if (pattern.kind === SyntaxKind.ObjectBindingPattern) {
|
||||
// Use explicitly specified property name ({ p: xxx } form), or otherwise the implied name ({ p } form)
|
||||
const name = declaration.propertyName || <Identifier>declaration.name;
|
||||
if (isComputedNonLiteralName(name)) {
|
||||
// computed properties with non-literal names are treated as 'any'
|
||||
return anyType;
|
||||
}
|
||||
if (declaration.initializer) {
|
||||
getContextualType(declaration.initializer);
|
||||
if (declaration.dotDotDotToken) {
|
||||
if (!(parentType.flags & TypeFlags.Object)) {
|
||||
error(declaration, Diagnostics.Rest_types_may_only_be_created_from_object_types);
|
||||
return unknownType;
|
||||
}
|
||||
const literalMembers: PropertyName[] = [];
|
||||
for (const element of pattern.elements) {
|
||||
if (element.kind !== SyntaxKind.OmittedExpression && !(element as BindingElement).dotDotDotToken) {
|
||||
literalMembers.push(element.propertyName || element.name as Identifier);
|
||||
}
|
||||
}
|
||||
type = getRestType(parentType, literalMembers, declaration.symbol);
|
||||
}
|
||||
else {
|
||||
// Use explicitly specified property name ({ p: xxx } form), or otherwise the implied name ({ p } form)
|
||||
const name = declaration.propertyName || <Identifier>declaration.name;
|
||||
if (isComputedNonLiteralName(name)) {
|
||||
// computed properties with non-literal names are treated as 'any'
|
||||
return anyType;
|
||||
}
|
||||
if (declaration.initializer) {
|
||||
getContextualType(declaration.initializer);
|
||||
}
|
||||
|
||||
// Use type of the specified property, or otherwise, for a numeric name, the type of the numeric index signature,
|
||||
// or otherwise the type of the string index signature.
|
||||
const text = getTextOfPropertyName(name);
|
||||
// Use type of the specified property, or otherwise, for a numeric name, the type of the numeric index signature,
|
||||
// or otherwise the type of the string index signature.
|
||||
const text = getTextOfPropertyName(name);
|
||||
|
||||
type = getTypeOfPropertyOfType(parentType, text) ||
|
||||
isNumericLiteralName(text) && getIndexTypeOfType(parentType, IndexKind.Number) ||
|
||||
getIndexTypeOfType(parentType, IndexKind.String);
|
||||
if (!type) {
|
||||
error(name, Diagnostics.Type_0_has_no_property_1_and_no_string_index_signature, typeToString(parentType), declarationNameToString(name));
|
||||
return unknownType;
|
||||
type = getTypeOfPropertyOfType(parentType, text) ||
|
||||
isNumericLiteralName(text) && getIndexTypeOfType(parentType, IndexKind.Number) ||
|
||||
getIndexTypeOfType(parentType, IndexKind.String);
|
||||
if (!type) {
|
||||
error(name, Diagnostics.Type_0_has_no_property_1_and_no_string_index_signature, typeToString(parentType), declarationNameToString(name));
|
||||
return unknownType;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
@@ -3073,7 +3116,11 @@ namespace ts {
|
||||
// present (aka the tuple element property). This call also checks that the parentType is in
|
||||
// fact an iterable or array (depending on target language).
|
||||
const elementType = checkIteratedTypeOrElementType(parentType, pattern, /*allowStringInput*/ false);
|
||||
if (!declaration.dotDotDotToken) {
|
||||
if (declaration.dotDotDotToken) {
|
||||
// Rest element has an array type with the same element type as the parent type
|
||||
type = createArrayType(elementType);
|
||||
}
|
||||
else {
|
||||
// Use specific property type when parent is a tuple or numeric index type when parent is an array
|
||||
const propName = "" + indexOf(pattern.elements, declaration);
|
||||
type = isTupleLikeType(parentType)
|
||||
@@ -3089,10 +3136,6 @@ namespace ts {
|
||||
return unknownType;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Rest element has an array type with the same element type as the parent type
|
||||
type = createArrayType(elementType);
|
||||
}
|
||||
}
|
||||
// In strict null checking mode, if a default value of a non-undefined type is specified, remove
|
||||
// undefined from the final type.
|
||||
@@ -3273,8 +3316,8 @@ namespace ts {
|
||||
let hasComputedProperties = false;
|
||||
forEach(pattern.elements, e => {
|
||||
const name = e.propertyName || <Identifier>e.name;
|
||||
if (isComputedNonLiteralName(name)) {
|
||||
// do not include computed properties in the implied type
|
||||
if (isComputedNonLiteralName(name) || e.dotDotDotToken) {
|
||||
// do not include computed properties or rests in the implied type
|
||||
hasComputedProperties = true;
|
||||
return;
|
||||
}
|
||||
@@ -4371,6 +4414,11 @@ namespace ts {
|
||||
getIntersectionType([info1.type, info2.type]), info1.isReadonly && info2.isReadonly);
|
||||
}
|
||||
|
||||
function unionSpreadIndexInfos(info1: IndexInfo, info2: IndexInfo): IndexInfo {
|
||||
return info1 && info2 && createIndexInfo(
|
||||
getUnionType([info1.type, info2.type]), info1.isReadonly || info2.isReadonly);
|
||||
}
|
||||
|
||||
function resolveIntersectionTypeMembers(type: IntersectionType) {
|
||||
// The members and properties collections are empty for intersection types. To get all properties of an
|
||||
// intersection type use getPropertiesOfType (only the language service uses this).
|
||||
@@ -4582,7 +4630,9 @@ namespace ts {
|
||||
|
||||
function getPropertiesOfType(type: Type): Symbol[] {
|
||||
type = getApparentType(type);
|
||||
return type.flags & TypeFlags.UnionOrIntersection ? getPropertiesOfUnionOrIntersectionType(<UnionType>type) : getPropertiesOfObjectType(type);
|
||||
return type.flags & TypeFlags.UnionOrIntersection ?
|
||||
getPropertiesOfUnionOrIntersectionType(<UnionType>type) :
|
||||
getPropertiesOfObjectType(type);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -4637,6 +4687,7 @@ namespace ts {
|
||||
if (isReadonlySymbol(prop)) {
|
||||
isReadonly = true;
|
||||
}
|
||||
|
||||
}
|
||||
else if (containingType.flags & TypeFlags.Union) {
|
||||
isPartial = true;
|
||||
@@ -5999,6 +6050,68 @@ namespace ts {
|
||||
return symbol ? getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(symbol) : undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* Since the source of spread types are object literals, which are not binary,
|
||||
* this function should be called in a left folding style, with left = previous result of getSpreadType
|
||||
* and right = the new element to be spread.
|
||||
*/
|
||||
function getSpreadType(left: Type, right: Type, isFromObjectLiteral: boolean): ResolvedType | IntrinsicType {
|
||||
Debug.assert(!!(left.flags & (TypeFlags.Object | TypeFlags.Any)) && !!(right.flags & (TypeFlags.Object | TypeFlags.Any)), "Only object types may be spread.");
|
||||
if (left.flags & TypeFlags.Any || right.flags & TypeFlags.Any) {
|
||||
return anyType;
|
||||
}
|
||||
const members = createMap<Symbol>();
|
||||
const skippedPrivateMembers = createMap<boolean>();
|
||||
let stringIndexInfo: IndexInfo;
|
||||
let numberIndexInfo: IndexInfo;
|
||||
if (left === emptyObjectType) {
|
||||
// for the first spread element, left === emptyObjectType, so take the right's string indexer
|
||||
stringIndexInfo = getIndexInfoOfType(right, IndexKind.String);
|
||||
numberIndexInfo = getIndexInfoOfType(right, IndexKind.Number);
|
||||
}
|
||||
else {
|
||||
stringIndexInfo = unionSpreadIndexInfos(getIndexInfoOfType(left, IndexKind.String), getIndexInfoOfType(right, IndexKind.String));
|
||||
numberIndexInfo = unionSpreadIndexInfos(getIndexInfoOfType(left, IndexKind.Number), getIndexInfoOfType(right, IndexKind.Number));
|
||||
}
|
||||
|
||||
for (const rightProp of getPropertiesOfType(right)) {
|
||||
// we approximate own properties as non-methods plus methods that are inside the object literal
|
||||
const isOwnProperty = !(rightProp.flags & SymbolFlags.Method) || isFromObjectLiteral;
|
||||
const isSetterWithoutGetter = rightProp.flags & SymbolFlags.SetAccessor && !(rightProp.flags & SymbolFlags.GetAccessor);
|
||||
if (getDeclarationModifierFlagsFromSymbol(rightProp) & (ModifierFlags.Private | ModifierFlags.Protected)) {
|
||||
skippedPrivateMembers[rightProp.name] = true;
|
||||
}
|
||||
else if (isOwnProperty && !isSetterWithoutGetter) {
|
||||
members[rightProp.name] = rightProp;
|
||||
}
|
||||
}
|
||||
for (const leftProp of getPropertiesOfType(left)) {
|
||||
if (leftProp.flags & SymbolFlags.SetAccessor && !(leftProp.flags & SymbolFlags.GetAccessor)
|
||||
|| leftProp.name in skippedPrivateMembers) {
|
||||
continue;
|
||||
}
|
||||
if (leftProp.name in members) {
|
||||
const rightProp = members[leftProp.name];
|
||||
const rightType = getTypeOfSymbol(rightProp);
|
||||
if (maybeTypeOfKind(rightType, TypeFlags.Undefined) || rightProp.flags & SymbolFlags.Optional) {
|
||||
const declarations: Declaration[] = concatenate(leftProp.declarations, rightProp.declarations);
|
||||
const flags = SymbolFlags.Property | SymbolFlags.Transient | (leftProp.flags & SymbolFlags.Optional);
|
||||
const result = <TransientSymbol>createSymbol(flags, leftProp.name);
|
||||
result.type = getUnionType([getTypeOfSymbol(leftProp), getTypeWithFacts(rightType, TypeFacts.NEUndefined)]);
|
||||
result.leftSpread = leftProp;
|
||||
result.rightSpread = rightProp;
|
||||
result.declarations = declarations;
|
||||
result.isReadonly = isReadonlySymbol(leftProp) || isReadonlySymbol(rightProp);
|
||||
members[leftProp.name] = result;
|
||||
}
|
||||
}
|
||||
else {
|
||||
members[leftProp.name] = leftProp;
|
||||
}
|
||||
}
|
||||
return createAnonymousType(undefined, members, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo);
|
||||
}
|
||||
|
||||
function createLiteralType(flags: TypeFlags, text: string) {
|
||||
const type = <LiteralType>createType(flags);
|
||||
type.text = text;
|
||||
@@ -8772,7 +8885,7 @@ namespace ts {
|
||||
unknownType;
|
||||
}
|
||||
|
||||
function getTypeOfDestructuredSpreadElement(type: Type) {
|
||||
function getTypeOfDestructuredSpreadExpression(type: Type) {
|
||||
return createArrayType(checkIteratedTypeOrElementType(type, /*errorNode*/ undefined, /*allowStringInput*/ false) || unknownType);
|
||||
}
|
||||
|
||||
@@ -8786,8 +8899,8 @@ namespace ts {
|
||||
return getTypeOfDestructuredArrayElement(getAssignedType(node), indexOf(node.elements, element));
|
||||
}
|
||||
|
||||
function getAssignedTypeOfSpreadElement(node: SpreadElementExpression): Type {
|
||||
return getTypeOfDestructuredSpreadElement(getAssignedType(<ArrayLiteralExpression>node.parent));
|
||||
function getAssignedTypeOfSpreadExpression(node: SpreadElement): Type {
|
||||
return getTypeOfDestructuredSpreadExpression(getAssignedType(<ArrayLiteralExpression>node.parent));
|
||||
}
|
||||
|
||||
function getAssignedTypeOfPropertyAssignment(node: PropertyAssignment | ShorthandPropertyAssignment): Type {
|
||||
@@ -8811,8 +8924,8 @@ namespace ts {
|
||||
return undefinedType;
|
||||
case SyntaxKind.ArrayLiteralExpression:
|
||||
return getAssignedTypeOfArrayLiteralElement(<ArrayLiteralExpression>parent, node);
|
||||
case SyntaxKind.SpreadElementExpression:
|
||||
return getAssignedTypeOfSpreadElement(<SpreadElementExpression>parent);
|
||||
case SyntaxKind.SpreadElement:
|
||||
return getAssignedTypeOfSpreadExpression(<SpreadElement>parent);
|
||||
case SyntaxKind.PropertyAssignment:
|
||||
return getAssignedTypeOfPropertyAssignment(<PropertyAssignment>parent);
|
||||
case SyntaxKind.ShorthandPropertyAssignment:
|
||||
@@ -8828,7 +8941,7 @@ namespace ts {
|
||||
getTypeOfDestructuredProperty(parentType, node.propertyName || <Identifier>node.name) :
|
||||
!node.dotDotDotToken ?
|
||||
getTypeOfDestructuredArrayElement(parentType, indexOf(pattern.elements, node)) :
|
||||
getTypeOfDestructuredSpreadElement(parentType);
|
||||
getTypeOfDestructuredSpreadExpression(parentType);
|
||||
return getTypeWithDefault(type, node.initializer);
|
||||
}
|
||||
|
||||
@@ -10843,7 +10956,7 @@ namespace ts {
|
||||
return mapper && mapper.context;
|
||||
}
|
||||
|
||||
function checkSpreadElementExpression(node: SpreadElementExpression, contextualMapper?: TypeMapper): Type {
|
||||
function checkSpreadExpression(node: SpreadElement, contextualMapper?: TypeMapper): Type {
|
||||
// It is usually not safe to call checkExpressionCached if we can be contextually typing.
|
||||
// You can tell that we are contextually typing because of the contextualMapper parameter.
|
||||
// While it is true that a spread element can have a contextual type, it does not do anything
|
||||
@@ -10865,7 +10978,7 @@ namespace ts {
|
||||
const elementTypes: Type[] = [];
|
||||
const inDestructuringPattern = isAssignmentTarget(node);
|
||||
for (const e of elements) {
|
||||
if (inDestructuringPattern && e.kind === SyntaxKind.SpreadElementExpression) {
|
||||
if (inDestructuringPattern && e.kind === SyntaxKind.SpreadElement) {
|
||||
// Given the following situation:
|
||||
// var c: {};
|
||||
// [...c] = ["", 0];
|
||||
@@ -10878,7 +10991,7 @@ namespace ts {
|
||||
// get the contextual element type from it. So we do something similar to
|
||||
// getContextualTypeForElementExpression, which will crucially not error
|
||||
// if there is no index type / iterated type.
|
||||
const restArrayType = checkExpression((<SpreadElementExpression>e).expression, contextualMapper);
|
||||
const restArrayType = checkExpression((<SpreadElement>e).expression, contextualMapper);
|
||||
const restElementType = getIndexTypeOfType(restArrayType, IndexKind.Number) ||
|
||||
(languageVersion >= ScriptTarget.ES2015 ? getElementTypeOfIterable(restArrayType, /*errorNode*/ undefined) : undefined);
|
||||
if (restElementType) {
|
||||
@@ -10889,7 +11002,7 @@ namespace ts {
|
||||
const type = checkExpressionForMutableLocation(e, contextualMapper);
|
||||
elementTypes.push(type);
|
||||
}
|
||||
hasSpreadElement = hasSpreadElement || e.kind === SyntaxKind.SpreadElementExpression;
|
||||
hasSpreadElement = hasSpreadElement || e.kind === SyntaxKind.SpreadElement;
|
||||
}
|
||||
if (!hasSpreadElement) {
|
||||
// If array literal is actually a destructuring pattern, mark it as an implied type. We do this such
|
||||
@@ -11006,8 +11119,11 @@ namespace ts {
|
||||
// Grammar checking
|
||||
checkGrammarObjectLiteralExpression(node, inDestructuringPattern);
|
||||
|
||||
const propertiesTable = createMap<Symbol>();
|
||||
const propertiesArray: Symbol[] = [];
|
||||
let propertiesTable = createMap<Symbol>();
|
||||
let propertiesArray: Symbol[] = [];
|
||||
let spread: Type = emptyObjectType;
|
||||
let propagatedFlags: TypeFlags = 0;
|
||||
|
||||
const contextualType = getApparentTypeOfContextualType(node);
|
||||
const contextualTypeHasPattern = contextualType && contextualType.pattern &&
|
||||
(contextualType.pattern.kind === SyntaxKind.ObjectBindingPattern || contextualType.pattern.kind === SyntaxKind.ObjectLiteralExpression);
|
||||
@@ -11032,6 +11148,7 @@ namespace ts {
|
||||
Debug.assert(memberDecl.kind === SyntaxKind.ShorthandPropertyAssignment);
|
||||
type = checkExpressionForMutableLocation((<ShorthandPropertyAssignment>memberDecl).name, contextualMapper);
|
||||
}
|
||||
|
||||
typeFlags |= type.flags;
|
||||
const prop = <TransientSymbol>createSymbol(SymbolFlags.Property | SymbolFlags.Transient | member.flags, member.name);
|
||||
if (inDestructuringPattern) {
|
||||
@@ -11069,6 +11186,23 @@ namespace ts {
|
||||
prop.target = member;
|
||||
member = prop;
|
||||
}
|
||||
else if (memberDecl.kind === SyntaxKind.SpreadAssignment) {
|
||||
if (propertiesArray.length > 0) {
|
||||
spread = getSpreadType(spread, createObjectLiteralType(), /*isFromObjectLiteral*/ true);
|
||||
propertiesArray = [];
|
||||
propertiesTable = createMap<Symbol>();
|
||||
hasComputedStringProperty = false;
|
||||
hasComputedNumberProperty = false;
|
||||
typeFlags = 0;
|
||||
}
|
||||
const type = checkExpression((memberDecl as SpreadAssignment).expression);
|
||||
if (!(type.flags & (TypeFlags.Object | TypeFlags.Any))) {
|
||||
error(memberDecl, Diagnostics.Spread_types_may_only_be_created_from_object_types);
|
||||
return unknownType;
|
||||
}
|
||||
spread = getSpreadType(spread, type, /*isFromObjectLiteral*/ false);
|
||||
continue;
|
||||
}
|
||||
else {
|
||||
// TypeScript 1.0 spec (April 2014)
|
||||
// A get accessor declaration is processed in the same manner as
|
||||
@@ -11108,20 +11242,36 @@ namespace ts {
|
||||
}
|
||||
}
|
||||
|
||||
const stringIndexInfo = hasComputedStringProperty ? getObjectLiteralIndexInfo(node, propertiesArray, IndexKind.String) : undefined;
|
||||
const numberIndexInfo = hasComputedNumberProperty ? getObjectLiteralIndexInfo(node, propertiesArray, IndexKind.Number) : undefined;
|
||||
const result = createAnonymousType(node.symbol, propertiesTable, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo);
|
||||
const freshObjectLiteralFlag = compilerOptions.suppressExcessPropertyErrors ? 0 : TypeFlags.FreshLiteral;
|
||||
result.flags |= TypeFlags.ContainsObjectLiteral | freshObjectLiteralFlag | (typeFlags & TypeFlags.PropagatingFlags);
|
||||
result.objectFlags |= ObjectFlags.ObjectLiteral;
|
||||
if (patternWithComputedProperties) {
|
||||
result.objectFlags |= ObjectFlags.ObjectLiteralPatternWithComputedProperties;
|
||||
if (spread !== emptyObjectType) {
|
||||
if (propertiesArray.length > 0) {
|
||||
spread = getSpreadType(spread, createObjectLiteralType(), /*isFromObjectLiteral*/ true);
|
||||
}
|
||||
spread.flags |= propagatedFlags;
|
||||
spread.symbol = node.symbol;
|
||||
return spread;
|
||||
}
|
||||
if (inDestructuringPattern) {
|
||||
result.pattern = node;
|
||||
|
||||
return createObjectLiteralType();
|
||||
|
||||
function createObjectLiteralType() {
|
||||
const stringIndexInfo = hasComputedStringProperty ? getObjectLiteralIndexInfo(node, propertiesArray, IndexKind.String) : undefined;
|
||||
const numberIndexInfo = hasComputedNumberProperty ? getObjectLiteralIndexInfo(node, propertiesArray, IndexKind.Number) : undefined;
|
||||
const result = createAnonymousType(node.symbol, propertiesTable, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo);
|
||||
const freshObjectLiteralFlag = compilerOptions.suppressExcessPropertyErrors ? 0 : TypeFlags.FreshLiteral;
|
||||
result.flags |= TypeFlags.ContainsObjectLiteral | freshObjectLiteralFlag | (typeFlags & TypeFlags.PropagatingFlags);
|
||||
result.objectFlags |= ObjectFlags.ObjectLiteral;
|
||||
if (patternWithComputedProperties) {
|
||||
result.objectFlags |= ObjectFlags.ObjectLiteralPatternWithComputedProperties;
|
||||
}
|
||||
if (inDestructuringPattern) {
|
||||
result.pattern = node;
|
||||
}
|
||||
if (!(result.flags & TypeFlags.Nullable)) {
|
||||
propagatedFlags |= (result.flags & TypeFlags.PropagatingFlags);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
function checkJsxSelfClosingElement(node: JsxSelfClosingElement) {
|
||||
checkJsxOpeningLikeElement(node);
|
||||
@@ -11538,10 +11688,10 @@ namespace ts {
|
||||
function checkJsxOpeningLikeElement(node: JsxOpeningLikeElement) {
|
||||
checkGrammarJsxElement(node);
|
||||
checkJsxPreconditions(node);
|
||||
// The reactNamespace symbol should be marked as 'used' so we don't incorrectly elide its import. And if there
|
||||
// is no reactNamespace symbol in scope when targeting React emit, we should issue an error.
|
||||
// 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 = compilerOptions.jsx === JsxEmit.React ? Diagnostics.Cannot_find_name_0 : undefined;
|
||||
const reactNamespace = compilerOptions.reactNamespace ? compilerOptions.reactNamespace : "React";
|
||||
const reactNamespace = getJsxNamespace();
|
||||
const reactSym = resolveName(node.tagName, reactNamespace, SymbolFlags.Value, reactRefErr, reactNamespace);
|
||||
if (reactSym) {
|
||||
// Mark local symbol as referenced here because it might not have been marked
|
||||
@@ -12020,7 +12170,7 @@ namespace ts {
|
||||
function getSpreadArgumentIndex(args: Expression[]): number {
|
||||
for (let i = 0; i < args.length; i++) {
|
||||
const arg = args[i];
|
||||
if (arg && arg.kind === SyntaxKind.SpreadElementExpression) {
|
||||
if (arg && arg.kind === SyntaxKind.SpreadElement) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
@@ -13986,7 +14136,7 @@ namespace ts {
|
||||
error(name, Diagnostics.Type_0_has_no_property_1_and_no_string_index_signature, typeToString(objectLiteralType), declarationNameToString(name));
|
||||
}
|
||||
}
|
||||
else {
|
||||
else if (property.kind !== SyntaxKind.SpreadAssignment) {
|
||||
error(property, Diagnostics.Property_assignment_expected);
|
||||
}
|
||||
}
|
||||
@@ -14008,7 +14158,7 @@ namespace ts {
|
||||
const elements = node.elements;
|
||||
const element = elements[elementIndex];
|
||||
if (element.kind !== SyntaxKind.OmittedExpression) {
|
||||
if (element.kind !== SyntaxKind.SpreadElementExpression) {
|
||||
if (element.kind !== SyntaxKind.SpreadElement) {
|
||||
const propName = "" + elementIndex;
|
||||
const type = isTypeAny(sourceType)
|
||||
? sourceType
|
||||
@@ -14032,10 +14182,10 @@ namespace ts {
|
||||
}
|
||||
else {
|
||||
if (elementIndex < elements.length - 1) {
|
||||
error(element, Diagnostics.A_rest_element_must_be_last_in_an_array_destructuring_pattern);
|
||||
error(element, Diagnostics.A_rest_element_must_be_last_in_a_destructuring_pattern);
|
||||
}
|
||||
else {
|
||||
const restExpression = (<SpreadElementExpression>element).expression;
|
||||
const restExpression = (<SpreadElement>element).expression;
|
||||
if (restExpression.kind === SyntaxKind.BinaryExpression && (<BinaryExpression>restExpression).operatorToken.kind === SyntaxKind.EqualsToken) {
|
||||
error((<BinaryExpression>restExpression).operatorToken, Diagnostics.A_rest_element_cannot_have_an_initializer);
|
||||
}
|
||||
@@ -14668,8 +14818,8 @@ namespace ts {
|
||||
return checkBinaryExpression(<BinaryExpression>node, contextualMapper);
|
||||
case SyntaxKind.ConditionalExpression:
|
||||
return checkConditionalExpression(<ConditionalExpression>node, contextualMapper);
|
||||
case SyntaxKind.SpreadElementExpression:
|
||||
return checkSpreadElementExpression(<SpreadElementExpression>node, contextualMapper);
|
||||
case SyntaxKind.SpreadElement:
|
||||
return checkSpreadExpression(<SpreadElement>node, contextualMapper);
|
||||
case SyntaxKind.OmittedExpression:
|
||||
return undefinedWideningType;
|
||||
case SyntaxKind.YieldExpression:
|
||||
@@ -17190,6 +17340,7 @@ namespace ts {
|
||||
let hasDuplicateDefaultClause = false;
|
||||
|
||||
const expressionType = checkExpression(node.expression);
|
||||
const expressionIsLiteral = isLiteralType(expressionType);
|
||||
forEach(node.caseBlock.clauses, clause => {
|
||||
// Grammar check for duplicate default clauses, skip if we already report duplicate default clause
|
||||
if (clause.kind === SyntaxKind.DefaultClause && !hasDuplicateDefaultClause) {
|
||||
@@ -17210,10 +17361,16 @@ namespace ts {
|
||||
// TypeScript 1.0 spec (April 2014): 5.9
|
||||
// In a 'switch' statement, each 'case' expression must be of a type that is comparable
|
||||
// to or from the type of the 'switch' expression.
|
||||
const caseType = checkExpression(caseClause.expression);
|
||||
if (!isTypeEqualityComparableTo(expressionType, caseType)) {
|
||||
let caseType = checkExpression(caseClause.expression);
|
||||
const caseIsLiteral = isLiteralType(caseType);
|
||||
let comparedExpressionType = expressionType;
|
||||
if (!caseIsLiteral || !expressionIsLiteral) {
|
||||
caseType = caseIsLiteral ? getBaseTypeOfLiteralType(caseType) : caseType;
|
||||
comparedExpressionType = getBaseTypeOfLiteralType(expressionType);
|
||||
}
|
||||
if (!isTypeEqualityComparableTo(comparedExpressionType, caseType)) {
|
||||
// expressionType is not comparable to caseType, try the reversed check and report errors if it fails
|
||||
checkTypeComparableTo(caseType, expressionType, caseClause.expression, /*headMessage*/ undefined);
|
||||
checkTypeComparableTo(caseType, comparedExpressionType, caseClause.expression, /*headMessage*/ undefined);
|
||||
}
|
||||
}
|
||||
forEach(clause.statements, checkSourceElement);
|
||||
@@ -19320,6 +19477,10 @@ namespace ts {
|
||||
return symbols;
|
||||
}
|
||||
else if (symbol.flags & SymbolFlags.Transient) {
|
||||
if ((symbol as SymbolLinks).leftSpread) {
|
||||
const links = symbol as SymbolLinks;
|
||||
return [links.leftSpread, links.rightSpread];
|
||||
}
|
||||
let target: Symbol;
|
||||
let next = symbol;
|
||||
while (next = getSymbolLinks(next).target) {
|
||||
@@ -19808,7 +19969,8 @@ namespace ts {
|
||||
getTypeReferenceDirectivesForEntityName,
|
||||
getTypeReferenceDirectivesForSymbol,
|
||||
isLiteralConstDeclaration,
|
||||
writeLiteralConstValue
|
||||
writeLiteralConstValue,
|
||||
getJsxFactoryEntity: () => _jsxFactoryEntity
|
||||
};
|
||||
|
||||
// defined here to avoid outer scope pollution
|
||||
@@ -20020,7 +20182,7 @@ namespace ts {
|
||||
if (requestedExternalEmitHelpers & NodeFlags.HasClassExtends && languageVersion < ScriptTarget.ES2015) {
|
||||
verifyHelperSymbol(exports, "__extends", SymbolFlags.Value);
|
||||
}
|
||||
if (requestedExternalEmitHelpers & NodeFlags.HasJsxSpreadAttributes && compilerOptions.jsx !== JsxEmit.Preserve) {
|
||||
if (requestedExternalEmitHelpers & NodeFlags.HasSpreadAttribute && compilerOptions.jsx !== JsxEmit.Preserve) {
|
||||
verifyHelperSymbol(exports, "__assign", SymbolFlags.Value);
|
||||
}
|
||||
if (requestedExternalEmitHelpers & NodeFlags.HasDecorators) {
|
||||
@@ -20583,7 +20745,6 @@ namespace ts {
|
||||
checkGrammarHeritageClause(heritageClause);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -20631,6 +20792,9 @@ namespace ts {
|
||||
const GetOrSetAccessor = GetAccessor | SetAccessor;
|
||||
|
||||
for (const prop of node.properties) {
|
||||
if (prop.kind === SyntaxKind.SpreadAssignment) {
|
||||
continue;
|
||||
}
|
||||
const name = prop.name;
|
||||
if (name.kind === SyntaxKind.ComputedPropertyName) {
|
||||
// If the name is not a ComputedPropertyName, the grammar checking will skip it
|
||||
@@ -20934,7 +21098,7 @@ namespace ts {
|
||||
if (node.dotDotDotToken) {
|
||||
const elements = (<BindingPattern>node.parent).elements;
|
||||
if (node !== lastOrUndefined(elements)) {
|
||||
return grammarErrorOnNode(node, Diagnostics.A_rest_element_must_be_last_in_an_array_destructuring_pattern);
|
||||
return grammarErrorOnNode(node, Diagnostics.A_rest_element_must_be_last_in_a_destructuring_pattern);
|
||||
}
|
||||
|
||||
if (node.name.kind === SyntaxKind.ArrayBindingPattern || node.name.kind === SyntaxKind.ObjectBindingPattern) {
|
||||
@@ -20942,7 +21106,7 @@ namespace ts {
|
||||
}
|
||||
|
||||
if (node.initializer) {
|
||||
// Error on equals token which immediate precedes the initializer
|
||||
// Error on equals token which immediately precedes the initializer
|
||||
return grammarErrorAtPos(getSourceFileOfNode(node), node.initializer.pos - 1, 1, Diagnostics.A_rest_element_cannot_have_an_initializer);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,6 +77,11 @@ namespace ts {
|
||||
type: "string",
|
||||
description: Diagnostics.Specify_the_object_invoked_for_createElement_and_spread_when_targeting_react_JSX_emit
|
||||
},
|
||||
{
|
||||
name: "jsxFactory",
|
||||
type: "string",
|
||||
description: Diagnostics.Specify_the_JSX_factory_function_to_use_when_targeting_react_JSX_emit_e_g_React_createElement_or_h
|
||||
},
|
||||
{
|
||||
name: "listFiles",
|
||||
type: "boolean",
|
||||
@@ -265,6 +270,7 @@ namespace ts {
|
||||
"es2015": ScriptTarget.ES2015,
|
||||
"es2016": ScriptTarget.ES2016,
|
||||
"es2017": ScriptTarget.ES2017,
|
||||
"esnext": ScriptTarget.ESNext,
|
||||
}),
|
||||
description: Diagnostics.Specify_ECMAScript_target_version_Colon_ES3_default_ES5_or_ES2015,
|
||||
paramType: Diagnostics.VERSION,
|
||||
|
||||
@@ -1455,7 +1455,7 @@
|
||||
"category": "Error",
|
||||
"code": 2461
|
||||
},
|
||||
"A rest element must be last in an array destructuring pattern": {
|
||||
"A rest element must be last in a destructuring pattern": {
|
||||
"category": "Error",
|
||||
"code": 2462
|
||||
},
|
||||
@@ -1983,6 +1983,14 @@
|
||||
"category": "Error",
|
||||
"code": 2697
|
||||
},
|
||||
"Spread types may only be created from object types.": {
|
||||
"category": "Error",
|
||||
"code": 2698
|
||||
},
|
||||
"Rest types may only be created from object types.": {
|
||||
"category": "Error",
|
||||
"code": 2700
|
||||
},
|
||||
|
||||
"Import declaration '{0}' is using private name '{1}'.": {
|
||||
"category": "Error",
|
||||
@@ -2381,6 +2389,10 @@
|
||||
"category": "Error",
|
||||
"code": 5066
|
||||
},
|
||||
"Invalid value for 'jsxFactory'. '{0}' is not a valid identifier or qualified-name.": {
|
||||
"category": "Error",
|
||||
"code": 5067
|
||||
},
|
||||
"Concatenate and emit output to single file.": {
|
||||
"category": "Message",
|
||||
"code": 6001
|
||||
@@ -2897,6 +2909,10 @@
|
||||
"category": "Message",
|
||||
"code": 6145
|
||||
},
|
||||
"Specify the JSX factory function to use when targeting 'react' JSX emit, e.g. 'React.createElement' or 'h'.": {
|
||||
"category": "Message",
|
||||
"code": 6146
|
||||
},
|
||||
"Variable '{0}' implicitly has an '{1}' type.": {
|
||||
"category": "Error",
|
||||
"code": 7005
|
||||
|
||||
+30
-4
@@ -42,6 +42,14 @@ var __assign = (this && this.__assign) || Object.assign || function(t) {
|
||||
return t;
|
||||
};`;
|
||||
|
||||
const restHelper = `
|
||||
var __rest = (this && this.__rest) || function (s, e) {
|
||||
var t = {};
|
||||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && !e.indexOf(p))
|
||||
t[p] = s[p];
|
||||
return t;
|
||||
};`;
|
||||
|
||||
// emit output for the __decorate helper function
|
||||
const decorateHelper = `
|
||||
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
||||
@@ -226,6 +234,7 @@ const _super = (function (geti, seti) {
|
||||
let currentFileIdentifiers: Map<string>;
|
||||
let extendsEmitted: boolean;
|
||||
let assignEmitted: boolean;
|
||||
let restEmitted: boolean;
|
||||
let decorateEmitted: boolean;
|
||||
let paramEmitted: boolean;
|
||||
let awaiterEmitted: boolean;
|
||||
@@ -732,6 +741,8 @@ const _super = (function (geti, seti) {
|
||||
return emitPropertyAssignment(<PropertyAssignment>node);
|
||||
case SyntaxKind.ShorthandPropertyAssignment:
|
||||
return emitShorthandPropertyAssignment(<ShorthandPropertyAssignment>node);
|
||||
case SyntaxKind.SpreadAssignment:
|
||||
return emitSpreadAssignment(node as SpreadAssignment);
|
||||
|
||||
// Enum
|
||||
case SyntaxKind.EnumMember:
|
||||
@@ -822,8 +833,8 @@ const _super = (function (geti, seti) {
|
||||
return emitTemplateExpression(<TemplateExpression>node);
|
||||
case SyntaxKind.YieldExpression:
|
||||
return emitYieldExpression(<YieldExpression>node);
|
||||
case SyntaxKind.SpreadElementExpression:
|
||||
return emitSpreadElementExpression(<SpreadElementExpression>node);
|
||||
case SyntaxKind.SpreadElement:
|
||||
return emitSpreadExpression(<SpreadElement>node);
|
||||
case SyntaxKind.ClassExpression:
|
||||
return emitClassExpression(<ClassExpression>node);
|
||||
case SyntaxKind.OmittedExpression:
|
||||
@@ -1374,7 +1385,7 @@ const _super = (function (geti, seti) {
|
||||
emitExpressionWithPrefix(" ", node.expression);
|
||||
}
|
||||
|
||||
function emitSpreadElementExpression(node: SpreadElementExpression) {
|
||||
function emitSpreadExpression(node: SpreadElement) {
|
||||
write("...");
|
||||
emitExpression(node.expression);
|
||||
}
|
||||
@@ -2102,6 +2113,13 @@ const _super = (function (geti, seti) {
|
||||
}
|
||||
}
|
||||
|
||||
function emitSpreadAssignment(node: SpreadAssignment) {
|
||||
if (node.expression) {
|
||||
write("...");
|
||||
emitExpression(node.expression);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Enum
|
||||
//
|
||||
@@ -2205,11 +2223,19 @@ const _super = (function (geti, seti) {
|
||||
helpersEmitted = true;
|
||||
}
|
||||
|
||||
if (compilerOptions.jsx !== JsxEmit.Preserve && !assignEmitted && (node.flags & NodeFlags.HasJsxSpreadAttributes)) {
|
||||
if ((languageVersion < ScriptTarget.ESNext || currentSourceFile.scriptKind === ScriptKind.JSX || currentSourceFile.scriptKind === ScriptKind.TSX) &&
|
||||
compilerOptions.jsx !== JsxEmit.Preserve &&
|
||||
!assignEmitted &&
|
||||
node.flags & NodeFlags.HasSpreadAttribute) {
|
||||
writeLines(assignHelper);
|
||||
assignEmitted = true;
|
||||
}
|
||||
|
||||
if (languageVersion < ScriptTarget.ESNext && !restEmitted && node.flags & NodeFlags.HasRestAttribute) {
|
||||
writeLines(restHelper);
|
||||
restEmitted = true;
|
||||
}
|
||||
|
||||
if (!decorateEmitted && node.flags & NodeFlags.HasDecorators) {
|
||||
writeLines(decorateHelper);
|
||||
if (compilerOptions.emitDecoratorMetadata) {
|
||||
|
||||
+580
-9
@@ -692,12 +692,12 @@ namespace ts {
|
||||
}
|
||||
|
||||
export function createSpread(expression: Expression, location?: TextRange) {
|
||||
const node = <SpreadElementExpression>createNode(SyntaxKind.SpreadElementExpression, location);
|
||||
const node = <SpreadElement>createNode(SyntaxKind.SpreadElement, location);
|
||||
node.expression = parenthesizeExpressionForList(expression);
|
||||
return node;
|
||||
}
|
||||
|
||||
export function updateSpread(node: SpreadElementExpression, expression: Expression) {
|
||||
export function updateSpread(node: SpreadElement, expression: Expression) {
|
||||
if (node.expression !== expression) {
|
||||
return updateNode(createSpread(expression, node), node);
|
||||
}
|
||||
@@ -1399,14 +1399,27 @@ namespace ts {
|
||||
return node;
|
||||
}
|
||||
|
||||
export function updateShorthandPropertyAssignment(node: ShorthandPropertyAssignment, name: Identifier, objectAssignmentInitializer: Expression) {
|
||||
export function createSpreadAssignment(expression: Expression, location?: TextRange) {
|
||||
const node = <SpreadAssignment>createNode(SyntaxKind.SpreadAssignment, location);
|
||||
node.expression = expression !== undefined ? parenthesizeExpressionForList(expression) : undefined;
|
||||
return node;
|
||||
}
|
||||
|
||||
export function updateShorthandPropertyAssignment(node: ShorthandPropertyAssignment, name: Identifier, objectAssignmentInitializer: Expression) {
|
||||
if (node.name !== name || node.objectAssignmentInitializer !== objectAssignmentInitializer) {
|
||||
return updateNode(createShorthandPropertyAssignment(name, objectAssignmentInitializer, node), node);
|
||||
}
|
||||
return node;
|
||||
}
|
||||
|
||||
// Top-level nodes
|
||||
export function updateSpreadAssignment(node: SpreadAssignment, expression: Expression) {
|
||||
if (node.expression !== expression) {
|
||||
return updateNode(createSpreadAssignment(expression, node), node);
|
||||
}
|
||||
return node;
|
||||
}
|
||||
|
||||
// Top-level nodes
|
||||
|
||||
export function updateSourceFileNode(node: SourceFile, statements: Statement[]) {
|
||||
if (node.statements !== statements) {
|
||||
@@ -1628,7 +1641,34 @@ namespace ts {
|
||||
return react;
|
||||
}
|
||||
|
||||
export function createReactCreateElement(reactNamespace: string, tagName: Expression, props: Expression, children: Expression[], parentElement: JsxOpeningLikeElement, location: TextRange): LeftHandSideExpression {
|
||||
function createJsxFactoryExpressionFromEntityName(jsxFactory: EntityName, parent: JsxOpeningLikeElement): Expression {
|
||||
if (isQualifiedName(jsxFactory)) {
|
||||
return createPropertyAccess(
|
||||
createJsxFactoryExpressionFromEntityName(
|
||||
jsxFactory.left,
|
||||
parent
|
||||
),
|
||||
setEmitFlags(
|
||||
getMutableClone(jsxFactory.right),
|
||||
EmitFlags.NoSourceMap
|
||||
)
|
||||
);
|
||||
}
|
||||
else {
|
||||
return createReactNamespace(jsxFactory.text, parent);
|
||||
}
|
||||
}
|
||||
|
||||
function createJsxFactoryExpression(jsxFactoryEntity: EntityName, reactNamespace: string, parent: JsxOpeningLikeElement): Expression {
|
||||
return jsxFactoryEntity ?
|
||||
createJsxFactoryExpressionFromEntityName(jsxFactoryEntity, parent) :
|
||||
createPropertyAccess(
|
||||
createReactNamespace(reactNamespace, parent),
|
||||
"createElement"
|
||||
);
|
||||
}
|
||||
|
||||
export function createExpressionForJsxElement(jsxFactoryEntity: EntityName, reactNamespace: string, tagName: Expression, props: Expression, children: Expression[], parentElement: JsxOpeningLikeElement, location: TextRange): LeftHandSideExpression {
|
||||
const argumentsList = [tagName];
|
||||
if (props) {
|
||||
argumentsList.push(props);
|
||||
@@ -1651,10 +1691,7 @@ namespace ts {
|
||||
}
|
||||
|
||||
return createCall(
|
||||
createPropertyAccess(
|
||||
createReactNamespace(reactNamespace, parentElement),
|
||||
"createElement"
|
||||
),
|
||||
createJsxFactoryExpression(jsxFactoryEntity, reactNamespace, parentElement),
|
||||
/*typeArguments*/ undefined,
|
||||
argumentsList,
|
||||
location
|
||||
@@ -3055,4 +3092,538 @@ namespace ts {
|
||||
function tryGetModuleNameFromDeclaration(declaration: ImportEqualsDeclaration | ImportDeclaration | ExportDeclaration, host: EmitHost, resolver: EmitResolver, compilerOptions: CompilerOptions) {
|
||||
return tryGetModuleNameFromFile(resolver.getExternalModuleFileFromDeclaration(declaration), host, compilerOptions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Transforms the body of a function-like node.
|
||||
*
|
||||
* @param node A function-like node.
|
||||
*/
|
||||
export function transformFunctionBody(node: FunctionLikeDeclaration,
|
||||
visitor: (node: Node) => VisitResult<Node>,
|
||||
currentSourceFile: SourceFile,
|
||||
context: TransformationContext,
|
||||
enableSubstitutionsForCapturedThis: () => void,
|
||||
convertObjectRest?: boolean) {
|
||||
let multiLine = false; // indicates whether the block *must* be emitted as multiple lines
|
||||
let singleLine = false; // indicates whether the block *may* be emitted as a single line
|
||||
let statementsLocation: TextRange;
|
||||
let closeBraceLocation: TextRange;
|
||||
|
||||
const statements: Statement[] = [];
|
||||
const body = node.body;
|
||||
let statementOffset: number;
|
||||
|
||||
context.startLexicalEnvironment();
|
||||
if (isBlock(body)) {
|
||||
// ensureUseStrict is false because no new prologue-directive should be added.
|
||||
// addPrologueDirectives will simply put already-existing directives at the beginning of the target statement-array
|
||||
statementOffset = addPrologueDirectives(statements, body.statements, /*ensureUseStrict*/ false, visitor);
|
||||
}
|
||||
|
||||
addCaptureThisForNodeIfNeeded(statements, node, enableSubstitutionsForCapturedThis);
|
||||
addDefaultValueAssignmentsIfNeeded(statements, node, visitor, convertObjectRest);
|
||||
addRestParameterIfNeeded(statements, node, /*inConstructorWithSynthesizedSuper*/ false);
|
||||
|
||||
// If we added any generated statements, this must be a multi-line block.
|
||||
if (!multiLine && statements.length > 0) {
|
||||
multiLine = true;
|
||||
}
|
||||
|
||||
if (isBlock(body)) {
|
||||
statementsLocation = body.statements;
|
||||
addRange(statements, visitNodes(body.statements, visitor, isStatement, statementOffset));
|
||||
|
||||
// If the original body was a multi-line block, this must be a multi-line block.
|
||||
if (!multiLine && body.multiLine) {
|
||||
multiLine = true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
Debug.assert(node.kind === SyntaxKind.ArrowFunction);
|
||||
|
||||
// To align with the old emitter, we use a synthetic end position on the location
|
||||
// for the statement list we synthesize when we down-level an arrow function with
|
||||
// an expression function body. This prevents both comments and source maps from
|
||||
// being emitted for the end position only.
|
||||
statementsLocation = moveRangeEnd(body, -1);
|
||||
|
||||
const equalsGreaterThanToken = (<ArrowFunction>node).equalsGreaterThanToken;
|
||||
if (!nodeIsSynthesized(equalsGreaterThanToken) && !nodeIsSynthesized(body)) {
|
||||
if (rangeEndIsOnSameLineAsRangeStart(equalsGreaterThanToken, body, currentSourceFile)) {
|
||||
singleLine = true;
|
||||
}
|
||||
else {
|
||||
multiLine = true;
|
||||
}
|
||||
}
|
||||
|
||||
const expression = visitNode(body, visitor, isExpression);
|
||||
const returnStatement = createReturn(expression, /*location*/ body);
|
||||
setEmitFlags(returnStatement, EmitFlags.NoTokenSourceMaps | EmitFlags.NoTrailingSourceMap | EmitFlags.NoTrailingComments);
|
||||
statements.push(returnStatement);
|
||||
|
||||
// To align with the source map emit for the old emitter, we set a custom
|
||||
// source map location for the close brace.
|
||||
closeBraceLocation = body;
|
||||
}
|
||||
|
||||
const lexicalEnvironment = context.endLexicalEnvironment();
|
||||
addRange(statements, lexicalEnvironment);
|
||||
|
||||
// If we added any final generated statements, this must be a multi-line block
|
||||
if (!multiLine && lexicalEnvironment && lexicalEnvironment.length) {
|
||||
multiLine = true;
|
||||
}
|
||||
|
||||
const block = createBlock(createNodeArray(statements, statementsLocation), node.body, multiLine);
|
||||
if (!multiLine && singleLine) {
|
||||
setEmitFlags(block, EmitFlags.SingleLine);
|
||||
}
|
||||
|
||||
if (closeBraceLocation) {
|
||||
setTokenSourceMapRange(block, SyntaxKind.CloseBraceToken, closeBraceLocation);
|
||||
}
|
||||
|
||||
setOriginalNode(block, node.body);
|
||||
return block;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a statement to capture the `this` of a function declaration if it is needed.
|
||||
*
|
||||
* @param statements The statements for the new function body.
|
||||
* @param node A node.
|
||||
*/
|
||||
export function addCaptureThisForNodeIfNeeded(statements: Statement[], node: Node, enableSubstitutionsForCapturedThis: () => void): void {
|
||||
if (node.transformFlags & TransformFlags.ContainsCapturedLexicalThis && node.kind !== SyntaxKind.ArrowFunction) {
|
||||
captureThisForNode(statements, node, createThis(), enableSubstitutionsForCapturedThis);
|
||||
}
|
||||
}
|
||||
|
||||
export function captureThisForNode(statements: Statement[], node: Node, initializer: Expression | undefined, enableSubstitutionsForCapturedThis?: () => void, originalStatement?: Statement): void {
|
||||
enableSubstitutionsForCapturedThis();
|
||||
const captureThisStatement = createVariableStatement(
|
||||
/*modifiers*/ undefined,
|
||||
createVariableDeclarationList([
|
||||
createVariableDeclaration(
|
||||
"_this",
|
||||
/*type*/ undefined,
|
||||
initializer
|
||||
)
|
||||
]),
|
||||
originalStatement
|
||||
);
|
||||
|
||||
setEmitFlags(captureThisStatement, EmitFlags.NoComments | EmitFlags.CustomPrologue);
|
||||
setSourceMapRange(captureThisStatement, node);
|
||||
statements.push(captureThisStatement);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a value indicating whether we need to add default value assignments for a
|
||||
* function-like node.
|
||||
*
|
||||
* @param node A function-like node.
|
||||
*/
|
||||
function shouldAddDefaultValueAssignments(node: FunctionLikeDeclaration): boolean {
|
||||
return (node.transformFlags & TransformFlags.ContainsDefaultValueAssignments) !== 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds statements to the body of a function-like node if it contains parameters with
|
||||
* binding patterns or initializers.
|
||||
*
|
||||
* @param statements The statements for the new function body.
|
||||
* @param node A function-like node.
|
||||
*/
|
||||
export function addDefaultValueAssignmentsIfNeeded(statements: Statement[],
|
||||
node: FunctionLikeDeclaration,
|
||||
visitor: (node: Node) => VisitResult<Node>,
|
||||
convertObjectRest: boolean): void {
|
||||
if (!shouldAddDefaultValueAssignments(node)) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (const parameter of node.parameters) {
|
||||
const { name, initializer, dotDotDotToken } = parameter;
|
||||
|
||||
// A rest parameter cannot have a binding pattern or an initializer,
|
||||
// so let's just ignore it.
|
||||
if (dotDotDotToken) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isBindingPattern(name)) {
|
||||
addDefaultValueAssignmentForBindingPattern(statements, parameter, name, initializer, visitor, convertObjectRest);
|
||||
}
|
||||
else if (initializer) {
|
||||
addDefaultValueAssignmentForInitializer(statements, parameter, name, initializer, visitor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds statements to the body of a function-like node for parameters with binding patterns
|
||||
*
|
||||
* @param statements The statements for the new function body.
|
||||
* @param parameter The parameter for the function.
|
||||
* @param name The name of the parameter.
|
||||
* @param initializer The initializer for the parameter.
|
||||
*/
|
||||
function addDefaultValueAssignmentForBindingPattern(statements: Statement[],
|
||||
parameter: ParameterDeclaration,
|
||||
name: BindingPattern, initializer: Expression,
|
||||
visitor: (node: Node) => VisitResult<Node>,
|
||||
convertObjectRest: boolean): void {
|
||||
const temp = getGeneratedNameForNode(parameter);
|
||||
|
||||
// In cases where a binding pattern is simply '[]' or '{}',
|
||||
// we usually don't want to emit a var declaration; however, in the presence
|
||||
// of an initializer, we must emit that expression to preserve side effects.
|
||||
if (name.elements.length > 0) {
|
||||
statements.push(
|
||||
setEmitFlags(
|
||||
createVariableStatement(
|
||||
/*modifiers*/ undefined,
|
||||
createVariableDeclarationList(
|
||||
flattenParameterDestructuring(parameter, temp, visitor, convertObjectRest)
|
||||
)
|
||||
),
|
||||
EmitFlags.CustomPrologue
|
||||
)
|
||||
);
|
||||
}
|
||||
else if (initializer) {
|
||||
statements.push(
|
||||
setEmitFlags(
|
||||
createStatement(
|
||||
createAssignment(
|
||||
temp,
|
||||
visitNode(initializer, visitor, isExpression)
|
||||
)
|
||||
),
|
||||
EmitFlags.CustomPrologue
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds statements to the body of a function-like node for parameters with initializers.
|
||||
*
|
||||
* @param statements The statements for the new function body.
|
||||
* @param parameter The parameter for the function.
|
||||
* @param name The name of the parameter.
|
||||
* @param initializer The initializer for the parameter.
|
||||
*/
|
||||
function addDefaultValueAssignmentForInitializer(statements: Statement[],
|
||||
parameter: ParameterDeclaration,
|
||||
name: Identifier,
|
||||
initializer: Expression,
|
||||
visitor: (node: Node) => VisitResult<Node>): void {
|
||||
initializer = visitNode(initializer, visitor, isExpression);
|
||||
const statement = createIf(
|
||||
createStrictEquality(
|
||||
getSynthesizedClone(name),
|
||||
createVoidZero()
|
||||
),
|
||||
setEmitFlags(
|
||||
createBlock([
|
||||
createStatement(
|
||||
createAssignment(
|
||||
setEmitFlags(getMutableClone(name), EmitFlags.NoSourceMap),
|
||||
setEmitFlags(initializer, EmitFlags.NoSourceMap | getEmitFlags(initializer)),
|
||||
/*location*/ parameter
|
||||
)
|
||||
)
|
||||
], /*location*/ parameter),
|
||||
EmitFlags.SingleLine | EmitFlags.NoTrailingSourceMap | EmitFlags.NoTokenSourceMaps
|
||||
),
|
||||
/*elseStatement*/ undefined,
|
||||
/*location*/ parameter
|
||||
);
|
||||
statement.startsOnNewLine = true;
|
||||
setEmitFlags(statement, EmitFlags.NoTokenSourceMaps | EmitFlags.NoTrailingSourceMap | EmitFlags.CustomPrologue);
|
||||
statements.push(statement);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a value indicating whether we need to add statements to handle a rest parameter.
|
||||
*
|
||||
* @param node A ParameterDeclaration node.
|
||||
* @param inConstructorWithSynthesizedSuper A value indicating whether the parameter is
|
||||
* part of a constructor declaration with a
|
||||
* synthesized call to `super`
|
||||
*/
|
||||
function shouldAddRestParameter(node: ParameterDeclaration, inConstructorWithSynthesizedSuper: boolean) {
|
||||
return node && node.dotDotDotToken && node.name.kind === SyntaxKind.Identifier && !inConstructorWithSynthesizedSuper;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds statements to the body of a function-like node if it contains a rest parameter.
|
||||
*
|
||||
* @param statements The statements for the new function body.
|
||||
* @param node A function-like node.
|
||||
* @param inConstructorWithSynthesizedSuper A value indicating whether the parameter is
|
||||
* part of a constructor declaration with a
|
||||
* synthesized call to `super`
|
||||
*/
|
||||
export function addRestParameterIfNeeded(statements: Statement[], node: FunctionLikeDeclaration, inConstructorWithSynthesizedSuper: boolean): void {
|
||||
const parameter = lastOrUndefined(node.parameters);
|
||||
if (!shouldAddRestParameter(parameter, inConstructorWithSynthesizedSuper)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// `declarationName` is the name of the local declaration for the parameter.
|
||||
const declarationName = getMutableClone(<Identifier>parameter.name);
|
||||
setEmitFlags(declarationName, EmitFlags.NoSourceMap);
|
||||
|
||||
// `expressionName` is the name of the parameter used in expressions.
|
||||
const expressionName = getSynthesizedClone(<Identifier>parameter.name);
|
||||
const restIndex = node.parameters.length - 1;
|
||||
const temp = createLoopVariable();
|
||||
|
||||
// var param = [];
|
||||
statements.push(
|
||||
setEmitFlags(
|
||||
createVariableStatement(
|
||||
/*modifiers*/ undefined,
|
||||
createVariableDeclarationList([
|
||||
createVariableDeclaration(
|
||||
declarationName,
|
||||
/*type*/ undefined,
|
||||
createArrayLiteral([])
|
||||
)
|
||||
]),
|
||||
/*location*/ parameter
|
||||
),
|
||||
EmitFlags.CustomPrologue
|
||||
)
|
||||
);
|
||||
|
||||
// for (var _i = restIndex; _i < arguments.length; _i++) {
|
||||
// param[_i - restIndex] = arguments[_i];
|
||||
// }
|
||||
const forStatement = createFor(
|
||||
createVariableDeclarationList([
|
||||
createVariableDeclaration(temp, /*type*/ undefined, createLiteral(restIndex))
|
||||
], /*location*/ parameter),
|
||||
createLessThan(
|
||||
temp,
|
||||
createPropertyAccess(createIdentifier("arguments"), "length"),
|
||||
/*location*/ parameter
|
||||
),
|
||||
createPostfixIncrement(temp, /*location*/ parameter),
|
||||
createBlock([
|
||||
startOnNewLine(
|
||||
createStatement(
|
||||
createAssignment(
|
||||
createElementAccess(
|
||||
expressionName,
|
||||
createSubtract(temp, createLiteral(restIndex))
|
||||
),
|
||||
createElementAccess(createIdentifier("arguments"), temp)
|
||||
),
|
||||
/*location*/ parameter
|
||||
)
|
||||
)
|
||||
])
|
||||
);
|
||||
|
||||
setEmitFlags(forStatement, EmitFlags.CustomPrologue);
|
||||
startOnNewLine(forStatement);
|
||||
statements.push(forStatement);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
export function convertForOf(node: ForOfStatement, convertedLoopBodyStatements: Statement[],
|
||||
visitor: (node: Node) => VisitResult<Node>,
|
||||
enableSubstitutionsForBlockScopedBindings: () => void,
|
||||
context: TransformationContext,
|
||||
convertObjectRest?: boolean): ForStatement | ForOfStatement {
|
||||
// The following ES6 code:
|
||||
//
|
||||
// for (let v of expr) { }
|
||||
//
|
||||
// should be emitted as
|
||||
//
|
||||
// for (var _i = 0, _a = expr; _i < _a.length; _i++) {
|
||||
// var v = _a[_i];
|
||||
// }
|
||||
//
|
||||
// where _a and _i are temps emitted to capture the RHS and the counter,
|
||||
// respectively.
|
||||
// When the left hand side is an expression instead of a let declaration,
|
||||
// the "let v" is not emitted.
|
||||
// When the left hand side is a let/const, the v is renamed if there is
|
||||
// another v in scope.
|
||||
// Note that all assignments to the LHS are emitted in the body, including
|
||||
// all destructuring.
|
||||
// Note also that because an extra statement is needed to assign to the LHS,
|
||||
// for-of bodies are always emitted as blocks.
|
||||
|
||||
const expression = visitNode(node.expression, visitor, isExpression);
|
||||
const initializer = node.initializer;
|
||||
const statements: Statement[] = [];
|
||||
|
||||
// In the case where the user wrote an identifier as the RHS, like this:
|
||||
//
|
||||
// for (let v of arr) { }
|
||||
//
|
||||
// we don't want to emit a temporary variable for the RHS, just use it directly.
|
||||
const counter = convertObjectRest ? undefined : createLoopVariable();
|
||||
const rhsReference = expression.kind === SyntaxKind.Identifier
|
||||
? createUniqueName((<Identifier>expression).text)
|
||||
: createTempVariable(/*recordTempVariable*/ undefined);
|
||||
const elementAccess = convertObjectRest ? rhsReference : createElementAccess(rhsReference, counter);
|
||||
|
||||
// Initialize LHS
|
||||
// var v = _a[_i];
|
||||
if (isVariableDeclarationList(initializer)) {
|
||||
if (initializer.flags & NodeFlags.BlockScoped) {
|
||||
enableSubstitutionsForBlockScopedBindings();
|
||||
}
|
||||
|
||||
const firstOriginalDeclaration = firstOrUndefined(initializer.declarations);
|
||||
if (firstOriginalDeclaration && isBindingPattern(firstOriginalDeclaration.name)) {
|
||||
// This works whether the declaration is a var, let, or const.
|
||||
// It will use rhsIterationValue _a[_i] as the initializer.
|
||||
const declarations = flattenVariableDestructuring(
|
||||
firstOriginalDeclaration,
|
||||
elementAccess,
|
||||
visitor,
|
||||
/*recordTempVariable*/ undefined,
|
||||
convertObjectRest
|
||||
);
|
||||
|
||||
const declarationList = createVariableDeclarationList(declarations, /*location*/ initializer);
|
||||
setOriginalNode(declarationList, initializer);
|
||||
|
||||
// Adjust the source map range for the first declaration to align with the old
|
||||
// emitter.
|
||||
const firstDeclaration = declarations[0];
|
||||
const lastDeclaration = lastOrUndefined(declarations);
|
||||
setSourceMapRange(declarationList, createRange(firstDeclaration.pos, lastDeclaration.end));
|
||||
|
||||
statements.push(
|
||||
createVariableStatement(
|
||||
/*modifiers*/ undefined,
|
||||
declarationList
|
||||
)
|
||||
);
|
||||
}
|
||||
else {
|
||||
// The following call does not include the initializer, so we have
|
||||
// to emit it separately.
|
||||
statements.push(
|
||||
createVariableStatement(
|
||||
/*modifiers*/ undefined,
|
||||
setOriginalNode(
|
||||
createVariableDeclarationList([
|
||||
createVariableDeclaration(
|
||||
firstOriginalDeclaration ? firstOriginalDeclaration.name : createTempVariable(/*recordTempVariable*/ undefined),
|
||||
/*type*/ undefined,
|
||||
createElementAccess(rhsReference, counter)
|
||||
)
|
||||
], /*location*/ moveRangePos(initializer, -1)),
|
||||
initializer
|
||||
),
|
||||
/*location*/ moveRangeEnd(initializer, -1)
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Initializer is an expression. Emit the expression in the body, so that it's
|
||||
// evaluated on every iteration.
|
||||
const assignment = createAssignment(initializer, elementAccess);
|
||||
if (isDestructuringAssignment(assignment)) {
|
||||
// This is a destructuring pattern, so we flatten the destructuring instead.
|
||||
statements.push(
|
||||
createStatement(
|
||||
flattenDestructuringAssignment(
|
||||
context,
|
||||
assignment,
|
||||
/*needsValue*/ false,
|
||||
context.hoistVariableDeclaration,
|
||||
visitor,
|
||||
convertObjectRest
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
else {
|
||||
// Currently there is not way to check that assignment is binary expression of destructing assignment
|
||||
// so we have to cast never type to binaryExpression
|
||||
(<BinaryExpression>assignment).end = initializer.end;
|
||||
statements.push(createStatement(assignment, /*location*/ moveRangeEnd(initializer, -1)));
|
||||
}
|
||||
}
|
||||
|
||||
let bodyLocation: TextRange;
|
||||
let statementsLocation: TextRange;
|
||||
if (convertedLoopBodyStatements) {
|
||||
addRange(statements, convertedLoopBodyStatements);
|
||||
}
|
||||
else {
|
||||
const statement = visitNode(node.statement, visitor, isStatement);
|
||||
if (isBlock(statement)) {
|
||||
addRange(statements, statement.statements);
|
||||
bodyLocation = statement;
|
||||
statementsLocation = statement.statements;
|
||||
}
|
||||
else {
|
||||
statements.push(statement);
|
||||
}
|
||||
}
|
||||
|
||||
// The old emitter does not emit source maps for the expression
|
||||
setEmitFlags(expression, EmitFlags.NoSourceMap | getEmitFlags(expression));
|
||||
|
||||
// The old emitter does not emit source maps for the block.
|
||||
// We add the location to preserve comments.
|
||||
const body = createBlock(
|
||||
createNodeArray(statements, /*location*/ statementsLocation),
|
||||
/*location*/ bodyLocation
|
||||
);
|
||||
|
||||
setEmitFlags(body, EmitFlags.NoSourceMap | EmitFlags.NoTokenSourceMaps);
|
||||
|
||||
let forStatement: ForStatement | ForOfStatement;
|
||||
if (convertObjectRest) {
|
||||
forStatement = createForOf(
|
||||
createVariableDeclarationList([
|
||||
createVariableDeclaration(rhsReference, /*type*/ undefined, /*initializer*/ undefined, /*location*/ node.expression)
|
||||
], /*location*/ node.expression),
|
||||
node.expression,
|
||||
body,
|
||||
/*location*/ node
|
||||
);
|
||||
}
|
||||
else {
|
||||
forStatement = createFor(
|
||||
setEmitFlags(
|
||||
createVariableDeclarationList([
|
||||
createVariableDeclaration(counter, /*type*/ undefined, createLiteral(0), /*location*/ moveRangePos(node.expression, -1)),
|
||||
createVariableDeclaration(rhsReference, /*type*/ undefined, expression, /*location*/ node.expression)
|
||||
], /*location*/ node.expression),
|
||||
EmitFlags.NoHoisting
|
||||
),
|
||||
createLessThan(
|
||||
counter,
|
||||
createPropertyAccess(rhsReference, "length"),
|
||||
/*location*/ node.expression
|
||||
),
|
||||
createPostfixIncrement(counter, /*location*/ node.expression),
|
||||
body,
|
||||
/*location*/ node
|
||||
);
|
||||
}
|
||||
|
||||
// Disable trailing source maps for the OpenParenToken to align source map emit with the old emitter.
|
||||
setEmitFlags(forStatement, EmitFlags.NoTokenTrailingSourceMaps);
|
||||
return forStatement;
|
||||
}
|
||||
}
|
||||
|
||||
+36
-5
@@ -74,6 +74,8 @@ namespace ts {
|
||||
visitNode(cbNode, (<ShorthandPropertyAssignment>node).questionToken) ||
|
||||
visitNode(cbNode, (<ShorthandPropertyAssignment>node).equalsToken) ||
|
||||
visitNode(cbNode, (<ShorthandPropertyAssignment>node).objectAssignmentInitializer);
|
||||
case SyntaxKind.SpreadAssignment:
|
||||
return visitNode(cbNode, (<SpreadAssignment>node).expression);
|
||||
case SyntaxKind.Parameter:
|
||||
case SyntaxKind.PropertyDeclaration:
|
||||
case SyntaxKind.PropertySignature:
|
||||
@@ -200,8 +202,8 @@ namespace ts {
|
||||
visitNode(cbNode, (<ConditionalExpression>node).whenTrue) ||
|
||||
visitNode(cbNode, (<ConditionalExpression>node).colonToken) ||
|
||||
visitNode(cbNode, (<ConditionalExpression>node).whenFalse);
|
||||
case SyntaxKind.SpreadElementExpression:
|
||||
return visitNode(cbNode, (<SpreadElementExpression>node).expression);
|
||||
case SyntaxKind.SpreadElement:
|
||||
return visitNode(cbNode, (<SpreadElement>node).expression);
|
||||
case SyntaxKind.Block:
|
||||
case SyntaxKind.ModuleBlock:
|
||||
return visitNodes(cbNodes, (<Block>node).statements);
|
||||
@@ -441,6 +443,10 @@ namespace ts {
|
||||
return result;
|
||||
}
|
||||
|
||||
export function parseIsolatedEntityName(text: string, languageVersion: ScriptTarget): EntityName {
|
||||
return Parser.parseIsolatedEntityName(text, languageVersion);
|
||||
}
|
||||
|
||||
export function isExternalModule(file: SourceFile): boolean {
|
||||
return file.externalModuleIndicator !== undefined;
|
||||
}
|
||||
@@ -592,6 +598,16 @@ namespace ts {
|
||||
return result;
|
||||
}
|
||||
|
||||
export function parseIsolatedEntityName(content: string, languageVersion: ScriptTarget): EntityName {
|
||||
initializeState(content, languageVersion, /*syntaxCursor*/ undefined, ScriptKind.JS);
|
||||
// Prime the scanner.
|
||||
nextToken();
|
||||
const entityName = parseEntityName(/*allowReservedWords*/ true);
|
||||
const isInvalid = token() === SyntaxKind.EndOfFileToken && !parseDiagnostics.length;
|
||||
clearState();
|
||||
return isInvalid ? entityName : undefined;
|
||||
}
|
||||
|
||||
function getLanguageVariant(scriptKind: ScriptKind) {
|
||||
// .tsx and .jsx files are treated as jsx language variant.
|
||||
return scriptKind === ScriptKind.TSX || scriptKind === ScriptKind.JSX || scriptKind === ScriptKind.JS ? LanguageVariant.JSX : LanguageVariant.Standard;
|
||||
@@ -1272,9 +1288,11 @@ namespace ts {
|
||||
// which would be a candidate for improved error reporting.
|
||||
return token() === SyntaxKind.OpenBracketToken || isLiteralPropertyName();
|
||||
case ParsingContext.ObjectLiteralMembers:
|
||||
return token() === SyntaxKind.OpenBracketToken || token() === SyntaxKind.AsteriskToken || isLiteralPropertyName();
|
||||
return token() === SyntaxKind.OpenBracketToken || token() === SyntaxKind.AsteriskToken || token() === SyntaxKind.DotDotDotToken || isLiteralPropertyName();
|
||||
case ParsingContext.RestProperties:
|
||||
return isLiteralPropertyName();
|
||||
case ParsingContext.ObjectBindingElements:
|
||||
return token() === SyntaxKind.OpenBracketToken || isLiteralPropertyName();
|
||||
return token() === SyntaxKind.OpenBracketToken || token() === SyntaxKind.DotDotDotToken || isLiteralPropertyName();
|
||||
case ParsingContext.HeritageClauseElement:
|
||||
// If we see { } then only consume it as an expression if it is followed by , or {
|
||||
// That way we won't consume the body of a class in its heritage clause.
|
||||
@@ -1401,6 +1419,7 @@ namespace ts {
|
||||
case ParsingContext.ArrayBindingElements:
|
||||
return token() === SyntaxKind.CloseBracketToken;
|
||||
case ParsingContext.Parameters:
|
||||
case ParsingContext.RestProperties:
|
||||
// Tokens other than ')' and ']' (the latter for index signatures) are here for better error recovery
|
||||
return token() === SyntaxKind.CloseParenToken || token() === SyntaxKind.CloseBracketToken /*|| token === SyntaxKind.OpenBraceToken*/;
|
||||
case ParsingContext.TypeArguments:
|
||||
@@ -1586,6 +1605,9 @@ namespace ts {
|
||||
case ParsingContext.Parameters:
|
||||
return isReusableParameter(node);
|
||||
|
||||
case ParsingContext.RestProperties:
|
||||
return false;
|
||||
|
||||
// Any other lists we do not care about reusing nodes in. But feel free to add if
|
||||
// you can do so safely. Danger areas involve nodes that may involve speculative
|
||||
// parsing. If speculative parsing is involved with the node, then the range the
|
||||
@@ -1783,6 +1805,7 @@ namespace ts {
|
||||
case ParsingContext.BlockStatements: return Diagnostics.Declaration_or_statement_expected;
|
||||
case ParsingContext.SwitchClauses: return Diagnostics.case_or_default_expected;
|
||||
case ParsingContext.SwitchClauseStatements: return Diagnostics.Statement_expected;
|
||||
case ParsingContext.RestProperties: // fallthrough
|
||||
case ParsingContext.TypeMembers: return Diagnostics.Property_or_signature_expected;
|
||||
case ParsingContext.ClassMembers: return Diagnostics.Unexpected_token_A_constructor_method_accessor_or_property_was_expected;
|
||||
case ParsingContext.EnumMembers: return Diagnostics.Enum_member_expected;
|
||||
@@ -4155,7 +4178,7 @@ namespace ts {
|
||||
}
|
||||
|
||||
function parseSpreadElement(): Expression {
|
||||
const node = <SpreadElementExpression>createNode(SyntaxKind.SpreadElementExpression);
|
||||
const node = <SpreadElement>createNode(SyntaxKind.SpreadElement);
|
||||
parseExpected(SyntaxKind.DotDotDotToken);
|
||||
node.expression = parseAssignmentExpressionOrHigher();
|
||||
return finishNode(node);
|
||||
@@ -4195,6 +4218,12 @@ namespace ts {
|
||||
|
||||
function parseObjectLiteralElement(): ObjectLiteralElementLike {
|
||||
const fullStart = scanner.getStartPos();
|
||||
const dotDotDotToken = parseOptionalToken(SyntaxKind.DotDotDotToken);
|
||||
if (dotDotDotToken) {
|
||||
const spreadElement = <SpreadAssignment>createNode(SyntaxKind.SpreadAssignment, fullStart);
|
||||
spreadElement.expression = parseAssignmentExpressionOrHigher();
|
||||
return addJSDocComment(finishNode(spreadElement));
|
||||
}
|
||||
const decorators = parseDecorators();
|
||||
const modifiers = parseModifiers();
|
||||
|
||||
@@ -4898,6 +4927,7 @@ namespace ts {
|
||||
|
||||
function parseObjectBindingElement(): BindingElement {
|
||||
const node = <BindingElement>createNode(SyntaxKind.BindingElement);
|
||||
node.dotDotDotToken = parseOptionalToken(SyntaxKind.DotDotDotToken);
|
||||
const tokenIsIdentifier = isIdentifier();
|
||||
const propertyName = parsePropertyName();
|
||||
if (tokenIsIdentifier && token() !== SyntaxKind.ColonToken) {
|
||||
@@ -5842,6 +5872,7 @@ namespace ts {
|
||||
JsxChildren, // Things between opening and closing JSX tags
|
||||
ArrayLiteralMembers, // Members in array literal
|
||||
Parameters, // Parameters in parameter list
|
||||
RestProperties, // Property names in a rest type list
|
||||
TypeParameters, // Type parameters in type parameter list
|
||||
TypeArguments, // Type arguments in type argument list
|
||||
TupleElementTypes, // Element types in tuple element type list
|
||||
|
||||
+154
-143
@@ -908,48 +908,24 @@ namespace ts {
|
||||
function getJavaScriptSyntacticDiagnosticsForFile(sourceFile: SourceFile): Diagnostic[] {
|
||||
return runWithCancellationToken(() => {
|
||||
const diagnostics: Diagnostic[] = [];
|
||||
let parent: Node = sourceFile;
|
||||
walk(sourceFile);
|
||||
|
||||
return diagnostics;
|
||||
|
||||
function walk(node: Node): boolean {
|
||||
if (!node) {
|
||||
return false;
|
||||
}
|
||||
function walk(node: Node) {
|
||||
// Return directly from the case if the given node doesnt want to visit each child
|
||||
// Otherwise break to visit each child
|
||||
|
||||
switch (node.kind) {
|
||||
case SyntaxKind.ImportEqualsDeclaration:
|
||||
diagnostics.push(createDiagnosticForNode(node, Diagnostics.import_can_only_be_used_in_a_ts_file));
|
||||
return true;
|
||||
case SyntaxKind.ExportAssignment:
|
||||
if ((<ExportAssignment>node).isExportEquals) {
|
||||
diagnostics.push(createDiagnosticForNode(node, Diagnostics.export_can_only_be_used_in_a_ts_file));
|
||||
return true;
|
||||
switch (parent.kind) {
|
||||
case SyntaxKind.Parameter:
|
||||
case SyntaxKind.PropertyDeclaration:
|
||||
if ((<ParameterDeclaration | PropertyDeclaration>parent).questionToken === node) {
|
||||
diagnostics.push(createDiagnosticForNode(node, Diagnostics._0_can_only_be_used_in_a_ts_file, "?"));
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case SyntaxKind.ClassDeclaration:
|
||||
let classDeclaration = <ClassDeclaration>node;
|
||||
if (checkModifiers(classDeclaration.modifiers) ||
|
||||
checkTypeParameters(classDeclaration.typeParameters)) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case SyntaxKind.HeritageClause:
|
||||
let heritageClause = <HeritageClause>node;
|
||||
if (heritageClause.token === SyntaxKind.ImplementsKeyword) {
|
||||
diagnostics.push(createDiagnosticForNode(node, Diagnostics.implements_clauses_can_only_be_used_in_a_ts_file));
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case SyntaxKind.InterfaceDeclaration:
|
||||
diagnostics.push(createDiagnosticForNode(node, Diagnostics.interface_declarations_can_only_be_used_in_a_ts_file));
|
||||
return true;
|
||||
case SyntaxKind.ModuleDeclaration:
|
||||
diagnostics.push(createDiagnosticForNode(node, Diagnostics.module_declarations_can_only_be_used_in_a_ts_file));
|
||||
return true;
|
||||
case SyntaxKind.TypeAliasDeclaration:
|
||||
diagnostics.push(createDiagnosticForNode(node, Diagnostics.type_aliases_can_only_be_used_in_a_ts_file));
|
||||
return true;
|
||||
|
||||
// Pass through
|
||||
case SyntaxKind.MethodDeclaration:
|
||||
case SyntaxKind.MethodSignature:
|
||||
case SyntaxKind.Constructor:
|
||||
@@ -959,124 +935,151 @@ namespace ts {
|
||||
case SyntaxKind.FunctionDeclaration:
|
||||
case SyntaxKind.ArrowFunction:
|
||||
case SyntaxKind.FunctionDeclaration:
|
||||
const functionDeclaration = <FunctionLikeDeclaration>node;
|
||||
if (checkModifiers(functionDeclaration.modifiers) ||
|
||||
checkTypeParameters(functionDeclaration.typeParameters) ||
|
||||
checkTypeAnnotation(functionDeclaration.type)) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case SyntaxKind.VariableStatement:
|
||||
const variableStatement = <VariableStatement>node;
|
||||
if (checkModifiers(variableStatement.modifiers)) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case SyntaxKind.VariableDeclaration:
|
||||
const variableDeclaration = <VariableDeclaration>node;
|
||||
if (checkTypeAnnotation(variableDeclaration.type)) {
|
||||
return true;
|
||||
// type annotation
|
||||
if ((<FunctionLikeDeclaration | VariableDeclaration | ParameterDeclaration | PropertyDeclaration>parent).type === node) {
|
||||
diagnostics.push(createDiagnosticForNode(node, Diagnostics.types_can_only_be_used_in_a_ts_file));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
switch (node.kind) {
|
||||
case SyntaxKind.ImportEqualsDeclaration:
|
||||
diagnostics.push(createDiagnosticForNode(node, Diagnostics.import_can_only_be_used_in_a_ts_file));
|
||||
return;
|
||||
case SyntaxKind.ExportAssignment:
|
||||
if ((<ExportAssignment>node).isExportEquals) {
|
||||
diagnostics.push(createDiagnosticForNode(node, Diagnostics.export_can_only_be_used_in_a_ts_file));
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case SyntaxKind.HeritageClause:
|
||||
let heritageClause = <HeritageClause>node;
|
||||
if (heritageClause.token === SyntaxKind.ImplementsKeyword) {
|
||||
diagnostics.push(createDiagnosticForNode(node, Diagnostics.implements_clauses_can_only_be_used_in_a_ts_file));
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case SyntaxKind.InterfaceDeclaration:
|
||||
diagnostics.push(createDiagnosticForNode(node, Diagnostics.interface_declarations_can_only_be_used_in_a_ts_file));
|
||||
return;
|
||||
case SyntaxKind.ModuleDeclaration:
|
||||
diagnostics.push(createDiagnosticForNode(node, Diagnostics.module_declarations_can_only_be_used_in_a_ts_file));
|
||||
return;
|
||||
case SyntaxKind.TypeAliasDeclaration:
|
||||
diagnostics.push(createDiagnosticForNode(node, Diagnostics.type_aliases_can_only_be_used_in_a_ts_file));
|
||||
return;
|
||||
case SyntaxKind.EnumDeclaration:
|
||||
diagnostics.push(createDiagnosticForNode(node, Diagnostics.enum_declarations_can_only_be_used_in_a_ts_file));
|
||||
return;
|
||||
case SyntaxKind.TypeAssertionExpression:
|
||||
let typeAssertionExpression = <TypeAssertion>node;
|
||||
diagnostics.push(createDiagnosticForNode(typeAssertionExpression.type, Diagnostics.type_assertion_expressions_can_only_be_used_in_a_ts_file));
|
||||
return;
|
||||
}
|
||||
|
||||
const prevParent = parent;
|
||||
parent = node;
|
||||
forEachChild(node, walk, walkArray);
|
||||
parent = prevParent;
|
||||
}
|
||||
|
||||
function walkArray(nodes: NodeArray<Node>) {
|
||||
if (parent.decorators === nodes && !options.experimentalDecorators) {
|
||||
diagnostics.push(createDiagnosticForNode(parent, Diagnostics.Experimental_support_for_decorators_is_a_feature_that_is_subject_to_change_in_a_future_release_Set_the_experimentalDecorators_option_to_remove_this_warning));
|
||||
}
|
||||
|
||||
switch (parent.kind) {
|
||||
case SyntaxKind.ClassDeclaration:
|
||||
case SyntaxKind.MethodDeclaration:
|
||||
case SyntaxKind.MethodSignature:
|
||||
case SyntaxKind.Constructor:
|
||||
case SyntaxKind.GetAccessor:
|
||||
case SyntaxKind.SetAccessor:
|
||||
case SyntaxKind.FunctionExpression:
|
||||
case SyntaxKind.FunctionDeclaration:
|
||||
case SyntaxKind.ArrowFunction:
|
||||
case SyntaxKind.FunctionDeclaration:
|
||||
// Check type parameters
|
||||
if (nodes === (<ClassDeclaration | FunctionLikeDeclaration>parent).typeParameters) {
|
||||
diagnostics.push(createDiagnosticForNodeArray(nodes, Diagnostics.type_parameter_declarations_can_only_be_used_in_a_ts_file));
|
||||
return;
|
||||
}
|
||||
// pass through
|
||||
case SyntaxKind.VariableStatement:
|
||||
// Check modifiers
|
||||
if (nodes === (<ClassDeclaration | FunctionLikeDeclaration | VariableStatement>parent).modifiers) {
|
||||
return checkModifiers(<NodeArray<Modifier>>nodes, parent.kind === SyntaxKind.VariableStatement);
|
||||
}
|
||||
break;
|
||||
case SyntaxKind.PropertyDeclaration:
|
||||
// Check modifiers of property declaration
|
||||
if (nodes === (<PropertyDeclaration>parent).modifiers) {
|
||||
for (const modifier of <NodeArray<Modifier>>nodes) {
|
||||
if (modifier.kind !== SyntaxKind.StaticKeyword) {
|
||||
diagnostics.push(createDiagnosticForNode(modifier, Diagnostics._0_can_only_be_used_in_a_ts_file, tokenToString(modifier.kind)));
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case SyntaxKind.Parameter:
|
||||
// Check modifiers of parameter declaration
|
||||
if (nodes === (<ParameterDeclaration>parent).modifiers) {
|
||||
diagnostics.push(createDiagnosticForNodeArray(nodes, Diagnostics.parameter_modifiers_can_only_be_used_in_a_ts_file));
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case SyntaxKind.CallExpression:
|
||||
case SyntaxKind.NewExpression:
|
||||
const expression = <CallExpression>node;
|
||||
if (expression.typeArguments && expression.typeArguments.length > 0) {
|
||||
const start = expression.typeArguments.pos;
|
||||
diagnostics.push(createFileDiagnostic(sourceFile, start, expression.typeArguments.end - start,
|
||||
Diagnostics.type_arguments_can_only_be_used_in_a_ts_file));
|
||||
return true;
|
||||
case SyntaxKind.ExpressionWithTypeArguments:
|
||||
// Check type arguments
|
||||
if (nodes === (<CallExpression | NewExpression | ExpressionWithTypeArguments>parent).typeArguments) {
|
||||
diagnostics.push(createDiagnosticForNodeArray(nodes, Diagnostics.type_arguments_can_only_be_used_in_a_ts_file));
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case SyntaxKind.Parameter:
|
||||
const parameter = <ParameterDeclaration>node;
|
||||
if (parameter.modifiers) {
|
||||
const start = parameter.modifiers.pos;
|
||||
diagnostics.push(createFileDiagnostic(sourceFile, start, parameter.modifiers.end - start,
|
||||
Diagnostics.parameter_modifiers_can_only_be_used_in_a_ts_file));
|
||||
return true;
|
||||
}
|
||||
if (parameter.questionToken) {
|
||||
diagnostics.push(createDiagnosticForNode(parameter.questionToken, Diagnostics._0_can_only_be_used_in_a_ts_file, "?"));
|
||||
return true;
|
||||
}
|
||||
if (parameter.type) {
|
||||
diagnostics.push(createDiagnosticForNode(parameter.type, Diagnostics.types_can_only_be_used_in_a_ts_file));
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case SyntaxKind.PropertyDeclaration:
|
||||
const propertyDeclaration = <PropertyDeclaration>node;
|
||||
if (propertyDeclaration.modifiers) {
|
||||
for (const modifier of propertyDeclaration.modifiers) {
|
||||
if (modifier.kind !== SyntaxKind.StaticKeyword) {
|
||||
diagnostics.push(createDiagnosticForNode(modifier, Diagnostics._0_can_only_be_used_in_a_ts_file, tokenToString(modifier.kind)));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
for (const node of nodes) {
|
||||
walk(node);
|
||||
}
|
||||
}
|
||||
|
||||
function checkModifiers(modifiers: NodeArray<Modifier>, isConstValid: boolean) {
|
||||
for (const modifier of modifiers) {
|
||||
switch (modifier.kind) {
|
||||
case SyntaxKind.ConstKeyword:
|
||||
if (isConstValid) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (checkTypeAnnotation((<PropertyDeclaration>node).type)) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case SyntaxKind.EnumDeclaration:
|
||||
diagnostics.push(createDiagnosticForNode(node, Diagnostics.enum_declarations_can_only_be_used_in_a_ts_file));
|
||||
return true;
|
||||
case SyntaxKind.TypeAssertionExpression:
|
||||
let typeAssertionExpression = <TypeAssertion>node;
|
||||
diagnostics.push(createDiagnosticForNode(typeAssertionExpression.type, Diagnostics.type_assertion_expressions_can_only_be_used_in_a_ts_file));
|
||||
return true;
|
||||
case SyntaxKind.Decorator:
|
||||
if (!options.experimentalDecorators) {
|
||||
diagnostics.push(createDiagnosticForNode(node, Diagnostics.Experimental_support_for_decorators_is_a_feature_that_is_subject_to_change_in_a_future_release_Set_the_experimentalDecorators_option_to_remove_this_warning));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
// Fallthrough to report error
|
||||
case SyntaxKind.PublicKeyword:
|
||||
case SyntaxKind.PrivateKeyword:
|
||||
case SyntaxKind.ProtectedKeyword:
|
||||
case SyntaxKind.ReadonlyKeyword:
|
||||
case SyntaxKind.DeclareKeyword:
|
||||
case SyntaxKind.AbstractKeyword:
|
||||
diagnostics.push(createDiagnosticForNode(modifier, Diagnostics._0_can_only_be_used_in_a_ts_file, tokenToString(modifier.kind)));
|
||||
break;
|
||||
|
||||
return forEachChild(node, walk);
|
||||
}
|
||||
|
||||
function checkTypeParameters(typeParameters: NodeArray<TypeParameterDeclaration>): boolean {
|
||||
if (typeParameters) {
|
||||
const start = typeParameters.pos;
|
||||
diagnostics.push(createFileDiagnostic(sourceFile, start, typeParameters.end - start, Diagnostics.type_parameter_declarations_can_only_be_used_in_a_ts_file));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function checkTypeAnnotation(type: TypeNode): boolean {
|
||||
if (type) {
|
||||
diagnostics.push(createDiagnosticForNode(type, Diagnostics.types_can_only_be_used_in_a_ts_file));
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function checkModifiers(modifiers: NodeArray<Modifier>): boolean {
|
||||
if (modifiers) {
|
||||
for (const modifier of modifiers) {
|
||||
switch (modifier.kind) {
|
||||
case SyntaxKind.PublicKeyword:
|
||||
case SyntaxKind.PrivateKeyword:
|
||||
case SyntaxKind.ProtectedKeyword:
|
||||
case SyntaxKind.ReadonlyKeyword:
|
||||
case SyntaxKind.DeclareKeyword:
|
||||
diagnostics.push(createDiagnosticForNode(modifier, Diagnostics._0_can_only_be_used_in_a_ts_file, tokenToString(modifier.kind)));
|
||||
return true;
|
||||
|
||||
// These are all legal modifiers.
|
||||
case SyntaxKind.StaticKeyword:
|
||||
case SyntaxKind.ExportKeyword:
|
||||
case SyntaxKind.ConstKeyword:
|
||||
case SyntaxKind.DefaultKeyword:
|
||||
case SyntaxKind.AbstractKeyword:
|
||||
}
|
||||
// These are all legal modifiers.
|
||||
case SyntaxKind.StaticKeyword:
|
||||
case SyntaxKind.ExportKeyword:
|
||||
case SyntaxKind.DefaultKeyword:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
function createDiagnosticForNodeArray(nodes: NodeArray<Node>, message: DiagnosticMessage, arg0?: string | number, arg1?: string | number, arg2?: string | number): Diagnostic {
|
||||
const start = nodes.pos;
|
||||
return createFileDiagnostic(sourceFile, start, nodes.end - start, message, arg0, arg1, arg2);
|
||||
}
|
||||
|
||||
// Since these are syntactic diagnostics, parent might not have been set
|
||||
// this means the sourceFile cannot be infered from the node
|
||||
function createDiagnosticForNode(node: Node, message: DiagnosticMessage, arg0?: string | number, arg1?: string | number, arg2?: string | number): Diagnostic {
|
||||
return createDiagnosticForNodeInSourceFile(sourceFile, node, message, arg0, arg1, arg2);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -1670,7 +1673,15 @@ namespace ts {
|
||||
programDiagnostics.add(createCompilerDiagnostic(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1, "emitDecoratorMetadata", "experimentalDecorators"));
|
||||
}
|
||||
|
||||
if (options.reactNamespace && !isIdentifierText(options.reactNamespace, languageVersion)) {
|
||||
if (options.jsxFactory) {
|
||||
if (options.reactNamespace) {
|
||||
programDiagnostics.add(createCompilerDiagnostic(Diagnostics.Option_0_cannot_be_specified_with_option_1, "reactNamespace", "jsxFactory"));
|
||||
}
|
||||
if (!parseIsolatedEntityName(options.jsxFactory, languageVersion)) {
|
||||
programDiagnostics.add(createCompilerDiagnostic(Diagnostics.Invalid_value_for_jsxFactory_0_is_not_a_valid_identifier_or_qualified_name, options.jsxFactory));
|
||||
}
|
||||
}
|
||||
else if (options.reactNamespace && !isIdentifierText(options.reactNamespace, languageVersion)) {
|
||||
programDiagnostics.add(createCompilerDiagnostic(Diagnostics.Invalid_value_for_reactNamespace_0_is_not_a_valid_identifier, options.reactNamespace));
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/// <reference path="visitor.ts" />
|
||||
/// <reference path="transformers/ts.ts" />
|
||||
/// <reference path="transformers/jsx.ts" />
|
||||
/// <reference path="transformers/esnext.ts" />
|
||||
/// <reference path="transformers/es2017.ts" />
|
||||
/// <reference path="transformers/es2016.ts" />
|
||||
/// <reference path="transformers/es2015.ts" />
|
||||
@@ -116,6 +117,10 @@ namespace ts {
|
||||
transformers.push(transformJsx);
|
||||
}
|
||||
|
||||
if (languageVersion < ScriptTarget.ESNext) {
|
||||
transformers.push(transformESNext);
|
||||
}
|
||||
|
||||
if (languageVersion < ScriptTarget.ES2017) {
|
||||
transformers.push(transformES2017);
|
||||
}
|
||||
|
||||
@@ -17,7 +17,8 @@ namespace ts {
|
||||
node: BinaryExpression,
|
||||
needsValue: boolean,
|
||||
recordTempVariable: (node: Identifier) => void,
|
||||
visitor?: (node: Node) => VisitResult<Node>): Expression {
|
||||
visitor?: (node: Node) => VisitResult<Node>,
|
||||
transformRest?: boolean): Expression {
|
||||
|
||||
if (isEmptyObjectLiteralOrArrayLiteral(node.left)) {
|
||||
const right = node.right;
|
||||
@@ -51,7 +52,7 @@ namespace ts {
|
||||
location = value;
|
||||
}
|
||||
|
||||
flattenDestructuring(node, value, location, emitAssignment, emitTempVariableAssignment, visitor);
|
||||
flattenDestructuring(node, value, location, emitAssignment, emitTempVariableAssignment, recordTempVariable, emitRestAssignment, transformRest, visitor);
|
||||
|
||||
if (needsValue) {
|
||||
expressions.push(value);
|
||||
@@ -61,7 +62,7 @@ namespace ts {
|
||||
aggregateTransformFlags(expression);
|
||||
return expression;
|
||||
|
||||
function emitAssignment(name: Identifier, value: Expression, location: TextRange) {
|
||||
function emitAssignment(name: Identifier | ObjectLiteralExpression, value: Expression, location: TextRange) {
|
||||
const expression = createAssignment(name, value, location);
|
||||
|
||||
// NOTE: this completely disables source maps, but aligns with the behavior of
|
||||
@@ -77,6 +78,10 @@ namespace ts {
|
||||
emitAssignment(name, value, location);
|
||||
return name;
|
||||
}
|
||||
|
||||
function emitRestAssignment(elements: ObjectLiteralElementLike[], value: Expression, location: TextRange) {
|
||||
emitAssignment(createObjectLiteral(elements), value, location);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -89,14 +94,15 @@ namespace ts {
|
||||
export function flattenParameterDestructuring(
|
||||
node: ParameterDeclaration,
|
||||
value: Expression,
|
||||
visitor?: (node: Node) => VisitResult<Node>) {
|
||||
visitor?: (node: Node) => VisitResult<Node>,
|
||||
transformRest?: boolean) {
|
||||
const declarations: VariableDeclaration[] = [];
|
||||
|
||||
flattenDestructuring(node, value, node, emitAssignment, emitTempVariableAssignment, visitor);
|
||||
flattenDestructuring(node, value, node, emitAssignment, emitTempVariableAssignment, noop, emitRestAssignment, transformRest, visitor);
|
||||
|
||||
return declarations;
|
||||
|
||||
function emitAssignment(name: Identifier, value: Expression, location: TextRange) {
|
||||
function emitAssignment(name: Identifier | BindingPattern, value: Expression, location: TextRange) {
|
||||
const declaration = createVariableDeclaration(name, /*type*/ undefined, value, location);
|
||||
|
||||
// NOTE: this completely disables source maps, but aligns with the behavior of
|
||||
@@ -112,6 +118,10 @@ namespace ts {
|
||||
emitAssignment(name, value, location);
|
||||
return name;
|
||||
}
|
||||
|
||||
function emitRestAssignment(elements: BindingElement[], value: Expression, location: TextRange) {
|
||||
emitAssignment(createObjectBindingPattern(elements), value, location);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -125,15 +135,16 @@ namespace ts {
|
||||
node: VariableDeclaration,
|
||||
value?: Expression,
|
||||
visitor?: (node: Node) => VisitResult<Node>,
|
||||
recordTempVariable?: (node: Identifier) => void) {
|
||||
recordTempVariable?: (node: Identifier) => void,
|
||||
transformRest?: boolean) {
|
||||
const declarations: VariableDeclaration[] = [];
|
||||
|
||||
let pendingAssignments: Expression[];
|
||||
flattenDestructuring(node, value, node, emitAssignment, emitTempVariableAssignment, visitor);
|
||||
flattenDestructuring(node, value, node, emitAssignment, emitTempVariableAssignment, recordTempVariable, emitRestAssignment, transformRest, visitor);
|
||||
|
||||
return declarations;
|
||||
|
||||
function emitAssignment(name: Identifier, value: Expression, location: TextRange, original: Node) {
|
||||
function emitAssignment(name: Identifier | BindingPattern, value: Expression, location: TextRange, original: Node) {
|
||||
if (pendingAssignments) {
|
||||
pendingAssignments.push(value);
|
||||
value = inlineExpressions(pendingAssignments);
|
||||
@@ -167,6 +178,10 @@ namespace ts {
|
||||
}
|
||||
return name;
|
||||
}
|
||||
|
||||
function emitRestAssignment(elements: BindingElement[], value: Expression, location: TextRange, original: Node) {
|
||||
emitAssignment(createObjectBindingPattern(elements), value, location, original);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -186,15 +201,17 @@ namespace ts {
|
||||
|
||||
const pendingAssignments: Expression[] = [];
|
||||
|
||||
flattenDestructuring(node, /*value*/ undefined, node, emitAssignment, emitTempVariableAssignment, visitor);
|
||||
flattenDestructuring(node, /*value*/ undefined, node, emitAssignment, emitTempVariableAssignment, noop, emitRestAssignment, /*transformRest*/ false, visitor);
|
||||
|
||||
const expression = inlineExpressions(pendingAssignments);
|
||||
aggregateTransformFlags(expression);
|
||||
return expression;
|
||||
|
||||
function emitAssignment(name: Identifier, value: Expression, location: TextRange, original: Node) {
|
||||
function emitAssignment(name: Identifier | ObjectLiteralExpression, value: Expression, location: TextRange, original: Node) {
|
||||
const expression = createAssignmentCallback
|
||||
? createAssignmentCallback(name, value, location)
|
||||
? createAssignmentCallback(name.kind === SyntaxKind.Identifier ? name : emitTempVariableAssignment(name, location),
|
||||
value,
|
||||
location)
|
||||
: createAssignment(name, value, location);
|
||||
|
||||
emitPendingAssignment(expression, original);
|
||||
@@ -206,6 +223,10 @@ namespace ts {
|
||||
return name;
|
||||
}
|
||||
|
||||
function emitRestAssignment(elements: ObjectLiteralElementLike[], value: Expression, location: TextRange, original: Node) {
|
||||
emitAssignment(createObjectLiteral(elements), value, location, original);
|
||||
}
|
||||
|
||||
function emitPendingAssignment(expression: Expression, original: Node) {
|
||||
expression.original = original;
|
||||
|
||||
@@ -223,6 +244,9 @@ namespace ts {
|
||||
location: TextRange,
|
||||
emitAssignment: (name: Identifier, value: Expression, location: TextRange, original: Node) => void,
|
||||
emitTempVariableAssignment: (value: Expression, location: TextRange) => Identifier,
|
||||
recordTempVariable: (node: Identifier) => void,
|
||||
emitRestAssignment: (elements: (ObjectLiteralElementLike[] | BindingElement[]), value: Expression, location: TextRange, original: Node) => void,
|
||||
transformRest: boolean,
|
||||
visitor?: (node: Node) => VisitResult<Node>) {
|
||||
if (value && visitor) {
|
||||
value = visitNode(value, visitor, isExpression);
|
||||
@@ -284,23 +308,91 @@ namespace ts {
|
||||
value = ensureIdentifier(value, /*reuseIdentifierExpressions*/ true, location, emitTempVariableAssignment);
|
||||
}
|
||||
|
||||
for (const p of properties) {
|
||||
let bindingElements: ObjectLiteralElementLike[] = [];
|
||||
for (let i = 0; i < properties.length; i++) {
|
||||
const p = properties[i];
|
||||
if (p.kind === SyntaxKind.PropertyAssignment || p.kind === SyntaxKind.ShorthandPropertyAssignment) {
|
||||
const propName = <Identifier | LiteralExpression>(<PropertyAssignment>p).name;
|
||||
const target = p.kind === SyntaxKind.ShorthandPropertyAssignment ? <ShorthandPropertyAssignment>p : (<PropertyAssignment>p).initializer || propName;
|
||||
// Assignment for target = value.propName should highligh whole property, hence use p as source map node
|
||||
emitDestructuringAssignment(target, createDestructuringPropertyAccess(value, propName), p);
|
||||
if (!transformRest ||
|
||||
p.transformFlags & TransformFlags.ContainsSpreadExpression ||
|
||||
(p.kind === SyntaxKind.PropertyAssignment && p.initializer.transformFlags & TransformFlags.ContainsSpreadExpression)) {
|
||||
if (bindingElements.length) {
|
||||
emitRestAssignment(bindingElements, value, location, target);
|
||||
bindingElements = [];
|
||||
}
|
||||
const propName = <Identifier | LiteralExpression>(<PropertyAssignment>p).name;
|
||||
const bindingTarget = p.kind === SyntaxKind.ShorthandPropertyAssignment ? <ShorthandPropertyAssignment>p : (<PropertyAssignment>p).initializer || propName;
|
||||
// Assignment for bindingTarget = value.propName should highlight whole property, hence use p as source map node
|
||||
emitDestructuringAssignment(bindingTarget, createDestructuringPropertyAccess(value, propName), p);
|
||||
}
|
||||
else {
|
||||
bindingElements.push(p);
|
||||
}
|
||||
}
|
||||
else if (i === properties.length - 1 && p.kind === SyntaxKind.SpreadAssignment) {
|
||||
Debug.assert((p as SpreadAssignment).expression.kind === SyntaxKind.Identifier);
|
||||
if (bindingElements.length) {
|
||||
emitRestAssignment(bindingElements, value, location, target);
|
||||
bindingElements = [];
|
||||
}
|
||||
const propName = (p as SpreadAssignment).expression as Identifier;
|
||||
const restCall = createRestCall(value, target.properties, p => p.name, target);
|
||||
emitDestructuringAssignment(propName, restCall, p);
|
||||
}
|
||||
}
|
||||
if (bindingElements.length) {
|
||||
emitRestAssignment(bindingElements, value, location, target);
|
||||
bindingElements = [];
|
||||
}
|
||||
}
|
||||
|
||||
function emitArrayLiteralAssignment(target: ArrayLiteralExpression, value: Expression, location: TextRange) {
|
||||
if (transformRest) {
|
||||
emitESNextArrayLiteralAssignment(target, value, location);
|
||||
}
|
||||
else {
|
||||
emitES2015ArrayLiteralAssignment(target, value, location);
|
||||
}
|
||||
}
|
||||
|
||||
function emitESNextArrayLiteralAssignment(target: ArrayLiteralExpression, value: Expression, location: TextRange) {
|
||||
const elements = target.elements;
|
||||
const numElements = elements.length;
|
||||
if (numElements !== 1) {
|
||||
// For anything but a single element destructuring we need to generate a temporary
|
||||
// to ensure value is evaluated exactly once.
|
||||
// When doing so we want to hightlight the passed in source map node since thats the one needing this temp assignment
|
||||
// When doing so we want to highlight the passed-in source map node since thats the one needing this temp assignment
|
||||
value = ensureIdentifier(value, /*reuseIdentifierExpressions*/ true, location, emitTempVariableAssignment);
|
||||
}
|
||||
|
||||
const expressions: Expression[] = [];
|
||||
const spreadContainingExpressions: [Expression, Identifier][] = [];
|
||||
for (let i = 0; i < numElements; i++) {
|
||||
const e = elements[i];
|
||||
if (e.kind === SyntaxKind.OmittedExpression) {
|
||||
continue;
|
||||
}
|
||||
if (e.transformFlags & TransformFlags.ContainsSpreadExpression && i < numElements - 1) {
|
||||
const tmp = createTempVariable(recordTempVariable);
|
||||
spreadContainingExpressions.push([e, tmp]);
|
||||
expressions.push(tmp);
|
||||
}
|
||||
else {
|
||||
expressions.push(e);
|
||||
}
|
||||
}
|
||||
emitAssignment(updateArrayLiteral(target, expressions) as any as Identifier, value, undefined, undefined);
|
||||
for (const [e, tmp] of spreadContainingExpressions) {
|
||||
emitDestructuringAssignment(e, tmp, e);
|
||||
}
|
||||
}
|
||||
|
||||
function emitES2015ArrayLiteralAssignment(target: ArrayLiteralExpression, value: Expression, location: TextRange) {
|
||||
const elements = target.elements;
|
||||
const numElements = elements.length;
|
||||
if (numElements !== 1) {
|
||||
// For anything but a single element destructuring we need to generate a temporary
|
||||
// to ensure value is evaluated exactly once.
|
||||
// When doing so we want to highlight the passed-in source map node since thats the one needing this temp assignment
|
||||
value = ensureIdentifier(value, /*reuseIdentifierExpressions*/ true, location, emitTempVariableAssignment);
|
||||
}
|
||||
|
||||
@@ -308,20 +400,41 @@ namespace ts {
|
||||
const e = elements[i];
|
||||
if (e.kind !== SyntaxKind.OmittedExpression) {
|
||||
// Assignment for target = value.propName should highligh whole property, hence use e as source map node
|
||||
if (e.kind !== SyntaxKind.SpreadElementExpression) {
|
||||
if (e.kind !== SyntaxKind.SpreadElement) {
|
||||
emitDestructuringAssignment(e, createElementAccess(value, createLiteral(i)), e);
|
||||
}
|
||||
else if (i === numElements - 1) {
|
||||
emitDestructuringAssignment((<SpreadElementExpression>e).expression, createArraySlice(value, i), e);
|
||||
emitDestructuringAssignment((<SpreadElement>e).expression, createArraySlice(value, i), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Given value: o, propName: p, pattern: { a, b, ...p } from the original statement
|
||||
* `{ a, b, ...p } = o`, create `p = __rest(o, ["a", "b"]);`*/
|
||||
function createRestCall<T extends Node>(value: Expression, elements: T[], getPropertyName: (element: T) => PropertyName, location: TextRange): Expression {
|
||||
const propertyNames: LiteralExpression[] = [];
|
||||
for (let i = 0; i < elements.length - 1; i++) {
|
||||
if (isOmittedExpression(elements[i])) {
|
||||
continue;
|
||||
}
|
||||
const str = <StringLiteral>createSynthesizedNode(SyntaxKind.StringLiteral);
|
||||
str.pos = location.pos;
|
||||
str.end = location.end;
|
||||
str.text = getTextOfPropertyName(getPropertyName(elements[i]));
|
||||
propertyNames.push(str);
|
||||
}
|
||||
const args = createSynthesizedNodeArray([value, createArrayLiteral(propertyNames, location)]);
|
||||
return createCall(createIdentifier("__rest"), undefined, args);
|
||||
}
|
||||
|
||||
function emitBindingElement(target: VariableDeclaration | ParameterDeclaration | BindingElement, value: Expression) {
|
||||
// Any temporary assignments needed to emit target = value should point to target
|
||||
const initializer = visitor ? visitNode(target.initializer, visitor, isExpression) : target.initializer;
|
||||
if (initializer) {
|
||||
if (transformRest) {
|
||||
value = value || initializer;
|
||||
}
|
||||
else if (initializer) {
|
||||
// Combine value and initializer
|
||||
value = value ? createDefaultValueCheck(value, initializer, target) : initializer;
|
||||
}
|
||||
@@ -331,9 +444,11 @@ namespace ts {
|
||||
}
|
||||
|
||||
const name = target.name;
|
||||
if (isBindingPattern(name)) {
|
||||
const elements = name.elements;
|
||||
const numElements = elements.length;
|
||||
if (!isBindingPattern(name)) {
|
||||
emitAssignment(name, value, target, target);
|
||||
}
|
||||
else {
|
||||
const numElements = name.elements.length;
|
||||
if (numElements !== 1) {
|
||||
// For anything other than a single-element destructuring we need to generate a temporary
|
||||
// to ensure value is evaluated exactly once. Additionally, if we have zero elements
|
||||
@@ -341,29 +456,104 @@ namespace ts {
|
||||
// so in that case, we'll intentionally create that temporary.
|
||||
value = ensureIdentifier(value, /*reuseIdentifierExpressions*/ numElements !== 0, target, emitTempVariableAssignment);
|
||||
}
|
||||
for (let i = 0; i < numElements; i++) {
|
||||
const element = elements[i];
|
||||
if (isOmittedExpression(element)) {
|
||||
continue;
|
||||
}
|
||||
else if (name.kind === SyntaxKind.ObjectBindingPattern) {
|
||||
// Rewrite element to a declaration with an initializer that fetches property
|
||||
const propName = element.propertyName || <Identifier>element.name;
|
||||
emitBindingElement(element, createDestructuringPropertyAccess(value, propName));
|
||||
}
|
||||
else {
|
||||
if (!element.dotDotDotToken) {
|
||||
// Rewrite element to a declaration that accesses array element at index i
|
||||
emitBindingElement(element, createElementAccess(value, i));
|
||||
}
|
||||
else if (i === numElements - 1) {
|
||||
emitBindingElement(element, createArraySlice(value, i));
|
||||
}
|
||||
}
|
||||
if (name.kind === SyntaxKind.ArrayBindingPattern) {
|
||||
emitArrayBindingElement(name as ArrayBindingPattern, value);
|
||||
}
|
||||
else {
|
||||
emitObjectBindingElement(target, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function emitArrayBindingElement(name: ArrayBindingPattern, value: Expression) {
|
||||
if (transformRest) {
|
||||
emitESNextArrayBindingElement(name, value);
|
||||
}
|
||||
else {
|
||||
emitAssignment(name, value, target, target);
|
||||
emitES2015ArrayBindingElement(name, value);
|
||||
}
|
||||
}
|
||||
|
||||
function emitES2015ArrayBindingElement(name: ArrayBindingPattern, value: Expression) {
|
||||
const elements = name.elements;
|
||||
const numElements = elements.length;
|
||||
for (let i = 0; i < numElements; i++) {
|
||||
const element = elements[i];
|
||||
if (isOmittedExpression(element)) {
|
||||
continue;
|
||||
}
|
||||
if (!element.dotDotDotToken) {
|
||||
// Rewrite element to a declaration that accesses array element at index i
|
||||
emitBindingElement(element, createElementAccess(value, i));
|
||||
}
|
||||
else if (i === numElements - 1) {
|
||||
emitBindingElement(element, createArraySlice(value, i));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function emitESNextArrayBindingElement(name: ArrayBindingPattern, value: Expression) {
|
||||
const elements = name.elements;
|
||||
const numElements = elements.length;
|
||||
const bindingElements: BindingElement[] = [];
|
||||
const spreadContainingElements: BindingElement[] = [];
|
||||
for (let i = 0; i < numElements; i++) {
|
||||
const element = elements[i];
|
||||
if (isOmittedExpression(element)) {
|
||||
continue;
|
||||
}
|
||||
if (element.transformFlags & TransformFlags.ContainsSpreadExpression && i < numElements - 1) {
|
||||
spreadContainingElements.push(element);
|
||||
bindingElements.push(createBindingElement(undefined, undefined, getGeneratedNameForNode(element), undefined, value));
|
||||
}
|
||||
else {
|
||||
bindingElements.push(element);
|
||||
}
|
||||
}
|
||||
emitAssignment(updateArrayBindingPattern(name, bindingElements) as any as Identifier, value, undefined, undefined);
|
||||
for (const element of spreadContainingElements) {
|
||||
emitBindingElement(element, getGeneratedNameForNode(element));
|
||||
}
|
||||
}
|
||||
|
||||
function emitObjectBindingElement(target: VariableDeclaration | ParameterDeclaration | BindingElement, value: Expression) {
|
||||
const name = target.name as BindingPattern;
|
||||
const elements = name.elements;
|
||||
const numElements = elements.length;
|
||||
let bindingElements: BindingElement[] = [];
|
||||
for (let i = 0; i < numElements; i++) {
|
||||
const element = elements[i];
|
||||
if (isOmittedExpression(element)) {
|
||||
continue;
|
||||
}
|
||||
if (i === numElements - 1 && element.dotDotDotToken) {
|
||||
if (bindingElements.length) {
|
||||
emitRestAssignment(bindingElements, value, target, target);
|
||||
bindingElements = [];
|
||||
}
|
||||
const restCall = createRestCall(value,
|
||||
name.elements,
|
||||
element => (element as BindingElement).propertyName || <Identifier>(element as BindingElement).name,
|
||||
name);
|
||||
emitBindingElement(element, restCall);
|
||||
}
|
||||
else if (transformRest && !(element.transformFlags & TransformFlags.ContainsSpreadExpression)) {
|
||||
// do not emit until we have a complete bundle of ES2015 syntax
|
||||
bindingElements.push(element);
|
||||
}
|
||||
else {
|
||||
if (bindingElements.length) {
|
||||
emitRestAssignment(bindingElements, value, target, target);
|
||||
bindingElements = [];
|
||||
}
|
||||
// Rewrite element to a declaration with an initializer that fetches property
|
||||
const propName = element.propertyName || <Identifier>element.name;
|
||||
emitBindingElement(element, createDestructuringPropertyAccess(value, propName));
|
||||
}
|
||||
}
|
||||
if (bindingElements.length) {
|
||||
emitRestAssignment(bindingElements, value, target, target);
|
||||
bindingElements = [];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -861,7 +861,7 @@ namespace ts {
|
||||
}
|
||||
|
||||
if (constructor) {
|
||||
addDefaultValueAssignmentsIfNeeded(statements, constructor);
|
||||
addDefaultValueAssignmentsIfNeeded(statements, constructor, visitor, /*convertObjectRest*/ false);
|
||||
addRestParameterIfNeeded(statements, constructor, hasSynthesizedSuper);
|
||||
Debug.assert(statementOffset >= 0, "statementOffset not initialized correctly!");
|
||||
|
||||
@@ -954,7 +954,7 @@ namespace ts {
|
||||
// If this isn't a derived class, just capture 'this' for arrow functions if necessary.
|
||||
if (!hasExtendsClause) {
|
||||
if (ctor) {
|
||||
addCaptureThisForNodeIfNeeded(statements, ctor);
|
||||
addCaptureThisForNodeIfNeeded(statements, ctor, enableSubstitutionsForCapturedThis);
|
||||
}
|
||||
return SuperCaptureResult.NoReplacement;
|
||||
}
|
||||
@@ -1016,7 +1016,7 @@ namespace ts {
|
||||
}
|
||||
|
||||
// Perform the capture.
|
||||
captureThisForNode(statements, ctor, superCallExpression, firstStatement);
|
||||
captureThisForNode(statements, ctor, superCallExpression, enableSubstitutionsForCapturedThis, firstStatement);
|
||||
|
||||
// If we're actually replacing the original statement, we need to signal this to the caller.
|
||||
if (superCallExpression) {
|
||||
@@ -1085,242 +1085,6 @@ namespace ts {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a value indicating whether we need to add default value assignments for a
|
||||
* function-like node.
|
||||
*
|
||||
* @param node A function-like node.
|
||||
*/
|
||||
function shouldAddDefaultValueAssignments(node: FunctionLikeDeclaration): boolean {
|
||||
return (node.transformFlags & TransformFlags.ContainsDefaultValueAssignments) !== 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds statements to the body of a function-like node if it contains parameters with
|
||||
* binding patterns or initializers.
|
||||
*
|
||||
* @param statements The statements for the new function body.
|
||||
* @param node A function-like node.
|
||||
*/
|
||||
function addDefaultValueAssignmentsIfNeeded(statements: Statement[], node: FunctionLikeDeclaration): void {
|
||||
if (!shouldAddDefaultValueAssignments(node)) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (const parameter of node.parameters) {
|
||||
const { name, initializer, dotDotDotToken } = parameter;
|
||||
|
||||
// A rest parameter cannot have a binding pattern or an initializer,
|
||||
// so let's just ignore it.
|
||||
if (dotDotDotToken) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isBindingPattern(name)) {
|
||||
addDefaultValueAssignmentForBindingPattern(statements, parameter, name, initializer);
|
||||
}
|
||||
else if (initializer) {
|
||||
addDefaultValueAssignmentForInitializer(statements, parameter, name, initializer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds statements to the body of a function-like node for parameters with binding patterns
|
||||
*
|
||||
* @param statements The statements for the new function body.
|
||||
* @param parameter The parameter for the function.
|
||||
* @param name The name of the parameter.
|
||||
* @param initializer The initializer for the parameter.
|
||||
*/
|
||||
function addDefaultValueAssignmentForBindingPattern(statements: Statement[], parameter: ParameterDeclaration, name: BindingPattern, initializer: Expression): void {
|
||||
const temp = getGeneratedNameForNode(parameter);
|
||||
|
||||
// In cases where a binding pattern is simply '[]' or '{}',
|
||||
// we usually don't want to emit a var declaration; however, in the presence
|
||||
// of an initializer, we must emit that expression to preserve side effects.
|
||||
if (name.elements.length > 0) {
|
||||
statements.push(
|
||||
setEmitFlags(
|
||||
createVariableStatement(
|
||||
/*modifiers*/ undefined,
|
||||
createVariableDeclarationList(
|
||||
flattenParameterDestructuring(parameter, temp, visitor)
|
||||
)
|
||||
),
|
||||
EmitFlags.CustomPrologue
|
||||
)
|
||||
);
|
||||
}
|
||||
else if (initializer) {
|
||||
statements.push(
|
||||
setEmitFlags(
|
||||
createStatement(
|
||||
createAssignment(
|
||||
temp,
|
||||
visitNode(initializer, visitor, isExpression)
|
||||
)
|
||||
),
|
||||
EmitFlags.CustomPrologue
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds statements to the body of a function-like node for parameters with initializers.
|
||||
*
|
||||
* @param statements The statements for the new function body.
|
||||
* @param parameter The parameter for the function.
|
||||
* @param name The name of the parameter.
|
||||
* @param initializer The initializer for the parameter.
|
||||
*/
|
||||
function addDefaultValueAssignmentForInitializer(statements: Statement[], parameter: ParameterDeclaration, name: Identifier, initializer: Expression): void {
|
||||
initializer = visitNode(initializer, visitor, isExpression);
|
||||
const statement = createIf(
|
||||
createStrictEquality(
|
||||
getSynthesizedClone(name),
|
||||
createVoidZero()
|
||||
),
|
||||
setEmitFlags(
|
||||
createBlock([
|
||||
createStatement(
|
||||
createAssignment(
|
||||
setEmitFlags(getMutableClone(name), EmitFlags.NoSourceMap),
|
||||
setEmitFlags(initializer, EmitFlags.NoSourceMap | getEmitFlags(initializer)),
|
||||
/*location*/ parameter
|
||||
)
|
||||
)
|
||||
], /*location*/ parameter),
|
||||
EmitFlags.SingleLine | EmitFlags.NoTrailingSourceMap | EmitFlags.NoTokenSourceMaps
|
||||
),
|
||||
/*elseStatement*/ undefined,
|
||||
/*location*/ parameter
|
||||
);
|
||||
statement.startsOnNewLine = true;
|
||||
setEmitFlags(statement, EmitFlags.NoTokenSourceMaps | EmitFlags.NoTrailingSourceMap | EmitFlags.CustomPrologue);
|
||||
statements.push(statement);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a value indicating whether we need to add statements to handle a rest parameter.
|
||||
*
|
||||
* @param node A ParameterDeclaration node.
|
||||
* @param inConstructorWithSynthesizedSuper A value indicating whether the parameter is
|
||||
* part of a constructor declaration with a
|
||||
* synthesized call to `super`
|
||||
*/
|
||||
function shouldAddRestParameter(node: ParameterDeclaration, inConstructorWithSynthesizedSuper: boolean) {
|
||||
return node && node.dotDotDotToken && node.name.kind === SyntaxKind.Identifier && !inConstructorWithSynthesizedSuper;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds statements to the body of a function-like node if it contains a rest parameter.
|
||||
*
|
||||
* @param statements The statements for the new function body.
|
||||
* @param node A function-like node.
|
||||
* @param inConstructorWithSynthesizedSuper A value indicating whether the parameter is
|
||||
* part of a constructor declaration with a
|
||||
* synthesized call to `super`
|
||||
*/
|
||||
function addRestParameterIfNeeded(statements: Statement[], node: FunctionLikeDeclaration, inConstructorWithSynthesizedSuper: boolean): void {
|
||||
const parameter = lastOrUndefined(node.parameters);
|
||||
if (!shouldAddRestParameter(parameter, inConstructorWithSynthesizedSuper)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// `declarationName` is the name of the local declaration for the parameter.
|
||||
const declarationName = getMutableClone(<Identifier>parameter.name);
|
||||
setEmitFlags(declarationName, EmitFlags.NoSourceMap);
|
||||
|
||||
// `expressionName` is the name of the parameter used in expressions.
|
||||
const expressionName = getSynthesizedClone(<Identifier>parameter.name);
|
||||
const restIndex = node.parameters.length - 1;
|
||||
const temp = createLoopVariable();
|
||||
|
||||
// var param = [];
|
||||
statements.push(
|
||||
setEmitFlags(
|
||||
createVariableStatement(
|
||||
/*modifiers*/ undefined,
|
||||
createVariableDeclarationList([
|
||||
createVariableDeclaration(
|
||||
declarationName,
|
||||
/*type*/ undefined,
|
||||
createArrayLiteral([])
|
||||
)
|
||||
]),
|
||||
/*location*/ parameter
|
||||
),
|
||||
EmitFlags.CustomPrologue
|
||||
)
|
||||
);
|
||||
|
||||
// for (var _i = restIndex; _i < arguments.length; _i++) {
|
||||
// param[_i - restIndex] = arguments[_i];
|
||||
// }
|
||||
const forStatement = createFor(
|
||||
createVariableDeclarationList([
|
||||
createVariableDeclaration(temp, /*type*/ undefined, createLiteral(restIndex))
|
||||
], /*location*/ parameter),
|
||||
createLessThan(
|
||||
temp,
|
||||
createPropertyAccess(createIdentifier("arguments"), "length"),
|
||||
/*location*/ parameter
|
||||
),
|
||||
createPostfixIncrement(temp, /*location*/ parameter),
|
||||
createBlock([
|
||||
startOnNewLine(
|
||||
createStatement(
|
||||
createAssignment(
|
||||
createElementAccess(
|
||||
expressionName,
|
||||
createSubtract(temp, createLiteral(restIndex))
|
||||
),
|
||||
createElementAccess(createIdentifier("arguments"), temp)
|
||||
),
|
||||
/*location*/ parameter
|
||||
)
|
||||
)
|
||||
])
|
||||
);
|
||||
|
||||
setEmitFlags(forStatement, EmitFlags.CustomPrologue);
|
||||
startOnNewLine(forStatement);
|
||||
statements.push(forStatement);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a statement to capture the `this` of a function declaration if it is needed.
|
||||
*
|
||||
* @param statements The statements for the new function body.
|
||||
* @param node A node.
|
||||
*/
|
||||
function addCaptureThisForNodeIfNeeded(statements: Statement[], node: Node): void {
|
||||
if (node.transformFlags & TransformFlags.ContainsCapturedLexicalThis && node.kind !== SyntaxKind.ArrowFunction) {
|
||||
captureThisForNode(statements, node, createThis());
|
||||
}
|
||||
}
|
||||
|
||||
function captureThisForNode(statements: Statement[], node: Node, initializer: Expression | undefined, originalStatement?: Statement): void {
|
||||
enableSubstitutionsForCapturedThis();
|
||||
const captureThisStatement = createVariableStatement(
|
||||
/*modifiers*/ undefined,
|
||||
createVariableDeclarationList([
|
||||
createVariableDeclaration(
|
||||
"_this",
|
||||
/*type*/ undefined,
|
||||
initializer
|
||||
)
|
||||
]),
|
||||
originalStatement
|
||||
);
|
||||
|
||||
setEmitFlags(captureThisStatement, EmitFlags.NoComments | EmitFlags.CustomPrologue);
|
||||
setSourceMapRange(captureThisStatement, node);
|
||||
statements.push(captureThisStatement);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds statements to the class body function for a class to define the members of the
|
||||
* class.
|
||||
@@ -1518,7 +1282,7 @@ namespace ts {
|
||||
/*typeParameters*/ undefined,
|
||||
visitNodes(node.parameters, visitor, isParameter),
|
||||
/*type*/ undefined,
|
||||
transformFunctionBody(node),
|
||||
transformFunctionBody(node, visitor, currentSourceFile, context, enableSubstitutionsForCapturedThis),
|
||||
/*location*/ node
|
||||
),
|
||||
/*original*/ node);
|
||||
@@ -1545,7 +1309,7 @@ namespace ts {
|
||||
/*typeParameters*/ undefined,
|
||||
visitNodes(node.parameters, visitor, isParameter),
|
||||
/*type*/ undefined,
|
||||
saveStateAndInvoke(node, transformFunctionBody),
|
||||
saveStateAndInvoke(node, node => transformFunctionBody(node, visitor, currentSourceFile, context, enableSubstitutionsForCapturedThis)),
|
||||
location
|
||||
),
|
||||
/*original*/ node
|
||||
@@ -1555,96 +1319,6 @@ namespace ts {
|
||||
return expression;
|
||||
}
|
||||
|
||||
/**
|
||||
* Transforms the body of a function-like node.
|
||||
*
|
||||
* @param node A function-like node.
|
||||
*/
|
||||
function transformFunctionBody(node: FunctionLikeDeclaration) {
|
||||
let multiLine = false; // indicates whether the block *must* be emitted as multiple lines
|
||||
let singleLine = false; // indicates whether the block *may* be emitted as a single line
|
||||
let statementsLocation: TextRange;
|
||||
let closeBraceLocation: TextRange;
|
||||
|
||||
const statements: Statement[] = [];
|
||||
const body = node.body;
|
||||
let statementOffset: number;
|
||||
|
||||
startLexicalEnvironment();
|
||||
if (isBlock(body)) {
|
||||
// ensureUseStrict is false because no new prologue-directive should be added.
|
||||
// addPrologueDirectives will simply put already-existing directives at the beginning of the target statement-array
|
||||
statementOffset = addPrologueDirectives(statements, body.statements, /*ensureUseStrict*/ false, visitor);
|
||||
}
|
||||
|
||||
addCaptureThisForNodeIfNeeded(statements, node);
|
||||
addDefaultValueAssignmentsIfNeeded(statements, node);
|
||||
addRestParameterIfNeeded(statements, node, /*inConstructorWithSynthesizedSuper*/ false);
|
||||
|
||||
// If we added any generated statements, this must be a multi-line block.
|
||||
if (!multiLine && statements.length > 0) {
|
||||
multiLine = true;
|
||||
}
|
||||
|
||||
if (isBlock(body)) {
|
||||
statementsLocation = body.statements;
|
||||
addRange(statements, visitNodes(body.statements, visitor, isStatement, statementOffset));
|
||||
|
||||
// If the original body was a multi-line block, this must be a multi-line block.
|
||||
if (!multiLine && body.multiLine) {
|
||||
multiLine = true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
Debug.assert(node.kind === SyntaxKind.ArrowFunction);
|
||||
|
||||
// To align with the old emitter, we use a synthetic end position on the location
|
||||
// for the statement list we synthesize when we down-level an arrow function with
|
||||
// an expression function body. This prevents both comments and source maps from
|
||||
// being emitted for the end position only.
|
||||
statementsLocation = moveRangeEnd(body, -1);
|
||||
|
||||
const equalsGreaterThanToken = (<ArrowFunction>node).equalsGreaterThanToken;
|
||||
if (!nodeIsSynthesized(equalsGreaterThanToken) && !nodeIsSynthesized(body)) {
|
||||
if (rangeEndIsOnSameLineAsRangeStart(equalsGreaterThanToken, body, currentSourceFile)) {
|
||||
singleLine = true;
|
||||
}
|
||||
else {
|
||||
multiLine = true;
|
||||
}
|
||||
}
|
||||
|
||||
const expression = visitNode(body, visitor, isExpression);
|
||||
const returnStatement = createReturn(expression, /*location*/ body);
|
||||
setEmitFlags(returnStatement, EmitFlags.NoTokenSourceMaps | EmitFlags.NoTrailingSourceMap | EmitFlags.NoTrailingComments);
|
||||
statements.push(returnStatement);
|
||||
|
||||
// To align with the source map emit for the old emitter, we set a custom
|
||||
// source map location for the close brace.
|
||||
closeBraceLocation = body;
|
||||
}
|
||||
|
||||
const lexicalEnvironment = endLexicalEnvironment();
|
||||
addRange(statements, lexicalEnvironment);
|
||||
|
||||
// If we added any final generated statements, this must be a multi-line block
|
||||
if (!multiLine && lexicalEnvironment && lexicalEnvironment.length) {
|
||||
multiLine = true;
|
||||
}
|
||||
|
||||
const block = createBlock(createNodeArray(statements, statementsLocation), node.body, multiLine);
|
||||
if (!multiLine && singleLine) {
|
||||
setEmitFlags(block, EmitFlags.SingleLine);
|
||||
}
|
||||
|
||||
if (closeBraceLocation) {
|
||||
setTokenSourceMapRange(block, SyntaxKind.CloseBraceToken, closeBraceLocation);
|
||||
}
|
||||
|
||||
setOriginalNode(block, node.body);
|
||||
return block;
|
||||
}
|
||||
|
||||
/**
|
||||
* Visits an ExpressionStatement that contains a destructuring assignment.
|
||||
*
|
||||
@@ -1926,171 +1600,7 @@ namespace ts {
|
||||
}
|
||||
|
||||
function convertForOfToFor(node: ForOfStatement, convertedLoopBodyStatements: Statement[]): ForStatement {
|
||||
// The following ES6 code:
|
||||
//
|
||||
// for (let v of expr) { }
|
||||
//
|
||||
// should be emitted as
|
||||
//
|
||||
// for (var _i = 0, _a = expr; _i < _a.length; _i++) {
|
||||
// var v = _a[_i];
|
||||
// }
|
||||
//
|
||||
// where _a and _i are temps emitted to capture the RHS and the counter,
|
||||
// respectively.
|
||||
// When the left hand side is an expression instead of a let declaration,
|
||||
// the "let v" is not emitted.
|
||||
// When the left hand side is a let/const, the v is renamed if there is
|
||||
// another v in scope.
|
||||
// Note that all assignments to the LHS are emitted in the body, including
|
||||
// all destructuring.
|
||||
// Note also that because an extra statement is needed to assign to the LHS,
|
||||
// for-of bodies are always emitted as blocks.
|
||||
|
||||
const expression = visitNode(node.expression, visitor, isExpression);
|
||||
const initializer = node.initializer;
|
||||
const statements: Statement[] = [];
|
||||
|
||||
// In the case where the user wrote an identifier as the RHS, like this:
|
||||
//
|
||||
// for (let v of arr) { }
|
||||
//
|
||||
// we don't want to emit a temporary variable for the RHS, just use it directly.
|
||||
const counter = createLoopVariable();
|
||||
const rhsReference = expression.kind === SyntaxKind.Identifier
|
||||
? createUniqueName((<Identifier>expression).text)
|
||||
: createTempVariable(/*recordTempVariable*/ undefined);
|
||||
|
||||
// Initialize LHS
|
||||
// var v = _a[_i];
|
||||
if (isVariableDeclarationList(initializer)) {
|
||||
if (initializer.flags & NodeFlags.BlockScoped) {
|
||||
enableSubstitutionsForBlockScopedBindings();
|
||||
}
|
||||
|
||||
const firstOriginalDeclaration = firstOrUndefined(initializer.declarations);
|
||||
if (firstOriginalDeclaration && isBindingPattern(firstOriginalDeclaration.name)) {
|
||||
// This works whether the declaration is a var, let, or const.
|
||||
// It will use rhsIterationValue _a[_i] as the initializer.
|
||||
const declarations = flattenVariableDestructuring(
|
||||
firstOriginalDeclaration,
|
||||
createElementAccess(rhsReference, counter),
|
||||
visitor
|
||||
);
|
||||
|
||||
const declarationList = createVariableDeclarationList(declarations, /*location*/ initializer);
|
||||
setOriginalNode(declarationList, initializer);
|
||||
|
||||
// Adjust the source map range for the first declaration to align with the old
|
||||
// emitter.
|
||||
const firstDeclaration = declarations[0];
|
||||
const lastDeclaration = lastOrUndefined(declarations);
|
||||
setSourceMapRange(declarationList, createRange(firstDeclaration.pos, lastDeclaration.end));
|
||||
|
||||
statements.push(
|
||||
createVariableStatement(
|
||||
/*modifiers*/ undefined,
|
||||
declarationList
|
||||
)
|
||||
);
|
||||
}
|
||||
else {
|
||||
// The following call does not include the initializer, so we have
|
||||
// to emit it separately.
|
||||
statements.push(
|
||||
createVariableStatement(
|
||||
/*modifiers*/ undefined,
|
||||
setOriginalNode(
|
||||
createVariableDeclarationList([
|
||||
createVariableDeclaration(
|
||||
firstOriginalDeclaration ? firstOriginalDeclaration.name : createTempVariable(/*recordTempVariable*/ undefined),
|
||||
/*type*/ undefined,
|
||||
createElementAccess(rhsReference, counter)
|
||||
)
|
||||
], /*location*/ moveRangePos(initializer, -1)),
|
||||
initializer
|
||||
),
|
||||
/*location*/ moveRangeEnd(initializer, -1)
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Initializer is an expression. Emit the expression in the body, so that it's
|
||||
// evaluated on every iteration.
|
||||
const assignment = createAssignment(initializer, createElementAccess(rhsReference, counter));
|
||||
if (isDestructuringAssignment(assignment)) {
|
||||
// This is a destructuring pattern, so we flatten the destructuring instead.
|
||||
statements.push(
|
||||
createStatement(
|
||||
flattenDestructuringAssignment(
|
||||
context,
|
||||
assignment,
|
||||
/*needsValue*/ false,
|
||||
hoistVariableDeclaration,
|
||||
visitor
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
else {
|
||||
// Currently there is not way to check that assignment is binary expression of destructing assignment
|
||||
// so we have to cast never type to binaryExpression
|
||||
(<BinaryExpression>assignment).end = initializer.end;
|
||||
statements.push(createStatement(assignment, /*location*/ moveRangeEnd(initializer, -1)));
|
||||
}
|
||||
}
|
||||
|
||||
let bodyLocation: TextRange;
|
||||
let statementsLocation: TextRange;
|
||||
if (convertedLoopBodyStatements) {
|
||||
addRange(statements, convertedLoopBodyStatements);
|
||||
}
|
||||
else {
|
||||
const statement = visitNode(node.statement, visitor, isStatement);
|
||||
if (isBlock(statement)) {
|
||||
addRange(statements, statement.statements);
|
||||
bodyLocation = statement;
|
||||
statementsLocation = statement.statements;
|
||||
}
|
||||
else {
|
||||
statements.push(statement);
|
||||
}
|
||||
}
|
||||
|
||||
// The old emitter does not emit source maps for the expression
|
||||
setEmitFlags(expression, EmitFlags.NoSourceMap | getEmitFlags(expression));
|
||||
|
||||
// The old emitter does not emit source maps for the block.
|
||||
// We add the location to preserve comments.
|
||||
const body = createBlock(
|
||||
createNodeArray(statements, /*location*/ statementsLocation),
|
||||
/*location*/ bodyLocation
|
||||
);
|
||||
|
||||
setEmitFlags(body, EmitFlags.NoSourceMap | EmitFlags.NoTokenSourceMaps);
|
||||
|
||||
const forStatement = createFor(
|
||||
setEmitFlags(
|
||||
createVariableDeclarationList([
|
||||
createVariableDeclaration(counter, /*type*/ undefined, createLiteral(0), /*location*/ moveRangePos(node.expression, -1)),
|
||||
createVariableDeclaration(rhsReference, /*type*/ undefined, expression, /*location*/ node.expression)
|
||||
], /*location*/ node.expression),
|
||||
EmitFlags.NoHoisting
|
||||
),
|
||||
createLessThan(
|
||||
counter,
|
||||
createPropertyAccess(rhsReference, "length"),
|
||||
/*location*/ node.expression
|
||||
),
|
||||
createPostfixIncrement(counter, /*location*/ node.expression),
|
||||
body,
|
||||
/*location*/ node
|
||||
);
|
||||
|
||||
// Disable trailing source maps for the OpenParenToken to align source map emit with the old emitter.
|
||||
setEmitFlags(forStatement, EmitFlags.NoTokenTrailingSourceMaps);
|
||||
return forStatement;
|
||||
return <ForStatement>convertForOf(node, convertedLoopBodyStatements, visitor, enableSubstitutionsForBlockScopedBindings, context, /*transformRest*/ false);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2751,7 +2261,7 @@ namespace ts {
|
||||
setEmitFlags(thisArg, EmitFlags.NoSubstitution);
|
||||
}
|
||||
let resultingCall: CallExpression | BinaryExpression;
|
||||
if (node.transformFlags & TransformFlags.ContainsSpreadElementExpression) {
|
||||
if (node.transformFlags & TransformFlags.ContainsSpreadExpression) {
|
||||
// [source]
|
||||
// f(...a, b)
|
||||
// x.m(...a, b)
|
||||
@@ -2813,7 +2323,7 @@ namespace ts {
|
||||
*/
|
||||
function visitNewExpression(node: NewExpression): LeftHandSideExpression {
|
||||
// We are here because we contain a SpreadElementExpression.
|
||||
Debug.assert((node.transformFlags & TransformFlags.ContainsSpreadElementExpression) !== 0);
|
||||
Debug.assert((node.transformFlags & TransformFlags.ContainsSpreadExpression) !== 0);
|
||||
|
||||
// [source]
|
||||
// new C(...a)
|
||||
@@ -2834,7 +2344,7 @@ namespace ts {
|
||||
}
|
||||
|
||||
/**
|
||||
* Transforms an array of Expression nodes that contains a SpreadElementExpression.
|
||||
* Transforms an array of Expression nodes that contains a SpreadExpression.
|
||||
*
|
||||
* @param elements The array of Expression nodes.
|
||||
* @param needsUniqueCopy A value indicating whether to ensure that the result is a fresh array.
|
||||
@@ -2851,14 +2361,14 @@ namespace ts {
|
||||
// expressions into an array literal.
|
||||
const numElements = elements.length;
|
||||
const segments = flatten(
|
||||
spanMap(elements, partitionSpreadElement, (partition, visitPartition, _start, end) =>
|
||||
spanMap(elements, partitionSpread, (partition, visitPartition, _start, end) =>
|
||||
visitPartition(partition, multiLine, hasTrailingComma && end === numElements)
|
||||
)
|
||||
);
|
||||
|
||||
if (segments.length === 1) {
|
||||
const firstElement = elements[0];
|
||||
return needsUniqueCopy && isSpreadElementExpression(firstElement) && firstElement.expression.kind !== SyntaxKind.ArrayLiteralExpression
|
||||
return needsUniqueCopy && isSpreadExpression(firstElement) && firstElement.expression.kind !== SyntaxKind.ArrayLiteralExpression
|
||||
? createArraySlice(segments[0])
|
||||
: segments[0];
|
||||
}
|
||||
@@ -2867,17 +2377,17 @@ namespace ts {
|
||||
return createArrayConcat(segments.shift(), segments);
|
||||
}
|
||||
|
||||
function partitionSpreadElement(node: Expression) {
|
||||
return isSpreadElementExpression(node)
|
||||
? visitSpanOfSpreadElements
|
||||
: visitSpanOfNonSpreadElements;
|
||||
function partitionSpread(node: Expression) {
|
||||
return isSpreadExpression(node)
|
||||
? visitSpanOfSpreads
|
||||
: visitSpanOfNonSpreads;
|
||||
}
|
||||
|
||||
function visitSpanOfSpreadElements(chunk: Expression[]): VisitResult<Expression> {
|
||||
return map(chunk, visitExpressionOfSpreadElement);
|
||||
function visitSpanOfSpreads(chunk: Expression[]): VisitResult<Expression> {
|
||||
return map(chunk, visitExpressionOfSpread);
|
||||
}
|
||||
|
||||
function visitSpanOfNonSpreadElements(chunk: Expression[], multiLine: boolean, hasTrailingComma: boolean): VisitResult<Expression> {
|
||||
function visitSpanOfNonSpreads(chunk: Expression[], multiLine: boolean, hasTrailingComma: boolean): VisitResult<Expression> {
|
||||
return createArrayLiteral(
|
||||
visitNodes(createNodeArray(chunk, /*location*/ undefined, hasTrailingComma), visitor, isExpression),
|
||||
/*location*/ undefined,
|
||||
@@ -2886,11 +2396,11 @@ namespace ts {
|
||||
}
|
||||
|
||||
/**
|
||||
* Transforms the expression of a SpreadElementExpression node.
|
||||
* Transforms the expression of a SpreadExpression node.
|
||||
*
|
||||
* @param node A SpreadElementExpression node.
|
||||
* @param node A SpreadExpression node.
|
||||
*/
|
||||
function visitExpressionOfSpreadElement(node: SpreadElementExpression) {
|
||||
function visitExpressionOfSpread(node: SpreadElement) {
|
||||
return visitNode(node.expression, visitor, isExpression);
|
||||
}
|
||||
|
||||
@@ -3076,7 +2586,7 @@ namespace ts {
|
||||
const statements: Statement[] = [];
|
||||
startLexicalEnvironment();
|
||||
addRange(statements, prologue);
|
||||
addCaptureThisForNodeIfNeeded(statements, node);
|
||||
addCaptureThisForNodeIfNeeded(statements, node, enableSubstitutionsForCapturedThis);
|
||||
addRange(statements, visitNodes(createNodeArray(remaining), visitor, isStatement));
|
||||
addRange(statements, endLexicalEnvironment());
|
||||
const clone = getMutableClone(node);
|
||||
@@ -3266,11 +2776,11 @@ namespace ts {
|
||||
}
|
||||
|
||||
const callArgument = singleOrUndefined((<CallExpression>statementExpression).arguments);
|
||||
if (!callArgument || !nodeIsSynthesized(callArgument) || callArgument.kind !== SyntaxKind.SpreadElementExpression) {
|
||||
if (!callArgument || !nodeIsSynthesized(callArgument) || callArgument.kind !== SyntaxKind.SpreadElement) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const expression = (<SpreadElementExpression>callArgument).expression;
|
||||
const expression = (<SpreadElement>callArgument).expression;
|
||||
return isIdentifier(expression) && expression === parameter.name;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,6 @@ namespace ts {
|
||||
switch (node.kind) {
|
||||
case SyntaxKind.BinaryExpression:
|
||||
return visitBinaryExpression(<BinaryExpression>node);
|
||||
|
||||
default:
|
||||
Debug.failBadSyntaxKind(node);
|
||||
return visitEachChild(node, visitor, context);
|
||||
|
||||
@@ -0,0 +1,272 @@
|
||||
/// <reference path="../factory.ts" />
|
||||
/// <reference path="../visitor.ts" />
|
||||
|
||||
/*@internal*/
|
||||
namespace ts {
|
||||
export function transformESNext(context: TransformationContext) {
|
||||
const {
|
||||
hoistVariableDeclaration,
|
||||
} = context;
|
||||
let currentSourceFile: SourceFile;
|
||||
return transformSourceFile;
|
||||
|
||||
function transformSourceFile(node: SourceFile) {
|
||||
currentSourceFile = node;
|
||||
return visitEachChild(node, visitor, context);
|
||||
}
|
||||
|
||||
function visitor(node: Node): VisitResult<Node> {
|
||||
if (node.transformFlags & TransformFlags.ESNext) {
|
||||
return visitorWorker(node);
|
||||
}
|
||||
else if (node.transformFlags & TransformFlags.ContainsESNext) {
|
||||
return visitEachChild(node, visitor, context);
|
||||
}
|
||||
else {
|
||||
return node;
|
||||
}
|
||||
}
|
||||
|
||||
function visitorWorker(node: Node): VisitResult<Node> {
|
||||
switch (node.kind) {
|
||||
case SyntaxKind.ObjectLiteralExpression:
|
||||
return visitObjectLiteralExpression(node as ObjectLiteralExpression);
|
||||
case SyntaxKind.BinaryExpression:
|
||||
return visitBinaryExpression(node as BinaryExpression);
|
||||
case SyntaxKind.VariableDeclaration:
|
||||
return visitVariableDeclaration(node as VariableDeclaration);
|
||||
case SyntaxKind.ForOfStatement:
|
||||
return visitForOfStatement(node as ForOfStatement);
|
||||
case SyntaxKind.ObjectBindingPattern:
|
||||
case SyntaxKind.ArrayBindingPattern:
|
||||
return node;
|
||||
case SyntaxKind.FunctionDeclaration:
|
||||
return visitFunctionDeclaration(node as FunctionDeclaration);
|
||||
case SyntaxKind.FunctionExpression:
|
||||
return visitFunctionExpression(node as FunctionExpression);
|
||||
case SyntaxKind.ArrowFunction:
|
||||
return visitArrowFunction(node as ArrowFunction);
|
||||
case SyntaxKind.Parameter:
|
||||
return visitParameter(node as ParameterDeclaration);
|
||||
default:
|
||||
Debug.failBadSyntaxKind(node);
|
||||
return visitEachChild(node, visitor, context);
|
||||
}
|
||||
}
|
||||
|
||||
function chunkObjectLiteralElements(elements: ObjectLiteralElement[]): Expression[] {
|
||||
let chunkObject: (ShorthandPropertyAssignment | PropertyAssignment)[];
|
||||
const objects: Expression[] = [];
|
||||
for (const e of elements) {
|
||||
if (e.kind === SyntaxKind.SpreadAssignment) {
|
||||
if (chunkObject) {
|
||||
objects.push(createObjectLiteral(chunkObject));
|
||||
chunkObject = undefined;
|
||||
}
|
||||
const target = (e as SpreadAssignment).expression;
|
||||
objects.push(visitNode(target, visitor, isExpression));
|
||||
}
|
||||
else {
|
||||
if (!chunkObject) {
|
||||
chunkObject = [];
|
||||
}
|
||||
if (e.kind === SyntaxKind.PropertyAssignment) {
|
||||
const p = e as PropertyAssignment;
|
||||
chunkObject.push(createPropertyAssignment(p.name, visitNode(p.initializer, visitor, isExpression)));
|
||||
}
|
||||
else {
|
||||
chunkObject.push(e as ShorthandPropertyAssignment);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (chunkObject) {
|
||||
objects.push(createObjectLiteral(chunkObject));
|
||||
}
|
||||
|
||||
return objects;
|
||||
}
|
||||
|
||||
function visitObjectLiteralExpression(node: ObjectLiteralExpression): Expression {
|
||||
// spread elements emit like so:
|
||||
// non-spread elements are chunked together into object literals, and then all are passed to __assign:
|
||||
// { a, ...o, b } => __assign({a}, o, {b});
|
||||
// If the first element is a spread element, then the first argument to __assign is {}:
|
||||
// { ...o, a, b, ...o2 } => __assign({}, o, {a, b}, o2)
|
||||
const objects = chunkObjectLiteralElements(node.properties);
|
||||
if (objects.length && objects[0].kind !== SyntaxKind.ObjectLiteralExpression) {
|
||||
objects.unshift(createObjectLiteral());
|
||||
}
|
||||
return createCall(createIdentifier("__assign"), undefined, objects);
|
||||
}
|
||||
|
||||
/**
|
||||
* Visits a BinaryExpression that contains a destructuring assignment.
|
||||
*
|
||||
* @param node A BinaryExpression node.
|
||||
*/
|
||||
function visitBinaryExpression(node: BinaryExpression): Expression {
|
||||
if (isDestructuringAssignment(node) && node.left.transformFlags & TransformFlags.AssertESNext) {
|
||||
return flattenDestructuringAssignment(context, node, /*needsDestructuringValue*/ true, hoistVariableDeclaration, visitor, /*transformRest*/ true);
|
||||
}
|
||||
|
||||
return visitEachChild(node, visitor, context);
|
||||
}
|
||||
|
||||
/**
|
||||
* Visits a VariableDeclaration node with a binding pattern.
|
||||
*
|
||||
* @param node A VariableDeclaration node.
|
||||
*/
|
||||
function visitVariableDeclaration(node: VariableDeclaration): VisitResult<VariableDeclaration> {
|
||||
// If we are here it is because the name contains a binding pattern with a rest somewhere in it.
|
||||
if (isBindingPattern(node.name) && node.name.transformFlags & TransformFlags.AssertESNext) {
|
||||
const result = flattenVariableDestructuring(node, /*value*/ undefined, visitor, /*recordTempVariable*/ undefined, /*transformRest*/ true);
|
||||
return result;
|
||||
}
|
||||
|
||||
return visitEachChild(node, visitor, context);
|
||||
}
|
||||
|
||||
/**
|
||||
* Visits a ForOfStatement and converts it into a ES2015-compatible ForOfStatement.
|
||||
*
|
||||
* @param node A ForOfStatement.
|
||||
*/
|
||||
function visitForOfStatement(node: ForOfStatement): VisitResult<Statement> {
|
||||
// The following ESNext code:
|
||||
//
|
||||
// for (let { x, y, ...rest } of expr) { }
|
||||
//
|
||||
// should be emitted as
|
||||
//
|
||||
// for (var _a of expr) {
|
||||
// let { x, y } = _a, rest = __rest(_a, ["x", "y"]);
|
||||
// }
|
||||
//
|
||||
// where _a is a temp emitted to capture the RHS.
|
||||
// When the left hand side is an expression instead of a let declaration,
|
||||
// the `let` before the `{ x, y }` is not emitted.
|
||||
// When the left hand side is a let/const, the v is renamed if there is
|
||||
// another v in scope.
|
||||
// Note that all assignments to the LHS are emitted in the body, including
|
||||
// all destructuring.
|
||||
// Note also that because an extra statement is needed to assign to the LHS,
|
||||
// for-of bodies are always emitted as blocks.
|
||||
|
||||
// for (<init> of <expression>) <statement>
|
||||
// where <init> is [let] variabledeclarationlist | expression
|
||||
const initializer = node.initializer;
|
||||
if (!isRestBindingPattern(initializer) && !isRestAssignment(initializer)) {
|
||||
return visitEachChild(node, visitor, context);
|
||||
}
|
||||
|
||||
return convertForOf(node, undefined, visitor, noop, context, /*transformRest*/ true);
|
||||
}
|
||||
|
||||
function isRestBindingPattern(initializer: ForInitializer) {
|
||||
if (isVariableDeclarationList(initializer)) {
|
||||
const declaration = firstOrUndefined(initializer.declarations);
|
||||
return declaration && declaration.name &&
|
||||
declaration.name.kind === SyntaxKind.ObjectBindingPattern &&
|
||||
!!(declaration.name.transformFlags & TransformFlags.ContainsSpreadExpression);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function isRestAssignment(initializer: ForInitializer) {
|
||||
return initializer.kind === SyntaxKind.ObjectLiteralExpression &&
|
||||
initializer.transformFlags & TransformFlags.ContainsSpreadExpression;
|
||||
}
|
||||
|
||||
function visitParameter(node: ParameterDeclaration): ParameterDeclaration {
|
||||
if (isObjectRestParameter(node)) {
|
||||
// Binding patterns are converted into a generated name and are
|
||||
// evaluated inside the function body.
|
||||
return setOriginalNode(
|
||||
createParameter(
|
||||
/*decorators*/ undefined,
|
||||
/*modifiers*/ undefined,
|
||||
/*dotDotDotToken*/ undefined,
|
||||
getGeneratedNameForNode(node),
|
||||
/*questionToken*/ undefined,
|
||||
/*type*/ undefined,
|
||||
node.initializer,
|
||||
/*location*/ node
|
||||
),
|
||||
/*original*/ node
|
||||
);
|
||||
}
|
||||
else {
|
||||
return node;
|
||||
}
|
||||
}
|
||||
|
||||
function isObjectRestParameter(node: ParameterDeclaration) {
|
||||
return node.name &&
|
||||
node.name.kind === SyntaxKind.ObjectBindingPattern &&
|
||||
!!(node.name.transformFlags & TransformFlags.ContainsSpreadExpression);
|
||||
}
|
||||
|
||||
function visitFunctionDeclaration(node: FunctionDeclaration): FunctionDeclaration {
|
||||
const hasRest = forEach(node.parameters, isObjectRestParameter);
|
||||
const body = hasRest ?
|
||||
transformFunctionBody(node, visitor, currentSourceFile, context, noop, /*convertObjectRest*/ true) as Block :
|
||||
visitEachChild(node.body, visitor, context);
|
||||
|
||||
return setOriginalNode(
|
||||
createFunctionDeclaration(
|
||||
/*decorators*/ undefined,
|
||||
node.modifiers,
|
||||
node.asteriskToken,
|
||||
node.name,
|
||||
/*typeParameters*/ undefined,
|
||||
visitNodes(node.parameters, visitor, isParameter),
|
||||
/*type*/ undefined,
|
||||
body,
|
||||
/*location*/ node
|
||||
),
|
||||
/*original*/ node);
|
||||
}
|
||||
|
||||
function visitArrowFunction(node: ArrowFunction) {
|
||||
const hasRest = forEach(node.parameters, isObjectRestParameter);
|
||||
const body = hasRest ?
|
||||
transformFunctionBody(node, visitor, currentSourceFile, context, noop, /*convertObjectRest*/ true) as Block :
|
||||
visitEachChild(node.body, visitor, context);
|
||||
const func = setOriginalNode(
|
||||
createArrowFunction(
|
||||
/*modifiers*/ undefined,
|
||||
/*typeParameters*/ undefined,
|
||||
visitNodes(node.parameters, visitor, isParameter),
|
||||
/*type*/ undefined,
|
||||
node.equalsGreaterThanToken,
|
||||
body,
|
||||
/*location*/ node
|
||||
),
|
||||
/*original*/ node
|
||||
);
|
||||
setEmitFlags(func, EmitFlags.CapturesThis);
|
||||
return func;
|
||||
}
|
||||
|
||||
function visitFunctionExpression(node: FunctionExpression): Expression {
|
||||
const hasRest = forEach(node.parameters, isObjectRestParameter);
|
||||
const body = hasRest ?
|
||||
transformFunctionBody(node, visitor, currentSourceFile, context, noop, /*convertObjectRest*/ true) as Block :
|
||||
visitEachChild(node.body, visitor, context);
|
||||
return setOriginalNode(
|
||||
createFunctionExpression(
|
||||
/*modifiers*/ undefined,
|
||||
node.asteriskToken,
|
||||
name,
|
||||
/*typeParameters*/ undefined,
|
||||
visitNodes(node.parameters, visitor, isParameter),
|
||||
/*type*/ undefined,
|
||||
body,
|
||||
/*location*/ node
|
||||
),
|
||||
/*original*/ node
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -113,7 +113,8 @@ namespace ts {
|
||||
|| createAssignHelper(currentSourceFile.externalHelpersModuleName, segments);
|
||||
}
|
||||
|
||||
const element = createReactCreateElement(
|
||||
const element = createExpressionForJsxElement(
|
||||
context.getEmitResolver().getJsxFactoryEntity(),
|
||||
compilerOptions.reactNamespace,
|
||||
tagName,
|
||||
objectProperties,
|
||||
|
||||
@@ -1474,7 +1474,7 @@ namespace ts {
|
||||
if (isAssignmentExpression(node)) {
|
||||
return hasExportedReferenceInDestructuringTarget(node.left);
|
||||
}
|
||||
else if (isSpreadElementExpression(node)) {
|
||||
else if (isSpreadExpression(node)) {
|
||||
return hasExportedReferenceInDestructuringTarget(node.expression);
|
||||
}
|
||||
else if (isObjectLiteralExpression(node)) {
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
"visitor.ts",
|
||||
"transformers/ts.ts",
|
||||
"transformers/jsx.ts",
|
||||
"transformers/esnext.ts",
|
||||
"transformers/es2017.ts",
|
||||
"transformers/es2016.ts",
|
||||
"transformers/es2015.ts",
|
||||
|
||||
+63
-43
@@ -247,7 +247,7 @@ namespace ts {
|
||||
ConditionalExpression,
|
||||
TemplateExpression,
|
||||
YieldExpression,
|
||||
SpreadElementExpression,
|
||||
SpreadElement,
|
||||
ClassExpression,
|
||||
OmittedExpression,
|
||||
ExpressionWithTypeArguments,
|
||||
@@ -321,6 +321,7 @@ namespace ts {
|
||||
// Property assignments
|
||||
PropertyAssignment,
|
||||
ShorthandPropertyAssignment,
|
||||
SpreadAssignment,
|
||||
|
||||
// Enum
|
||||
EnumMember,
|
||||
@@ -419,20 +420,21 @@ namespace ts {
|
||||
HasDecorators = 1 << 11, // If the file has decorators (initialized by binding)
|
||||
HasParamDecorators = 1 << 12, // If the file has parameter decorators (initialized by binding)
|
||||
HasAsyncFunctions = 1 << 13, // If the file has async functions (initialized by binding)
|
||||
HasJsxSpreadAttributes = 1 << 14, // If the file as JSX spread attributes (initialized by binding)
|
||||
DisallowInContext = 1 << 15, // If node was parsed in a context where 'in-expressions' are not allowed
|
||||
YieldContext = 1 << 16, // If node was parsed in the 'yield' context created when parsing a generator
|
||||
DecoratorContext = 1 << 17, // If node was parsed as part of a decorator
|
||||
AwaitContext = 1 << 18, // If node was parsed in the 'await' context created when parsing an async function
|
||||
ThisNodeHasError = 1 << 19, // If the parser encountered an error when parsing the code that created this node
|
||||
JavaScriptFile = 1 << 20, // If node was parsed in a JavaScript
|
||||
ThisNodeOrAnySubNodesHasError = 1 << 21, // If this node or any of its children had an error
|
||||
HasAggregatedChildData = 1 << 22, // If we've computed data from children and cached it in this node
|
||||
HasSpreadAttribute = 1 << 14, // If the file as JSX spread attributes (initialized by binding)
|
||||
HasRestAttribute = 1 << 15, // If the file has object destructure elements
|
||||
DisallowInContext = 1 << 16, // If node was parsed in a context where 'in-expressions' are not allowed
|
||||
YieldContext = 1 << 17, // If node was parsed in the 'yield' context created when parsing a generator
|
||||
DecoratorContext = 1 << 18, // If node was parsed as part of a decorator
|
||||
AwaitContext = 1 << 19, // If node was parsed in the 'await' context created when parsing an async function
|
||||
ThisNodeHasError = 1 << 20, // If the parser encountered an error when parsing the code that created this node
|
||||
JavaScriptFile = 1 << 21, // If node was parsed in a JavaScript
|
||||
ThisNodeOrAnySubNodesHasError = 1 << 22, // If this node or any of its children had an error
|
||||
HasAggregatedChildData = 1 << 23, // If we've computed data from children and cached it in this node
|
||||
|
||||
BlockScoped = Let | Const,
|
||||
|
||||
ReachabilityCheckFlags = HasImplicitReturn | HasExplicitReturn,
|
||||
EmitHelperFlags = HasClassExtends | HasDecorators | HasParamDecorators | HasAsyncFunctions | HasJsxSpreadAttributes,
|
||||
EmitHelperFlags = HasClassExtends | HasDecorators | HasParamDecorators | HasAsyncFunctions | HasSpreadAttribute,
|
||||
ReachabilityAndEmitFlags = ReachabilityCheckFlags | EmitHelperFlags,
|
||||
|
||||
// Parsing context flags
|
||||
@@ -455,7 +457,6 @@ namespace ts {
|
||||
Async = 1 << 8, // Property/Method/Function
|
||||
Default = 1 << 9, // Function/Class (export default declaration)
|
||||
Const = 1 << 11, // Variable declaration
|
||||
|
||||
HasComputedFlags = 1 << 29, // Modifier flags have been computed
|
||||
|
||||
AccessibilityModifier = Public | Private | Protected,
|
||||
@@ -651,7 +652,7 @@ namespace ts {
|
||||
export interface BindingElement extends Declaration {
|
||||
kind: SyntaxKind.BindingElement;
|
||||
propertyName?: PropertyName; // Binding property name (in object binding pattern)
|
||||
dotDotDotToken?: DotDotDotToken; // Present on rest binding element
|
||||
dotDotDotToken?: DotDotDotToken; // Present on rest element (in object binding pattern)
|
||||
name: BindingName; // Declared binding element name
|
||||
initializer?: Expression; // Optional initializer
|
||||
}
|
||||
@@ -677,7 +678,7 @@ namespace ts {
|
||||
name?: PropertyName;
|
||||
}
|
||||
|
||||
export type ObjectLiteralElementLike = PropertyAssignment | ShorthandPropertyAssignment | MethodDeclaration | AccessorDeclaration;
|
||||
export type ObjectLiteralElementLike = PropertyAssignment | ShorthandPropertyAssignment | MethodDeclaration | AccessorDeclaration | SpreadAssignment;
|
||||
|
||||
export interface PropertyAssignment extends ObjectLiteralElement {
|
||||
kind: SyntaxKind.PropertyAssignment;
|
||||
@@ -696,6 +697,11 @@ namespace ts {
|
||||
objectAssignmentInitializer?: Expression;
|
||||
}
|
||||
|
||||
export interface SpreadAssignment extends ObjectLiteralElement {
|
||||
kind: SyntaxKind.SpreadAssignment;
|
||||
expression: Expression;
|
||||
}
|
||||
|
||||
// SyntaxKind.VariableDeclaration
|
||||
// SyntaxKind.Parameter
|
||||
// SyntaxKind.BindingElement
|
||||
@@ -1289,8 +1295,8 @@ namespace ts {
|
||||
multiLine?: boolean;
|
||||
}
|
||||
|
||||
export interface SpreadElementExpression extends Expression {
|
||||
kind: SyntaxKind.SpreadElementExpression;
|
||||
export interface SpreadElement extends Expression {
|
||||
kind: SyntaxKind.SpreadElement;
|
||||
expression: Expression;
|
||||
}
|
||||
|
||||
@@ -2391,6 +2397,12 @@ namespace ts {
|
||||
CannotBeNamed
|
||||
}
|
||||
|
||||
/* @internal */
|
||||
export const enum SyntheticSymbolKind {
|
||||
UnionOrIntersection,
|
||||
Spread
|
||||
}
|
||||
|
||||
export const enum TypePredicateKind {
|
||||
This,
|
||||
Identifier
|
||||
@@ -2483,6 +2495,7 @@ namespace ts {
|
||||
getTypeReferenceDirectivesForSymbol(symbol: Symbol, meaning?: SymbolFlags): string[];
|
||||
isLiteralConstDeclaration(node: VariableDeclaration | PropertyDeclaration | PropertySignature | ParameterDeclaration): boolean;
|
||||
writeLiteralConstValue(node: VariableDeclaration | PropertyDeclaration | PropertySignature | ParameterDeclaration, writer: SymbolWriter): void;
|
||||
getJsxFactoryEntity(): EntityName;
|
||||
}
|
||||
|
||||
export const enum SymbolFlags {
|
||||
@@ -2602,7 +2615,9 @@ namespace ts {
|
||||
instantiations?: Map<Type>; // Instantiations of generic type alias (undefined if non-generic)
|
||||
mapper?: TypeMapper; // Type mapper for instantiation alias
|
||||
referenced?: boolean; // True if alias symbol has been referenced as a value
|
||||
containingType?: UnionOrIntersectionType; // Containing union or intersection type for synthetic property
|
||||
containingType?: UnionOrIntersectionType; // Containing union or intersection type for synthetic property
|
||||
leftSpread?: Symbol; // Left source for synthetic spread property
|
||||
rightSpread?: Symbol; // Right source for synthetic spread property
|
||||
hasNonUniformType?: boolean; // True if constituents have non-uniform types
|
||||
isPartial?: boolean; // True if syntheric property of union type occurs in some but not all constituents
|
||||
isDiscriminantProperty?: boolean; // True if discriminant synthetic property
|
||||
@@ -3101,6 +3116,7 @@ namespace ts {
|
||||
project?: string;
|
||||
/* @internal */ pretty?: DiagnosticStyle;
|
||||
reactNamespace?: string;
|
||||
jsxFactory?: string;
|
||||
removeComments?: boolean;
|
||||
rootDir?: string;
|
||||
rootDirs?: string[];
|
||||
@@ -3183,7 +3199,8 @@ namespace ts {
|
||||
ES2015 = 2,
|
||||
ES2016 = 3,
|
||||
ES2017 = 4,
|
||||
Latest = ES2017,
|
||||
ESNext = 5,
|
||||
Latest = ESNext,
|
||||
}
|
||||
|
||||
export const enum LanguageVariant {
|
||||
@@ -3498,32 +3515,34 @@ namespace ts {
|
||||
ContainsTypeScript = 1 << 1,
|
||||
Jsx = 1 << 2,
|
||||
ContainsJsx = 1 << 3,
|
||||
ES2017 = 1 << 4,
|
||||
ContainsES2017 = 1 << 5,
|
||||
ES2016 = 1 << 6,
|
||||
ContainsES2016 = 1 << 7,
|
||||
ES2015 = 1 << 8,
|
||||
ContainsES2015 = 1 << 9,
|
||||
Generator = 1 << 10,
|
||||
ContainsGenerator = 1 << 11,
|
||||
DestructuringAssignment = 1 << 12,
|
||||
ContainsDestructuringAssignment = 1 << 13,
|
||||
ESNext = 1 << 4,
|
||||
ContainsESNext = 1 << 5,
|
||||
ES2017 = 1 << 6,
|
||||
ContainsES2017 = 1 << 7,
|
||||
ES2016 = 1 << 8,
|
||||
ContainsES2016 = 1 << 9,
|
||||
ES2015 = 1 << 10,
|
||||
ContainsES2015 = 1 << 11,
|
||||
Generator = 1 << 12,
|
||||
ContainsGenerator = 1 << 13,
|
||||
DestructuringAssignment = 1 << 14,
|
||||
ContainsDestructuringAssignment = 1 << 15,
|
||||
|
||||
// Markers
|
||||
// - Flags used to indicate that a subtree contains a specific transformation.
|
||||
ContainsDecorators = 1 << 14,
|
||||
ContainsPropertyInitializer = 1 << 15,
|
||||
ContainsLexicalThis = 1 << 16,
|
||||
ContainsCapturedLexicalThis = 1 << 17,
|
||||
ContainsLexicalThisInComputedPropertyName = 1 << 18,
|
||||
ContainsDefaultValueAssignments = 1 << 19,
|
||||
ContainsParameterPropertyAssignments = 1 << 20,
|
||||
ContainsSpreadElementExpression = 1 << 21,
|
||||
ContainsComputedPropertyName = 1 << 22,
|
||||
ContainsBlockScopedBinding = 1 << 23,
|
||||
ContainsBindingPattern = 1 << 24,
|
||||
ContainsYield = 1 << 25,
|
||||
ContainsHoistedDeclarationOrCompletion = 1 << 26,
|
||||
ContainsDecorators = 1 << 16,
|
||||
ContainsPropertyInitializer = 1 << 17,
|
||||
ContainsLexicalThis = 1 << 18,
|
||||
ContainsCapturedLexicalThis = 1 << 19,
|
||||
ContainsLexicalThisInComputedPropertyName = 1 << 20,
|
||||
ContainsDefaultValueAssignments = 1 << 21,
|
||||
ContainsParameterPropertyAssignments = 1 << 22,
|
||||
ContainsSpreadExpression = 1 << 23,
|
||||
ContainsComputedPropertyName = 1 << 24,
|
||||
ContainsBlockScopedBinding = 1 << 25,
|
||||
ContainsBindingPattern = 1 << 26,
|
||||
ContainsYield = 1 << 27,
|
||||
ContainsHoistedDeclarationOrCompletion = 1 << 28,
|
||||
|
||||
HasComputedFlags = 1 << 29, // Transform flags have been computed.
|
||||
|
||||
@@ -3531,6 +3550,7 @@ namespace ts {
|
||||
// - Bitmasks that are used to assert facts about the syntax of a node and its subtree.
|
||||
AssertTypeScript = TypeScript | ContainsTypeScript,
|
||||
AssertJsx = Jsx | ContainsJsx,
|
||||
AssertESNext = ESNext | ContainsESNext,
|
||||
AssertES2017 = ES2017 | ContainsES2017,
|
||||
AssertES2016 = ES2016 | ContainsES2016,
|
||||
AssertES2015 = ES2015 | ContainsES2015,
|
||||
@@ -3540,7 +3560,7 @@ namespace ts {
|
||||
// Scope Exclusions
|
||||
// - Bitmasks that exclude flags from propagating out of a specific context
|
||||
// into the subtree flags of their container.
|
||||
NodeExcludes = TypeScript | Jsx | ES2017 | ES2016 | ES2015 | DestructuringAssignment | Generator | HasComputedFlags,
|
||||
NodeExcludes = TypeScript | Jsx | ESNext | ES2017 | ES2016 | ES2015 | DestructuringAssignment | Generator | HasComputedFlags,
|
||||
ArrowFunctionExcludes = NodeExcludes | ContainsDecorators | ContainsDefaultValueAssignments | ContainsLexicalThis | ContainsParameterPropertyAssignments | ContainsBlockScopedBinding | ContainsYield | ContainsHoistedDeclarationOrCompletion,
|
||||
FunctionExcludes = NodeExcludes | ContainsDecorators | ContainsDefaultValueAssignments | ContainsCapturedLexicalThis | ContainsLexicalThis | ContainsParameterPropertyAssignments | ContainsBlockScopedBinding | ContainsYield | ContainsHoistedDeclarationOrCompletion,
|
||||
ConstructorExcludes = NodeExcludes | ContainsDefaultValueAssignments | ContainsLexicalThis | ContainsCapturedLexicalThis | ContainsBlockScopedBinding | ContainsYield | ContainsHoistedDeclarationOrCompletion,
|
||||
@@ -3549,7 +3569,7 @@ namespace ts {
|
||||
ModuleExcludes = NodeExcludes | ContainsDecorators | ContainsLexicalThis | ContainsCapturedLexicalThis | ContainsBlockScopedBinding | ContainsHoistedDeclarationOrCompletion,
|
||||
TypeExcludes = ~ContainsTypeScript,
|
||||
ObjectLiteralExcludes = NodeExcludes | ContainsDecorators | ContainsComputedPropertyName | ContainsLexicalThisInComputedPropertyName,
|
||||
ArrayLiteralOrCallOrNewExcludes = NodeExcludes | ContainsSpreadElementExpression,
|
||||
ArrayLiteralOrCallOrNewExcludes = NodeExcludes | ContainsSpreadExpression,
|
||||
VariableDeclarationListExcludes = NodeExcludes | ContainsBindingPattern,
|
||||
ParameterExcludes = NodeExcludes | ContainsBindingPattern,
|
||||
|
||||
|
||||
@@ -485,6 +485,22 @@ namespace ts {
|
||||
return getFullWidth(name) === 0 ? "(Missing)" : getTextOfNode(name);
|
||||
}
|
||||
|
||||
export function getTextOfPropertyName(name: PropertyName): string {
|
||||
switch (name.kind) {
|
||||
case SyntaxKind.Identifier:
|
||||
return (<Identifier>name).text;
|
||||
case SyntaxKind.StringLiteral:
|
||||
case SyntaxKind.NumericLiteral:
|
||||
return (<LiteralExpression>name).text;
|
||||
case SyntaxKind.ComputedPropertyName:
|
||||
if (isStringOrNumericLiteral((<ComputedPropertyName>name).expression.kind)) {
|
||||
return (<LiteralExpression>(<ComputedPropertyName>name).expression).text;
|
||||
}
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
export function entityNameToString(name: EntityNameOrEntityNameExpression): string {
|
||||
switch (name.kind) {
|
||||
case SyntaxKind.Identifier:
|
||||
@@ -498,6 +514,10 @@ namespace ts {
|
||||
|
||||
export function createDiagnosticForNode(node: Node, message: DiagnosticMessage, arg0?: string | number, arg1?: string | number, arg2?: string | number): Diagnostic {
|
||||
const sourceFile = getSourceFileOfNode(node);
|
||||
return createDiagnosticForNodeInSourceFile(sourceFile, node, message, arg0, arg1, arg2);
|
||||
}
|
||||
|
||||
export function createDiagnosticForNodeInSourceFile(sourceFile: SourceFile, node: Node, message: DiagnosticMessage, arg0?: string | number, arg1?: string | number, arg2?: string | number): Diagnostic {
|
||||
const span = getErrorSpanForNode(sourceFile, node);
|
||||
return createFileDiagnostic(sourceFile, span.start, span.length, message, arg0, arg1, arg2);
|
||||
}
|
||||
@@ -1179,7 +1199,7 @@ namespace ts {
|
||||
case SyntaxKind.PostfixUnaryExpression:
|
||||
case SyntaxKind.BinaryExpression:
|
||||
case SyntaxKind.ConditionalExpression:
|
||||
case SyntaxKind.SpreadElementExpression:
|
||||
case SyntaxKind.SpreadElement:
|
||||
case SyntaxKind.TemplateExpression:
|
||||
case SyntaxKind.NoSubstitutionTemplateLiteral:
|
||||
case SyntaxKind.OmittedExpression:
|
||||
@@ -1641,7 +1661,7 @@ namespace ts {
|
||||
return (<ForInStatement | ForOfStatement>parent).initializer === node ? AssignmentKind.Definite : AssignmentKind.None;
|
||||
case SyntaxKind.ParenthesizedExpression:
|
||||
case SyntaxKind.ArrayLiteralExpression:
|
||||
case SyntaxKind.SpreadElementExpression:
|
||||
case SyntaxKind.SpreadElement:
|
||||
node = parent;
|
||||
break;
|
||||
case SyntaxKind.ShorthandPropertyAssignment:
|
||||
@@ -2226,7 +2246,7 @@ namespace ts {
|
||||
case SyntaxKind.YieldExpression:
|
||||
return 2;
|
||||
|
||||
case SyntaxKind.SpreadElementExpression:
|
||||
case SyntaxKind.SpreadElement:
|
||||
return 1;
|
||||
|
||||
default:
|
||||
@@ -3862,6 +3882,7 @@ namespace ts {
|
||||
const kind = node.kind;
|
||||
return kind === SyntaxKind.PropertyAssignment
|
||||
|| kind === SyntaxKind.ShorthandPropertyAssignment
|
||||
|| kind === SyntaxKind.SpreadAssignment
|
||||
|| kind === SyntaxKind.MethodDeclaration
|
||||
|| kind === SyntaxKind.GetAccessor
|
||||
|| kind === SyntaxKind.SetAccessor
|
||||
@@ -3949,8 +3970,8 @@ namespace ts {
|
||||
|| kind === SyntaxKind.NoSubstitutionTemplateLiteral;
|
||||
}
|
||||
|
||||
export function isSpreadElementExpression(node: Node): node is SpreadElementExpression {
|
||||
return node.kind === SyntaxKind.SpreadElementExpression;
|
||||
export function isSpreadExpression(node: Node): node is SpreadElement {
|
||||
return node.kind === SyntaxKind.SpreadElement;
|
||||
}
|
||||
|
||||
export function isExpressionWithTypeArguments(node: Node): node is ExpressionWithTypeArguments {
|
||||
@@ -4008,7 +4029,7 @@ namespace ts {
|
||||
|| kind === SyntaxKind.YieldExpression
|
||||
|| kind === SyntaxKind.ArrowFunction
|
||||
|| kind === SyntaxKind.BinaryExpression
|
||||
|| kind === SyntaxKind.SpreadElementExpression
|
||||
|| kind === SyntaxKind.SpreadElement
|
||||
|| kind === SyntaxKind.AsExpression
|
||||
|| kind === SyntaxKind.OmittedExpression
|
||||
|| isUnaryExpressionKind(kind);
|
||||
@@ -4310,6 +4331,7 @@ namespace ts {
|
||||
namespace ts {
|
||||
export function getDefaultLibFileName(options: CompilerOptions): string {
|
||||
switch (options.target) {
|
||||
case ScriptTarget.ESNext:
|
||||
case ScriptTarget.ES2017:
|
||||
return "lib.es2017.d.ts";
|
||||
case ScriptTarget.ES2016:
|
||||
|
||||
+14
-6
@@ -267,9 +267,9 @@ namespace ts {
|
||||
case SyntaxKind.VoidExpression:
|
||||
case SyntaxKind.AwaitExpression:
|
||||
case SyntaxKind.YieldExpression:
|
||||
case SyntaxKind.SpreadElementExpression:
|
||||
case SyntaxKind.SpreadElement:
|
||||
case SyntaxKind.NonNullExpression:
|
||||
result = reduceNode((<ParenthesizedExpression | DeleteExpression | TypeOfExpression | VoidExpression | AwaitExpression | YieldExpression | SpreadElementExpression | NonNullExpression>node).expression, f, result);
|
||||
result = reduceNode((<ParenthesizedExpression | DeleteExpression | TypeOfExpression | VoidExpression | AwaitExpression | YieldExpression | SpreadElement | NonNullExpression>node).expression, f, result);
|
||||
break;
|
||||
|
||||
case SyntaxKind.PrefixUnaryExpression:
|
||||
@@ -510,6 +510,10 @@ namespace ts {
|
||||
result = reduceNode((<ShorthandPropertyAssignment>node).objectAssignmentInitializer, f, result);
|
||||
break;
|
||||
|
||||
case SyntaxKind.SpreadAssignment:
|
||||
result = reduceNode((node as SpreadAssignment).expression, f, result);
|
||||
break;
|
||||
|
||||
// Top-level nodes
|
||||
case SyntaxKind.SourceFile:
|
||||
result = reduceLeft((<SourceFile>node).statements, f, result);
|
||||
@@ -872,9 +876,9 @@ namespace ts {
|
||||
return updateYield(<YieldExpression>node,
|
||||
visitNode((<YieldExpression>node).expression, visitor, isExpression));
|
||||
|
||||
case SyntaxKind.SpreadElementExpression:
|
||||
return updateSpread(<SpreadElementExpression>node,
|
||||
visitNode((<SpreadElementExpression>node).expression, visitor, isExpression));
|
||||
case SyntaxKind.SpreadElement:
|
||||
return updateSpread(<SpreadElement>node,
|
||||
visitNode((<SpreadElement>node).expression, visitor, isExpression));
|
||||
|
||||
case SyntaxKind.ClassExpression:
|
||||
return updateClassExpression(<ClassExpression>node,
|
||||
@@ -1127,7 +1131,11 @@ namespace ts {
|
||||
visitNode((<ShorthandPropertyAssignment>node).name, visitor, isIdentifier),
|
||||
visitNode((<ShorthandPropertyAssignment>node).objectAssignmentInitializer, visitor, isExpression));
|
||||
|
||||
// Top-level nodes
|
||||
case SyntaxKind.SpreadAssignment:
|
||||
return updateSpreadAssignment(node as SpreadAssignment,
|
||||
visitNode((node as SpreadAssignment).expression, visitor, isExpression));
|
||||
|
||||
// Top-level nodes
|
||||
case SyntaxKind.SourceFile:
|
||||
context.startLexicalEnvironment();
|
||||
return updateSourceFileNode(<SourceFile>node,
|
||||
|
||||
@@ -1026,7 +1026,7 @@ namespace FourSlash {
|
||||
ts.displayPartsToString(help.suffixDisplayParts), expected);
|
||||
}
|
||||
|
||||
public verifyCurrentParameterIsletiable(isVariable: boolean) {
|
||||
public verifyCurrentParameterIsVariable(isVariable: boolean) {
|
||||
const signature = this.getActiveSignatureHelpItem();
|
||||
assert.isOk(signature);
|
||||
assert.equal(isVariable, signature.isVariadic);
|
||||
@@ -1053,6 +1053,10 @@ namespace FourSlash {
|
||||
assert.equal(this.getActiveSignatureHelpItem().parameters.length, expectedCount);
|
||||
}
|
||||
|
||||
public verifyCurrentSignatureHelpIsVariadic(expected: boolean) {
|
||||
assert.equal(this.getActiveSignatureHelpItem().isVariadic, expected);
|
||||
}
|
||||
|
||||
public verifyCurrentSignatureHelpDocComment(docComment: string) {
|
||||
const actualDocComment = this.getActiveSignatureHelpItem().documentation;
|
||||
assert.equal(ts.displayPartsToString(actualDocComment), docComment, this.assertionMessageAtLastKnownMarker("current signature help doc comment"));
|
||||
@@ -3231,6 +3235,10 @@ namespace FourSlashInterface {
|
||||
this.state.verifySignatureHelpCount(expected);
|
||||
}
|
||||
|
||||
public signatureHelpCurrentArgumentListIsVariadic(expected: boolean) {
|
||||
this.state.verifyCurrentSignatureHelpIsVariadic(expected);
|
||||
}
|
||||
|
||||
public signatureHelpArgumentCountIs(expected: number) {
|
||||
this.state.verifySignatureHelpArgumentCount(expected);
|
||||
}
|
||||
|
||||
@@ -1483,7 +1483,7 @@ namespace Harness {
|
||||
}
|
||||
|
||||
if (typesError && symbolsError) {
|
||||
throw new Error(typesError.message + ts.sys.newLine + symbolsError.message);
|
||||
throw new Error(typesError.message + Harness.IO.newLine() + symbolsError.message);
|
||||
}
|
||||
|
||||
if (typesError) {
|
||||
@@ -1768,7 +1768,7 @@ namespace Harness {
|
||||
}
|
||||
|
||||
// Regex for parsing options in the format "@Alpha: Value of any sort"
|
||||
const optionRegex = /^[\/]{2}\s*@(\w+)\s*:\s*(\S*)/gm; // multiple matches on multiple lines
|
||||
const optionRegex = /^[\/]{2}\s*@(\w+)\s*:\s*([^\r\n]*)/gm; // multiple matches on multiple lines
|
||||
|
||||
function extractCompilerSettings(content: string): CompilerSettings {
|
||||
const opts: CompilerSettings = {};
|
||||
@@ -1777,7 +1777,7 @@ namespace Harness {
|
||||
/* tslint:disable:no-null-keyword */
|
||||
while ((match = optionRegex.exec(content)) !== null) {
|
||||
/* tslint:enable:no-null-keyword */
|
||||
opts[match[1]] = match[2];
|
||||
opts[match[1]] = match[2].trim();
|
||||
}
|
||||
|
||||
return opts;
|
||||
@@ -1805,7 +1805,7 @@ namespace Harness {
|
||||
// Comment line, check for global/file @options and record them
|
||||
optionRegex.lastIndex = 0;
|
||||
const metaDataName = testMetaData[1].toLowerCase();
|
||||
currentFileOptions[testMetaData[1]] = testMetaData[2];
|
||||
currentFileOptions[testMetaData[1]] = testMetaData[2].trim();
|
||||
if (metaDataName !== "filename") {
|
||||
continue;
|
||||
}
|
||||
@@ -1825,12 +1825,12 @@ namespace Harness {
|
||||
// Reset local data
|
||||
currentFileContent = undefined;
|
||||
currentFileOptions = {};
|
||||
currentFileName = testMetaData[2];
|
||||
currentFileName = testMetaData[2].trim();
|
||||
refs = [];
|
||||
}
|
||||
else {
|
||||
// First metadata marker in the file
|
||||
currentFileName = testMetaData[2];
|
||||
currentFileName = testMetaData[2].trim();
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -720,6 +720,10 @@ namespace Harness.LanguageService {
|
||||
clearImmediate(timeoutId: any): void {
|
||||
clearImmediate(timeoutId);
|
||||
}
|
||||
|
||||
createHash(s: string) {
|
||||
return s;
|
||||
}
|
||||
}
|
||||
|
||||
export class ServerLanguageServiceAdapter implements LanguageServiceAdapter {
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
"../compiler/visitor.ts",
|
||||
"../compiler/transformers/ts.ts",
|
||||
"../compiler/transformers/jsx.ts",
|
||||
"../compiler/transformers/esnext.ts",
|
||||
"../compiler/transformers/es2017.ts",
|
||||
"../compiler/transformers/es2016.ts",
|
||||
"../compiler/transformers/es2015.ts",
|
||||
|
||||
@@ -43,7 +43,8 @@ namespace ts {
|
||||
setTimeout,
|
||||
clearTimeout,
|
||||
setImmediate: typeof setImmediate !== "undefined" ? setImmediate : action => setTimeout(action, 0),
|
||||
clearImmediate: typeof clearImmediate !== "undefined" ? clearImmediate : clearTimeout
|
||||
clearImmediate: typeof clearImmediate !== "undefined" ? clearImmediate : clearTimeout,
|
||||
createHash: s => s
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -165,7 +165,7 @@ namespace ts {
|
||||
start: undefined,
|
||||
length: undefined,
|
||||
}, {
|
||||
messageText: "Argument for '--target' option must be: 'es3', 'es5', 'es6', 'es2015', 'es2016', 'es2017'",
|
||||
messageText: "Argument for '--target' option must be: 'es3', 'es5', 'es6', 'es2015', 'es2016', 'es2017', 'esnext'",
|
||||
category: ts.Diagnostics.Argument_for_0_option_must_be_Colon_1.category,
|
||||
code: ts.Diagnostics.Argument_for_0_option_must_be_Colon_1.code,
|
||||
|
||||
|
||||
@@ -176,7 +176,7 @@ namespace ts {
|
||||
file: undefined,
|
||||
start: 0,
|
||||
length: 0,
|
||||
messageText: "Argument for '--target' option must be: 'es3', 'es5', 'es6', 'es2015', 'es2016', 'es2017'",
|
||||
messageText: "Argument for '--target' option must be: 'es3', 'es5', 'es6', 'es2015', 'es2016', 'es2017', 'esnext'",
|
||||
code: Diagnostics.Argument_for_0_option_must_be_Colon_1.code,
|
||||
category: Diagnostics.Argument_for_0_option_must_be_Colon_1.category
|
||||
}]
|
||||
|
||||
@@ -24,7 +24,8 @@ namespace ts.server {
|
||||
setTimeout() { return 0; },
|
||||
clearTimeout: noop,
|
||||
setImmediate: () => 0,
|
||||
clearImmediate: noop
|
||||
clearImmediate: noop,
|
||||
createHash: s => s
|
||||
};
|
||||
const nullCancellationToken: HostCancellationToken = { isCancellationRequested: () => false };
|
||||
const mockLogger: Logger = {
|
||||
|
||||
@@ -385,6 +385,10 @@ var x = 0;`, {
|
||||
options: { compilerOptions: { reactNamespace: "react" }, fileName: "input.js", reportDiagnostics: true }
|
||||
});
|
||||
|
||||
transpilesCorrectly("Supports setting 'jsxFactory'", "x;", {
|
||||
options: { compilerOptions: { jsxFactory: "createElement" }, fileName: "input.js", reportDiagnostics: true }
|
||||
});
|
||||
|
||||
transpilesCorrectly("Supports setting 'removeComments'", "x;", {
|
||||
options: { compilerOptions: { removeComments: true }, fileName: "input.js", reportDiagnostics: true }
|
||||
});
|
||||
|
||||
@@ -434,6 +434,10 @@ namespace ts.projectSystem {
|
||||
};
|
||||
}
|
||||
|
||||
createHash(s: string): string {
|
||||
return s;
|
||||
}
|
||||
|
||||
triggerDirectoryWatcherCallback(directoryName: string, fileName: string): void {
|
||||
const path = this.toPath(directoryName);
|
||||
const callbacks = this.watchedDirectories[path];
|
||||
|
||||
+1
-12
@@ -5,15 +5,6 @@
|
||||
|
||||
namespace ts.server {
|
||||
|
||||
interface Hash {
|
||||
update(data: any, input_encoding?: string): Hash;
|
||||
digest(encoding: string): any;
|
||||
}
|
||||
|
||||
const crypto: {
|
||||
createHash(algorithm: string): Hash
|
||||
} = require("crypto");
|
||||
|
||||
export function shouldEmitFile(scriptInfo: ScriptInfo) {
|
||||
return !scriptInfo.hasMixedContent;
|
||||
}
|
||||
@@ -49,9 +40,7 @@ namespace ts.server {
|
||||
}
|
||||
|
||||
private computeHash(text: string): string {
|
||||
return crypto.createHash("md5")
|
||||
.update(text)
|
||||
.digest("base64");
|
||||
return this.project.projectService.host.createHash(text);
|
||||
}
|
||||
|
||||
private getSourceFile(): SourceFile {
|
||||
|
||||
@@ -250,6 +250,8 @@ namespace ts.server {
|
||||
readonly typingsInstaller: ITypingsInstaller = nullTypingsInstaller,
|
||||
private readonly eventHandler?: ProjectServiceEventHandler) {
|
||||
|
||||
Debug.assert(!!host.createHash, "'ServerHost.createHash' is required for ProjectService");
|
||||
|
||||
this.toCanonicalFileName = createGetCanonicalFileName(host.useCaseSensitiveFileNames);
|
||||
this.directoryWatchers = new DirectoryWatchers(this);
|
||||
this.throttledOperations = new ThrottledOperations(host);
|
||||
|
||||
@@ -264,7 +264,7 @@ namespace ts.BreakpointResolver {
|
||||
// a or ...c or d: x from
|
||||
// [a, b, ...c] or { a, b } or { d: x } from destructuring pattern
|
||||
if ((node.kind === SyntaxKind.Identifier ||
|
||||
node.kind == SyntaxKind.SpreadElementExpression ||
|
||||
node.kind == SyntaxKind.SpreadElement ||
|
||||
node.kind === SyntaxKind.PropertyAssignment ||
|
||||
node.kind === SyntaxKind.ShorthandPropertyAssignment) &&
|
||||
isArrayLiteralOrObjectLiteralDestructuringPattern(node.parent)) {
|
||||
|
||||
@@ -557,7 +557,9 @@ namespace ts.SignatureHelp {
|
||||
addRange(prefixDisplayParts, callTargetDisplayParts);
|
||||
}
|
||||
|
||||
let isVariadic: boolean;
|
||||
if (isTypeParameterList) {
|
||||
isVariadic = false; // type parameter lists are not variadic
|
||||
prefixDisplayParts.push(punctuationPart(SyntaxKind.LessThanToken));
|
||||
const typeParameters = candidateSignature.typeParameters;
|
||||
signatureHelpParameters = typeParameters && typeParameters.length > 0 ? map(typeParameters, createSignatureHelpParameterForTypeParameter) : emptyArray;
|
||||
@@ -567,6 +569,7 @@ namespace ts.SignatureHelp {
|
||||
addRange(suffixDisplayParts, parameterParts);
|
||||
}
|
||||
else {
|
||||
isVariadic = candidateSignature.hasRestParameter;
|
||||
const typeParameterParts = mapToDisplayParts(writer =>
|
||||
typeChecker.getSymbolDisplayBuilder().buildDisplayForTypeParametersAndDelimiters(candidateSignature.typeParameters, writer, invocation));
|
||||
addRange(prefixDisplayParts, typeParameterParts);
|
||||
@@ -582,7 +585,7 @@ namespace ts.SignatureHelp {
|
||||
addRange(suffixDisplayParts, returnTypeParts);
|
||||
|
||||
return {
|
||||
isVariadic: candidateSignature.hasRestParameter,
|
||||
isVariadic,
|
||||
prefixDisplayParts,
|
||||
suffixDisplayParts,
|
||||
separatorDisplayParts: [punctuationPart(SyntaxKind.CommaToken), spacePart()],
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
"../compiler/visitor.ts",
|
||||
"../compiler/transformers/ts.ts",
|
||||
"../compiler/transformers/jsx.ts",
|
||||
"../compiler/transformers/esnext.ts",
|
||||
"../compiler/transformers/es2017.ts",
|
||||
"../compiler/transformers/es2016.ts",
|
||||
"../compiler/transformers/es2015.ts",
|
||||
|
||||
@@ -530,8 +530,8 @@ namespace ts {
|
||||
case SyntaxKind.DeleteExpression:
|
||||
case SyntaxKind.VoidExpression:
|
||||
case SyntaxKind.YieldExpression:
|
||||
case SyntaxKind.SpreadElementExpression:
|
||||
const unaryWordExpression = (<TypeOfExpression | DeleteExpression | VoidExpression | YieldExpression | SpreadElementExpression>n);
|
||||
case SyntaxKind.SpreadElement:
|
||||
const unaryWordExpression = n as (TypeOfExpression | DeleteExpression | VoidExpression | YieldExpression | SpreadElement);
|
||||
return isCompletedNode(unaryWordExpression.expression, sourceFile);
|
||||
|
||||
case SyntaxKind.TaggedTemplateExpression:
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
tests/cases/compiler/a.js(4,12): error TS8010: 'types' can only be used in a .ts file.
|
||||
|
||||
|
||||
==== tests/cases/compiler/a.js (1 errors) ====
|
||||
|
||||
@SomeDecorator
|
||||
class SomeClass {
|
||||
foo(x: number) {
|
||||
~~~~~~
|
||||
!!! error TS8010: 'types' can only be used in a .ts file.
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
tests/cases/compiler/a.js(3,7): error TS1219: Experimental support for decorators is a feature that is subject to change in a future release. Set the 'experimentalDecorators' option to remove this warning.
|
||||
tests/cases/compiler/a.js(4,12): error TS8010: 'types' can only be used in a .ts file.
|
||||
|
||||
|
||||
==== tests/cases/compiler/a.js (2 errors) ====
|
||||
|
||||
@SomeDecorator
|
||||
class SomeClass {
|
||||
~~~~~~~~~
|
||||
!!! error TS1219: Experimental support for decorators is a feature that is subject to change in a future release. Set the 'experimentalDecorators' option to remove this warning.
|
||||
foo(x: number) {
|
||||
~~~~~~
|
||||
!!! error TS8010: 'types' can only be used in a .ts file.
|
||||
|
||||
}
|
||||
}
|
||||
+6
-20
@@ -5,16 +5,12 @@ tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAs
|
||||
tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts(4,6): error TS2459: Type 'string | number | {}' has no property 'i1' and no string index signature.
|
||||
tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts(5,12): error TS2525: Initializer provides no value for this binding element and the binding element has no default value.
|
||||
tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts(5,21): error TS2353: Object literal may only specify known properties, and 'f212' does not exist in type '{ f21: any; }'.
|
||||
tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts(6,7): error TS1180: Property destructuring pattern expected.
|
||||
tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts(7,5): error TS2353: Object literal may only specify known properties, and 'a' does not exist in type '{ d1: any; }'.
|
||||
tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts(7,11): error TS2353: Object literal may only specify known properties, and 'b' does not exist in type '{ d1: any; }'.
|
||||
tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts(7,24): error TS2353: Object literal may only specify known properties, and 'e' does not exist in type '{ d1: any; }'.
|
||||
tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts(9,7): error TS1005: ':' expected.
|
||||
tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts(9,15): error TS1005: ':' expected.
|
||||
tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts(10,12): error TS1005: ':' expected.
|
||||
tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts(6,7): error TS1005: ':' expected.
|
||||
tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts(6,15): error TS1005: ':' expected.
|
||||
tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts(7,12): error TS1005: ':' expected.
|
||||
|
||||
|
||||
==== tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts (13 errors) ====
|
||||
==== tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts (9 errors) ====
|
||||
// Error
|
||||
var {h?} = { h?: 1 };
|
||||
~
|
||||
@@ -33,17 +29,6 @@ tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAs
|
||||
!!! error TS2525: Initializer provides no value for this binding element and the binding element has no default value.
|
||||
~~~~
|
||||
!!! error TS2353: Object literal may only specify known properties, and 'f212' does not exist in type '{ f21: any; }'.
|
||||
var { ...d1 } = {
|
||||
~~~
|
||||
!!! error TS1180: Property destructuring pattern expected.
|
||||
a: 1, b: 1, d1: 9, e: 10
|
||||
~
|
||||
!!! error TS2353: Object literal may only specify known properties, and 'a' does not exist in type '{ d1: any; }'.
|
||||
~
|
||||
!!! error TS2353: Object literal may only specify known properties, and 'b' does not exist in type '{ d1: any; }'.
|
||||
~
|
||||
!!! error TS2353: Object literal may only specify known properties, and 'e' does not exist in type '{ d1: any; }'.
|
||||
}
|
||||
var {1} = { 1 };
|
||||
~
|
||||
!!! error TS1005: ':' expected.
|
||||
@@ -51,4 +36,5 @@ tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAs
|
||||
!!! error TS1005: ':' expected.
|
||||
var {"prop"} = { "prop": 1 };
|
||||
~
|
||||
!!! error TS1005: ':' expected.
|
||||
!!! error TS1005: ':' expected.
|
||||
|
||||
@@ -4,11 +4,9 @@ var {h?} = { h?: 1 };
|
||||
var {i}: string | number = { i: 2 };
|
||||
var {i1}: string | number| {} = { i1: 2 };
|
||||
var { f2: {f21} = { f212: "string" } }: any = undefined;
|
||||
var { ...d1 } = {
|
||||
a: 1, b: 1, d1: 9, e: 10
|
||||
}
|
||||
var {1} = { 1 };
|
||||
var {"prop"} = { "prop": 1 };
|
||||
var {"prop"} = { "prop": 1 };
|
||||
|
||||
|
||||
//// [destructuringObjectBindingPatternAndAssignment3.js]
|
||||
// Error
|
||||
@@ -16,8 +14,5 @@ var h = { h: 1 }.h;
|
||||
var i = { i: 2 }.i;
|
||||
var i1 = { i1: 2 }.i1;
|
||||
var _a = undefined.f2, f21 = (_a === void 0 ? { f212: "string" } : _a).f21;
|
||||
var d1 = {
|
||||
a: 1, b: 1, d1: 9, e: 10
|
||||
}.d1;
|
||||
var = { 1: }[1];
|
||||
var = { "prop": 1 }["prop"];
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
tests/cases/conformance/types/spread/interfaceSpread.ts(2,5): error TS2698: Interface declaration cannot contain a spread property.
|
||||
tests/cases/conformance/types/spread/interfaceSpread.ts(7,10): error TS2339: Property 'jam' does not exist on type 'Congealed<{ jam: number; }, { peanutButter: number; }>'.
|
||||
tests/cases/conformance/types/spread/interfaceSpread.ts(8,10): error TS2339: Property 'peanutButter' does not exist on type 'Congealed<{ jam: number; }, { peanutButter: number; }>'.
|
||||
|
||||
|
||||
==== tests/cases/conformance/types/spread/interfaceSpread.ts (3 errors) ====
|
||||
interface Congealed<T, U> {
|
||||
...T
|
||||
~~~~
|
||||
!!! error TS2698: Interface declaration cannot contain a spread property.
|
||||
...U
|
||||
}
|
||||
|
||||
let sandwich: Congealed<{jam: number }, { peanutButter: number }>;
|
||||
sandwich.jam;
|
||||
~~~
|
||||
!!! error TS2339: Property 'jam' does not exist on type 'Congealed<{ jam: number; }, { peanutButter: number; }>'.
|
||||
sandwich.peanutButter;
|
||||
~~~~~~~~~~~~
|
||||
!!! error TS2339: Property 'peanutButter' does not exist on type 'Congealed<{ jam: number; }, { peanutButter: number; }>'.
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
//// [interfaceSpread.ts]
|
||||
interface Congealed<T, U> {
|
||||
...T
|
||||
...U
|
||||
}
|
||||
|
||||
let sandwich: Congealed<{jam: number }, { peanutButter: number }>;
|
||||
sandwich.jam;
|
||||
sandwich.peanutButter;
|
||||
|
||||
|
||||
//// [interfaceSpread.js]
|
||||
var sandwich;
|
||||
sandwich.jam;
|
||||
sandwich.peanutButter;
|
||||
@@ -0,0 +1,16 @@
|
||||
error TS5055: Cannot write file 'tests/cases/compiler/a.js' because it would overwrite input file.
|
||||
Adding a tsconfig.json file will help organize projects that contain both TypeScript and JavaScript files. Learn more at https://aka.ms/tsconfig
|
||||
tests/cases/compiler/a.js(1,1): error TS8009: 'abstract' can only be used in a .ts file.
|
||||
tests/cases/compiler/a.js(2,5): error TS8009: 'abstract' can only be used in a .ts file.
|
||||
|
||||
|
||||
!!! error TS5055: Cannot write file 'tests/cases/compiler/a.js' because it would overwrite input file.
|
||||
!!! error TS5055: Adding a tsconfig.json file will help organize projects that contain both TypeScript and JavaScript files. Learn more at https://aka.ms/tsconfig
|
||||
==== tests/cases/compiler/a.js (2 errors) ====
|
||||
abstract class c {
|
||||
~~~~~~~~
|
||||
!!! error TS8009: 'abstract' can only be used in a .ts file.
|
||||
abstract x;
|
||||
~~~~~~~~
|
||||
!!! error TS8009: 'abstract' can only be used in a .ts file.
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
=== tests/cases/compiler/a.js ===
|
||||
const c = 10;
|
||||
>c : Symbol(c, Decl(a.js, 0, 5))
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
=== tests/cases/compiler/a.js ===
|
||||
const c = 10;
|
||||
>c : 10
|
||||
>10 : 10
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
error TS5053: Option 'reactNamespace' cannot be specified with option 'jsxFactory'.
|
||||
|
||||
|
||||
!!! error TS5053: Option 'reactNamespace' cannot be specified with option 'jsxFactory'.
|
||||
==== tests/cases/compiler/Element.ts (0 errors) ====
|
||||
|
||||
declare namespace JSX {
|
||||
interface Element {
|
||||
name: string;
|
||||
isIntrinsic: boolean;
|
||||
isCustomElement: boolean;
|
||||
toString(renderId?: number): string;
|
||||
bindDOM(renderId?: number): number;
|
||||
resetComponent(): void;
|
||||
instantiateComponents(renderId?: number): number;
|
||||
props: any;
|
||||
}
|
||||
}
|
||||
export namespace Element {
|
||||
export function isElement(el: any): el is JSX.Element {
|
||||
return el.markAsChildOfRootElement !== undefined;
|
||||
}
|
||||
|
||||
export function createElement(args: any[]) {
|
||||
|
||||
return {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export let createElement = Element.createElement;
|
||||
|
||||
function toCamelCase(text: string): string {
|
||||
return text[0].toLowerCase() + text.substring(1);
|
||||
}
|
||||
|
||||
==== tests/cases/compiler/test.tsx (0 errors) ====
|
||||
import { Element} from './Element';
|
||||
|
||||
let c: {
|
||||
a?: {
|
||||
b: string
|
||||
}
|
||||
};
|
||||
|
||||
class A {
|
||||
view() {
|
||||
return [
|
||||
<meta content="helloworld"></meta>,
|
||||
<meta content={c.a!.b}></meta>
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
//// [tests/cases/compiler/jsxFactoryAndReactNamespace.ts] ////
|
||||
|
||||
//// [Element.ts]
|
||||
|
||||
declare namespace JSX {
|
||||
interface Element {
|
||||
name: string;
|
||||
isIntrinsic: boolean;
|
||||
isCustomElement: boolean;
|
||||
toString(renderId?: number): string;
|
||||
bindDOM(renderId?: number): number;
|
||||
resetComponent(): void;
|
||||
instantiateComponents(renderId?: number): number;
|
||||
props: any;
|
||||
}
|
||||
}
|
||||
export namespace Element {
|
||||
export function isElement(el: any): el is JSX.Element {
|
||||
return el.markAsChildOfRootElement !== undefined;
|
||||
}
|
||||
|
||||
export function createElement(args: any[]) {
|
||||
|
||||
return {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export let createElement = Element.createElement;
|
||||
|
||||
function toCamelCase(text: string): string {
|
||||
return text[0].toLowerCase() + text.substring(1);
|
||||
}
|
||||
|
||||
//// [test.tsx]
|
||||
import { Element} from './Element';
|
||||
|
||||
let c: {
|
||||
a?: {
|
||||
b: string
|
||||
}
|
||||
};
|
||||
|
||||
class A {
|
||||
view() {
|
||||
return [
|
||||
<meta content="helloworld"></meta>,
|
||||
<meta content={c.a!.b}></meta>
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
//// [Element.js]
|
||||
"use strict";
|
||||
var Element;
|
||||
(function (Element) {
|
||||
function isElement(el) {
|
||||
return el.markAsChildOfRootElement !== undefined;
|
||||
}
|
||||
Element.isElement = isElement;
|
||||
function createElement(args) {
|
||||
return {};
|
||||
}
|
||||
Element.createElement = createElement;
|
||||
})(Element = exports.Element || (exports.Element = {}));
|
||||
exports.createElement = Element.createElement;
|
||||
function toCamelCase(text) {
|
||||
return text[0].toLowerCase() + text.substring(1);
|
||||
}
|
||||
//// [test.js]
|
||||
"use strict";
|
||||
const Element_1 = require("./Element");
|
||||
let c;
|
||||
class A {
|
||||
view() {
|
||||
return [
|
||||
Element_1.Element.createElement("meta", { content: "helloworld" }),
|
||||
Element_1.Element.createElement("meta", { content: c.a.b })
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
//// [tests/cases/compiler/jsxFactoryIdentifier.ts] ////
|
||||
|
||||
//// [Element.ts]
|
||||
|
||||
declare namespace JSX {
|
||||
interface Element {
|
||||
name: string;
|
||||
isIntrinsic: boolean;
|
||||
isCustomElement: boolean;
|
||||
toString(renderId?: number): string;
|
||||
bindDOM(renderId?: number): number;
|
||||
resetComponent(): void;
|
||||
instantiateComponents(renderId?: number): number;
|
||||
props: any;
|
||||
}
|
||||
}
|
||||
export namespace Element {
|
||||
export function isElement(el: any): el is JSX.Element {
|
||||
return el.markAsChildOfRootElement !== undefined;
|
||||
}
|
||||
|
||||
export function createElement(args: any[]) {
|
||||
|
||||
return {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export let createElement = Element.createElement;
|
||||
|
||||
function toCamelCase(text: string): string {
|
||||
return text[0].toLowerCase() + text.substring(1);
|
||||
}
|
||||
|
||||
//// [test.tsx]
|
||||
import { Element} from './Element';
|
||||
let createElement = Element.createElement;
|
||||
let c: {
|
||||
a?: {
|
||||
b: string
|
||||
}
|
||||
};
|
||||
|
||||
class A {
|
||||
view() {
|
||||
return [
|
||||
<meta content="helloworld"></meta>,
|
||||
<meta content={c.a!.b}></meta>
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
//// [Element.js]
|
||||
"use strict";
|
||||
var Element;
|
||||
(function (Element) {
|
||||
function isElement(el) {
|
||||
return el.markAsChildOfRootElement !== undefined;
|
||||
}
|
||||
Element.isElement = isElement;
|
||||
function createElement(args) {
|
||||
return {};
|
||||
}
|
||||
Element.createElement = createElement;
|
||||
})(Element = exports.Element || (exports.Element = {}));
|
||||
exports.createElement = Element.createElement;
|
||||
function toCamelCase(text) {
|
||||
return text[0].toLowerCase() + text.substring(1);
|
||||
}
|
||||
//# sourceMappingURL=Element.js.map//// [test.js]
|
||||
"use strict";
|
||||
const Element_1 = require("./Element");
|
||||
let createElement = Element_1.Element.createElement;
|
||||
let c;
|
||||
class A {
|
||||
view() {
|
||||
return [
|
||||
createElement("meta", { content: "helloworld" }),
|
||||
createElement("meta", { content: c.a.b })
|
||||
];
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=test.js.map
|
||||
@@ -0,0 +1,3 @@
|
||||
//// [Element.js.map]
|
||||
{"version":3,"file":"Element.js","sourceRoot":"","sources":["Element.ts"],"names":[],"mappings":";AAaA,IAAiB,OAAO,CAUvB;AAVD,WAAiB,OAAO;IACpB,mBAA0B,EAAO;QAC7B,MAAM,CAAC,EAAE,CAAC,wBAAwB,KAAK,SAAS,CAAC;IACrD,CAAC;IAFe,iBAAS,YAExB,CAAA;IAED,uBAA8B,IAAW;QAErC,MAAM,CAAC,EACN,CAAA;IACL,CAAC;IAJe,qBAAa,gBAI5B,CAAA;AACL,CAAC,EAVgB,OAAO,GAAP,eAAO,KAAP,eAAO,QAUvB;AAEU,QAAA,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;AAEjD,qBAAqB,IAAY;IAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC"}//// [test.js.map]
|
||||
{"version":3,"file":"test.js","sourceRoot":"","sources":["test.tsx"],"names":[],"mappings":";AAAA,uCAAmC;AACnC,IAAI,aAAa,GAAG,iBAAO,CAAC,aAAa,CAAC;AAC1C,IAAI,CAIH,CAAC;AAEF;IACC,IAAI;QACH,MAAM,CAAC;YACN,wBAAM,OAAO,EAAC,YAAY,GAAQ;YAClC,wBAAM,OAAO,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC,GAAS;SAC9B,CAAC;IACH,CAAC;CACD"}
|
||||
@@ -0,0 +1,520 @@
|
||||
===================================================================
|
||||
JsFile: Element.js
|
||||
mapUrl: Element.js.map
|
||||
sourceRoot:
|
||||
sources: Element.ts
|
||||
===================================================================
|
||||
-------------------------------------------------------------------
|
||||
emittedFile:tests/cases/compiler/Element.js
|
||||
sourceFile:Element.ts
|
||||
-------------------------------------------------------------------
|
||||
>>>"use strict";
|
||||
>>>var Element;
|
||||
1 >
|
||||
2 >^^^^
|
||||
3 > ^^^^^^^
|
||||
4 > ^
|
||||
5 > ^^^^^^^^^^->
|
||||
1 >
|
||||
>declare namespace JSX {
|
||||
> interface Element {
|
||||
> name: string;
|
||||
> isIntrinsic: boolean;
|
||||
> isCustomElement: boolean;
|
||||
> toString(renderId?: number): string;
|
||||
> bindDOM(renderId?: number): number;
|
||||
> resetComponent(): void;
|
||||
> instantiateComponents(renderId?: number): number;
|
||||
> props: any;
|
||||
> }
|
||||
>}
|
||||
>
|
||||
2 >export namespace
|
||||
3 > Element
|
||||
4 > {
|
||||
> export function isElement(el: any): el is JSX.Element {
|
||||
> return el.markAsChildOfRootElement !== undefined;
|
||||
> }
|
||||
>
|
||||
> export function createElement(args: any[]) {
|
||||
>
|
||||
> return {
|
||||
> }
|
||||
> }
|
||||
> }
|
||||
1 >Emitted(2, 1) Source(14, 1) + SourceIndex(0)
|
||||
2 >Emitted(2, 5) Source(14, 18) + SourceIndex(0)
|
||||
3 >Emitted(2, 12) Source(14, 25) + SourceIndex(0)
|
||||
4 >Emitted(2, 13) Source(24, 2) + SourceIndex(0)
|
||||
---
|
||||
>>>(function (Element) {
|
||||
1->
|
||||
2 >^^^^^^^^^^^
|
||||
3 > ^^^^^^^
|
||||
4 > ^^^^^^^^^^^->
|
||||
1->
|
||||
2 >export namespace
|
||||
3 > Element
|
||||
1->Emitted(3, 1) Source(14, 1) + SourceIndex(0)
|
||||
2 >Emitted(3, 12) Source(14, 18) + SourceIndex(0)
|
||||
3 >Emitted(3, 19) Source(14, 25) + SourceIndex(0)
|
||||
---
|
||||
>>> function isElement(el) {
|
||||
1->^^^^
|
||||
2 > ^^^^^^^^^^^^^^^^^^^
|
||||
3 > ^^
|
||||
4 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
|
||||
1-> {
|
||||
>
|
||||
2 > export function isElement(
|
||||
3 > el: any
|
||||
1->Emitted(4, 5) Source(15, 5) + SourceIndex(0)
|
||||
2 >Emitted(4, 24) Source(15, 31) + SourceIndex(0)
|
||||
3 >Emitted(4, 26) Source(15, 38) + SourceIndex(0)
|
||||
---
|
||||
>>> return el.markAsChildOfRootElement !== undefined;
|
||||
1->^^^^^^^^
|
||||
2 > ^^^^^^
|
||||
3 > ^
|
||||
4 > ^^
|
||||
5 > ^
|
||||
6 > ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
7 > ^^^^^
|
||||
8 > ^^^^^^^^^
|
||||
9 > ^
|
||||
1->): el is JSX.Element {
|
||||
>
|
||||
2 > return
|
||||
3 >
|
||||
4 > el
|
||||
5 > .
|
||||
6 > markAsChildOfRootElement
|
||||
7 > !==
|
||||
8 > undefined
|
||||
9 > ;
|
||||
1->Emitted(5, 9) Source(16, 9) + SourceIndex(0)
|
||||
2 >Emitted(5, 15) Source(16, 15) + SourceIndex(0)
|
||||
3 >Emitted(5, 16) Source(16, 16) + SourceIndex(0)
|
||||
4 >Emitted(5, 18) Source(16, 18) + SourceIndex(0)
|
||||
5 >Emitted(5, 19) Source(16, 19) + SourceIndex(0)
|
||||
6 >Emitted(5, 43) Source(16, 43) + SourceIndex(0)
|
||||
7 >Emitted(5, 48) Source(16, 48) + SourceIndex(0)
|
||||
8 >Emitted(5, 57) Source(16, 57) + SourceIndex(0)
|
||||
9 >Emitted(5, 58) Source(16, 58) + SourceIndex(0)
|
||||
---
|
||||
>>> }
|
||||
1 >^^^^
|
||||
2 > ^
|
||||
3 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
|
||||
1 >
|
||||
>
|
||||
2 > }
|
||||
1 >Emitted(6, 5) Source(17, 5) + SourceIndex(0)
|
||||
2 >Emitted(6, 6) Source(17, 6) + SourceIndex(0)
|
||||
---
|
||||
>>> Element.isElement = isElement;
|
||||
1->^^^^
|
||||
2 > ^^^^^^^^^^^^^^^^^
|
||||
3 > ^^^^^^^^^^^^
|
||||
4 > ^
|
||||
5 > ^->
|
||||
1->
|
||||
2 > isElement
|
||||
3 > (el: any): el is JSX.Element {
|
||||
> return el.markAsChildOfRootElement !== undefined;
|
||||
> }
|
||||
4 >
|
||||
1->Emitted(7, 5) Source(15, 21) + SourceIndex(0)
|
||||
2 >Emitted(7, 22) Source(15, 30) + SourceIndex(0)
|
||||
3 >Emitted(7, 34) Source(17, 6) + SourceIndex(0)
|
||||
4 >Emitted(7, 35) Source(17, 6) + SourceIndex(0)
|
||||
---
|
||||
>>> function createElement(args) {
|
||||
1->^^^^
|
||||
2 > ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
3 > ^^^^
|
||||
1->
|
||||
>
|
||||
>
|
||||
2 > export function createElement(
|
||||
3 > args: any[]
|
||||
1->Emitted(8, 5) Source(19, 5) + SourceIndex(0)
|
||||
2 >Emitted(8, 28) Source(19, 35) + SourceIndex(0)
|
||||
3 >Emitted(8, 32) Source(19, 46) + SourceIndex(0)
|
||||
---
|
||||
>>> return {};
|
||||
1 >^^^^^^^^
|
||||
2 > ^^^^^^
|
||||
3 > ^
|
||||
4 > ^^
|
||||
5 > ^
|
||||
1 >) {
|
||||
>
|
||||
>
|
||||
2 > return
|
||||
3 >
|
||||
4 > {
|
||||
> }
|
||||
5 >
|
||||
1 >Emitted(9, 9) Source(21, 9) + SourceIndex(0)
|
||||
2 >Emitted(9, 15) Source(21, 15) + SourceIndex(0)
|
||||
3 >Emitted(9, 16) Source(21, 16) + SourceIndex(0)
|
||||
4 >Emitted(9, 18) Source(22, 10) + SourceIndex(0)
|
||||
5 >Emitted(9, 19) Source(22, 10) + SourceIndex(0)
|
||||
---
|
||||
>>> }
|
||||
1 >^^^^
|
||||
2 > ^
|
||||
3 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
|
||||
1 >
|
||||
>
|
||||
2 > }
|
||||
1 >Emitted(10, 5) Source(23, 5) + SourceIndex(0)
|
||||
2 >Emitted(10, 6) Source(23, 6) + SourceIndex(0)
|
||||
---
|
||||
>>> Element.createElement = createElement;
|
||||
1->^^^^
|
||||
2 > ^^^^^^^^^^^^^^^^^^^^^
|
||||
3 > ^^^^^^^^^^^^^^^^
|
||||
4 > ^
|
||||
5 > ^^^^^^^^^^^^^^^->
|
||||
1->
|
||||
2 > createElement
|
||||
3 > (args: any[]) {
|
||||
>
|
||||
> return {
|
||||
> }
|
||||
> }
|
||||
4 >
|
||||
1->Emitted(11, 5) Source(19, 21) + SourceIndex(0)
|
||||
2 >Emitted(11, 26) Source(19, 34) + SourceIndex(0)
|
||||
3 >Emitted(11, 42) Source(23, 6) + SourceIndex(0)
|
||||
4 >Emitted(11, 43) Source(23, 6) + SourceIndex(0)
|
||||
---
|
||||
>>>})(Element = exports.Element || (exports.Element = {}));
|
||||
1->
|
||||
2 >^
|
||||
3 > ^^
|
||||
4 > ^^^^^^^
|
||||
5 > ^^^
|
||||
6 > ^^^^^^^^^^^^^^^
|
||||
7 > ^^^^^
|
||||
8 > ^^^^^^^^^^^^^^^
|
||||
9 > ^^^^^^^^
|
||||
1->
|
||||
>
|
||||
2 >}
|
||||
3 >
|
||||
4 > Element
|
||||
5 >
|
||||
6 > Element
|
||||
7 >
|
||||
8 > Element
|
||||
9 > {
|
||||
> export function isElement(el: any): el is JSX.Element {
|
||||
> return el.markAsChildOfRootElement !== undefined;
|
||||
> }
|
||||
>
|
||||
> export function createElement(args: any[]) {
|
||||
>
|
||||
> return {
|
||||
> }
|
||||
> }
|
||||
> }
|
||||
1->Emitted(12, 1) Source(24, 1) + SourceIndex(0)
|
||||
2 >Emitted(12, 2) Source(24, 2) + SourceIndex(0)
|
||||
3 >Emitted(12, 4) Source(14, 18) + SourceIndex(0)
|
||||
4 >Emitted(12, 11) Source(14, 25) + SourceIndex(0)
|
||||
5 >Emitted(12, 14) Source(14, 18) + SourceIndex(0)
|
||||
6 >Emitted(12, 29) Source(14, 25) + SourceIndex(0)
|
||||
7 >Emitted(12, 34) Source(14, 18) + SourceIndex(0)
|
||||
8 >Emitted(12, 49) Source(14, 25) + SourceIndex(0)
|
||||
9 >Emitted(12, 57) Source(24, 2) + SourceIndex(0)
|
||||
---
|
||||
>>>exports.createElement = Element.createElement;
|
||||
1 >
|
||||
2 >^^^^^^^^
|
||||
3 > ^^^^^^^^^^^^^
|
||||
4 > ^^^
|
||||
5 > ^^^^^^^
|
||||
6 > ^
|
||||
7 > ^^^^^^^^^^^^^
|
||||
8 > ^
|
||||
1 >
|
||||
>
|
||||
>export let
|
||||
2 >
|
||||
3 > createElement
|
||||
4 > =
|
||||
5 > Element
|
||||
6 > .
|
||||
7 > createElement
|
||||
8 > ;
|
||||
1 >Emitted(13, 1) Source(26, 12) + SourceIndex(0)
|
||||
2 >Emitted(13, 9) Source(26, 12) + SourceIndex(0)
|
||||
3 >Emitted(13, 22) Source(26, 25) + SourceIndex(0)
|
||||
4 >Emitted(13, 25) Source(26, 28) + SourceIndex(0)
|
||||
5 >Emitted(13, 32) Source(26, 35) + SourceIndex(0)
|
||||
6 >Emitted(13, 33) Source(26, 36) + SourceIndex(0)
|
||||
7 >Emitted(13, 46) Source(26, 49) + SourceIndex(0)
|
||||
8 >Emitted(13, 47) Source(26, 50) + SourceIndex(0)
|
||||
---
|
||||
>>>function toCamelCase(text) {
|
||||
1 >
|
||||
2 >^^^^^^^^^^^^^^^^^^^^^
|
||||
3 > ^^^^
|
||||
4 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
|
||||
1 >
|
||||
>
|
||||
>
|
||||
2 >function toCamelCase(
|
||||
3 > text: string
|
||||
1 >Emitted(14, 1) Source(28, 1) + SourceIndex(0)
|
||||
2 >Emitted(14, 22) Source(28, 22) + SourceIndex(0)
|
||||
3 >Emitted(14, 26) Source(28, 34) + SourceIndex(0)
|
||||
---
|
||||
>>> return text[0].toLowerCase() + text.substring(1);
|
||||
1->^^^^
|
||||
2 > ^^^^^^
|
||||
3 > ^
|
||||
4 > ^^^^
|
||||
5 > ^
|
||||
6 > ^
|
||||
7 > ^
|
||||
8 > ^
|
||||
9 > ^^^^^^^^^^^
|
||||
10> ^^
|
||||
11> ^^^
|
||||
12> ^^^^
|
||||
13> ^
|
||||
14> ^^^^^^^^^
|
||||
15> ^
|
||||
16> ^
|
||||
17> ^
|
||||
18> ^
|
||||
1->): string {
|
||||
>
|
||||
2 > return
|
||||
3 >
|
||||
4 > text
|
||||
5 > [
|
||||
6 > 0
|
||||
7 > ]
|
||||
8 > .
|
||||
9 > toLowerCase
|
||||
10> ()
|
||||
11> +
|
||||
12> text
|
||||
13> .
|
||||
14> substring
|
||||
15> (
|
||||
16> 1
|
||||
17> )
|
||||
18> ;
|
||||
1->Emitted(15, 5) Source(29, 5) + SourceIndex(0)
|
||||
2 >Emitted(15, 11) Source(29, 11) + SourceIndex(0)
|
||||
3 >Emitted(15, 12) Source(29, 12) + SourceIndex(0)
|
||||
4 >Emitted(15, 16) Source(29, 16) + SourceIndex(0)
|
||||
5 >Emitted(15, 17) Source(29, 17) + SourceIndex(0)
|
||||
6 >Emitted(15, 18) Source(29, 18) + SourceIndex(0)
|
||||
7 >Emitted(15, 19) Source(29, 19) + SourceIndex(0)
|
||||
8 >Emitted(15, 20) Source(29, 20) + SourceIndex(0)
|
||||
9 >Emitted(15, 31) Source(29, 31) + SourceIndex(0)
|
||||
10>Emitted(15, 33) Source(29, 33) + SourceIndex(0)
|
||||
11>Emitted(15, 36) Source(29, 36) + SourceIndex(0)
|
||||
12>Emitted(15, 40) Source(29, 40) + SourceIndex(0)
|
||||
13>Emitted(15, 41) Source(29, 41) + SourceIndex(0)
|
||||
14>Emitted(15, 50) Source(29, 50) + SourceIndex(0)
|
||||
15>Emitted(15, 51) Source(29, 51) + SourceIndex(0)
|
||||
16>Emitted(15, 52) Source(29, 52) + SourceIndex(0)
|
||||
17>Emitted(15, 53) Source(29, 53) + SourceIndex(0)
|
||||
18>Emitted(15, 54) Source(29, 54) + SourceIndex(0)
|
||||
---
|
||||
>>>}
|
||||
1 >
|
||||
2 >^
|
||||
3 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
|
||||
1 >
|
||||
>
|
||||
2 >}
|
||||
1 >Emitted(16, 1) Source(30, 1) + SourceIndex(0)
|
||||
2 >Emitted(16, 2) Source(30, 2) + SourceIndex(0)
|
||||
---
|
||||
>>>//# sourceMappingURL=Element.js.map===================================================================
|
||||
JsFile: test.js
|
||||
mapUrl: test.js.map
|
||||
sourceRoot:
|
||||
sources: test.tsx
|
||||
===================================================================
|
||||
-------------------------------------------------------------------
|
||||
emittedFile:tests/cases/compiler/test.js
|
||||
sourceFile:test.tsx
|
||||
-------------------------------------------------------------------
|
||||
>>>"use strict";
|
||||
>>>const Element_1 = require("./Element");
|
||||
1 >
|
||||
2 >^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
3 > ^^^^^^^^^^^^^^->
|
||||
1 >
|
||||
2 >import { Element} from './Element';
|
||||
1 >Emitted(2, 1) Source(1, 1) + SourceIndex(0)
|
||||
2 >Emitted(2, 40) Source(1, 36) + SourceIndex(0)
|
||||
---
|
||||
>>>let createElement = Element_1.Element.createElement;
|
||||
1->
|
||||
2 >^^^^
|
||||
3 > ^^^^^^^^^^^^^
|
||||
4 > ^^^
|
||||
5 > ^^^^^^^^^^^^^^^^^
|
||||
6 > ^
|
||||
7 > ^^^^^^^^^^^^^
|
||||
8 > ^
|
||||
1->
|
||||
>
|
||||
2 >let
|
||||
3 > createElement
|
||||
4 > =
|
||||
5 > Element
|
||||
6 > .
|
||||
7 > createElement
|
||||
8 > ;
|
||||
1->Emitted(3, 1) Source(2, 1) + SourceIndex(0)
|
||||
2 >Emitted(3, 5) Source(2, 5) + SourceIndex(0)
|
||||
3 >Emitted(3, 18) Source(2, 18) + SourceIndex(0)
|
||||
4 >Emitted(3, 21) Source(2, 21) + SourceIndex(0)
|
||||
5 >Emitted(3, 38) Source(2, 28) + SourceIndex(0)
|
||||
6 >Emitted(3, 39) Source(2, 29) + SourceIndex(0)
|
||||
7 >Emitted(3, 52) Source(2, 42) + SourceIndex(0)
|
||||
8 >Emitted(3, 53) Source(2, 43) + SourceIndex(0)
|
||||
---
|
||||
>>>let c;
|
||||
1 >
|
||||
2 >^^^^
|
||||
3 > ^
|
||||
4 > ^
|
||||
5 > ^^^^->
|
||||
1 >
|
||||
>
|
||||
2 >let
|
||||
3 > c: {
|
||||
> a?: {
|
||||
> b: string
|
||||
> }
|
||||
> }
|
||||
4 > ;
|
||||
1 >Emitted(4, 1) Source(3, 1) + SourceIndex(0)
|
||||
2 >Emitted(4, 5) Source(3, 5) + SourceIndex(0)
|
||||
3 >Emitted(4, 6) Source(7, 2) + SourceIndex(0)
|
||||
4 >Emitted(4, 7) Source(7, 3) + SourceIndex(0)
|
||||
---
|
||||
>>>class A {
|
||||
1->
|
||||
2 >^^^^^^^^^^^^^->
|
||||
1->
|
||||
>
|
||||
>
|
||||
1->Emitted(5, 1) Source(9, 1) + SourceIndex(0)
|
||||
---
|
||||
>>> view() {
|
||||
1->^^^^
|
||||
2 > ^^^^
|
||||
3 > ^^^^^^^^^->
|
||||
1->class A {
|
||||
>
|
||||
2 > view
|
||||
1->Emitted(6, 5) Source(10, 2) + SourceIndex(0)
|
||||
2 >Emitted(6, 9) Source(10, 6) + SourceIndex(0)
|
||||
---
|
||||
>>> return [
|
||||
1->^^^^^^^^
|
||||
2 > ^^^^^^
|
||||
3 > ^
|
||||
4 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
|
||||
1->() {
|
||||
>
|
||||
2 > return
|
||||
3 >
|
||||
1->Emitted(7, 9) Source(11, 3) + SourceIndex(0)
|
||||
2 >Emitted(7, 15) Source(11, 9) + SourceIndex(0)
|
||||
3 >Emitted(7, 16) Source(11, 10) + SourceIndex(0)
|
||||
---
|
||||
>>> createElement("meta", { content: "helloworld" }),
|
||||
1->^^^^^^^^^^^^
|
||||
2 > ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
3 > ^^^^^^^
|
||||
4 > ^^
|
||||
5 > ^^^^^^^^^^^^
|
||||
6 > ^^^
|
||||
1->[
|
||||
>
|
||||
2 > <meta
|
||||
3 > content
|
||||
4 > =
|
||||
5 > "helloworld"
|
||||
6 > ></meta>
|
||||
1->Emitted(8, 13) Source(12, 4) + SourceIndex(0)
|
||||
2 >Emitted(8, 37) Source(12, 10) + SourceIndex(0)
|
||||
3 >Emitted(8, 44) Source(12, 17) + SourceIndex(0)
|
||||
4 >Emitted(8, 46) Source(12, 18) + SourceIndex(0)
|
||||
5 >Emitted(8, 58) Source(12, 30) + SourceIndex(0)
|
||||
6 >Emitted(8, 61) Source(12, 38) + SourceIndex(0)
|
||||
---
|
||||
>>> createElement("meta", { content: c.a.b })
|
||||
1 >^^^^^^^^^^^^
|
||||
2 > ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
3 > ^^^^^^^
|
||||
4 > ^^
|
||||
5 > ^
|
||||
6 > ^
|
||||
7 > ^
|
||||
8 > ^
|
||||
9 > ^
|
||||
10> ^^^
|
||||
1 >,
|
||||
>
|
||||
2 > <meta
|
||||
3 > content
|
||||
4 > ={
|
||||
5 > c
|
||||
6 > .
|
||||
7 > a!
|
||||
8 > .
|
||||
9 > b
|
||||
10> }></meta>
|
||||
1 >Emitted(9, 13) Source(13, 4) + SourceIndex(0)
|
||||
2 >Emitted(9, 37) Source(13, 10) + SourceIndex(0)
|
||||
3 >Emitted(9, 44) Source(13, 17) + SourceIndex(0)
|
||||
4 >Emitted(9, 46) Source(13, 19) + SourceIndex(0)
|
||||
5 >Emitted(9, 47) Source(13, 20) + SourceIndex(0)
|
||||
6 >Emitted(9, 48) Source(13, 21) + SourceIndex(0)
|
||||
7 >Emitted(9, 49) Source(13, 23) + SourceIndex(0)
|
||||
8 >Emitted(9, 50) Source(13, 24) + SourceIndex(0)
|
||||
9 >Emitted(9, 51) Source(13, 25) + SourceIndex(0)
|
||||
10>Emitted(9, 54) Source(13, 34) + SourceIndex(0)
|
||||
---
|
||||
>>> ];
|
||||
1 >^^^^^^^^^
|
||||
2 > ^
|
||||
1 >
|
||||
> ]
|
||||
2 > ;
|
||||
1 >Emitted(10, 10) Source(14, 4) + SourceIndex(0)
|
||||
2 >Emitted(10, 11) Source(14, 5) + SourceIndex(0)
|
||||
---
|
||||
>>> }
|
||||
1 >^^^^
|
||||
2 > ^
|
||||
1 >
|
||||
>
|
||||
2 > }
|
||||
1 >Emitted(11, 5) Source(15, 2) + SourceIndex(0)
|
||||
2 >Emitted(11, 6) Source(15, 3) + SourceIndex(0)
|
||||
---
|
||||
>>>}
|
||||
1 >^
|
||||
2 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
|
||||
1 >
|
||||
>}
|
||||
1 >Emitted(12, 2) Source(16, 2) + SourceIndex(0)
|
||||
---
|
||||
>>>//# sourceMappingURL=test.js.map
|
||||
@@ -0,0 +1,125 @@
|
||||
=== tests/cases/compiler/Element.ts ===
|
||||
|
||||
declare namespace JSX {
|
||||
>JSX : Symbol(JSX, Decl(Element.ts, 0, 0))
|
||||
|
||||
interface Element {
|
||||
>Element : Symbol(Element, Decl(Element.ts, 1, 23))
|
||||
|
||||
name: string;
|
||||
>name : Symbol(Element.name, Decl(Element.ts, 2, 23))
|
||||
|
||||
isIntrinsic: boolean;
|
||||
>isIntrinsic : Symbol(Element.isIntrinsic, Decl(Element.ts, 3, 21))
|
||||
|
||||
isCustomElement: boolean;
|
||||
>isCustomElement : Symbol(Element.isCustomElement, Decl(Element.ts, 4, 29))
|
||||
|
||||
toString(renderId?: number): string;
|
||||
>toString : Symbol(Element.toString, Decl(Element.ts, 5, 33))
|
||||
>renderId : Symbol(renderId, Decl(Element.ts, 6, 17))
|
||||
|
||||
bindDOM(renderId?: number): number;
|
||||
>bindDOM : Symbol(Element.bindDOM, Decl(Element.ts, 6, 44))
|
||||
>renderId : Symbol(renderId, Decl(Element.ts, 7, 16))
|
||||
|
||||
resetComponent(): void;
|
||||
>resetComponent : Symbol(Element.resetComponent, Decl(Element.ts, 7, 43))
|
||||
|
||||
instantiateComponents(renderId?: number): number;
|
||||
>instantiateComponents : Symbol(Element.instantiateComponents, Decl(Element.ts, 8, 31))
|
||||
>renderId : Symbol(renderId, Decl(Element.ts, 9, 30))
|
||||
|
||||
props: any;
|
||||
>props : Symbol(Element.props, Decl(Element.ts, 9, 57))
|
||||
}
|
||||
}
|
||||
export namespace Element {
|
||||
>Element : Symbol(Element, Decl(Element.ts, 12, 1))
|
||||
|
||||
export function isElement(el: any): el is JSX.Element {
|
||||
>isElement : Symbol(isElement, Decl(Element.ts, 13, 26))
|
||||
>el : Symbol(el, Decl(Element.ts, 14, 30))
|
||||
>el : Symbol(el, Decl(Element.ts, 14, 30))
|
||||
>JSX : Symbol(JSX, Decl(Element.ts, 0, 0))
|
||||
>Element : Symbol(JSX.Element, Decl(Element.ts, 1, 23))
|
||||
|
||||
return el.markAsChildOfRootElement !== undefined;
|
||||
>el : Symbol(el, Decl(Element.ts, 14, 30))
|
||||
>undefined : Symbol(undefined)
|
||||
}
|
||||
|
||||
export function createElement(args: any[]) {
|
||||
>createElement : Symbol(createElement, Decl(Element.ts, 16, 5))
|
||||
>args : Symbol(args, Decl(Element.ts, 18, 34))
|
||||
|
||||
return {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export let createElement = Element.createElement;
|
||||
>createElement : Symbol(createElement, Decl(Element.ts, 25, 10))
|
||||
>Element.createElement : Symbol(Element.createElement, Decl(Element.ts, 16, 5))
|
||||
>Element : Symbol(Element, Decl(Element.ts, 12, 1))
|
||||
>createElement : Symbol(Element.createElement, Decl(Element.ts, 16, 5))
|
||||
|
||||
function toCamelCase(text: string): string {
|
||||
>toCamelCase : Symbol(toCamelCase, Decl(Element.ts, 25, 49))
|
||||
>text : Symbol(text, Decl(Element.ts, 27, 21))
|
||||
|
||||
return text[0].toLowerCase() + text.substring(1);
|
||||
>text[0].toLowerCase : Symbol(String.toLowerCase, Decl(lib.es5.d.ts, --, --))
|
||||
>text : Symbol(text, Decl(Element.ts, 27, 21))
|
||||
>toLowerCase : Symbol(String.toLowerCase, Decl(lib.es5.d.ts, --, --))
|
||||
>text.substring : Symbol(String.substring, Decl(lib.es5.d.ts, --, --))
|
||||
>text : Symbol(text, Decl(Element.ts, 27, 21))
|
||||
>substring : Symbol(String.substring, Decl(lib.es5.d.ts, --, --))
|
||||
}
|
||||
|
||||
=== tests/cases/compiler/test.tsx ===
|
||||
import { Element} from './Element';
|
||||
>Element : Symbol(Element, Decl(test.tsx, 0, 8))
|
||||
|
||||
let createElement = Element.createElement;
|
||||
>createElement : Symbol(createElement, Decl(test.tsx, 1, 3))
|
||||
>Element.createElement : Symbol(Element.createElement, Decl(Element.ts, 16, 5))
|
||||
>Element : Symbol(Element, Decl(test.tsx, 0, 8))
|
||||
>createElement : Symbol(Element.createElement, Decl(Element.ts, 16, 5))
|
||||
|
||||
let c: {
|
||||
>c : Symbol(c, Decl(test.tsx, 2, 3))
|
||||
|
||||
a?: {
|
||||
>a : Symbol(a, Decl(test.tsx, 2, 8))
|
||||
|
||||
b: string
|
||||
>b : Symbol(b, Decl(test.tsx, 3, 6))
|
||||
}
|
||||
};
|
||||
|
||||
class A {
|
||||
>A : Symbol(A, Decl(test.tsx, 6, 2))
|
||||
|
||||
view() {
|
||||
>view : Symbol(A.view, Decl(test.tsx, 8, 9))
|
||||
|
||||
return [
|
||||
<meta content="helloworld"></meta>,
|
||||
>meta : Symbol(unknown)
|
||||
>content : Symbol(unknown)
|
||||
>meta : Symbol(unknown)
|
||||
|
||||
<meta content={c.a!.b}></meta>
|
||||
>meta : Symbol(unknown)
|
||||
>content : Symbol(unknown)
|
||||
>c.a!.b : Symbol(b, Decl(test.tsx, 3, 6))
|
||||
>c.a : Symbol(a, Decl(test.tsx, 2, 8))
|
||||
>c : Symbol(c, Decl(test.tsx, 2, 3))
|
||||
>a : Symbol(a, Decl(test.tsx, 2, 8))
|
||||
>b : Symbol(b, Decl(test.tsx, 3, 6))
|
||||
>meta : Symbol(unknown)
|
||||
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,140 @@
|
||||
=== tests/cases/compiler/Element.ts ===
|
||||
|
||||
declare namespace JSX {
|
||||
>JSX : any
|
||||
|
||||
interface Element {
|
||||
>Element : Element
|
||||
|
||||
name: string;
|
||||
>name : string
|
||||
|
||||
isIntrinsic: boolean;
|
||||
>isIntrinsic : boolean
|
||||
|
||||
isCustomElement: boolean;
|
||||
>isCustomElement : boolean
|
||||
|
||||
toString(renderId?: number): string;
|
||||
>toString : (renderId?: number) => string
|
||||
>renderId : number
|
||||
|
||||
bindDOM(renderId?: number): number;
|
||||
>bindDOM : (renderId?: number) => number
|
||||
>renderId : number
|
||||
|
||||
resetComponent(): void;
|
||||
>resetComponent : () => void
|
||||
|
||||
instantiateComponents(renderId?: number): number;
|
||||
>instantiateComponents : (renderId?: number) => number
|
||||
>renderId : number
|
||||
|
||||
props: any;
|
||||
>props : any
|
||||
}
|
||||
}
|
||||
export namespace Element {
|
||||
>Element : typeof Element
|
||||
|
||||
export function isElement(el: any): el is JSX.Element {
|
||||
>isElement : (el: any) => el is JSX.Element
|
||||
>el : any
|
||||
>el : any
|
||||
>JSX : any
|
||||
>Element : JSX.Element
|
||||
|
||||
return el.markAsChildOfRootElement !== undefined;
|
||||
>el.markAsChildOfRootElement !== undefined : boolean
|
||||
>el.markAsChildOfRootElement : any
|
||||
>el : any
|
||||
>markAsChildOfRootElement : any
|
||||
>undefined : undefined
|
||||
}
|
||||
|
||||
export function createElement(args: any[]) {
|
||||
>createElement : (args: any[]) => {}
|
||||
>args : any[]
|
||||
|
||||
return {
|
||||
>{ } : {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export let createElement = Element.createElement;
|
||||
>createElement : (args: any[]) => {}
|
||||
>Element.createElement : (args: any[]) => {}
|
||||
>Element : typeof Element
|
||||
>createElement : (args: any[]) => {}
|
||||
|
||||
function toCamelCase(text: string): string {
|
||||
>toCamelCase : (text: string) => string
|
||||
>text : string
|
||||
|
||||
return text[0].toLowerCase() + text.substring(1);
|
||||
>text[0].toLowerCase() + text.substring(1) : string
|
||||
>text[0].toLowerCase() : string
|
||||
>text[0].toLowerCase : () => string
|
||||
>text[0] : string
|
||||
>text : string
|
||||
>0 : 0
|
||||
>toLowerCase : () => string
|
||||
>text.substring(1) : string
|
||||
>text.substring : (start: number, end?: number) => string
|
||||
>text : string
|
||||
>substring : (start: number, end?: number) => string
|
||||
>1 : 1
|
||||
}
|
||||
|
||||
=== tests/cases/compiler/test.tsx ===
|
||||
import { Element} from './Element';
|
||||
>Element : typeof Element
|
||||
|
||||
let createElement = Element.createElement;
|
||||
>createElement : (args: any[]) => {}
|
||||
>Element.createElement : (args: any[]) => {}
|
||||
>Element : typeof Element
|
||||
>createElement : (args: any[]) => {}
|
||||
|
||||
let c: {
|
||||
>c : { a?: { b: string; }; }
|
||||
|
||||
a?: {
|
||||
>a : { b: string; }
|
||||
|
||||
b: string
|
||||
>b : string
|
||||
}
|
||||
};
|
||||
|
||||
class A {
|
||||
>A : A
|
||||
|
||||
view() {
|
||||
>view : () => any[]
|
||||
|
||||
return [
|
||||
>[ <meta content="helloworld"></meta>, <meta content={c.a!.b}></meta> ] : any[]
|
||||
|
||||
<meta content="helloworld"></meta>,
|
||||
><meta content="helloworld"></meta> : any
|
||||
>meta : any
|
||||
>content : any
|
||||
>meta : any
|
||||
|
||||
<meta content={c.a!.b}></meta>
|
||||
><meta content={c.a!.b}></meta> : any
|
||||
>meta : any
|
||||
>content : any
|
||||
>c.a!.b : string
|
||||
>c.a! : { b: string; }
|
||||
>c.a : { b: string; }
|
||||
>c : { a?: { b: string; }; }
|
||||
>a : { b: string; }
|
||||
>b : string
|
||||
>meta : any
|
||||
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
//// [test.tsx]
|
||||
|
||||
declare module JSX {
|
||||
interface IntrinsicElements {
|
||||
[s: string]: any;
|
||||
}
|
||||
}
|
||||
|
||||
export class AppComponent {
|
||||
render(createElement) {
|
||||
return <div />;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//// [test.js]
|
||||
"use strict";
|
||||
class AppComponent {
|
||||
render(createElement) {
|
||||
return createElement("div", null);
|
||||
}
|
||||
}
|
||||
exports.AppComponent = AppComponent;
|
||||
//# sourceMappingURL=test.js.map
|
||||
@@ -0,0 +1,2 @@
|
||||
//// [test.js.map]
|
||||
{"version":3,"file":"test.js","sourceRoot":"","sources":["test.tsx"],"names":[],"mappings":";AAOA;IACI,MAAM,CAAC,aAAa;QAChB,MAAM,CAAC,0BAAO,CAAC;IACnB,CAAC;CACJ;AAJD,oCAIC"}
|
||||
@@ -0,0 +1,87 @@
|
||||
===================================================================
|
||||
JsFile: test.js
|
||||
mapUrl: test.js.map
|
||||
sourceRoot:
|
||||
sources: test.tsx
|
||||
===================================================================
|
||||
-------------------------------------------------------------------
|
||||
emittedFile:tests/cases/compiler/test.js
|
||||
sourceFile:test.tsx
|
||||
-------------------------------------------------------------------
|
||||
>>>"use strict";
|
||||
>>>class AppComponent {
|
||||
1 >
|
||||
2 >^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
|
||||
1 >
|
||||
>declare module JSX {
|
||||
> interface IntrinsicElements {
|
||||
> [s: string]: any;
|
||||
> }
|
||||
>}
|
||||
>
|
||||
>
|
||||
1 >Emitted(2, 1) Source(8, 1) + SourceIndex(0)
|
||||
---
|
||||
>>> render(createElement) {
|
||||
1->^^^^
|
||||
2 > ^^^^^^
|
||||
3 > ^
|
||||
4 > ^^^^^^^^^^^^^
|
||||
5 > ^^^^^^^^^^^^^^^^^^^->
|
||||
1->export class AppComponent {
|
||||
>
|
||||
2 > render
|
||||
3 > (
|
||||
4 > createElement
|
||||
1->Emitted(3, 5) Source(9, 5) + SourceIndex(0)
|
||||
2 >Emitted(3, 11) Source(9, 11) + SourceIndex(0)
|
||||
3 >Emitted(3, 12) Source(9, 12) + SourceIndex(0)
|
||||
4 >Emitted(3, 25) Source(9, 25) + SourceIndex(0)
|
||||
---
|
||||
>>> return createElement("div", null);
|
||||
1->^^^^^^^^
|
||||
2 > ^^^^^^
|
||||
3 > ^
|
||||
4 > ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
5 > ^
|
||||
1->) {
|
||||
>
|
||||
2 > return
|
||||
3 >
|
||||
4 > <div />
|
||||
5 > ;
|
||||
1->Emitted(4, 9) Source(10, 9) + SourceIndex(0)
|
||||
2 >Emitted(4, 15) Source(10, 15) + SourceIndex(0)
|
||||
3 >Emitted(4, 16) Source(10, 16) + SourceIndex(0)
|
||||
4 >Emitted(4, 42) Source(10, 23) + SourceIndex(0)
|
||||
5 >Emitted(4, 43) Source(10, 24) + SourceIndex(0)
|
||||
---
|
||||
>>> }
|
||||
1 >^^^^
|
||||
2 > ^
|
||||
1 >
|
||||
>
|
||||
2 > }
|
||||
1 >Emitted(5, 5) Source(11, 5) + SourceIndex(0)
|
||||
2 >Emitted(5, 6) Source(11, 6) + SourceIndex(0)
|
||||
---
|
||||
>>>}
|
||||
1 >^
|
||||
2 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
|
||||
1 >
|
||||
>}
|
||||
1 >Emitted(6, 2) Source(12, 2) + SourceIndex(0)
|
||||
---
|
||||
>>>exports.AppComponent = AppComponent;
|
||||
1->
|
||||
2 >^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
1->
|
||||
2 >export class AppComponent {
|
||||
> render(createElement) {
|
||||
> return <div />;
|
||||
> }
|
||||
>}
|
||||
1->Emitted(7, 1) Source(8, 1) + SourceIndex(0)
|
||||
2 >Emitted(7, 37) Source(12, 2) + SourceIndex(0)
|
||||
---
|
||||
>>>//# sourceMappingURL=test.js.map
|
||||
@@ -0,0 +1,25 @@
|
||||
=== tests/cases/compiler/test.tsx ===
|
||||
|
||||
declare module JSX {
|
||||
>JSX : Symbol(JSX, Decl(test.tsx, 0, 0))
|
||||
|
||||
interface IntrinsicElements {
|
||||
>IntrinsicElements : Symbol(IntrinsicElements, Decl(test.tsx, 1, 20))
|
||||
|
||||
[s: string]: any;
|
||||
>s : Symbol(s, Decl(test.tsx, 3, 9))
|
||||
}
|
||||
}
|
||||
|
||||
export class AppComponent {
|
||||
>AppComponent : Symbol(AppComponent, Decl(test.tsx, 5, 1))
|
||||
|
||||
render(createElement) {
|
||||
>render : Symbol(AppComponent.render, Decl(test.tsx, 7, 27))
|
||||
>createElement : Symbol(createElement, Decl(test.tsx, 8, 11))
|
||||
|
||||
return <div />;
|
||||
>div : Symbol(unknown)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
=== tests/cases/compiler/test.tsx ===
|
||||
|
||||
declare module JSX {
|
||||
>JSX : any
|
||||
|
||||
interface IntrinsicElements {
|
||||
>IntrinsicElements : IntrinsicElements
|
||||
|
||||
[s: string]: any;
|
||||
>s : string
|
||||
}
|
||||
}
|
||||
|
||||
export class AppComponent {
|
||||
>AppComponent : AppComponent
|
||||
|
||||
render(createElement) {
|
||||
>render : (createElement: any) => any
|
||||
>createElement : any
|
||||
|
||||
return <div />;
|
||||
><div /> : any
|
||||
>div : any
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
tests/cases/compiler/test.tsx(10,17): error TS2304: Cannot find name 'createElement'.
|
||||
|
||||
|
||||
==== tests/cases/compiler/test.tsx (1 errors) ====
|
||||
|
||||
declare module JSX {
|
||||
interface IntrinsicElements {
|
||||
[s: string]: any;
|
||||
}
|
||||
}
|
||||
|
||||
export class AppComponent {
|
||||
render() {
|
||||
return <div />;
|
||||
~~~
|
||||
!!! error TS2304: Cannot find name 'createElement'.
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
//// [test.tsx]
|
||||
|
||||
declare module JSX {
|
||||
interface IntrinsicElements {
|
||||
[s: string]: any;
|
||||
}
|
||||
}
|
||||
|
||||
export class AppComponent {
|
||||
render() {
|
||||
return <div />;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//// [test.js]
|
||||
"use strict";
|
||||
class AppComponent {
|
||||
render() {
|
||||
return createElement("div", null);
|
||||
}
|
||||
}
|
||||
exports.AppComponent = AppComponent;
|
||||
//# sourceMappingURL=test.js.map
|
||||
@@ -0,0 +1,2 @@
|
||||
//// [test.js.map]
|
||||
{"version":3,"file":"test.js","sourceRoot":"","sources":["test.tsx"],"names":[],"mappings":";AAOA;IACI,MAAM;QACF,MAAM,CAAC,0BAAO,CAAC;IACnB,CAAC;CACJ;AAJD,oCAIC"}
|
||||
@@ -0,0 +1,81 @@
|
||||
===================================================================
|
||||
JsFile: test.js
|
||||
mapUrl: test.js.map
|
||||
sourceRoot:
|
||||
sources: test.tsx
|
||||
===================================================================
|
||||
-------------------------------------------------------------------
|
||||
emittedFile:tests/cases/compiler/test.js
|
||||
sourceFile:test.tsx
|
||||
-------------------------------------------------------------------
|
||||
>>>"use strict";
|
||||
>>>class AppComponent {
|
||||
1 >
|
||||
2 >^^^^^^^^^^^^^^^->
|
||||
1 >
|
||||
>declare module JSX {
|
||||
> interface IntrinsicElements {
|
||||
> [s: string]: any;
|
||||
> }
|
||||
>}
|
||||
>
|
||||
>
|
||||
1 >Emitted(2, 1) Source(8, 1) + SourceIndex(0)
|
||||
---
|
||||
>>> render() {
|
||||
1->^^^^
|
||||
2 > ^^^^^^
|
||||
3 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
|
||||
1->export class AppComponent {
|
||||
>
|
||||
2 > render
|
||||
1->Emitted(3, 5) Source(9, 5) + SourceIndex(0)
|
||||
2 >Emitted(3, 11) Source(9, 11) + SourceIndex(0)
|
||||
---
|
||||
>>> return createElement("div", null);
|
||||
1->^^^^^^^^
|
||||
2 > ^^^^^^
|
||||
3 > ^
|
||||
4 > ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
5 > ^
|
||||
1->() {
|
||||
>
|
||||
2 > return
|
||||
3 >
|
||||
4 > <div />
|
||||
5 > ;
|
||||
1->Emitted(4, 9) Source(10, 9) + SourceIndex(0)
|
||||
2 >Emitted(4, 15) Source(10, 15) + SourceIndex(0)
|
||||
3 >Emitted(4, 16) Source(10, 16) + SourceIndex(0)
|
||||
4 >Emitted(4, 42) Source(10, 23) + SourceIndex(0)
|
||||
5 >Emitted(4, 43) Source(10, 24) + SourceIndex(0)
|
||||
---
|
||||
>>> }
|
||||
1 >^^^^
|
||||
2 > ^
|
||||
1 >
|
||||
>
|
||||
2 > }
|
||||
1 >Emitted(5, 5) Source(11, 5) + SourceIndex(0)
|
||||
2 >Emitted(5, 6) Source(11, 6) + SourceIndex(0)
|
||||
---
|
||||
>>>}
|
||||
1 >^
|
||||
2 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
|
||||
1 >
|
||||
>}
|
||||
1 >Emitted(6, 2) Source(12, 2) + SourceIndex(0)
|
||||
---
|
||||
>>>exports.AppComponent = AppComponent;
|
||||
1->
|
||||
2 >^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
1->
|
||||
2 >export class AppComponent {
|
||||
> render() {
|
||||
> return <div />;
|
||||
> }
|
||||
>}
|
||||
1->Emitted(7, 1) Source(8, 1) + SourceIndex(0)
|
||||
2 >Emitted(7, 37) Source(12, 2) + SourceIndex(0)
|
||||
---
|
||||
>>>//# sourceMappingURL=test.js.map
|
||||
@@ -0,0 +1,59 @@
|
||||
error TS5067: Invalid value for 'jsxFactory'. 'Element.createElement=' is not a valid identifier or qualified-name.
|
||||
tests/cases/compiler/test.tsx(12,5): error TS2304: Cannot find name 'React'.
|
||||
tests/cases/compiler/test.tsx(13,5): error TS2304: Cannot find name 'React'.
|
||||
|
||||
|
||||
!!! error TS5067: Invalid value for 'jsxFactory'. 'Element.createElement=' is not a valid identifier or qualified-name.
|
||||
==== tests/cases/compiler/Element.ts (0 errors) ====
|
||||
|
||||
declare namespace JSX {
|
||||
interface Element {
|
||||
name: string;
|
||||
isIntrinsic: boolean;
|
||||
isCustomElement: boolean;
|
||||
toString(renderId?: number): string;
|
||||
bindDOM(renderId?: number): number;
|
||||
resetComponent(): void;
|
||||
instantiateComponents(renderId?: number): number;
|
||||
props: any;
|
||||
}
|
||||
}
|
||||
export namespace Element {
|
||||
export function isElement(el: any): el is JSX.Element {
|
||||
return el.markAsChildOfRootElement !== undefined;
|
||||
}
|
||||
|
||||
export function createElement(args: any[]) {
|
||||
|
||||
return {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export let createElement = Element.createElement;
|
||||
|
||||
function toCamelCase(text: string): string {
|
||||
return text[0].toLowerCase() + text.substring(1);
|
||||
}
|
||||
|
||||
==== tests/cases/compiler/test.tsx (2 errors) ====
|
||||
import { Element} from './Element';
|
||||
|
||||
let c: {
|
||||
a?: {
|
||||
b: string
|
||||
}
|
||||
};
|
||||
|
||||
class A {
|
||||
view() {
|
||||
return [
|
||||
<meta content="helloworld"></meta>,
|
||||
~~~~
|
||||
!!! error TS2304: Cannot find name 'React'.
|
||||
<meta content={c.a!.b}></meta>
|
||||
~~~~
|
||||
!!! error TS2304: Cannot find name 'React'.
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
//// [tests/cases/compiler/jsxFactoryNotIdentifierOrQualifiedName.ts] ////
|
||||
|
||||
//// [Element.ts]
|
||||
|
||||
declare namespace JSX {
|
||||
interface Element {
|
||||
name: string;
|
||||
isIntrinsic: boolean;
|
||||
isCustomElement: boolean;
|
||||
toString(renderId?: number): string;
|
||||
bindDOM(renderId?: number): number;
|
||||
resetComponent(): void;
|
||||
instantiateComponents(renderId?: number): number;
|
||||
props: any;
|
||||
}
|
||||
}
|
||||
export namespace Element {
|
||||
export function isElement(el: any): el is JSX.Element {
|
||||
return el.markAsChildOfRootElement !== undefined;
|
||||
}
|
||||
|
||||
export function createElement(args: any[]) {
|
||||
|
||||
return {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export let createElement = Element.createElement;
|
||||
|
||||
function toCamelCase(text: string): string {
|
||||
return text[0].toLowerCase() + text.substring(1);
|
||||
}
|
||||
|
||||
//// [test.tsx]
|
||||
import { Element} from './Element';
|
||||
|
||||
let c: {
|
||||
a?: {
|
||||
b: string
|
||||
}
|
||||
};
|
||||
|
||||
class A {
|
||||
view() {
|
||||
return [
|
||||
<meta content="helloworld"></meta>,
|
||||
<meta content={c.a!.b}></meta>
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
//// [Element.js]
|
||||
"use strict";
|
||||
var Element;
|
||||
(function (Element) {
|
||||
function isElement(el) {
|
||||
return el.markAsChildOfRootElement !== undefined;
|
||||
}
|
||||
Element.isElement = isElement;
|
||||
function createElement(args) {
|
||||
return {};
|
||||
}
|
||||
Element.createElement = createElement;
|
||||
})(Element = exports.Element || (exports.Element = {}));
|
||||
exports.createElement = Element.createElement;
|
||||
function toCamelCase(text) {
|
||||
return text[0].toLowerCase() + text.substring(1);
|
||||
}
|
||||
//// [test.js]
|
||||
"use strict";
|
||||
let c;
|
||||
class A {
|
||||
view() {
|
||||
return [
|
||||
React.createElement("meta", { content: "helloworld" }),
|
||||
React.createElement("meta", { content: c.a.b })
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
error TS5067: Invalid value for 'jsxFactory'. 'id1 id2' is not a valid identifier or qualified-name.
|
||||
tests/cases/compiler/test.tsx(12,5): error TS2304: Cannot find name 'React'.
|
||||
tests/cases/compiler/test.tsx(13,5): error TS2304: Cannot find name 'React'.
|
||||
|
||||
|
||||
!!! error TS5067: Invalid value for 'jsxFactory'. 'id1 id2' is not a valid identifier or qualified-name.
|
||||
==== tests/cases/compiler/Element.ts (0 errors) ====
|
||||
|
||||
declare namespace JSX {
|
||||
interface Element {
|
||||
name: string;
|
||||
isIntrinsic: boolean;
|
||||
isCustomElement: boolean;
|
||||
toString(renderId?: number): string;
|
||||
bindDOM(renderId?: number): number;
|
||||
resetComponent(): void;
|
||||
instantiateComponents(renderId?: number): number;
|
||||
props: any;
|
||||
}
|
||||
}
|
||||
export namespace Element {
|
||||
export function isElement(el: any): el is JSX.Element {
|
||||
return el.markAsChildOfRootElement !== undefined;
|
||||
}
|
||||
|
||||
export function createElement(args: any[]) {
|
||||
|
||||
return {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export let createElement = Element.createElement;
|
||||
|
||||
function toCamelCase(text: string): string {
|
||||
return text[0].toLowerCase() + text.substring(1);
|
||||
}
|
||||
|
||||
==== tests/cases/compiler/test.tsx (2 errors) ====
|
||||
import { Element} from './Element';
|
||||
|
||||
let c: {
|
||||
a?: {
|
||||
b: string
|
||||
}
|
||||
};
|
||||
|
||||
class A {
|
||||
view() {
|
||||
return [
|
||||
<meta content="helloworld"></meta>,
|
||||
~~~~
|
||||
!!! error TS2304: Cannot find name 'React'.
|
||||
<meta content={c.a!.b}></meta>
|
||||
~~~~
|
||||
!!! error TS2304: Cannot find name 'React'.
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
//// [tests/cases/compiler/jsxFactoryNotIdentifierOrQualifiedName2.ts] ////
|
||||
|
||||
//// [Element.ts]
|
||||
|
||||
declare namespace JSX {
|
||||
interface Element {
|
||||
name: string;
|
||||
isIntrinsic: boolean;
|
||||
isCustomElement: boolean;
|
||||
toString(renderId?: number): string;
|
||||
bindDOM(renderId?: number): number;
|
||||
resetComponent(): void;
|
||||
instantiateComponents(renderId?: number): number;
|
||||
props: any;
|
||||
}
|
||||
}
|
||||
export namespace Element {
|
||||
export function isElement(el: any): el is JSX.Element {
|
||||
return el.markAsChildOfRootElement !== undefined;
|
||||
}
|
||||
|
||||
export function createElement(args: any[]) {
|
||||
|
||||
return {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export let createElement = Element.createElement;
|
||||
|
||||
function toCamelCase(text: string): string {
|
||||
return text[0].toLowerCase() + text.substring(1);
|
||||
}
|
||||
|
||||
//// [test.tsx]
|
||||
import { Element} from './Element';
|
||||
|
||||
let c: {
|
||||
a?: {
|
||||
b: string
|
||||
}
|
||||
};
|
||||
|
||||
class A {
|
||||
view() {
|
||||
return [
|
||||
<meta content="helloworld"></meta>,
|
||||
<meta content={c.a!.b}></meta>
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
//// [Element.js]
|
||||
"use strict";
|
||||
var Element;
|
||||
(function (Element) {
|
||||
function isElement(el) {
|
||||
return el.markAsChildOfRootElement !== undefined;
|
||||
}
|
||||
Element.isElement = isElement;
|
||||
function createElement(args) {
|
||||
return {};
|
||||
}
|
||||
Element.createElement = createElement;
|
||||
})(Element = exports.Element || (exports.Element = {}));
|
||||
exports.createElement = Element.createElement;
|
||||
function toCamelCase(text) {
|
||||
return text[0].toLowerCase() + text.substring(1);
|
||||
}
|
||||
//// [test.js]
|
||||
"use strict";
|
||||
let c;
|
||||
class A {
|
||||
view() {
|
||||
return [
|
||||
React.createElement("meta", { content: "helloworld" }),
|
||||
React.createElement("meta", { content: c.a.b })
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
//// [tests/cases/compiler/jsxFactoryQualifiedName.ts] ////
|
||||
|
||||
//// [Element.ts]
|
||||
|
||||
declare namespace JSX {
|
||||
interface Element {
|
||||
name: string;
|
||||
isIntrinsic: boolean;
|
||||
isCustomElement: boolean;
|
||||
toString(renderId?: number): string;
|
||||
bindDOM(renderId?: number): number;
|
||||
resetComponent(): void;
|
||||
instantiateComponents(renderId?: number): number;
|
||||
props: any;
|
||||
}
|
||||
}
|
||||
export namespace Element {
|
||||
export function isElement(el: any): el is JSX.Element {
|
||||
return el.markAsChildOfRootElement !== undefined;
|
||||
}
|
||||
|
||||
export function createElement(args: any[]) {
|
||||
|
||||
return {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export let createElement = Element.createElement;
|
||||
|
||||
function toCamelCase(text: string): string {
|
||||
return text[0].toLowerCase() + text.substring(1);
|
||||
}
|
||||
|
||||
//// [test.tsx]
|
||||
import { Element} from './Element';
|
||||
|
||||
let c: {
|
||||
a?: {
|
||||
b: string
|
||||
}
|
||||
};
|
||||
|
||||
class A {
|
||||
view() {
|
||||
return [
|
||||
<meta content="helloworld"></meta>,
|
||||
<meta content={c.a!.b}></meta>
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
//// [Element.js]
|
||||
"use strict";
|
||||
var Element;
|
||||
(function (Element) {
|
||||
function isElement(el) {
|
||||
return el.markAsChildOfRootElement !== undefined;
|
||||
}
|
||||
Element.isElement = isElement;
|
||||
function createElement(args) {
|
||||
return {};
|
||||
}
|
||||
Element.createElement = createElement;
|
||||
})(Element = exports.Element || (exports.Element = {}));
|
||||
exports.createElement = Element.createElement;
|
||||
function toCamelCase(text) {
|
||||
return text[0].toLowerCase() + text.substring(1);
|
||||
}
|
||||
//# sourceMappingURL=Element.js.map//// [test.js]
|
||||
"use strict";
|
||||
const Element_1 = require("./Element");
|
||||
let c;
|
||||
class A {
|
||||
view() {
|
||||
return [
|
||||
Element_1.Element.createElement("meta", { content: "helloworld" }),
|
||||
Element_1.Element.createElement("meta", { content: c.a.b })
|
||||
];
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=test.js.map
|
||||
@@ -0,0 +1,3 @@
|
||||
//// [Element.js.map]
|
||||
{"version":3,"file":"Element.js","sourceRoot":"","sources":["Element.ts"],"names":[],"mappings":";AAaA,IAAiB,OAAO,CAUvB;AAVD,WAAiB,OAAO;IACpB,mBAA0B,EAAO;QAC7B,MAAM,CAAC,EAAE,CAAC,wBAAwB,KAAK,SAAS,CAAC;IACrD,CAAC;IAFe,iBAAS,YAExB,CAAA;IAED,uBAA8B,IAAW;QAErC,MAAM,CAAC,EACN,CAAA;IACL,CAAC;IAJe,qBAAa,gBAI5B,CAAA;AACL,CAAC,EAVgB,OAAO,GAAP,eAAO,KAAP,eAAO,QAUvB;AAEU,QAAA,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;AAEjD,qBAAqB,IAAY;IAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC"}//// [test.js.map]
|
||||
{"version":3,"file":"test.js","sourceRoot":"","sources":["test.tsx"],"names":[],"mappings":";AAAA,uCAAmC;AAEnC,IAAI,CAIH,CAAC;AAEF;IACC,IAAI;QACH,MAAM,CAAC;YACN,0CAAM,OAAO,EAAC,YAAY,GAAQ;YAClC,0CAAM,OAAO,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC,GAAS;SAC9B,CAAC;IACH,CAAC;CACD"}
|
||||
@@ -0,0 +1,493 @@
|
||||
===================================================================
|
||||
JsFile: Element.js
|
||||
mapUrl: Element.js.map
|
||||
sourceRoot:
|
||||
sources: Element.ts
|
||||
===================================================================
|
||||
-------------------------------------------------------------------
|
||||
emittedFile:tests/cases/compiler/Element.js
|
||||
sourceFile:Element.ts
|
||||
-------------------------------------------------------------------
|
||||
>>>"use strict";
|
||||
>>>var Element;
|
||||
1 >
|
||||
2 >^^^^
|
||||
3 > ^^^^^^^
|
||||
4 > ^
|
||||
5 > ^^^^^^^^^^->
|
||||
1 >
|
||||
>declare namespace JSX {
|
||||
> interface Element {
|
||||
> name: string;
|
||||
> isIntrinsic: boolean;
|
||||
> isCustomElement: boolean;
|
||||
> toString(renderId?: number): string;
|
||||
> bindDOM(renderId?: number): number;
|
||||
> resetComponent(): void;
|
||||
> instantiateComponents(renderId?: number): number;
|
||||
> props: any;
|
||||
> }
|
||||
>}
|
||||
>
|
||||
2 >export namespace
|
||||
3 > Element
|
||||
4 > {
|
||||
> export function isElement(el: any): el is JSX.Element {
|
||||
> return el.markAsChildOfRootElement !== undefined;
|
||||
> }
|
||||
>
|
||||
> export function createElement(args: any[]) {
|
||||
>
|
||||
> return {
|
||||
> }
|
||||
> }
|
||||
> }
|
||||
1 >Emitted(2, 1) Source(14, 1) + SourceIndex(0)
|
||||
2 >Emitted(2, 5) Source(14, 18) + SourceIndex(0)
|
||||
3 >Emitted(2, 12) Source(14, 25) + SourceIndex(0)
|
||||
4 >Emitted(2, 13) Source(24, 2) + SourceIndex(0)
|
||||
---
|
||||
>>>(function (Element) {
|
||||
1->
|
||||
2 >^^^^^^^^^^^
|
||||
3 > ^^^^^^^
|
||||
4 > ^^^^^^^^^^^->
|
||||
1->
|
||||
2 >export namespace
|
||||
3 > Element
|
||||
1->Emitted(3, 1) Source(14, 1) + SourceIndex(0)
|
||||
2 >Emitted(3, 12) Source(14, 18) + SourceIndex(0)
|
||||
3 >Emitted(3, 19) Source(14, 25) + SourceIndex(0)
|
||||
---
|
||||
>>> function isElement(el) {
|
||||
1->^^^^
|
||||
2 > ^^^^^^^^^^^^^^^^^^^
|
||||
3 > ^^
|
||||
4 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
|
||||
1-> {
|
||||
>
|
||||
2 > export function isElement(
|
||||
3 > el: any
|
||||
1->Emitted(4, 5) Source(15, 5) + SourceIndex(0)
|
||||
2 >Emitted(4, 24) Source(15, 31) + SourceIndex(0)
|
||||
3 >Emitted(4, 26) Source(15, 38) + SourceIndex(0)
|
||||
---
|
||||
>>> return el.markAsChildOfRootElement !== undefined;
|
||||
1->^^^^^^^^
|
||||
2 > ^^^^^^
|
||||
3 > ^
|
||||
4 > ^^
|
||||
5 > ^
|
||||
6 > ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
7 > ^^^^^
|
||||
8 > ^^^^^^^^^
|
||||
9 > ^
|
||||
1->): el is JSX.Element {
|
||||
>
|
||||
2 > return
|
||||
3 >
|
||||
4 > el
|
||||
5 > .
|
||||
6 > markAsChildOfRootElement
|
||||
7 > !==
|
||||
8 > undefined
|
||||
9 > ;
|
||||
1->Emitted(5, 9) Source(16, 9) + SourceIndex(0)
|
||||
2 >Emitted(5, 15) Source(16, 15) + SourceIndex(0)
|
||||
3 >Emitted(5, 16) Source(16, 16) + SourceIndex(0)
|
||||
4 >Emitted(5, 18) Source(16, 18) + SourceIndex(0)
|
||||
5 >Emitted(5, 19) Source(16, 19) + SourceIndex(0)
|
||||
6 >Emitted(5, 43) Source(16, 43) + SourceIndex(0)
|
||||
7 >Emitted(5, 48) Source(16, 48) + SourceIndex(0)
|
||||
8 >Emitted(5, 57) Source(16, 57) + SourceIndex(0)
|
||||
9 >Emitted(5, 58) Source(16, 58) + SourceIndex(0)
|
||||
---
|
||||
>>> }
|
||||
1 >^^^^
|
||||
2 > ^
|
||||
3 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
|
||||
1 >
|
||||
>
|
||||
2 > }
|
||||
1 >Emitted(6, 5) Source(17, 5) + SourceIndex(0)
|
||||
2 >Emitted(6, 6) Source(17, 6) + SourceIndex(0)
|
||||
---
|
||||
>>> Element.isElement = isElement;
|
||||
1->^^^^
|
||||
2 > ^^^^^^^^^^^^^^^^^
|
||||
3 > ^^^^^^^^^^^^
|
||||
4 > ^
|
||||
5 > ^->
|
||||
1->
|
||||
2 > isElement
|
||||
3 > (el: any): el is JSX.Element {
|
||||
> return el.markAsChildOfRootElement !== undefined;
|
||||
> }
|
||||
4 >
|
||||
1->Emitted(7, 5) Source(15, 21) + SourceIndex(0)
|
||||
2 >Emitted(7, 22) Source(15, 30) + SourceIndex(0)
|
||||
3 >Emitted(7, 34) Source(17, 6) + SourceIndex(0)
|
||||
4 >Emitted(7, 35) Source(17, 6) + SourceIndex(0)
|
||||
---
|
||||
>>> function createElement(args) {
|
||||
1->^^^^
|
||||
2 > ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
3 > ^^^^
|
||||
1->
|
||||
>
|
||||
>
|
||||
2 > export function createElement(
|
||||
3 > args: any[]
|
||||
1->Emitted(8, 5) Source(19, 5) + SourceIndex(0)
|
||||
2 >Emitted(8, 28) Source(19, 35) + SourceIndex(0)
|
||||
3 >Emitted(8, 32) Source(19, 46) + SourceIndex(0)
|
||||
---
|
||||
>>> return {};
|
||||
1 >^^^^^^^^
|
||||
2 > ^^^^^^
|
||||
3 > ^
|
||||
4 > ^^
|
||||
5 > ^
|
||||
1 >) {
|
||||
>
|
||||
>
|
||||
2 > return
|
||||
3 >
|
||||
4 > {
|
||||
> }
|
||||
5 >
|
||||
1 >Emitted(9, 9) Source(21, 9) + SourceIndex(0)
|
||||
2 >Emitted(9, 15) Source(21, 15) + SourceIndex(0)
|
||||
3 >Emitted(9, 16) Source(21, 16) + SourceIndex(0)
|
||||
4 >Emitted(9, 18) Source(22, 10) + SourceIndex(0)
|
||||
5 >Emitted(9, 19) Source(22, 10) + SourceIndex(0)
|
||||
---
|
||||
>>> }
|
||||
1 >^^^^
|
||||
2 > ^
|
||||
3 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
|
||||
1 >
|
||||
>
|
||||
2 > }
|
||||
1 >Emitted(10, 5) Source(23, 5) + SourceIndex(0)
|
||||
2 >Emitted(10, 6) Source(23, 6) + SourceIndex(0)
|
||||
---
|
||||
>>> Element.createElement = createElement;
|
||||
1->^^^^
|
||||
2 > ^^^^^^^^^^^^^^^^^^^^^
|
||||
3 > ^^^^^^^^^^^^^^^^
|
||||
4 > ^
|
||||
5 > ^^^^^^^^^^^^^^^->
|
||||
1->
|
||||
2 > createElement
|
||||
3 > (args: any[]) {
|
||||
>
|
||||
> return {
|
||||
> }
|
||||
> }
|
||||
4 >
|
||||
1->Emitted(11, 5) Source(19, 21) + SourceIndex(0)
|
||||
2 >Emitted(11, 26) Source(19, 34) + SourceIndex(0)
|
||||
3 >Emitted(11, 42) Source(23, 6) + SourceIndex(0)
|
||||
4 >Emitted(11, 43) Source(23, 6) + SourceIndex(0)
|
||||
---
|
||||
>>>})(Element = exports.Element || (exports.Element = {}));
|
||||
1->
|
||||
2 >^
|
||||
3 > ^^
|
||||
4 > ^^^^^^^
|
||||
5 > ^^^
|
||||
6 > ^^^^^^^^^^^^^^^
|
||||
7 > ^^^^^
|
||||
8 > ^^^^^^^^^^^^^^^
|
||||
9 > ^^^^^^^^
|
||||
1->
|
||||
>
|
||||
2 >}
|
||||
3 >
|
||||
4 > Element
|
||||
5 >
|
||||
6 > Element
|
||||
7 >
|
||||
8 > Element
|
||||
9 > {
|
||||
> export function isElement(el: any): el is JSX.Element {
|
||||
> return el.markAsChildOfRootElement !== undefined;
|
||||
> }
|
||||
>
|
||||
> export function createElement(args: any[]) {
|
||||
>
|
||||
> return {
|
||||
> }
|
||||
> }
|
||||
> }
|
||||
1->Emitted(12, 1) Source(24, 1) + SourceIndex(0)
|
||||
2 >Emitted(12, 2) Source(24, 2) + SourceIndex(0)
|
||||
3 >Emitted(12, 4) Source(14, 18) + SourceIndex(0)
|
||||
4 >Emitted(12, 11) Source(14, 25) + SourceIndex(0)
|
||||
5 >Emitted(12, 14) Source(14, 18) + SourceIndex(0)
|
||||
6 >Emitted(12, 29) Source(14, 25) + SourceIndex(0)
|
||||
7 >Emitted(12, 34) Source(14, 18) + SourceIndex(0)
|
||||
8 >Emitted(12, 49) Source(14, 25) + SourceIndex(0)
|
||||
9 >Emitted(12, 57) Source(24, 2) + SourceIndex(0)
|
||||
---
|
||||
>>>exports.createElement = Element.createElement;
|
||||
1 >
|
||||
2 >^^^^^^^^
|
||||
3 > ^^^^^^^^^^^^^
|
||||
4 > ^^^
|
||||
5 > ^^^^^^^
|
||||
6 > ^
|
||||
7 > ^^^^^^^^^^^^^
|
||||
8 > ^
|
||||
1 >
|
||||
>
|
||||
>export let
|
||||
2 >
|
||||
3 > createElement
|
||||
4 > =
|
||||
5 > Element
|
||||
6 > .
|
||||
7 > createElement
|
||||
8 > ;
|
||||
1 >Emitted(13, 1) Source(26, 12) + SourceIndex(0)
|
||||
2 >Emitted(13, 9) Source(26, 12) + SourceIndex(0)
|
||||
3 >Emitted(13, 22) Source(26, 25) + SourceIndex(0)
|
||||
4 >Emitted(13, 25) Source(26, 28) + SourceIndex(0)
|
||||
5 >Emitted(13, 32) Source(26, 35) + SourceIndex(0)
|
||||
6 >Emitted(13, 33) Source(26, 36) + SourceIndex(0)
|
||||
7 >Emitted(13, 46) Source(26, 49) + SourceIndex(0)
|
||||
8 >Emitted(13, 47) Source(26, 50) + SourceIndex(0)
|
||||
---
|
||||
>>>function toCamelCase(text) {
|
||||
1 >
|
||||
2 >^^^^^^^^^^^^^^^^^^^^^
|
||||
3 > ^^^^
|
||||
4 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
|
||||
1 >
|
||||
>
|
||||
>
|
||||
2 >function toCamelCase(
|
||||
3 > text: string
|
||||
1 >Emitted(14, 1) Source(28, 1) + SourceIndex(0)
|
||||
2 >Emitted(14, 22) Source(28, 22) + SourceIndex(0)
|
||||
3 >Emitted(14, 26) Source(28, 34) + SourceIndex(0)
|
||||
---
|
||||
>>> return text[0].toLowerCase() + text.substring(1);
|
||||
1->^^^^
|
||||
2 > ^^^^^^
|
||||
3 > ^
|
||||
4 > ^^^^
|
||||
5 > ^
|
||||
6 > ^
|
||||
7 > ^
|
||||
8 > ^
|
||||
9 > ^^^^^^^^^^^
|
||||
10> ^^
|
||||
11> ^^^
|
||||
12> ^^^^
|
||||
13> ^
|
||||
14> ^^^^^^^^^
|
||||
15> ^
|
||||
16> ^
|
||||
17> ^
|
||||
18> ^
|
||||
1->): string {
|
||||
>
|
||||
2 > return
|
||||
3 >
|
||||
4 > text
|
||||
5 > [
|
||||
6 > 0
|
||||
7 > ]
|
||||
8 > .
|
||||
9 > toLowerCase
|
||||
10> ()
|
||||
11> +
|
||||
12> text
|
||||
13> .
|
||||
14> substring
|
||||
15> (
|
||||
16> 1
|
||||
17> )
|
||||
18> ;
|
||||
1->Emitted(15, 5) Source(29, 5) + SourceIndex(0)
|
||||
2 >Emitted(15, 11) Source(29, 11) + SourceIndex(0)
|
||||
3 >Emitted(15, 12) Source(29, 12) + SourceIndex(0)
|
||||
4 >Emitted(15, 16) Source(29, 16) + SourceIndex(0)
|
||||
5 >Emitted(15, 17) Source(29, 17) + SourceIndex(0)
|
||||
6 >Emitted(15, 18) Source(29, 18) + SourceIndex(0)
|
||||
7 >Emitted(15, 19) Source(29, 19) + SourceIndex(0)
|
||||
8 >Emitted(15, 20) Source(29, 20) + SourceIndex(0)
|
||||
9 >Emitted(15, 31) Source(29, 31) + SourceIndex(0)
|
||||
10>Emitted(15, 33) Source(29, 33) + SourceIndex(0)
|
||||
11>Emitted(15, 36) Source(29, 36) + SourceIndex(0)
|
||||
12>Emitted(15, 40) Source(29, 40) + SourceIndex(0)
|
||||
13>Emitted(15, 41) Source(29, 41) + SourceIndex(0)
|
||||
14>Emitted(15, 50) Source(29, 50) + SourceIndex(0)
|
||||
15>Emitted(15, 51) Source(29, 51) + SourceIndex(0)
|
||||
16>Emitted(15, 52) Source(29, 52) + SourceIndex(0)
|
||||
17>Emitted(15, 53) Source(29, 53) + SourceIndex(0)
|
||||
18>Emitted(15, 54) Source(29, 54) + SourceIndex(0)
|
||||
---
|
||||
>>>}
|
||||
1 >
|
||||
2 >^
|
||||
3 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
|
||||
1 >
|
||||
>
|
||||
2 >}
|
||||
1 >Emitted(16, 1) Source(30, 1) + SourceIndex(0)
|
||||
2 >Emitted(16, 2) Source(30, 2) + SourceIndex(0)
|
||||
---
|
||||
>>>//# sourceMappingURL=Element.js.map===================================================================
|
||||
JsFile: test.js
|
||||
mapUrl: test.js.map
|
||||
sourceRoot:
|
||||
sources: test.tsx
|
||||
===================================================================
|
||||
-------------------------------------------------------------------
|
||||
emittedFile:tests/cases/compiler/test.js
|
||||
sourceFile:test.tsx
|
||||
-------------------------------------------------------------------
|
||||
>>>"use strict";
|
||||
>>>const Element_1 = require("./Element");
|
||||
1 >
|
||||
2 >^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
1 >
|
||||
2 >import { Element} from './Element';
|
||||
1 >Emitted(2, 1) Source(1, 1) + SourceIndex(0)
|
||||
2 >Emitted(2, 40) Source(1, 36) + SourceIndex(0)
|
||||
---
|
||||
>>>let c;
|
||||
1 >
|
||||
2 >^^^^
|
||||
3 > ^
|
||||
4 > ^
|
||||
5 > ^^^^->
|
||||
1 >
|
||||
>
|
||||
>
|
||||
2 >let
|
||||
3 > c: {
|
||||
> a?: {
|
||||
> b: string
|
||||
> }
|
||||
> }
|
||||
4 > ;
|
||||
1 >Emitted(3, 1) Source(3, 1) + SourceIndex(0)
|
||||
2 >Emitted(3, 5) Source(3, 5) + SourceIndex(0)
|
||||
3 >Emitted(3, 6) Source(7, 2) + SourceIndex(0)
|
||||
4 >Emitted(3, 7) Source(7, 3) + SourceIndex(0)
|
||||
---
|
||||
>>>class A {
|
||||
1->
|
||||
2 >^^^^^^^^^^^^^->
|
||||
1->
|
||||
>
|
||||
>
|
||||
1->Emitted(4, 1) Source(9, 1) + SourceIndex(0)
|
||||
---
|
||||
>>> view() {
|
||||
1->^^^^
|
||||
2 > ^^^^
|
||||
3 > ^^^^^^^^^->
|
||||
1->class A {
|
||||
>
|
||||
2 > view
|
||||
1->Emitted(5, 5) Source(10, 2) + SourceIndex(0)
|
||||
2 >Emitted(5, 9) Source(10, 6) + SourceIndex(0)
|
||||
---
|
||||
>>> return [
|
||||
1->^^^^^^^^
|
||||
2 > ^^^^^^
|
||||
3 > ^
|
||||
4 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
|
||||
1->() {
|
||||
>
|
||||
2 > return
|
||||
3 >
|
||||
1->Emitted(6, 9) Source(11, 3) + SourceIndex(0)
|
||||
2 >Emitted(6, 15) Source(11, 9) + SourceIndex(0)
|
||||
3 >Emitted(6, 16) Source(11, 10) + SourceIndex(0)
|
||||
---
|
||||
>>> Element_1.Element.createElement("meta", { content: "helloworld" }),
|
||||
1->^^^^^^^^^^^^
|
||||
2 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
3 > ^^^^^^^
|
||||
4 > ^^
|
||||
5 > ^^^^^^^^^^^^
|
||||
6 > ^^^
|
||||
1->[
|
||||
>
|
||||
2 > <meta
|
||||
3 > content
|
||||
4 > =
|
||||
5 > "helloworld"
|
||||
6 > ></meta>
|
||||
1->Emitted(7, 13) Source(12, 4) + SourceIndex(0)
|
||||
2 >Emitted(7, 55) Source(12, 10) + SourceIndex(0)
|
||||
3 >Emitted(7, 62) Source(12, 17) + SourceIndex(0)
|
||||
4 >Emitted(7, 64) Source(12, 18) + SourceIndex(0)
|
||||
5 >Emitted(7, 76) Source(12, 30) + SourceIndex(0)
|
||||
6 >Emitted(7, 79) Source(12, 38) + SourceIndex(0)
|
||||
---
|
||||
>>> Element_1.Element.createElement("meta", { content: c.a.b })
|
||||
1 >^^^^^^^^^^^^
|
||||
2 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
3 > ^^^^^^^
|
||||
4 > ^^
|
||||
5 > ^
|
||||
6 > ^
|
||||
7 > ^
|
||||
8 > ^
|
||||
9 > ^
|
||||
10> ^^^
|
||||
1 >,
|
||||
>
|
||||
2 > <meta
|
||||
3 > content
|
||||
4 > ={
|
||||
5 > c
|
||||
6 > .
|
||||
7 > a!
|
||||
8 > .
|
||||
9 > b
|
||||
10> }></meta>
|
||||
1 >Emitted(8, 13) Source(13, 4) + SourceIndex(0)
|
||||
2 >Emitted(8, 55) Source(13, 10) + SourceIndex(0)
|
||||
3 >Emitted(8, 62) Source(13, 17) + SourceIndex(0)
|
||||
4 >Emitted(8, 64) Source(13, 19) + SourceIndex(0)
|
||||
5 >Emitted(8, 65) Source(13, 20) + SourceIndex(0)
|
||||
6 >Emitted(8, 66) Source(13, 21) + SourceIndex(0)
|
||||
7 >Emitted(8, 67) Source(13, 23) + SourceIndex(0)
|
||||
8 >Emitted(8, 68) Source(13, 24) + SourceIndex(0)
|
||||
9 >Emitted(8, 69) Source(13, 25) + SourceIndex(0)
|
||||
10>Emitted(8, 72) Source(13, 34) + SourceIndex(0)
|
||||
---
|
||||
>>> ];
|
||||
1 >^^^^^^^^^
|
||||
2 > ^
|
||||
1 >
|
||||
> ]
|
||||
2 > ;
|
||||
1 >Emitted(9, 10) Source(14, 4) + SourceIndex(0)
|
||||
2 >Emitted(9, 11) Source(14, 5) + SourceIndex(0)
|
||||
---
|
||||
>>> }
|
||||
1 >^^^^
|
||||
2 > ^
|
||||
1 >
|
||||
>
|
||||
2 > }
|
||||
1 >Emitted(10, 5) Source(15, 2) + SourceIndex(0)
|
||||
2 >Emitted(10, 6) Source(15, 3) + SourceIndex(0)
|
||||
---
|
||||
>>>}
|
||||
1 >^
|
||||
2 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
|
||||
1 >
|
||||
>}
|
||||
1 >Emitted(11, 2) Source(16, 2) + SourceIndex(0)
|
||||
---
|
||||
>>>//# sourceMappingURL=test.js.map
|
||||
@@ -0,0 +1,119 @@
|
||||
=== tests/cases/compiler/Element.ts ===
|
||||
|
||||
declare namespace JSX {
|
||||
>JSX : Symbol(JSX, Decl(Element.ts, 0, 0))
|
||||
|
||||
interface Element {
|
||||
>Element : Symbol(Element, Decl(Element.ts, 1, 23))
|
||||
|
||||
name: string;
|
||||
>name : Symbol(Element.name, Decl(Element.ts, 2, 23))
|
||||
|
||||
isIntrinsic: boolean;
|
||||
>isIntrinsic : Symbol(Element.isIntrinsic, Decl(Element.ts, 3, 21))
|
||||
|
||||
isCustomElement: boolean;
|
||||
>isCustomElement : Symbol(Element.isCustomElement, Decl(Element.ts, 4, 29))
|
||||
|
||||
toString(renderId?: number): string;
|
||||
>toString : Symbol(Element.toString, Decl(Element.ts, 5, 33))
|
||||
>renderId : Symbol(renderId, Decl(Element.ts, 6, 17))
|
||||
|
||||
bindDOM(renderId?: number): number;
|
||||
>bindDOM : Symbol(Element.bindDOM, Decl(Element.ts, 6, 44))
|
||||
>renderId : Symbol(renderId, Decl(Element.ts, 7, 16))
|
||||
|
||||
resetComponent(): void;
|
||||
>resetComponent : Symbol(Element.resetComponent, Decl(Element.ts, 7, 43))
|
||||
|
||||
instantiateComponents(renderId?: number): number;
|
||||
>instantiateComponents : Symbol(Element.instantiateComponents, Decl(Element.ts, 8, 31))
|
||||
>renderId : Symbol(renderId, Decl(Element.ts, 9, 30))
|
||||
|
||||
props: any;
|
||||
>props : Symbol(Element.props, Decl(Element.ts, 9, 57))
|
||||
}
|
||||
}
|
||||
export namespace Element {
|
||||
>Element : Symbol(Element, Decl(Element.ts, 12, 1))
|
||||
|
||||
export function isElement(el: any): el is JSX.Element {
|
||||
>isElement : Symbol(isElement, Decl(Element.ts, 13, 26))
|
||||
>el : Symbol(el, Decl(Element.ts, 14, 30))
|
||||
>el : Symbol(el, Decl(Element.ts, 14, 30))
|
||||
>JSX : Symbol(JSX, Decl(Element.ts, 0, 0))
|
||||
>Element : Symbol(JSX.Element, Decl(Element.ts, 1, 23))
|
||||
|
||||
return el.markAsChildOfRootElement !== undefined;
|
||||
>el : Symbol(el, Decl(Element.ts, 14, 30))
|
||||
>undefined : Symbol(undefined)
|
||||
}
|
||||
|
||||
export function createElement(args: any[]) {
|
||||
>createElement : Symbol(createElement, Decl(Element.ts, 16, 5))
|
||||
>args : Symbol(args, Decl(Element.ts, 18, 34))
|
||||
|
||||
return {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export let createElement = Element.createElement;
|
||||
>createElement : Symbol(createElement, Decl(Element.ts, 25, 10))
|
||||
>Element.createElement : Symbol(Element.createElement, Decl(Element.ts, 16, 5))
|
||||
>Element : Symbol(Element, Decl(Element.ts, 12, 1))
|
||||
>createElement : Symbol(Element.createElement, Decl(Element.ts, 16, 5))
|
||||
|
||||
function toCamelCase(text: string): string {
|
||||
>toCamelCase : Symbol(toCamelCase, Decl(Element.ts, 25, 49))
|
||||
>text : Symbol(text, Decl(Element.ts, 27, 21))
|
||||
|
||||
return text[0].toLowerCase() + text.substring(1);
|
||||
>text[0].toLowerCase : Symbol(String.toLowerCase, Decl(lib.es5.d.ts, --, --))
|
||||
>text : Symbol(text, Decl(Element.ts, 27, 21))
|
||||
>toLowerCase : Symbol(String.toLowerCase, Decl(lib.es5.d.ts, --, --))
|
||||
>text.substring : Symbol(String.substring, Decl(lib.es5.d.ts, --, --))
|
||||
>text : Symbol(text, Decl(Element.ts, 27, 21))
|
||||
>substring : Symbol(String.substring, Decl(lib.es5.d.ts, --, --))
|
||||
}
|
||||
|
||||
=== tests/cases/compiler/test.tsx ===
|
||||
import { Element} from './Element';
|
||||
>Element : Symbol(Element, Decl(test.tsx, 0, 8))
|
||||
|
||||
let c: {
|
||||
>c : Symbol(c, Decl(test.tsx, 2, 3))
|
||||
|
||||
a?: {
|
||||
>a : Symbol(a, Decl(test.tsx, 2, 8))
|
||||
|
||||
b: string
|
||||
>b : Symbol(b, Decl(test.tsx, 3, 6))
|
||||
}
|
||||
};
|
||||
|
||||
class A {
|
||||
>A : Symbol(A, Decl(test.tsx, 6, 2))
|
||||
|
||||
view() {
|
||||
>view : Symbol(A.view, Decl(test.tsx, 8, 9))
|
||||
|
||||
return [
|
||||
<meta content="helloworld"></meta>,
|
||||
>meta : Symbol(unknown)
|
||||
>content : Symbol(unknown)
|
||||
>meta : Symbol(unknown)
|
||||
|
||||
<meta content={c.a!.b}></meta>
|
||||
>meta : Symbol(unknown)
|
||||
>content : Symbol(unknown)
|
||||
>c.a!.b : Symbol(b, Decl(test.tsx, 3, 6))
|
||||
>c.a : Symbol(a, Decl(test.tsx, 2, 8))
|
||||
>c : Symbol(c, Decl(test.tsx, 2, 3))
|
||||
>a : Symbol(a, Decl(test.tsx, 2, 8))
|
||||
>b : Symbol(b, Decl(test.tsx, 3, 6))
|
||||
>meta : Symbol(unknown)
|
||||
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,134 @@
|
||||
=== tests/cases/compiler/Element.ts ===
|
||||
|
||||
declare namespace JSX {
|
||||
>JSX : any
|
||||
|
||||
interface Element {
|
||||
>Element : Element
|
||||
|
||||
name: string;
|
||||
>name : string
|
||||
|
||||
isIntrinsic: boolean;
|
||||
>isIntrinsic : boolean
|
||||
|
||||
isCustomElement: boolean;
|
||||
>isCustomElement : boolean
|
||||
|
||||
toString(renderId?: number): string;
|
||||
>toString : (renderId?: number) => string
|
||||
>renderId : number
|
||||
|
||||
bindDOM(renderId?: number): number;
|
||||
>bindDOM : (renderId?: number) => number
|
||||
>renderId : number
|
||||
|
||||
resetComponent(): void;
|
||||
>resetComponent : () => void
|
||||
|
||||
instantiateComponents(renderId?: number): number;
|
||||
>instantiateComponents : (renderId?: number) => number
|
||||
>renderId : number
|
||||
|
||||
props: any;
|
||||
>props : any
|
||||
}
|
||||
}
|
||||
export namespace Element {
|
||||
>Element : typeof Element
|
||||
|
||||
export function isElement(el: any): el is JSX.Element {
|
||||
>isElement : (el: any) => el is JSX.Element
|
||||
>el : any
|
||||
>el : any
|
||||
>JSX : any
|
||||
>Element : JSX.Element
|
||||
|
||||
return el.markAsChildOfRootElement !== undefined;
|
||||
>el.markAsChildOfRootElement !== undefined : boolean
|
||||
>el.markAsChildOfRootElement : any
|
||||
>el : any
|
||||
>markAsChildOfRootElement : any
|
||||
>undefined : undefined
|
||||
}
|
||||
|
||||
export function createElement(args: any[]) {
|
||||
>createElement : (args: any[]) => {}
|
||||
>args : any[]
|
||||
|
||||
return {
|
||||
>{ } : {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export let createElement = Element.createElement;
|
||||
>createElement : (args: any[]) => {}
|
||||
>Element.createElement : (args: any[]) => {}
|
||||
>Element : typeof Element
|
||||
>createElement : (args: any[]) => {}
|
||||
|
||||
function toCamelCase(text: string): string {
|
||||
>toCamelCase : (text: string) => string
|
||||
>text : string
|
||||
|
||||
return text[0].toLowerCase() + text.substring(1);
|
||||
>text[0].toLowerCase() + text.substring(1) : string
|
||||
>text[0].toLowerCase() : string
|
||||
>text[0].toLowerCase : () => string
|
||||
>text[0] : string
|
||||
>text : string
|
||||
>0 : 0
|
||||
>toLowerCase : () => string
|
||||
>text.substring(1) : string
|
||||
>text.substring : (start: number, end?: number) => string
|
||||
>text : string
|
||||
>substring : (start: number, end?: number) => string
|
||||
>1 : 1
|
||||
}
|
||||
|
||||
=== tests/cases/compiler/test.tsx ===
|
||||
import { Element} from './Element';
|
||||
>Element : typeof Element
|
||||
|
||||
let c: {
|
||||
>c : { a?: { b: string; }; }
|
||||
|
||||
a?: {
|
||||
>a : { b: string; }
|
||||
|
||||
b: string
|
||||
>b : string
|
||||
}
|
||||
};
|
||||
|
||||
class A {
|
||||
>A : A
|
||||
|
||||
view() {
|
||||
>view : () => any[]
|
||||
|
||||
return [
|
||||
>[ <meta content="helloworld"></meta>, <meta content={c.a!.b}></meta> ] : any[]
|
||||
|
||||
<meta content="helloworld"></meta>,
|
||||
><meta content="helloworld"></meta> : any
|
||||
>meta : any
|
||||
>content : any
|
||||
>meta : any
|
||||
|
||||
<meta content={c.a!.b}></meta>
|
||||
><meta content={c.a!.b}></meta> : any
|
||||
>meta : any
|
||||
>content : any
|
||||
>c.a!.b : string
|
||||
>c.a! : { b: string; }
|
||||
>c.a : { b: string; }
|
||||
>c : { a?: { b: string; }; }
|
||||
>a : { b: string; }
|
||||
>b : string
|
||||
>meta : any
|
||||
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
tests/cases/compiler/test.tsx(10,17): error TS2304: Cannot find name 'MyElement'.
|
||||
|
||||
|
||||
==== tests/cases/compiler/test.tsx (1 errors) ====
|
||||
|
||||
declare module JSX {
|
||||
interface IntrinsicElements {
|
||||
[s: string]: any;
|
||||
}
|
||||
}
|
||||
|
||||
export class AppComponent {
|
||||
render(createElement) {
|
||||
return <div />;
|
||||
~~~
|
||||
!!! error TS2304: Cannot find name 'MyElement'.
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
//// [test.tsx]
|
||||
|
||||
declare module JSX {
|
||||
interface IntrinsicElements {
|
||||
[s: string]: any;
|
||||
}
|
||||
}
|
||||
|
||||
export class AppComponent {
|
||||
render(createElement) {
|
||||
return <div />;
|
||||
}
|
||||
}
|
||||
|
||||
//// [test.js]
|
||||
"use strict";
|
||||
class AppComponent {
|
||||
render(createElement) {
|
||||
return MyElement.createElement("div", null);
|
||||
}
|
||||
}
|
||||
exports.AppComponent = AppComponent;
|
||||
//# sourceMappingURL=test.js.map
|
||||
@@ -0,0 +1,2 @@
|
||||
//// [test.js.map]
|
||||
{"version":3,"file":"test.js","sourceRoot":"","sources":["test.tsx"],"names":[],"mappings":";AAOA;IACI,MAAM,CAAC,aAAa;QAChB,MAAM,CAAC,oCAAO,CAAC;IACnB,CAAC;CACJ;AAJD,oCAIC"}
|
||||
@@ -0,0 +1,87 @@
|
||||
===================================================================
|
||||
JsFile: test.js
|
||||
mapUrl: test.js.map
|
||||
sourceRoot:
|
||||
sources: test.tsx
|
||||
===================================================================
|
||||
-------------------------------------------------------------------
|
||||
emittedFile:tests/cases/compiler/test.js
|
||||
sourceFile:test.tsx
|
||||
-------------------------------------------------------------------
|
||||
>>>"use strict";
|
||||
>>>class AppComponent {
|
||||
1 >
|
||||
2 >^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
|
||||
1 >
|
||||
>declare module JSX {
|
||||
> interface IntrinsicElements {
|
||||
> [s: string]: any;
|
||||
> }
|
||||
>}
|
||||
>
|
||||
>
|
||||
1 >Emitted(2, 1) Source(8, 1) + SourceIndex(0)
|
||||
---
|
||||
>>> render(createElement) {
|
||||
1->^^^^
|
||||
2 > ^^^^^^
|
||||
3 > ^
|
||||
4 > ^^^^^^^^^^^^^
|
||||
5 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
|
||||
1->export class AppComponent {
|
||||
>
|
||||
2 > render
|
||||
3 > (
|
||||
4 > createElement
|
||||
1->Emitted(3, 5) Source(9, 5) + SourceIndex(0)
|
||||
2 >Emitted(3, 11) Source(9, 11) + SourceIndex(0)
|
||||
3 >Emitted(3, 12) Source(9, 12) + SourceIndex(0)
|
||||
4 >Emitted(3, 25) Source(9, 25) + SourceIndex(0)
|
||||
---
|
||||
>>> return MyElement.createElement("div", null);
|
||||
1->^^^^^^^^
|
||||
2 > ^^^^^^
|
||||
3 > ^
|
||||
4 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
5 > ^
|
||||
1->) {
|
||||
>
|
||||
2 > return
|
||||
3 >
|
||||
4 > <div />
|
||||
5 > ;
|
||||
1->Emitted(4, 9) Source(10, 9) + SourceIndex(0)
|
||||
2 >Emitted(4, 15) Source(10, 15) + SourceIndex(0)
|
||||
3 >Emitted(4, 16) Source(10, 16) + SourceIndex(0)
|
||||
4 >Emitted(4, 52) Source(10, 23) + SourceIndex(0)
|
||||
5 >Emitted(4, 53) Source(10, 24) + SourceIndex(0)
|
||||
---
|
||||
>>> }
|
||||
1 >^^^^
|
||||
2 > ^
|
||||
1 >
|
||||
>
|
||||
2 > }
|
||||
1 >Emitted(5, 5) Source(11, 5) + SourceIndex(0)
|
||||
2 >Emitted(5, 6) Source(11, 6) + SourceIndex(0)
|
||||
---
|
||||
>>>}
|
||||
1 >^
|
||||
2 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
|
||||
1 >
|
||||
>}
|
||||
1 >Emitted(6, 2) Source(12, 2) + SourceIndex(0)
|
||||
---
|
||||
>>>exports.AppComponent = AppComponent;
|
||||
1->
|
||||
2 >^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
1->
|
||||
2 >export class AppComponent {
|
||||
> render(createElement) {
|
||||
> return <div />;
|
||||
> }
|
||||
>}
|
||||
1->Emitted(7, 1) Source(8, 1) + SourceIndex(0)
|
||||
2 >Emitted(7, 37) Source(12, 2) + SourceIndex(0)
|
||||
---
|
||||
>>>//# sourceMappingURL=test.js.map
|
||||
@@ -0,0 +1,67 @@
|
||||
//// [objectRest.ts]
|
||||
let o = { a: 1, b: 'no' }
|
||||
var { ...clone } = o;
|
||||
var { a, ...justB } = o;
|
||||
var { a, b: renamed, ...empty } = o;
|
||||
var { ['b']: renamed, ...justA } = o;
|
||||
var { 'b': renamed, ...justA } = o;
|
||||
var { b: { '0': n, '1': oooo }, ...justA } = o;
|
||||
|
||||
let o2 = { c: 'terrible idea?', d: 'yes' };
|
||||
var { d: renamed, ...d } = o2;
|
||||
|
||||
let nestedrest: { x: number, n1: { y: number, n2: { z: number, n3: { n4: number } } }, rest: number, restrest: number };
|
||||
var { x, n1: { y, n2: { z, n3: { ...nr } } }, ...restrest } = nestedrest;
|
||||
|
||||
let complex: { x: { ka, ki }, y: number };
|
||||
var { x: { ka, ...nested }, y: other, ...rest } = complex;
|
||||
({x: { ka, ...nested }, y: other, ...rest} = complex);
|
||||
var { x, ...fresh } = { x: 1, y: 2 };
|
||||
({ x, ...fresh } = { x: 1, y: 2 });
|
||||
|
||||
class Removable {
|
||||
private x: number;
|
||||
protected y: number;
|
||||
set z(value: number) { }
|
||||
get both(): number { return 12 }
|
||||
set both(value: number) { }
|
||||
m() { }
|
||||
removed: string;
|
||||
remainder: string;
|
||||
}
|
||||
var removable = new Removable();
|
||||
var { removed, ...removableRest } = removable;
|
||||
|
||||
|
||||
//// [objectRest.js]
|
||||
var __rest = (this && this.__rest) || function (s, e) {
|
||||
var t = {};
|
||||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && !e.indexOf(p))
|
||||
t[p] = s[p];
|
||||
return t;
|
||||
};
|
||||
let o = { a: 1, b: 'no' };
|
||||
var clone = __rest(o, []);
|
||||
var { a } = o, justB = __rest(o, ["a"]);
|
||||
var { a, b: renamed } = o, empty = __rest(o, ["a", "b"]);
|
||||
var { ['b']: renamed } = o, justA = __rest(o, ["b"]);
|
||||
var { 'b': renamed } = o, justA = __rest(o, ["b"]);
|
||||
var { b: { '0': n, '1': oooo } } = o, justA = __rest(o, ["b"]);
|
||||
let o2 = { c: 'terrible idea?', d: 'yes' };
|
||||
var { d: renamed } = o2, d = __rest(o2, ["d"]);
|
||||
let nestedrest;
|
||||
var { x } = nestedrest, _a = nestedrest.n1, { y } = _a, _b = _a.n2, { z } = _b, nr = __rest(_b.n3, []), restrest = __rest(nestedrest, ["x", "n1"]);
|
||||
let complex;
|
||||
var _c = complex.x, { ka } = _c, nested = __rest(_c, ["ka"]), { y: other } = complex, rest = __rest(complex, ["x", "y"]);
|
||||
(_d = complex.x, { ka } = _d, nested = __rest(_d, ["ka"]), { y: other } = complex, rest = __rest(complex, ["x", "y"]), complex);
|
||||
var _e = { x: 1, y: 2 }, { x } = _e, fresh = __rest(_e, ["x"]);
|
||||
(_f = { x: 1, y: 2 }, { x } = _f, fresh = __rest(_f, ["x"]), _f);
|
||||
class Removable {
|
||||
set z(value) { }
|
||||
get both() { return 12; }
|
||||
set both(value) { }
|
||||
m() { }
|
||||
}
|
||||
var removable = new Removable();
|
||||
var { removed } = removable, removableRest = __rest(removable, ["removed"]);
|
||||
var _d, _f;
|
||||
@@ -0,0 +1,146 @@
|
||||
=== tests/cases/conformance/types/rest/objectRest.ts ===
|
||||
let o = { a: 1, b: 'no' }
|
||||
>o : Symbol(o, Decl(objectRest.ts, 0, 3))
|
||||
>a : Symbol(a, Decl(objectRest.ts, 0, 9))
|
||||
>b : Symbol(b, Decl(objectRest.ts, 0, 15))
|
||||
|
||||
var { ...clone } = o;
|
||||
>clone : Symbol(clone, Decl(objectRest.ts, 1, 5))
|
||||
>o : Symbol(o, Decl(objectRest.ts, 0, 3))
|
||||
|
||||
var { a, ...justB } = o;
|
||||
>a : Symbol(a, Decl(objectRest.ts, 2, 5), Decl(objectRest.ts, 3, 5))
|
||||
>justB : Symbol(justB, Decl(objectRest.ts, 2, 8))
|
||||
>o : Symbol(o, Decl(objectRest.ts, 0, 3))
|
||||
|
||||
var { a, b: renamed, ...empty } = o;
|
||||
>a : Symbol(a, Decl(objectRest.ts, 2, 5), Decl(objectRest.ts, 3, 5))
|
||||
>b : Symbol(b, Decl(objectRest.ts, 0, 15))
|
||||
>renamed : Symbol(renamed, Decl(objectRest.ts, 3, 8), Decl(objectRest.ts, 4, 5), Decl(objectRest.ts, 5, 5), Decl(objectRest.ts, 9, 5))
|
||||
>empty : Symbol(empty, Decl(objectRest.ts, 3, 20))
|
||||
>o : Symbol(o, Decl(objectRest.ts, 0, 3))
|
||||
|
||||
var { ['b']: renamed, ...justA } = o;
|
||||
>'b' : Symbol(renamed, Decl(objectRest.ts, 3, 8), Decl(objectRest.ts, 4, 5), Decl(objectRest.ts, 5, 5), Decl(objectRest.ts, 9, 5))
|
||||
>renamed : Symbol(renamed, Decl(objectRest.ts, 3, 8), Decl(objectRest.ts, 4, 5), Decl(objectRest.ts, 5, 5), Decl(objectRest.ts, 9, 5))
|
||||
>justA : Symbol(justA, Decl(objectRest.ts, 4, 21), Decl(objectRest.ts, 5, 19), Decl(objectRest.ts, 6, 31))
|
||||
>o : Symbol(o, Decl(objectRest.ts, 0, 3))
|
||||
|
||||
var { 'b': renamed, ...justA } = o;
|
||||
>renamed : Symbol(renamed, Decl(objectRest.ts, 3, 8), Decl(objectRest.ts, 4, 5), Decl(objectRest.ts, 5, 5), Decl(objectRest.ts, 9, 5))
|
||||
>justA : Symbol(justA, Decl(objectRest.ts, 4, 21), Decl(objectRest.ts, 5, 19), Decl(objectRest.ts, 6, 31))
|
||||
>o : Symbol(o, Decl(objectRest.ts, 0, 3))
|
||||
|
||||
var { b: { '0': n, '1': oooo }, ...justA } = o;
|
||||
>b : Symbol(b, Decl(objectRest.ts, 0, 15))
|
||||
>n : Symbol(n, Decl(objectRest.ts, 6, 10))
|
||||
>oooo : Symbol(oooo, Decl(objectRest.ts, 6, 18))
|
||||
>justA : Symbol(justA, Decl(objectRest.ts, 4, 21), Decl(objectRest.ts, 5, 19), Decl(objectRest.ts, 6, 31))
|
||||
>o : Symbol(o, Decl(objectRest.ts, 0, 3))
|
||||
|
||||
let o2 = { c: 'terrible idea?', d: 'yes' };
|
||||
>o2 : Symbol(o2, Decl(objectRest.ts, 8, 3))
|
||||
>c : Symbol(c, Decl(objectRest.ts, 8, 10))
|
||||
>d : Symbol(d, Decl(objectRest.ts, 8, 31))
|
||||
|
||||
var { d: renamed, ...d } = o2;
|
||||
>d : Symbol(d, Decl(objectRest.ts, 8, 31))
|
||||
>renamed : Symbol(renamed, Decl(objectRest.ts, 3, 8), Decl(objectRest.ts, 4, 5), Decl(objectRest.ts, 5, 5), Decl(objectRest.ts, 9, 5))
|
||||
>d : Symbol(d, Decl(objectRest.ts, 9, 17))
|
||||
>o2 : Symbol(o2, Decl(objectRest.ts, 8, 3))
|
||||
|
||||
let nestedrest: { x: number, n1: { y: number, n2: { z: number, n3: { n4: number } } }, rest: number, restrest: number };
|
||||
>nestedrest : Symbol(nestedrest, Decl(objectRest.ts, 11, 3))
|
||||
>x : Symbol(x, Decl(objectRest.ts, 11, 17))
|
||||
>n1 : Symbol(n1, Decl(objectRest.ts, 11, 28))
|
||||
>y : Symbol(y, Decl(objectRest.ts, 11, 34))
|
||||
>n2 : Symbol(n2, Decl(objectRest.ts, 11, 45))
|
||||
>z : Symbol(z, Decl(objectRest.ts, 11, 51))
|
||||
>n3 : Symbol(n3, Decl(objectRest.ts, 11, 62))
|
||||
>n4 : Symbol(n4, Decl(objectRest.ts, 11, 68))
|
||||
>rest : Symbol(rest, Decl(objectRest.ts, 11, 86))
|
||||
>restrest : Symbol(restrest, Decl(objectRest.ts, 11, 100))
|
||||
|
||||
var { x, n1: { y, n2: { z, n3: { ...nr } } }, ...restrest } = nestedrest;
|
||||
>x : Symbol(x, Decl(objectRest.ts, 12, 5), Decl(objectRest.ts, 17, 5))
|
||||
>n1 : Symbol(n1, Decl(objectRest.ts, 11, 28))
|
||||
>y : Symbol(y, Decl(objectRest.ts, 12, 14))
|
||||
>n2 : Symbol(n2, Decl(objectRest.ts, 11, 45))
|
||||
>z : Symbol(z, Decl(objectRest.ts, 12, 23))
|
||||
>n3 : Symbol(n3, Decl(objectRest.ts, 11, 62))
|
||||
>nr : Symbol(nr, Decl(objectRest.ts, 12, 32))
|
||||
>restrest : Symbol(restrest, Decl(objectRest.ts, 12, 45))
|
||||
>nestedrest : Symbol(nestedrest, Decl(objectRest.ts, 11, 3))
|
||||
|
||||
let complex: { x: { ka, ki }, y: number };
|
||||
>complex : Symbol(complex, Decl(objectRest.ts, 14, 3))
|
||||
>x : Symbol(x, Decl(objectRest.ts, 14, 14))
|
||||
>ka : Symbol(ka, Decl(objectRest.ts, 14, 19))
|
||||
>ki : Symbol(ki, Decl(objectRest.ts, 14, 23))
|
||||
>y : Symbol(y, Decl(objectRest.ts, 14, 29))
|
||||
|
||||
var { x: { ka, ...nested }, y: other, ...rest } = complex;
|
||||
>x : Symbol(x, Decl(objectRest.ts, 14, 14))
|
||||
>ka : Symbol(ka, Decl(objectRest.ts, 15, 10))
|
||||
>nested : Symbol(nested, Decl(objectRest.ts, 15, 14))
|
||||
>y : Symbol(y, Decl(objectRest.ts, 14, 29))
|
||||
>other : Symbol(other, Decl(objectRest.ts, 15, 27))
|
||||
>rest : Symbol(rest, Decl(objectRest.ts, 15, 37))
|
||||
>complex : Symbol(complex, Decl(objectRest.ts, 14, 3))
|
||||
|
||||
({x: { ka, ...nested }, y: other, ...rest} = complex);
|
||||
>x : Symbol(x, Decl(objectRest.ts, 16, 2))
|
||||
>ka : Symbol(ka, Decl(objectRest.ts, 16, 6))
|
||||
>y : Symbol(y, Decl(objectRest.ts, 16, 23))
|
||||
>other : Symbol(other, Decl(objectRest.ts, 15, 27))
|
||||
>complex : Symbol(complex, Decl(objectRest.ts, 14, 3))
|
||||
|
||||
var { x, ...fresh } = { x: 1, y: 2 };
|
||||
>x : Symbol(x, Decl(objectRest.ts, 12, 5), Decl(objectRest.ts, 17, 5))
|
||||
>fresh : Symbol(fresh, Decl(objectRest.ts, 17, 8))
|
||||
>x : Symbol(x, Decl(objectRest.ts, 17, 23))
|
||||
>y : Symbol(y, Decl(objectRest.ts, 17, 29))
|
||||
|
||||
({ x, ...fresh } = { x: 1, y: 2 });
|
||||
>x : Symbol(x, Decl(objectRest.ts, 18, 2))
|
||||
>x : Symbol(x, Decl(objectRest.ts, 18, 20))
|
||||
>y : Symbol(y, Decl(objectRest.ts, 18, 26))
|
||||
|
||||
class Removable {
|
||||
>Removable : Symbol(Removable, Decl(objectRest.ts, 18, 35))
|
||||
|
||||
private x: number;
|
||||
>x : Symbol(Removable.x, Decl(objectRest.ts, 20, 17))
|
||||
|
||||
protected y: number;
|
||||
>y : Symbol(Removable.y, Decl(objectRest.ts, 21, 22))
|
||||
|
||||
set z(value: number) { }
|
||||
>z : Symbol(Removable.z, Decl(objectRest.ts, 22, 24))
|
||||
>value : Symbol(value, Decl(objectRest.ts, 23, 10))
|
||||
|
||||
get both(): number { return 12 }
|
||||
>both : Symbol(Removable.both, Decl(objectRest.ts, 23, 28), Decl(objectRest.ts, 24, 36))
|
||||
|
||||
set both(value: number) { }
|
||||
>both : Symbol(Removable.both, Decl(objectRest.ts, 23, 28), Decl(objectRest.ts, 24, 36))
|
||||
>value : Symbol(value, Decl(objectRest.ts, 25, 13))
|
||||
|
||||
m() { }
|
||||
>m : Symbol(Removable.m, Decl(objectRest.ts, 25, 31))
|
||||
|
||||
removed: string;
|
||||
>removed : Symbol(Removable.removed, Decl(objectRest.ts, 26, 11))
|
||||
|
||||
remainder: string;
|
||||
>remainder : Symbol(Removable.remainder, Decl(objectRest.ts, 27, 20))
|
||||
}
|
||||
var removable = new Removable();
|
||||
>removable : Symbol(removable, Decl(objectRest.ts, 30, 3))
|
||||
>Removable : Symbol(Removable, Decl(objectRest.ts, 18, 35))
|
||||
|
||||
var { removed, ...removableRest } = removable;
|
||||
>removed : Symbol(removed, Decl(objectRest.ts, 31, 5))
|
||||
>removableRest : Symbol(removableRest, Decl(objectRest.ts, 31, 14))
|
||||
>removable : Symbol(removable, Decl(objectRest.ts, 30, 3))
|
||||
|
||||
@@ -0,0 +1,170 @@
|
||||
=== tests/cases/conformance/types/rest/objectRest.ts ===
|
||||
let o = { a: 1, b: 'no' }
|
||||
>o : { a: number; b: string; }
|
||||
>{ a: 1, b: 'no' } : { a: number; b: string; }
|
||||
>a : number
|
||||
>1 : 1
|
||||
>b : string
|
||||
>'no' : "no"
|
||||
|
||||
var { ...clone } = o;
|
||||
>clone : { a: number; b: string; }
|
||||
>o : { a: number; b: string; }
|
||||
|
||||
var { a, ...justB } = o;
|
||||
>a : number
|
||||
>justB : { b: string; }
|
||||
>o : { a: number; b: string; }
|
||||
|
||||
var { a, b: renamed, ...empty } = o;
|
||||
>a : number
|
||||
>b : any
|
||||
>renamed : string
|
||||
>empty : {}
|
||||
>o : { a: number; b: string; }
|
||||
|
||||
var { ['b']: renamed, ...justA } = o;
|
||||
>'b' : "b"
|
||||
>renamed : string
|
||||
>justA : { a: number; }
|
||||
>o : { a: number; b: string; }
|
||||
|
||||
var { 'b': renamed, ...justA } = o;
|
||||
>renamed : string
|
||||
>justA : { a: number; }
|
||||
>o : { a: number; b: string; }
|
||||
|
||||
var { b: { '0': n, '1': oooo }, ...justA } = o;
|
||||
>b : any
|
||||
>n : string
|
||||
>oooo : string
|
||||
>justA : { a: number; }
|
||||
>o : { a: number; b: string; }
|
||||
|
||||
let o2 = { c: 'terrible idea?', d: 'yes' };
|
||||
>o2 : { c: string; d: string; }
|
||||
>{ c: 'terrible idea?', d: 'yes' } : { c: string; d: string; }
|
||||
>c : string
|
||||
>'terrible idea?' : "terrible idea?"
|
||||
>d : string
|
||||
>'yes' : "yes"
|
||||
|
||||
var { d: renamed, ...d } = o2;
|
||||
>d : any
|
||||
>renamed : string
|
||||
>d : { c: string; }
|
||||
>o2 : { c: string; d: string; }
|
||||
|
||||
let nestedrest: { x: number, n1: { y: number, n2: { z: number, n3: { n4: number } } }, rest: number, restrest: number };
|
||||
>nestedrest : { x: number; n1: { y: number; n2: { z: number; n3: { n4: number; }; }; }; rest: number; restrest: number; }
|
||||
>x : number
|
||||
>n1 : { y: number; n2: { z: number; n3: { n4: number; }; }; }
|
||||
>y : number
|
||||
>n2 : { z: number; n3: { n4: number; }; }
|
||||
>z : number
|
||||
>n3 : { n4: number; }
|
||||
>n4 : number
|
||||
>rest : number
|
||||
>restrest : number
|
||||
|
||||
var { x, n1: { y, n2: { z, n3: { ...nr } } }, ...restrest } = nestedrest;
|
||||
>x : number
|
||||
>n1 : any
|
||||
>y : number
|
||||
>n2 : any
|
||||
>z : number
|
||||
>n3 : any
|
||||
>nr : { n4: number; }
|
||||
>restrest : { rest: number; restrest: number; }
|
||||
>nestedrest : { x: number; n1: { y: number; n2: { z: number; n3: { n4: number; }; }; }; rest: number; restrest: number; }
|
||||
|
||||
let complex: { x: { ka, ki }, y: number };
|
||||
>complex : { x: { ka: any; ki: any; }; y: number; }
|
||||
>x : { ka: any; ki: any; }
|
||||
>ka : any
|
||||
>ki : any
|
||||
>y : number
|
||||
|
||||
var { x: { ka, ...nested }, y: other, ...rest } = complex;
|
||||
>x : any
|
||||
>ka : any
|
||||
>nested : { ki: any; }
|
||||
>y : any
|
||||
>other : number
|
||||
>rest : {}
|
||||
>complex : { x: { ka: any; ki: any; }; y: number; }
|
||||
|
||||
({x: { ka, ...nested }, y: other, ...rest} = complex);
|
||||
>({x: { ka, ...nested }, y: other, ...rest} = complex) : { x: { ka: any; ki: any; }; y: number; }
|
||||
>{x: { ka, ...nested }, y: other, ...rest} = complex : { x: { ka: any; ki: any; }; y: number; }
|
||||
>{x: { ka, ...nested }, y: other, ...rest} : { x: { ki: any; ka: any; }; y: number; }
|
||||
>x : { ki: any; ka: any; }
|
||||
>{ ka, ...nested } : { ki: any; ka: any; }
|
||||
>ka : any
|
||||
>nested : any
|
||||
>y : number
|
||||
>other : number
|
||||
>rest : any
|
||||
>complex : { x: { ka: any; ki: any; }; y: number; }
|
||||
|
||||
var { x, ...fresh } = { x: 1, y: 2 };
|
||||
>x : number
|
||||
>fresh : { y: number; }
|
||||
>{ x: 1, y: 2 } : { x: number; y: number; }
|
||||
>x : number
|
||||
>1 : 1
|
||||
>y : number
|
||||
>2 : 2
|
||||
|
||||
({ x, ...fresh } = { x: 1, y: 2 });
|
||||
>({ x, ...fresh } = { x: 1, y: 2 }) : { x: number; y: number; }
|
||||
>{ x, ...fresh } = { x: 1, y: 2 } : { x: number; y: number; }
|
||||
>{ x, ...fresh } : { y: number; x: number; }
|
||||
>x : number
|
||||
>fresh : any
|
||||
>{ x: 1, y: 2 } : { x: number; y: number; }
|
||||
>x : number
|
||||
>1 : 1
|
||||
>y : number
|
||||
>2 : 2
|
||||
|
||||
class Removable {
|
||||
>Removable : Removable
|
||||
|
||||
private x: number;
|
||||
>x : number
|
||||
|
||||
protected y: number;
|
||||
>y : number
|
||||
|
||||
set z(value: number) { }
|
||||
>z : number
|
||||
>value : number
|
||||
|
||||
get both(): number { return 12 }
|
||||
>both : number
|
||||
>12 : 12
|
||||
|
||||
set both(value: number) { }
|
||||
>both : number
|
||||
>value : number
|
||||
|
||||
m() { }
|
||||
>m : () => void
|
||||
|
||||
removed: string;
|
||||
>removed : string
|
||||
|
||||
remainder: string;
|
||||
>remainder : string
|
||||
}
|
||||
var removable = new Removable();
|
||||
>removable : Removable
|
||||
>new Removable() : Removable
|
||||
>Removable : typeof Removable
|
||||
|
||||
var { removed, ...removableRest } = removable;
|
||||
>removed : string
|
||||
>removableRest : { both: number; remainder: string; }
|
||||
>removable : Removable
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
//// [objectRestAssignment.ts]
|
||||
let ka: any;
|
||||
let nested: { ki };
|
||||
let other: number;
|
||||
let rest: { };
|
||||
let complex: { x: { ka, ki }, y: number };
|
||||
({x: { ka, ...nested }, y: other, ...rest} = complex);
|
||||
|
||||
// should be:
|
||||
let overEmit: { a: { ka: string, x: string }[], b: { z: string, ki: string, ku: string }, ke: string, ko: string };
|
||||
|
||||
// var _g = overEmit.a, [_h, ...y] = _g, nested2 = __rest(_h, []), _j = overEmit.b, { z } = _j, c = __rest(_j, ["z"]), rest2 = __rest(overEmit, ["a", "b"]);
|
||||
var { a: [{ ...nested2 }, ...y], b: { z, ...c }, ...rest2 } = overEmit;
|
||||
({ a: [{ ...nested2 }, ...y], b: { z, ...c }, ...rest2 } = overEmit);
|
||||
|
||||
|
||||
//// [objectRestAssignment.js]
|
||||
var __rest = (this && this.__rest) || function (s, e) {
|
||||
var t = {};
|
||||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && !e.indexOf(p))
|
||||
t[p] = s[p];
|
||||
return t;
|
||||
};
|
||||
let ka;
|
||||
let nested;
|
||||
let other;
|
||||
let rest;
|
||||
let complex;
|
||||
(_a = complex.x, { ka } = _a, nested = __rest(_a, ["ka"]), { y: other } = complex, rest = __rest(complex, ["x", "y"]), complex);
|
||||
// should be:
|
||||
let overEmit;
|
||||
// var _g = overEmit.a, [_h, ...y] = _g, nested2 = __rest(_h, []), _j = overEmit.b, { z } = _j, c = __rest(_j, ["z"]), rest2 = __rest(overEmit, ["a", "b"]);
|
||||
var _b = overEmit.a, [_c, ...y] = _b, nested2 = __rest(_c, []), _d = overEmit.b, { z } = _d, c = __rest(_d, ["z"]), rest2 = __rest(overEmit, ["a", "b"]);
|
||||
(_e = overEmit.a, [_f, ...y] = _e, nested2 = __rest(_f, []), _g = overEmit.b, { z } = _g, c = __rest(_g, ["z"]), rest2 = __rest(overEmit, ["a", "b"]), overEmit);
|
||||
var _a, _e, _f, _g;
|
||||
@@ -0,0 +1,59 @@
|
||||
=== tests/cases/conformance/types/rest/objectRestAssignment.ts ===
|
||||
let ka: any;
|
||||
>ka : Symbol(ka, Decl(objectRestAssignment.ts, 0, 3))
|
||||
|
||||
let nested: { ki };
|
||||
>nested : Symbol(nested, Decl(objectRestAssignment.ts, 1, 3))
|
||||
>ki : Symbol(ki, Decl(objectRestAssignment.ts, 1, 13))
|
||||
|
||||
let other: number;
|
||||
>other : Symbol(other, Decl(objectRestAssignment.ts, 2, 3))
|
||||
|
||||
let rest: { };
|
||||
>rest : Symbol(rest, Decl(objectRestAssignment.ts, 3, 3))
|
||||
|
||||
let complex: { x: { ka, ki }, y: number };
|
||||
>complex : Symbol(complex, Decl(objectRestAssignment.ts, 4, 3))
|
||||
>x : Symbol(x, Decl(objectRestAssignment.ts, 4, 14))
|
||||
>ka : Symbol(ka, Decl(objectRestAssignment.ts, 4, 19))
|
||||
>ki : Symbol(ki, Decl(objectRestAssignment.ts, 4, 23))
|
||||
>y : Symbol(y, Decl(objectRestAssignment.ts, 4, 29))
|
||||
|
||||
({x: { ka, ...nested }, y: other, ...rest} = complex);
|
||||
>x : Symbol(x, Decl(objectRestAssignment.ts, 5, 2))
|
||||
>ka : Symbol(ka, Decl(objectRestAssignment.ts, 5, 6))
|
||||
>y : Symbol(y, Decl(objectRestAssignment.ts, 5, 23))
|
||||
>other : Symbol(other, Decl(objectRestAssignment.ts, 2, 3))
|
||||
>complex : Symbol(complex, Decl(objectRestAssignment.ts, 4, 3))
|
||||
|
||||
// should be:
|
||||
let overEmit: { a: { ka: string, x: string }[], b: { z: string, ki: string, ku: string }, ke: string, ko: string };
|
||||
>overEmit : Symbol(overEmit, Decl(objectRestAssignment.ts, 8, 3))
|
||||
>a : Symbol(a, Decl(objectRestAssignment.ts, 8, 15))
|
||||
>ka : Symbol(ka, Decl(objectRestAssignment.ts, 8, 20))
|
||||
>x : Symbol(x, Decl(objectRestAssignment.ts, 8, 32))
|
||||
>b : Symbol(b, Decl(objectRestAssignment.ts, 8, 47))
|
||||
>z : Symbol(z, Decl(objectRestAssignment.ts, 8, 52))
|
||||
>ki : Symbol(ki, Decl(objectRestAssignment.ts, 8, 63))
|
||||
>ku : Symbol(ku, Decl(objectRestAssignment.ts, 8, 75))
|
||||
>ke : Symbol(ke, Decl(objectRestAssignment.ts, 8, 89))
|
||||
>ko : Symbol(ko, Decl(objectRestAssignment.ts, 8, 101))
|
||||
|
||||
// var _g = overEmit.a, [_h, ...y] = _g, nested2 = __rest(_h, []), _j = overEmit.b, { z } = _j, c = __rest(_j, ["z"]), rest2 = __rest(overEmit, ["a", "b"]);
|
||||
var { a: [{ ...nested2 }, ...y], b: { z, ...c }, ...rest2 } = overEmit;
|
||||
>a : Symbol(a, Decl(objectRestAssignment.ts, 8, 15))
|
||||
>nested2 : Symbol(nested2, Decl(objectRestAssignment.ts, 11, 11))
|
||||
>y : Symbol(y, Decl(objectRestAssignment.ts, 11, 25))
|
||||
>b : Symbol(b, Decl(objectRestAssignment.ts, 8, 47))
|
||||
>z : Symbol(z, Decl(objectRestAssignment.ts, 11, 37))
|
||||
>c : Symbol(c, Decl(objectRestAssignment.ts, 11, 40))
|
||||
>rest2 : Symbol(rest2, Decl(objectRestAssignment.ts, 11, 48))
|
||||
>overEmit : Symbol(overEmit, Decl(objectRestAssignment.ts, 8, 3))
|
||||
|
||||
({ a: [{ ...nested2 }, ...y], b: { z, ...c }, ...rest2 } = overEmit);
|
||||
>a : Symbol(a, Decl(objectRestAssignment.ts, 12, 2))
|
||||
>y : Symbol(y, Decl(objectRestAssignment.ts, 11, 25))
|
||||
>b : Symbol(b, Decl(objectRestAssignment.ts, 12, 29))
|
||||
>z : Symbol(z, Decl(objectRestAssignment.ts, 12, 34))
|
||||
>overEmit : Symbol(overEmit, Decl(objectRestAssignment.ts, 8, 3))
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
=== tests/cases/conformance/types/rest/objectRestAssignment.ts ===
|
||||
let ka: any;
|
||||
>ka : any
|
||||
|
||||
let nested: { ki };
|
||||
>nested : { ki: any; }
|
||||
>ki : any
|
||||
|
||||
let other: number;
|
||||
>other : number
|
||||
|
||||
let rest: { };
|
||||
>rest : {}
|
||||
|
||||
let complex: { x: { ka, ki }, y: number };
|
||||
>complex : { x: { ka: any; ki: any; }; y: number; }
|
||||
>x : { ka: any; ki: any; }
|
||||
>ka : any
|
||||
>ki : any
|
||||
>y : number
|
||||
|
||||
({x: { ka, ...nested }, y: other, ...rest} = complex);
|
||||
>({x: { ka, ...nested }, y: other, ...rest} = complex) : { x: { ka: any; ki: any; }; y: number; }
|
||||
>{x: { ka, ...nested }, y: other, ...rest} = complex : { x: { ka: any; ki: any; }; y: number; }
|
||||
>{x: { ka, ...nested }, y: other, ...rest} : { x: { ki: any; ka: any; }; y: number; }
|
||||
>x : { ki: any; ka: any; }
|
||||
>{ ka, ...nested } : { ki: any; ka: any; }
|
||||
>ka : any
|
||||
>nested : any
|
||||
>y : number
|
||||
>other : number
|
||||
>rest : any
|
||||
>complex : { x: { ka: any; ki: any; }; y: number; }
|
||||
|
||||
// should be:
|
||||
let overEmit: { a: { ka: string, x: string }[], b: { z: string, ki: string, ku: string }, ke: string, ko: string };
|
||||
>overEmit : { a: { ka: string; x: string; }[]; b: { z: string; ki: string; ku: string; }; ke: string; ko: string; }
|
||||
>a : { ka: string; x: string; }[]
|
||||
>ka : string
|
||||
>x : string
|
||||
>b : { z: string; ki: string; ku: string; }
|
||||
>z : string
|
||||
>ki : string
|
||||
>ku : string
|
||||
>ke : string
|
||||
>ko : string
|
||||
|
||||
// var _g = overEmit.a, [_h, ...y] = _g, nested2 = __rest(_h, []), _j = overEmit.b, { z } = _j, c = __rest(_j, ["z"]), rest2 = __rest(overEmit, ["a", "b"]);
|
||||
var { a: [{ ...nested2 }, ...y], b: { z, ...c }, ...rest2 } = overEmit;
|
||||
>a : any
|
||||
>nested2 : { ka: string; x: string; }
|
||||
>y : { ka: string; x: string; }[]
|
||||
>b : any
|
||||
>z : string
|
||||
>c : { ki: string; ku: string; }
|
||||
>rest2 : { ke: string; ko: string; }
|
||||
>overEmit : { a: { ka: string; x: string; }[]; b: { z: string; ki: string; ku: string; }; ke: string; ko: string; }
|
||||
|
||||
({ a: [{ ...nested2 }, ...y], b: { z, ...c }, ...rest2 } = overEmit);
|
||||
>({ a: [{ ...nested2 }, ...y], b: { z, ...c }, ...rest2 } = overEmit) : { a: { ka: string; x: string; }[]; b: { z: string; ki: string; ku: string; }; ke: string; ko: string; }
|
||||
>{ a: [{ ...nested2 }, ...y], b: { z, ...c }, ...rest2 } = overEmit : { a: { ka: string; x: string; }[]; b: { z: string; ki: string; ku: string; }; ke: string; ko: string; }
|
||||
>{ a: [{ ...nested2 }, ...y], b: { z, ...c }, ...rest2 } : { ke: string; ko: string; a: { ka: string; x: string; }[]; b: { ki: string; ku: string; z: string; }; }
|
||||
>a : { ka: string; x: string; }[]
|
||||
>[{ ...nested2 }, ...y] : { ka: string; x: string; }[]
|
||||
>{ ...nested2 } : { ka: string; x: string; }
|
||||
>nested2 : any
|
||||
>...y : { ka: string; x: string; }
|
||||
>y : { ka: string; x: string; }[]
|
||||
>b : { ki: string; ku: string; z: string; }
|
||||
>{ z, ...c } : { ki: string; ku: string; z: string; }
|
||||
>z : string
|
||||
>c : any
|
||||
>rest2 : any
|
||||
>overEmit : { a: { ka: string; x: string; }[]; b: { z: string; ki: string; ku: string; }; ke: string; ko: string; }
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
//// [objectRestForOf.ts]
|
||||
let array: { x: number, y: string }[];
|
||||
for (let { x, ...restOf } of array) {
|
||||
[x, restOf];
|
||||
}
|
||||
let xx: number;
|
||||
let rrestOff: { y: string };
|
||||
for ({ x: xx, ...rrestOff } of array ) {
|
||||
[xx, rrestOff];
|
||||
}
|
||||
for (const norest of array.map(a => ({ ...a, x: 'a string' }))) {
|
||||
[norest.x, norest.y];
|
||||
// x is now a string. who knows why.
|
||||
}
|
||||
|
||||
|
||||
//// [objectRestForOf.js]
|
||||
var __assign = (this && this.__assign) || Object.assign || function(t) {
|
||||
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
||||
s = arguments[i];
|
||||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
||||
t[p] = s[p];
|
||||
}
|
||||
return t;
|
||||
};
|
||||
var __rest = (this && this.__rest) || function (s, e) {
|
||||
var t = {};
|
||||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && !e.indexOf(p))
|
||||
t[p] = s[p];
|
||||
return t;
|
||||
};
|
||||
let array;
|
||||
for (var array_1 of array) {
|
||||
var { x } = array_1, restOf = __rest(array_1, ["x"]);
|
||||
[x, restOf];
|
||||
}
|
||||
let xx;
|
||||
let rrestOff;
|
||||
for (var array_2 of array) {
|
||||
({ x: xx } = array_2, rrestOff = __rest(array_2, ["x"]));
|
||||
[xx, rrestOff];
|
||||
}
|
||||
for (const norest of array.map(a => (__assign({}, a, { x: 'a string' })))) {
|
||||
[norest.x, norest.y];
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
=== tests/cases/conformance/types/rest/objectRestForOf.ts ===
|
||||
let array: { x: number, y: string }[];
|
||||
>array : Symbol(array, Decl(objectRestForOf.ts, 0, 3))
|
||||
>x : Symbol(x, Decl(objectRestForOf.ts, 0, 12))
|
||||
>y : Symbol(y, Decl(objectRestForOf.ts, 0, 23))
|
||||
|
||||
for (let { x, ...restOf } of array) {
|
||||
>x : Symbol(x, Decl(objectRestForOf.ts, 1, 10))
|
||||
>restOf : Symbol(restOf, Decl(objectRestForOf.ts, 1, 13))
|
||||
>array : Symbol(array, Decl(objectRestForOf.ts, 0, 3))
|
||||
|
||||
[x, restOf];
|
||||
>x : Symbol(x, Decl(objectRestForOf.ts, 1, 10))
|
||||
>restOf : Symbol(restOf, Decl(objectRestForOf.ts, 1, 13))
|
||||
}
|
||||
let xx: number;
|
||||
>xx : Symbol(xx, Decl(objectRestForOf.ts, 4, 3))
|
||||
|
||||
let rrestOff: { y: string };
|
||||
>rrestOff : Symbol(rrestOff, Decl(objectRestForOf.ts, 5, 3))
|
||||
>y : Symbol(y, Decl(objectRestForOf.ts, 5, 15))
|
||||
|
||||
for ({ x: xx, ...rrestOff } of array ) {
|
||||
>x : Symbol(x, Decl(objectRestForOf.ts, 6, 6))
|
||||
>xx : Symbol(xx, Decl(objectRestForOf.ts, 4, 3))
|
||||
>array : Symbol(array, Decl(objectRestForOf.ts, 0, 3))
|
||||
|
||||
[xx, rrestOff];
|
||||
>xx : Symbol(xx, Decl(objectRestForOf.ts, 4, 3))
|
||||
>rrestOff : Symbol(rrestOff, Decl(objectRestForOf.ts, 5, 3))
|
||||
}
|
||||
for (const norest of array.map(a => ({ ...a, x: 'a string' }))) {
|
||||
>norest : Symbol(norest, Decl(objectRestForOf.ts, 9, 10))
|
||||
>array.map : Symbol(Array.map, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
|
||||
>array : Symbol(array, Decl(objectRestForOf.ts, 0, 3))
|
||||
>map : Symbol(Array.map, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
|
||||
>a : Symbol(a, Decl(objectRestForOf.ts, 9, 31))
|
||||
>x : Symbol(x, Decl(objectRestForOf.ts, 9, 44))
|
||||
|
||||
[norest.x, norest.y];
|
||||
>norest.x : Symbol(x, Decl(objectRestForOf.ts, 9, 44))
|
||||
>norest : Symbol(norest, Decl(objectRestForOf.ts, 9, 10))
|
||||
>x : Symbol(x, Decl(objectRestForOf.ts, 9, 44))
|
||||
>norest.y : Symbol(y, Decl(objectRestForOf.ts, 0, 23))
|
||||
>norest : Symbol(norest, Decl(objectRestForOf.ts, 9, 10))
|
||||
>y : Symbol(y, Decl(objectRestForOf.ts, 0, 23))
|
||||
|
||||
// x is now a string. who knows why.
|
||||
}
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
=== tests/cases/conformance/types/rest/objectRestForOf.ts ===
|
||||
let array: { x: number, y: string }[];
|
||||
>array : { x: number; y: string; }[]
|
||||
>x : number
|
||||
>y : string
|
||||
|
||||
for (let { x, ...restOf } of array) {
|
||||
>x : number
|
||||
>restOf : { y: string; }
|
||||
>array : { x: number; y: string; }[]
|
||||
|
||||
[x, restOf];
|
||||
>[x, restOf] : (number | { y: string; })[]
|
||||
>x : number
|
||||
>restOf : { y: string; }
|
||||
}
|
||||
let xx: number;
|
||||
>xx : number
|
||||
|
||||
let rrestOff: { y: string };
|
||||
>rrestOff : { y: string; }
|
||||
>y : string
|
||||
|
||||
for ({ x: xx, ...rrestOff } of array ) {
|
||||
>{ x: xx, ...rrestOff } : { y: string; x: number; }
|
||||
>x : { x: number; y: string; }
|
||||
>xx : number
|
||||
>rrestOff : any
|
||||
>array : { x: number; y: string; }[]
|
||||
|
||||
[xx, rrestOff];
|
||||
>[xx, rrestOff] : (number | { y: string; })[]
|
||||
>xx : number
|
||||
>rrestOff : { y: string; }
|
||||
}
|
||||
for (const norest of array.map(a => ({ ...a, x: 'a string' }))) {
|
||||
>norest : { x: string; y: string; }
|
||||
>array.map(a => ({ ...a, x: 'a string' })) : { x: string; y: string; }[]
|
||||
>array.map : { <U>(this: [{ x: number; y: string; }, { x: number; y: string; }, { x: number; y: string; }, { x: number; y: string; }, { x: number; y: string; }], callbackfn: (value: { x: number; y: string; }, index: number, array: { x: number; y: string; }[]) => U, thisArg?: any): [U, U, U, U, U]; <U>(this: [{ x: number; y: string; }, { x: number; y: string; }, { x: number; y: string; }, { x: number; y: string; }], callbackfn: (value: { x: number; y: string; }, index: number, array: { x: number; y: string; }[]) => U, thisArg?: any): [U, U, U, U]; <U>(this: [{ x: number; y: string; }, { x: number; y: string; }, { x: number; y: string; }], callbackfn: (value: { x: number; y: string; }, index: number, array: { x: number; y: string; }[]) => U, thisArg?: any): [U, U, U]; <U>(this: [{ x: number; y: string; }, { x: number; y: string; }], callbackfn: (value: { x: number; y: string; }, index: number, array: { x: number; y: string; }[]) => U, thisArg?: any): [U, U]; <U>(callbackfn: (value: { x: number; y: string; }, index: number, array: { x: number; y: string; }[]) => U, thisArg?: any): U[]; }
|
||||
>array : { x: number; y: string; }[]
|
||||
>map : { <U>(this: [{ x: number; y: string; }, { x: number; y: string; }, { x: number; y: string; }, { x: number; y: string; }, { x: number; y: string; }], callbackfn: (value: { x: number; y: string; }, index: number, array: { x: number; y: string; }[]) => U, thisArg?: any): [U, U, U, U, U]; <U>(this: [{ x: number; y: string; }, { x: number; y: string; }, { x: number; y: string; }, { x: number; y: string; }], callbackfn: (value: { x: number; y: string; }, index: number, array: { x: number; y: string; }[]) => U, thisArg?: any): [U, U, U, U]; <U>(this: [{ x: number; y: string; }, { x: number; y: string; }, { x: number; y: string; }], callbackfn: (value: { x: number; y: string; }, index: number, array: { x: number; y: string; }[]) => U, thisArg?: any): [U, U, U]; <U>(this: [{ x: number; y: string; }, { x: number; y: string; }], callbackfn: (value: { x: number; y: string; }, index: number, array: { x: number; y: string; }[]) => U, thisArg?: any): [U, U]; <U>(callbackfn: (value: { x: number; y: string; }, index: number, array: { x: number; y: string; }[]) => U, thisArg?: any): U[]; }
|
||||
>a => ({ ...a, x: 'a string' }) : (a: { x: number; y: string; }) => { x: string; y: string; }
|
||||
>a : { x: number; y: string; }
|
||||
>({ ...a, x: 'a string' }) : { x: string; y: string; }
|
||||
>{ ...a, x: 'a string' } : { x: string; y: string; }
|
||||
>a : any
|
||||
>x : string
|
||||
>'a string' : "a string"
|
||||
|
||||
[norest.x, norest.y];
|
||||
>[norest.x, norest.y] : string[]
|
||||
>norest.x : string
|
||||
>norest : { x: string; y: string; }
|
||||
>x : string
|
||||
>norest.y : string
|
||||
>norest : { x: string; y: string; }
|
||||
>y : string
|
||||
|
||||
// x is now a string. who knows why.
|
||||
}
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
tests/cases/conformance/types/rest/objectRestNegative.ts(2,10): error TS2462: A rest element must be last in a destructuring pattern
|
||||
tests/cases/conformance/types/rest/objectRestNegative.ts(3,31): error TS2462: A rest element must be last in a destructuring pattern
|
||||
tests/cases/conformance/types/rest/objectRestNegative.ts(6,17): error TS2700: Rest types may only be created from object types.
|
||||
|
||||
|
||||
==== tests/cases/conformance/types/rest/objectRestNegative.ts (3 errors) ====
|
||||
let o = { a: 1, b: 'no' };
|
||||
var { ...mustBeLast, a } = o;
|
||||
~~~~~~~~~~
|
||||
!!! error TS2462: A rest element must be last in a destructuring pattern
|
||||
function stillMustBeLast({ ...mustBeLast, a }: { a: number, b: string }): void {
|
||||
~~~~~~~~~~
|
||||
!!! error TS2462: A rest element must be last in a destructuring pattern
|
||||
}
|
||||
function generic<T extends { x, y }>(t: T) {
|
||||
let { x, ...rest } = t;
|
||||
~~~~
|
||||
!!! error TS2700: Rest types may only be created from object types.
|
||||
return rest;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
//// [objectRestNegative.ts]
|
||||
let o = { a: 1, b: 'no' };
|
||||
var { ...mustBeLast, a } = o;
|
||||
function stillMustBeLast({ ...mustBeLast, a }: { a: number, b: string }): void {
|
||||
}
|
||||
function generic<T extends { x, y }>(t: T) {
|
||||
let { x, ...rest } = t;
|
||||
return rest;
|
||||
}
|
||||
|
||||
|
||||
//// [objectRestNegative.js]
|
||||
var __rest = (this && this.__rest) || function (s, e) {
|
||||
var t = {};
|
||||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && !e.indexOf(p))
|
||||
t[p] = s[p];
|
||||
return t;
|
||||
};
|
||||
var o = { a: 1, b: 'no' };
|
||||
var mustBeLast = o.mustBeLast, a = o.a;
|
||||
function stillMustBeLast(_a) {
|
||||
var mustBeLast = _a.mustBeLast, a = _a.a;
|
||||
}
|
||||
function generic(t) {
|
||||
var x = t.x, rest = __rest(t, ["x"]);
|
||||
return rest;
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
//// [objectRestParameter.ts]
|
||||
function cloneAgain({ a, ...clone }: { a: number, b: string }): void {
|
||||
}
|
||||
|
||||
declare function suddenly(f: (a: { x: { z, ka }, y: string }) => void);
|
||||
suddenly(({ x: a, ...rest }) => rest.y);
|
||||
suddenly(({ x: { z = 12, ...nested }, ...rest } = { x: { z: 1, ka: 1 }, y: 'noo' }) => rest.y + nested.ka);
|
||||
|
||||
|
||||
|
||||
//// [objectRestParameter.js]
|
||||
var __rest = (this && this.__rest) || function (s, e) {
|
||||
var t = {};
|
||||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && !e.indexOf(p))
|
||||
t[p] = s[p];
|
||||
return t;
|
||||
};
|
||||
function cloneAgain(_a) {
|
||||
var { a } = _a, clone = __rest(_a, ["a"]);
|
||||
}
|
||||
suddenly((_a) => {
|
||||
var { x: a } = _a, rest = __rest(_a, ["x"]);
|
||||
return rest.y;
|
||||
});
|
||||
suddenly((_a = { x: { z: 1, ka: 1 }, y: 'noo' }) => {
|
||||
var _b = _a.x, { z = 12 } = _b, nested = __rest(_b, ["z"]), rest = __rest(_a, ["x"]);
|
||||
return rest.y + nested.ka;
|
||||
});
|
||||
@@ -0,0 +1,45 @@
|
||||
=== tests/cases/conformance/types/rest/objectRestParameter.ts ===
|
||||
function cloneAgain({ a, ...clone }: { a: number, b: string }): void {
|
||||
>cloneAgain : Symbol(cloneAgain, Decl(objectRestParameter.ts, 0, 0))
|
||||
>a : Symbol(a, Decl(objectRestParameter.ts, 0, 21))
|
||||
>clone : Symbol(clone, Decl(objectRestParameter.ts, 0, 24))
|
||||
>a : Symbol(a, Decl(objectRestParameter.ts, 0, 38))
|
||||
>b : Symbol(b, Decl(objectRestParameter.ts, 0, 49))
|
||||
}
|
||||
|
||||
declare function suddenly(f: (a: { x: { z, ka }, y: string }) => void);
|
||||
>suddenly : Symbol(suddenly, Decl(objectRestParameter.ts, 1, 1))
|
||||
>f : Symbol(f, Decl(objectRestParameter.ts, 3, 26))
|
||||
>a : Symbol(a, Decl(objectRestParameter.ts, 3, 30))
|
||||
>x : Symbol(x, Decl(objectRestParameter.ts, 3, 34))
|
||||
>z : Symbol(z, Decl(objectRestParameter.ts, 3, 39))
|
||||
>ka : Symbol(ka, Decl(objectRestParameter.ts, 3, 42))
|
||||
>y : Symbol(y, Decl(objectRestParameter.ts, 3, 48))
|
||||
|
||||
suddenly(({ x: a, ...rest }) => rest.y);
|
||||
>suddenly : Symbol(suddenly, Decl(objectRestParameter.ts, 1, 1))
|
||||
>x : Symbol(x, Decl(objectRestParameter.ts, 3, 34))
|
||||
>a : Symbol(a, Decl(objectRestParameter.ts, 4, 11))
|
||||
>rest : Symbol(rest, Decl(objectRestParameter.ts, 4, 17))
|
||||
>rest.y : Symbol(y, Decl(objectRestParameter.ts, 3, 48))
|
||||
>rest : Symbol(rest, Decl(objectRestParameter.ts, 4, 17))
|
||||
>y : Symbol(y, Decl(objectRestParameter.ts, 3, 48))
|
||||
|
||||
suddenly(({ x: { z = 12, ...nested }, ...rest } = { x: { z: 1, ka: 1 }, y: 'noo' }) => rest.y + nested.ka);
|
||||
>suddenly : Symbol(suddenly, Decl(objectRestParameter.ts, 1, 1))
|
||||
>x : Symbol(x, Decl(objectRestParameter.ts, 3, 34))
|
||||
>z : Symbol(z, Decl(objectRestParameter.ts, 5, 16))
|
||||
>nested : Symbol(nested, Decl(objectRestParameter.ts, 5, 24))
|
||||
>rest : Symbol(rest, Decl(objectRestParameter.ts, 5, 37))
|
||||
>x : Symbol(x, Decl(objectRestParameter.ts, 5, 51))
|
||||
>z : Symbol(z, Decl(objectRestParameter.ts, 5, 56))
|
||||
>ka : Symbol(ka, Decl(objectRestParameter.ts, 5, 62))
|
||||
>y : Symbol(y, Decl(objectRestParameter.ts, 5, 71))
|
||||
>rest.y : Symbol(y, Decl(objectRestParameter.ts, 3, 48))
|
||||
>rest : Symbol(rest, Decl(objectRestParameter.ts, 5, 37))
|
||||
>y : Symbol(y, Decl(objectRestParameter.ts, 3, 48))
|
||||
>nested.ka : Symbol(ka, Decl(objectRestParameter.ts, 3, 42))
|
||||
>nested : Symbol(nested, Decl(objectRestParameter.ts, 5, 24))
|
||||
>ka : Symbol(ka, Decl(objectRestParameter.ts, 3, 42))
|
||||
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
=== tests/cases/conformance/types/rest/objectRestParameter.ts ===
|
||||
function cloneAgain({ a, ...clone }: { a: number, b: string }): void {
|
||||
>cloneAgain : ({a, ...clone}: { a: number; b: string; }) => void
|
||||
>a : number
|
||||
>clone : { b: string; }
|
||||
>a : number
|
||||
>b : string
|
||||
}
|
||||
|
||||
declare function suddenly(f: (a: { x: { z, ka }, y: string }) => void);
|
||||
>suddenly : (f: (a: { x: { z: any; ka: any; }; y: string; }) => void) => any
|
||||
>f : (a: { x: { z: any; ka: any; }; y: string; }) => void
|
||||
>a : { x: { z: any; ka: any; }; y: string; }
|
||||
>x : { z: any; ka: any; }
|
||||
>z : any
|
||||
>ka : any
|
||||
>y : string
|
||||
|
||||
suddenly(({ x: a, ...rest }) => rest.y);
|
||||
>suddenly(({ x: a, ...rest }) => rest.y) : any
|
||||
>suddenly : (f: (a: { x: { z: any; ka: any; }; y: string; }) => void) => any
|
||||
>({ x: a, ...rest }) => rest.y : ({x: a, ...rest}: { x: { z: any; ka: any; }; y: string; }) => string
|
||||
>x : any
|
||||
>a : { z: any; ka: any; }
|
||||
>rest : { y: string; }
|
||||
>rest.y : string
|
||||
>rest : { y: string; }
|
||||
>y : string
|
||||
|
||||
suddenly(({ x: { z = 12, ...nested }, ...rest } = { x: { z: 1, ka: 1 }, y: 'noo' }) => rest.y + nested.ka);
|
||||
>suddenly(({ x: { z = 12, ...nested }, ...rest } = { x: { z: 1, ka: 1 }, y: 'noo' }) => rest.y + nested.ka) : any
|
||||
>suddenly : (f: (a: { x: { z: any; ka: any; }; y: string; }) => void) => any
|
||||
>({ x: { z = 12, ...nested }, ...rest } = { x: { z: 1, ka: 1 }, y: 'noo' }) => rest.y + nested.ka : ({x: {z, ...nested}, ...rest}?: { x: { z: any; ka: any; }; y: string; }) => string
|
||||
>x : any
|
||||
>z : any
|
||||
>12 : 12
|
||||
>nested : { ka: any; }
|
||||
>rest : { y: string; }
|
||||
>{ x: { z: 1, ka: 1 }, y: 'noo' } : { x: { z: number; ka: number; }; y: string; }
|
||||
>x : { z: number; ka: number; }
|
||||
>{ z: 1, ka: 1 } : { z: number; ka: number; }
|
||||
>z : number
|
||||
>1 : 1
|
||||
>ka : number
|
||||
>1 : 1
|
||||
>y : string
|
||||
>'noo' : "noo"
|
||||
>rest.y + nested.ka : string
|
||||
>rest.y : string
|
||||
>rest : { y: string; }
|
||||
>y : string
|
||||
>nested.ka : any
|
||||
>nested : { ka: any; }
|
||||
>ka : any
|
||||
|
||||
|
||||
@@ -0,0 +1,151 @@
|
||||
//// [objectSpread.ts]
|
||||
let o = { a: 1, b: 'no' }
|
||||
let o2 = { b: 'yes', c: true }
|
||||
let swap = { a: 'yes', b: -1 };
|
||||
|
||||
let addAfter: { a: number, b: string, c: boolean } =
|
||||
{ ...o, c: false }
|
||||
let addBefore: { a: number, b: string, c: boolean } =
|
||||
{ c: false, ...o }
|
||||
// Note: ignore still changes the order that properties are printed
|
||||
let ignore: { a: number, b: string } =
|
||||
{ b: 'ignored', ...o }
|
||||
let override: { a: number, b: string } =
|
||||
{ ...o, b: 'override' }
|
||||
let nested: { a: number, b: boolean, c: string } =
|
||||
{ ...{ a: 3, ...{ b: false, c: 'overriden' } }, c: 'whatever' }
|
||||
let combined: { a: number, b: string, c: boolean } =
|
||||
{ ...o, ...o2 }
|
||||
let combinedBefore: { a: number, b: string, c: boolean } =
|
||||
{ b: 'ok', ...o, ...o2 }
|
||||
let combinedMid: { a: number, b: string, c: boolean } =
|
||||
{ ...o, b: 'ok', ...o2 }
|
||||
let combinedAfter: { a: number, b: string, c: boolean } =
|
||||
{ ...o, ...o2, b: 'ok' }
|
||||
let combinedNested: { a: number, b: boolean, c: string, d: string } =
|
||||
{ ...{ a: 4, ...{ b: false, c: 'overriden' } }, d: 'actually new', ...{ a: 5, d: 'maybe new' } }
|
||||
let combinedNestedChangeType: { a: number, b: boolean, c: number } =
|
||||
{ ...{ a: 1, ...{ b: false, c: 'overriden' } }, c: -1 }
|
||||
let propertyNested: { a: { a: number, b: string } } =
|
||||
{ a: { ... o } }
|
||||
// accessors don't copy the descriptor
|
||||
// (which means that readonly getters become read/write properties)
|
||||
let op = { get a () { return 6 } };
|
||||
let getter: { a: number, c: number } =
|
||||
{ ...op, c: 7 }
|
||||
getter.a = 12;
|
||||
|
||||
// functions result in { }
|
||||
let spreadFunc = { ...(function () { }) };
|
||||
|
||||
// any results in any
|
||||
let anything: any;
|
||||
let spreadAny = { ...anything };
|
||||
|
||||
// methods are not enumerable
|
||||
class C { p = 1; m() { } }
|
||||
let c: C = new C()
|
||||
let spreadC: { p: number } = { ...c }
|
||||
|
||||
// own methods are enumerable
|
||||
let cplus: { p: number, plus(): void } = { ...c, plus() { return this.p + 1; } };
|
||||
cplus.plus();
|
||||
|
||||
// new field's type conflicting with existing field is OK
|
||||
let changeTypeAfter: { a: string, b: string } =
|
||||
{ ...o, a: 'wrong type?' }
|
||||
let changeTypeBefore: { a: number, b: string } =
|
||||
{ a: 'wrong type?', ...o };
|
||||
let changeTypeBoth: { a: string, b: number } =
|
||||
{ ...o, ...swap };
|
||||
|
||||
// optional
|
||||
let definiteBoolean: { sn: boolean };
|
||||
let definiteString: { sn: string };
|
||||
let optionalString: { sn?: string };
|
||||
let optionalNumber: { sn?: number };
|
||||
let optionalUnionStops: { sn: string | number | boolean } = { ...definiteBoolean, ...definiteString, ...optionalNumber };
|
||||
let optionalUnionDuplicates: { sn: string | number } = { ...definiteBoolean, ...definiteString, ...optionalString, ...optionalNumber };
|
||||
let allOptional: { sn?: string | number } = { ...optionalString, ...optionalNumber };
|
||||
|
||||
// computed property
|
||||
let computedFirst: { a: number, b: string, "before everything": number } =
|
||||
{ ['before everything']: 12, ...o, b: 'yes' }
|
||||
let computedMiddle: { a: number, b: string, c: boolean, "in the middle": number } =
|
||||
{ ...o, ['in the middle']: 13, b: 'maybe?', ...o2 }
|
||||
let computedAfter: { a: number, b: string, "at the end": number } =
|
||||
{ ...o, b: 'yeah', ['at the end']: 14 }
|
||||
// shortcut syntax
|
||||
let a = 12;
|
||||
let shortCutted: { a: number, b: string } = { ...o, a }
|
||||
|
||||
|
||||
|
||||
//// [objectSpread.js]
|
||||
var __assign = (this && this.__assign) || Object.assign || function(t) {
|
||||
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
||||
s = arguments[i];
|
||||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
||||
t[p] = s[p];
|
||||
}
|
||||
return t;
|
||||
};
|
||||
var o = { a: 1, b: 'no' };
|
||||
var o2 = { b: 'yes', c: true };
|
||||
var swap = { a: 'yes', b: -1 };
|
||||
var addAfter = __assign({}, o, { c: false });
|
||||
var addBefore = __assign({ c: false }, o);
|
||||
// Note: ignore still changes the order that properties are printed
|
||||
var ignore = __assign({ b: 'ignored' }, o);
|
||||
var override = __assign({}, o, { b: 'override' });
|
||||
var nested = __assign({}, __assign({ a: 3 }, { b: false, c: 'overriden' }), { c: 'whatever' });
|
||||
var combined = __assign({}, o, o2);
|
||||
var combinedBefore = __assign({ b: 'ok' }, o, o2);
|
||||
var combinedMid = __assign({}, o, { b: 'ok' }, o2);
|
||||
var combinedAfter = __assign({}, o, o2, { b: 'ok' });
|
||||
var combinedNested = __assign({}, __assign({ a: 4 }, { b: false, c: 'overriden' }), { d: 'actually new' }, { a: 5, d: 'maybe new' });
|
||||
var combinedNestedChangeType = __assign({}, __assign({ a: 1 }, { b: false, c: 'overriden' }), { c: -1 });
|
||||
var propertyNested = __assign({ a: __assign({}, o) });
|
||||
// accessors don't copy the descriptor
|
||||
// (which means that readonly getters become read/write properties)
|
||||
var op = { get a() { return 6; } };
|
||||
var getter = __assign({}, op, { c: 7 });
|
||||
getter.a = 12;
|
||||
// functions result in { }
|
||||
var spreadFunc = __assign({}, (function () { }));
|
||||
// any results in any
|
||||
var anything;
|
||||
var spreadAny = __assign({}, anything);
|
||||
// methods are not enumerable
|
||||
var C = (function () {
|
||||
function C() {
|
||||
this.p = 1;
|
||||
}
|
||||
C.prototype.m = function () { };
|
||||
return C;
|
||||
}());
|
||||
var c = new C();
|
||||
var spreadC = __assign({}, c);
|
||||
// own methods are enumerable
|
||||
var cplus = __assign({}, c, { plus: function () { return this.p + 1; } });
|
||||
cplus.plus();
|
||||
// new field's type conflicting with existing field is OK
|
||||
var changeTypeAfter = __assign({}, o, { a: 'wrong type?' });
|
||||
var changeTypeBefore = __assign({ a: 'wrong type?' }, o);
|
||||
var changeTypeBoth = __assign({}, o, swap);
|
||||
// optional
|
||||
var definiteBoolean;
|
||||
var definiteString;
|
||||
var optionalString;
|
||||
var optionalNumber;
|
||||
var optionalUnionStops = __assign({}, definiteBoolean, definiteString, optionalNumber);
|
||||
var optionalUnionDuplicates = __assign({}, definiteBoolean, definiteString, optionalString, optionalNumber);
|
||||
var allOptional = __assign({}, optionalString, optionalNumber);
|
||||
// computed property
|
||||
var computedFirst = __assign((_a = {}, _a['before everything'] = 12, _a), o, { b: 'yes' });
|
||||
var computedMiddle = __assign({}, o, (_b = {}, _b['in the middle'] = 13, _b.b = 'maybe?', _b), o2);
|
||||
var computedAfter = __assign({}, o, (_c = { b: 'yeah' }, _c['at the end'] = 14, _c));
|
||||
// shortcut syntax
|
||||
var a = 12;
|
||||
var shortCutted = __assign({}, o, { a: a });
|
||||
var _a, _b, _c;
|
||||
@@ -0,0 +1,284 @@
|
||||
=== tests/cases/conformance/types/spread/objectSpread.ts ===
|
||||
let o = { a: 1, b: 'no' }
|
||||
>o : Symbol(o, Decl(objectSpread.ts, 0, 3))
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 0, 9))
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 0, 15))
|
||||
|
||||
let o2 = { b: 'yes', c: true }
|
||||
>o2 : Symbol(o2, Decl(objectSpread.ts, 1, 3))
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 1, 10))
|
||||
>c : Symbol(c, Decl(objectSpread.ts, 1, 20))
|
||||
|
||||
let swap = { a: 'yes', b: -1 };
|
||||
>swap : Symbol(swap, Decl(objectSpread.ts, 2, 3))
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 2, 12))
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 2, 22))
|
||||
|
||||
let addAfter: { a: number, b: string, c: boolean } =
|
||||
>addAfter : Symbol(addAfter, Decl(objectSpread.ts, 4, 3))
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 4, 15))
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 4, 26))
|
||||
>c : Symbol(c, Decl(objectSpread.ts, 4, 37))
|
||||
|
||||
{ ...o, c: false }
|
||||
>c : Symbol(c, Decl(objectSpread.ts, 5, 11))
|
||||
|
||||
let addBefore: { a: number, b: string, c: boolean } =
|
||||
>addBefore : Symbol(addBefore, Decl(objectSpread.ts, 6, 3))
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 6, 16))
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 6, 27))
|
||||
>c : Symbol(c, Decl(objectSpread.ts, 6, 38))
|
||||
|
||||
{ c: false, ...o }
|
||||
>c : Symbol(c, Decl(objectSpread.ts, 7, 5))
|
||||
|
||||
// Note: ignore still changes the order that properties are printed
|
||||
let ignore: { a: number, b: string } =
|
||||
>ignore : Symbol(ignore, Decl(objectSpread.ts, 9, 3))
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 9, 13))
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 9, 24))
|
||||
|
||||
{ b: 'ignored', ...o }
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 10, 5))
|
||||
|
||||
let override: { a: number, b: string } =
|
||||
>override : Symbol(override, Decl(objectSpread.ts, 11, 3))
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 11, 15))
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 11, 26))
|
||||
|
||||
{ ...o, b: 'override' }
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 12, 11))
|
||||
|
||||
let nested: { a: number, b: boolean, c: string } =
|
||||
>nested : Symbol(nested, Decl(objectSpread.ts, 13, 3))
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 13, 13))
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 13, 24))
|
||||
>c : Symbol(c, Decl(objectSpread.ts, 13, 36))
|
||||
|
||||
{ ...{ a: 3, ...{ b: false, c: 'overriden' } }, c: 'whatever' }
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 14, 10))
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 14, 21))
|
||||
>c : Symbol(c, Decl(objectSpread.ts, 14, 31))
|
||||
>c : Symbol(c, Decl(objectSpread.ts, 14, 51))
|
||||
|
||||
let combined: { a: number, b: string, c: boolean } =
|
||||
>combined : Symbol(combined, Decl(objectSpread.ts, 15, 3))
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 15, 15))
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 15, 26))
|
||||
>c : Symbol(c, Decl(objectSpread.ts, 15, 37))
|
||||
|
||||
{ ...o, ...o2 }
|
||||
let combinedBefore: { a: number, b: string, c: boolean } =
|
||||
>combinedBefore : Symbol(combinedBefore, Decl(objectSpread.ts, 17, 3))
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 17, 21))
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 17, 32))
|
||||
>c : Symbol(c, Decl(objectSpread.ts, 17, 43))
|
||||
|
||||
{ b: 'ok', ...o, ...o2 }
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 18, 5))
|
||||
|
||||
let combinedMid: { a: number, b: string, c: boolean } =
|
||||
>combinedMid : Symbol(combinedMid, Decl(objectSpread.ts, 19, 3))
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 19, 18))
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 19, 29))
|
||||
>c : Symbol(c, Decl(objectSpread.ts, 19, 40))
|
||||
|
||||
{ ...o, b: 'ok', ...o2 }
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 20, 11))
|
||||
|
||||
let combinedAfter: { a: number, b: string, c: boolean } =
|
||||
>combinedAfter : Symbol(combinedAfter, Decl(objectSpread.ts, 21, 3))
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 21, 20))
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 21, 31))
|
||||
>c : Symbol(c, Decl(objectSpread.ts, 21, 42))
|
||||
|
||||
{ ...o, ...o2, b: 'ok' }
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 22, 18))
|
||||
|
||||
let combinedNested: { a: number, b: boolean, c: string, d: string } =
|
||||
>combinedNested : Symbol(combinedNested, Decl(objectSpread.ts, 23, 3))
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 23, 21))
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 23, 32))
|
||||
>c : Symbol(c, Decl(objectSpread.ts, 23, 44))
|
||||
>d : Symbol(d, Decl(objectSpread.ts, 23, 55))
|
||||
|
||||
{ ...{ a: 4, ...{ b: false, c: 'overriden' } }, d: 'actually new', ...{ a: 5, d: 'maybe new' } }
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 24, 10))
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 24, 21))
|
||||
>c : Symbol(c, Decl(objectSpread.ts, 24, 31))
|
||||
>d : Symbol(d, Decl(objectSpread.ts, 24, 51))
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 24, 75))
|
||||
>d : Symbol(d, Decl(objectSpread.ts, 24, 81))
|
||||
|
||||
let combinedNestedChangeType: { a: number, b: boolean, c: number } =
|
||||
>combinedNestedChangeType : Symbol(combinedNestedChangeType, Decl(objectSpread.ts, 25, 3))
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 25, 31))
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 25, 42))
|
||||
>c : Symbol(c, Decl(objectSpread.ts, 25, 54))
|
||||
|
||||
{ ...{ a: 1, ...{ b: false, c: 'overriden' } }, c: -1 }
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 26, 10))
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 26, 21))
|
||||
>c : Symbol(c, Decl(objectSpread.ts, 26, 31))
|
||||
>c : Symbol(c, Decl(objectSpread.ts, 26, 51))
|
||||
|
||||
let propertyNested: { a: { a: number, b: string } } =
|
||||
>propertyNested : Symbol(propertyNested, Decl(objectSpread.ts, 27, 3))
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 27, 21))
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 27, 26))
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 27, 37))
|
||||
|
||||
{ a: { ... o } }
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 28, 5))
|
||||
|
||||
// accessors don't copy the descriptor
|
||||
// (which means that readonly getters become read/write properties)
|
||||
let op = { get a () { return 6 } };
|
||||
>op : Symbol(op, Decl(objectSpread.ts, 31, 3))
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 31, 10))
|
||||
|
||||
let getter: { a: number, c: number } =
|
||||
>getter : Symbol(getter, Decl(objectSpread.ts, 32, 3))
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 32, 13))
|
||||
>c : Symbol(c, Decl(objectSpread.ts, 32, 24))
|
||||
|
||||
{ ...op, c: 7 }
|
||||
>c : Symbol(c, Decl(objectSpread.ts, 33, 12))
|
||||
|
||||
getter.a = 12;
|
||||
>getter.a : Symbol(a, Decl(objectSpread.ts, 32, 13))
|
||||
>getter : Symbol(getter, Decl(objectSpread.ts, 32, 3))
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 32, 13))
|
||||
|
||||
// functions result in { }
|
||||
let spreadFunc = { ...(function () { }) };
|
||||
>spreadFunc : Symbol(spreadFunc, Decl(objectSpread.ts, 37, 3))
|
||||
|
||||
// any results in any
|
||||
let anything: any;
|
||||
>anything : Symbol(anything, Decl(objectSpread.ts, 40, 3))
|
||||
|
||||
let spreadAny = { ...anything };
|
||||
>spreadAny : Symbol(spreadAny, Decl(objectSpread.ts, 41, 3))
|
||||
|
||||
// methods are not enumerable
|
||||
class C { p = 1; m() { } }
|
||||
>C : Symbol(C, Decl(objectSpread.ts, 41, 32))
|
||||
>p : Symbol(C.p, Decl(objectSpread.ts, 44, 9))
|
||||
>m : Symbol(C.m, Decl(objectSpread.ts, 44, 16))
|
||||
|
||||
let c: C = new C()
|
||||
>c : Symbol(c, Decl(objectSpread.ts, 45, 3))
|
||||
>C : Symbol(C, Decl(objectSpread.ts, 41, 32))
|
||||
>C : Symbol(C, Decl(objectSpread.ts, 41, 32))
|
||||
|
||||
let spreadC: { p: number } = { ...c }
|
||||
>spreadC : Symbol(spreadC, Decl(objectSpread.ts, 46, 3))
|
||||
>p : Symbol(p, Decl(objectSpread.ts, 46, 14))
|
||||
|
||||
// own methods are enumerable
|
||||
let cplus: { p: number, plus(): void } = { ...c, plus() { return this.p + 1; } };
|
||||
>cplus : Symbol(cplus, Decl(objectSpread.ts, 49, 3))
|
||||
>p : Symbol(p, Decl(objectSpread.ts, 49, 12))
|
||||
>plus : Symbol(plus, Decl(objectSpread.ts, 49, 23))
|
||||
>plus : Symbol(plus, Decl(objectSpread.ts, 49, 48))
|
||||
>this : Symbol(__object, Decl(objectSpread.ts, 41, 15))
|
||||
|
||||
cplus.plus();
|
||||
>cplus.plus : Symbol(plus, Decl(objectSpread.ts, 49, 23))
|
||||
>cplus : Symbol(cplus, Decl(objectSpread.ts, 49, 3))
|
||||
>plus : Symbol(plus, Decl(objectSpread.ts, 49, 23))
|
||||
|
||||
// new field's type conflicting with existing field is OK
|
||||
let changeTypeAfter: { a: string, b: string } =
|
||||
>changeTypeAfter : Symbol(changeTypeAfter, Decl(objectSpread.ts, 53, 3))
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 53, 22))
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 53, 33))
|
||||
|
||||
{ ...o, a: 'wrong type?' }
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 54, 11))
|
||||
|
||||
let changeTypeBefore: { a: number, b: string } =
|
||||
>changeTypeBefore : Symbol(changeTypeBefore, Decl(objectSpread.ts, 55, 3))
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 55, 23))
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 55, 34))
|
||||
|
||||
{ a: 'wrong type?', ...o };
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 56, 5))
|
||||
|
||||
let changeTypeBoth: { a: string, b: number } =
|
||||
>changeTypeBoth : Symbol(changeTypeBoth, Decl(objectSpread.ts, 57, 3))
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 57, 21))
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 57, 32))
|
||||
|
||||
{ ...o, ...swap };
|
||||
|
||||
// optional
|
||||
let definiteBoolean: { sn: boolean };
|
||||
>definiteBoolean : Symbol(definiteBoolean, Decl(objectSpread.ts, 61, 3))
|
||||
>sn : Symbol(sn, Decl(objectSpread.ts, 61, 22))
|
||||
|
||||
let definiteString: { sn: string };
|
||||
>definiteString : Symbol(definiteString, Decl(objectSpread.ts, 62, 3))
|
||||
>sn : Symbol(sn, Decl(objectSpread.ts, 62, 21))
|
||||
|
||||
let optionalString: { sn?: string };
|
||||
>optionalString : Symbol(optionalString, Decl(objectSpread.ts, 63, 3))
|
||||
>sn : Symbol(sn, Decl(objectSpread.ts, 63, 21))
|
||||
|
||||
let optionalNumber: { sn?: number };
|
||||
>optionalNumber : Symbol(optionalNumber, Decl(objectSpread.ts, 64, 3))
|
||||
>sn : Symbol(sn, Decl(objectSpread.ts, 64, 21))
|
||||
|
||||
let optionalUnionStops: { sn: string | number | boolean } = { ...definiteBoolean, ...definiteString, ...optionalNumber };
|
||||
>optionalUnionStops : Symbol(optionalUnionStops, Decl(objectSpread.ts, 65, 3))
|
||||
>sn : Symbol(sn, Decl(objectSpread.ts, 65, 25))
|
||||
|
||||
let optionalUnionDuplicates: { sn: string | number } = { ...definiteBoolean, ...definiteString, ...optionalString, ...optionalNumber };
|
||||
>optionalUnionDuplicates : Symbol(optionalUnionDuplicates, Decl(objectSpread.ts, 66, 3))
|
||||
>sn : Symbol(sn, Decl(objectSpread.ts, 66, 30))
|
||||
|
||||
let allOptional: { sn?: string | number } = { ...optionalString, ...optionalNumber };
|
||||
>allOptional : Symbol(allOptional, Decl(objectSpread.ts, 67, 3))
|
||||
>sn : Symbol(sn, Decl(objectSpread.ts, 67, 18))
|
||||
|
||||
// computed property
|
||||
let computedFirst: { a: number, b: string, "before everything": number } =
|
||||
>computedFirst : Symbol(computedFirst, Decl(objectSpread.ts, 70, 3))
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 70, 20))
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 70, 31))
|
||||
|
||||
{ ['before everything']: 12, ...o, b: 'yes' }
|
||||
>'before everything' : Symbol(['before everything'], Decl(objectSpread.ts, 71, 5))
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 71, 38))
|
||||
|
||||
let computedMiddle: { a: number, b: string, c: boolean, "in the middle": number } =
|
||||
>computedMiddle : Symbol(computedMiddle, Decl(objectSpread.ts, 72, 3))
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 72, 21))
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 72, 32))
|
||||
>c : Symbol(c, Decl(objectSpread.ts, 72, 43))
|
||||
|
||||
{ ...o, ['in the middle']: 13, b: 'maybe?', ...o2 }
|
||||
>'in the middle' : Symbol(['in the middle'], Decl(objectSpread.ts, 73, 11))
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 73, 34))
|
||||
|
||||
let computedAfter: { a: number, b: string, "at the end": number } =
|
||||
>computedAfter : Symbol(computedAfter, Decl(objectSpread.ts, 74, 3))
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 74, 20))
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 74, 31))
|
||||
|
||||
{ ...o, b: 'yeah', ['at the end']: 14 }
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 75, 11))
|
||||
>'at the end' : Symbol(['at the end'], Decl(objectSpread.ts, 75, 22))
|
||||
|
||||
// shortcut syntax
|
||||
let a = 12;
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 77, 3))
|
||||
|
||||
let shortCutted: { a: number, b: string } = { ...o, a }
|
||||
>shortCutted : Symbol(shortCutted, Decl(objectSpread.ts, 78, 3))
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 78, 18))
|
||||
>b : Symbol(b, Decl(objectSpread.ts, 78, 29))
|
||||
>a : Symbol(a, Decl(objectSpread.ts, 78, 51))
|
||||
|
||||
|
||||
@@ -0,0 +1,410 @@
|
||||
=== tests/cases/conformance/types/spread/objectSpread.ts ===
|
||||
let o = { a: 1, b: 'no' }
|
||||
>o : { a: number; b: string; }
|
||||
>{ a: 1, b: 'no' } : { a: number; b: string; }
|
||||
>a : number
|
||||
>1 : 1
|
||||
>b : string
|
||||
>'no' : "no"
|
||||
|
||||
let o2 = { b: 'yes', c: true }
|
||||
>o2 : { b: string; c: boolean; }
|
||||
>{ b: 'yes', c: true } : { b: string; c: boolean; }
|
||||
>b : string
|
||||
>'yes' : "yes"
|
||||
>c : boolean
|
||||
>true : true
|
||||
|
||||
let swap = { a: 'yes', b: -1 };
|
||||
>swap : { a: string; b: number; }
|
||||
>{ a: 'yes', b: -1 } : { a: string; b: number; }
|
||||
>a : string
|
||||
>'yes' : "yes"
|
||||
>b : number
|
||||
>-1 : -1
|
||||
>1 : 1
|
||||
|
||||
let addAfter: { a: number, b: string, c: boolean } =
|
||||
>addAfter : { a: number; b: string; c: boolean; }
|
||||
>a : number
|
||||
>b : string
|
||||
>c : boolean
|
||||
|
||||
{ ...o, c: false }
|
||||
>{ ...o, c: false } : { c: false; a: number; b: string; }
|
||||
>o : any
|
||||
>c : boolean
|
||||
>false : false
|
||||
|
||||
let addBefore: { a: number, b: string, c: boolean } =
|
||||
>addBefore : { a: number; b: string; c: boolean; }
|
||||
>a : number
|
||||
>b : string
|
||||
>c : boolean
|
||||
|
||||
{ c: false, ...o }
|
||||
>{ c: false, ...o } : { a: number; b: string; c: false; }
|
||||
>c : boolean
|
||||
>false : false
|
||||
>o : any
|
||||
|
||||
// Note: ignore still changes the order that properties are printed
|
||||
let ignore: { a: number, b: string } =
|
||||
>ignore : { a: number; b: string; }
|
||||
>a : number
|
||||
>b : string
|
||||
|
||||
{ b: 'ignored', ...o }
|
||||
>{ b: 'ignored', ...o } : { a: number; b: string; }
|
||||
>b : string
|
||||
>'ignored' : "ignored"
|
||||
>o : any
|
||||
|
||||
let override: { a: number, b: string } =
|
||||
>override : { a: number; b: string; }
|
||||
>a : number
|
||||
>b : string
|
||||
|
||||
{ ...o, b: 'override' }
|
||||
>{ ...o, b: 'override' } : { b: string; a: number; }
|
||||
>o : any
|
||||
>b : string
|
||||
>'override' : "override"
|
||||
|
||||
let nested: { a: number, b: boolean, c: string } =
|
||||
>nested : { a: number; b: boolean; c: string; }
|
||||
>a : number
|
||||
>b : boolean
|
||||
>c : string
|
||||
|
||||
{ ...{ a: 3, ...{ b: false, c: 'overriden' } }, c: 'whatever' }
|
||||
>{ ...{ a: 3, ...{ b: false, c: 'overriden' } }, c: 'whatever' } : { c: string; b: boolean; a: number; }
|
||||
>{ a: 3, ...{ b: false, c: 'overriden' } } : { b: boolean; c: string; a: number; }
|
||||
>a : number
|
||||
>3 : 3
|
||||
>{ b: false, c: 'overriden' } : { b: boolean; c: string; }
|
||||
>b : boolean
|
||||
>false : false
|
||||
>c : string
|
||||
>'overriden' : "overriden"
|
||||
>c : string
|
||||
>'whatever' : "whatever"
|
||||
|
||||
let combined: { a: number, b: string, c: boolean } =
|
||||
>combined : { a: number; b: string; c: boolean; }
|
||||
>a : number
|
||||
>b : string
|
||||
>c : boolean
|
||||
|
||||
{ ...o, ...o2 }
|
||||
>{ ...o, ...o2 } : { b: string; c: boolean; a: number; }
|
||||
>o : any
|
||||
>o2 : any
|
||||
|
||||
let combinedBefore: { a: number, b: string, c: boolean } =
|
||||
>combinedBefore : { a: number; b: string; c: boolean; }
|
||||
>a : number
|
||||
>b : string
|
||||
>c : boolean
|
||||
|
||||
{ b: 'ok', ...o, ...o2 }
|
||||
>{ b: 'ok', ...o, ...o2 } : { b: string; c: boolean; a: number; }
|
||||
>b : string
|
||||
>'ok' : "ok"
|
||||
>o : any
|
||||
>o2 : any
|
||||
|
||||
let combinedMid: { a: number, b: string, c: boolean } =
|
||||
>combinedMid : { a: number; b: string; c: boolean; }
|
||||
>a : number
|
||||
>b : string
|
||||
>c : boolean
|
||||
|
||||
{ ...o, b: 'ok', ...o2 }
|
||||
>{ ...o, b: 'ok', ...o2 } : { b: string; c: boolean; a: number; }
|
||||
>o : any
|
||||
>b : string
|
||||
>'ok' : "ok"
|
||||
>o2 : any
|
||||
|
||||
let combinedAfter: { a: number, b: string, c: boolean } =
|
||||
>combinedAfter : { a: number; b: string; c: boolean; }
|
||||
>a : number
|
||||
>b : string
|
||||
>c : boolean
|
||||
|
||||
{ ...o, ...o2, b: 'ok' }
|
||||
>{ ...o, ...o2, b: 'ok' } : { b: string; c: boolean; a: number; }
|
||||
>o : any
|
||||
>o2 : any
|
||||
>b : string
|
||||
>'ok' : "ok"
|
||||
|
||||
let combinedNested: { a: number, b: boolean, c: string, d: string } =
|
||||
>combinedNested : { a: number; b: boolean; c: string; d: string; }
|
||||
>a : number
|
||||
>b : boolean
|
||||
>c : string
|
||||
>d : string
|
||||
|
||||
{ ...{ a: 4, ...{ b: false, c: 'overriden' } }, d: 'actually new', ...{ a: 5, d: 'maybe new' } }
|
||||
>{ ...{ a: 4, ...{ b: false, c: 'overriden' } }, d: 'actually new', ...{ a: 5, d: 'maybe new' } } : { a: number; d: string; b: boolean; c: string; }
|
||||
>{ a: 4, ...{ b: false, c: 'overriden' } } : { b: boolean; c: string; a: number; }
|
||||
>a : number
|
||||
>4 : 4
|
||||
>{ b: false, c: 'overriden' } : { b: boolean; c: string; }
|
||||
>b : boolean
|
||||
>false : false
|
||||
>c : string
|
||||
>'overriden' : "overriden"
|
||||
>d : string
|
||||
>'actually new' : "actually new"
|
||||
>{ a: 5, d: 'maybe new' } : { a: number; d: string; }
|
||||
>a : number
|
||||
>5 : 5
|
||||
>d : string
|
||||
>'maybe new' : "maybe new"
|
||||
|
||||
let combinedNestedChangeType: { a: number, b: boolean, c: number } =
|
||||
>combinedNestedChangeType : { a: number; b: boolean; c: number; }
|
||||
>a : number
|
||||
>b : boolean
|
||||
>c : number
|
||||
|
||||
{ ...{ a: 1, ...{ b: false, c: 'overriden' } }, c: -1 }
|
||||
>{ ...{ a: 1, ...{ b: false, c: 'overriden' } }, c: -1 } : { c: number; b: boolean; a: number; }
|
||||
>{ a: 1, ...{ b: false, c: 'overriden' } } : { b: boolean; c: string; a: number; }
|
||||
>a : number
|
||||
>1 : 1
|
||||
>{ b: false, c: 'overriden' } : { b: boolean; c: string; }
|
||||
>b : boolean
|
||||
>false : false
|
||||
>c : string
|
||||
>'overriden' : "overriden"
|
||||
>c : number
|
||||
>-1 : -1
|
||||
>1 : 1
|
||||
|
||||
let propertyNested: { a: { a: number, b: string } } =
|
||||
>propertyNested : { a: { a: number; b: string; }; }
|
||||
>a : { a: number; b: string; }
|
||||
>a : number
|
||||
>b : string
|
||||
|
||||
{ a: { ... o } }
|
||||
>{ a: { ... o } } : { a: { a: number; b: string; }; }
|
||||
>a : { a: number; b: string; }
|
||||
>{ ... o } : { a: number; b: string; }
|
||||
>o : any
|
||||
|
||||
// accessors don't copy the descriptor
|
||||
// (which means that readonly getters become read/write properties)
|
||||
let op = { get a () { return 6 } };
|
||||
>op : { readonly a: number; }
|
||||
>{ get a () { return 6 } } : { readonly a: number; }
|
||||
>a : number
|
||||
>6 : 6
|
||||
|
||||
let getter: { a: number, c: number } =
|
||||
>getter : { a: number; c: number; }
|
||||
>a : number
|
||||
>c : number
|
||||
|
||||
{ ...op, c: 7 }
|
||||
>{ ...op, c: 7 } : { c: number; readonly a: number; }
|
||||
>op : any
|
||||
>c : number
|
||||
>7 : 7
|
||||
|
||||
getter.a = 12;
|
||||
>getter.a = 12 : 12
|
||||
>getter.a : number
|
||||
>getter : { a: number; c: number; }
|
||||
>a : number
|
||||
>12 : 12
|
||||
|
||||
// functions result in { }
|
||||
let spreadFunc = { ...(function () { }) };
|
||||
>spreadFunc : {}
|
||||
>{ ...(function () { }) } : {}
|
||||
>(function () { }) : () => void
|
||||
>function () { } : () => void
|
||||
|
||||
// any results in any
|
||||
let anything: any;
|
||||
>anything : any
|
||||
|
||||
let spreadAny = { ...anything };
|
||||
>spreadAny : any
|
||||
>{ ...anything } : any
|
||||
>anything : any
|
||||
|
||||
// methods are not enumerable
|
||||
class C { p = 1; m() { } }
|
||||
>C : C
|
||||
>p : number
|
||||
>1 : 1
|
||||
>m : () => void
|
||||
|
||||
let c: C = new C()
|
||||
>c : C
|
||||
>C : C
|
||||
>new C() : C
|
||||
>C : typeof C
|
||||
|
||||
let spreadC: { p: number } = { ...c }
|
||||
>spreadC : { p: number; }
|
||||
>p : number
|
||||
>{ ...c } : { p: number; }
|
||||
>c : any
|
||||
|
||||
// own methods are enumerable
|
||||
let cplus: { p: number, plus(): void } = { ...c, plus() { return this.p + 1; } };
|
||||
>cplus : { p: number; plus(): void; }
|
||||
>p : number
|
||||
>plus : () => void
|
||||
>{ ...c, plus() { return this.p + 1; } } : { plus(): any; p: number; }
|
||||
>c : any
|
||||
>plus : () => any
|
||||
>this.p + 1 : any
|
||||
>this.p : any
|
||||
>this : any
|
||||
>p : any
|
||||
>1 : 1
|
||||
|
||||
cplus.plus();
|
||||
>cplus.plus() : void
|
||||
>cplus.plus : () => void
|
||||
>cplus : { p: number; plus(): void; }
|
||||
>plus : () => void
|
||||
|
||||
// new field's type conflicting with existing field is OK
|
||||
let changeTypeAfter: { a: string, b: string } =
|
||||
>changeTypeAfter : { a: string; b: string; }
|
||||
>a : string
|
||||
>b : string
|
||||
|
||||
{ ...o, a: 'wrong type?' }
|
||||
>{ ...o, a: 'wrong type?' } : { a: string; b: string; }
|
||||
>o : any
|
||||
>a : string
|
||||
>'wrong type?' : "wrong type?"
|
||||
|
||||
let changeTypeBefore: { a: number, b: string } =
|
||||
>changeTypeBefore : { a: number; b: string; }
|
||||
>a : number
|
||||
>b : string
|
||||
|
||||
{ a: 'wrong type?', ...o };
|
||||
>{ a: 'wrong type?', ...o } : { a: number; b: string; }
|
||||
>a : string
|
||||
>'wrong type?' : "wrong type?"
|
||||
>o : any
|
||||
|
||||
let changeTypeBoth: { a: string, b: number } =
|
||||
>changeTypeBoth : { a: string; b: number; }
|
||||
>a : string
|
||||
>b : number
|
||||
|
||||
{ ...o, ...swap };
|
||||
>{ ...o, ...swap } : { a: string; b: number; }
|
||||
>o : any
|
||||
>swap : any
|
||||
|
||||
// optional
|
||||
let definiteBoolean: { sn: boolean };
|
||||
>definiteBoolean : { sn: boolean; }
|
||||
>sn : boolean
|
||||
|
||||
let definiteString: { sn: string };
|
||||
>definiteString : { sn: string; }
|
||||
>sn : string
|
||||
|
||||
let optionalString: { sn?: string };
|
||||
>optionalString : { sn?: string; }
|
||||
>sn : string
|
||||
|
||||
let optionalNumber: { sn?: number };
|
||||
>optionalNumber : { sn?: number; }
|
||||
>sn : number
|
||||
|
||||
let optionalUnionStops: { sn: string | number | boolean } = { ...definiteBoolean, ...definiteString, ...optionalNumber };
|
||||
>optionalUnionStops : { sn: string | number | boolean; }
|
||||
>sn : string | number | boolean
|
||||
>{ ...definiteBoolean, ...definiteString, ...optionalNumber } : { sn: string | number; }
|
||||
>definiteBoolean : any
|
||||
>definiteString : any
|
||||
>optionalNumber : any
|
||||
|
||||
let optionalUnionDuplicates: { sn: string | number } = { ...definiteBoolean, ...definiteString, ...optionalString, ...optionalNumber };
|
||||
>optionalUnionDuplicates : { sn: string | number; }
|
||||
>sn : string | number
|
||||
>{ ...definiteBoolean, ...definiteString, ...optionalString, ...optionalNumber } : { sn: string | number; }
|
||||
>definiteBoolean : any
|
||||
>definiteString : any
|
||||
>optionalString : any
|
||||
>optionalNumber : any
|
||||
|
||||
let allOptional: { sn?: string | number } = { ...optionalString, ...optionalNumber };
|
||||
>allOptional : { sn?: string | number; }
|
||||
>sn : string | number
|
||||
>{ ...optionalString, ...optionalNumber } : { sn?: string | number; }
|
||||
>optionalString : any
|
||||
>optionalNumber : any
|
||||
|
||||
// computed property
|
||||
let computedFirst: { a: number, b: string, "before everything": number } =
|
||||
>computedFirst : { a: number; b: string; "before everything": number; }
|
||||
>a : number
|
||||
>b : string
|
||||
|
||||
{ ['before everything']: 12, ...o, b: 'yes' }
|
||||
>{ ['before everything']: 12, ...o, b: 'yes' } : { b: string; a: number; ['before everything']: number; }
|
||||
>'before everything' : "before everything"
|
||||
>12 : 12
|
||||
>o : any
|
||||
>b : string
|
||||
>'yes' : "yes"
|
||||
|
||||
let computedMiddle: { a: number, b: string, c: boolean, "in the middle": number } =
|
||||
>computedMiddle : { a: number; b: string; c: boolean; "in the middle": number; }
|
||||
>a : number
|
||||
>b : string
|
||||
>c : boolean
|
||||
|
||||
{ ...o, ['in the middle']: 13, b: 'maybe?', ...o2 }
|
||||
>{ ...o, ['in the middle']: 13, b: 'maybe?', ...o2 } : { b: string; c: boolean; ['in the middle']: number; a: number; }
|
||||
>o : any
|
||||
>'in the middle' : "in the middle"
|
||||
>13 : 13
|
||||
>b : string
|
||||
>'maybe?' : "maybe?"
|
||||
>o2 : any
|
||||
|
||||
let computedAfter: { a: number, b: string, "at the end": number } =
|
||||
>computedAfter : { a: number; b: string; "at the end": number; }
|
||||
>a : number
|
||||
>b : string
|
||||
|
||||
{ ...o, b: 'yeah', ['at the end']: 14 }
|
||||
>{ ...o, b: 'yeah', ['at the end']: 14 } : { b: string; ['at the end']: number; a: number; }
|
||||
>o : any
|
||||
>b : string
|
||||
>'yeah' : "yeah"
|
||||
>'at the end' : "at the end"
|
||||
>14 : 14
|
||||
|
||||
// shortcut syntax
|
||||
let a = 12;
|
||||
>a : number
|
||||
>12 : 12
|
||||
|
||||
let shortCutted: { a: number, b: string } = { ...o, a }
|
||||
>shortCutted : { a: number; b: string; }
|
||||
>a : number
|
||||
>b : string
|
||||
>{ ...o, a } : { a: number; b: string; }
|
||||
>o : any
|
||||
>a : number
|
||||
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
//// [objectSpreadIndexSignature.ts]
|
||||
interface Indexed {
|
||||
[n: string]: number;
|
||||
a: number;
|
||||
}
|
||||
interface Indexed2 {
|
||||
[n: string]: boolean;
|
||||
c: boolean;
|
||||
}
|
||||
let indexed: Indexed;
|
||||
let indexed2: Indexed2;
|
||||
let i = { ...indexed, b: 11 };
|
||||
// only indexed has indexer, so i[101]: any
|
||||
i[101];
|
||||
let ii = { ...indexed, ...indexed2 };
|
||||
// both have indexer, so i[1001]: number | boolean
|
||||
ii[1001];
|
||||
|
||||
|
||||
//// [objectSpreadIndexSignature.js]
|
||||
var __assign = (this && this.__assign) || Object.assign || function(t) {
|
||||
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
||||
s = arguments[i];
|
||||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
||||
t[p] = s[p];
|
||||
}
|
||||
return t;
|
||||
};
|
||||
var indexed;
|
||||
var indexed2;
|
||||
var i = __assign({}, indexed, { b: 11 });
|
||||
// only indexed has indexer, so i[101]: any
|
||||
i[101];
|
||||
var ii = __assign({}, indexed, indexed2);
|
||||
// both have indexer, so i[1001]: number | boolean
|
||||
ii[1001];
|
||||
@@ -0,0 +1,42 @@
|
||||
=== tests/cases/conformance/types/spread/objectSpreadIndexSignature.ts ===
|
||||
interface Indexed {
|
||||
>Indexed : Symbol(Indexed, Decl(objectSpreadIndexSignature.ts, 0, 0))
|
||||
|
||||
[n: string]: number;
|
||||
>n : Symbol(n, Decl(objectSpreadIndexSignature.ts, 1, 5))
|
||||
|
||||
a: number;
|
||||
>a : Symbol(Indexed.a, Decl(objectSpreadIndexSignature.ts, 1, 24))
|
||||
}
|
||||
interface Indexed2 {
|
||||
>Indexed2 : Symbol(Indexed2, Decl(objectSpreadIndexSignature.ts, 3, 1))
|
||||
|
||||
[n: string]: boolean;
|
||||
>n : Symbol(n, Decl(objectSpreadIndexSignature.ts, 5, 5))
|
||||
|
||||
c: boolean;
|
||||
>c : Symbol(Indexed2.c, Decl(objectSpreadIndexSignature.ts, 5, 25))
|
||||
}
|
||||
let indexed: Indexed;
|
||||
>indexed : Symbol(indexed, Decl(objectSpreadIndexSignature.ts, 8, 3))
|
||||
>Indexed : Symbol(Indexed, Decl(objectSpreadIndexSignature.ts, 0, 0))
|
||||
|
||||
let indexed2: Indexed2;
|
||||
>indexed2 : Symbol(indexed2, Decl(objectSpreadIndexSignature.ts, 9, 3))
|
||||
>Indexed2 : Symbol(Indexed2, Decl(objectSpreadIndexSignature.ts, 3, 1))
|
||||
|
||||
let i = { ...indexed, b: 11 };
|
||||
>i : Symbol(i, Decl(objectSpreadIndexSignature.ts, 10, 3))
|
||||
>b : Symbol(b, Decl(objectSpreadIndexSignature.ts, 10, 21))
|
||||
|
||||
// only indexed has indexer, so i[101]: any
|
||||
i[101];
|
||||
>i : Symbol(i, Decl(objectSpreadIndexSignature.ts, 10, 3))
|
||||
|
||||
let ii = { ...indexed, ...indexed2 };
|
||||
>ii : Symbol(ii, Decl(objectSpreadIndexSignature.ts, 13, 3))
|
||||
|
||||
// both have indexer, so i[1001]: number | boolean
|
||||
ii[1001];
|
||||
>ii : Symbol(ii, Decl(objectSpreadIndexSignature.ts, 13, 3))
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
=== tests/cases/conformance/types/spread/objectSpreadIndexSignature.ts ===
|
||||
interface Indexed {
|
||||
>Indexed : Indexed
|
||||
|
||||
[n: string]: number;
|
||||
>n : string
|
||||
|
||||
a: number;
|
||||
>a : number
|
||||
}
|
||||
interface Indexed2 {
|
||||
>Indexed2 : Indexed2
|
||||
|
||||
[n: string]: boolean;
|
||||
>n : string
|
||||
|
||||
c: boolean;
|
||||
>c : boolean
|
||||
}
|
||||
let indexed: Indexed;
|
||||
>indexed : Indexed
|
||||
>Indexed : Indexed
|
||||
|
||||
let indexed2: Indexed2;
|
||||
>indexed2 : Indexed2
|
||||
>Indexed2 : Indexed2
|
||||
|
||||
let i = { ...indexed, b: 11 };
|
||||
>i : { b: number; a: number; }
|
||||
>{ ...indexed, b: 11 } : { b: number; a: number; }
|
||||
>indexed : any
|
||||
>b : number
|
||||
>11 : 11
|
||||
|
||||
// only indexed has indexer, so i[101]: any
|
||||
i[101];
|
||||
>i[101] : any
|
||||
>i : { b: number; a: number; }
|
||||
>101 : 101
|
||||
|
||||
let ii = { ...indexed, ...indexed2 };
|
||||
>ii : { [x: string]: number | boolean; c: boolean; a: number; }
|
||||
>{ ...indexed, ...indexed2 } : { [x: string]: number | boolean; c: boolean; a: number; }
|
||||
>indexed : any
|
||||
>indexed2 : any
|
||||
|
||||
// both have indexer, so i[1001]: number | boolean
|
||||
ii[1001];
|
||||
>ii[1001] : number | boolean
|
||||
>ii : { [x: string]: number | boolean; c: boolean; a: number; }
|
||||
>1001 : 1001
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
//// [objectSpreadInference.ts]
|
||||
interface Result<T,U,V> {
|
||||
t: T;
|
||||
u: U;
|
||||
v: V;
|
||||
}
|
||||
declare function infer<T,U,V>(tuv: { ...T, ...U, a: V }): { t: T, u: U, v: V };
|
||||
declare function infer2<T,U,V>(utv: { ...U, a: V, ...T }): { t: T, u: U, v: V };
|
||||
function generic<W, X, Y>(w: W, x: X, y: Y) {
|
||||
// should infer { t: {}, u: {}, v: {} } because there is no trailing type parameter
|
||||
return infer({ ...w, ...x, a: y, b: "different type" });
|
||||
}
|
||||
let b: { b: number };
|
||||
let c: { c: number };
|
||||
// can only infer { t: {}, u: {}, v: {} }
|
||||
let i1 = infer({ ...b, ...c, a: 12 });
|
||||
// can only infer { t: {}, u: {}, v: {} }
|
||||
let i2 = infer2({ ...b, ...c, a: 12 });
|
||||
// can only infer { t: {}, u: {}, v: {} }
|
||||
let i3 = generic(b, c, { a: 12 });
|
||||
|
||||
|
||||
//// [objectSpreadInference.js]
|
||||
var __assign = (this && this.__assign) || Object.assign || function(t) {
|
||||
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
||||
s = arguments[i];
|
||||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
||||
t[p] = s[p];
|
||||
}
|
||||
return t;
|
||||
};
|
||||
function generic(w, x, y) {
|
||||
// should infer { t: {}, u: {}, v: {} } because there is no trailing type parameter
|
||||
return infer(__assign({}, w, x, { a: y, b: "different type" }));
|
||||
}
|
||||
var b;
|
||||
var c;
|
||||
// can only infer { t: {}, u: {}, v: {} }
|
||||
var i1 = infer(__assign({}, b, c, { a: 12 }));
|
||||
// can only infer { t: {}, u: {}, v: {} }
|
||||
var i2 = infer2(__assign({}, b, c, { a: 12 }));
|
||||
// can only infer { t: {}, u: {}, v: {} }
|
||||
var i3 = generic(b, c, { a: 12 });
|
||||
@@ -0,0 +1,100 @@
|
||||
=== tests/cases/conformance/types/spread/objectSpreadInference.ts ===
|
||||
interface Result<T,U,V> {
|
||||
>Result : Symbol(Result, Decl(objectSpreadInference.ts, 0, 0))
|
||||
>T : Symbol(T, Decl(objectSpreadInference.ts, 0, 17))
|
||||
>U : Symbol(U, Decl(objectSpreadInference.ts, 0, 19))
|
||||
>V : Symbol(V, Decl(objectSpreadInference.ts, 0, 21))
|
||||
|
||||
t: T;
|
||||
>t : Symbol(Result.t, Decl(objectSpreadInference.ts, 0, 25))
|
||||
>T : Symbol(T, Decl(objectSpreadInference.ts, 0, 17))
|
||||
|
||||
u: U;
|
||||
>u : Symbol(Result.u, Decl(objectSpreadInference.ts, 1, 9))
|
||||
>U : Symbol(U, Decl(objectSpreadInference.ts, 0, 19))
|
||||
|
||||
v: V;
|
||||
>v : Symbol(Result.v, Decl(objectSpreadInference.ts, 2, 9))
|
||||
>V : Symbol(V, Decl(objectSpreadInference.ts, 0, 21))
|
||||
}
|
||||
declare function infer<T,U,V>(tuv: { ...T, ...U, a: V }): { t: T, u: U, v: V };
|
||||
>infer : Symbol(infer, Decl(objectSpreadInference.ts, 4, 1))
|
||||
>T : Symbol(T, Decl(objectSpreadInference.ts, 5, 23))
|
||||
>U : Symbol(U, Decl(objectSpreadInference.ts, 5, 25))
|
||||
>V : Symbol(V, Decl(objectSpreadInference.ts, 5, 27))
|
||||
>tuv : Symbol(tuv, Decl(objectSpreadInference.ts, 5, 30))
|
||||
>T : Symbol(T, Decl(objectSpreadInference.ts, 5, 23))
|
||||
>U : Symbol(U, Decl(objectSpreadInference.ts, 5, 25))
|
||||
>a : Symbol(a, Decl(objectSpreadInference.ts, 5, 48))
|
||||
>V : Symbol(V, Decl(objectSpreadInference.ts, 5, 27))
|
||||
>t : Symbol(t, Decl(objectSpreadInference.ts, 5, 59))
|
||||
>T : Symbol(T, Decl(objectSpreadInference.ts, 5, 23))
|
||||
>u : Symbol(u, Decl(objectSpreadInference.ts, 5, 65))
|
||||
>U : Symbol(U, Decl(objectSpreadInference.ts, 5, 25))
|
||||
>v : Symbol(v, Decl(objectSpreadInference.ts, 5, 71))
|
||||
>V : Symbol(V, Decl(objectSpreadInference.ts, 5, 27))
|
||||
|
||||
declare function infer2<T,U,V>(utv: { ...U, a: V, ...T }): { t: T, u: U, v: V };
|
||||
>infer2 : Symbol(infer2, Decl(objectSpreadInference.ts, 5, 79))
|
||||
>T : Symbol(T, Decl(objectSpreadInference.ts, 6, 24))
|
||||
>U : Symbol(U, Decl(objectSpreadInference.ts, 6, 26))
|
||||
>V : Symbol(V, Decl(objectSpreadInference.ts, 6, 28))
|
||||
>utv : Symbol(utv, Decl(objectSpreadInference.ts, 6, 31))
|
||||
>U : Symbol(U, Decl(objectSpreadInference.ts, 6, 26))
|
||||
>a : Symbol(a, Decl(objectSpreadInference.ts, 6, 43))
|
||||
>V : Symbol(V, Decl(objectSpreadInference.ts, 6, 28))
|
||||
>T : Symbol(T, Decl(objectSpreadInference.ts, 6, 24))
|
||||
>t : Symbol(t, Decl(objectSpreadInference.ts, 6, 60))
|
||||
>T : Symbol(T, Decl(objectSpreadInference.ts, 6, 24))
|
||||
>u : Symbol(u, Decl(objectSpreadInference.ts, 6, 66))
|
||||
>U : Symbol(U, Decl(objectSpreadInference.ts, 6, 26))
|
||||
>v : Symbol(v, Decl(objectSpreadInference.ts, 6, 72))
|
||||
>V : Symbol(V, Decl(objectSpreadInference.ts, 6, 28))
|
||||
|
||||
function generic<W, X, Y>(w: W, x: X, y: Y) {
|
||||
>generic : Symbol(generic, Decl(objectSpreadInference.ts, 6, 80))
|
||||
>W : Symbol(W, Decl(objectSpreadInference.ts, 7, 17))
|
||||
>X : Symbol(X, Decl(objectSpreadInference.ts, 7, 19))
|
||||
>Y : Symbol(Y, Decl(objectSpreadInference.ts, 7, 22))
|
||||
>w : Symbol(w, Decl(objectSpreadInference.ts, 7, 26))
|
||||
>W : Symbol(W, Decl(objectSpreadInference.ts, 7, 17))
|
||||
>x : Symbol(x, Decl(objectSpreadInference.ts, 7, 31))
|
||||
>X : Symbol(X, Decl(objectSpreadInference.ts, 7, 19))
|
||||
>y : Symbol(y, Decl(objectSpreadInference.ts, 7, 37))
|
||||
>Y : Symbol(Y, Decl(objectSpreadInference.ts, 7, 22))
|
||||
|
||||
// should infer { t: {}, u: {}, v: {} } because there is no trailing type parameter
|
||||
return infer({ ...w, ...x, a: y, b: "different type" });
|
||||
>infer : Symbol(infer, Decl(objectSpreadInference.ts, 4, 1))
|
||||
>a : Symbol(a, Decl(objectSpreadInference.ts, 9, 30))
|
||||
>y : Symbol(y, Decl(objectSpreadInference.ts, 7, 37))
|
||||
>b : Symbol(b, Decl(objectSpreadInference.ts, 9, 36))
|
||||
}
|
||||
let b: { b: number };
|
||||
>b : Symbol(b, Decl(objectSpreadInference.ts, 11, 3))
|
||||
>b : Symbol(b, Decl(objectSpreadInference.ts, 11, 8))
|
||||
|
||||
let c: { c: number };
|
||||
>c : Symbol(c, Decl(objectSpreadInference.ts, 12, 3))
|
||||
>c : Symbol(c, Decl(objectSpreadInference.ts, 12, 8))
|
||||
|
||||
// can only infer { t: {}, u: {}, v: {} }
|
||||
let i1 = infer({ ...b, ...c, a: 12 });
|
||||
>i1 : Symbol(i1, Decl(objectSpreadInference.ts, 14, 3))
|
||||
>infer : Symbol(infer, Decl(objectSpreadInference.ts, 4, 1))
|
||||
>a : Symbol(a, Decl(objectSpreadInference.ts, 14, 28))
|
||||
|
||||
// can only infer { t: {}, u: {}, v: {} }
|
||||
let i2 = infer2({ ...b, ...c, a: 12 });
|
||||
>i2 : Symbol(i2, Decl(objectSpreadInference.ts, 16, 3))
|
||||
>infer2 : Symbol(infer2, Decl(objectSpreadInference.ts, 5, 79))
|
||||
>a : Symbol(a, Decl(objectSpreadInference.ts, 16, 29))
|
||||
|
||||
// can only infer { t: {}, u: {}, v: {} }
|
||||
let i3 = generic(b, c, { a: 12 });
|
||||
>i3 : Symbol(i3, Decl(objectSpreadInference.ts, 18, 3))
|
||||
>generic : Symbol(generic, Decl(objectSpreadInference.ts, 6, 80))
|
||||
>b : Symbol(b, Decl(objectSpreadInference.ts, 11, 3))
|
||||
>c : Symbol(c, Decl(objectSpreadInference.ts, 12, 3))
|
||||
>a : Symbol(a, Decl(objectSpreadInference.ts, 18, 24))
|
||||
|
||||
@@ -0,0 +1,118 @@
|
||||
=== tests/cases/conformance/types/spread/objectSpreadInference.ts ===
|
||||
interface Result<T,U,V> {
|
||||
>Result : Result<T, U, V>
|
||||
>T : T
|
||||
>U : U
|
||||
>V : V
|
||||
|
||||
t: T;
|
||||
>t : T
|
||||
>T : T
|
||||
|
||||
u: U;
|
||||
>u : U
|
||||
>U : U
|
||||
|
||||
v: V;
|
||||
>v : V
|
||||
>V : V
|
||||
}
|
||||
declare function infer<T,U,V>(tuv: { ...T, ...U, a: V }): { t: T, u: U, v: V };
|
||||
>infer : <T, U, V>(tuv: { ...T; ...U; a: V; }) => { t: T; u: U; v: V; }
|
||||
>T : T
|
||||
>U : U
|
||||
>V : V
|
||||
>tuv : { ...T; ...U; a: V; }
|
||||
>T : T
|
||||
>U : U
|
||||
>a : V
|
||||
>V : V
|
||||
>t : T
|
||||
>T : T
|
||||
>u : U
|
||||
>U : U
|
||||
>v : V
|
||||
>V : V
|
||||
|
||||
declare function infer2<T,U,V>(utv: { ...U, a: V, ...T }): { t: T, u: U, v: V };
|
||||
>infer2 : <T, U, V>(utv: { ...U; a: V; ...T }) => { t: T; u: U; v: V; }
|
||||
>T : T
|
||||
>U : U
|
||||
>V : V
|
||||
>utv : { ...U; a: V; ...T }
|
||||
>U : U
|
||||
>a : V
|
||||
>V : V
|
||||
>T : T
|
||||
>t : T
|
||||
>T : T
|
||||
>u : U
|
||||
>U : U
|
||||
>v : V
|
||||
>V : V
|
||||
|
||||
function generic<W, X, Y>(w: W, x: X, y: Y) {
|
||||
>generic : <W, X, Y>(w: W, x: X, y: Y) => { t: {}; u: {}; v: {}; }
|
||||
>W : W
|
||||
>X : X
|
||||
>Y : Y
|
||||
>w : W
|
||||
>W : W
|
||||
>x : X
|
||||
>X : X
|
||||
>y : Y
|
||||
>Y : Y
|
||||
|
||||
// should infer { t: {}, u: {}, v: {} } because there is no trailing type parameter
|
||||
return infer({ ...w, ...x, a: y, b: "different type" });
|
||||
>infer({ ...w, ...x, a: y, b: "different type" }) : { t: {}; u: {}; v: {}; }
|
||||
>infer : <T, U, V>(tuv: { ...T; ...U; a: V; }) => { t: T; u: U; v: V; }
|
||||
>{ ...w, ...x, a: y, b: "different type" } : { ...W; ...X; a: Y; b: string; }
|
||||
>w : any
|
||||
>x : any
|
||||
>a : Y
|
||||
>y : Y
|
||||
>b : string
|
||||
>"different type" : "different type"
|
||||
}
|
||||
let b: { b: number };
|
||||
>b : { b: number; }
|
||||
>b : number
|
||||
|
||||
let c: { c: number };
|
||||
>c : { c: number; }
|
||||
>c : number
|
||||
|
||||
// can only infer { t: {}, u: {}, v: {} }
|
||||
let i1 = infer({ ...b, ...c, a: 12 });
|
||||
>i1 : { t: {}; u: {}; v: {}; }
|
||||
>infer({ ...b, ...c, a: 12 }) : { t: {}; u: {}; v: {}; }
|
||||
>infer : <T, U, V>(tuv: { ...T; ...U; a: V; }) => { t: T; u: U; v: V; }
|
||||
>{ ...b, ...c, a: 12 } : { a: number; c: number; b: number; }
|
||||
>b : any
|
||||
>c : any
|
||||
>a : number
|
||||
>12 : 12
|
||||
|
||||
// can only infer { t: {}, u: {}, v: {} }
|
||||
let i2 = infer2({ ...b, ...c, a: 12 });
|
||||
>i2 : { t: {}; u: {}; v: {}; }
|
||||
>infer2({ ...b, ...c, a: 12 }) : { t: {}; u: {}; v: {}; }
|
||||
>infer2 : <T, U, V>(utv: { ...U; a: V; ...T }) => { t: T; u: U; v: V; }
|
||||
>{ ...b, ...c, a: 12 } : { a: number; c: number; b: number; }
|
||||
>b : any
|
||||
>c : any
|
||||
>a : number
|
||||
>12 : 12
|
||||
|
||||
// can only infer { t: {}, u: {}, v: {} }
|
||||
let i3 = generic(b, c, { a: 12 });
|
||||
>i3 : { t: {}; u: {}; v: {}; }
|
||||
>generic(b, c, { a: 12 }) : { t: {}; u: {}; v: {}; }
|
||||
>generic : <W, X, Y>(w: W, x: X, y: Y) => { t: {}; u: {}; v: {}; }
|
||||
>b : { b: number; }
|
||||
>c : { c: number; }
|
||||
>{ a: 12 } : { a: number; }
|
||||
>a : number
|
||||
>12 : 12
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
//// [objectSpreadIntersection.ts]
|
||||
function iteratedUnionIntersection<T, U, V>(t: T, u: U, v: V): void {
|
||||
let tu: T | U;
|
||||
let uv: U & V;
|
||||
let result = { ...tu, ...uv, id: 'foo' };
|
||||
let assignable: { ...(T | U), ...(U & V), id: string } = result;
|
||||
}
|
||||
// concrete types work
|
||||
interface A1 { a: number }
|
||||
interface A2 { a: string }
|
||||
interface B1 { b: number }
|
||||
interface B2 { b: string }
|
||||
let a12: A1 & A2;
|
||||
let b12: B1 & B2;
|
||||
let result = { ...a12, ...b12 };
|
||||
let sn: number & string = result.a;
|
||||
sn = result.b;
|
||||
let assignable: { ...(A1 & A2), ...(B1 & B2) } = result;
|
||||
|
||||
function tripleIntersection<T, U, V>(t: T, u: U, v: V): void {
|
||||
let tuv: T & U & V;
|
||||
let result = { ...tuv, id: 'bar' };
|
||||
let assignable: { ...(T & U & V), id: string } = result;
|
||||
}
|
||||
function iteratedDoubleIntersection<T, U, V>(t: T, u: U, v: V): void {
|
||||
let tu: T & U;
|
||||
let uv: U & V;
|
||||
let result = { ...tu, ...uv, id: 'baz' };
|
||||
let assignable: { ...(T & U), ...(U & V), id: string } = result;
|
||||
}
|
||||
function iteratedIntersectionUnion<T, U, V>(t: T, u: U, v: V): void {
|
||||
let tu: T & U;
|
||||
let uv: U | V;
|
||||
let result = { ...tu, ...uv, id: 'qux' };
|
||||
let assignable: { ...(T & U), ...(U | V), id: string } = result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//// [objectSpreadIntersection.js]
|
||||
var __assign = (this && this.__assign) || Object.assign || function(t) {
|
||||
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
||||
s = arguments[i];
|
||||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
||||
t[p] = s[p];
|
||||
}
|
||||
return t;
|
||||
};
|
||||
function iteratedUnionIntersection(t, u, v) {
|
||||
var tu;
|
||||
var uv;
|
||||
var result = __assign({}, tu, uv, { id: 'foo' });
|
||||
var assignable = result;
|
||||
}
|
||||
var a12;
|
||||
var b12;
|
||||
var result = __assign({}, a12, b12);
|
||||
var sn = result.a;
|
||||
sn = result.b;
|
||||
var assignable = result;
|
||||
function tripleIntersection(t, u, v) {
|
||||
var tuv;
|
||||
var result = __assign({}, tuv, { id: 'bar' });
|
||||
var assignable = result;
|
||||
}
|
||||
function iteratedDoubleIntersection(t, u, v) {
|
||||
var tu;
|
||||
var uv;
|
||||
var result = __assign({}, tu, uv, { id: 'baz' });
|
||||
var assignable = result;
|
||||
}
|
||||
function iteratedIntersectionUnion(t, u, v) {
|
||||
var tu;
|
||||
var uv;
|
||||
var result = __assign({}, tu, uv, { id: 'qux' });
|
||||
var assignable = result;
|
||||
}
|
||||
@@ -0,0 +1,188 @@
|
||||
=== tests/cases/conformance/types/spread/objectSpreadIntersection.ts ===
|
||||
function iteratedUnionIntersection<T, U, V>(t: T, u: U, v: V): void {
|
||||
>iteratedUnionIntersection : Symbol(iteratedUnionIntersection, Decl(objectSpreadIntersection.ts, 0, 0))
|
||||
>T : Symbol(T, Decl(objectSpreadIntersection.ts, 0, 35))
|
||||
>U : Symbol(U, Decl(objectSpreadIntersection.ts, 0, 37))
|
||||
>V : Symbol(V, Decl(objectSpreadIntersection.ts, 0, 40))
|
||||
>t : Symbol(t, Decl(objectSpreadIntersection.ts, 0, 44))
|
||||
>T : Symbol(T, Decl(objectSpreadIntersection.ts, 0, 35))
|
||||
>u : Symbol(u, Decl(objectSpreadIntersection.ts, 0, 49))
|
||||
>U : Symbol(U, Decl(objectSpreadIntersection.ts, 0, 37))
|
||||
>v : Symbol(v, Decl(objectSpreadIntersection.ts, 0, 55))
|
||||
>V : Symbol(V, Decl(objectSpreadIntersection.ts, 0, 40))
|
||||
|
||||
let tu: T | U;
|
||||
>tu : Symbol(tu, Decl(objectSpreadIntersection.ts, 1, 7))
|
||||
>T : Symbol(T, Decl(objectSpreadIntersection.ts, 0, 35))
|
||||
>U : Symbol(U, Decl(objectSpreadIntersection.ts, 0, 37))
|
||||
|
||||
let uv: U & V;
|
||||
>uv : Symbol(uv, Decl(objectSpreadIntersection.ts, 2, 7))
|
||||
>U : Symbol(U, Decl(objectSpreadIntersection.ts, 0, 37))
|
||||
>V : Symbol(V, Decl(objectSpreadIntersection.ts, 0, 40))
|
||||
|
||||
let result = { ...tu, ...uv, id: 'foo' };
|
||||
>result : Symbol(result, Decl(objectSpreadIntersection.ts, 3, 7))
|
||||
>id : Symbol(id, Decl(objectSpreadIntersection.ts, 3, 32))
|
||||
|
||||
let assignable: { ...(T | U), ...(U & V), id: string } = result;
|
||||
>assignable : Symbol(assignable, Decl(objectSpreadIntersection.ts, 4, 7))
|
||||
>T : Symbol(T, Decl(objectSpreadIntersection.ts, 0, 35))
|
||||
>U : Symbol(U, Decl(objectSpreadIntersection.ts, 0, 37))
|
||||
>U : Symbol(U, Decl(objectSpreadIntersection.ts, 0, 37))
|
||||
>V : Symbol(V, Decl(objectSpreadIntersection.ts, 0, 40))
|
||||
>id : Symbol(id, Decl(objectSpreadIntersection.ts, 4, 45))
|
||||
>result : Symbol(result, Decl(objectSpreadIntersection.ts, 3, 7))
|
||||
}
|
||||
// concrete types work
|
||||
interface A1 { a: number }
|
||||
>A1 : Symbol(A1, Decl(objectSpreadIntersection.ts, 5, 1))
|
||||
>a : Symbol(A1.a, Decl(objectSpreadIntersection.ts, 7, 14))
|
||||
|
||||
interface A2 { a: string }
|
||||
>A2 : Symbol(A2, Decl(objectSpreadIntersection.ts, 7, 26))
|
||||
>a : Symbol(A2.a, Decl(objectSpreadIntersection.ts, 8, 14))
|
||||
|
||||
interface B1 { b: number }
|
||||
>B1 : Symbol(B1, Decl(objectSpreadIntersection.ts, 8, 26))
|
||||
>b : Symbol(B1.b, Decl(objectSpreadIntersection.ts, 9, 14))
|
||||
|
||||
interface B2 { b: string }
|
||||
>B2 : Symbol(B2, Decl(objectSpreadIntersection.ts, 9, 26))
|
||||
>b : Symbol(B2.b, Decl(objectSpreadIntersection.ts, 10, 14))
|
||||
|
||||
let a12: A1 & A2;
|
||||
>a12 : Symbol(a12, Decl(objectSpreadIntersection.ts, 11, 3))
|
||||
>A1 : Symbol(A1, Decl(objectSpreadIntersection.ts, 5, 1))
|
||||
>A2 : Symbol(A2, Decl(objectSpreadIntersection.ts, 7, 26))
|
||||
|
||||
let b12: B1 & B2;
|
||||
>b12 : Symbol(b12, Decl(objectSpreadIntersection.ts, 12, 3))
|
||||
>B1 : Symbol(B1, Decl(objectSpreadIntersection.ts, 8, 26))
|
||||
>B2 : Symbol(B2, Decl(objectSpreadIntersection.ts, 9, 26))
|
||||
|
||||
let result = { ...a12, ...b12 };
|
||||
>result : Symbol(result, Decl(objectSpreadIntersection.ts, 13, 3))
|
||||
|
||||
let sn: number & string = result.a;
|
||||
>sn : Symbol(sn, Decl(objectSpreadIntersection.ts, 14, 3))
|
||||
>result.a : Symbol(a, Decl(objectSpreadIntersection.ts, 7, 14), Decl(objectSpreadIntersection.ts, 8, 14))
|
||||
>result : Symbol(result, Decl(objectSpreadIntersection.ts, 13, 3))
|
||||
>a : Symbol(a, Decl(objectSpreadIntersection.ts, 7, 14), Decl(objectSpreadIntersection.ts, 8, 14))
|
||||
|
||||
sn = result.b;
|
||||
>sn : Symbol(sn, Decl(objectSpreadIntersection.ts, 14, 3))
|
||||
>result.b : Symbol(b, Decl(objectSpreadIntersection.ts, 9, 14), Decl(objectSpreadIntersection.ts, 10, 14))
|
||||
>result : Symbol(result, Decl(objectSpreadIntersection.ts, 13, 3))
|
||||
>b : Symbol(b, Decl(objectSpreadIntersection.ts, 9, 14), Decl(objectSpreadIntersection.ts, 10, 14))
|
||||
|
||||
let assignable: { ...(A1 & A2), ...(B1 & B2) } = result;
|
||||
>assignable : Symbol(assignable, Decl(objectSpreadIntersection.ts, 16, 3))
|
||||
>A1 : Symbol(A1, Decl(objectSpreadIntersection.ts, 5, 1))
|
||||
>A2 : Symbol(A2, Decl(objectSpreadIntersection.ts, 7, 26))
|
||||
>B1 : Symbol(B1, Decl(objectSpreadIntersection.ts, 8, 26))
|
||||
>B2 : Symbol(B2, Decl(objectSpreadIntersection.ts, 9, 26))
|
||||
>result : Symbol(result, Decl(objectSpreadIntersection.ts, 13, 3))
|
||||
|
||||
function tripleIntersection<T, U, V>(t: T, u: U, v: V): void {
|
||||
>tripleIntersection : Symbol(tripleIntersection, Decl(objectSpreadIntersection.ts, 16, 56))
|
||||
>T : Symbol(T, Decl(objectSpreadIntersection.ts, 18, 28))
|
||||
>U : Symbol(U, Decl(objectSpreadIntersection.ts, 18, 30))
|
||||
>V : Symbol(V, Decl(objectSpreadIntersection.ts, 18, 33))
|
||||
>t : Symbol(t, Decl(objectSpreadIntersection.ts, 18, 37))
|
||||
>T : Symbol(T, Decl(objectSpreadIntersection.ts, 18, 28))
|
||||
>u : Symbol(u, Decl(objectSpreadIntersection.ts, 18, 42))
|
||||
>U : Symbol(U, Decl(objectSpreadIntersection.ts, 18, 30))
|
||||
>v : Symbol(v, Decl(objectSpreadIntersection.ts, 18, 48))
|
||||
>V : Symbol(V, Decl(objectSpreadIntersection.ts, 18, 33))
|
||||
|
||||
let tuv: T & U & V;
|
||||
>tuv : Symbol(tuv, Decl(objectSpreadIntersection.ts, 19, 7))
|
||||
>T : Symbol(T, Decl(objectSpreadIntersection.ts, 18, 28))
|
||||
>U : Symbol(U, Decl(objectSpreadIntersection.ts, 18, 30))
|
||||
>V : Symbol(V, Decl(objectSpreadIntersection.ts, 18, 33))
|
||||
|
||||
let result = { ...tuv, id: 'bar' };
|
||||
>result : Symbol(result, Decl(objectSpreadIntersection.ts, 20, 7))
|
||||
>id : Symbol(id, Decl(objectSpreadIntersection.ts, 20, 26))
|
||||
|
||||
let assignable: { ...(T & U & V), id: string } = result;
|
||||
>assignable : Symbol(assignable, Decl(objectSpreadIntersection.ts, 21, 7))
|
||||
>T : Symbol(T, Decl(objectSpreadIntersection.ts, 18, 28))
|
||||
>U : Symbol(U, Decl(objectSpreadIntersection.ts, 18, 30))
|
||||
>V : Symbol(V, Decl(objectSpreadIntersection.ts, 18, 33))
|
||||
>id : Symbol(id, Decl(objectSpreadIntersection.ts, 21, 37))
|
||||
>result : Symbol(result, Decl(objectSpreadIntersection.ts, 20, 7))
|
||||
}
|
||||
function iteratedDoubleIntersection<T, U, V>(t: T, u: U, v: V): void {
|
||||
>iteratedDoubleIntersection : Symbol(iteratedDoubleIntersection, Decl(objectSpreadIntersection.ts, 22, 1))
|
||||
>T : Symbol(T, Decl(objectSpreadIntersection.ts, 23, 36))
|
||||
>U : Symbol(U, Decl(objectSpreadIntersection.ts, 23, 38))
|
||||
>V : Symbol(V, Decl(objectSpreadIntersection.ts, 23, 41))
|
||||
>t : Symbol(t, Decl(objectSpreadIntersection.ts, 23, 45))
|
||||
>T : Symbol(T, Decl(objectSpreadIntersection.ts, 23, 36))
|
||||
>u : Symbol(u, Decl(objectSpreadIntersection.ts, 23, 50))
|
||||
>U : Symbol(U, Decl(objectSpreadIntersection.ts, 23, 38))
|
||||
>v : Symbol(v, Decl(objectSpreadIntersection.ts, 23, 56))
|
||||
>V : Symbol(V, Decl(objectSpreadIntersection.ts, 23, 41))
|
||||
|
||||
let tu: T & U;
|
||||
>tu : Symbol(tu, Decl(objectSpreadIntersection.ts, 24, 7))
|
||||
>T : Symbol(T, Decl(objectSpreadIntersection.ts, 23, 36))
|
||||
>U : Symbol(U, Decl(objectSpreadIntersection.ts, 23, 38))
|
||||
|
||||
let uv: U & V;
|
||||
>uv : Symbol(uv, Decl(objectSpreadIntersection.ts, 25, 7))
|
||||
>U : Symbol(U, Decl(objectSpreadIntersection.ts, 23, 38))
|
||||
>V : Symbol(V, Decl(objectSpreadIntersection.ts, 23, 41))
|
||||
|
||||
let result = { ...tu, ...uv, id: 'baz' };
|
||||
>result : Symbol(result, Decl(objectSpreadIntersection.ts, 26, 7))
|
||||
>id : Symbol(id, Decl(objectSpreadIntersection.ts, 26, 32))
|
||||
|
||||
let assignable: { ...(T & U), ...(U & V), id: string } = result;
|
||||
>assignable : Symbol(assignable, Decl(objectSpreadIntersection.ts, 27, 7))
|
||||
>T : Symbol(T, Decl(objectSpreadIntersection.ts, 23, 36))
|
||||
>U : Symbol(U, Decl(objectSpreadIntersection.ts, 23, 38))
|
||||
>U : Symbol(U, Decl(objectSpreadIntersection.ts, 23, 38))
|
||||
>V : Symbol(V, Decl(objectSpreadIntersection.ts, 23, 41))
|
||||
>id : Symbol(id, Decl(objectSpreadIntersection.ts, 27, 45))
|
||||
>result : Symbol(result, Decl(objectSpreadIntersection.ts, 26, 7))
|
||||
}
|
||||
function iteratedIntersectionUnion<T, U, V>(t: T, u: U, v: V): void {
|
||||
>iteratedIntersectionUnion : Symbol(iteratedIntersectionUnion, Decl(objectSpreadIntersection.ts, 28, 1))
|
||||
>T : Symbol(T, Decl(objectSpreadIntersection.ts, 29, 35))
|
||||
>U : Symbol(U, Decl(objectSpreadIntersection.ts, 29, 37))
|
||||
>V : Symbol(V, Decl(objectSpreadIntersection.ts, 29, 40))
|
||||
>t : Symbol(t, Decl(objectSpreadIntersection.ts, 29, 44))
|
||||
>T : Symbol(T, Decl(objectSpreadIntersection.ts, 29, 35))
|
||||
>u : Symbol(u, Decl(objectSpreadIntersection.ts, 29, 49))
|
||||
>U : Symbol(U, Decl(objectSpreadIntersection.ts, 29, 37))
|
||||
>v : Symbol(v, Decl(objectSpreadIntersection.ts, 29, 55))
|
||||
>V : Symbol(V, Decl(objectSpreadIntersection.ts, 29, 40))
|
||||
|
||||
let tu: T & U;
|
||||
>tu : Symbol(tu, Decl(objectSpreadIntersection.ts, 30, 7))
|
||||
>T : Symbol(T, Decl(objectSpreadIntersection.ts, 29, 35))
|
||||
>U : Symbol(U, Decl(objectSpreadIntersection.ts, 29, 37))
|
||||
|
||||
let uv: U | V;
|
||||
>uv : Symbol(uv, Decl(objectSpreadIntersection.ts, 31, 7))
|
||||
>U : Symbol(U, Decl(objectSpreadIntersection.ts, 29, 37))
|
||||
>V : Symbol(V, Decl(objectSpreadIntersection.ts, 29, 40))
|
||||
|
||||
let result = { ...tu, ...uv, id: 'qux' };
|
||||
>result : Symbol(result, Decl(objectSpreadIntersection.ts, 32, 7))
|
||||
>id : Symbol(id, Decl(objectSpreadIntersection.ts, 32, 32))
|
||||
|
||||
let assignable: { ...(T & U), ...(U | V), id: string } = result;
|
||||
>assignable : Symbol(assignable, Decl(objectSpreadIntersection.ts, 33, 7))
|
||||
>T : Symbol(T, Decl(objectSpreadIntersection.ts, 29, 35))
|
||||
>U : Symbol(U, Decl(objectSpreadIntersection.ts, 29, 37))
|
||||
>U : Symbol(U, Decl(objectSpreadIntersection.ts, 29, 37))
|
||||
>V : Symbol(V, Decl(objectSpreadIntersection.ts, 29, 40))
|
||||
>id : Symbol(id, Decl(objectSpreadIntersection.ts, 33, 45))
|
||||
>result : Symbol(result, Decl(objectSpreadIntersection.ts, 32, 7))
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,207 @@
|
||||
=== tests/cases/conformance/types/spread/objectSpreadIntersection.ts ===
|
||||
function iteratedUnionIntersection<T, U, V>(t: T, u: U, v: V): void {
|
||||
>iteratedUnionIntersection : <T, U, V>(t: T, u: U, v: V) => void
|
||||
>T : T
|
||||
>U : U
|
||||
>V : V
|
||||
>t : T
|
||||
>T : T
|
||||
>u : U
|
||||
>U : U
|
||||
>v : V
|
||||
>V : V
|
||||
|
||||
let tu: T | U;
|
||||
>tu : T | U
|
||||
>T : T
|
||||
>U : U
|
||||
|
||||
let uv: U & V;
|
||||
>uv : U & V
|
||||
>U : U
|
||||
>V : V
|
||||
|
||||
let result = { ...tu, ...uv, id: 'foo' };
|
||||
>result : { ...T; ...U & V; id: string; } | { ...U; ...U & V; id: string; }
|
||||
>{ ...tu, ...uv, id: 'foo' } : { ...T; ...U & V; id: string; } | { ...U; ...U & V; id: string; }
|
||||
>tu : any
|
||||
>uv : any
|
||||
>id : string
|
||||
>'foo' : "foo"
|
||||
|
||||
let assignable: { ...(T | U), ...(U & V), id: string } = result;
|
||||
>assignable : { ...T; ...U & V; id: string; } | { ...U; ...U & V; id: string; }
|
||||
>T : T
|
||||
>U : U
|
||||
>U : U
|
||||
>V : V
|
||||
>id : string
|
||||
>result : { ...T; ...U & V; id: string; } | { ...U; ...U & V; id: string; }
|
||||
}
|
||||
// concrete types work
|
||||
interface A1 { a: number }
|
||||
>A1 : A1
|
||||
>a : number
|
||||
|
||||
interface A2 { a: string }
|
||||
>A2 : A2
|
||||
>a : string
|
||||
|
||||
interface B1 { b: number }
|
||||
>B1 : B1
|
||||
>b : number
|
||||
|
||||
interface B2 { b: string }
|
||||
>B2 : B2
|
||||
>b : string
|
||||
|
||||
let a12: A1 & A2;
|
||||
>a12 : A1 & A2
|
||||
>A1 : A1
|
||||
>A2 : A2
|
||||
|
||||
let b12: B1 & B2;
|
||||
>b12 : B1 & B2
|
||||
>B1 : B1
|
||||
>B2 : B2
|
||||
|
||||
let result = { ...a12, ...b12 };
|
||||
>result : { b: number & string; a: number & string; }
|
||||
>{ ...a12, ...b12 } : { b: number & string; a: number & string; }
|
||||
>a12 : any
|
||||
>b12 : any
|
||||
|
||||
let sn: number & string = result.a;
|
||||
>sn : number & string
|
||||
>result.a : number & string
|
||||
>result : { b: number & string; a: number & string; }
|
||||
>a : number & string
|
||||
|
||||
sn = result.b;
|
||||
>sn = result.b : number & string
|
||||
>sn : number & string
|
||||
>result.b : number & string
|
||||
>result : { b: number & string; a: number & string; }
|
||||
>b : number & string
|
||||
|
||||
let assignable: { ...(A1 & A2), ...(B1 & B2) } = result;
|
||||
>assignable : { b: number & string; a: number & string; }
|
||||
>A1 : A1
|
||||
>A2 : A2
|
||||
>B1 : B1
|
||||
>B2 : B2
|
||||
>result : { b: number & string; a: number & string; }
|
||||
|
||||
function tripleIntersection<T, U, V>(t: T, u: U, v: V): void {
|
||||
>tripleIntersection : <T, U, V>(t: T, u: U, v: V) => void
|
||||
>T : T
|
||||
>U : U
|
||||
>V : V
|
||||
>t : T
|
||||
>T : T
|
||||
>u : U
|
||||
>U : U
|
||||
>v : V
|
||||
>V : V
|
||||
|
||||
let tuv: T & U & V;
|
||||
>tuv : T & U & V
|
||||
>T : T
|
||||
>U : U
|
||||
>V : V
|
||||
|
||||
let result = { ...tuv, id: 'bar' };
|
||||
>result : { ...T & U & V; id: string; }
|
||||
>{ ...tuv, id: 'bar' } : { ...T & U & V; id: string; }
|
||||
>tuv : any
|
||||
>id : string
|
||||
>'bar' : "bar"
|
||||
|
||||
let assignable: { ...(T & U & V), id: string } = result;
|
||||
>assignable : { ...T & U & V; id: string; }
|
||||
>T : T
|
||||
>U : U
|
||||
>V : V
|
||||
>id : string
|
||||
>result : { ...T & U & V; id: string; }
|
||||
}
|
||||
function iteratedDoubleIntersection<T, U, V>(t: T, u: U, v: V): void {
|
||||
>iteratedDoubleIntersection : <T, U, V>(t: T, u: U, v: V) => void
|
||||
>T : T
|
||||
>U : U
|
||||
>V : V
|
||||
>t : T
|
||||
>T : T
|
||||
>u : U
|
||||
>U : U
|
||||
>v : V
|
||||
>V : V
|
||||
|
||||
let tu: T & U;
|
||||
>tu : T & U
|
||||
>T : T
|
||||
>U : U
|
||||
|
||||
let uv: U & V;
|
||||
>uv : U & V
|
||||
>U : U
|
||||
>V : V
|
||||
|
||||
let result = { ...tu, ...uv, id: 'baz' };
|
||||
>result : { ...T & U; ...U & V; id: string; }
|
||||
>{ ...tu, ...uv, id: 'baz' } : { ...T & U; ...U & V; id: string; }
|
||||
>tu : any
|
||||
>uv : any
|
||||
>id : string
|
||||
>'baz' : "baz"
|
||||
|
||||
let assignable: { ...(T & U), ...(U & V), id: string } = result;
|
||||
>assignable : { ...T & U; ...U & V; id: string; }
|
||||
>T : T
|
||||
>U : U
|
||||
>U : U
|
||||
>V : V
|
||||
>id : string
|
||||
>result : { ...T & U; ...U & V; id: string; }
|
||||
}
|
||||
function iteratedIntersectionUnion<T, U, V>(t: T, u: U, v: V): void {
|
||||
>iteratedIntersectionUnion : <T, U, V>(t: T, u: U, v: V) => void
|
||||
>T : T
|
||||
>U : U
|
||||
>V : V
|
||||
>t : T
|
||||
>T : T
|
||||
>u : U
|
||||
>U : U
|
||||
>v : V
|
||||
>V : V
|
||||
|
||||
let tu: T & U;
|
||||
>tu : T & U
|
||||
>T : T
|
||||
>U : U
|
||||
|
||||
let uv: U | V;
|
||||
>uv : U | V
|
||||
>U : U
|
||||
>V : V
|
||||
|
||||
let result = { ...tu, ...uv, id: 'qux' };
|
||||
>result : { ...T & U; ...U; id: string; } | { ...T & U; ...V; id: string; }
|
||||
>{ ...tu, ...uv, id: 'qux' } : { ...T & U; ...U; id: string; } | { ...T & U; ...V; id: string; }
|
||||
>tu : any
|
||||
>uv : any
|
||||
>id : string
|
||||
>'qux' : "qux"
|
||||
|
||||
let assignable: { ...(T & U), ...(U | V), id: string } = result;
|
||||
>assignable : { ...T & U; ...U; id: string; } | { ...T & U; ...V; id: string; }
|
||||
>T : T
|
||||
>U : U
|
||||
>U : U
|
||||
>V : V
|
||||
>id : string
|
||||
>result : { ...T & U; ...U; id: string; } | { ...T & U; ...V; id: string; }
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user