diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index f500dc79526..da2b92a9406 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -15818,8 +15818,8 @@ namespace ts { } let leftType = checkExpression(left, contextualMapper); let rightType = checkExpression(right, contextualMapper); - let propagateNull = operator >= SyntaxKind.FirstAssignment && operator <= SyntaxKind.LastAssignment && left.flags & NodeFlags.PropagateNull; - let propagatingType = propagateNull ? getNullPropagatingType(leftType) : neverType; + const propagateNull = operator >= SyntaxKind.FirstAssignment && operator <= SyntaxKind.LastAssignment && left.flags & NodeFlags.PropagateNull; + const propagatingType = propagateNull ? getNullPropagatingType(leftType) : neverType; if (propagateNull) { leftType = getNonNullableType(leftType); } diff --git a/src/compiler/factory.ts b/src/compiler/factory.ts index 561d6426c23..9193856e366 100644 --- a/src/compiler/factory.ts +++ b/src/compiler/factory.ts @@ -2376,12 +2376,21 @@ namespace ts { } } - export function insertLeadingStatement(dest: Statement, source: Statement) { - if (isBlock(dest)) { - return updateBlock(dest, setTextRange(createNodeArray([source, ...dest.statements]), dest.statements)); + export function insertLeadingStatement(embeddedStatement: Statement, newStatement: Statement) { + if (isBlock(embeddedStatement)) { + return updateBlock( + embeddedStatement, + setTextRange( + createNodeArray([newStatement, ...embeddedStatement.statements]), + embeddedStatement.statements + ) + ); } else { - return createBlock(createNodeArray([dest, source]), /*multiLine*/ true); + return createBlock( + createNodeArray([newStatement, embeddedStatement]), + /*multiLine*/ true + ); } } @@ -2402,67 +2411,28 @@ namespace ts { return updated; } - export const enum CreateRefFlags { - Readable = 1 << 0, - Writable = 1 << 1, - ReadWrite = Readable | Writable, - } - /** - * Creates an expression that can be used to bind a reference to an identifier or property. + * Creates an expression that can be used to bind a reference to an identifier, property access, or element access. * - * For an identifier `x`, this creates an expression similar to the following: + * This creates an expression similar to the following: * * ({ * get value() { return x; }, * set value(_a) { x = _a; } * }) * - * For a property `x.y`, this creates an expression similar to the following: - * - * (_a = x, { - * get value() { return _a.y; }, - * set value(_b) { _a.y = _b; } - * }) - * - * For an element access `x[y()]`, this creates an expression similar to the following: - * - * (_a = x, _b = y(), { - * get value() { return _a[_b]; }, - * set value(_c) { _a[_b] = _c; } - * }) + * @param node The referenced expression. + * @param recordTempVariable A callback used to record temporary variables. + * @param writeOnly A value indicating whether to omit the `value` getter on the ref object. */ - export function createRef(node: PropertyAccessExpression | ElementAccessExpression | Identifier, recordTempVariable: (node: Identifier) => void, flags?: CreateRefFlags) { - if (!flags) flags = CreateRefFlags.ReadWrite; - const paramName = flags & CreateRefFlags.Writable ? createTempVariable(/*recordTempVariable*/ undefined) : undefined; - let expressions: Expression[]; - let getValue: Expression; - let putValue: Expression; - if (isPropertyAccessOrElementAccess(node)) { - expressions = []; - const { reference } = createPropertyReference(node, recordTempVariable, expressions, /*captureArgumentExpression*/ true); - // Copy null propagation flags - if (node.flags & NodeFlags.PropagateNull) { - reference.flags |= NodeFlags.PropagateNull; - } - if (flags & CreateRefFlags.Readable) { - getValue = reference - } - if (flags & CreateRefFlags.Writable) { - putValue = setSourceMapRange(createAssignment(reference, paramName), node); - } - } - else { - if (flags & CreateRefFlags.Readable) { - getValue = node; - } - if (flags & CreateRefFlags.Writable) { - putValue = setSourceMapRange(createAssignment(node, paramName), node); - } - } - + export function createRefObject(node: PropertyAccessExpression | ElementAccessExpression | Identifier, recordTempVariable: (temp: Identifier) => void, writeOnly?: boolean) { + const expressions: Expression[] = []; + const paramName = createTempVariable(/*recordTempVariable*/ undefined); + const reference = isPropertyAccessOrElementAccess(node) + ? createPropertyReference(node, recordTempVariable, expressions, /*captureIdentifiers*/ false, /*captureArgumentExpression*/ true, /*copyNullPropagation*/ true).reference + : node; const properties: ObjectLiteralElementLike[] = []; - if (getValue) { + if (!writeOnly) { properties.push( setSourceMapRange( createGetAccessor( @@ -2471,38 +2441,34 @@ namespace ts { "value", /*parameters*/ [], /*type*/ undefined, - createBlock([setSourceMapRange(createReturn(getValue), node)]) + createBlock([setSourceMapRange(createReturn(reference), node)]) ), node ) ); } - if (putValue) { - properties.push( - setSourceMapRange( - createSetAccessor( - /*decorators*/ undefined, - /*modifiers*/ undefined, - "value", - [createParameter(/*decorators*/ undefined, /*modifiers*/ undefined, /*dotDotDotToken*/ undefined, paramName)], - createBlock([setSourceMapRange(createStatement(putValue), node)]) - ), - node - ) - ); - } - const refExpression = setSourceMapRange( - setCommentRange( - createObjectLiteral(properties, /*multiLine*/ false), + properties.push( + setSourceMapRange( + createSetAccessor( + /*decorators*/ undefined, + /*modifiers*/ undefined, + "value", + [createParameter(/*decorators*/ undefined, /*modifiers*/ undefined, /*dotDotDotToken*/ undefined, paramName)], + createBlock([setSourceMapRange(createStatement(setSourceMapRange(createAssignment(reference, paramName), node)), node)]) + ), node - ), - node + ) ); - if (expressions) { - expressions.push(refExpression); - return inlineExpressions(expressions); - } - return refExpression; + expressions.push( + setSourceMapRange( + setCommentRange( + createObjectLiteral(properties, /*multiLine*/ false), + node + ), + node + ) + ); + return setTextRange(inlineExpressions(expressions), node); } /** @@ -2518,6 +2484,7 @@ namespace ts { case SyntaxKind.Identifier: return captureIdentifiers; case SyntaxKind.ThisKeyword: + case SyntaxKind.SuperKeyword: case SyntaxKind.NullKeyword: case SyntaxKind.TrueKeyword: case SyntaxKind.FalseKeyword: @@ -2566,39 +2533,77 @@ namespace ts { export interface PropertyReference { baseValue: Expression; reference: PropertyAccessExpression | ElementAccessExpression; + thisValue?: Expression; } /** * Creates an approximation of an ECMAScript `Reference` specification type. - * @param lhsReference The property or element access expression from which to create the reference. + * @param referenceExpression The expression from which to create the reference. * @param recordTempVariable A callback used to record new temp variables. - * @param expressions The array of expressions into which capturing assignments should be added. - * @param captureArgumentExpression A value indicating whether to capture the argumentExpression of an ElementAccessExpression. + * @param expressions The array of expressions into which capturing assignments should be + * added. If not supplied, expression capturing occurs in-line in the reference. + * @param captureArgumentExpression A value indicating whether to capture the + * argumentExpression of an ElementAccessExpression. + * @param copyNullPropagation A value indicating whether to preserve null propagation flags. */ - export function createPropertyReference(referenceExpression: PropertyAccessExpression | ElementAccessExpression, recordTempVariable: (temp: Identifier) => void, expressions: Expression[], captureArgumentExpression?: boolean): PropertyReference { - const baseValue = captureExpressionIfNeeded(referenceExpression.expression, recordTempVariable, expressions); - let reference: PropertyAccessExpression | ElementAccessExpression; - if (isPropertyAccessExpression(referenceExpression)) { - reference = setTextRange( - createPropertyAccess( - baseValue, - referenceExpression.name - ), - referenceExpression - ); + export function createPropertyReference(node: PropertyAccessExpression | ElementAccessExpression, recordTempVariable: (temp: Identifier) => void, expressions?: Expression[], captureIdentifiers?: boolean, captureArgumentExpression?: boolean, copyNullPropagation?: boolean): PropertyReference { + let baseExpression: Expression = node.expression; + let baseValue = baseExpression; + let reference = node; + let thisValue: Expression; + if (shouldBeCapturedInTempVariable(baseExpression, captureIdentifiers)) { + if (expressions) { + baseValue = baseExpression = captureExpression(baseValue, recordTempVariable, expressions); + } + else { + baseValue = createTempVariable(recordTempVariable); + baseExpression = setTextRange(createAssignment(baseValue, baseExpression), baseExpression); + } + } + if (isPropertyAccessExpression(node)) { + reference = updatePropertyAccess(node, baseExpression, node.name); } else { - reference = setTextRange( - createElementAccess( - baseValue, - captureArgumentExpression - ? captureExpressionIfNeeded(referenceExpression.argumentExpression, recordTempVariable, expressions) - : referenceExpression.argumentExpression - ), - referenceExpression + let argumentExpression = node.argumentExpression; + let argumentValue = argumentExpression; + if (captureArgumentExpression && shouldBeCapturedInTempVariable(argumentExpression, captureIdentifiers)) { + if (expressions) { + argumentValue = argumentExpression = captureExpression(argumentExpression, recordTempVariable, expressions); + } + else { + argumentValue = createTempVariable(recordTempVariable); + argumentExpression = setTextRange(createAssignment(argumentValue, argumentExpression), argumentExpression); + baseExpression = baseValue === baseExpression + ? inlineExpressions([argumentExpression, baseValue]) // simple literal or identifier + : inlineExpressions([baseExpression, argumentExpression, baseValue]); // complex expression + } + } + reference = updateElementAccess( + node, + baseExpression, + argumentValue ); } - return { baseValue, reference }; + if (reference === node && !copyNullPropagation && reference.flags & NodeFlags.PropagateNull) { + reference = setTextRange( + isPropertyAccessExpression(reference) + ? createPropertyAccess( + reference.expression, + reference.name, + copyNullPropagation ? node.flags & NodeFlags.PropagateNull : 0 + ) + : createElementAccess( + reference.expression, + reference.argumentExpression, + copyNullPropagation ? node.flags & NodeFlags.PropagateNull : 0 + ), + node + ); + } + if (node.expression.kind === SyntaxKind.SuperKeyword) { + thisValue = createThis(); + } + return { baseValue, reference, thisValue }; } export interface CallBinding { @@ -2618,9 +2623,16 @@ namespace ts { const callee = skipOuterExpressions(expression); let thisArg: Expression; let target: LeftHandSideExpression; - if (isSuperProperty(callee)) { - thisArg = createThis(); - target = callee; + if (isPropertyAccessOrElementAccess(callee)) { + const { baseValue, reference, thisValue } = createPropertyReference( + callee, + recordTempVariable, + /*expressions*/ undefined, + captureIdentifiers, + /*captureArgumentExpression*/ false, + /*copyNullPropagation*/ true); + thisArg = thisValue || baseValue; + target = reference; } else if (isSuper(callee)) { thisArg = createThis(); @@ -2632,54 +2644,6 @@ namespace ts { thisArg = createVoidZero(); target = parenthesizeForAccess(callee); } - else if (isPropertyAccessExpression(callee)) { - if (shouldBeCapturedInTempVariable(callee.expression, captureIdentifiers)) { - // for `a.b()` target is `(_a = a).b` and thisArg is `_a` - thisArg = createTempVariable(recordTempVariable); - target = setTextRange( - createPropertyAccess( - setTextRange( - createAssignment( - thisArg, - callee.expression - ), - callee.expression - ), - callee.name, - callee.flags & NodeFlags.PropagateNull - ), - callee - ); - } - else { - thisArg = callee.expression; - target = callee; - } - } - else if (isElementAccessExpression(callee)) { - if (shouldBeCapturedInTempVariable(callee.expression, captureIdentifiers)) { - // for `a[b]()` target is `(_a = a)[b]` and thisArg is `_a` - thisArg = createTempVariable(recordTempVariable); - target = setTextRange( - createElementAccess( - setTextRange( - createAssignment( - thisArg, - callee.expression - ), - callee.expression - ), - callee.argumentExpression, - callee.flags & NodeFlags.PropagateNull - ), - callee - ); - } - else { - thisArg = callee.expression; - target = callee; - } - } else { // for `a()` target is `a` and thisArg is `void 0` thisArg = createVoidZero(); diff --git a/src/compiler/transformers/esnext.ts b/src/compiler/transformers/esnext.ts index 8846afaec87..c6f7eba1dbe 100644 --- a/src/compiler/transformers/esnext.ts +++ b/src/compiler/transformers/esnext.ts @@ -79,6 +79,8 @@ namespace ts { return visitVariableDeclaration(node as VariableDeclaration); case SyntaxKind.ForOfStatement: return visitForOfStatement(node as ForOfStatement, /*outermostLabeledStatement*/ undefined); + case SyntaxKind.ForInStatement: + return visitForInStatement(node as ForInStatement, /*outermostLabeledStatement*/ undefined); case SyntaxKind.ForStatement: return visitForStatement(node as ForStatement); case SyntaxKind.VoidExpression: @@ -160,8 +162,11 @@ namespace ts { function visitLabeledStatement(node: LabeledStatement) { if (enclosingFunctionFlags & FunctionFlags.Async && enclosingFunctionFlags & FunctionFlags.Generator) { const statement = unwrapInnermostStatementOfLabel(node); - if (statement.kind === SyntaxKind.ForOfStatement && (statement).awaitModifier) { - return visitForOfStatement(statement, node); + switch (statement.kind) { + case SyntaxKind.ForOfStatement: + return visitForOfStatement(statement, /*outermostLabeledStatement*/ node); + case SyntaxKind.ForInStatement: + return visitForInStatement(statement, /*outermostLabeledStatement*/ node); } return restoreEnclosingLabel(visitEachChild(node, visitor, context), node); } @@ -262,7 +267,7 @@ namespace ts { case SyntaxKind.PropertyAccessExpression: case SyntaxKind.ElementAccessExpression: if (node.flags & NodeFlags.PropagateNull) { - const ref = createRef(node, hoistVariableDeclaration, CreateRefFlags.Writable); + const ref = createRefObject(node, hoistVariableDeclaration, /*writeOnly*/ true); return setTextRange(createPropertyAccess(ref, "value"), node); } @@ -389,6 +394,9 @@ namespace ts { if (node.initializer.transformFlags & TransformFlags.ContainsObjectRest) { node = transformForOfStatementWithObjectRest(node); } + if (isPropertyAccessOrElementAccess(node.initializer) && node.initializer.flags & NodeFlags.PropagateNull) { + node = transformForOfStatementWithNullPropagatingInitializer(node, node.initializer); + } if (node.awaitModifier) { return transformForAwaitOfStatement(node, outermostLabeledStatement); } @@ -434,6 +442,39 @@ namespace ts { return node; } + function transformForOfStatementWithNullPropagatingInitializer(node: ForOfStatement, initializer: PropertyAccessExpression | ElementAccessExpression) { + if (languageVersion >= ScriptTarget.ES2015) { + return updateForOf( + node, + node.awaitModifier, + createPropertyAccess(createRefObject(initializer, hoistVariableDeclaration, /*writeOnly*/ true), "value"), + node.expression, + node.statement + ); + } + else { + const temp = createTempVariable(hoistVariableDeclaration); + return updateForOf( + node, + node.awaitModifier, + createVariableDeclarationList([createVariableDeclaration(temp)]), + node.expression, + insertLeadingStatement( + node.statement, + setTextRange( + createStatement( + setTextRange( + createAssignment(initializer, temp), + node.initializer + ) + ), + node.initializer + ) + ) + ); + } + } + function convertForOfStatementHead(node: ForOfStatement, boundValue: Expression) { const binding = createForOfBindingStatement(node.initializer, boundValue); @@ -580,6 +621,48 @@ namespace ts { ); } + function visitForInStatement(node: ForInStatement, outermostLabeledStatement: LabeledStatement): VisitResult { + if (isPropertyAccessOrElementAccess(node.initializer) && node.initializer.flags & NodeFlags.PropagateNull) { + node = transformForInStatementWithNullPropagatingInitializer(node, node.initializer); + } + + return restoreEnclosingLabel(visitEachChild(node, visitor, context), outermostLabeledStatement); + } + + function transformForInStatementWithNullPropagatingInitializer(node: ForInStatement, initializer: PropertyAccessExpression | ElementAccessExpression) { + if (languageVersion >= ScriptTarget.ES5) { + return updateForIn( + node, + createPropertyAccess(createRefObject(initializer, hoistVariableDeclaration, /*writeOnly*/ true), "value"), + node.expression, + node.statement + ); + } + else { + const temp = createTempVariable(hoistVariableDeclaration); + return updateForIn( + node, + createVariableDeclarationList([createVariableDeclaration(temp)]), + node.expression, + insertLeadingStatement( + node.statement, + setTextRange( + createStatement( + setTextRange( + createAssignment( + initializer, + temp + ), + node.initializer + ) + ), + node.initializer + ) + ) + ); + } + } + function visitParameter(node: ParameterDeclaration): ParameterDeclaration { if (node.transformFlags & TransformFlags.ContainsObjectRest) { // Binding patterns are converted into a generated name and are @@ -982,7 +1065,7 @@ namespace ts { setTextRange( createConditional( createEquality(baseValue, createNull()), - createVoidZero(), + node.kind === SyntaxKind.DeleteExpression ? createTrue() : createVoidZero(), updateNode( node, reference diff --git a/src/services/services.ts b/src/services/services.ts index 0c7b5d97d26..cba27688abf 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -334,7 +334,7 @@ namespace ts { _primaryExpressionBrand: any; _memberExpressionBrand: any; _leftHandSideExpressionBrand: any; - _incrementExpressionBrand: any; + _updateExpressionBrand: any; _unaryExpressionBrand: any; _expressionBrand: any; constructor(_kind: SyntaxKind.Identifier, pos: number, end: number) { diff --git a/tests/baselines/reference/emitter.safeNavigation.es2015.js b/tests/baselines/reference/emitter.safeNavigation.es2015.js new file mode 100644 index 00000000000..dec1730113f --- /dev/null +++ b/tests/baselines/reference/emitter.safeNavigation.es2015.js @@ -0,0 +1,716 @@ +//// [tests/cases/conformance/emitter/es2015/safeNavigation/emitter.safeNavigation.es2015.ts] //// + +//// [declarations.d.ts] +declare var x: any; +declare var y: any; +declare var f: ({ + (): void; + (): void; + new (): any; + new (): any; +}) | undefined; +declare var o: { y: typeof f; } +declare class Base { x(): any; } +declare namespace M { + export class y {} + export class z {} +} +//// [propertyAccessOk.ts] +x.y +x?.y +x?.y.z +x.y?.z +x?.y?.z +//// [elementAccessOk.ts] +x["y"] +x?.["y"] +x?.["y"]["z"] +x["y"]?.["z"] +x?.["y"]?.["z"] +//// [callExpressionOk.ts] +x() +x?.() +x.y?.() +x["y"]?.() +f?.() +o.y?.() +o["y"]?.() +//// [newExpressionOk.ts] +new x() +new x.y?.() +new x["y"]?.() +new f?.() +new o.y?.() +new o["y"]?.() +//// [mixedOk.ts] +x?.y?.["z"] +x?.["y"]?.z +x?.y() +x?.y?.() +o?.y() +o?.y?.() +x?.["z"]() +x?.["z"]?.() +o?.["y"]() +o?.["y"]?.() +//// [mutationOk.ts] +x?.y = 1 +x?.y += 1; +x?.y -= 1; +x?.y *= 1; +x?.y /= 1; +x?.y %= 1; +x?.y **= 1; +x?.y |= 1; +x?.y &= 1; +x?.y ^= 1; +x?.y <<= 1; +x?.y >>= 1; +x?.y >>>= 1; +x?.y++; +x?.y--; +++x?.y; +--x?.y; +delete x?.y; +x?.["y"] = 1 +x?.["y"] += 1; +x?.["y"] -= 1; +x?.["y"] *= 1; +x?.["y"] /= 1; +x?.["y"] %= 1; +x?.["y"] **= 1; +x?.["y"] |= 1; +x?.["y"] &= 1; +x?.["y"] ^= 1; +x?.["y"] <<= 1; +x?.["y"] >>= 1; +x?.["y"] >>>= 1; +x?.["y"]++; +x?.["y"]--; +++x?.["y"]; +--x?.["y"]; +delete x?.["y"]; +//// [arrayAssignmentPatternOk.ts] +[x?.y] = [1]; +[x?.["y"]] = [1]; +[...x?.y] = [1]; +[...x?.["y"]] = [1]; +//// [objectAssignmentPatternOk.ts] +({ a: x?.y } = { a: 1 }); +({ a: x?.["y"] } = { a: 1 }); +//// [questionDotDigitIsConditionalOk.ts] +x?.3:1; +//// [superPropertyInvocationOk.ts] +// supported for invocation of super property +void class extends Base { + m() { + super.x?.(); + super["x"]?.(); + } +} + +//// [generalParsingOk.ts] +// object literals +// - computed property names +void { [x?.y]: 1 } +void { [x?.["y"]]: 1 } +void { [x?.()]: 1 } +void { [new x?.()]: 1 } +// - property assignments +void { a: x?.y } +void { a: x?.["y"] } +void { a: x?.() } +void { a: new x?.() } + +// classes +// - computed property names +// void class { [x?.y] = 1 } // legal parse, but causes a checker error +// void class { [x?.["y"]] = 1 } // legal parse, but causes a checker error +// void class { [x?.()] = 1 } // legal parse, but causes a checker error +// void class { [new f?.()] = 1 } // legal parse, but causes a checker error +void class { [Symbol?.toStringTag] = "" } +// - property declarations +void class { a = x?.y } +void class { a = x?.["y"] } +void class { a = x?.() } +void class { a = new x?.() } +// - heritage clauses +void class extends M?.y {} +void class extends M?.["y"] {} +void class extends M?.z {} +// - class decorators +@x?.y class C1 {} +@x?.["y"] class C2 {} +@x?.() class C3 {} +@new x?.() class C4 {} +// - member decorators +class C5 { @x?.y m() {} } +class C6 { @x?.["y"] m() {} } // allowed as ?.[ is not ambiguous with computed property names +class C7 { @x?.() m() {} } +class C8 { @new x?.() m () {} } +// - parameter decorators +class C9 { m(@x?.y a) {} } +class C10 { m(@x?.["y"] a) {} } +class C11 { m(@x?.() a) {} } +class C12 { m(@new x?.() a) {} } + +// functions +// - parameters +void function (a = x?.y) {} +void function (a = x?.["y"]) {} +void function (a = x?.()) {} +void function (a = new x?.()) {} +// - binding elements +// - initializers +void function ({ a = x?.y }) {} +void function ({ a = x?.["y"] }) {} +void function ({ a = x?.() }) {} +void function ({ a = new x?.() }) {} +// - computed properties +void function ({ [x?.y]: a }) {} +void function ({ [x?.["y"]]: a }) {} +void function ({ [x?.()]: a }) {} +void function ({ [new x?.()]: a }) {} + +// arrow functions +// - parameters +((a = x?.y) => {}); +((a = x?.["y"]) => {}); +((a = x?.()) => {}); +((a = new x?.()) => {}); +// - expression bodies +(() => x?.y); +(() => x?.["y"]); +(() => x?.()); +(() => new x?.()); + +// parenthesis +(x?.y); + +// comma +x?.y, f(); +f(), x?.y; + +// conditional +x?.y ? 0 : 1 +0 ? x?.y : 1; +0 ? 1 : x?.y; + +// binary +x?.y + 1; +x?.y - 1; +x?.y * 1; +x?.y / 1; +x?.y ** 1; +x?.y % 1; +x?.y ^ 1; +x?.y & 1; +x?.y | 1; +x?.y << 1; +x?.y >> 1; +x?.y >>> 1; +x?.y && 1; +x?.y || 1; +x?.y == 1; +x?.y === 1; +x?.y != 1; +x?.y !== 1; +x?.y < 1; +x?.y <= 1; +x?.y > 1; +x?.y >= 1; +1 + x?.y; +1 - x?.y; +1 * x?.y; +1 / x?.y; +1 ** x?.y; +1 % x?.y; +1 ^ x?.y; +1 & x?.y; +1 | x?.y; +1 << x?.y; +1 >> x?.y; +1 >>> x?.y; +1 && x?.y; +1 || x?.y; +1 == x?.y; +1 === x?.y; +1 != x?.y; +1 !== x?.y; +1 < x?.y; +1 <= x?.y; +1 > x?.y; +1 >= x?.y; + +// prefix unary ++x?.y; +-x?.y; +!x?.y; +~x?.y; + +// unary +void x?.y; +typeof x?.y; +void function * () { yield x?.y; } +void async function() { await x?.y; } + +// notnull +x?.y!.z; + +// assertions +x?.y; +x?.y as string; + +// array literals +[x?.y]; +[, x?.y]; +[...x?.y]; + +// literals +1?.toString(); // no need for `..` +1.?.toString(); +.0?.toString(); +4e3?.toString(); +1.e3?.toString(); +""?.toString(); +''?.toString(); +``?.toString(); +/./?.toString(); +/./g?.toString(); +true?.toString(); +false?.toString(); + +// templates +`${x?.y}`; + +// variables +var v = x?.y; +var [v] = x?.y; +var [v = x?.y] = [1]; +var {v} = x?.y; +var {v = x?.y} = {v:1}; +var {[x?.y]: v} = null; + +// if/else if +if (x?.y) {} +if (1) {} else if (x?.y) {} + +// switch +switch (x?.y) {} +switch (1) { case x?.y: break; } + +// do/while +do {} while (x?.y) +while (x?.y) {} + +// for +for (x?.y; x?.y; x?.y); + +// for..in +for (x?.y in {}); + +// for..of +for (x?.y of []); + +// enums +enum E { + a = x?.y +} + +//// [exportsOk.ts] +export default x?.y; + +//// [propertyAccessOk.js] +x.y; +x == null ? void 0 : x.y; +(x == null ? void 0 : x.y).z; +(_a = x.y) == null ? void 0 : _a.z; +(_b = x == null ? void 0 : x.y) == null ? void 0 : _b.z; +var _a, _b; +//// [elementAccessOk.js] +x["y"]; +x == null ? void 0 : x["y"]; +(x == null ? void 0 : x["y"])["z"]; +(_a = x["y"]) == null ? void 0 : _a["z"]; +(_b = x == null ? void 0 : x["y"]) == null ? void 0 : _b["z"]; +var _a, _b; +//// [callExpressionOk.js] +x(); +x == null ? void 0 : x(); +(_a = x.y) == null ? void 0 : _a.call(x); +(_b = x["y"]) == null ? void 0 : _b.call(x); +f == null ? void 0 : f(); +(_c = o.y) == null ? void 0 : _c.call(o); +(_d = o["y"]) == null ? void 0 : _d.call(o); +var _a, _b, _c, _d; +//// [newExpressionOk.js] +new x(); +(_a = x.y) == null ? void 0 : new _a(); +(_b = x["y"]) == null ? void 0 : new _b(); +f == null ? void 0 : new f(); +(_c = o.y) == null ? void 0 : new _c(); +(_d = o["y"]) == null ? void 0 : new _d(); +var _a, _b, _c, _d; +//// [mixedOk.js] +(_a = x == null ? void 0 : x.y) == null ? void 0 : _a["z"]; +(_b = x == null ? void 0 : x["y"]) == null ? void 0 : _b.z; +(x == null ? void 0 : x.y)(); +(_c = x == null ? void 0 : x.y) == null ? void 0 : _c.call(x); +(o == null ? void 0 : o.y)(); +(_d = o == null ? void 0 : o.y) == null ? void 0 : _d.call(o); +(x == null ? void 0 : x["z"])(); +(_e = x == null ? void 0 : x["z"]) == null ? void 0 : _e.call(x); +(o == null ? void 0 : o["y"])(); +(_f = o == null ? void 0 : o["y"]) == null ? void 0 : _f.call(o); +var _a, _b, _c, _d, _e, _f; +//// [mutationOk.js] +_a = 1, x == null ? _a : x.y = _a; +_b = 1, x == null ? _b : x.y += _b; +_c = 1, x == null ? _c : x.y -= _c; +_d = 1, x == null ? _d : x.y *= _d; +_e = 1, x == null ? _e : x.y /= _e; +_f = 1, x == null ? _f : x.y %= _f; +_g = 1, x == null ? _g : (_h = x).y = Math.pow(_h.y, _g); +_j = 1, x == null ? _j : x.y |= _j; +_k = 1, x == null ? _k : x.y &= _k; +_l = 1, x == null ? _l : x.y ^= _l; +_m = 1, x == null ? _m : x.y <<= _m; +_o = 1, x == null ? _o : x.y >>= _o; +_p = 1, x == null ? _p : x.y >>>= _p; +x == null ? void 0 : x.y++; +x == null ? void 0 : x.y--; +x == null ? void 0 : ++x.y; +x == null ? void 0 : --x.y; +x == null ? true : delete x.y; +_q = 1, x == null ? _q : x["y"] = _q; +_r = 1, x == null ? _r : x["y"] += _r; +_s = 1, x == null ? _s : x["y"] -= _s; +_t = 1, x == null ? _t : x["y"] *= _t; +_u = 1, x == null ? _u : x["y"] /= _u; +_v = 1, x == null ? _v : x["y"] %= _v; +_w = 1, x == null ? _w : (_x = x)[_y = "y"] = Math.pow(_x[_y], _w); +_z = 1, x == null ? _z : x["y"] |= _z; +_0 = 1, x == null ? _0 : x["y"] &= _0; +_1 = 1, x == null ? _1 : x["y"] ^= _1; +_2 = 1, x == null ? _2 : x["y"] <<= _2; +_3 = 1, x == null ? _3 : x["y"] >>= _3; +_4 = 1, x == null ? _4 : x["y"] >>>= _4; +x == null ? void 0 : x["y"]++; +x == null ? void 0 : x["y"]--; +x == null ? void 0 : ++x["y"]; +x == null ? void 0 : --x["y"]; +x == null ? true : delete x["y"]; +var _a, _b, _c, _d, _e, _f, _g, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _z, _0, _1, _2, _3, _4; +var _h, _x, _y; +//// [arrayAssignmentPatternOk.js] +[{ set value(_a) { x == null ? _a : x.y = _a; } }.value] = [1]; +[{ set value(_a) { x == null ? _a : x["y"] = _a; } }.value] = [1]; +[...{ set value(_a) { x == null ? _a : x.y = _a; } }.value] = [1]; +[...{ set value(_a) { x == null ? _a : x["y"] = _a; } }.value] = [1]; +//// [objectAssignmentPatternOk.js] +({ a: { set value(_a) { x == null ? _a : x.y = _a; } }.value } = { a: 1 }); +({ a: { set value(_a) { x == null ? _a : x["y"] = _a; } }.value } = { a: 1 }); +//// [questionDotDigitIsConditionalOk.js] +x ? .3 : 1; +//// [superPropertyInvocationOk.js] +// supported for invocation of super property +void class extends Base { + m() { + (_a = super.x) == null ? void 0 : _a.call(this); + (_b = super["x"]) == null ? void 0 : _b.call(this); + var _a, _b; + } +}; +//// [generalParsingOk.js] +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +// object literals +// - computed property names +void { [x == null ? void 0 : x.y]: 1 }; +void { [x == null ? void 0 : x["y"]]: 1 }; +void { [x == null ? void 0 : x()]: 1 }; +void { [x == null ? void 0 : new x()]: 1 }; +// - property assignments +void { a: x == null ? void 0 : x.y }; +void { a: x == null ? void 0 : x["y"] }; +void { a: x == null ? void 0 : x() }; +void { a: x == null ? void 0 : new x() }; +// classes +// - computed property names +// void class { [x?.y] = 1 } // legal parse, but causes a checker error +// void class { [x?.["y"]] = 1 } // legal parse, but causes a checker error +// void class { [x?.()] = 1 } // legal parse, but causes a checker error +// void class { [new f?.()] = 1 } // legal parse, but causes a checker error +void class { + constructor() { + this[Symbol == null ? void 0 : Symbol.toStringTag] = ""; + } +}; +// - property declarations +void class { + constructor() { + this.a = x == null ? void 0 : x.y; + } +}; +void class { + constructor() { + this.a = x == null ? void 0 : x["y"]; + } +}; +void class { + constructor() { + this.a = x == null ? void 0 : x(); + } +}; +void class { + constructor() { + this.a = x == null ? void 0 : new x(); + } +}; +// - heritage clauses +void class extends (M == null ? void 0 : M.y) { +}; +void class extends (M == null ? void 0 : M["y"]) { +}; +void class extends (M == null ? void 0 : M.z) { +}; +// - class decorators +let C1 = class C1 { +}; +C1 = __decorate([ + x == null ? void 0 : x.y +], C1); +let C2 = class C2 { +}; +C2 = __decorate([ + x == null ? void 0 : x["y"] +], C2); +let C3 = class C3 { +}; +C3 = __decorate([ + x == null ? void 0 : x() +], C3); +let C4 = class C4 { +}; +C4 = __decorate([ + x == null ? void 0 : new x() +], C4); +// - member decorators +class C5 { + m() { } +} +__decorate([ + x == null ? void 0 : x.y +], C5.prototype, "m", null); +class C6 { + m() { } +} // allowed as ?.[ is not ambiguous with computed property names +__decorate([ + x == null ? void 0 : x["y"] +], C6.prototype, "m", null); +class C7 { + m() { } +} +__decorate([ + x == null ? void 0 : x() +], C7.prototype, "m", null); +class C8 { + m() { } +} +__decorate([ + x == null ? void 0 : new x() +], C8.prototype, "m", null); +// - parameter decorators +class C9 { + m(a) { } +} +__decorate([ + __param(0, x == null ? void 0 : x.y) +], C9.prototype, "m", null); +class C10 { + m(a) { } +} +__decorate([ + __param(0, x == null ? void 0 : x["y"]) +], C10.prototype, "m", null); +class C11 { + m(a) { } +} +__decorate([ + __param(0, x == null ? void 0 : x()) +], C11.prototype, "m", null); +class C12 { + m(a) { } +} +__decorate([ + __param(0, x == null ? void 0 : new x()) +], C12.prototype, "m", null); +// functions +// - parameters +void function (a = x == null ? void 0 : x.y) { }; +void function (a = x == null ? void 0 : x["y"]) { }; +void function (a = x == null ? void 0 : x()) { }; +void function (a = x == null ? void 0 : new x()) { }; +// - binding elements +// - initializers +void function ({ a = x == null ? void 0 : x.y }) { }; +void function ({ a = x == null ? void 0 : x["y"] }) { }; +void function ({ a = x == null ? void 0 : x() }) { }; +void function ({ a = x == null ? void 0 : new x() }) { }; +// - computed properties +void function ({ [x == null ? void 0 : x.y]: a }) { }; +void function ({ [x == null ? void 0 : x["y"]]: a }) { }; +void function ({ [x == null ? void 0 : x()]: a }) { }; +void function ({ [x == null ? void 0 : new x()]: a }) { }((a = x == null ? void 0 : x.y) => { }); +((a = x == null ? void 0 : x["y"]) => { }); +((a = x == null ? void 0 : x()) => { }); +((a = x == null ? void 0 : new x()) => { }); +// - expression bodies +(() => x == null ? void 0 : x.y); +(() => x == null ? void 0 : x["y"]); +(() => x == null ? void 0 : x()); +(() => x == null ? void 0 : new x()); +// parenthesis +(x == null ? void 0 : x.y); +// comma +x == null ? void 0 : x.y, f(); +f(), x == null ? void 0 : x.y; +// conditional +x == null ? void 0 : x.y ? 0 : 1; +0 ? x == null ? void 0 : x.y : 1; +0 ? 1 : x == null ? void 0 : x.y; +// binary +(x == null ? void 0 : x.y) + 1; +(x == null ? void 0 : x.y) - 1; +(x == null ? void 0 : x.y) * 1; +(x == null ? void 0 : x.y) / 1; +Math.pow((x == null ? void 0 : x.y), 1); +(x == null ? void 0 : x.y) % 1; +(x == null ? void 0 : x.y) ^ 1; +(x == null ? void 0 : x.y) & 1; +(x == null ? void 0 : x.y) | 1; +(x == null ? void 0 : x.y) << 1; +(x == null ? void 0 : x.y) >> 1; +(x == null ? void 0 : x.y) >>> 1; +(x == null ? void 0 : x.y) && 1; +(x == null ? void 0 : x.y) || 1; +(x == null ? void 0 : x.y) == 1; +(x == null ? void 0 : x.y) === 1; +(x == null ? void 0 : x.y) != 1; +(x == null ? void 0 : x.y) !== 1; +(x == null ? void 0 : x.y) < 1; +(x == null ? void 0 : x.y) <= 1; +(x == null ? void 0 : x.y) > 1; +(x == null ? void 0 : x.y) >= 1; +1 + (x == null ? void 0 : x.y); +1 - (x == null ? void 0 : x.y); +1 * (x == null ? void 0 : x.y); +1 / (x == null ? void 0 : x.y); +Math.pow(1, (x == null ? void 0 : x.y)); +1 % (x == null ? void 0 : x.y); +1 ^ (x == null ? void 0 : x.y); +1 & (x == null ? void 0 : x.y); +1 | (x == null ? void 0 : x.y); +1 << (x == null ? void 0 : x.y); +1 >> (x == null ? void 0 : x.y); +1 >>> (x == null ? void 0 : x.y); +1 && (x == null ? void 0 : x.y); +1 || (x == null ? void 0 : x.y); +1 == (x == null ? void 0 : x.y); +1 === (x == null ? void 0 : x.y); +1 != (x == null ? void 0 : x.y); +1 !== (x == null ? void 0 : x.y); +1 < (x == null ? void 0 : x.y); +1 <= (x == null ? void 0 : x.y); +1 > (x == null ? void 0 : x.y); +1 >= (x == null ? void 0 : x.y); +// prefix unary ++(x == null ? void 0 : x.y); +-(x == null ? void 0 : x.y); +!(x == null ? void 0 : x.y); +~(x == null ? void 0 : x.y); +// unary +void (x == null ? void 0 : x.y); +typeof (x == null ? void 0 : x.y); +void function* () { yield x == null ? void 0 : x.y; }; +void function () { + return __awaiter(this, void 0, void 0, function* () { yield (x == null ? void 0 : x.y); }); +}; +// notnull +(x == null ? void 0 : x.y).z; +// assertions +x == null ? void 0 : x.y; +x == null ? void 0 : x.y; +// array literals +[x == null ? void 0 : x.y]; +[, x == null ? void 0 : x.y]; +[...x == null ? void 0 : x.y]; +// literals +((_a = 1) == null ? void 0 : _a.toString)(); // no need for `..` +((_b = 1.) == null ? void 0 : _b.toString)(); +((_c = .0) == null ? void 0 : _c.toString)(); +((_d = 4e3) == null ? void 0 : _d.toString)(); +((_e = 1.e3) == null ? void 0 : _e.toString)(); +((_f = "") == null ? void 0 : _f.toString)(); +((_g = '') == null ? void 0 : _g.toString)(); +((_h = ``) == null ? void 0 : _h.toString)(); +((_j = /./) == null ? void 0 : _j.toString)(); +((_k = /./g) == null ? void 0 : _k.toString)(); +((_l = true) == null ? void 0 : _l.toString)(); +((_m = false) == null ? void 0 : _m.toString)(); +// templates +`${x == null ? void 0 : x.y}`; +// variables +var v = x == null ? void 0 : x.y; +var [v] = x == null ? void 0 : x.y; +var [v = x == null ? void 0 : x.y] = [1]; +var { v } = x == null ? void 0 : x.y; +var { v = x == null ? void 0 : x.y } = { v: 1 }; +var { [x == null ? void 0 : x.y]: v } = null; +// if/else if +if (x == null ? void 0 : x.y) { } +if (1) { } +else if (x == null ? void 0 : x.y) { } +// switch +switch (x == null ? void 0 : x.y) { +} +switch (1) { + case x == null ? void 0 : x.y: break; +} +// do/while +do { } while (x == null ? void 0 : x.y); +while (x == null ? void 0 : x.y) { } +// for +for (x == null ? void 0 : x.y; x == null ? void 0 : x.y; x == null ? void 0 : x.y) + ; +// for..in +for ({ set value(_a) { x == null ? _a : x.y = _a; } }.value in {}) + ; +// for..of +for ({ set value(_a) { x == null ? _a : x.y = _a; } }.value of []) + ; +// enums +var E; +(function (E) { + E[E["a"] = x == null ? void 0 : x.y] = "a"; +})(E || (E = {})); +var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m; +//// [exportsOk.js] +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = x == null ? void 0 : x.y; diff --git a/tests/baselines/reference/emitter.safeNavigation.es2015.symbols b/tests/baselines/reference/emitter.safeNavigation.es2015.symbols new file mode 100644 index 00000000000..c37d8e30a6f --- /dev/null +++ b/tests/baselines/reference/emitter.safeNavigation.es2015.symbols @@ -0,0 +1,862 @@ +=== tests/cases/conformance/emitter/es2015/safeNavigation/declarations.d.ts === +declare var x: any; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +declare var y: any; +>y : Symbol(y, Decl(declarations.d.ts, 1, 11)) + +declare var f: ({ +>f : Symbol(f, Decl(declarations.d.ts, 2, 11)) + + (): void; + (): void; +>T : Symbol(T, Decl(declarations.d.ts, 4, 5)) + + new (): any; + new (): any; +>T : Symbol(T, Decl(declarations.d.ts, 6, 9)) + +}) | undefined; +declare var o: { y: typeof f; } +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>y : Symbol(y, Decl(declarations.d.ts, 8, 16)) +>f : Symbol(f, Decl(declarations.d.ts, 2, 11)) + +declare class Base { x(): any; } +>Base : Symbol(Base, Decl(declarations.d.ts, 8, 31)) +>x : Symbol(Base.x, Decl(declarations.d.ts, 9, 20)) + +declare namespace M { +>M : Symbol(M, Decl(declarations.d.ts, 9, 32)) + + export class y {} +>y : Symbol(y, Decl(declarations.d.ts, 10, 21)) + + export class z {} +>z : Symbol(z, Decl(declarations.d.ts, 11, 21)) +>T : Symbol(T, Decl(declarations.d.ts, 12, 19)) +} +=== tests/cases/conformance/emitter/es2015/safeNavigation/propertyAccessOk.ts === +x.y +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y.z +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x.y?.z +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y?.z +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +=== tests/cases/conformance/emitter/es2015/safeNavigation/elementAccessOk.ts === +x["y"] +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"]["z"] +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x["y"]?.["z"] +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"]?.["z"] +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +=== tests/cases/conformance/emitter/es2015/safeNavigation/callExpressionOk.ts === +x() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x.y?.() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x["y"]?.() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +f?.() +>f : Symbol(f, Decl(declarations.d.ts, 2, 11)) + +o.y?.() +>o.y : Symbol(y, Decl(declarations.d.ts, 8, 16)) +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>y : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +o["y"]?.() +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>"y" : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +=== tests/cases/conformance/emitter/es2015/safeNavigation/newExpressionOk.ts === +new x() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +new x.y?.() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +new x["y"]?.() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +new f?.() +>f : Symbol(f, Decl(declarations.d.ts, 2, 11)) + +new o.y?.() +>o.y : Symbol(y, Decl(declarations.d.ts, 8, 16)) +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>y : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +new o["y"]?.() +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>"y" : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +=== tests/cases/conformance/emitter/es2015/safeNavigation/mixedOk.ts === +x?.y?.["z"] +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"]?.z +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y?.() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +o?.y() +>o?.y : Symbol(y, Decl(declarations.d.ts, 8, 16)) +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>y : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +o?.y?.() +>o?.y : Symbol(y, Decl(declarations.d.ts, 8, 16)) +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>y : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +x?.["z"]() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["z"]?.() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +o?.["y"]() +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>"y" : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +o?.["y"]?.() +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>"y" : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +=== tests/cases/conformance/emitter/es2015/safeNavigation/mutationOk.ts === +x?.y = 1 +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y += 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y -= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y *= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y /= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y %= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y **= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y |= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y &= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y ^= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y <<= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y >>= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y >>>= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y++; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y--; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +++x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +--x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +delete x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] = 1 +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] += 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] -= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] *= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] /= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] %= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] **= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] |= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] &= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] ^= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] <<= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] >>= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] >>>= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"]++; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"]--; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +++x?.["y"]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +--x?.["y"]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +delete x?.["y"]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +=== tests/cases/conformance/emitter/es2015/safeNavigation/arrayAssignmentPatternOk.ts === +[x?.y] = [1]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +[x?.["y"]] = [1]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +[...x?.y] = [1]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +[...x?.["y"]] = [1]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +=== tests/cases/conformance/emitter/es2015/safeNavigation/objectAssignmentPatternOk.ts === +({ a: x?.y } = { a: 1 }); +>a : Symbol(a, Decl(objectAssignmentPatternOk.ts, 0, 2)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(objectAssignmentPatternOk.ts, 0, 16)) + +({ a: x?.["y"] } = { a: 1 }); +>a : Symbol(a, Decl(objectAssignmentPatternOk.ts, 1, 2)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(objectAssignmentPatternOk.ts, 1, 20)) + +=== tests/cases/conformance/emitter/es2015/safeNavigation/questionDotDigitIsConditionalOk.ts === +x?.3:1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +=== tests/cases/conformance/emitter/es2015/safeNavigation/superPropertyInvocationOk.ts === +// supported for invocation of super property +void class extends Base { +>Base : Symbol(Base, Decl(declarations.d.ts, 8, 31)) + + m() { +>m : Symbol((Anonymous class).m, Decl(superPropertyInvocationOk.ts, 1, 25)) + + super.x?.(); +>super.x : Symbol(Base.x, Decl(declarations.d.ts, 9, 20)) +>super : Symbol(Base, Decl(declarations.d.ts, 8, 31)) +>x : Symbol(Base.x, Decl(declarations.d.ts, 9, 20)) + + super["x"]?.(); +>super : Symbol(Base, Decl(declarations.d.ts, 8, 31)) +>"x" : Symbol(Base.x, Decl(declarations.d.ts, 9, 20)) + } +} + +=== tests/cases/conformance/emitter/es2015/safeNavigation/generalParsingOk.ts === +// object literals +// - computed property names +void { [x?.y]: 1 } +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void { [x?.["y"]]: 1 } +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void { [x?.()]: 1 } +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void { [new x?.()]: 1 } +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// - property assignments +void { a: x?.y } +>a : Symbol(a, Decl(generalParsingOk.ts, 7, 6)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void { a: x?.["y"] } +>a : Symbol(a, Decl(generalParsingOk.ts, 8, 6)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void { a: x?.() } +>a : Symbol(a, Decl(generalParsingOk.ts, 9, 6)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void { a: new x?.() } +>a : Symbol(a, Decl(generalParsingOk.ts, 10, 6)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// classes +// - computed property names +// void class { [x?.y] = 1 } // legal parse, but causes a checker error +// void class { [x?.["y"]] = 1 } // legal parse, but causes a checker error +// void class { [x?.()] = 1 } // legal parse, but causes a checker error +// void class { [new f?.()] = 1 } // legal parse, but causes a checker error +void class { [Symbol?.toStringTag] = "" } +>Symbol?.toStringTag : Symbol(SymbolConstructor.toStringTag, Decl(lib.es2015.symbol.wellknown.d.ts, --, --)) +>Symbol : Symbol(Symbol, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.symbol.d.ts, --, --), Decl(lib.es2015.symbol.d.ts, --, --)) +>toStringTag : Symbol(SymbolConstructor.toStringTag, Decl(lib.es2015.symbol.wellknown.d.ts, --, --)) + +// - property declarations +void class { a = x?.y } +>a : Symbol((Anonymous class).a, Decl(generalParsingOk.ts, 20, 12)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void class { a = x?.["y"] } +>a : Symbol((Anonymous class).a, Decl(generalParsingOk.ts, 21, 12)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void class { a = x?.() } +>a : Symbol((Anonymous class).a, Decl(generalParsingOk.ts, 22, 12)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void class { a = new x?.() } +>a : Symbol((Anonymous class).a, Decl(generalParsingOk.ts, 23, 12)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// - heritage clauses +void class extends M?.y {} +>M?.y : Symbol(M.y, Decl(declarations.d.ts, 10, 21)) +>M : Symbol(M, Decl(declarations.d.ts, 9, 32)) +>y : Symbol(M.y, Decl(declarations.d.ts, 10, 21)) + +void class extends M?.["y"] {} +>M : Symbol(M, Decl(declarations.d.ts, 9, 32)) +>"y" : Symbol(M.y, Decl(declarations.d.ts, 10, 21)) + +void class extends M?.z {} +>M?.z : Symbol(M.z, Decl(declarations.d.ts, 11, 21)) +>M : Symbol(M, Decl(declarations.d.ts, 9, 32)) +>z : Symbol(M.z, Decl(declarations.d.ts, 11, 21)) + +// - class decorators +@x?.y class C1 {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>C1 : Symbol(C1, Decl(generalParsingOk.ts, 27, 34)) + +@x?.["y"] class C2 {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>C2 : Symbol(C2, Decl(generalParsingOk.ts, 29, 17)) + +@x?.() class C3 {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>C3 : Symbol(C3, Decl(generalParsingOk.ts, 30, 21)) + +@new x?.() class C4 {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>C4 : Symbol(C4, Decl(generalParsingOk.ts, 31, 18)) + +// - member decorators +class C5 { @x?.y m() {} } +>C5 : Symbol(C5, Decl(generalParsingOk.ts, 32, 22)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>m : Symbol(C5.m, Decl(generalParsingOk.ts, 34, 10)) + +class C6 { @x?.["y"] m() {} } // allowed as ?.[ is not ambiguous with computed property names +>C6 : Symbol(C6, Decl(generalParsingOk.ts, 34, 25)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>m : Symbol(C6.m, Decl(generalParsingOk.ts, 35, 10)) + +class C7 { @x?.() m() {} } +>C7 : Symbol(C7, Decl(generalParsingOk.ts, 35, 29)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>m : Symbol(C7.m, Decl(generalParsingOk.ts, 36, 10)) + +class C8 { @new x?.() m () {} } +>C8 : Symbol(C8, Decl(generalParsingOk.ts, 36, 26)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>m : Symbol(C8.m, Decl(generalParsingOk.ts, 37, 10)) + +// - parameter decorators +class C9 { m(@x?.y a) {} } +>C9 : Symbol(C9, Decl(generalParsingOk.ts, 37, 31)) +>m : Symbol(C9.m, Decl(generalParsingOk.ts, 39, 10)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 39, 13)) + +class C10 { m(@x?.["y"] a) {} } +>C10 : Symbol(C10, Decl(generalParsingOk.ts, 39, 26)) +>m : Symbol(C10.m, Decl(generalParsingOk.ts, 40, 11)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 40, 14)) + +class C11 { m(@x?.() a) {} } +>C11 : Symbol(C11, Decl(generalParsingOk.ts, 40, 31)) +>m : Symbol(C11.m, Decl(generalParsingOk.ts, 41, 11)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 41, 14)) + +class C12 { m(@new x?.() a) {} } +>C12 : Symbol(C12, Decl(generalParsingOk.ts, 41, 28)) +>m : Symbol(C12.m, Decl(generalParsingOk.ts, 42, 11)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 42, 14)) + +// functions +// - parameters +void function (a = x?.y) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 46, 15)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void function (a = x?.["y"]) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 47, 15)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void function (a = x?.()) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 48, 15)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void function (a = new x?.()) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 49, 15)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// - binding elements +// - initializers +void function ({ a = x?.y }) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 52, 16)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void function ({ a = x?.["y"] }) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 53, 16)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void function ({ a = x?.() }) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 54, 16)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void function ({ a = new x?.() }) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 55, 16)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// - computed properties +void function ({ [x?.y]: a }) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 57, 16)) + +void function ({ [x?.["y"]]: a }) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 58, 16)) + +void function ({ [x?.()]: a }) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 59, 16)) + +void function ({ [new x?.()]: a }) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 60, 16)) + +// arrow functions +// - parameters +((a = x?.y) => {}); +>a : Symbol(a, Decl(generalParsingOk.ts, 64, 2)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +((a = x?.["y"]) => {}); +>a : Symbol(a, Decl(generalParsingOk.ts, 65, 2)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +((a = x?.()) => {}); +>a : Symbol(a, Decl(generalParsingOk.ts, 66, 2)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +((a = new x?.()) => {}); +>a : Symbol(a, Decl(generalParsingOk.ts, 67, 2)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// - expression bodies +(() => x?.y); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +(() => x?.["y"]); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +(() => x?.()); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +(() => new x?.()); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// parenthesis +(x?.y); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// comma +x?.y, f(); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>f : Symbol(f, Decl(declarations.d.ts, 2, 11)) + +f(), x?.y; +>f : Symbol(f, Decl(declarations.d.ts, 2, 11)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// conditional +x?.y ? 0 : 1 +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +0 ? x?.y : 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +0 ? 1 : x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// binary +x?.y + 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y - 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y * 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y / 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y ** 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y % 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y ^ 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y & 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y | 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y << 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y >> 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y >>> 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y && 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y || 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y == 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y === 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y != 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y !== 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y < 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y <= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y > 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y >= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 + x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 - x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 * x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 / x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 ** x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 % x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 ^ x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 & x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 | x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 << x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 >> x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 >>> x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 && x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 || x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 == x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 === x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 != x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 !== x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 < x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 <= x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 > x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 >= x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// prefix unary ++x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +-x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +!x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +~x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// unary +void x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +typeof x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void function * () { yield x?.y; } +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void async function() { await x?.y; } +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// notnull +x?.y!.z; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// assertions +x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y as string; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// array literals +[x?.y]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +[, x?.y]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +[...x?.y]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// literals +1?.toString(); // no need for `..` +>1?.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) + +1.?.toString(); +>1.?.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) + +.0?.toString(); +>.0?.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) + +4e3?.toString(); +>4e3?.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) + +1.e3?.toString(); +>1.e3?.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) + +""?.toString(); +>""?.toString : Symbol(String.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(String.toString, Decl(lib.es5.d.ts, --, --)) + +''?.toString(); +>''?.toString : Symbol(String.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(String.toString, Decl(lib.es5.d.ts, --, --)) + +``?.toString(); +>``?.toString : Symbol(String.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(String.toString, Decl(lib.es5.d.ts, --, --)) + +/./?.toString(); +>/./?.toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) + +/./g?.toString(); +>/./g?.toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) + +true?.toString(); +>true?.toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) + +false?.toString(); +>false?.toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) + +// templates +`${x?.y}`; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// variables +var v = x?.y; +>v : Symbol(v, Decl(generalParsingOk.ts, 174, 3), Decl(generalParsingOk.ts, 175, 5), Decl(generalParsingOk.ts, 176, 5), Decl(generalParsingOk.ts, 177, 5), Decl(generalParsingOk.ts, 178, 5), Decl(generalParsingOk.ts, 179, 5)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +var [v] = x?.y; +>v : Symbol(v, Decl(generalParsingOk.ts, 174, 3), Decl(generalParsingOk.ts, 175, 5), Decl(generalParsingOk.ts, 176, 5), Decl(generalParsingOk.ts, 177, 5), Decl(generalParsingOk.ts, 178, 5), Decl(generalParsingOk.ts, 179, 5)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +var [v = x?.y] = [1]; +>v : Symbol(v, Decl(generalParsingOk.ts, 174, 3), Decl(generalParsingOk.ts, 175, 5), Decl(generalParsingOk.ts, 176, 5), Decl(generalParsingOk.ts, 177, 5), Decl(generalParsingOk.ts, 178, 5), Decl(generalParsingOk.ts, 179, 5)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +var {v} = x?.y; +>v : Symbol(v, Decl(generalParsingOk.ts, 174, 3), Decl(generalParsingOk.ts, 175, 5), Decl(generalParsingOk.ts, 176, 5), Decl(generalParsingOk.ts, 177, 5), Decl(generalParsingOk.ts, 178, 5), Decl(generalParsingOk.ts, 179, 5)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +var {v = x?.y} = {v:1}; +>v : Symbol(v, Decl(generalParsingOk.ts, 174, 3), Decl(generalParsingOk.ts, 175, 5), Decl(generalParsingOk.ts, 176, 5), Decl(generalParsingOk.ts, 177, 5), Decl(generalParsingOk.ts, 178, 5), Decl(generalParsingOk.ts, 179, 5)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>v : Symbol(v, Decl(generalParsingOk.ts, 178, 18)) + +var {[x?.y]: v} = null; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>v : Symbol(v, Decl(generalParsingOk.ts, 174, 3), Decl(generalParsingOk.ts, 175, 5), Decl(generalParsingOk.ts, 176, 5), Decl(generalParsingOk.ts, 177, 5), Decl(generalParsingOk.ts, 178, 5), Decl(generalParsingOk.ts, 179, 5)) + +// if/else if +if (x?.y) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +if (1) {} else if (x?.y) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// switch +switch (x?.y) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +switch (1) { case x?.y: break; } +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// do/while +do {} while (x?.y) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +while (x?.y) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// for +for (x?.y; x?.y; x?.y); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// for..in +for (x?.y in {}); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// for..of +for (x?.y of []); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// enums +enum E { +>E : Symbol(E, Decl(generalParsingOk.ts, 200, 17)) + + a = x?.y +>a : Symbol(E.a, Decl(generalParsingOk.ts, 203, 8)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +} + +=== tests/cases/conformance/emitter/es2015/safeNavigation/exportsOk.ts === +export default x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + diff --git a/tests/baselines/reference/emitter.safeNavigation.es2015.types b/tests/baselines/reference/emitter.safeNavigation.es2015.types new file mode 100644 index 00000000000..546a87abb72 --- /dev/null +++ b/tests/baselines/reference/emitter.safeNavigation.es2015.types @@ -0,0 +1,1595 @@ +=== tests/cases/conformance/emitter/es2015/safeNavigation/declarations.d.ts === +declare var x: any; +>x : any + +declare var y: any; +>y : any + +declare var f: ({ +>f : { (): void; (): void; new (): any; new (): any; } + + (): void; + (): void; +>T : T + + new (): any; + new (): any; +>T : T + +}) | undefined; +declare var o: { y: typeof f; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>y : { (): void; (): void; new (): any; new (): any; } +>f : { (): void; (): void; new (): any; new (): any; } + +declare class Base { x(): any; } +>Base : Base +>x : () => any + +declare namespace M { +>M : typeof M + + export class y {} +>y : y + + export class z {} +>z : z +>T : T +} +=== tests/cases/conformance/emitter/es2015/safeNavigation/propertyAccessOk.ts === +x.y +>x.y : any +>x : any +>y : any + +x?.y +>x?.y : any +>x : any +>y : any + +x?.y.z +>x?.y.z : any +>x?.y : any +>x : any +>y : any +>z : any + +x.y?.z +>x.y?.z : any +>x.y : any +>x : any +>y : any +>z : any + +x?.y?.z +>x?.y?.z : any +>x?.y : any +>x : any +>y : any +>z : any + +=== tests/cases/conformance/emitter/es2015/safeNavigation/elementAccessOk.ts === +x["y"] +>x["y"] : any +>x : any +>"y" : "y" + +x?.["y"] +>x?.["y"] : any +>x : any +>"y" : "y" + +x?.["y"]["z"] +>x?.["y"]["z"] : any +>x?.["y"] : any +>x : any +>"y" : "y" +>"z" : "z" + +x["y"]?.["z"] +>x["y"]?.["z"] : any +>x["y"] : any +>x : any +>"y" : "y" +>"z" : "z" + +x?.["y"]?.["z"] +>x?.["y"]?.["z"] : any +>x?.["y"] : any +>x : any +>"y" : "y" +>"z" : "z" + +=== tests/cases/conformance/emitter/es2015/safeNavigation/callExpressionOk.ts === +x() +>x() : any +>x : any + +x?.() +>x?.() : any +>x : any + +x.y?.() +>x.y?.() : any +>x.y : any +>x : any +>y : any + +x["y"]?.() +>x["y"]?.() : any +>x["y"] : any +>x : any +>"y" : "y" + +f?.() +>f?.() : void +>f : { (): void; (): void; new (): any; new (): any; } + +o.y?.() +>o.y?.() : void +>o.y : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>y : { (): void; (): void; new (): any; new (): any; } + +o["y"]?.() +>o["y"]?.() : void +>o["y"] : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>"y" : "y" + +=== tests/cases/conformance/emitter/es2015/safeNavigation/newExpressionOk.ts === +new x() +>new x() : any +>x : any + +new x.y?.() +>new x.y?.() : any +>x.y : any +>x : any +>y : any + +new x["y"]?.() +>new x["y"]?.() : any +>x["y"] : any +>x : any +>"y" : "y" + +new f?.() +>new f?.() : any +>f : { (): void; (): void; new (): any; new (): any; } + +new o.y?.() +>new o.y?.() : any +>o.y : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>y : { (): void; (): void; new (): any; new (): any; } + +new o["y"]?.() +>new o["y"]?.() : any +>o["y"] : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>"y" : "y" + +=== tests/cases/conformance/emitter/es2015/safeNavigation/mixedOk.ts === +x?.y?.["z"] +>x?.y?.["z"] : any +>x?.y : any +>x : any +>y : any +>"z" : "z" + +x?.["y"]?.z +>x?.["y"]?.z : any +>x?.["y"] : any +>x : any +>"y" : "y" +>z : any + +x?.y() +>x?.y() : any +>x?.y : any +>x : any +>y : any + +x?.y?.() +>x?.y?.() : any +>x?.y : any +>x : any +>y : any + +o?.y() +>o?.y() : void +>o?.y : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>y : { (): void; (): void; new (): any; new (): any; } + +o?.y?.() +>o?.y?.() : void +>o?.y : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>y : { (): void; (): void; new (): any; new (): any; } + +x?.["z"]() +>x?.["z"]() : any +>x?.["z"] : any +>x : any +>"z" : "z" + +x?.["z"]?.() +>x?.["z"]?.() : any +>x?.["z"] : any +>x : any +>"z" : "z" + +o?.["y"]() +>o?.["y"]() : void +>o?.["y"] : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>"y" : "y" + +o?.["y"]?.() +>o?.["y"]?.() : void +>o?.["y"] : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>"y" : "y" + +=== tests/cases/conformance/emitter/es2015/safeNavigation/mutationOk.ts === +x?.y = 1 +>x?.y = 1 : 1 +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y += 1; +>x?.y += 1 : any +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y -= 1; +>x?.y -= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y *= 1; +>x?.y *= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y /= 1; +>x?.y /= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y %= 1; +>x?.y %= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y **= 1; +>x?.y **= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y |= 1; +>x?.y |= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y &= 1; +>x?.y &= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y ^= 1; +>x?.y ^= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y <<= 1; +>x?.y <<= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y >>= 1; +>x?.y >>= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y >>>= 1; +>x?.y >>>= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y++; +>x?.y++ : number +>x?.y : any +>x : any +>y : any + +x?.y--; +>x?.y-- : number +>x?.y : any +>x : any +>y : any + +++x?.y; +>++x?.y : number +>x?.y : any +>x : any +>y : any + +--x?.y; +>--x?.y : number +>x?.y : any +>x : any +>y : any + +delete x?.y; +>delete x?.y : boolean +>x?.y : any +>x : any +>y : any + +x?.["y"] = 1 +>x?.["y"] = 1 : 1 +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] += 1; +>x?.["y"] += 1 : any +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] -= 1; +>x?.["y"] -= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] *= 1; +>x?.["y"] *= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] /= 1; +>x?.["y"] /= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] %= 1; +>x?.["y"] %= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] **= 1; +>x?.["y"] **= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] |= 1; +>x?.["y"] |= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] &= 1; +>x?.["y"] &= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] ^= 1; +>x?.["y"] ^= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] <<= 1; +>x?.["y"] <<= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] >>= 1; +>x?.["y"] >>= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] >>>= 1; +>x?.["y"] >>>= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"]++; +>x?.["y"]++ : number +>x?.["y"] : any +>x : any +>"y" : "y" + +x?.["y"]--; +>x?.["y"]-- : number +>x?.["y"] : any +>x : any +>"y" : "y" + +++x?.["y"]; +>++x?.["y"] : number +>x?.["y"] : any +>x : any +>"y" : "y" + +--x?.["y"]; +>--x?.["y"] : number +>x?.["y"] : any +>x : any +>"y" : "y" + +delete x?.["y"]; +>delete x?.["y"] : boolean +>x?.["y"] : any +>x : any +>"y" : "y" + +=== tests/cases/conformance/emitter/es2015/safeNavigation/arrayAssignmentPatternOk.ts === +[x?.y] = [1]; +>[x?.y] = [1] : [number] +>[x?.y] : [any] +>x?.y : any +>x : any +>y : any +>[1] : [number] +>1 : 1 + +[x?.["y"]] = [1]; +>[x?.["y"]] = [1] : [number] +>[x?.["y"]] : [any] +>x?.["y"] : any +>x : any +>"y" : "y" +>[1] : [number] +>1 : 1 + +[...x?.y] = [1]; +>[...x?.y] = [1] : number[] +>[...x?.y] : undefined[] +>...x?.y : any +>x?.y : any +>x : any +>y : any +>[1] : number[] +>1 : 1 + +[...x?.["y"]] = [1]; +>[...x?.["y"]] = [1] : number[] +>[...x?.["y"]] : undefined[] +>...x?.["y"] : any +>x?.["y"] : any +>x : any +>"y" : "y" +>[1] : number[] +>1 : 1 + +=== tests/cases/conformance/emitter/es2015/safeNavigation/objectAssignmentPatternOk.ts === +({ a: x?.y } = { a: 1 }); +>({ a: x?.y } = { a: 1 }) : { a: number; } +>{ a: x?.y } = { a: 1 } : { a: number; } +>{ a: x?.y } : { a: any; } +>a : any +>x?.y : any +>x : any +>y : any +>{ a: 1 } : { a: number; } +>a : number +>1 : 1 + +({ a: x?.["y"] } = { a: 1 }); +>({ a: x?.["y"] } = { a: 1 }) : { a: number; } +>{ a: x?.["y"] } = { a: 1 } : { a: number; } +>{ a: x?.["y"] } : { a: any; } +>a : any +>x?.["y"] : any +>x : any +>"y" : "y" +>{ a: 1 } : { a: number; } +>a : number +>1 : 1 + +=== tests/cases/conformance/emitter/es2015/safeNavigation/questionDotDigitIsConditionalOk.ts === +x?.3:1; +>x?.3:1 : 1 | 0.3 +>x : any +>.3 : 0.3 +>1 : 1 + +=== tests/cases/conformance/emitter/es2015/safeNavigation/superPropertyInvocationOk.ts === +// supported for invocation of super property +void class extends Base { +>void class extends Base { m() { super.x?.(); super["x"]?.(); }} : undefined +>class extends Base { m() { super.x?.(); super["x"]?.(); }} : typeof (Anonymous class) +>Base : Base + + m() { +>m : () => void + + super.x?.(); +>super.x?.() : any +>super.x : () => any +>super : Base +>x : () => any + + super["x"]?.(); +>super["x"]?.() : any +>super["x"] : () => any +>super : Base +>"x" : "x" + } +} + +=== tests/cases/conformance/emitter/es2015/safeNavigation/generalParsingOk.ts === +// object literals +// - computed property names +void { [x?.y]: 1 } +>void { [x?.y]: 1 } : undefined +>{ [x?.y]: 1 } : { [x: number]: number; } +>x?.y : any +>x : any +>y : any +>1 : 1 + +void { [x?.["y"]]: 1 } +>void { [x?.["y"]]: 1 } : undefined +>{ [x?.["y"]]: 1 } : { [x: number]: number; } +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +void { [x?.()]: 1 } +>void { [x?.()]: 1 } : undefined +>{ [x?.()]: 1 } : { [x: number]: number; } +>x?.() : any +>x : any +>1 : 1 + +void { [new x?.()]: 1 } +>void { [new x?.()]: 1 } : undefined +>{ [new x?.()]: 1 } : { [x: number]: number; } +>new x?.() : any +>x : any +>1 : 1 + +// - property assignments +void { a: x?.y } +>void { a: x?.y } : undefined +>{ a: x?.y } : { a: any; } +>a : any +>x?.y : any +>x : any +>y : any + +void { a: x?.["y"] } +>void { a: x?.["y"] } : undefined +>{ a: x?.["y"] } : { a: any; } +>a : any +>x?.["y"] : any +>x : any +>"y" : "y" + +void { a: x?.() } +>void { a: x?.() } : undefined +>{ a: x?.() } : { a: any; } +>a : any +>x?.() : any +>x : any + +void { a: new x?.() } +>void { a: new x?.() } : undefined +>{ a: new x?.() } : { a: any; } +>a : any +>new x?.() : any +>x : any + +// classes +// - computed property names +// void class { [x?.y] = 1 } // legal parse, but causes a checker error +// void class { [x?.["y"]] = 1 } // legal parse, but causes a checker error +// void class { [x?.()] = 1 } // legal parse, but causes a checker error +// void class { [new f?.()] = 1 } // legal parse, but causes a checker error +void class { [Symbol?.toStringTag] = "" } +>void class { [Symbol?.toStringTag] = "" } : undefined +>class { [Symbol?.toStringTag] = "" } : typeof (Anonymous class) +>Symbol?.toStringTag : symbol +>Symbol : SymbolConstructor +>toStringTag : symbol +>"" : "" + +// - property declarations +void class { a = x?.y } +>void class { a = x?.y } : undefined +>class { a = x?.y } : typeof (Anonymous class) +>a : any +>x?.y : any +>x : any +>y : any + +void class { a = x?.["y"] } +>void class { a = x?.["y"] } : undefined +>class { a = x?.["y"] } : typeof (Anonymous class) +>a : any +>x?.["y"] : any +>x : any +>"y" : "y" + +void class { a = x?.() } +>void class { a = x?.() } : undefined +>class { a = x?.() } : typeof (Anonymous class) +>a : any +>x?.() : any +>x : any + +void class { a = new x?.() } +>void class { a = new x?.() } : undefined +>class { a = new x?.() } : typeof (Anonymous class) +>a : any +>new x?.() : any +>x : any + +// - heritage clauses +void class extends M?.y {} +>void class extends M?.y {} : undefined +>class extends M?.y {} : typeof (Anonymous class) +>M?.y : M.y +>M : typeof M +>y : typeof M.y + +void class extends M?.["y"] {} +>void class extends M?.["y"] {} : undefined +>class extends M?.["y"] {} : typeof (Anonymous class) +>M?.["y"] : M.y +>M : typeof M +>"y" : "y" + +void class extends M?.z {} +>void class extends M?.z {} : undefined +>class extends M?.z {} : typeof (Anonymous class) +>M?.z : M.z +>M : typeof M +>z : typeof M.z + +// - class decorators +@x?.y class C1 {} +>x?.y : any +>x : any +>y : any +>C1 : C1 + +@x?.["y"] class C2 {} +>x?.["y"] : any +>x : any +>"y" : "y" +>C2 : C2 + +@x?.() class C3 {} +>x?.() : any +>x : any +>C3 : C3 + +@new x?.() class C4 {} +>new x?.() : any +>x : any +>C4 : C4 + +// - member decorators +class C5 { @x?.y m() {} } +>C5 : C5 +>x?.y : any +>x : any +>y : any +>m : () => void + +class C6 { @x?.["y"] m() {} } // allowed as ?.[ is not ambiguous with computed property names +>C6 : C6 +>x?.["y"] : any +>x : any +>"y" : "y" +>m : () => void + +class C7 { @x?.() m() {} } +>C7 : C7 +>x?.() : any +>x : any +>m : () => void + +class C8 { @new x?.() m () {} } +>C8 : C8 +>new x?.() : any +>x : any +>m : () => void + +// - parameter decorators +class C9 { m(@x?.y a) {} } +>C9 : C9 +>m : (a: any) => void +>x?.y : any +>x : any +>y : any +>a : any + +class C10 { m(@x?.["y"] a) {} } +>C10 : C10 +>m : (a: any) => void +>x?.["y"] : any +>x : any +>"y" : "y" +>a : any + +class C11 { m(@x?.() a) {} } +>C11 : C11 +>m : (a: any) => void +>x?.() : any +>x : any +>a : any + +class C12 { m(@new x?.() a) {} } +>C12 : C12 +>m : (a: any) => void +>new x?.() : any +>x : any +>a : any + +// functions +// - parameters +void function (a = x?.y) {} +>void function (a = x?.y) {} : undefined +>function (a = x?.y) {} : (a?: any) => void +>a : any +>x?.y : any +>x : any +>y : any + +void function (a = x?.["y"]) {} +>void function (a = x?.["y"]) {} : undefined +>function (a = x?.["y"]) {} : (a?: any) => void +>a : any +>x?.["y"] : any +>x : any +>"y" : "y" + +void function (a = x?.()) {} +>void function (a = x?.()) {} : undefined +>function (a = x?.()) {} : (a?: any) => void +>a : any +>x?.() : any +>x : any + +void function (a = new x?.()) {} +>void function (a = new x?.()) {} : undefined +>function (a = new x?.()) {} : (a?: any) => void +>a : any +>new x?.() : any +>x : any + +// - binding elements +// - initializers +void function ({ a = x?.y }) {} +>void function ({ a = x?.y }) {} : undefined +>function ({ a = x?.y }) {} : ({a}: { a?: any; }) => void +>a : any +>x?.y : any +>x : any +>y : any + +void function ({ a = x?.["y"] }) {} +>void function ({ a = x?.["y"] }) {} : undefined +>function ({ a = x?.["y"] }) {} : ({a}: { a?: any; }) => void +>a : any +>x?.["y"] : any +>x : any +>"y" : "y" + +void function ({ a = x?.() }) {} +>void function ({ a = x?.() }) {} : undefined +>function ({ a = x?.() }) {} : ({a}: { a?: any; }) => void +>a : any +>x?.() : any +>x : any + +void function ({ a = new x?.() }) {} +>void function ({ a = new x?.() }) {} : undefined +>function ({ a = new x?.() }) {} : ({a}: { a?: any; }) => void +>a : any +>new x?.() : any +>x : any + +// - computed properties +void function ({ [x?.y]: a }) {} +>void function ({ [x?.y]: a }) {} : undefined +>function ({ [x?.y]: a }) {} : ({[x?.y]: a}: {}) => void +>x?.y : any +>x : any +>y : any +>a : any + +void function ({ [x?.["y"]]: a }) {} +>void function ({ [x?.["y"]]: a }) {} : undefined +>function ({ [x?.["y"]]: a }) {} : ({[x?.["y"]]: a}: {}) => void +>x?.["y"] : any +>x : any +>"y" : "y" +>a : any + +void function ({ [x?.()]: a }) {} +>void function ({ [x?.()]: a }) {} : undefined +>function ({ [x?.()]: a }) {} : ({[x?.()]: a}: {}) => void +>x?.() : any +>x : any +>a : any + +void function ({ [new x?.()]: a }) {} +>void function ({ [new x?.()]: a }) {}// arrow functions// - parameters((a = x?.y) => {}) : undefined +>function ({ [new x?.()]: a }) {}// arrow functions// - parameters((a = x?.y) => {}) : void +>function ({ [new x?.()]: a }) {} : ({[new x?.()]: a}: (a?: any) => void) => void +>new x?.() : any +>x : any +>a : any + +// arrow functions +// - parameters +((a = x?.y) => {}); +>(a = x?.y) => {} : (a?: any) => void +>a : any +>x?.y : any +>x : any +>y : any + +((a = x?.["y"]) => {}); +>((a = x?.["y"]) => {}) : (a?: any) => void +>(a = x?.["y"]) => {} : (a?: any) => void +>a : any +>x?.["y"] : any +>x : any +>"y" : "y" + +((a = x?.()) => {}); +>((a = x?.()) => {}) : (a?: any) => void +>(a = x?.()) => {} : (a?: any) => void +>a : any +>x?.() : any +>x : any + +((a = new x?.()) => {}); +>((a = new x?.()) => {}) : (a?: any) => void +>(a = new x?.()) => {} : (a?: any) => void +>a : any +>new x?.() : any +>x : any + +// - expression bodies +(() => x?.y); +>(() => x?.y) : () => any +>() => x?.y : () => any +>x?.y : any +>x : any +>y : any + +(() => x?.["y"]); +>(() => x?.["y"]) : () => any +>() => x?.["y"] : () => any +>x?.["y"] : any +>x : any +>"y" : "y" + +(() => x?.()); +>(() => x?.()) : () => any +>() => x?.() : () => any +>x?.() : any +>x : any + +(() => new x?.()); +>(() => new x?.()) : () => any +>() => new x?.() : () => any +>new x?.() : any +>x : any + +// parenthesis +(x?.y); +>(x?.y) : any +>x?.y : any +>x : any +>y : any + +// comma +x?.y, f(); +>x?.y, f() : void +>x?.y : any +>x : any +>y : any +>f() : void +>f : { (): void; (): void; new (): any; new (): any; } + +f(), x?.y; +>f(), x?.y : any +>f() : void +>f : { (): void; (): void; new (): any; new (): any; } +>x?.y : any +>x : any +>y : any + +// conditional +x?.y ? 0 : 1 +>x?.y ? 0 : 1 : 1 | 0 +>x?.y : any +>x : any +>y : any +>0 : 0 +>1 : 1 + +0 ? x?.y : 1; +>0 ? x?.y : 1 : any +>0 : 0 +>x?.y : any +>x : any +>y : any +>1 : 1 + +0 ? 1 : x?.y; +>0 ? 1 : x?.y : any +>0 : 0 +>1 : 1 +>x?.y : any +>x : any +>y : any + +// binary +x?.y + 1; +>x?.y + 1 : any +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y - 1; +>x?.y - 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y * 1; +>x?.y * 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y / 1; +>x?.y / 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y ** 1; +>x?.y ** 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y % 1; +>x?.y % 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y ^ 1; +>x?.y ^ 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y & 1; +>x?.y & 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y | 1; +>x?.y | 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y << 1; +>x?.y << 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y >> 1; +>x?.y >> 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y >>> 1; +>x?.y >>> 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y && 1; +>x?.y && 1 : 0 | 1 +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y || 1; +>x?.y || 1 : any +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y == 1; +>x?.y == 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y === 1; +>x?.y === 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y != 1; +>x?.y != 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y !== 1; +>x?.y !== 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y < 1; +>x?.y < 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y <= 1; +>x?.y <= 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y > 1; +>x?.y > 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y >= 1; +>x?.y >= 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +1 + x?.y; +>1 + x?.y : any +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 - x?.y; +>1 - x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 * x?.y; +>1 * x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 / x?.y; +>1 / x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 ** x?.y; +>1 ** x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 % x?.y; +>1 % x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 ^ x?.y; +>1 ^ x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 & x?.y; +>1 & x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 | x?.y; +>1 | x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 << x?.y; +>1 << x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 >> x?.y; +>1 >> x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 >>> x?.y; +>1 >>> x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 && x?.y; +>1 && x?.y : any +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 || x?.y; +>1 || x?.y : any +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 == x?.y; +>1 == x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 === x?.y; +>1 === x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 != x?.y; +>1 != x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 !== x?.y; +>1 !== x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 < x?.y; +>1 < x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 <= x?.y; +>1 <= x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 > x?.y; +>1 > x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 >= x?.y; +>1 >= x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +// prefix unary ++x?.y; +>+x?.y : number +>x?.y : any +>x : any +>y : any + +-x?.y; +>-x?.y : number +>x?.y : any +>x : any +>y : any + +!x?.y; +>!x?.y : boolean +>x?.y : any +>x : any +>y : any + +~x?.y; +>~x?.y : number +>x?.y : any +>x : any +>y : any + +// unary +void x?.y; +>void x?.y : undefined +>x?.y : any +>x : any +>y : any + +typeof x?.y; +>typeof x?.y : "string" | "number" | "boolean" | "symbol" | "undefined" | "object" | "function" +>x?.y : any +>x : any +>y : any + +void function * () { yield x?.y; } +>void function * () { yield x?.y; } : undefined +>function * () { yield x?.y; } : () => IterableIterator +>yield x?.y : any +>x?.y : any +>x : any +>y : any + +void async function() { await x?.y; } +>void async function() { await x?.y; } : undefined +>async function() { await x?.y; } : () => Promise +>await x?.y : any +>x?.y : any +>x : any +>y : any + +// notnull +x?.y!.z; +>x?.y!.z : any +>x?.y! : any +>x?.y : any +>x : any +>y : any +>z : any + +// assertions +x?.y; +>x?.y : string +>x?.y : any +>x : any +>y : any + +x?.y as string; +>x?.y as string : string +>x?.y : any +>x : any +>y : any + +// array literals +[x?.y]; +>[x?.y] : any[] +>x?.y : any +>x : any +>y : any + +[, x?.y]; +>[, x?.y] : any[] +> : undefined +>x?.y : any +>x : any +>y : any + +[...x?.y]; +>[...x?.y] : any[] +>...x?.y : any +>x?.y : any +>x : any +>y : any + +// literals +1?.toString(); // no need for `..` +>1?.toString() : string +>1?.toString : (radix?: number) => string +>1 : 1 +>toString : (radix?: number) => string + +1.?.toString(); +>1.?.toString() : string +>1.?.toString : (radix?: number) => string +>1. : 1 +>toString : (radix?: number) => string + +.0?.toString(); +>.0?.toString() : string +>.0?.toString : (radix?: number) => string +>.0 : 0 +>toString : (radix?: number) => string + +4e3?.toString(); +>4e3?.toString() : string +>4e3?.toString : (radix?: number) => string +>4e3 : 4000 +>toString : (radix?: number) => string + +1.e3?.toString(); +>1.e3?.toString() : string +>1.e3?.toString : (radix?: number) => string +>1.e3 : 1000 +>toString : (radix?: number) => string + +""?.toString(); +>""?.toString() : string +>""?.toString : () => string +>"" : "" +>toString : () => string + +''?.toString(); +>''?.toString() : string +>''?.toString : () => string +>'' : "" +>toString : () => string + +``?.toString(); +>``?.toString() : string +>``?.toString : () => string +>`` : string +>toString : () => string + +/./?.toString(); +>/./?.toString() : string +>/./?.toString : () => string +>/./ : RegExp +>toString : () => string + +/./g?.toString(); +>/./g?.toString() : string +>/./g?.toString : () => string +>/./g : RegExp +>toString : () => string + +true?.toString(); +>true?.toString() : string +>true?.toString : () => string +>true : true +>toString : () => string + +false?.toString(); +>false?.toString() : string +>false?.toString : () => string +>false : false +>toString : () => string + +// templates +`${x?.y}`; +>`${x?.y}` : string +>x?.y : any +>x : any +>y : any + +// variables +var v = x?.y; +>v : any +>x?.y : any +>x : any +>y : any + +var [v] = x?.y; +>v : any +>x?.y : any +>x : any +>y : any + +var [v = x?.y] = [1]; +>v : any +>x?.y : any +>x : any +>y : any +>[1] : [number] +>1 : 1 + +var {v} = x?.y; +>v : any +>x?.y : any +>x : any +>y : any + +var {v = x?.y} = {v:1}; +>v : any +>x?.y : any +>x : any +>y : any +>{v:1} : { v?: number; } +>v : number +>1 : 1 + +var {[x?.y]: v} = null; +>x?.y : any +>x : any +>y : any +>v : any +>null : null + +// if/else if +if (x?.y) {} +>x?.y : any +>x : any +>y : any + +if (1) {} else if (x?.y) {} +>1 : 1 +>x?.y : any +>x : any +>y : any + +// switch +switch (x?.y) {} +>x?.y : any +>x : any +>y : any + +switch (1) { case x?.y: break; } +>1 : 1 +>x?.y : any +>x : any +>y : any + +// do/while +do {} while (x?.y) +>x?.y : any +>x : any +>y : any + +while (x?.y) {} +>x?.y : any +>x : any +>y : any + +// for +for (x?.y; x?.y; x?.y); +>x?.y : any +>x : any +>y : any +>x?.y : any +>x : any +>y : any +>x?.y : any +>x : any +>y : any + +// for..in +for (x?.y in {}); +>x?.y : any +>x : any +>y : any +>{} : {} + +// for..of +for (x?.y of []); +>x?.y : any +>x : any +>y : any +>[] : undefined[] + +// enums +enum E { +>E : E + + a = x?.y +>a : E +>x?.y : any +>x : any +>y : any +} + +=== tests/cases/conformance/emitter/es2015/safeNavigation/exportsOk.ts === +export default x?.y; +>x?.y : any +>x : any +>y : any + diff --git a/tests/baselines/reference/emitter.safeNavigation.es3.js b/tests/baselines/reference/emitter.safeNavigation.es3.js new file mode 100644 index 00000000000..ef082cf6876 --- /dev/null +++ b/tests/baselines/reference/emitter.safeNavigation.es3.js @@ -0,0 +1,876 @@ +//// [tests/cases/conformance/emitter/es3/safeNavigation/emitter.safeNavigation.es3.ts] //// + +//// [declarations.d.ts] +declare var x: any; +declare var y: any; +declare var f: ({ + (): void; + (): void; + new (): any; + new (): any; +}) | undefined; +declare var o: { y: typeof f; } +declare class Base { x(): any; } +declare namespace M { + export class y {} + export class z {} +} +//// [propertyAccessOk.ts] +x.y +x?.y +x?.y.z +x.y?.z +x?.y?.z +//// [elementAccessOk.ts] +x["y"] +x?.["y"] +x?.["y"]["z"] +x["y"]?.["z"] +x?.["y"]?.["z"] +//// [callExpressionOk.ts] +x() +x?.() +x.y?.() +x["y"]?.() +f?.() +o.y?.() +o["y"]?.() +//// [newExpressionOk.ts] +new x() +new x.y?.() +new x["y"]?.() +new f?.() +new o.y?.() +new o["y"]?.() +//// [mixedOk.ts] +x?.y?.["z"] +x?.["y"]?.z +x?.y() +x?.y?.() +o?.y() +o?.y?.() +x?.["z"]() +x?.["z"]?.() +o?.["y"]() +o?.["y"]?.() +//// [mutationOk.ts] +x?.y = 1 +x?.y += 1; +x?.y -= 1; +x?.y *= 1; +x?.y /= 1; +x?.y %= 1; +x?.y **= 1; +x?.y |= 1; +x?.y &= 1; +x?.y ^= 1; +x?.y <<= 1; +x?.y >>= 1; +x?.y >>>= 1; +x?.y++; +x?.y--; +++x?.y; +--x?.y; +delete x?.y; +x?.["y"] = 1 +x?.["y"] += 1; +x?.["y"] -= 1; +x?.["y"] *= 1; +x?.["y"] /= 1; +x?.["y"] %= 1; +x?.["y"] **= 1; +x?.["y"] |= 1; +x?.["y"] &= 1; +x?.["y"] ^= 1; +x?.["y"] <<= 1; +x?.["y"] >>= 1; +x?.["y"] >>>= 1; +x?.["y"]++; +x?.["y"]--; +++x?.["y"]; +--x?.["y"]; +delete x?.["y"]; +//// [arrayAssignmentPatternOk.ts] +[x?.y] = [1]; +[x?.["y"]] = [1]; +[...x?.y] = [1]; +[...x?.["y"]] = [1]; +//// [objectAssignmentPatternOk.ts] +({ a: x?.y } = { a: 1 }); +({ a: x?.["y"] } = { a: 1 }); +//// [questionDotDigitIsConditionalOk.ts] +x?.3:1; +//// [superPropertyInvocationOk.ts] +// supported for invocation of super property +void class extends Base { + m() { + super.x?.(); + } +} + +//// [generalParsingOk.ts] +// object literals +// - computed property names +void { [x?.y]: 1 } +void { [x?.["y"]]: 1 } +void { [x?.()]: 1 } +void { [new x?.()]: 1 } +// - property assignments +void { a: x?.y } +void { a: x?.["y"] } +void { a: x?.() } +void { a: new x?.() } + +// classes +// - computed property names +// void class { [x?.y] = 1 } // legal parse, but causes a checker error +// void class { [x?.["y"]] = 1 } // legal parse, but causes a checker error +// void class { [x?.()] = 1 } // legal parse, but causes a checker error +// void class { [new f?.()] = 1 } // legal parse, but causes a checker error +void class { [Symbol?.toStringTag] = "" } +// - property declarations +void class { a = x?.y } +void class { a = x?.["y"] } +void class { a = x?.() } +void class { a = new x?.() } +// - heritage clauses +void class extends M?.y {} +void class extends M?.["y"] {} +void class extends M?.z {} +// - class decorators +@x?.y class C1 {} +@x?.["y"] class C2 {} +@x?.() class C3 {} +@new x?.() class C4 {} +// - member decorators +class C5 { @x?.y m() {} } +class C6 { @x?.["y"] m() {} } // allowed as ?.[ is not ambiguous with computed property names +class C7 { @x?.() m() {} } +class C8 { @new x?.() m () {} } +// - parameter decorators +class C9 { m(@x?.y a) {} } +class C10 { m(@x?.["y"] a) {} } +class C11 { m(@x?.() a) {} } +class C12 { m(@new x?.() a) {} } + +// functions +// - parameters +void function (a = x?.y) {} +void function (a = x?.["y"]) {} +void function (a = x?.()) {} +void function (a = new x?.()) {} +// - binding elements +// - initializers +void function ({ a = x?.y }) {} +void function ({ a = x?.["y"] }) {} +void function ({ a = x?.() }) {} +void function ({ a = new x?.() }) {} +// - computed properties +void function ({ [x?.y]: a }) {} +void function ({ [x?.["y"]]: a }) {} +void function ({ [x?.()]: a }) {} +void function ({ [new x?.()]: a }) {} + +// arrow functions +// - parameters +((a = x?.y) => {}); +((a = x?.["y"]) => {}); +((a = x?.()) => {}); +((a = new x?.()) => {}); +// - expression bodies +(() => x?.y); +(() => x?.["y"]); +(() => x?.()); +(() => new x?.()); + +// parenthesis +(x?.y); + +// comma +x?.y, f(); +f(), x?.y; + +// conditional +x?.y ? 0 : 1 +0 ? x?.y : 1; +0 ? 1 : x?.y; + +// binary +x?.y + 1; +x?.y - 1; +x?.y * 1; +x?.y / 1; +x?.y ** 1; +x?.y % 1; +x?.y ^ 1; +x?.y & 1; +x?.y | 1; +x?.y << 1; +x?.y >> 1; +x?.y >>> 1; +x?.y && 1; +x?.y || 1; +x?.y == 1; +x?.y === 1; +x?.y != 1; +x?.y !== 1; +x?.y < 1; +x?.y <= 1; +x?.y > 1; +x?.y >= 1; +1 + x?.y; +1 - x?.y; +1 * x?.y; +1 / x?.y; +1 ** x?.y; +1 % x?.y; +1 ^ x?.y; +1 & x?.y; +1 | x?.y; +1 << x?.y; +1 >> x?.y; +1 >>> x?.y; +1 && x?.y; +1 || x?.y; +1 == x?.y; +1 === x?.y; +1 != x?.y; +1 !== x?.y; +1 < x?.y; +1 <= x?.y; +1 > x?.y; +1 >= x?.y; + +// prefix unary ++x?.y; +-x?.y; +!x?.y; +~x?.y; + +// unary +void x?.y; +typeof x?.y; +void function * () { yield x?.y; } +void async function() { await x?.y; } + +// notnull +x?.y!.z; + +// assertions +x?.y; +x?.y as string; + +// array literals +[x?.y]; +[, x?.y]; +[...x?.y]; + +// literals +1?.toString(); // no need for `..` +1.?.toString(); +.0?.toString(); +4e3?.toString(); +1.e3?.toString(); +""?.toString(); +''?.toString(); +``?.toString(); +/./?.toString(); +/./g?.toString(); +true?.toString(); +false?.toString(); + +// templates +`${x?.y}`; + +// variables +var v = x?.y; +var [v] = x?.y; +var [v = x?.y] = [1]; +var {v} = x?.y; +var {v = x?.y} = {v:1}; +var {[x?.y]: v} = null; + +// if/else if +if (x?.y) {} +if (1) {} else if (x?.y) {} + +// switch +switch (x?.y) {} +switch (1) { case x?.y: break; } + +// do/while +do {} while (x?.y) +while (x?.y) {} + +// for +for (x?.y; x?.y; x?.y); + +// for..in +for (x?.y in {}); + +// for..of +for (x?.y of []); + +// enums +enum E { + a = x?.y +} + +//// [exportsOk.ts] +export default x?.y; + +//// [propertyAccessOk.js] +x.y; +x == null ? void 0 : x.y; +(x == null ? void 0 : x.y).z; +(_a = x.y) == null ? void 0 : _a.z; +(_b = x == null ? void 0 : x.y) == null ? void 0 : _b.z; +var _a, _b; +//// [elementAccessOk.js] +x["y"]; +x == null ? void 0 : x["y"]; +(x == null ? void 0 : x["y"])["z"]; +(_a = x["y"]) == null ? void 0 : _a["z"]; +(_b = x == null ? void 0 : x["y"]) == null ? void 0 : _b["z"]; +var _a, _b; +//// [callExpressionOk.js] +x(); +x == null ? void 0 : x(); +(_a = x.y) == null ? void 0 : _a.call(x); +(_b = x["y"]) == null ? void 0 : _b.call(x); +f == null ? void 0 : f(); +(_c = o.y) == null ? void 0 : _c.call(o); +(_d = o["y"]) == null ? void 0 : _d.call(o); +var _a, _b, _c, _d; +//// [newExpressionOk.js] +new x(); +(_a = x.y) == null ? void 0 : new _a(); +(_b = x["y"]) == null ? void 0 : new _b(); +f == null ? void 0 : new f(); +(_c = o.y) == null ? void 0 : new _c(); +(_d = o["y"]) == null ? void 0 : new _d(); +var _a, _b, _c, _d; +//// [mixedOk.js] +(_a = x == null ? void 0 : x.y) == null ? void 0 : _a["z"]; +(_b = x == null ? void 0 : x["y"]) == null ? void 0 : _b.z; +(x == null ? void 0 : x.y)(); +(_c = x == null ? void 0 : x.y) == null ? void 0 : _c.call(x); +(o == null ? void 0 : o.y)(); +(_d = o == null ? void 0 : o.y) == null ? void 0 : _d.call(o); +(x == null ? void 0 : x["z"])(); +(_e = x == null ? void 0 : x["z"]) == null ? void 0 : _e.call(x); +(o == null ? void 0 : o["y"])(); +(_f = o == null ? void 0 : o["y"]) == null ? void 0 : _f.call(o); +var _a, _b, _c, _d, _e, _f; +//// [mutationOk.js] +_a = 1, x == null ? _a : x.y = _a; +_b = 1, x == null ? _b : x.y += _b; +_c = 1, x == null ? _c : x.y -= _c; +_d = 1, x == null ? _d : x.y *= _d; +_e = 1, x == null ? _e : x.y /= _e; +_f = 1, x == null ? _f : x.y %= _f; +_g = 1, x == null ? _g : (_h = x).y = Math.pow(_h.y, _g); +_j = 1, x == null ? _j : x.y |= _j; +_k = 1, x == null ? _k : x.y &= _k; +_l = 1, x == null ? _l : x.y ^= _l; +_m = 1, x == null ? _m : x.y <<= _m; +_o = 1, x == null ? _o : x.y >>= _o; +_p = 1, x == null ? _p : x.y >>>= _p; +x == null ? void 0 : x.y++; +x == null ? void 0 : x.y--; +x == null ? void 0 : ++x.y; +x == null ? void 0 : --x.y; +x == null ? true : delete x.y; +_q = 1, x == null ? _q : x["y"] = _q; +_r = 1, x == null ? _r : x["y"] += _r; +_s = 1, x == null ? _s : x["y"] -= _s; +_t = 1, x == null ? _t : x["y"] *= _t; +_u = 1, x == null ? _u : x["y"] /= _u; +_v = 1, x == null ? _v : x["y"] %= _v; +_w = 1, x == null ? _w : (_x = x)[_y = "y"] = Math.pow(_x[_y], _w); +_z = 1, x == null ? _z : x["y"] |= _z; +_0 = 1, x == null ? _0 : x["y"] &= _0; +_1 = 1, x == null ? _1 : x["y"] ^= _1; +_2 = 1, x == null ? _2 : x["y"] <<= _2; +_3 = 1, x == null ? _3 : x["y"] >>= _3; +_4 = 1, x == null ? _4 : x["y"] >>>= _4; +x == null ? void 0 : x["y"]++; +x == null ? void 0 : x["y"]--; +x == null ? void 0 : ++x["y"]; +x == null ? void 0 : --x["y"]; +x == null ? true : delete x["y"]; +var _a, _b, _c, _d, _e, _f, _g, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _z, _0, _1, _2, _3, _4; +var _h, _x, _y; +//// [arrayAssignmentPatternOk.js] +_a = [1], (x == null ? void 0 : x.y = _a[0], _a); +_b = [1], (x == null ? void 0 : x["y"] = _b[0], _b); +_c = [1], (x == null ? void 0 : x.y = _c.slice(0), _c); +_d = [1], (x == null ? void 0 : x["y"] = _d.slice(0), _d); +var _a, _b, _c, _d; +//// [objectAssignmentPatternOk.js] +(_a = { a: 1 }, (x == null ? void 0 : x.y = _a.a, _a)); +(_b = { a: 1 }, (x == null ? void 0 : x["y"] = _b.a, _b)); +var _a, _b; +//// [questionDotDigitIsConditionalOk.js] +x ? .3 : 1; +//// [superPropertyInvocationOk.js] +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +// supported for invocation of super property +void (function (_super) { + __extends(class_1, _super); + function class_1() { + return _super !== null && _super.apply(this, arguments) || this; + } + class_1.prototype.m = function () { + (_a = _super.prototype.x) == null ? void 0 : _a.call(this); + var _a; + }; + return class_1; +}(Base)); +//// [generalParsingOk.js] +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [0, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +// object literals +// - computed property names +void (_a = {}, _a[x == null ? void 0 : x.y] = 1, _a); +void (_b = {}, _b[x == null ? void 0 : x["y"]] = 1, _b); +void (_c = {}, _c[x == null ? void 0 : x()] = 1, _c); +void (_d = {}, _d[x == null ? void 0 : new x()] = 1, _d); +// - property assignments +void { a: x == null ? void 0 : x.y }; +void { a: x == null ? void 0 : x["y"] }; +void { a: x == null ? void 0 : x() }; +void { a: x == null ? void 0 : new x() }; +// classes +// - computed property names +// void class { [x?.y] = 1 } // legal parse, but causes a checker error +// void class { [x?.["y"]] = 1 } // legal parse, but causes a checker error +// void class { [x?.()] = 1 } // legal parse, but causes a checker error +// void class { [new f?.()] = 1 } // legal parse, but causes a checker error +void (function () { + function class_1() { + this[Symbol == null ? void 0 : Symbol.toStringTag] = ""; + } + return class_1; +}()); +// - property declarations +void (function () { + function class_2() { + this.a = x == null ? void 0 : x.y; + } + return class_2; +}()); +void (function () { + function class_3() { + this.a = x == null ? void 0 : x["y"]; + } + return class_3; +}()); +void (function () { + function class_4() { + this.a = x == null ? void 0 : x(); + } + return class_4; +}()); +void (function () { + function class_5() { + this.a = x == null ? void 0 : new x(); + } + return class_5; +}()); +// - heritage clauses +void (function (_super) { + __extends(class_6, _super); + function class_6() { + return _super !== null && _super.apply(this, arguments) || this; + } + return class_6; +}((M == null ? void 0 : M.y))); +void (function (_super) { + __extends(class_7, _super); + function class_7() { + return _super !== null && _super.apply(this, arguments) || this; + } + return class_7; +}((M == null ? void 0 : M["y"]))); +void (function (_super) { + __extends(class_8, _super); + function class_8() { + return _super !== null && _super.apply(this, arguments) || this; + } + return class_8; +}((M == null ? void 0 : M.z))); +// - class decorators +var C1 = (function () { + function C1() { + } + return C1; +}()); +C1 = __decorate([ + x == null ? void 0 : x.y +], C1); +var C2 = (function () { + function C2() { + } + return C2; +}()); +C2 = __decorate([ + x == null ? void 0 : x["y"] +], C2); +var C3 = (function () { + function C3() { + } + return C3; +}()); +C3 = __decorate([ + x == null ? void 0 : x() +], C3); +var C4 = (function () { + function C4() { + } + return C4; +}()); +C4 = __decorate([ + x == null ? void 0 : new x() +], C4); +// - member decorators +var C5 = (function () { + function C5() { + } + C5.prototype.m = function () { }; + return C5; +}()); +__decorate([ + x == null ? void 0 : x.y +], C5.prototype, "m"); +var C6 = (function () { + function C6() { + } + C6.prototype.m = function () { }; + return C6; +}()); // allowed as ?.[ is not ambiguous with computed property names +__decorate([ + x == null ? void 0 : x["y"] +], C6.prototype, "m"); +var C7 = (function () { + function C7() { + } + C7.prototype.m = function () { }; + return C7; +}()); +__decorate([ + x == null ? void 0 : x() +], C7.prototype, "m"); +var C8 = (function () { + function C8() { + } + C8.prototype.m = function () { }; + return C8; +}()); +__decorate([ + x == null ? void 0 : new x() +], C8.prototype, "m"); +// - parameter decorators +var C9 = (function () { + function C9() { + } + C9.prototype.m = function (a) { }; + return C9; +}()); +__decorate([ + __param(0, x == null ? void 0 : x.y) +], C9.prototype, "m"); +var C10 = (function () { + function C10() { + } + C10.prototype.m = function (a) { }; + return C10; +}()); +__decorate([ + __param(0, x == null ? void 0 : x["y"]) +], C10.prototype, "m"); +var C11 = (function () { + function C11() { + } + C11.prototype.m = function (a) { }; + return C11; +}()); +__decorate([ + __param(0, x == null ? void 0 : x()) +], C11.prototype, "m"); +var C12 = (function () { + function C12() { + } + C12.prototype.m = function (a) { }; + return C12; +}()); +__decorate([ + __param(0, x == null ? void 0 : new x()) +], C12.prototype, "m"); +// functions +// - parameters +void function (a) { + if (a === void 0) { a = x == null ? void 0 : x.y; } +}; +void function (a) { + if (a === void 0) { a = x == null ? void 0 : x["y"]; } +}; +void function (a) { + if (a === void 0) { a = x == null ? void 0 : x(); } +}; +void function (a) { + if (a === void 0) { a = x == null ? void 0 : new x(); } +}; +// - binding elements +// - initializers +void function (_a) { + var _b = _a.a, a = _b === void 0 ? x == null ? void 0 : x.y : _b; +}; +void function (_a) { + var _b = _a.a, a = _b === void 0 ? x == null ? void 0 : x["y"] : _b; +}; +void function (_a) { + var _b = _a.a, a = _b === void 0 ? x == null ? void 0 : x() : _b; +}; +void function (_a) { + var _b = _a.a, a = _b === void 0 ? x == null ? void 0 : new x() : _b; +}; +// - computed properties +void function (_a) { + var _b = x == null ? void 0 : x.y, a = _a[_b]; +}; +void function (_a) { + var _b = x == null ? void 0 : x["y"], a = _a[_b]; +}; +void function (_a) { + var _b = x == null ? void 0 : x(), a = _a[_b]; +}; +void function (_a) { + var _b = x == null ? void 0 : new x(), a = _a[_b]; +}(function (a) { + if (a === void 0) { a = x == null ? void 0 : x.y; } +}); +(function (a) { + if (a === void 0) { a = x == null ? void 0 : x["y"]; } +}); +(function (a) { + if (a === void 0) { a = x == null ? void 0 : x(); } +}); +(function (a) { + if (a === void 0) { a = x == null ? void 0 : new x(); } +}); +// - expression bodies +(function () { return x == null ? void 0 : x.y; }); +(function () { return x == null ? void 0 : x["y"]; }); +(function () { return x == null ? void 0 : x(); }); +(function () { return x == null ? void 0 : new x(); }); +// parenthesis +(x == null ? void 0 : x.y); +// comma +x == null ? void 0 : x.y, f(); +f(), x == null ? void 0 : x.y; +// conditional +x == null ? void 0 : x.y ? 0 : 1; +0 ? x == null ? void 0 : x.y : 1; +0 ? 1 : x == null ? void 0 : x.y; +// binary +(x == null ? void 0 : x.y) + 1; +(x == null ? void 0 : x.y) - 1; +(x == null ? void 0 : x.y) * 1; +(x == null ? void 0 : x.y) / 1; +Math.pow((x == null ? void 0 : x.y), 1); +(x == null ? void 0 : x.y) % 1; +(x == null ? void 0 : x.y) ^ 1; +(x == null ? void 0 : x.y) & 1; +(x == null ? void 0 : x.y) | 1; +(x == null ? void 0 : x.y) << 1; +(x == null ? void 0 : x.y) >> 1; +(x == null ? void 0 : x.y) >>> 1; +(x == null ? void 0 : x.y) && 1; +(x == null ? void 0 : x.y) || 1; +(x == null ? void 0 : x.y) == 1; +(x == null ? void 0 : x.y) === 1; +(x == null ? void 0 : x.y) != 1; +(x == null ? void 0 : x.y) !== 1; +(x == null ? void 0 : x.y) < 1; +(x == null ? void 0 : x.y) <= 1; +(x == null ? void 0 : x.y) > 1; +(x == null ? void 0 : x.y) >= 1; +1 + (x == null ? void 0 : x.y); +1 - (x == null ? void 0 : x.y); +1 * (x == null ? void 0 : x.y); +1 / (x == null ? void 0 : x.y); +Math.pow(1, (x == null ? void 0 : x.y)); +1 % (x == null ? void 0 : x.y); +1 ^ (x == null ? void 0 : x.y); +1 & (x == null ? void 0 : x.y); +1 | (x == null ? void 0 : x.y); +1 << (x == null ? void 0 : x.y); +1 >> (x == null ? void 0 : x.y); +1 >>> (x == null ? void 0 : x.y); +1 && (x == null ? void 0 : x.y); +1 || (x == null ? void 0 : x.y); +1 == (x == null ? void 0 : x.y); +1 === (x == null ? void 0 : x.y); +1 != (x == null ? void 0 : x.y); +1 !== (x == null ? void 0 : x.y); +1 < (x == null ? void 0 : x.y); +1 <= (x == null ? void 0 : x.y); +1 > (x == null ? void 0 : x.y); +1 >= (x == null ? void 0 : x.y); +// prefix unary ++(x == null ? void 0 : x.y); +-(x == null ? void 0 : x.y); +!(x == null ? void 0 : x.y); +~(x == null ? void 0 : x.y); +// unary +void (x == null ? void 0 : x.y); +typeof (x == null ? void 0 : x.y); +void function () { return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, x == null ? void 0 : x.y]; + case 1: + _a.sent(); + return [2 /*return*/]; + } +}); }; +void function () { + return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, (x == null ? void 0 : x.y)]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); }); +}; +// notnull +(x == null ? void 0 : x.y).z; +// assertions +x == null ? void 0 : x.y; +x == null ? void 0 : x.y; +// array literals +[x == null ? void 0 : x.y]; +[, x == null ? void 0 : x.y]; +(x == null ? void 0 : x.y).slice(); +// literals +((_e = 1) == null ? void 0 : _e.toString)(); // no need for `..` +((_f = 1.) == null ? void 0 : _f.toString)(); +((_g = .0) == null ? void 0 : _g.toString)(); +((_h = 4e3) == null ? void 0 : _h.toString)(); +((_j = 1.e3) == null ? void 0 : _j.toString)(); +((_k = "") == null ? void 0 : _k.toString)(); +((_l = '') == null ? void 0 : _l.toString)(); +((_m = "") == null ? void 0 : _m.toString)(); +((_o = /./) == null ? void 0 : _o.toString)(); +((_p = /./g) == null ? void 0 : _p.toString)(); +((_q = true) == null ? void 0 : _q.toString)(); +((_r = false) == null ? void 0 : _r.toString)(); +// templates +"" + (x == null ? void 0 : x.y); +// variables +var v = x == null ? void 0 : x.y; +var v = (x == null ? void 0 : x.y)[0]; +var _s = [1][0], v = _s === void 0 ? x == null ? void 0 : x.y : _s; +var v = (x == null ? void 0 : x.y).v; +var _t = { v: 1 }.v, v = _t === void 0 ? x == null ? void 0 : x.y : _t; +var _u = x == null ? void 0 : x.y, v = null[_u]; +// if/else if +if (x == null ? void 0 : x.y) { } +if (1) { } +else if (x == null ? void 0 : x.y) { } +// switch +switch (x == null ? void 0 : x.y) { +} +switch (1) { + case x == null ? void 0 : x.y: break; +} +// do/while +do { } while (x == null ? void 0 : x.y); +while (x == null ? void 0 : x.y) { } +// for +for (x == null ? void 0 : x.y; x == null ? void 0 : x.y; x == null ? void 0 : x.y) + ; +// for..in +for (var _v in {}) { + x == null ? _v : x.y = _v; + ; +} +// for..of +for (var _i = 0, _w = []; _i < _w.length; _i++) { + var _x = _w[_i]; + x == null ? _x : x.y = _x; + ; +} +// enums +var E; +(function (E) { + E[E["a"] = x == null ? void 0 : x.y] = "a"; +})(E || (E = {})); +var _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _v, _x; +var _a, _b, _c, _d; +//// [exportsOk.js] +"use strict"; +exports.__esModule = true; +exports["default"] = x == null ? void 0 : x.y; diff --git a/tests/baselines/reference/emitter.safeNavigation.es3.symbols b/tests/baselines/reference/emitter.safeNavigation.es3.symbols new file mode 100644 index 00000000000..486cea53c8c --- /dev/null +++ b/tests/baselines/reference/emitter.safeNavigation.es3.symbols @@ -0,0 +1,858 @@ +=== tests/cases/conformance/emitter/es3/safeNavigation/declarations.d.ts === +declare var x: any; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +declare var y: any; +>y : Symbol(y, Decl(declarations.d.ts, 1, 11)) + +declare var f: ({ +>f : Symbol(f, Decl(declarations.d.ts, 2, 11)) + + (): void; + (): void; +>T : Symbol(T, Decl(declarations.d.ts, 4, 5)) + + new (): any; + new (): any; +>T : Symbol(T, Decl(declarations.d.ts, 6, 9)) + +}) | undefined; +declare var o: { y: typeof f; } +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>y : Symbol(y, Decl(declarations.d.ts, 8, 16)) +>f : Symbol(f, Decl(declarations.d.ts, 2, 11)) + +declare class Base { x(): any; } +>Base : Symbol(Base, Decl(declarations.d.ts, 8, 31)) +>x : Symbol(Base.x, Decl(declarations.d.ts, 9, 20)) + +declare namespace M { +>M : Symbol(M, Decl(declarations.d.ts, 9, 32)) + + export class y {} +>y : Symbol(y, Decl(declarations.d.ts, 10, 21)) + + export class z {} +>z : Symbol(z, Decl(declarations.d.ts, 11, 21)) +>T : Symbol(T, Decl(declarations.d.ts, 12, 19)) +} +=== tests/cases/conformance/emitter/es3/safeNavigation/propertyAccessOk.ts === +x.y +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y.z +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x.y?.z +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y?.z +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +=== tests/cases/conformance/emitter/es3/safeNavigation/elementAccessOk.ts === +x["y"] +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"]["z"] +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x["y"]?.["z"] +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"]?.["z"] +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +=== tests/cases/conformance/emitter/es3/safeNavigation/callExpressionOk.ts === +x() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x.y?.() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x["y"]?.() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +f?.() +>f : Symbol(f, Decl(declarations.d.ts, 2, 11)) + +o.y?.() +>o.y : Symbol(y, Decl(declarations.d.ts, 8, 16)) +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>y : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +o["y"]?.() +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>"y" : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +=== tests/cases/conformance/emitter/es3/safeNavigation/newExpressionOk.ts === +new x() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +new x.y?.() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +new x["y"]?.() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +new f?.() +>f : Symbol(f, Decl(declarations.d.ts, 2, 11)) + +new o.y?.() +>o.y : Symbol(y, Decl(declarations.d.ts, 8, 16)) +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>y : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +new o["y"]?.() +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>"y" : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +=== tests/cases/conformance/emitter/es3/safeNavigation/mixedOk.ts === +x?.y?.["z"] +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"]?.z +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y?.() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +o?.y() +>o?.y : Symbol(y, Decl(declarations.d.ts, 8, 16)) +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>y : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +o?.y?.() +>o?.y : Symbol(y, Decl(declarations.d.ts, 8, 16)) +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>y : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +x?.["z"]() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["z"]?.() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +o?.["y"]() +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>"y" : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +o?.["y"]?.() +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>"y" : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +=== tests/cases/conformance/emitter/es3/safeNavigation/mutationOk.ts === +x?.y = 1 +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y += 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y -= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y *= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y /= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y %= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y **= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y |= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y &= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y ^= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y <<= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y >>= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y >>>= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y++; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y--; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +++x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +--x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +delete x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] = 1 +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] += 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] -= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] *= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] /= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] %= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] **= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] |= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] &= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] ^= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] <<= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] >>= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] >>>= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"]++; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"]--; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +++x?.["y"]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +--x?.["y"]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +delete x?.["y"]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +=== tests/cases/conformance/emitter/es3/safeNavigation/arrayAssignmentPatternOk.ts === +[x?.y] = [1]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +[x?.["y"]] = [1]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +[...x?.y] = [1]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +[...x?.["y"]] = [1]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +=== tests/cases/conformance/emitter/es3/safeNavigation/objectAssignmentPatternOk.ts === +({ a: x?.y } = { a: 1 }); +>a : Symbol(a, Decl(objectAssignmentPatternOk.ts, 0, 2)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(objectAssignmentPatternOk.ts, 0, 16)) + +({ a: x?.["y"] } = { a: 1 }); +>a : Symbol(a, Decl(objectAssignmentPatternOk.ts, 1, 2)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(objectAssignmentPatternOk.ts, 1, 20)) + +=== tests/cases/conformance/emitter/es3/safeNavigation/questionDotDigitIsConditionalOk.ts === +x?.3:1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +=== tests/cases/conformance/emitter/es3/safeNavigation/superPropertyInvocationOk.ts === +// supported for invocation of super property +void class extends Base { +>Base : Symbol(Base, Decl(declarations.d.ts, 8, 31)) + + m() { +>m : Symbol((Anonymous class).m, Decl(superPropertyInvocationOk.ts, 1, 25)) + + super.x?.(); +>super.x : Symbol(Base.x, Decl(declarations.d.ts, 9, 20)) +>super : Symbol(Base, Decl(declarations.d.ts, 8, 31)) +>x : Symbol(Base.x, Decl(declarations.d.ts, 9, 20)) + } +} + +=== tests/cases/conformance/emitter/es3/safeNavigation/generalParsingOk.ts === +// object literals +// - computed property names +void { [x?.y]: 1 } +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void { [x?.["y"]]: 1 } +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void { [x?.()]: 1 } +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void { [new x?.()]: 1 } +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// - property assignments +void { a: x?.y } +>a : Symbol(a, Decl(generalParsingOk.ts, 7, 6)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void { a: x?.["y"] } +>a : Symbol(a, Decl(generalParsingOk.ts, 8, 6)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void { a: x?.() } +>a : Symbol(a, Decl(generalParsingOk.ts, 9, 6)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void { a: new x?.() } +>a : Symbol(a, Decl(generalParsingOk.ts, 10, 6)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// classes +// - computed property names +// void class { [x?.y] = 1 } // legal parse, but causes a checker error +// void class { [x?.["y"]] = 1 } // legal parse, but causes a checker error +// void class { [x?.()] = 1 } // legal parse, but causes a checker error +// void class { [new f?.()] = 1 } // legal parse, but causes a checker error +void class { [Symbol?.toStringTag] = "" } +>Symbol?.toStringTag : Symbol(SymbolConstructor.toStringTag, Decl(lib.es2015.symbol.wellknown.d.ts, --, --)) +>Symbol : Symbol(Symbol, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.symbol.d.ts, --, --), Decl(lib.es2015.symbol.d.ts, --, --)) +>toStringTag : Symbol(SymbolConstructor.toStringTag, Decl(lib.es2015.symbol.wellknown.d.ts, --, --)) + +// - property declarations +void class { a = x?.y } +>a : Symbol((Anonymous class).a, Decl(generalParsingOk.ts, 20, 12)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void class { a = x?.["y"] } +>a : Symbol((Anonymous class).a, Decl(generalParsingOk.ts, 21, 12)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void class { a = x?.() } +>a : Symbol((Anonymous class).a, Decl(generalParsingOk.ts, 22, 12)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void class { a = new x?.() } +>a : Symbol((Anonymous class).a, Decl(generalParsingOk.ts, 23, 12)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// - heritage clauses +void class extends M?.y {} +>M?.y : Symbol(M.y, Decl(declarations.d.ts, 10, 21)) +>M : Symbol(M, Decl(declarations.d.ts, 9, 32)) +>y : Symbol(M.y, Decl(declarations.d.ts, 10, 21)) + +void class extends M?.["y"] {} +>M : Symbol(M, Decl(declarations.d.ts, 9, 32)) +>"y" : Symbol(M.y, Decl(declarations.d.ts, 10, 21)) + +void class extends M?.z {} +>M?.z : Symbol(M.z, Decl(declarations.d.ts, 11, 21)) +>M : Symbol(M, Decl(declarations.d.ts, 9, 32)) +>z : Symbol(M.z, Decl(declarations.d.ts, 11, 21)) + +// - class decorators +@x?.y class C1 {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>C1 : Symbol(C1, Decl(generalParsingOk.ts, 27, 34)) + +@x?.["y"] class C2 {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>C2 : Symbol(C2, Decl(generalParsingOk.ts, 29, 17)) + +@x?.() class C3 {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>C3 : Symbol(C3, Decl(generalParsingOk.ts, 30, 21)) + +@new x?.() class C4 {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>C4 : Symbol(C4, Decl(generalParsingOk.ts, 31, 18)) + +// - member decorators +class C5 { @x?.y m() {} } +>C5 : Symbol(C5, Decl(generalParsingOk.ts, 32, 22)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>m : Symbol(C5.m, Decl(generalParsingOk.ts, 34, 10)) + +class C6 { @x?.["y"] m() {} } // allowed as ?.[ is not ambiguous with computed property names +>C6 : Symbol(C6, Decl(generalParsingOk.ts, 34, 25)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>m : Symbol(C6.m, Decl(generalParsingOk.ts, 35, 10)) + +class C7 { @x?.() m() {} } +>C7 : Symbol(C7, Decl(generalParsingOk.ts, 35, 29)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>m : Symbol(C7.m, Decl(generalParsingOk.ts, 36, 10)) + +class C8 { @new x?.() m () {} } +>C8 : Symbol(C8, Decl(generalParsingOk.ts, 36, 26)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>m : Symbol(C8.m, Decl(generalParsingOk.ts, 37, 10)) + +// - parameter decorators +class C9 { m(@x?.y a) {} } +>C9 : Symbol(C9, Decl(generalParsingOk.ts, 37, 31)) +>m : Symbol(C9.m, Decl(generalParsingOk.ts, 39, 10)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 39, 13)) + +class C10 { m(@x?.["y"] a) {} } +>C10 : Symbol(C10, Decl(generalParsingOk.ts, 39, 26)) +>m : Symbol(C10.m, Decl(generalParsingOk.ts, 40, 11)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 40, 14)) + +class C11 { m(@x?.() a) {} } +>C11 : Symbol(C11, Decl(generalParsingOk.ts, 40, 31)) +>m : Symbol(C11.m, Decl(generalParsingOk.ts, 41, 11)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 41, 14)) + +class C12 { m(@new x?.() a) {} } +>C12 : Symbol(C12, Decl(generalParsingOk.ts, 41, 28)) +>m : Symbol(C12.m, Decl(generalParsingOk.ts, 42, 11)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 42, 14)) + +// functions +// - parameters +void function (a = x?.y) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 46, 15)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void function (a = x?.["y"]) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 47, 15)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void function (a = x?.()) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 48, 15)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void function (a = new x?.()) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 49, 15)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// - binding elements +// - initializers +void function ({ a = x?.y }) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 52, 16)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void function ({ a = x?.["y"] }) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 53, 16)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void function ({ a = x?.() }) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 54, 16)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void function ({ a = new x?.() }) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 55, 16)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// - computed properties +void function ({ [x?.y]: a }) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 57, 16)) + +void function ({ [x?.["y"]]: a }) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 58, 16)) + +void function ({ [x?.()]: a }) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 59, 16)) + +void function ({ [new x?.()]: a }) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 60, 16)) + +// arrow functions +// - parameters +((a = x?.y) => {}); +>a : Symbol(a, Decl(generalParsingOk.ts, 64, 2)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +((a = x?.["y"]) => {}); +>a : Symbol(a, Decl(generalParsingOk.ts, 65, 2)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +((a = x?.()) => {}); +>a : Symbol(a, Decl(generalParsingOk.ts, 66, 2)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +((a = new x?.()) => {}); +>a : Symbol(a, Decl(generalParsingOk.ts, 67, 2)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// - expression bodies +(() => x?.y); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +(() => x?.["y"]); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +(() => x?.()); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +(() => new x?.()); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// parenthesis +(x?.y); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// comma +x?.y, f(); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>f : Symbol(f, Decl(declarations.d.ts, 2, 11)) + +f(), x?.y; +>f : Symbol(f, Decl(declarations.d.ts, 2, 11)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// conditional +x?.y ? 0 : 1 +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +0 ? x?.y : 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +0 ? 1 : x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// binary +x?.y + 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y - 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y * 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y / 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y ** 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y % 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y ^ 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y & 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y | 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y << 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y >> 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y >>> 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y && 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y || 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y == 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y === 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y != 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y !== 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y < 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y <= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y > 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y >= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 + x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 - x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 * x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 / x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 ** x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 % x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 ^ x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 & x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 | x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 << x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 >> x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 >>> x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 && x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 || x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 == x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 === x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 != x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 !== x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 < x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 <= x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 > x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 >= x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// prefix unary ++x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +-x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +!x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +~x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// unary +void x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +typeof x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void function * () { yield x?.y; } +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void async function() { await x?.y; } +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// notnull +x?.y!.z; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// assertions +x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y as string; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// array literals +[x?.y]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +[, x?.y]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +[...x?.y]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// literals +1?.toString(); // no need for `..` +>1?.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) + +1.?.toString(); +>1.?.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) + +.0?.toString(); +>.0?.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) + +4e3?.toString(); +>4e3?.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) + +1.e3?.toString(); +>1.e3?.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) + +""?.toString(); +>""?.toString : Symbol(String.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(String.toString, Decl(lib.es5.d.ts, --, --)) + +''?.toString(); +>''?.toString : Symbol(String.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(String.toString, Decl(lib.es5.d.ts, --, --)) + +``?.toString(); +>``?.toString : Symbol(String.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(String.toString, Decl(lib.es5.d.ts, --, --)) + +/./?.toString(); +>/./?.toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) + +/./g?.toString(); +>/./g?.toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) + +true?.toString(); +>true?.toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) + +false?.toString(); +>false?.toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) + +// templates +`${x?.y}`; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// variables +var v = x?.y; +>v : Symbol(v, Decl(generalParsingOk.ts, 174, 3), Decl(generalParsingOk.ts, 175, 5), Decl(generalParsingOk.ts, 176, 5), Decl(generalParsingOk.ts, 177, 5), Decl(generalParsingOk.ts, 178, 5), Decl(generalParsingOk.ts, 179, 5)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +var [v] = x?.y; +>v : Symbol(v, Decl(generalParsingOk.ts, 174, 3), Decl(generalParsingOk.ts, 175, 5), Decl(generalParsingOk.ts, 176, 5), Decl(generalParsingOk.ts, 177, 5), Decl(generalParsingOk.ts, 178, 5), Decl(generalParsingOk.ts, 179, 5)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +var [v = x?.y] = [1]; +>v : Symbol(v, Decl(generalParsingOk.ts, 174, 3), Decl(generalParsingOk.ts, 175, 5), Decl(generalParsingOk.ts, 176, 5), Decl(generalParsingOk.ts, 177, 5), Decl(generalParsingOk.ts, 178, 5), Decl(generalParsingOk.ts, 179, 5)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +var {v} = x?.y; +>v : Symbol(v, Decl(generalParsingOk.ts, 174, 3), Decl(generalParsingOk.ts, 175, 5), Decl(generalParsingOk.ts, 176, 5), Decl(generalParsingOk.ts, 177, 5), Decl(generalParsingOk.ts, 178, 5), Decl(generalParsingOk.ts, 179, 5)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +var {v = x?.y} = {v:1}; +>v : Symbol(v, Decl(generalParsingOk.ts, 174, 3), Decl(generalParsingOk.ts, 175, 5), Decl(generalParsingOk.ts, 176, 5), Decl(generalParsingOk.ts, 177, 5), Decl(generalParsingOk.ts, 178, 5), Decl(generalParsingOk.ts, 179, 5)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>v : Symbol(v, Decl(generalParsingOk.ts, 178, 18)) + +var {[x?.y]: v} = null; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>v : Symbol(v, Decl(generalParsingOk.ts, 174, 3), Decl(generalParsingOk.ts, 175, 5), Decl(generalParsingOk.ts, 176, 5), Decl(generalParsingOk.ts, 177, 5), Decl(generalParsingOk.ts, 178, 5), Decl(generalParsingOk.ts, 179, 5)) + +// if/else if +if (x?.y) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +if (1) {} else if (x?.y) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// switch +switch (x?.y) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +switch (1) { case x?.y: break; } +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// do/while +do {} while (x?.y) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +while (x?.y) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// for +for (x?.y; x?.y; x?.y); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// for..in +for (x?.y in {}); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// for..of +for (x?.y of []); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// enums +enum E { +>E : Symbol(E, Decl(generalParsingOk.ts, 200, 17)) + + a = x?.y +>a : Symbol(E.a, Decl(generalParsingOk.ts, 203, 8)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +} + +=== tests/cases/conformance/emitter/es3/safeNavigation/exportsOk.ts === +export default x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + diff --git a/tests/baselines/reference/emitter.safeNavigation.es3.types b/tests/baselines/reference/emitter.safeNavigation.es3.types new file mode 100644 index 00000000000..439a7c961bd --- /dev/null +++ b/tests/baselines/reference/emitter.safeNavigation.es3.types @@ -0,0 +1,1589 @@ +=== tests/cases/conformance/emitter/es3/safeNavigation/declarations.d.ts === +declare var x: any; +>x : any + +declare var y: any; +>y : any + +declare var f: ({ +>f : { (): void; (): void; new (): any; new (): any; } + + (): void; + (): void; +>T : T + + new (): any; + new (): any; +>T : T + +}) | undefined; +declare var o: { y: typeof f; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>y : { (): void; (): void; new (): any; new (): any; } +>f : { (): void; (): void; new (): any; new (): any; } + +declare class Base { x(): any; } +>Base : Base +>x : () => any + +declare namespace M { +>M : typeof M + + export class y {} +>y : y + + export class z {} +>z : z +>T : T +} +=== tests/cases/conformance/emitter/es3/safeNavigation/propertyAccessOk.ts === +x.y +>x.y : any +>x : any +>y : any + +x?.y +>x?.y : any +>x : any +>y : any + +x?.y.z +>x?.y.z : any +>x?.y : any +>x : any +>y : any +>z : any + +x.y?.z +>x.y?.z : any +>x.y : any +>x : any +>y : any +>z : any + +x?.y?.z +>x?.y?.z : any +>x?.y : any +>x : any +>y : any +>z : any + +=== tests/cases/conformance/emitter/es3/safeNavigation/elementAccessOk.ts === +x["y"] +>x["y"] : any +>x : any +>"y" : "y" + +x?.["y"] +>x?.["y"] : any +>x : any +>"y" : "y" + +x?.["y"]["z"] +>x?.["y"]["z"] : any +>x?.["y"] : any +>x : any +>"y" : "y" +>"z" : "z" + +x["y"]?.["z"] +>x["y"]?.["z"] : any +>x["y"] : any +>x : any +>"y" : "y" +>"z" : "z" + +x?.["y"]?.["z"] +>x?.["y"]?.["z"] : any +>x?.["y"] : any +>x : any +>"y" : "y" +>"z" : "z" + +=== tests/cases/conformance/emitter/es3/safeNavigation/callExpressionOk.ts === +x() +>x() : any +>x : any + +x?.() +>x?.() : any +>x : any + +x.y?.() +>x.y?.() : any +>x.y : any +>x : any +>y : any + +x["y"]?.() +>x["y"]?.() : any +>x["y"] : any +>x : any +>"y" : "y" + +f?.() +>f?.() : void +>f : { (): void; (): void; new (): any; new (): any; } + +o.y?.() +>o.y?.() : void +>o.y : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>y : { (): void; (): void; new (): any; new (): any; } + +o["y"]?.() +>o["y"]?.() : void +>o["y"] : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>"y" : "y" + +=== tests/cases/conformance/emitter/es3/safeNavigation/newExpressionOk.ts === +new x() +>new x() : any +>x : any + +new x.y?.() +>new x.y?.() : any +>x.y : any +>x : any +>y : any + +new x["y"]?.() +>new x["y"]?.() : any +>x["y"] : any +>x : any +>"y" : "y" + +new f?.() +>new f?.() : any +>f : { (): void; (): void; new (): any; new (): any; } + +new o.y?.() +>new o.y?.() : any +>o.y : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>y : { (): void; (): void; new (): any; new (): any; } + +new o["y"]?.() +>new o["y"]?.() : any +>o["y"] : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>"y" : "y" + +=== tests/cases/conformance/emitter/es3/safeNavigation/mixedOk.ts === +x?.y?.["z"] +>x?.y?.["z"] : any +>x?.y : any +>x : any +>y : any +>"z" : "z" + +x?.["y"]?.z +>x?.["y"]?.z : any +>x?.["y"] : any +>x : any +>"y" : "y" +>z : any + +x?.y() +>x?.y() : any +>x?.y : any +>x : any +>y : any + +x?.y?.() +>x?.y?.() : any +>x?.y : any +>x : any +>y : any + +o?.y() +>o?.y() : void +>o?.y : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>y : { (): void; (): void; new (): any; new (): any; } + +o?.y?.() +>o?.y?.() : void +>o?.y : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>y : { (): void; (): void; new (): any; new (): any; } + +x?.["z"]() +>x?.["z"]() : any +>x?.["z"] : any +>x : any +>"z" : "z" + +x?.["z"]?.() +>x?.["z"]?.() : any +>x?.["z"] : any +>x : any +>"z" : "z" + +o?.["y"]() +>o?.["y"]() : void +>o?.["y"] : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>"y" : "y" + +o?.["y"]?.() +>o?.["y"]?.() : void +>o?.["y"] : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>"y" : "y" + +=== tests/cases/conformance/emitter/es3/safeNavigation/mutationOk.ts === +x?.y = 1 +>x?.y = 1 : 1 +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y += 1; +>x?.y += 1 : any +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y -= 1; +>x?.y -= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y *= 1; +>x?.y *= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y /= 1; +>x?.y /= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y %= 1; +>x?.y %= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y **= 1; +>x?.y **= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y |= 1; +>x?.y |= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y &= 1; +>x?.y &= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y ^= 1; +>x?.y ^= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y <<= 1; +>x?.y <<= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y >>= 1; +>x?.y >>= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y >>>= 1; +>x?.y >>>= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y++; +>x?.y++ : number +>x?.y : any +>x : any +>y : any + +x?.y--; +>x?.y-- : number +>x?.y : any +>x : any +>y : any + +++x?.y; +>++x?.y : number +>x?.y : any +>x : any +>y : any + +--x?.y; +>--x?.y : number +>x?.y : any +>x : any +>y : any + +delete x?.y; +>delete x?.y : boolean +>x?.y : any +>x : any +>y : any + +x?.["y"] = 1 +>x?.["y"] = 1 : 1 +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] += 1; +>x?.["y"] += 1 : any +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] -= 1; +>x?.["y"] -= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] *= 1; +>x?.["y"] *= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] /= 1; +>x?.["y"] /= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] %= 1; +>x?.["y"] %= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] **= 1; +>x?.["y"] **= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] |= 1; +>x?.["y"] |= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] &= 1; +>x?.["y"] &= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] ^= 1; +>x?.["y"] ^= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] <<= 1; +>x?.["y"] <<= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] >>= 1; +>x?.["y"] >>= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] >>>= 1; +>x?.["y"] >>>= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"]++; +>x?.["y"]++ : number +>x?.["y"] : any +>x : any +>"y" : "y" + +x?.["y"]--; +>x?.["y"]-- : number +>x?.["y"] : any +>x : any +>"y" : "y" + +++x?.["y"]; +>++x?.["y"] : number +>x?.["y"] : any +>x : any +>"y" : "y" + +--x?.["y"]; +>--x?.["y"] : number +>x?.["y"] : any +>x : any +>"y" : "y" + +delete x?.["y"]; +>delete x?.["y"] : boolean +>x?.["y"] : any +>x : any +>"y" : "y" + +=== tests/cases/conformance/emitter/es3/safeNavigation/arrayAssignmentPatternOk.ts === +[x?.y] = [1]; +>[x?.y] = [1] : [number] +>[x?.y] : [any] +>x?.y : any +>x : any +>y : any +>[1] : [number] +>1 : 1 + +[x?.["y"]] = [1]; +>[x?.["y"]] = [1] : [number] +>[x?.["y"]] : [any] +>x?.["y"] : any +>x : any +>"y" : "y" +>[1] : [number] +>1 : 1 + +[...x?.y] = [1]; +>[...x?.y] = [1] : number[] +>[...x?.y] : undefined[] +>...x?.y : any +>x?.y : any +>x : any +>y : any +>[1] : number[] +>1 : 1 + +[...x?.["y"]] = [1]; +>[...x?.["y"]] = [1] : number[] +>[...x?.["y"]] : undefined[] +>...x?.["y"] : any +>x?.["y"] : any +>x : any +>"y" : "y" +>[1] : number[] +>1 : 1 + +=== tests/cases/conformance/emitter/es3/safeNavigation/objectAssignmentPatternOk.ts === +({ a: x?.y } = { a: 1 }); +>({ a: x?.y } = { a: 1 }) : { a: number; } +>{ a: x?.y } = { a: 1 } : { a: number; } +>{ a: x?.y } : { a: any; } +>a : any +>x?.y : any +>x : any +>y : any +>{ a: 1 } : { a: number; } +>a : number +>1 : 1 + +({ a: x?.["y"] } = { a: 1 }); +>({ a: x?.["y"] } = { a: 1 }) : { a: number; } +>{ a: x?.["y"] } = { a: 1 } : { a: number; } +>{ a: x?.["y"] } : { a: any; } +>a : any +>x?.["y"] : any +>x : any +>"y" : "y" +>{ a: 1 } : { a: number; } +>a : number +>1 : 1 + +=== tests/cases/conformance/emitter/es3/safeNavigation/questionDotDigitIsConditionalOk.ts === +x?.3:1; +>x?.3:1 : 1 | 0.3 +>x : any +>.3 : 0.3 +>1 : 1 + +=== tests/cases/conformance/emitter/es3/safeNavigation/superPropertyInvocationOk.ts === +// supported for invocation of super property +void class extends Base { +>void class extends Base { m() { super.x?.(); }} : undefined +>class extends Base { m() { super.x?.(); }} : typeof (Anonymous class) +>Base : Base + + m() { +>m : () => void + + super.x?.(); +>super.x?.() : any +>super.x : () => any +>super : Base +>x : () => any + } +} + +=== tests/cases/conformance/emitter/es3/safeNavigation/generalParsingOk.ts === +// object literals +// - computed property names +void { [x?.y]: 1 } +>void { [x?.y]: 1 } : undefined +>{ [x?.y]: 1 } : { [x: number]: number; } +>x?.y : any +>x : any +>y : any +>1 : 1 + +void { [x?.["y"]]: 1 } +>void { [x?.["y"]]: 1 } : undefined +>{ [x?.["y"]]: 1 } : { [x: number]: number; } +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +void { [x?.()]: 1 } +>void { [x?.()]: 1 } : undefined +>{ [x?.()]: 1 } : { [x: number]: number; } +>x?.() : any +>x : any +>1 : 1 + +void { [new x?.()]: 1 } +>void { [new x?.()]: 1 } : undefined +>{ [new x?.()]: 1 } : { [x: number]: number; } +>new x?.() : any +>x : any +>1 : 1 + +// - property assignments +void { a: x?.y } +>void { a: x?.y } : undefined +>{ a: x?.y } : { a: any; } +>a : any +>x?.y : any +>x : any +>y : any + +void { a: x?.["y"] } +>void { a: x?.["y"] } : undefined +>{ a: x?.["y"] } : { a: any; } +>a : any +>x?.["y"] : any +>x : any +>"y" : "y" + +void { a: x?.() } +>void { a: x?.() } : undefined +>{ a: x?.() } : { a: any; } +>a : any +>x?.() : any +>x : any + +void { a: new x?.() } +>void { a: new x?.() } : undefined +>{ a: new x?.() } : { a: any; } +>a : any +>new x?.() : any +>x : any + +// classes +// - computed property names +// void class { [x?.y] = 1 } // legal parse, but causes a checker error +// void class { [x?.["y"]] = 1 } // legal parse, but causes a checker error +// void class { [x?.()] = 1 } // legal parse, but causes a checker error +// void class { [new f?.()] = 1 } // legal parse, but causes a checker error +void class { [Symbol?.toStringTag] = "" } +>void class { [Symbol?.toStringTag] = "" } : undefined +>class { [Symbol?.toStringTag] = "" } : typeof (Anonymous class) +>Symbol?.toStringTag : symbol +>Symbol : SymbolConstructor +>toStringTag : symbol +>"" : "" + +// - property declarations +void class { a = x?.y } +>void class { a = x?.y } : undefined +>class { a = x?.y } : typeof (Anonymous class) +>a : any +>x?.y : any +>x : any +>y : any + +void class { a = x?.["y"] } +>void class { a = x?.["y"] } : undefined +>class { a = x?.["y"] } : typeof (Anonymous class) +>a : any +>x?.["y"] : any +>x : any +>"y" : "y" + +void class { a = x?.() } +>void class { a = x?.() } : undefined +>class { a = x?.() } : typeof (Anonymous class) +>a : any +>x?.() : any +>x : any + +void class { a = new x?.() } +>void class { a = new x?.() } : undefined +>class { a = new x?.() } : typeof (Anonymous class) +>a : any +>new x?.() : any +>x : any + +// - heritage clauses +void class extends M?.y {} +>void class extends M?.y {} : undefined +>class extends M?.y {} : typeof (Anonymous class) +>M?.y : M.y +>M : typeof M +>y : typeof M.y + +void class extends M?.["y"] {} +>void class extends M?.["y"] {} : undefined +>class extends M?.["y"] {} : typeof (Anonymous class) +>M?.["y"] : M.y +>M : typeof M +>"y" : "y" + +void class extends M?.z {} +>void class extends M?.z {} : undefined +>class extends M?.z {} : typeof (Anonymous class) +>M?.z : M.z +>M : typeof M +>z : typeof M.z + +// - class decorators +@x?.y class C1 {} +>x?.y : any +>x : any +>y : any +>C1 : C1 + +@x?.["y"] class C2 {} +>x?.["y"] : any +>x : any +>"y" : "y" +>C2 : C2 + +@x?.() class C3 {} +>x?.() : any +>x : any +>C3 : C3 + +@new x?.() class C4 {} +>new x?.() : any +>x : any +>C4 : C4 + +// - member decorators +class C5 { @x?.y m() {} } +>C5 : C5 +>x?.y : any +>x : any +>y : any +>m : () => void + +class C6 { @x?.["y"] m() {} } // allowed as ?.[ is not ambiguous with computed property names +>C6 : C6 +>x?.["y"] : any +>x : any +>"y" : "y" +>m : () => void + +class C7 { @x?.() m() {} } +>C7 : C7 +>x?.() : any +>x : any +>m : () => void + +class C8 { @new x?.() m () {} } +>C8 : C8 +>new x?.() : any +>x : any +>m : () => void + +// - parameter decorators +class C9 { m(@x?.y a) {} } +>C9 : C9 +>m : (a: any) => void +>x?.y : any +>x : any +>y : any +>a : any + +class C10 { m(@x?.["y"] a) {} } +>C10 : C10 +>m : (a: any) => void +>x?.["y"] : any +>x : any +>"y" : "y" +>a : any + +class C11 { m(@x?.() a) {} } +>C11 : C11 +>m : (a: any) => void +>x?.() : any +>x : any +>a : any + +class C12 { m(@new x?.() a) {} } +>C12 : C12 +>m : (a: any) => void +>new x?.() : any +>x : any +>a : any + +// functions +// - parameters +void function (a = x?.y) {} +>void function (a = x?.y) {} : undefined +>function (a = x?.y) {} : (a?: any) => void +>a : any +>x?.y : any +>x : any +>y : any + +void function (a = x?.["y"]) {} +>void function (a = x?.["y"]) {} : undefined +>function (a = x?.["y"]) {} : (a?: any) => void +>a : any +>x?.["y"] : any +>x : any +>"y" : "y" + +void function (a = x?.()) {} +>void function (a = x?.()) {} : undefined +>function (a = x?.()) {} : (a?: any) => void +>a : any +>x?.() : any +>x : any + +void function (a = new x?.()) {} +>void function (a = new x?.()) {} : undefined +>function (a = new x?.()) {} : (a?: any) => void +>a : any +>new x?.() : any +>x : any + +// - binding elements +// - initializers +void function ({ a = x?.y }) {} +>void function ({ a = x?.y }) {} : undefined +>function ({ a = x?.y }) {} : ({a}: { a?: any; }) => void +>a : any +>x?.y : any +>x : any +>y : any + +void function ({ a = x?.["y"] }) {} +>void function ({ a = x?.["y"] }) {} : undefined +>function ({ a = x?.["y"] }) {} : ({a}: { a?: any; }) => void +>a : any +>x?.["y"] : any +>x : any +>"y" : "y" + +void function ({ a = x?.() }) {} +>void function ({ a = x?.() }) {} : undefined +>function ({ a = x?.() }) {} : ({a}: { a?: any; }) => void +>a : any +>x?.() : any +>x : any + +void function ({ a = new x?.() }) {} +>void function ({ a = new x?.() }) {} : undefined +>function ({ a = new x?.() }) {} : ({a}: { a?: any; }) => void +>a : any +>new x?.() : any +>x : any + +// - computed properties +void function ({ [x?.y]: a }) {} +>void function ({ [x?.y]: a }) {} : undefined +>function ({ [x?.y]: a }) {} : ({[x?.y]: a}: {}) => void +>x?.y : any +>x : any +>y : any +>a : any + +void function ({ [x?.["y"]]: a }) {} +>void function ({ [x?.["y"]]: a }) {} : undefined +>function ({ [x?.["y"]]: a }) {} : ({[x?.["y"]]: a}: {}) => void +>x?.["y"] : any +>x : any +>"y" : "y" +>a : any + +void function ({ [x?.()]: a }) {} +>void function ({ [x?.()]: a }) {} : undefined +>function ({ [x?.()]: a }) {} : ({[x?.()]: a}: {}) => void +>x?.() : any +>x : any +>a : any + +void function ({ [new x?.()]: a }) {} +>void function ({ [new x?.()]: a }) {}// arrow functions// - parameters((a = x?.y) => {}) : undefined +>function ({ [new x?.()]: a }) {}// arrow functions// - parameters((a = x?.y) => {}) : void +>function ({ [new x?.()]: a }) {} : ({[new x?.()]: a}: (a?: any) => void) => void +>new x?.() : any +>x : any +>a : any + +// arrow functions +// - parameters +((a = x?.y) => {}); +>(a = x?.y) => {} : (a?: any) => void +>a : any +>x?.y : any +>x : any +>y : any + +((a = x?.["y"]) => {}); +>((a = x?.["y"]) => {}) : (a?: any) => void +>(a = x?.["y"]) => {} : (a?: any) => void +>a : any +>x?.["y"] : any +>x : any +>"y" : "y" + +((a = x?.()) => {}); +>((a = x?.()) => {}) : (a?: any) => void +>(a = x?.()) => {} : (a?: any) => void +>a : any +>x?.() : any +>x : any + +((a = new x?.()) => {}); +>((a = new x?.()) => {}) : (a?: any) => void +>(a = new x?.()) => {} : (a?: any) => void +>a : any +>new x?.() : any +>x : any + +// - expression bodies +(() => x?.y); +>(() => x?.y) : () => any +>() => x?.y : () => any +>x?.y : any +>x : any +>y : any + +(() => x?.["y"]); +>(() => x?.["y"]) : () => any +>() => x?.["y"] : () => any +>x?.["y"] : any +>x : any +>"y" : "y" + +(() => x?.()); +>(() => x?.()) : () => any +>() => x?.() : () => any +>x?.() : any +>x : any + +(() => new x?.()); +>(() => new x?.()) : () => any +>() => new x?.() : () => any +>new x?.() : any +>x : any + +// parenthesis +(x?.y); +>(x?.y) : any +>x?.y : any +>x : any +>y : any + +// comma +x?.y, f(); +>x?.y, f() : void +>x?.y : any +>x : any +>y : any +>f() : void +>f : { (): void; (): void; new (): any; new (): any; } + +f(), x?.y; +>f(), x?.y : any +>f() : void +>f : { (): void; (): void; new (): any; new (): any; } +>x?.y : any +>x : any +>y : any + +// conditional +x?.y ? 0 : 1 +>x?.y ? 0 : 1 : 1 | 0 +>x?.y : any +>x : any +>y : any +>0 : 0 +>1 : 1 + +0 ? x?.y : 1; +>0 ? x?.y : 1 : any +>0 : 0 +>x?.y : any +>x : any +>y : any +>1 : 1 + +0 ? 1 : x?.y; +>0 ? 1 : x?.y : any +>0 : 0 +>1 : 1 +>x?.y : any +>x : any +>y : any + +// binary +x?.y + 1; +>x?.y + 1 : any +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y - 1; +>x?.y - 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y * 1; +>x?.y * 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y / 1; +>x?.y / 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y ** 1; +>x?.y ** 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y % 1; +>x?.y % 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y ^ 1; +>x?.y ^ 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y & 1; +>x?.y & 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y | 1; +>x?.y | 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y << 1; +>x?.y << 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y >> 1; +>x?.y >> 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y >>> 1; +>x?.y >>> 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y && 1; +>x?.y && 1 : 0 | 1 +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y || 1; +>x?.y || 1 : any +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y == 1; +>x?.y == 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y === 1; +>x?.y === 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y != 1; +>x?.y != 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y !== 1; +>x?.y !== 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y < 1; +>x?.y < 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y <= 1; +>x?.y <= 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y > 1; +>x?.y > 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y >= 1; +>x?.y >= 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +1 + x?.y; +>1 + x?.y : any +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 - x?.y; +>1 - x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 * x?.y; +>1 * x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 / x?.y; +>1 / x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 ** x?.y; +>1 ** x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 % x?.y; +>1 % x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 ^ x?.y; +>1 ^ x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 & x?.y; +>1 & x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 | x?.y; +>1 | x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 << x?.y; +>1 << x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 >> x?.y; +>1 >> x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 >>> x?.y; +>1 >>> x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 && x?.y; +>1 && x?.y : any +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 || x?.y; +>1 || x?.y : any +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 == x?.y; +>1 == x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 === x?.y; +>1 === x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 != x?.y; +>1 != x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 !== x?.y; +>1 !== x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 < x?.y; +>1 < x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 <= x?.y; +>1 <= x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 > x?.y; +>1 > x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 >= x?.y; +>1 >= x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +// prefix unary ++x?.y; +>+x?.y : number +>x?.y : any +>x : any +>y : any + +-x?.y; +>-x?.y : number +>x?.y : any +>x : any +>y : any + +!x?.y; +>!x?.y : boolean +>x?.y : any +>x : any +>y : any + +~x?.y; +>~x?.y : number +>x?.y : any +>x : any +>y : any + +// unary +void x?.y; +>void x?.y : undefined +>x?.y : any +>x : any +>y : any + +typeof x?.y; +>typeof x?.y : "string" | "number" | "boolean" | "symbol" | "undefined" | "object" | "function" +>x?.y : any +>x : any +>y : any + +void function * () { yield x?.y; } +>void function * () { yield x?.y; } : undefined +>function * () { yield x?.y; } : () => IterableIterator +>yield x?.y : any +>x?.y : any +>x : any +>y : any + +void async function() { await x?.y; } +>void async function() { await x?.y; } : undefined +>async function() { await x?.y; } : () => Promise +>await x?.y : any +>x?.y : any +>x : any +>y : any + +// notnull +x?.y!.z; +>x?.y!.z : any +>x?.y! : any +>x?.y : any +>x : any +>y : any +>z : any + +// assertions +x?.y; +>x?.y : string +>x?.y : any +>x : any +>y : any + +x?.y as string; +>x?.y as string : string +>x?.y : any +>x : any +>y : any + +// array literals +[x?.y]; +>[x?.y] : any[] +>x?.y : any +>x : any +>y : any + +[, x?.y]; +>[, x?.y] : any[] +> : undefined +>x?.y : any +>x : any +>y : any + +[...x?.y]; +>[...x?.y] : any[] +>...x?.y : any +>x?.y : any +>x : any +>y : any + +// literals +1?.toString(); // no need for `..` +>1?.toString() : string +>1?.toString : (radix?: number) => string +>1 : 1 +>toString : (radix?: number) => string + +1.?.toString(); +>1.?.toString() : string +>1.?.toString : (radix?: number) => string +>1. : 1 +>toString : (radix?: number) => string + +.0?.toString(); +>.0?.toString() : string +>.0?.toString : (radix?: number) => string +>.0 : 0 +>toString : (radix?: number) => string + +4e3?.toString(); +>4e3?.toString() : string +>4e3?.toString : (radix?: number) => string +>4e3 : 4000 +>toString : (radix?: number) => string + +1.e3?.toString(); +>1.e3?.toString() : string +>1.e3?.toString : (radix?: number) => string +>1.e3 : 1000 +>toString : (radix?: number) => string + +""?.toString(); +>""?.toString() : string +>""?.toString : () => string +>"" : "" +>toString : () => string + +''?.toString(); +>''?.toString() : string +>''?.toString : () => string +>'' : "" +>toString : () => string + +``?.toString(); +>``?.toString() : string +>``?.toString : () => string +>`` : string +>toString : () => string + +/./?.toString(); +>/./?.toString() : string +>/./?.toString : () => string +>/./ : RegExp +>toString : () => string + +/./g?.toString(); +>/./g?.toString() : string +>/./g?.toString : () => string +>/./g : RegExp +>toString : () => string + +true?.toString(); +>true?.toString() : string +>true?.toString : () => string +>true : true +>toString : () => string + +false?.toString(); +>false?.toString() : string +>false?.toString : () => string +>false : false +>toString : () => string + +// templates +`${x?.y}`; +>`${x?.y}` : string +>x?.y : any +>x : any +>y : any + +// variables +var v = x?.y; +>v : any +>x?.y : any +>x : any +>y : any + +var [v] = x?.y; +>v : any +>x?.y : any +>x : any +>y : any + +var [v = x?.y] = [1]; +>v : any +>x?.y : any +>x : any +>y : any +>[1] : [number] +>1 : 1 + +var {v} = x?.y; +>v : any +>x?.y : any +>x : any +>y : any + +var {v = x?.y} = {v:1}; +>v : any +>x?.y : any +>x : any +>y : any +>{v:1} : { v?: number; } +>v : number +>1 : 1 + +var {[x?.y]: v} = null; +>x?.y : any +>x : any +>y : any +>v : any +>null : null + +// if/else if +if (x?.y) {} +>x?.y : any +>x : any +>y : any + +if (1) {} else if (x?.y) {} +>1 : 1 +>x?.y : any +>x : any +>y : any + +// switch +switch (x?.y) {} +>x?.y : any +>x : any +>y : any + +switch (1) { case x?.y: break; } +>1 : 1 +>x?.y : any +>x : any +>y : any + +// do/while +do {} while (x?.y) +>x?.y : any +>x : any +>y : any + +while (x?.y) {} +>x?.y : any +>x : any +>y : any + +// for +for (x?.y; x?.y; x?.y); +>x?.y : any +>x : any +>y : any +>x?.y : any +>x : any +>y : any +>x?.y : any +>x : any +>y : any + +// for..in +for (x?.y in {}); +>x?.y : any +>x : any +>y : any +>{} : {} + +// for..of +for (x?.y of []); +>x?.y : any +>x : any +>y : any +>[] : undefined[] + +// enums +enum E { +>E : E + + a = x?.y +>a : E +>x?.y : any +>x : any +>y : any +} + +=== tests/cases/conformance/emitter/es3/safeNavigation/exportsOk.ts === +export default x?.y; +>x?.y : any +>x : any +>y : any + diff --git a/tests/baselines/reference/emitter.safeNavigation.es5.js b/tests/baselines/reference/emitter.safeNavigation.es5.js new file mode 100644 index 00000000000..e2f9199f63f --- /dev/null +++ b/tests/baselines/reference/emitter.safeNavigation.es5.js @@ -0,0 +1,874 @@ +//// [tests/cases/conformance/emitter/es5/safeNavigation/emitter.safeNavigation.es5.ts] //// + +//// [declarations.d.ts] +declare var x: any; +declare var y: any; +declare var f: ({ + (): void; + (): void; + new (): any; + new (): any; +}) | undefined; +declare var o: { y: typeof f; } +declare class Base { x(): any; } +declare namespace M { + export class y {} + export class z {} +} +//// [propertyAccessOk.ts] +x.y +x?.y +x?.y.z +x.y?.z +x?.y?.z +//// [elementAccessOk.ts] +x["y"] +x?.["y"] +x?.["y"]["z"] +x["y"]?.["z"] +x?.["y"]?.["z"] +//// [callExpressionOk.ts] +x() +x?.() +x.y?.() +x["y"]?.() +f?.() +o.y?.() +o["y"]?.() +//// [newExpressionOk.ts] +new x() +new x.y?.() +new x["y"]?.() +new f?.() +new o.y?.() +new o["y"]?.() +//// [mixedOk.ts] +x?.y?.["z"] +x?.["y"]?.z +x?.y() +x?.y?.() +o?.y() +o?.y?.() +x?.["z"]() +x?.["z"]?.() +o?.["y"]() +o?.["y"]?.() +//// [mutationOk.ts] +x?.y = 1 +x?.y += 1; +x?.y -= 1; +x?.y *= 1; +x?.y /= 1; +x?.y %= 1; +x?.y **= 1; +x?.y |= 1; +x?.y &= 1; +x?.y ^= 1; +x?.y <<= 1; +x?.y >>= 1; +x?.y >>>= 1; +x?.y++; +x?.y--; +++x?.y; +--x?.y; +delete x?.y; +x?.["y"] = 1 +x?.["y"] += 1; +x?.["y"] -= 1; +x?.["y"] *= 1; +x?.["y"] /= 1; +x?.["y"] %= 1; +x?.["y"] **= 1; +x?.["y"] |= 1; +x?.["y"] &= 1; +x?.["y"] ^= 1; +x?.["y"] <<= 1; +x?.["y"] >>= 1; +x?.["y"] >>>= 1; +x?.["y"]++; +x?.["y"]--; +++x?.["y"]; +--x?.["y"]; +delete x?.["y"]; +//// [arrayAssignmentPatternOk.ts] +[x?.y] = [1]; +[x?.["y"]] = [1]; +[...x?.y] = [1]; +[...x?.["y"]] = [1]; +//// [objectAssignmentPatternOk.ts] +({ a: x?.y } = { a: 1 }); +({ a: x?.["y"] } = { a: 1 }); +//// [questionDotDigitIsConditionalOk.ts] +x?.3:1; +//// [superPropertyInvocationOk.ts] +// supported for invocation of super property +void class extends Base { + m() { + super.x?.(); + } +} + +//// [generalParsingOk.ts] +// object literals +// - computed property names +void { [x?.y]: 1 } +void { [x?.["y"]]: 1 } +void { [x?.()]: 1 } +void { [new x?.()]: 1 } +// - property assignments +void { a: x?.y } +void { a: x?.["y"] } +void { a: x?.() } +void { a: new x?.() } + +// classes +// - computed property names +// void class { [x?.y] = 1 } // legal parse, but causes a checker error +// void class { [x?.["y"]] = 1 } // legal parse, but causes a checker error +// void class { [x?.()] = 1 } // legal parse, but causes a checker error +// void class { [new f?.()] = 1 } // legal parse, but causes a checker error +void class { [Symbol?.toStringTag] = "" } +// - property declarations +void class { a = x?.y } +void class { a = x?.["y"] } +void class { a = x?.() } +void class { a = new x?.() } +// - heritage clauses +void class extends M?.y {} +void class extends M?.["y"] {} +void class extends M?.z {} +// - class decorators +@x?.y class C1 {} +@x?.["y"] class C2 {} +@x?.() class C3 {} +@new x?.() class C4 {} +// - member decorators +class C5 { @x?.y m() {} } +class C6 { @x?.["y"] m() {} } // allowed as ?.[ is not ambiguous with computed property names +class C7 { @x?.() m() {} } +class C8 { @new x?.() m () {} } +// - parameter decorators +class C9 { m(@x?.y a) {} } +class C10 { m(@x?.["y"] a) {} } +class C11 { m(@x?.() a) {} } +class C12 { m(@new x?.() a) {} } + +// functions +// - parameters +void function (a = x?.y) {} +void function (a = x?.["y"]) {} +void function (a = x?.()) {} +void function (a = new x?.()) {} +// - binding elements +// - initializers +void function ({ a = x?.y }) {} +void function ({ a = x?.["y"] }) {} +void function ({ a = x?.() }) {} +void function ({ a = new x?.() }) {} +// - computed properties +void function ({ [x?.y]: a }) {} +void function ({ [x?.["y"]]: a }) {} +void function ({ [x?.()]: a }) {} +void function ({ [new x?.()]: a }) {} + +// arrow functions +// - parameters +((a = x?.y) => {}); +((a = x?.["y"]) => {}); +((a = x?.()) => {}); +((a = new x?.()) => {}); +// - expression bodies +(() => x?.y); +(() => x?.["y"]); +(() => x?.()); +(() => new x?.()); + +// parenthesis +(x?.y); + +// comma +x?.y, f(); +f(), x?.y; + +// conditional +x?.y ? 0 : 1 +0 ? x?.y : 1; +0 ? 1 : x?.y; + +// binary +x?.y + 1; +x?.y - 1; +x?.y * 1; +x?.y / 1; +x?.y ** 1; +x?.y % 1; +x?.y ^ 1; +x?.y & 1; +x?.y | 1; +x?.y << 1; +x?.y >> 1; +x?.y >>> 1; +x?.y && 1; +x?.y || 1; +x?.y == 1; +x?.y === 1; +x?.y != 1; +x?.y !== 1; +x?.y < 1; +x?.y <= 1; +x?.y > 1; +x?.y >= 1; +1 + x?.y; +1 - x?.y; +1 * x?.y; +1 / x?.y; +1 ** x?.y; +1 % x?.y; +1 ^ x?.y; +1 & x?.y; +1 | x?.y; +1 << x?.y; +1 >> x?.y; +1 >>> x?.y; +1 && x?.y; +1 || x?.y; +1 == x?.y; +1 === x?.y; +1 != x?.y; +1 !== x?.y; +1 < x?.y; +1 <= x?.y; +1 > x?.y; +1 >= x?.y; + +// prefix unary ++x?.y; +-x?.y; +!x?.y; +~x?.y; + +// unary +void x?.y; +typeof x?.y; +void function * () { yield x?.y; } +void async function() { await x?.y; } + +// notnull +x?.y!.z; + +// assertions +x?.y; +x?.y as string; + +// array literals +[x?.y]; +[, x?.y]; +[...x?.y]; + +// literals +1?.toString(); // no need for `..` +1.?.toString(); +.0?.toString(); +4e3?.toString(); +1.e3?.toString(); +""?.toString(); +''?.toString(); +``?.toString(); +/./?.toString(); +/./g?.toString(); +true?.toString(); +false?.toString(); + +// templates +`${x?.y}`; + +// variables +var v = x?.y; +var [v] = x?.y; +var [v = x?.y] = [1]; +var {v} = x?.y; +var {v = x?.y} = {v:1}; +var {[x?.y]: v} = null; + +// if/else if +if (x?.y) {} +if (1) {} else if (x?.y) {} + +// switch +switch (x?.y) {} +switch (1) { case x?.y: break; } + +// do/while +do {} while (x?.y) +while (x?.y) {} + +// for +for (x?.y; x?.y; x?.y); + +// for..in +for (x?.y in {}); + +// for..of +for (x?.y of []); + +// enums +enum E { + a = x?.y +} + +//// [exportsOk.ts] +export default x?.y; + +//// [propertyAccessOk.js] +x.y; +x == null ? void 0 : x.y; +(x == null ? void 0 : x.y).z; +(_a = x.y) == null ? void 0 : _a.z; +(_b = x == null ? void 0 : x.y) == null ? void 0 : _b.z; +var _a, _b; +//// [elementAccessOk.js] +x["y"]; +x == null ? void 0 : x["y"]; +(x == null ? void 0 : x["y"])["z"]; +(_a = x["y"]) == null ? void 0 : _a["z"]; +(_b = x == null ? void 0 : x["y"]) == null ? void 0 : _b["z"]; +var _a, _b; +//// [callExpressionOk.js] +x(); +x == null ? void 0 : x(); +(_a = x.y) == null ? void 0 : _a.call(x); +(_b = x["y"]) == null ? void 0 : _b.call(x); +f == null ? void 0 : f(); +(_c = o.y) == null ? void 0 : _c.call(o); +(_d = o["y"]) == null ? void 0 : _d.call(o); +var _a, _b, _c, _d; +//// [newExpressionOk.js] +new x(); +(_a = x.y) == null ? void 0 : new _a(); +(_b = x["y"]) == null ? void 0 : new _b(); +f == null ? void 0 : new f(); +(_c = o.y) == null ? void 0 : new _c(); +(_d = o["y"]) == null ? void 0 : new _d(); +var _a, _b, _c, _d; +//// [mixedOk.js] +(_a = x == null ? void 0 : x.y) == null ? void 0 : _a["z"]; +(_b = x == null ? void 0 : x["y"]) == null ? void 0 : _b.z; +(x == null ? void 0 : x.y)(); +(_c = x == null ? void 0 : x.y) == null ? void 0 : _c.call(x); +(o == null ? void 0 : o.y)(); +(_d = o == null ? void 0 : o.y) == null ? void 0 : _d.call(o); +(x == null ? void 0 : x["z"])(); +(_e = x == null ? void 0 : x["z"]) == null ? void 0 : _e.call(x); +(o == null ? void 0 : o["y"])(); +(_f = o == null ? void 0 : o["y"]) == null ? void 0 : _f.call(o); +var _a, _b, _c, _d, _e, _f; +//// [mutationOk.js] +_a = 1, x == null ? _a : x.y = _a; +_b = 1, x == null ? _b : x.y += _b; +_c = 1, x == null ? _c : x.y -= _c; +_d = 1, x == null ? _d : x.y *= _d; +_e = 1, x == null ? _e : x.y /= _e; +_f = 1, x == null ? _f : x.y %= _f; +_g = 1, x == null ? _g : (_h = x).y = Math.pow(_h.y, _g); +_j = 1, x == null ? _j : x.y |= _j; +_k = 1, x == null ? _k : x.y &= _k; +_l = 1, x == null ? _l : x.y ^= _l; +_m = 1, x == null ? _m : x.y <<= _m; +_o = 1, x == null ? _o : x.y >>= _o; +_p = 1, x == null ? _p : x.y >>>= _p; +x == null ? void 0 : x.y++; +x == null ? void 0 : x.y--; +x == null ? void 0 : ++x.y; +x == null ? void 0 : --x.y; +x == null ? true : delete x.y; +_q = 1, x == null ? _q : x["y"] = _q; +_r = 1, x == null ? _r : x["y"] += _r; +_s = 1, x == null ? _s : x["y"] -= _s; +_t = 1, x == null ? _t : x["y"] *= _t; +_u = 1, x == null ? _u : x["y"] /= _u; +_v = 1, x == null ? _v : x["y"] %= _v; +_w = 1, x == null ? _w : (_x = x)[_y = "y"] = Math.pow(_x[_y], _w); +_z = 1, x == null ? _z : x["y"] |= _z; +_0 = 1, x == null ? _0 : x["y"] &= _0; +_1 = 1, x == null ? _1 : x["y"] ^= _1; +_2 = 1, x == null ? _2 : x["y"] <<= _2; +_3 = 1, x == null ? _3 : x["y"] >>= _3; +_4 = 1, x == null ? _4 : x["y"] >>>= _4; +x == null ? void 0 : x["y"]++; +x == null ? void 0 : x["y"]--; +x == null ? void 0 : ++x["y"]; +x == null ? void 0 : --x["y"]; +x == null ? true : delete x["y"]; +var _a, _b, _c, _d, _e, _f, _g, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _z, _0, _1, _2, _3, _4; +var _h, _x, _y; +//// [arrayAssignmentPatternOk.js] +_a = [1], (x == null ? void 0 : x.y = _a[0], _a); +_b = [1], (x == null ? void 0 : x["y"] = _b[0], _b); +_c = [1], (x == null ? void 0 : x.y = _c.slice(0), _c); +_d = [1], (x == null ? void 0 : x["y"] = _d.slice(0), _d); +var _a, _b, _c, _d; +//// [objectAssignmentPatternOk.js] +(_a = { a: 1 }, (x == null ? void 0 : x.y = _a.a, _a)); +(_b = { a: 1 }, (x == null ? void 0 : x["y"] = _b.a, _b)); +var _a, _b; +//// [questionDotDigitIsConditionalOk.js] +x ? .3 : 1; +//// [superPropertyInvocationOk.js] +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +// supported for invocation of super property +void (function (_super) { + __extends(class_1, _super); + function class_1() { + return _super !== null && _super.apply(this, arguments) || this; + } + class_1.prototype.m = function () { + (_a = _super.prototype.x) == null ? void 0 : _a.call(this); + var _a; + }; + return class_1; +}(Base)); +//// [generalParsingOk.js] +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [0, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +// object literals +// - computed property names +void (_a = {}, _a[x == null ? void 0 : x.y] = 1, _a); +void (_b = {}, _b[x == null ? void 0 : x["y"]] = 1, _b); +void (_c = {}, _c[x == null ? void 0 : x()] = 1, _c); +void (_d = {}, _d[x == null ? void 0 : new x()] = 1, _d); +// - property assignments +void { a: x == null ? void 0 : x.y }; +void { a: x == null ? void 0 : x["y"] }; +void { a: x == null ? void 0 : x() }; +void { a: x == null ? void 0 : new x() }; +// classes +// - computed property names +// void class { [x?.y] = 1 } // legal parse, but causes a checker error +// void class { [x?.["y"]] = 1 } // legal parse, but causes a checker error +// void class { [x?.()] = 1 } // legal parse, but causes a checker error +// void class { [new f?.()] = 1 } // legal parse, but causes a checker error +void (function () { + function class_1() { + this[Symbol == null ? void 0 : Symbol.toStringTag] = ""; + } + return class_1; +}()); +// - property declarations +void (function () { + function class_2() { + this.a = x == null ? void 0 : x.y; + } + return class_2; +}()); +void (function () { + function class_3() { + this.a = x == null ? void 0 : x["y"]; + } + return class_3; +}()); +void (function () { + function class_4() { + this.a = x == null ? void 0 : x(); + } + return class_4; +}()); +void (function () { + function class_5() { + this.a = x == null ? void 0 : new x(); + } + return class_5; +}()); +// - heritage clauses +void (function (_super) { + __extends(class_6, _super); + function class_6() { + return _super !== null && _super.apply(this, arguments) || this; + } + return class_6; +}((M == null ? void 0 : M.y))); +void (function (_super) { + __extends(class_7, _super); + function class_7() { + return _super !== null && _super.apply(this, arguments) || this; + } + return class_7; +}((M == null ? void 0 : M["y"]))); +void (function (_super) { + __extends(class_8, _super); + function class_8() { + return _super !== null && _super.apply(this, arguments) || this; + } + return class_8; +}((M == null ? void 0 : M.z))); +// - class decorators +var C1 = (function () { + function C1() { + } + return C1; +}()); +C1 = __decorate([ + x == null ? void 0 : x.y +], C1); +var C2 = (function () { + function C2() { + } + return C2; +}()); +C2 = __decorate([ + x == null ? void 0 : x["y"] +], C2); +var C3 = (function () { + function C3() { + } + return C3; +}()); +C3 = __decorate([ + x == null ? void 0 : x() +], C3); +var C4 = (function () { + function C4() { + } + return C4; +}()); +C4 = __decorate([ + x == null ? void 0 : new x() +], C4); +// - member decorators +var C5 = (function () { + function C5() { + } + C5.prototype.m = function () { }; + return C5; +}()); +__decorate([ + x == null ? void 0 : x.y +], C5.prototype, "m", null); +var C6 = (function () { + function C6() { + } + C6.prototype.m = function () { }; + return C6; +}()); // allowed as ?.[ is not ambiguous with computed property names +__decorate([ + x == null ? void 0 : x["y"] +], C6.prototype, "m", null); +var C7 = (function () { + function C7() { + } + C7.prototype.m = function () { }; + return C7; +}()); +__decorate([ + x == null ? void 0 : x() +], C7.prototype, "m", null); +var C8 = (function () { + function C8() { + } + C8.prototype.m = function () { }; + return C8; +}()); +__decorate([ + x == null ? void 0 : new x() +], C8.prototype, "m", null); +// - parameter decorators +var C9 = (function () { + function C9() { + } + C9.prototype.m = function (a) { }; + return C9; +}()); +__decorate([ + __param(0, x == null ? void 0 : x.y) +], C9.prototype, "m", null); +var C10 = (function () { + function C10() { + } + C10.prototype.m = function (a) { }; + return C10; +}()); +__decorate([ + __param(0, x == null ? void 0 : x["y"]) +], C10.prototype, "m", null); +var C11 = (function () { + function C11() { + } + C11.prototype.m = function (a) { }; + return C11; +}()); +__decorate([ + __param(0, x == null ? void 0 : x()) +], C11.prototype, "m", null); +var C12 = (function () { + function C12() { + } + C12.prototype.m = function (a) { }; + return C12; +}()); +__decorate([ + __param(0, x == null ? void 0 : new x()) +], C12.prototype, "m", null); +// functions +// - parameters +void function (a) { + if (a === void 0) { a = x == null ? void 0 : x.y; } +}; +void function (a) { + if (a === void 0) { a = x == null ? void 0 : x["y"]; } +}; +void function (a) { + if (a === void 0) { a = x == null ? void 0 : x(); } +}; +void function (a) { + if (a === void 0) { a = x == null ? void 0 : new x(); } +}; +// - binding elements +// - initializers +void function (_a) { + var _b = _a.a, a = _b === void 0 ? x == null ? void 0 : x.y : _b; +}; +void function (_a) { + var _b = _a.a, a = _b === void 0 ? x == null ? void 0 : x["y"] : _b; +}; +void function (_a) { + var _b = _a.a, a = _b === void 0 ? x == null ? void 0 : x() : _b; +}; +void function (_a) { + var _b = _a.a, a = _b === void 0 ? x == null ? void 0 : new x() : _b; +}; +// - computed properties +void function (_a) { + var _b = x == null ? void 0 : x.y, a = _a[_b]; +}; +void function (_a) { + var _b = x == null ? void 0 : x["y"], a = _a[_b]; +}; +void function (_a) { + var _b = x == null ? void 0 : x(), a = _a[_b]; +}; +void function (_a) { + var _b = x == null ? void 0 : new x(), a = _a[_b]; +}(function (a) { + if (a === void 0) { a = x == null ? void 0 : x.y; } +}); +(function (a) { + if (a === void 0) { a = x == null ? void 0 : x["y"]; } +}); +(function (a) { + if (a === void 0) { a = x == null ? void 0 : x(); } +}); +(function (a) { + if (a === void 0) { a = x == null ? void 0 : new x(); } +}); +// - expression bodies +(function () { return x == null ? void 0 : x.y; }); +(function () { return x == null ? void 0 : x["y"]; }); +(function () { return x == null ? void 0 : x(); }); +(function () { return x == null ? void 0 : new x(); }); +// parenthesis +(x == null ? void 0 : x.y); +// comma +x == null ? void 0 : x.y, f(); +f(), x == null ? void 0 : x.y; +// conditional +x == null ? void 0 : x.y ? 0 : 1; +0 ? x == null ? void 0 : x.y : 1; +0 ? 1 : x == null ? void 0 : x.y; +// binary +(x == null ? void 0 : x.y) + 1; +(x == null ? void 0 : x.y) - 1; +(x == null ? void 0 : x.y) * 1; +(x == null ? void 0 : x.y) / 1; +Math.pow((x == null ? void 0 : x.y), 1); +(x == null ? void 0 : x.y) % 1; +(x == null ? void 0 : x.y) ^ 1; +(x == null ? void 0 : x.y) & 1; +(x == null ? void 0 : x.y) | 1; +(x == null ? void 0 : x.y) << 1; +(x == null ? void 0 : x.y) >> 1; +(x == null ? void 0 : x.y) >>> 1; +(x == null ? void 0 : x.y) && 1; +(x == null ? void 0 : x.y) || 1; +(x == null ? void 0 : x.y) == 1; +(x == null ? void 0 : x.y) === 1; +(x == null ? void 0 : x.y) != 1; +(x == null ? void 0 : x.y) !== 1; +(x == null ? void 0 : x.y) < 1; +(x == null ? void 0 : x.y) <= 1; +(x == null ? void 0 : x.y) > 1; +(x == null ? void 0 : x.y) >= 1; +1 + (x == null ? void 0 : x.y); +1 - (x == null ? void 0 : x.y); +1 * (x == null ? void 0 : x.y); +1 / (x == null ? void 0 : x.y); +Math.pow(1, (x == null ? void 0 : x.y)); +1 % (x == null ? void 0 : x.y); +1 ^ (x == null ? void 0 : x.y); +1 & (x == null ? void 0 : x.y); +1 | (x == null ? void 0 : x.y); +1 << (x == null ? void 0 : x.y); +1 >> (x == null ? void 0 : x.y); +1 >>> (x == null ? void 0 : x.y); +1 && (x == null ? void 0 : x.y); +1 || (x == null ? void 0 : x.y); +1 == (x == null ? void 0 : x.y); +1 === (x == null ? void 0 : x.y); +1 != (x == null ? void 0 : x.y); +1 !== (x == null ? void 0 : x.y); +1 < (x == null ? void 0 : x.y); +1 <= (x == null ? void 0 : x.y); +1 > (x == null ? void 0 : x.y); +1 >= (x == null ? void 0 : x.y); +// prefix unary ++(x == null ? void 0 : x.y); +-(x == null ? void 0 : x.y); +!(x == null ? void 0 : x.y); +~(x == null ? void 0 : x.y); +// unary +void (x == null ? void 0 : x.y); +typeof (x == null ? void 0 : x.y); +void function () { return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, x == null ? void 0 : x.y]; + case 1: + _a.sent(); + return [2 /*return*/]; + } +}); }; +void function () { + return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, (x == null ? void 0 : x.y)]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); }); +}; +// notnull +(x == null ? void 0 : x.y).z; +// assertions +x == null ? void 0 : x.y; +x == null ? void 0 : x.y; +// array literals +[x == null ? void 0 : x.y]; +[, x == null ? void 0 : x.y]; +(x == null ? void 0 : x.y).slice(); +// literals +((_e = 1) == null ? void 0 : _e.toString)(); // no need for `..` +((_f = 1.) == null ? void 0 : _f.toString)(); +((_g = .0) == null ? void 0 : _g.toString)(); +((_h = 4e3) == null ? void 0 : _h.toString)(); +((_j = 1.e3) == null ? void 0 : _j.toString)(); +((_k = "") == null ? void 0 : _k.toString)(); +((_l = '') == null ? void 0 : _l.toString)(); +((_m = "") == null ? void 0 : _m.toString)(); +((_o = /./) == null ? void 0 : _o.toString)(); +((_p = /./g) == null ? void 0 : _p.toString)(); +((_q = true) == null ? void 0 : _q.toString)(); +((_r = false) == null ? void 0 : _r.toString)(); +// templates +"" + (x == null ? void 0 : x.y); +// variables +var v = x == null ? void 0 : x.y; +var v = (x == null ? void 0 : x.y)[0]; +var _s = [1][0], v = _s === void 0 ? x == null ? void 0 : x.y : _s; +var v = (x == null ? void 0 : x.y).v; +var _t = { v: 1 }.v, v = _t === void 0 ? x == null ? void 0 : x.y : _t; +var _u = x == null ? void 0 : x.y, v = null[_u]; +// if/else if +if (x == null ? void 0 : x.y) { } +if (1) { } +else if (x == null ? void 0 : x.y) { } +// switch +switch (x == null ? void 0 : x.y) { +} +switch (1) { + case x == null ? void 0 : x.y: break; +} +// do/while +do { } while (x == null ? void 0 : x.y); +while (x == null ? void 0 : x.y) { } +// for +for (x == null ? void 0 : x.y; x == null ? void 0 : x.y; x == null ? void 0 : x.y) + ; +// for..in +for ({ set value(_a) { x == null ? _a : x.y = _a; } }.value in {}) + ; +// for..of +for (var _i = 0, _v = []; _i < _v.length; _i++) { + var _w = _v[_i]; + x == null ? _w : x.y = _w; + ; +} +// enums +var E; +(function (E) { + E[E["a"] = x == null ? void 0 : x.y] = "a"; +})(E || (E = {})); +var _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _w; +var _a, _b, _c, _d; +//// [exportsOk.js] +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = x == null ? void 0 : x.y; diff --git a/tests/baselines/reference/emitter.safeNavigation.es5.symbols b/tests/baselines/reference/emitter.safeNavigation.es5.symbols new file mode 100644 index 00000000000..1b91bcf4987 --- /dev/null +++ b/tests/baselines/reference/emitter.safeNavigation.es5.symbols @@ -0,0 +1,858 @@ +=== tests/cases/conformance/emitter/es5/safeNavigation/declarations.d.ts === +declare var x: any; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +declare var y: any; +>y : Symbol(y, Decl(declarations.d.ts, 1, 11)) + +declare var f: ({ +>f : Symbol(f, Decl(declarations.d.ts, 2, 11)) + + (): void; + (): void; +>T : Symbol(T, Decl(declarations.d.ts, 4, 5)) + + new (): any; + new (): any; +>T : Symbol(T, Decl(declarations.d.ts, 6, 9)) + +}) | undefined; +declare var o: { y: typeof f; } +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>y : Symbol(y, Decl(declarations.d.ts, 8, 16)) +>f : Symbol(f, Decl(declarations.d.ts, 2, 11)) + +declare class Base { x(): any; } +>Base : Symbol(Base, Decl(declarations.d.ts, 8, 31)) +>x : Symbol(Base.x, Decl(declarations.d.ts, 9, 20)) + +declare namespace M { +>M : Symbol(M, Decl(declarations.d.ts, 9, 32)) + + export class y {} +>y : Symbol(y, Decl(declarations.d.ts, 10, 21)) + + export class z {} +>z : Symbol(z, Decl(declarations.d.ts, 11, 21)) +>T : Symbol(T, Decl(declarations.d.ts, 12, 19)) +} +=== tests/cases/conformance/emitter/es5/safeNavigation/propertyAccessOk.ts === +x.y +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y.z +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x.y?.z +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y?.z +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +=== tests/cases/conformance/emitter/es5/safeNavigation/elementAccessOk.ts === +x["y"] +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"]["z"] +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x["y"]?.["z"] +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"]?.["z"] +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +=== tests/cases/conformance/emitter/es5/safeNavigation/callExpressionOk.ts === +x() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x.y?.() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x["y"]?.() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +f?.() +>f : Symbol(f, Decl(declarations.d.ts, 2, 11)) + +o.y?.() +>o.y : Symbol(y, Decl(declarations.d.ts, 8, 16)) +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>y : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +o["y"]?.() +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>"y" : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +=== tests/cases/conformance/emitter/es5/safeNavigation/newExpressionOk.ts === +new x() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +new x.y?.() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +new x["y"]?.() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +new f?.() +>f : Symbol(f, Decl(declarations.d.ts, 2, 11)) + +new o.y?.() +>o.y : Symbol(y, Decl(declarations.d.ts, 8, 16)) +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>y : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +new o["y"]?.() +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>"y" : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +=== tests/cases/conformance/emitter/es5/safeNavigation/mixedOk.ts === +x?.y?.["z"] +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"]?.z +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y?.() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +o?.y() +>o?.y : Symbol(y, Decl(declarations.d.ts, 8, 16)) +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>y : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +o?.y?.() +>o?.y : Symbol(y, Decl(declarations.d.ts, 8, 16)) +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>y : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +x?.["z"]() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["z"]?.() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +o?.["y"]() +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>"y" : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +o?.["y"]?.() +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>"y" : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +=== tests/cases/conformance/emitter/es5/safeNavigation/mutationOk.ts === +x?.y = 1 +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y += 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y -= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y *= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y /= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y %= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y **= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y |= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y &= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y ^= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y <<= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y >>= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y >>>= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y++; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y--; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +++x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +--x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +delete x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] = 1 +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] += 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] -= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] *= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] /= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] %= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] **= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] |= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] &= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] ^= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] <<= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] >>= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] >>>= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"]++; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"]--; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +++x?.["y"]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +--x?.["y"]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +delete x?.["y"]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +=== tests/cases/conformance/emitter/es5/safeNavigation/arrayAssignmentPatternOk.ts === +[x?.y] = [1]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +[x?.["y"]] = [1]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +[...x?.y] = [1]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +[...x?.["y"]] = [1]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +=== tests/cases/conformance/emitter/es5/safeNavigation/objectAssignmentPatternOk.ts === +({ a: x?.y } = { a: 1 }); +>a : Symbol(a, Decl(objectAssignmentPatternOk.ts, 0, 2)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(objectAssignmentPatternOk.ts, 0, 16)) + +({ a: x?.["y"] } = { a: 1 }); +>a : Symbol(a, Decl(objectAssignmentPatternOk.ts, 1, 2)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(objectAssignmentPatternOk.ts, 1, 20)) + +=== tests/cases/conformance/emitter/es5/safeNavigation/questionDotDigitIsConditionalOk.ts === +x?.3:1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +=== tests/cases/conformance/emitter/es5/safeNavigation/superPropertyInvocationOk.ts === +// supported for invocation of super property +void class extends Base { +>Base : Symbol(Base, Decl(declarations.d.ts, 8, 31)) + + m() { +>m : Symbol((Anonymous class).m, Decl(superPropertyInvocationOk.ts, 1, 25)) + + super.x?.(); +>super.x : Symbol(Base.x, Decl(declarations.d.ts, 9, 20)) +>super : Symbol(Base, Decl(declarations.d.ts, 8, 31)) +>x : Symbol(Base.x, Decl(declarations.d.ts, 9, 20)) + } +} + +=== tests/cases/conformance/emitter/es5/safeNavigation/generalParsingOk.ts === +// object literals +// - computed property names +void { [x?.y]: 1 } +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void { [x?.["y"]]: 1 } +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void { [x?.()]: 1 } +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void { [new x?.()]: 1 } +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// - property assignments +void { a: x?.y } +>a : Symbol(a, Decl(generalParsingOk.ts, 7, 6)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void { a: x?.["y"] } +>a : Symbol(a, Decl(generalParsingOk.ts, 8, 6)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void { a: x?.() } +>a : Symbol(a, Decl(generalParsingOk.ts, 9, 6)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void { a: new x?.() } +>a : Symbol(a, Decl(generalParsingOk.ts, 10, 6)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// classes +// - computed property names +// void class { [x?.y] = 1 } // legal parse, but causes a checker error +// void class { [x?.["y"]] = 1 } // legal parse, but causes a checker error +// void class { [x?.()] = 1 } // legal parse, but causes a checker error +// void class { [new f?.()] = 1 } // legal parse, but causes a checker error +void class { [Symbol?.toStringTag] = "" } +>Symbol?.toStringTag : Symbol(SymbolConstructor.toStringTag, Decl(lib.es2015.symbol.wellknown.d.ts, --, --)) +>Symbol : Symbol(Symbol, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.symbol.d.ts, --, --), Decl(lib.es2015.symbol.d.ts, --, --)) +>toStringTag : Symbol(SymbolConstructor.toStringTag, Decl(lib.es2015.symbol.wellknown.d.ts, --, --)) + +// - property declarations +void class { a = x?.y } +>a : Symbol((Anonymous class).a, Decl(generalParsingOk.ts, 20, 12)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void class { a = x?.["y"] } +>a : Symbol((Anonymous class).a, Decl(generalParsingOk.ts, 21, 12)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void class { a = x?.() } +>a : Symbol((Anonymous class).a, Decl(generalParsingOk.ts, 22, 12)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void class { a = new x?.() } +>a : Symbol((Anonymous class).a, Decl(generalParsingOk.ts, 23, 12)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// - heritage clauses +void class extends M?.y {} +>M?.y : Symbol(M.y, Decl(declarations.d.ts, 10, 21)) +>M : Symbol(M, Decl(declarations.d.ts, 9, 32)) +>y : Symbol(M.y, Decl(declarations.d.ts, 10, 21)) + +void class extends M?.["y"] {} +>M : Symbol(M, Decl(declarations.d.ts, 9, 32)) +>"y" : Symbol(M.y, Decl(declarations.d.ts, 10, 21)) + +void class extends M?.z {} +>M?.z : Symbol(M.z, Decl(declarations.d.ts, 11, 21)) +>M : Symbol(M, Decl(declarations.d.ts, 9, 32)) +>z : Symbol(M.z, Decl(declarations.d.ts, 11, 21)) + +// - class decorators +@x?.y class C1 {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>C1 : Symbol(C1, Decl(generalParsingOk.ts, 27, 34)) + +@x?.["y"] class C2 {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>C2 : Symbol(C2, Decl(generalParsingOk.ts, 29, 17)) + +@x?.() class C3 {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>C3 : Symbol(C3, Decl(generalParsingOk.ts, 30, 21)) + +@new x?.() class C4 {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>C4 : Symbol(C4, Decl(generalParsingOk.ts, 31, 18)) + +// - member decorators +class C5 { @x?.y m() {} } +>C5 : Symbol(C5, Decl(generalParsingOk.ts, 32, 22)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>m : Symbol(C5.m, Decl(generalParsingOk.ts, 34, 10)) + +class C6 { @x?.["y"] m() {} } // allowed as ?.[ is not ambiguous with computed property names +>C6 : Symbol(C6, Decl(generalParsingOk.ts, 34, 25)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>m : Symbol(C6.m, Decl(generalParsingOk.ts, 35, 10)) + +class C7 { @x?.() m() {} } +>C7 : Symbol(C7, Decl(generalParsingOk.ts, 35, 29)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>m : Symbol(C7.m, Decl(generalParsingOk.ts, 36, 10)) + +class C8 { @new x?.() m () {} } +>C8 : Symbol(C8, Decl(generalParsingOk.ts, 36, 26)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>m : Symbol(C8.m, Decl(generalParsingOk.ts, 37, 10)) + +// - parameter decorators +class C9 { m(@x?.y a) {} } +>C9 : Symbol(C9, Decl(generalParsingOk.ts, 37, 31)) +>m : Symbol(C9.m, Decl(generalParsingOk.ts, 39, 10)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 39, 13)) + +class C10 { m(@x?.["y"] a) {} } +>C10 : Symbol(C10, Decl(generalParsingOk.ts, 39, 26)) +>m : Symbol(C10.m, Decl(generalParsingOk.ts, 40, 11)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 40, 14)) + +class C11 { m(@x?.() a) {} } +>C11 : Symbol(C11, Decl(generalParsingOk.ts, 40, 31)) +>m : Symbol(C11.m, Decl(generalParsingOk.ts, 41, 11)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 41, 14)) + +class C12 { m(@new x?.() a) {} } +>C12 : Symbol(C12, Decl(generalParsingOk.ts, 41, 28)) +>m : Symbol(C12.m, Decl(generalParsingOk.ts, 42, 11)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 42, 14)) + +// functions +// - parameters +void function (a = x?.y) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 46, 15)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void function (a = x?.["y"]) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 47, 15)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void function (a = x?.()) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 48, 15)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void function (a = new x?.()) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 49, 15)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// - binding elements +// - initializers +void function ({ a = x?.y }) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 52, 16)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void function ({ a = x?.["y"] }) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 53, 16)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void function ({ a = x?.() }) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 54, 16)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void function ({ a = new x?.() }) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 55, 16)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// - computed properties +void function ({ [x?.y]: a }) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 57, 16)) + +void function ({ [x?.["y"]]: a }) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 58, 16)) + +void function ({ [x?.()]: a }) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 59, 16)) + +void function ({ [new x?.()]: a }) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 60, 16)) + +// arrow functions +// - parameters +((a = x?.y) => {}); +>a : Symbol(a, Decl(generalParsingOk.ts, 64, 2)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +((a = x?.["y"]) => {}); +>a : Symbol(a, Decl(generalParsingOk.ts, 65, 2)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +((a = x?.()) => {}); +>a : Symbol(a, Decl(generalParsingOk.ts, 66, 2)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +((a = new x?.()) => {}); +>a : Symbol(a, Decl(generalParsingOk.ts, 67, 2)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// - expression bodies +(() => x?.y); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +(() => x?.["y"]); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +(() => x?.()); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +(() => new x?.()); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// parenthesis +(x?.y); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// comma +x?.y, f(); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>f : Symbol(f, Decl(declarations.d.ts, 2, 11)) + +f(), x?.y; +>f : Symbol(f, Decl(declarations.d.ts, 2, 11)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// conditional +x?.y ? 0 : 1 +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +0 ? x?.y : 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +0 ? 1 : x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// binary +x?.y + 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y - 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y * 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y / 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y ** 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y % 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y ^ 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y & 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y | 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y << 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y >> 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y >>> 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y && 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y || 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y == 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y === 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y != 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y !== 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y < 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y <= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y > 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y >= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 + x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 - x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 * x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 / x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 ** x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 % x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 ^ x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 & x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 | x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 << x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 >> x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 >>> x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 && x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 || x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 == x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 === x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 != x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 !== x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 < x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 <= x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 > x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 >= x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// prefix unary ++x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +-x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +!x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +~x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// unary +void x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +typeof x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void function * () { yield x?.y; } +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void async function() { await x?.y; } +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// notnull +x?.y!.z; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// assertions +x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y as string; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// array literals +[x?.y]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +[, x?.y]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +[...x?.y]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// literals +1?.toString(); // no need for `..` +>1?.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) + +1.?.toString(); +>1.?.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) + +.0?.toString(); +>.0?.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) + +4e3?.toString(); +>4e3?.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) + +1.e3?.toString(); +>1.e3?.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) + +""?.toString(); +>""?.toString : Symbol(String.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(String.toString, Decl(lib.es5.d.ts, --, --)) + +''?.toString(); +>''?.toString : Symbol(String.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(String.toString, Decl(lib.es5.d.ts, --, --)) + +``?.toString(); +>``?.toString : Symbol(String.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(String.toString, Decl(lib.es5.d.ts, --, --)) + +/./?.toString(); +>/./?.toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) + +/./g?.toString(); +>/./g?.toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) + +true?.toString(); +>true?.toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) + +false?.toString(); +>false?.toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) + +// templates +`${x?.y}`; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// variables +var v = x?.y; +>v : Symbol(v, Decl(generalParsingOk.ts, 174, 3), Decl(generalParsingOk.ts, 175, 5), Decl(generalParsingOk.ts, 176, 5), Decl(generalParsingOk.ts, 177, 5), Decl(generalParsingOk.ts, 178, 5), Decl(generalParsingOk.ts, 179, 5)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +var [v] = x?.y; +>v : Symbol(v, Decl(generalParsingOk.ts, 174, 3), Decl(generalParsingOk.ts, 175, 5), Decl(generalParsingOk.ts, 176, 5), Decl(generalParsingOk.ts, 177, 5), Decl(generalParsingOk.ts, 178, 5), Decl(generalParsingOk.ts, 179, 5)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +var [v = x?.y] = [1]; +>v : Symbol(v, Decl(generalParsingOk.ts, 174, 3), Decl(generalParsingOk.ts, 175, 5), Decl(generalParsingOk.ts, 176, 5), Decl(generalParsingOk.ts, 177, 5), Decl(generalParsingOk.ts, 178, 5), Decl(generalParsingOk.ts, 179, 5)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +var {v} = x?.y; +>v : Symbol(v, Decl(generalParsingOk.ts, 174, 3), Decl(generalParsingOk.ts, 175, 5), Decl(generalParsingOk.ts, 176, 5), Decl(generalParsingOk.ts, 177, 5), Decl(generalParsingOk.ts, 178, 5), Decl(generalParsingOk.ts, 179, 5)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +var {v = x?.y} = {v:1}; +>v : Symbol(v, Decl(generalParsingOk.ts, 174, 3), Decl(generalParsingOk.ts, 175, 5), Decl(generalParsingOk.ts, 176, 5), Decl(generalParsingOk.ts, 177, 5), Decl(generalParsingOk.ts, 178, 5), Decl(generalParsingOk.ts, 179, 5)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>v : Symbol(v, Decl(generalParsingOk.ts, 178, 18)) + +var {[x?.y]: v} = null; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>v : Symbol(v, Decl(generalParsingOk.ts, 174, 3), Decl(generalParsingOk.ts, 175, 5), Decl(generalParsingOk.ts, 176, 5), Decl(generalParsingOk.ts, 177, 5), Decl(generalParsingOk.ts, 178, 5), Decl(generalParsingOk.ts, 179, 5)) + +// if/else if +if (x?.y) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +if (1) {} else if (x?.y) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// switch +switch (x?.y) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +switch (1) { case x?.y: break; } +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// do/while +do {} while (x?.y) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +while (x?.y) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// for +for (x?.y; x?.y; x?.y); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// for..in +for (x?.y in {}); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// for..of +for (x?.y of []); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// enums +enum E { +>E : Symbol(E, Decl(generalParsingOk.ts, 200, 17)) + + a = x?.y +>a : Symbol(E.a, Decl(generalParsingOk.ts, 203, 8)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +} + +=== tests/cases/conformance/emitter/es5/safeNavigation/exportsOk.ts === +export default x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + diff --git a/tests/baselines/reference/emitter.safeNavigation.es5.types b/tests/baselines/reference/emitter.safeNavigation.es5.types new file mode 100644 index 00000000000..ca2f777cb18 --- /dev/null +++ b/tests/baselines/reference/emitter.safeNavigation.es5.types @@ -0,0 +1,1589 @@ +=== tests/cases/conformance/emitter/es5/safeNavigation/declarations.d.ts === +declare var x: any; +>x : any + +declare var y: any; +>y : any + +declare var f: ({ +>f : { (): void; (): void; new (): any; new (): any; } + + (): void; + (): void; +>T : T + + new (): any; + new (): any; +>T : T + +}) | undefined; +declare var o: { y: typeof f; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>y : { (): void; (): void; new (): any; new (): any; } +>f : { (): void; (): void; new (): any; new (): any; } + +declare class Base { x(): any; } +>Base : Base +>x : () => any + +declare namespace M { +>M : typeof M + + export class y {} +>y : y + + export class z {} +>z : z +>T : T +} +=== tests/cases/conformance/emitter/es5/safeNavigation/propertyAccessOk.ts === +x.y +>x.y : any +>x : any +>y : any + +x?.y +>x?.y : any +>x : any +>y : any + +x?.y.z +>x?.y.z : any +>x?.y : any +>x : any +>y : any +>z : any + +x.y?.z +>x.y?.z : any +>x.y : any +>x : any +>y : any +>z : any + +x?.y?.z +>x?.y?.z : any +>x?.y : any +>x : any +>y : any +>z : any + +=== tests/cases/conformance/emitter/es5/safeNavigation/elementAccessOk.ts === +x["y"] +>x["y"] : any +>x : any +>"y" : "y" + +x?.["y"] +>x?.["y"] : any +>x : any +>"y" : "y" + +x?.["y"]["z"] +>x?.["y"]["z"] : any +>x?.["y"] : any +>x : any +>"y" : "y" +>"z" : "z" + +x["y"]?.["z"] +>x["y"]?.["z"] : any +>x["y"] : any +>x : any +>"y" : "y" +>"z" : "z" + +x?.["y"]?.["z"] +>x?.["y"]?.["z"] : any +>x?.["y"] : any +>x : any +>"y" : "y" +>"z" : "z" + +=== tests/cases/conformance/emitter/es5/safeNavigation/callExpressionOk.ts === +x() +>x() : any +>x : any + +x?.() +>x?.() : any +>x : any + +x.y?.() +>x.y?.() : any +>x.y : any +>x : any +>y : any + +x["y"]?.() +>x["y"]?.() : any +>x["y"] : any +>x : any +>"y" : "y" + +f?.() +>f?.() : void +>f : { (): void; (): void; new (): any; new (): any; } + +o.y?.() +>o.y?.() : void +>o.y : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>y : { (): void; (): void; new (): any; new (): any; } + +o["y"]?.() +>o["y"]?.() : void +>o["y"] : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>"y" : "y" + +=== tests/cases/conformance/emitter/es5/safeNavigation/newExpressionOk.ts === +new x() +>new x() : any +>x : any + +new x.y?.() +>new x.y?.() : any +>x.y : any +>x : any +>y : any + +new x["y"]?.() +>new x["y"]?.() : any +>x["y"] : any +>x : any +>"y" : "y" + +new f?.() +>new f?.() : any +>f : { (): void; (): void; new (): any; new (): any; } + +new o.y?.() +>new o.y?.() : any +>o.y : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>y : { (): void; (): void; new (): any; new (): any; } + +new o["y"]?.() +>new o["y"]?.() : any +>o["y"] : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>"y" : "y" + +=== tests/cases/conformance/emitter/es5/safeNavigation/mixedOk.ts === +x?.y?.["z"] +>x?.y?.["z"] : any +>x?.y : any +>x : any +>y : any +>"z" : "z" + +x?.["y"]?.z +>x?.["y"]?.z : any +>x?.["y"] : any +>x : any +>"y" : "y" +>z : any + +x?.y() +>x?.y() : any +>x?.y : any +>x : any +>y : any + +x?.y?.() +>x?.y?.() : any +>x?.y : any +>x : any +>y : any + +o?.y() +>o?.y() : void +>o?.y : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>y : { (): void; (): void; new (): any; new (): any; } + +o?.y?.() +>o?.y?.() : void +>o?.y : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>y : { (): void; (): void; new (): any; new (): any; } + +x?.["z"]() +>x?.["z"]() : any +>x?.["z"] : any +>x : any +>"z" : "z" + +x?.["z"]?.() +>x?.["z"]?.() : any +>x?.["z"] : any +>x : any +>"z" : "z" + +o?.["y"]() +>o?.["y"]() : void +>o?.["y"] : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>"y" : "y" + +o?.["y"]?.() +>o?.["y"]?.() : void +>o?.["y"] : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>"y" : "y" + +=== tests/cases/conformance/emitter/es5/safeNavigation/mutationOk.ts === +x?.y = 1 +>x?.y = 1 : 1 +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y += 1; +>x?.y += 1 : any +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y -= 1; +>x?.y -= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y *= 1; +>x?.y *= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y /= 1; +>x?.y /= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y %= 1; +>x?.y %= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y **= 1; +>x?.y **= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y |= 1; +>x?.y |= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y &= 1; +>x?.y &= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y ^= 1; +>x?.y ^= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y <<= 1; +>x?.y <<= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y >>= 1; +>x?.y >>= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y >>>= 1; +>x?.y >>>= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y++; +>x?.y++ : number +>x?.y : any +>x : any +>y : any + +x?.y--; +>x?.y-- : number +>x?.y : any +>x : any +>y : any + +++x?.y; +>++x?.y : number +>x?.y : any +>x : any +>y : any + +--x?.y; +>--x?.y : number +>x?.y : any +>x : any +>y : any + +delete x?.y; +>delete x?.y : boolean +>x?.y : any +>x : any +>y : any + +x?.["y"] = 1 +>x?.["y"] = 1 : 1 +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] += 1; +>x?.["y"] += 1 : any +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] -= 1; +>x?.["y"] -= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] *= 1; +>x?.["y"] *= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] /= 1; +>x?.["y"] /= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] %= 1; +>x?.["y"] %= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] **= 1; +>x?.["y"] **= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] |= 1; +>x?.["y"] |= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] &= 1; +>x?.["y"] &= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] ^= 1; +>x?.["y"] ^= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] <<= 1; +>x?.["y"] <<= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] >>= 1; +>x?.["y"] >>= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] >>>= 1; +>x?.["y"] >>>= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"]++; +>x?.["y"]++ : number +>x?.["y"] : any +>x : any +>"y" : "y" + +x?.["y"]--; +>x?.["y"]-- : number +>x?.["y"] : any +>x : any +>"y" : "y" + +++x?.["y"]; +>++x?.["y"] : number +>x?.["y"] : any +>x : any +>"y" : "y" + +--x?.["y"]; +>--x?.["y"] : number +>x?.["y"] : any +>x : any +>"y" : "y" + +delete x?.["y"]; +>delete x?.["y"] : boolean +>x?.["y"] : any +>x : any +>"y" : "y" + +=== tests/cases/conformance/emitter/es5/safeNavigation/arrayAssignmentPatternOk.ts === +[x?.y] = [1]; +>[x?.y] = [1] : [number] +>[x?.y] : [any] +>x?.y : any +>x : any +>y : any +>[1] : [number] +>1 : 1 + +[x?.["y"]] = [1]; +>[x?.["y"]] = [1] : [number] +>[x?.["y"]] : [any] +>x?.["y"] : any +>x : any +>"y" : "y" +>[1] : [number] +>1 : 1 + +[...x?.y] = [1]; +>[...x?.y] = [1] : number[] +>[...x?.y] : undefined[] +>...x?.y : any +>x?.y : any +>x : any +>y : any +>[1] : number[] +>1 : 1 + +[...x?.["y"]] = [1]; +>[...x?.["y"]] = [1] : number[] +>[...x?.["y"]] : undefined[] +>...x?.["y"] : any +>x?.["y"] : any +>x : any +>"y" : "y" +>[1] : number[] +>1 : 1 + +=== tests/cases/conformance/emitter/es5/safeNavigation/objectAssignmentPatternOk.ts === +({ a: x?.y } = { a: 1 }); +>({ a: x?.y } = { a: 1 }) : { a: number; } +>{ a: x?.y } = { a: 1 } : { a: number; } +>{ a: x?.y } : { a: any; } +>a : any +>x?.y : any +>x : any +>y : any +>{ a: 1 } : { a: number; } +>a : number +>1 : 1 + +({ a: x?.["y"] } = { a: 1 }); +>({ a: x?.["y"] } = { a: 1 }) : { a: number; } +>{ a: x?.["y"] } = { a: 1 } : { a: number; } +>{ a: x?.["y"] } : { a: any; } +>a : any +>x?.["y"] : any +>x : any +>"y" : "y" +>{ a: 1 } : { a: number; } +>a : number +>1 : 1 + +=== tests/cases/conformance/emitter/es5/safeNavigation/questionDotDigitIsConditionalOk.ts === +x?.3:1; +>x?.3:1 : 1 | 0.3 +>x : any +>.3 : 0.3 +>1 : 1 + +=== tests/cases/conformance/emitter/es5/safeNavigation/superPropertyInvocationOk.ts === +// supported for invocation of super property +void class extends Base { +>void class extends Base { m() { super.x?.(); }} : undefined +>class extends Base { m() { super.x?.(); }} : typeof (Anonymous class) +>Base : Base + + m() { +>m : () => void + + super.x?.(); +>super.x?.() : any +>super.x : () => any +>super : Base +>x : () => any + } +} + +=== tests/cases/conformance/emitter/es5/safeNavigation/generalParsingOk.ts === +// object literals +// - computed property names +void { [x?.y]: 1 } +>void { [x?.y]: 1 } : undefined +>{ [x?.y]: 1 } : { [x: number]: number; } +>x?.y : any +>x : any +>y : any +>1 : 1 + +void { [x?.["y"]]: 1 } +>void { [x?.["y"]]: 1 } : undefined +>{ [x?.["y"]]: 1 } : { [x: number]: number; } +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +void { [x?.()]: 1 } +>void { [x?.()]: 1 } : undefined +>{ [x?.()]: 1 } : { [x: number]: number; } +>x?.() : any +>x : any +>1 : 1 + +void { [new x?.()]: 1 } +>void { [new x?.()]: 1 } : undefined +>{ [new x?.()]: 1 } : { [x: number]: number; } +>new x?.() : any +>x : any +>1 : 1 + +// - property assignments +void { a: x?.y } +>void { a: x?.y } : undefined +>{ a: x?.y } : { a: any; } +>a : any +>x?.y : any +>x : any +>y : any + +void { a: x?.["y"] } +>void { a: x?.["y"] } : undefined +>{ a: x?.["y"] } : { a: any; } +>a : any +>x?.["y"] : any +>x : any +>"y" : "y" + +void { a: x?.() } +>void { a: x?.() } : undefined +>{ a: x?.() } : { a: any; } +>a : any +>x?.() : any +>x : any + +void { a: new x?.() } +>void { a: new x?.() } : undefined +>{ a: new x?.() } : { a: any; } +>a : any +>new x?.() : any +>x : any + +// classes +// - computed property names +// void class { [x?.y] = 1 } // legal parse, but causes a checker error +// void class { [x?.["y"]] = 1 } // legal parse, but causes a checker error +// void class { [x?.()] = 1 } // legal parse, but causes a checker error +// void class { [new f?.()] = 1 } // legal parse, but causes a checker error +void class { [Symbol?.toStringTag] = "" } +>void class { [Symbol?.toStringTag] = "" } : undefined +>class { [Symbol?.toStringTag] = "" } : typeof (Anonymous class) +>Symbol?.toStringTag : symbol +>Symbol : SymbolConstructor +>toStringTag : symbol +>"" : "" + +// - property declarations +void class { a = x?.y } +>void class { a = x?.y } : undefined +>class { a = x?.y } : typeof (Anonymous class) +>a : any +>x?.y : any +>x : any +>y : any + +void class { a = x?.["y"] } +>void class { a = x?.["y"] } : undefined +>class { a = x?.["y"] } : typeof (Anonymous class) +>a : any +>x?.["y"] : any +>x : any +>"y" : "y" + +void class { a = x?.() } +>void class { a = x?.() } : undefined +>class { a = x?.() } : typeof (Anonymous class) +>a : any +>x?.() : any +>x : any + +void class { a = new x?.() } +>void class { a = new x?.() } : undefined +>class { a = new x?.() } : typeof (Anonymous class) +>a : any +>new x?.() : any +>x : any + +// - heritage clauses +void class extends M?.y {} +>void class extends M?.y {} : undefined +>class extends M?.y {} : typeof (Anonymous class) +>M?.y : M.y +>M : typeof M +>y : typeof M.y + +void class extends M?.["y"] {} +>void class extends M?.["y"] {} : undefined +>class extends M?.["y"] {} : typeof (Anonymous class) +>M?.["y"] : M.y +>M : typeof M +>"y" : "y" + +void class extends M?.z {} +>void class extends M?.z {} : undefined +>class extends M?.z {} : typeof (Anonymous class) +>M?.z : M.z +>M : typeof M +>z : typeof M.z + +// - class decorators +@x?.y class C1 {} +>x?.y : any +>x : any +>y : any +>C1 : C1 + +@x?.["y"] class C2 {} +>x?.["y"] : any +>x : any +>"y" : "y" +>C2 : C2 + +@x?.() class C3 {} +>x?.() : any +>x : any +>C3 : C3 + +@new x?.() class C4 {} +>new x?.() : any +>x : any +>C4 : C4 + +// - member decorators +class C5 { @x?.y m() {} } +>C5 : C5 +>x?.y : any +>x : any +>y : any +>m : () => void + +class C6 { @x?.["y"] m() {} } // allowed as ?.[ is not ambiguous with computed property names +>C6 : C6 +>x?.["y"] : any +>x : any +>"y" : "y" +>m : () => void + +class C7 { @x?.() m() {} } +>C7 : C7 +>x?.() : any +>x : any +>m : () => void + +class C8 { @new x?.() m () {} } +>C8 : C8 +>new x?.() : any +>x : any +>m : () => void + +// - parameter decorators +class C9 { m(@x?.y a) {} } +>C9 : C9 +>m : (a: any) => void +>x?.y : any +>x : any +>y : any +>a : any + +class C10 { m(@x?.["y"] a) {} } +>C10 : C10 +>m : (a: any) => void +>x?.["y"] : any +>x : any +>"y" : "y" +>a : any + +class C11 { m(@x?.() a) {} } +>C11 : C11 +>m : (a: any) => void +>x?.() : any +>x : any +>a : any + +class C12 { m(@new x?.() a) {} } +>C12 : C12 +>m : (a: any) => void +>new x?.() : any +>x : any +>a : any + +// functions +// - parameters +void function (a = x?.y) {} +>void function (a = x?.y) {} : undefined +>function (a = x?.y) {} : (a?: any) => void +>a : any +>x?.y : any +>x : any +>y : any + +void function (a = x?.["y"]) {} +>void function (a = x?.["y"]) {} : undefined +>function (a = x?.["y"]) {} : (a?: any) => void +>a : any +>x?.["y"] : any +>x : any +>"y" : "y" + +void function (a = x?.()) {} +>void function (a = x?.()) {} : undefined +>function (a = x?.()) {} : (a?: any) => void +>a : any +>x?.() : any +>x : any + +void function (a = new x?.()) {} +>void function (a = new x?.()) {} : undefined +>function (a = new x?.()) {} : (a?: any) => void +>a : any +>new x?.() : any +>x : any + +// - binding elements +// - initializers +void function ({ a = x?.y }) {} +>void function ({ a = x?.y }) {} : undefined +>function ({ a = x?.y }) {} : ({a}: { a?: any; }) => void +>a : any +>x?.y : any +>x : any +>y : any + +void function ({ a = x?.["y"] }) {} +>void function ({ a = x?.["y"] }) {} : undefined +>function ({ a = x?.["y"] }) {} : ({a}: { a?: any; }) => void +>a : any +>x?.["y"] : any +>x : any +>"y" : "y" + +void function ({ a = x?.() }) {} +>void function ({ a = x?.() }) {} : undefined +>function ({ a = x?.() }) {} : ({a}: { a?: any; }) => void +>a : any +>x?.() : any +>x : any + +void function ({ a = new x?.() }) {} +>void function ({ a = new x?.() }) {} : undefined +>function ({ a = new x?.() }) {} : ({a}: { a?: any; }) => void +>a : any +>new x?.() : any +>x : any + +// - computed properties +void function ({ [x?.y]: a }) {} +>void function ({ [x?.y]: a }) {} : undefined +>function ({ [x?.y]: a }) {} : ({[x?.y]: a}: {}) => void +>x?.y : any +>x : any +>y : any +>a : any + +void function ({ [x?.["y"]]: a }) {} +>void function ({ [x?.["y"]]: a }) {} : undefined +>function ({ [x?.["y"]]: a }) {} : ({[x?.["y"]]: a}: {}) => void +>x?.["y"] : any +>x : any +>"y" : "y" +>a : any + +void function ({ [x?.()]: a }) {} +>void function ({ [x?.()]: a }) {} : undefined +>function ({ [x?.()]: a }) {} : ({[x?.()]: a}: {}) => void +>x?.() : any +>x : any +>a : any + +void function ({ [new x?.()]: a }) {} +>void function ({ [new x?.()]: a }) {}// arrow functions// - parameters((a = x?.y) => {}) : undefined +>function ({ [new x?.()]: a }) {}// arrow functions// - parameters((a = x?.y) => {}) : void +>function ({ [new x?.()]: a }) {} : ({[new x?.()]: a}: (a?: any) => void) => void +>new x?.() : any +>x : any +>a : any + +// arrow functions +// - parameters +((a = x?.y) => {}); +>(a = x?.y) => {} : (a?: any) => void +>a : any +>x?.y : any +>x : any +>y : any + +((a = x?.["y"]) => {}); +>((a = x?.["y"]) => {}) : (a?: any) => void +>(a = x?.["y"]) => {} : (a?: any) => void +>a : any +>x?.["y"] : any +>x : any +>"y" : "y" + +((a = x?.()) => {}); +>((a = x?.()) => {}) : (a?: any) => void +>(a = x?.()) => {} : (a?: any) => void +>a : any +>x?.() : any +>x : any + +((a = new x?.()) => {}); +>((a = new x?.()) => {}) : (a?: any) => void +>(a = new x?.()) => {} : (a?: any) => void +>a : any +>new x?.() : any +>x : any + +// - expression bodies +(() => x?.y); +>(() => x?.y) : () => any +>() => x?.y : () => any +>x?.y : any +>x : any +>y : any + +(() => x?.["y"]); +>(() => x?.["y"]) : () => any +>() => x?.["y"] : () => any +>x?.["y"] : any +>x : any +>"y" : "y" + +(() => x?.()); +>(() => x?.()) : () => any +>() => x?.() : () => any +>x?.() : any +>x : any + +(() => new x?.()); +>(() => new x?.()) : () => any +>() => new x?.() : () => any +>new x?.() : any +>x : any + +// parenthesis +(x?.y); +>(x?.y) : any +>x?.y : any +>x : any +>y : any + +// comma +x?.y, f(); +>x?.y, f() : void +>x?.y : any +>x : any +>y : any +>f() : void +>f : { (): void; (): void; new (): any; new (): any; } + +f(), x?.y; +>f(), x?.y : any +>f() : void +>f : { (): void; (): void; new (): any; new (): any; } +>x?.y : any +>x : any +>y : any + +// conditional +x?.y ? 0 : 1 +>x?.y ? 0 : 1 : 1 | 0 +>x?.y : any +>x : any +>y : any +>0 : 0 +>1 : 1 + +0 ? x?.y : 1; +>0 ? x?.y : 1 : any +>0 : 0 +>x?.y : any +>x : any +>y : any +>1 : 1 + +0 ? 1 : x?.y; +>0 ? 1 : x?.y : any +>0 : 0 +>1 : 1 +>x?.y : any +>x : any +>y : any + +// binary +x?.y + 1; +>x?.y + 1 : any +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y - 1; +>x?.y - 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y * 1; +>x?.y * 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y / 1; +>x?.y / 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y ** 1; +>x?.y ** 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y % 1; +>x?.y % 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y ^ 1; +>x?.y ^ 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y & 1; +>x?.y & 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y | 1; +>x?.y | 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y << 1; +>x?.y << 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y >> 1; +>x?.y >> 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y >>> 1; +>x?.y >>> 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y && 1; +>x?.y && 1 : 0 | 1 +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y || 1; +>x?.y || 1 : any +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y == 1; +>x?.y == 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y === 1; +>x?.y === 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y != 1; +>x?.y != 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y !== 1; +>x?.y !== 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y < 1; +>x?.y < 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y <= 1; +>x?.y <= 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y > 1; +>x?.y > 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y >= 1; +>x?.y >= 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +1 + x?.y; +>1 + x?.y : any +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 - x?.y; +>1 - x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 * x?.y; +>1 * x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 / x?.y; +>1 / x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 ** x?.y; +>1 ** x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 % x?.y; +>1 % x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 ^ x?.y; +>1 ^ x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 & x?.y; +>1 & x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 | x?.y; +>1 | x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 << x?.y; +>1 << x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 >> x?.y; +>1 >> x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 >>> x?.y; +>1 >>> x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 && x?.y; +>1 && x?.y : any +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 || x?.y; +>1 || x?.y : any +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 == x?.y; +>1 == x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 === x?.y; +>1 === x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 != x?.y; +>1 != x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 !== x?.y; +>1 !== x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 < x?.y; +>1 < x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 <= x?.y; +>1 <= x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 > x?.y; +>1 > x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 >= x?.y; +>1 >= x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +// prefix unary ++x?.y; +>+x?.y : number +>x?.y : any +>x : any +>y : any + +-x?.y; +>-x?.y : number +>x?.y : any +>x : any +>y : any + +!x?.y; +>!x?.y : boolean +>x?.y : any +>x : any +>y : any + +~x?.y; +>~x?.y : number +>x?.y : any +>x : any +>y : any + +// unary +void x?.y; +>void x?.y : undefined +>x?.y : any +>x : any +>y : any + +typeof x?.y; +>typeof x?.y : "string" | "number" | "boolean" | "symbol" | "undefined" | "object" | "function" +>x?.y : any +>x : any +>y : any + +void function * () { yield x?.y; } +>void function * () { yield x?.y; } : undefined +>function * () { yield x?.y; } : () => IterableIterator +>yield x?.y : any +>x?.y : any +>x : any +>y : any + +void async function() { await x?.y; } +>void async function() { await x?.y; } : undefined +>async function() { await x?.y; } : () => Promise +>await x?.y : any +>x?.y : any +>x : any +>y : any + +// notnull +x?.y!.z; +>x?.y!.z : any +>x?.y! : any +>x?.y : any +>x : any +>y : any +>z : any + +// assertions +x?.y; +>x?.y : string +>x?.y : any +>x : any +>y : any + +x?.y as string; +>x?.y as string : string +>x?.y : any +>x : any +>y : any + +// array literals +[x?.y]; +>[x?.y] : any[] +>x?.y : any +>x : any +>y : any + +[, x?.y]; +>[, x?.y] : any[] +> : undefined +>x?.y : any +>x : any +>y : any + +[...x?.y]; +>[...x?.y] : any[] +>...x?.y : any +>x?.y : any +>x : any +>y : any + +// literals +1?.toString(); // no need for `..` +>1?.toString() : string +>1?.toString : (radix?: number) => string +>1 : 1 +>toString : (radix?: number) => string + +1.?.toString(); +>1.?.toString() : string +>1.?.toString : (radix?: number) => string +>1. : 1 +>toString : (radix?: number) => string + +.0?.toString(); +>.0?.toString() : string +>.0?.toString : (radix?: number) => string +>.0 : 0 +>toString : (radix?: number) => string + +4e3?.toString(); +>4e3?.toString() : string +>4e3?.toString : (radix?: number) => string +>4e3 : 4000 +>toString : (radix?: number) => string + +1.e3?.toString(); +>1.e3?.toString() : string +>1.e3?.toString : (radix?: number) => string +>1.e3 : 1000 +>toString : (radix?: number) => string + +""?.toString(); +>""?.toString() : string +>""?.toString : () => string +>"" : "" +>toString : () => string + +''?.toString(); +>''?.toString() : string +>''?.toString : () => string +>'' : "" +>toString : () => string + +``?.toString(); +>``?.toString() : string +>``?.toString : () => string +>`` : string +>toString : () => string + +/./?.toString(); +>/./?.toString() : string +>/./?.toString : () => string +>/./ : RegExp +>toString : () => string + +/./g?.toString(); +>/./g?.toString() : string +>/./g?.toString : () => string +>/./g : RegExp +>toString : () => string + +true?.toString(); +>true?.toString() : string +>true?.toString : () => string +>true : true +>toString : () => string + +false?.toString(); +>false?.toString() : string +>false?.toString : () => string +>false : false +>toString : () => string + +// templates +`${x?.y}`; +>`${x?.y}` : string +>x?.y : any +>x : any +>y : any + +// variables +var v = x?.y; +>v : any +>x?.y : any +>x : any +>y : any + +var [v] = x?.y; +>v : any +>x?.y : any +>x : any +>y : any + +var [v = x?.y] = [1]; +>v : any +>x?.y : any +>x : any +>y : any +>[1] : [number] +>1 : 1 + +var {v} = x?.y; +>v : any +>x?.y : any +>x : any +>y : any + +var {v = x?.y} = {v:1}; +>v : any +>x?.y : any +>x : any +>y : any +>{v:1} : { v?: number; } +>v : number +>1 : 1 + +var {[x?.y]: v} = null; +>x?.y : any +>x : any +>y : any +>v : any +>null : null + +// if/else if +if (x?.y) {} +>x?.y : any +>x : any +>y : any + +if (1) {} else if (x?.y) {} +>1 : 1 +>x?.y : any +>x : any +>y : any + +// switch +switch (x?.y) {} +>x?.y : any +>x : any +>y : any + +switch (1) { case x?.y: break; } +>1 : 1 +>x?.y : any +>x : any +>y : any + +// do/while +do {} while (x?.y) +>x?.y : any +>x : any +>y : any + +while (x?.y) {} +>x?.y : any +>x : any +>y : any + +// for +for (x?.y; x?.y; x?.y); +>x?.y : any +>x : any +>y : any +>x?.y : any +>x : any +>y : any +>x?.y : any +>x : any +>y : any + +// for..in +for (x?.y in {}); +>x?.y : any +>x : any +>y : any +>{} : {} + +// for..of +for (x?.y of []); +>x?.y : any +>x : any +>y : any +>[] : undefined[] + +// enums +enum E { +>E : E + + a = x?.y +>a : E +>x?.y : any +>x : any +>y : any +} + +=== tests/cases/conformance/emitter/es5/safeNavigation/exportsOk.ts === +export default x?.y; +>x?.y : any +>x : any +>y : any + diff --git a/tests/baselines/reference/emitter.safeNavigation.esnext.js b/tests/baselines/reference/emitter.safeNavigation.esnext.js new file mode 100644 index 00000000000..ad4691a8b7c --- /dev/null +++ b/tests/baselines/reference/emitter.safeNavigation.esnext.js @@ -0,0 +1,697 @@ +//// [tests/cases/conformance/emitter/esnext/safeNavigation/emitter.safeNavigation.esnext.ts] //// + +//// [declarations.d.ts] +declare var x: any; +declare var y: any; +declare var f: ({ + (): void; + (): void; + new (): any; + new (): any; +}) | undefined; +declare var o: { y: typeof f; } +declare class Base { x(): any; } +declare namespace M { + export class y {} + export class z {} +} +//// [propertyAccessOk.ts] +x.y +x?.y +x?.y.z +x.y?.z +x?.y?.z +//// [elementAccessOk.ts] +x["y"] +x?.["y"] +x?.["y"]["z"] +x["y"]?.["z"] +x?.["y"]?.["z"] +//// [callExpressionOk.ts] +x() +x?.() +x.y?.() +x["y"]?.() +f?.() +o.y?.() +o["y"]?.() +//// [newExpressionOk.ts] +new x() +new x.y?.() +new x["y"]?.() +new f?.() +new o.y?.() +new o["y"]?.() +//// [mixedOk.ts] +x?.y?.["z"] +x?.["y"]?.z +x?.y() +x?.y?.() +o?.y() +o?.y?.() +x?.["z"]() +x?.["z"]?.() +o?.["y"]() +o?.["y"]?.() +//// [mutationOk.ts] +x?.y = 1 +x?.y += 1; +x?.y -= 1; +x?.y *= 1; +x?.y /= 1; +x?.y %= 1; +x?.y **= 1; +x?.y |= 1; +x?.y &= 1; +x?.y ^= 1; +x?.y <<= 1; +x?.y >>= 1; +x?.y >>>= 1; +x?.y++; +x?.y--; +++x?.y; +--x?.y; +delete x?.y; +x?.["y"] = 1 +x?.["y"] += 1; +x?.["y"] -= 1; +x?.["y"] *= 1; +x?.["y"] /= 1; +x?.["y"] %= 1; +x?.["y"] **= 1; +x?.["y"] |= 1; +x?.["y"] &= 1; +x?.["y"] ^= 1; +x?.["y"] <<= 1; +x?.["y"] >>= 1; +x?.["y"] >>>= 1; +x?.["y"]++; +x?.["y"]--; +++x?.["y"]; +--x?.["y"]; +delete x?.["y"]; +//// [arrayAssignmentPatternOk.ts] +[x?.y] = [1]; +[x?.["y"]] = [1]; +[...x?.y] = [1]; +[...x?.["y"]] = [1]; +//// [objectAssignmentPatternOk.ts] +({ a: x?.y } = { a: 1 }); +({ a: x?.["y"] } = { a: 1 }); +//// [questionDotDigitIsConditionalOk.ts] +x?.3:1; +//// [superPropertyInvocationOk.ts] +// supported for invocation of super property +void class extends Base { + m() { + super.x?.(); + super["x"]?.(); + } +} + +//// [generalParsingOk.ts] +// object literals +// - computed property names +void { [x?.y]: 1 } +void { [x?.["y"]]: 1 } +void { [x?.()]: 1 } +void { [new x?.()]: 1 } +// - property assignments +void { a: x?.y } +void { a: x?.["y"] } +void { a: x?.() } +void { a: new x?.() } + +// classes +// - computed property names +// void class { [x?.y] = 1 } // legal parse, but causes a checker error +// void class { [x?.["y"]] = 1 } // legal parse, but causes a checker error +// void class { [x?.()] = 1 } // legal parse, but causes a checker error +// void class { [new f?.()] = 1 } // legal parse, but causes a checker error +void class { [Symbol?.toStringTag] = "" } +// - property declarations +void class { a = x?.y } +void class { a = x?.["y"] } +void class { a = x?.() } +void class { a = new x?.() } +// - heritage clauses +void class extends M?.y {} +void class extends M?.["y"] {} +void class extends M?.z {} +// - class decorators +@x?.y class C1 {} +@x?.["y"] class C2 {} +@x?.() class C3 {} +@new x?.() class C4 {} +// - member decorators +class C5 { @x?.y m() {} } +class C6 { @x?.["y"] m() {} } // allowed as ?.[ is not ambiguous with computed property names +class C7 { @x?.() m() {} } +class C8 { @new x?.() m () {} } +// - parameter decorators +class C9 { m(@x?.y a) {} } +class C10 { m(@x?.["y"] a) {} } +class C11 { m(@x?.() a) {} } +class C12 { m(@new x?.() a) {} } + +// functions +// - parameters +void function (a = x?.y) {} +void function (a = x?.["y"]) {} +void function (a = x?.()) {} +void function (a = new x?.()) {} +// - binding elements +// - initializers +void function ({ a = x?.y }) {} +void function ({ a = x?.["y"] }) {} +void function ({ a = x?.() }) {} +void function ({ a = new x?.() }) {} +// - computed properties +void function ({ [x?.y]: a }) {} +void function ({ [x?.["y"]]: a }) {} +void function ({ [x?.()]: a }) {} +void function ({ [new x?.()]: a }) {} + +// arrow functions +// - parameters +((a = x?.y) => {}); +((a = x?.["y"]) => {}); +((a = x?.()) => {}); +((a = new x?.()) => {}); +// - expression bodies +(() => x?.y); +(() => x?.["y"]); +(() => x?.()); +(() => new x?.()); + +// parenthesis +(x?.y); + +// comma +x?.y, f(); +f(), x?.y; + +// conditional +x?.y ? 0 : 1 +0 ? x?.y : 1; +0 ? 1 : x?.y; + +// binary +x?.y + 1; +x?.y - 1; +x?.y * 1; +x?.y / 1; +x?.y ** 1; +x?.y % 1; +x?.y ^ 1; +x?.y & 1; +x?.y | 1; +x?.y << 1; +x?.y >> 1; +x?.y >>> 1; +x?.y && 1; +x?.y || 1; +x?.y == 1; +x?.y === 1; +x?.y != 1; +x?.y !== 1; +x?.y < 1; +x?.y <= 1; +x?.y > 1; +x?.y >= 1; +1 + x?.y; +1 - x?.y; +1 * x?.y; +1 / x?.y; +1 ** x?.y; +1 % x?.y; +1 ^ x?.y; +1 & x?.y; +1 | x?.y; +1 << x?.y; +1 >> x?.y; +1 >>> x?.y; +1 && x?.y; +1 || x?.y; +1 == x?.y; +1 === x?.y; +1 != x?.y; +1 !== x?.y; +1 < x?.y; +1 <= x?.y; +1 > x?.y; +1 >= x?.y; + +// prefix unary ++x?.y; +-x?.y; +!x?.y; +~x?.y; + +// unary +void x?.y; +typeof x?.y; +void function * () { yield x?.y; } +void async function() { await x?.y; } + +// notnull +x?.y!.z; + +// assertions +x?.y; +x?.y as string; + +// array literals +[x?.y]; +[, x?.y]; +[...x?.y]; + +// literals +1?.toString(); // no need for `..` +1.?.toString(); +.0?.toString(); +4e3?.toString(); +1.e3?.toString(); +""?.toString(); +''?.toString(); +``?.toString(); +/./?.toString(); +/./g?.toString(); +true?.toString(); +false?.toString(); + +// templates +`${x?.y}`; + +// variables +var v = x?.y; +var [v] = x?.y; +var [v = x?.y] = [1]; +var {v} = x?.y; +var {v = x?.y} = {v:1}; +var {[x?.y]: v} = null; + +// if/else if +if (x?.y) {} +if (1) {} else if (x?.y) {} + +// switch +switch (x?.y) {} +switch (1) { case x?.y: break; } + +// do/while +do {} while (x?.y) +while (x?.y) {} + +// for +for (x?.y; x?.y; x?.y); + +// for..in +for (x?.y in {}); + +// for..of +for (x?.y of []); + +// enums +enum E { + a = x?.y +} + +//// [exportsOk.ts] +export default x?.y; + +//// [propertyAccessOk.js] +x.y; +x?.y; +x?.y.z; +x.y?.z; +x?.y?.z; +//// [elementAccessOk.js] +x["y"]; +x?.["y"]; +x?.["y"]["z"]; +x["y"]?.["z"]; +x?.["y"]?.["z"]; +//// [callExpressionOk.js] +x(); +x?.(); +x.y?.(); +x["y"]?.(); +f?.(); +o.y?.(); +o["y"]?.(); +//// [newExpressionOk.js] +new x(); +new x.y?.(); +new x["y"]?.(); +new f?.(); +new o.y?.(); +new o["y"]?.(); +//// [mixedOk.js] +x?.y?.["z"]; +x?.["y"]?.z; +x?.y(); +x?.y?.(); +o?.y(); +o?.y?.(); +x?.["z"](); +x?.["z"]?.(); +o?.["y"](); +o?.["y"]?.(); +//// [mutationOk.js] +x?.y = 1; +x?.y += 1; +x?.y -= 1; +x?.y *= 1; +x?.y /= 1; +x?.y %= 1; +x?.y **= 1; +x?.y |= 1; +x?.y &= 1; +x?.y ^= 1; +x?.y <<= 1; +x?.y >>= 1; +x?.y >>>= 1; +x?.y++; +x?.y--; +++x?.y; +--x?.y; +delete x?.y; +x?.["y"] = 1; +x?.["y"] += 1; +x?.["y"] -= 1; +x?.["y"] *= 1; +x?.["y"] /= 1; +x?.["y"] %= 1; +x?.["y"] **= 1; +x?.["y"] |= 1; +x?.["y"] &= 1; +x?.["y"] ^= 1; +x?.["y"] <<= 1; +x?.["y"] >>= 1; +x?.["y"] >>>= 1; +x?.["y"]++; +x?.["y"]--; +++x?.["y"]; +--x?.["y"]; +delete x?.["y"]; +//// [arrayAssignmentPatternOk.js] +[x?.y] = [1]; +[x?.["y"]] = [1]; +[...x?.y] = [1]; +[...x?.["y"]] = [1]; +//// [objectAssignmentPatternOk.js] +({ a: x?.y } = { a: 1 }); +({ a: x?.["y"] } = { a: 1 }); +//// [questionDotDigitIsConditionalOk.js] +x ? .3 : 1; +//// [superPropertyInvocationOk.js] +// supported for invocation of super property +void class extends Base { + m() { + super.x?.(); + super["x"]?.(); + } +}; +//// [generalParsingOk.js] +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +// object literals +// - computed property names +void { [x?.y]: 1 }; +void { [x?.["y"]]: 1 }; +void { [x?.()]: 1 }; +void { [new x?.()]: 1 }; +// - property assignments +void { a: x?.y }; +void { a: x?.["y"] }; +void { a: x?.() }; +void { a: new x?.() }; +// classes +// - computed property names +// void class { [x?.y] = 1 } // legal parse, but causes a checker error +// void class { [x?.["y"]] = 1 } // legal parse, but causes a checker error +// void class { [x?.()] = 1 } // legal parse, but causes a checker error +// void class { [new f?.()] = 1 } // legal parse, but causes a checker error +void class { + constructor() { + this[Symbol?.toStringTag] = ""; + } +}; +// - property declarations +void class { + constructor() { + this.a = x?.y; + } +}; +void class { + constructor() { + this.a = x?.["y"]; + } +}; +void class { + constructor() { + this.a = x?.(); + } +}; +void class { + constructor() { + this.a = new x?.(); + } +}; +// - heritage clauses +void class extends M?.y { +}; +void class extends M?.["y"] { +}; +void class extends M?.z { +}; +// - class decorators +let C1 = class C1 { +}; +C1 = __decorate([ + x?.y +], C1); +let C2 = class C2 { +}; +C2 = __decorate([ + x?.["y"] +], C2); +let C3 = class C3 { +}; +C3 = __decorate([ + x?.() +], C3); +let C4 = class C4 { +}; +C4 = __decorate([ + new x?.() +], C4); +// - member decorators +class C5 { + m() { } +} +__decorate([ + x?.y +], C5.prototype, "m", null); +class C6 { + m() { } +} // allowed as ?.[ is not ambiguous with computed property names +__decorate([ + x?.["y"] +], C6.prototype, "m", null); +class C7 { + m() { } +} +__decorate([ + x?.() +], C7.prototype, "m", null); +class C8 { + m() { } +} +__decorate([ + new x?.() +], C8.prototype, "m", null); +// - parameter decorators +class C9 { + m(a) { } +} +__decorate([ + __param(0, x?.y) +], C9.prototype, "m", null); +class C10 { + m(a) { } +} +__decorate([ + __param(0, x?.["y"]) +], C10.prototype, "m", null); +class C11 { + m(a) { } +} +__decorate([ + __param(0, x?.()) +], C11.prototype, "m", null); +class C12 { + m(a) { } +} +__decorate([ + __param(0, new x?.()) +], C12.prototype, "m", null); +// functions +// - parameters +void function (a = x?.y) { }; +void function (a = x?.["y"]) { }; +void function (a = x?.()) { }; +void function (a = new x?.()) { }; +// - binding elements +// - initializers +void function ({ a = x?.y }) { }; +void function ({ a = x?.["y"] }) { }; +void function ({ a = x?.() }) { }; +void function ({ a = new x?.() }) { }; +// - computed properties +void function ({ [x?.y]: a }) { }; +void function ({ [x?.["y"]]: a }) { }; +void function ({ [x?.()]: a }) { }; +void function ({ [new x?.()]: a }) { }((a = x?.y) => { }); +((a = x?.["y"]) => { }); +((a = x?.()) => { }); +((a = new x?.()) => { }); +// - expression bodies +(() => x?.y); +(() => x?.["y"]); +(() => x?.()); +(() => new x?.()); +// parenthesis +(x?.y); +// comma +x?.y, f(); +f(), x?.y; +// conditional +x?.y ? 0 : 1; +0 ? x?.y : 1; +0 ? 1 : x?.y; +// binary +x?.y + 1; +x?.y - 1; +x?.y * 1; +x?.y / 1; +x?.y ** 1; +x?.y % 1; +x?.y ^ 1; +x?.y & 1; +x?.y | 1; +x?.y << 1; +x?.y >> 1; +x?.y >>> 1; +x?.y && 1; +x?.y || 1; +x?.y == 1; +x?.y === 1; +x?.y != 1; +x?.y !== 1; +x?.y < 1; +x?.y <= 1; +x?.y > 1; +x?.y >= 1; +1 + x?.y; +1 - x?.y; +1 * x?.y; +1 / x?.y; +1 ** x?.y; +1 % x?.y; +1 ^ x?.y; +1 & x?.y; +1 | x?.y; +1 << x?.y; +1 >> x?.y; +1 >>> x?.y; +1 && x?.y; +1 || x?.y; +1 == x?.y; +1 === x?.y; +1 != x?.y; +1 !== x?.y; +1 < x?.y; +1 <= x?.y; +1 > x?.y; +1 >= x?.y; +// prefix unary ++x?.y; +-x?.y; +!x?.y; +~x?.y; +// unary +void x?.y; +typeof x?.y; +void function* () { yield x?.y; }; +void async function () { await x?.y; }; +// notnull +x?.y.z; +// assertions +x?.y; +x?.y; +// array literals +[x?.y]; +[, x?.y]; +[...x?.y]; +// literals +1?.toString(); // no need for `..` +1.?.toString(); +.0?.toString(); +4e3?.toString(); +1.e3?.toString(); +""?.toString(); +''?.toString(); +``?.toString(); +/./?.toString(); +/./g?.toString(); +true?.toString(); +false?.toString(); +// templates +`${x?.y}`; +// variables +var v = x?.y; +var [v] = x?.y; +var [v = x?.y] = [1]; +var { v } = x?.y; +var { v = x?.y } = { v: 1 }; +var { [x?.y]: v } = null; +// if/else if +if (x?.y) { } +if (1) { } +else if (x?.y) { } +// switch +switch (x?.y) { +} +switch (1) { + case x?.y: break; +} +// do/while +do { } while (x?.y); +while (x?.y) { } +// for +for (x?.y; x?.y; x?.y) + ; +// for..in +for (x?.y in {}) + ; +// for..of +for (x?.y of []) + ; +// enums +var E; +(function (E) { + E[E["a"] = x?.y] = "a"; +})(E || (E = {})); +//// [exportsOk.js] +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = x?.y; diff --git a/tests/baselines/reference/emitter.safeNavigation.esnext.symbols b/tests/baselines/reference/emitter.safeNavigation.esnext.symbols new file mode 100644 index 00000000000..3f977c34558 --- /dev/null +++ b/tests/baselines/reference/emitter.safeNavigation.esnext.symbols @@ -0,0 +1,862 @@ +=== tests/cases/conformance/emitter/esnext/safeNavigation/declarations.d.ts === +declare var x: any; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +declare var y: any; +>y : Symbol(y, Decl(declarations.d.ts, 1, 11)) + +declare var f: ({ +>f : Symbol(f, Decl(declarations.d.ts, 2, 11)) + + (): void; + (): void; +>T : Symbol(T, Decl(declarations.d.ts, 4, 5)) + + new (): any; + new (): any; +>T : Symbol(T, Decl(declarations.d.ts, 6, 9)) + +}) | undefined; +declare var o: { y: typeof f; } +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>y : Symbol(y, Decl(declarations.d.ts, 8, 16)) +>f : Symbol(f, Decl(declarations.d.ts, 2, 11)) + +declare class Base { x(): any; } +>Base : Symbol(Base, Decl(declarations.d.ts, 8, 31)) +>x : Symbol(Base.x, Decl(declarations.d.ts, 9, 20)) + +declare namespace M { +>M : Symbol(M, Decl(declarations.d.ts, 9, 32)) + + export class y {} +>y : Symbol(y, Decl(declarations.d.ts, 10, 21)) + + export class z {} +>z : Symbol(z, Decl(declarations.d.ts, 11, 21)) +>T : Symbol(T, Decl(declarations.d.ts, 12, 19)) +} +=== tests/cases/conformance/emitter/esnext/safeNavigation/propertyAccessOk.ts === +x.y +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y.z +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x.y?.z +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y?.z +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +=== tests/cases/conformance/emitter/esnext/safeNavigation/elementAccessOk.ts === +x["y"] +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"]["z"] +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x["y"]?.["z"] +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"]?.["z"] +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +=== tests/cases/conformance/emitter/esnext/safeNavigation/callExpressionOk.ts === +x() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x.y?.() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x["y"]?.() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +f?.() +>f : Symbol(f, Decl(declarations.d.ts, 2, 11)) + +o.y?.() +>o.y : Symbol(y, Decl(declarations.d.ts, 8, 16)) +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>y : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +o["y"]?.() +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>"y" : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +=== tests/cases/conformance/emitter/esnext/safeNavigation/newExpressionOk.ts === +new x() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +new x.y?.() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +new x["y"]?.() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +new f?.() +>f : Symbol(f, Decl(declarations.d.ts, 2, 11)) + +new o.y?.() +>o.y : Symbol(y, Decl(declarations.d.ts, 8, 16)) +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>y : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +new o["y"]?.() +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>"y" : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +=== tests/cases/conformance/emitter/esnext/safeNavigation/mixedOk.ts === +x?.y?.["z"] +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"]?.z +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y?.() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +o?.y() +>o?.y : Symbol(y, Decl(declarations.d.ts, 8, 16)) +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>y : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +o?.y?.() +>o?.y : Symbol(y, Decl(declarations.d.ts, 8, 16)) +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>y : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +x?.["z"]() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["z"]?.() +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +o?.["y"]() +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>"y" : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +o?.["y"]?.() +>o : Symbol(o, Decl(declarations.d.ts, 8, 11)) +>"y" : Symbol(y, Decl(declarations.d.ts, 8, 16)) + +=== tests/cases/conformance/emitter/esnext/safeNavigation/mutationOk.ts === +x?.y = 1 +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y += 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y -= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y *= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y /= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y %= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y **= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y |= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y &= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y ^= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y <<= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y >>= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y >>>= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y++; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y--; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +++x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +--x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +delete x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] = 1 +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] += 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] -= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] *= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] /= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] %= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] **= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] |= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] &= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] ^= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] <<= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] >>= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"] >>>= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"]++; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.["y"]--; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +++x?.["y"]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +--x?.["y"]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +delete x?.["y"]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +=== tests/cases/conformance/emitter/esnext/safeNavigation/arrayAssignmentPatternOk.ts === +[x?.y] = [1]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +[x?.["y"]] = [1]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +[...x?.y] = [1]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +[...x?.["y"]] = [1]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +=== tests/cases/conformance/emitter/esnext/safeNavigation/objectAssignmentPatternOk.ts === +({ a: x?.y } = { a: 1 }); +>a : Symbol(a, Decl(objectAssignmentPatternOk.ts, 0, 2)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(objectAssignmentPatternOk.ts, 0, 16)) + +({ a: x?.["y"] } = { a: 1 }); +>a : Symbol(a, Decl(objectAssignmentPatternOk.ts, 1, 2)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(objectAssignmentPatternOk.ts, 1, 20)) + +=== tests/cases/conformance/emitter/esnext/safeNavigation/questionDotDigitIsConditionalOk.ts === +x?.3:1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +=== tests/cases/conformance/emitter/esnext/safeNavigation/superPropertyInvocationOk.ts === +// supported for invocation of super property +void class extends Base { +>Base : Symbol(Base, Decl(declarations.d.ts, 8, 31)) + + m() { +>m : Symbol((Anonymous class).m, Decl(superPropertyInvocationOk.ts, 1, 25)) + + super.x?.(); +>super.x : Symbol(Base.x, Decl(declarations.d.ts, 9, 20)) +>super : Symbol(Base, Decl(declarations.d.ts, 8, 31)) +>x : Symbol(Base.x, Decl(declarations.d.ts, 9, 20)) + + super["x"]?.(); +>super : Symbol(Base, Decl(declarations.d.ts, 8, 31)) +>"x" : Symbol(Base.x, Decl(declarations.d.ts, 9, 20)) + } +} + +=== tests/cases/conformance/emitter/esnext/safeNavigation/generalParsingOk.ts === +// object literals +// - computed property names +void { [x?.y]: 1 } +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void { [x?.["y"]]: 1 } +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void { [x?.()]: 1 } +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void { [new x?.()]: 1 } +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// - property assignments +void { a: x?.y } +>a : Symbol(a, Decl(generalParsingOk.ts, 7, 6)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void { a: x?.["y"] } +>a : Symbol(a, Decl(generalParsingOk.ts, 8, 6)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void { a: x?.() } +>a : Symbol(a, Decl(generalParsingOk.ts, 9, 6)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void { a: new x?.() } +>a : Symbol(a, Decl(generalParsingOk.ts, 10, 6)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// classes +// - computed property names +// void class { [x?.y] = 1 } // legal parse, but causes a checker error +// void class { [x?.["y"]] = 1 } // legal parse, but causes a checker error +// void class { [x?.()] = 1 } // legal parse, but causes a checker error +// void class { [new f?.()] = 1 } // legal parse, but causes a checker error +void class { [Symbol?.toStringTag] = "" } +>Symbol?.toStringTag : Symbol(SymbolConstructor.toStringTag, Decl(lib.es2015.symbol.wellknown.d.ts, --, --)) +>Symbol : Symbol(Symbol, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.symbol.d.ts, --, --), Decl(lib.es2015.symbol.d.ts, --, --)) +>toStringTag : Symbol(SymbolConstructor.toStringTag, Decl(lib.es2015.symbol.wellknown.d.ts, --, --)) + +// - property declarations +void class { a = x?.y } +>a : Symbol((Anonymous class).a, Decl(generalParsingOk.ts, 20, 12)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void class { a = x?.["y"] } +>a : Symbol((Anonymous class).a, Decl(generalParsingOk.ts, 21, 12)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void class { a = x?.() } +>a : Symbol((Anonymous class).a, Decl(generalParsingOk.ts, 22, 12)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void class { a = new x?.() } +>a : Symbol((Anonymous class).a, Decl(generalParsingOk.ts, 23, 12)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// - heritage clauses +void class extends M?.y {} +>M?.y : Symbol(M.y, Decl(declarations.d.ts, 10, 21)) +>M : Symbol(M, Decl(declarations.d.ts, 9, 32)) +>y : Symbol(M.y, Decl(declarations.d.ts, 10, 21)) + +void class extends M?.["y"] {} +>M : Symbol(M, Decl(declarations.d.ts, 9, 32)) +>"y" : Symbol(M.y, Decl(declarations.d.ts, 10, 21)) + +void class extends M?.z {} +>M?.z : Symbol(M.z, Decl(declarations.d.ts, 11, 21)) +>M : Symbol(M, Decl(declarations.d.ts, 9, 32)) +>z : Symbol(M.z, Decl(declarations.d.ts, 11, 21)) + +// - class decorators +@x?.y class C1 {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>C1 : Symbol(C1, Decl(generalParsingOk.ts, 27, 34)) + +@x?.["y"] class C2 {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>C2 : Symbol(C2, Decl(generalParsingOk.ts, 29, 17)) + +@x?.() class C3 {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>C3 : Symbol(C3, Decl(generalParsingOk.ts, 30, 21)) + +@new x?.() class C4 {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>C4 : Symbol(C4, Decl(generalParsingOk.ts, 31, 18)) + +// - member decorators +class C5 { @x?.y m() {} } +>C5 : Symbol(C5, Decl(generalParsingOk.ts, 32, 22)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>m : Symbol(C5.m, Decl(generalParsingOk.ts, 34, 10)) + +class C6 { @x?.["y"] m() {} } // allowed as ?.[ is not ambiguous with computed property names +>C6 : Symbol(C6, Decl(generalParsingOk.ts, 34, 25)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>m : Symbol(C6.m, Decl(generalParsingOk.ts, 35, 10)) + +class C7 { @x?.() m() {} } +>C7 : Symbol(C7, Decl(generalParsingOk.ts, 35, 29)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>m : Symbol(C7.m, Decl(generalParsingOk.ts, 36, 10)) + +class C8 { @new x?.() m () {} } +>C8 : Symbol(C8, Decl(generalParsingOk.ts, 36, 26)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>m : Symbol(C8.m, Decl(generalParsingOk.ts, 37, 10)) + +// - parameter decorators +class C9 { m(@x?.y a) {} } +>C9 : Symbol(C9, Decl(generalParsingOk.ts, 37, 31)) +>m : Symbol(C9.m, Decl(generalParsingOk.ts, 39, 10)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 39, 13)) + +class C10 { m(@x?.["y"] a) {} } +>C10 : Symbol(C10, Decl(generalParsingOk.ts, 39, 26)) +>m : Symbol(C10.m, Decl(generalParsingOk.ts, 40, 11)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 40, 14)) + +class C11 { m(@x?.() a) {} } +>C11 : Symbol(C11, Decl(generalParsingOk.ts, 40, 31)) +>m : Symbol(C11.m, Decl(generalParsingOk.ts, 41, 11)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 41, 14)) + +class C12 { m(@new x?.() a) {} } +>C12 : Symbol(C12, Decl(generalParsingOk.ts, 41, 28)) +>m : Symbol(C12.m, Decl(generalParsingOk.ts, 42, 11)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 42, 14)) + +// functions +// - parameters +void function (a = x?.y) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 46, 15)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void function (a = x?.["y"]) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 47, 15)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void function (a = x?.()) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 48, 15)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void function (a = new x?.()) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 49, 15)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// - binding elements +// - initializers +void function ({ a = x?.y }) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 52, 16)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void function ({ a = x?.["y"] }) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 53, 16)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void function ({ a = x?.() }) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 54, 16)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void function ({ a = new x?.() }) {} +>a : Symbol(a, Decl(generalParsingOk.ts, 55, 16)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// - computed properties +void function ({ [x?.y]: a }) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 57, 16)) + +void function ({ [x?.["y"]]: a }) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 58, 16)) + +void function ({ [x?.()]: a }) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 59, 16)) + +void function ({ [new x?.()]: a }) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>a : Symbol(a, Decl(generalParsingOk.ts, 60, 16)) + +// arrow functions +// - parameters +((a = x?.y) => {}); +>a : Symbol(a, Decl(generalParsingOk.ts, 64, 2)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +((a = x?.["y"]) => {}); +>a : Symbol(a, Decl(generalParsingOk.ts, 65, 2)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +((a = x?.()) => {}); +>a : Symbol(a, Decl(generalParsingOk.ts, 66, 2)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +((a = new x?.()) => {}); +>a : Symbol(a, Decl(generalParsingOk.ts, 67, 2)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// - expression bodies +(() => x?.y); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +(() => x?.["y"]); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +(() => x?.()); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +(() => new x?.()); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// parenthesis +(x?.y); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// comma +x?.y, f(); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>f : Symbol(f, Decl(declarations.d.ts, 2, 11)) + +f(), x?.y; +>f : Symbol(f, Decl(declarations.d.ts, 2, 11)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// conditional +x?.y ? 0 : 1 +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +0 ? x?.y : 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +0 ? 1 : x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// binary +x?.y + 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y - 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y * 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y / 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y ** 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y % 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y ^ 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y & 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y | 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y << 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y >> 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y >>> 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y && 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y || 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y == 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y === 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y != 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y !== 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y < 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y <= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y > 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y >= 1; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 + x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 - x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 * x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 / x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 ** x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 % x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 ^ x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 & x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 | x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 << x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 >> x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 >>> x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 && x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 || x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 == x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 === x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 != x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 !== x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 < x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 <= x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 > x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +1 >= x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// prefix unary ++x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +-x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +!x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +~x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// unary +void x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +typeof x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void function * () { yield x?.y; } +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +void async function() { await x?.y; } +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// notnull +x?.y!.z; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// assertions +x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +x?.y as string; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// array literals +[x?.y]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +[, x?.y]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +[...x?.y]; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// literals +1?.toString(); // no need for `..` +>1?.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) + +1.?.toString(); +>1.?.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) + +.0?.toString(); +>.0?.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) + +4e3?.toString(); +>4e3?.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) + +1.e3?.toString(); +>1.e3?.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --)) + +""?.toString(); +>""?.toString : Symbol(String.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(String.toString, Decl(lib.es5.d.ts, --, --)) + +''?.toString(); +>''?.toString : Symbol(String.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(String.toString, Decl(lib.es5.d.ts, --, --)) + +``?.toString(); +>``?.toString : Symbol(String.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(String.toString, Decl(lib.es5.d.ts, --, --)) + +/./?.toString(); +>/./?.toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) + +/./g?.toString(); +>/./g?.toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) + +true?.toString(); +>true?.toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) + +false?.toString(); +>false?.toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) +>toString : Symbol(Object.toString, Decl(lib.es5.d.ts, --, --)) + +// templates +`${x?.y}`; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// variables +var v = x?.y; +>v : Symbol(v, Decl(generalParsingOk.ts, 174, 3), Decl(generalParsingOk.ts, 175, 5), Decl(generalParsingOk.ts, 176, 5), Decl(generalParsingOk.ts, 177, 5), Decl(generalParsingOk.ts, 178, 5), Decl(generalParsingOk.ts, 179, 5)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +var [v] = x?.y; +>v : Symbol(v, Decl(generalParsingOk.ts, 174, 3), Decl(generalParsingOk.ts, 175, 5), Decl(generalParsingOk.ts, 176, 5), Decl(generalParsingOk.ts, 177, 5), Decl(generalParsingOk.ts, 178, 5), Decl(generalParsingOk.ts, 179, 5)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +var [v = x?.y] = [1]; +>v : Symbol(v, Decl(generalParsingOk.ts, 174, 3), Decl(generalParsingOk.ts, 175, 5), Decl(generalParsingOk.ts, 176, 5), Decl(generalParsingOk.ts, 177, 5), Decl(generalParsingOk.ts, 178, 5), Decl(generalParsingOk.ts, 179, 5)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +var {v} = x?.y; +>v : Symbol(v, Decl(generalParsingOk.ts, 174, 3), Decl(generalParsingOk.ts, 175, 5), Decl(generalParsingOk.ts, 176, 5), Decl(generalParsingOk.ts, 177, 5), Decl(generalParsingOk.ts, 178, 5), Decl(generalParsingOk.ts, 179, 5)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +var {v = x?.y} = {v:1}; +>v : Symbol(v, Decl(generalParsingOk.ts, 174, 3), Decl(generalParsingOk.ts, 175, 5), Decl(generalParsingOk.ts, 176, 5), Decl(generalParsingOk.ts, 177, 5), Decl(generalParsingOk.ts, 178, 5), Decl(generalParsingOk.ts, 179, 5)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>v : Symbol(v, Decl(generalParsingOk.ts, 178, 18)) + +var {[x?.y]: v} = null; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>v : Symbol(v, Decl(generalParsingOk.ts, 174, 3), Decl(generalParsingOk.ts, 175, 5), Decl(generalParsingOk.ts, 176, 5), Decl(generalParsingOk.ts, 177, 5), Decl(generalParsingOk.ts, 178, 5), Decl(generalParsingOk.ts, 179, 5)) + +// if/else if +if (x?.y) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +if (1) {} else if (x?.y) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// switch +switch (x?.y) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +switch (1) { case x?.y: break; } +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// do/while +do {} while (x?.y) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +while (x?.y) {} +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// for +for (x?.y; x?.y; x?.y); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// for..in +for (x?.y in {}); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// for..of +for (x?.y of []); +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + +// enums +enum E { +>E : Symbol(E, Decl(generalParsingOk.ts, 200, 17)) + + a = x?.y +>a : Symbol(E.a, Decl(generalParsingOk.ts, 203, 8)) +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) +} + +=== tests/cases/conformance/emitter/esnext/safeNavigation/exportsOk.ts === +export default x?.y; +>x : Symbol(x, Decl(declarations.d.ts, 0, 11)) + diff --git a/tests/baselines/reference/emitter.safeNavigation.esnext.types b/tests/baselines/reference/emitter.safeNavigation.esnext.types new file mode 100644 index 00000000000..3fb62648a62 --- /dev/null +++ b/tests/baselines/reference/emitter.safeNavigation.esnext.types @@ -0,0 +1,1595 @@ +=== tests/cases/conformance/emitter/esnext/safeNavigation/declarations.d.ts === +declare var x: any; +>x : any + +declare var y: any; +>y : any + +declare var f: ({ +>f : { (): void; (): void; new (): any; new (): any; } + + (): void; + (): void; +>T : T + + new (): any; + new (): any; +>T : T + +}) | undefined; +declare var o: { y: typeof f; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>y : { (): void; (): void; new (): any; new (): any; } +>f : { (): void; (): void; new (): any; new (): any; } + +declare class Base { x(): any; } +>Base : Base +>x : () => any + +declare namespace M { +>M : typeof M + + export class y {} +>y : y + + export class z {} +>z : z +>T : T +} +=== tests/cases/conformance/emitter/esnext/safeNavigation/propertyAccessOk.ts === +x.y +>x.y : any +>x : any +>y : any + +x?.y +>x?.y : any +>x : any +>y : any + +x?.y.z +>x?.y.z : any +>x?.y : any +>x : any +>y : any +>z : any + +x.y?.z +>x.y?.z : any +>x.y : any +>x : any +>y : any +>z : any + +x?.y?.z +>x?.y?.z : any +>x?.y : any +>x : any +>y : any +>z : any + +=== tests/cases/conformance/emitter/esnext/safeNavigation/elementAccessOk.ts === +x["y"] +>x["y"] : any +>x : any +>"y" : "y" + +x?.["y"] +>x?.["y"] : any +>x : any +>"y" : "y" + +x?.["y"]["z"] +>x?.["y"]["z"] : any +>x?.["y"] : any +>x : any +>"y" : "y" +>"z" : "z" + +x["y"]?.["z"] +>x["y"]?.["z"] : any +>x["y"] : any +>x : any +>"y" : "y" +>"z" : "z" + +x?.["y"]?.["z"] +>x?.["y"]?.["z"] : any +>x?.["y"] : any +>x : any +>"y" : "y" +>"z" : "z" + +=== tests/cases/conformance/emitter/esnext/safeNavigation/callExpressionOk.ts === +x() +>x() : any +>x : any + +x?.() +>x?.() : any +>x : any + +x.y?.() +>x.y?.() : any +>x.y : any +>x : any +>y : any + +x["y"]?.() +>x["y"]?.() : any +>x["y"] : any +>x : any +>"y" : "y" + +f?.() +>f?.() : void +>f : { (): void; (): void; new (): any; new (): any; } + +o.y?.() +>o.y?.() : void +>o.y : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>y : { (): void; (): void; new (): any; new (): any; } + +o["y"]?.() +>o["y"]?.() : void +>o["y"] : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>"y" : "y" + +=== tests/cases/conformance/emitter/esnext/safeNavigation/newExpressionOk.ts === +new x() +>new x() : any +>x : any + +new x.y?.() +>new x.y?.() : any +>x.y : any +>x : any +>y : any + +new x["y"]?.() +>new x["y"]?.() : any +>x["y"] : any +>x : any +>"y" : "y" + +new f?.() +>new f?.() : any +>f : { (): void; (): void; new (): any; new (): any; } + +new o.y?.() +>new o.y?.() : any +>o.y : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>y : { (): void; (): void; new (): any; new (): any; } + +new o["y"]?.() +>new o["y"]?.() : any +>o["y"] : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>"y" : "y" + +=== tests/cases/conformance/emitter/esnext/safeNavigation/mixedOk.ts === +x?.y?.["z"] +>x?.y?.["z"] : any +>x?.y : any +>x : any +>y : any +>"z" : "z" + +x?.["y"]?.z +>x?.["y"]?.z : any +>x?.["y"] : any +>x : any +>"y" : "y" +>z : any + +x?.y() +>x?.y() : any +>x?.y : any +>x : any +>y : any + +x?.y?.() +>x?.y?.() : any +>x?.y : any +>x : any +>y : any + +o?.y() +>o?.y() : void +>o?.y : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>y : { (): void; (): void; new (): any; new (): any; } + +o?.y?.() +>o?.y?.() : void +>o?.y : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>y : { (): void; (): void; new (): any; new (): any; } + +x?.["z"]() +>x?.["z"]() : any +>x?.["z"] : any +>x : any +>"z" : "z" + +x?.["z"]?.() +>x?.["z"]?.() : any +>x?.["z"] : any +>x : any +>"z" : "z" + +o?.["y"]() +>o?.["y"]() : void +>o?.["y"] : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>"y" : "y" + +o?.["y"]?.() +>o?.["y"]?.() : void +>o?.["y"] : { (): void; (): void; new (): any; new (): any; } +>o : { y: { (): void; (): void; new (): any; new (): any; }; } +>"y" : "y" + +=== tests/cases/conformance/emitter/esnext/safeNavigation/mutationOk.ts === +x?.y = 1 +>x?.y = 1 : 1 +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y += 1; +>x?.y += 1 : any +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y -= 1; +>x?.y -= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y *= 1; +>x?.y *= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y /= 1; +>x?.y /= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y %= 1; +>x?.y %= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y **= 1; +>x?.y **= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y |= 1; +>x?.y |= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y &= 1; +>x?.y &= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y ^= 1; +>x?.y ^= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y <<= 1; +>x?.y <<= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y >>= 1; +>x?.y >>= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y >>>= 1; +>x?.y >>>= 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y++; +>x?.y++ : number +>x?.y : any +>x : any +>y : any + +x?.y--; +>x?.y-- : number +>x?.y : any +>x : any +>y : any + +++x?.y; +>++x?.y : number +>x?.y : any +>x : any +>y : any + +--x?.y; +>--x?.y : number +>x?.y : any +>x : any +>y : any + +delete x?.y; +>delete x?.y : boolean +>x?.y : any +>x : any +>y : any + +x?.["y"] = 1 +>x?.["y"] = 1 : 1 +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] += 1; +>x?.["y"] += 1 : any +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] -= 1; +>x?.["y"] -= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] *= 1; +>x?.["y"] *= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] /= 1; +>x?.["y"] /= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] %= 1; +>x?.["y"] %= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] **= 1; +>x?.["y"] **= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] |= 1; +>x?.["y"] |= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] &= 1; +>x?.["y"] &= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] ^= 1; +>x?.["y"] ^= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] <<= 1; +>x?.["y"] <<= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] >>= 1; +>x?.["y"] >>= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"] >>>= 1; +>x?.["y"] >>>= 1 : number +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +x?.["y"]++; +>x?.["y"]++ : number +>x?.["y"] : any +>x : any +>"y" : "y" + +x?.["y"]--; +>x?.["y"]-- : number +>x?.["y"] : any +>x : any +>"y" : "y" + +++x?.["y"]; +>++x?.["y"] : number +>x?.["y"] : any +>x : any +>"y" : "y" + +--x?.["y"]; +>--x?.["y"] : number +>x?.["y"] : any +>x : any +>"y" : "y" + +delete x?.["y"]; +>delete x?.["y"] : boolean +>x?.["y"] : any +>x : any +>"y" : "y" + +=== tests/cases/conformance/emitter/esnext/safeNavigation/arrayAssignmentPatternOk.ts === +[x?.y] = [1]; +>[x?.y] = [1] : [number] +>[x?.y] : [any] +>x?.y : any +>x : any +>y : any +>[1] : [number] +>1 : 1 + +[x?.["y"]] = [1]; +>[x?.["y"]] = [1] : [number] +>[x?.["y"]] : [any] +>x?.["y"] : any +>x : any +>"y" : "y" +>[1] : [number] +>1 : 1 + +[...x?.y] = [1]; +>[...x?.y] = [1] : number[] +>[...x?.y] : undefined[] +>...x?.y : any +>x?.y : any +>x : any +>y : any +>[1] : number[] +>1 : 1 + +[...x?.["y"]] = [1]; +>[...x?.["y"]] = [1] : number[] +>[...x?.["y"]] : undefined[] +>...x?.["y"] : any +>x?.["y"] : any +>x : any +>"y" : "y" +>[1] : number[] +>1 : 1 + +=== tests/cases/conformance/emitter/esnext/safeNavigation/objectAssignmentPatternOk.ts === +({ a: x?.y } = { a: 1 }); +>({ a: x?.y } = { a: 1 }) : { a: number; } +>{ a: x?.y } = { a: 1 } : { a: number; } +>{ a: x?.y } : { a: any; } +>a : any +>x?.y : any +>x : any +>y : any +>{ a: 1 } : { a: number; } +>a : number +>1 : 1 + +({ a: x?.["y"] } = { a: 1 }); +>({ a: x?.["y"] } = { a: 1 }) : { a: number; } +>{ a: x?.["y"] } = { a: 1 } : { a: number; } +>{ a: x?.["y"] } : { a: any; } +>a : any +>x?.["y"] : any +>x : any +>"y" : "y" +>{ a: 1 } : { a: number; } +>a : number +>1 : 1 + +=== tests/cases/conformance/emitter/esnext/safeNavigation/questionDotDigitIsConditionalOk.ts === +x?.3:1; +>x?.3:1 : 1 | 0.3 +>x : any +>.3 : 0.3 +>1 : 1 + +=== tests/cases/conformance/emitter/esnext/safeNavigation/superPropertyInvocationOk.ts === +// supported for invocation of super property +void class extends Base { +>void class extends Base { m() { super.x?.(); super["x"]?.(); }} : undefined +>class extends Base { m() { super.x?.(); super["x"]?.(); }} : typeof (Anonymous class) +>Base : Base + + m() { +>m : () => void + + super.x?.(); +>super.x?.() : any +>super.x : () => any +>super : Base +>x : () => any + + super["x"]?.(); +>super["x"]?.() : any +>super["x"] : () => any +>super : Base +>"x" : "x" + } +} + +=== tests/cases/conformance/emitter/esnext/safeNavigation/generalParsingOk.ts === +// object literals +// - computed property names +void { [x?.y]: 1 } +>void { [x?.y]: 1 } : undefined +>{ [x?.y]: 1 } : { [x: number]: number; } +>x?.y : any +>x : any +>y : any +>1 : 1 + +void { [x?.["y"]]: 1 } +>void { [x?.["y"]]: 1 } : undefined +>{ [x?.["y"]]: 1 } : { [x: number]: number; } +>x?.["y"] : any +>x : any +>"y" : "y" +>1 : 1 + +void { [x?.()]: 1 } +>void { [x?.()]: 1 } : undefined +>{ [x?.()]: 1 } : { [x: number]: number; } +>x?.() : any +>x : any +>1 : 1 + +void { [new x?.()]: 1 } +>void { [new x?.()]: 1 } : undefined +>{ [new x?.()]: 1 } : { [x: number]: number; } +>new x?.() : any +>x : any +>1 : 1 + +// - property assignments +void { a: x?.y } +>void { a: x?.y } : undefined +>{ a: x?.y } : { a: any; } +>a : any +>x?.y : any +>x : any +>y : any + +void { a: x?.["y"] } +>void { a: x?.["y"] } : undefined +>{ a: x?.["y"] } : { a: any; } +>a : any +>x?.["y"] : any +>x : any +>"y" : "y" + +void { a: x?.() } +>void { a: x?.() } : undefined +>{ a: x?.() } : { a: any; } +>a : any +>x?.() : any +>x : any + +void { a: new x?.() } +>void { a: new x?.() } : undefined +>{ a: new x?.() } : { a: any; } +>a : any +>new x?.() : any +>x : any + +// classes +// - computed property names +// void class { [x?.y] = 1 } // legal parse, but causes a checker error +// void class { [x?.["y"]] = 1 } // legal parse, but causes a checker error +// void class { [x?.()] = 1 } // legal parse, but causes a checker error +// void class { [new f?.()] = 1 } // legal parse, but causes a checker error +void class { [Symbol?.toStringTag] = "" } +>void class { [Symbol?.toStringTag] = "" } : undefined +>class { [Symbol?.toStringTag] = "" } : typeof (Anonymous class) +>Symbol?.toStringTag : symbol +>Symbol : SymbolConstructor +>toStringTag : symbol +>"" : "" + +// - property declarations +void class { a = x?.y } +>void class { a = x?.y } : undefined +>class { a = x?.y } : typeof (Anonymous class) +>a : any +>x?.y : any +>x : any +>y : any + +void class { a = x?.["y"] } +>void class { a = x?.["y"] } : undefined +>class { a = x?.["y"] } : typeof (Anonymous class) +>a : any +>x?.["y"] : any +>x : any +>"y" : "y" + +void class { a = x?.() } +>void class { a = x?.() } : undefined +>class { a = x?.() } : typeof (Anonymous class) +>a : any +>x?.() : any +>x : any + +void class { a = new x?.() } +>void class { a = new x?.() } : undefined +>class { a = new x?.() } : typeof (Anonymous class) +>a : any +>new x?.() : any +>x : any + +// - heritage clauses +void class extends M?.y {} +>void class extends M?.y {} : undefined +>class extends M?.y {} : typeof (Anonymous class) +>M?.y : M.y +>M : typeof M +>y : typeof M.y + +void class extends M?.["y"] {} +>void class extends M?.["y"] {} : undefined +>class extends M?.["y"] {} : typeof (Anonymous class) +>M?.["y"] : M.y +>M : typeof M +>"y" : "y" + +void class extends M?.z {} +>void class extends M?.z {} : undefined +>class extends M?.z {} : typeof (Anonymous class) +>M?.z : M.z +>M : typeof M +>z : typeof M.z + +// - class decorators +@x?.y class C1 {} +>x?.y : any +>x : any +>y : any +>C1 : C1 + +@x?.["y"] class C2 {} +>x?.["y"] : any +>x : any +>"y" : "y" +>C2 : C2 + +@x?.() class C3 {} +>x?.() : any +>x : any +>C3 : C3 + +@new x?.() class C4 {} +>new x?.() : any +>x : any +>C4 : C4 + +// - member decorators +class C5 { @x?.y m() {} } +>C5 : C5 +>x?.y : any +>x : any +>y : any +>m : () => void + +class C6 { @x?.["y"] m() {} } // allowed as ?.[ is not ambiguous with computed property names +>C6 : C6 +>x?.["y"] : any +>x : any +>"y" : "y" +>m : () => void + +class C7 { @x?.() m() {} } +>C7 : C7 +>x?.() : any +>x : any +>m : () => void + +class C8 { @new x?.() m () {} } +>C8 : C8 +>new x?.() : any +>x : any +>m : () => void + +// - parameter decorators +class C9 { m(@x?.y a) {} } +>C9 : C9 +>m : (a: any) => void +>x?.y : any +>x : any +>y : any +>a : any + +class C10 { m(@x?.["y"] a) {} } +>C10 : C10 +>m : (a: any) => void +>x?.["y"] : any +>x : any +>"y" : "y" +>a : any + +class C11 { m(@x?.() a) {} } +>C11 : C11 +>m : (a: any) => void +>x?.() : any +>x : any +>a : any + +class C12 { m(@new x?.() a) {} } +>C12 : C12 +>m : (a: any) => void +>new x?.() : any +>x : any +>a : any + +// functions +// - parameters +void function (a = x?.y) {} +>void function (a = x?.y) {} : undefined +>function (a = x?.y) {} : (a?: any) => void +>a : any +>x?.y : any +>x : any +>y : any + +void function (a = x?.["y"]) {} +>void function (a = x?.["y"]) {} : undefined +>function (a = x?.["y"]) {} : (a?: any) => void +>a : any +>x?.["y"] : any +>x : any +>"y" : "y" + +void function (a = x?.()) {} +>void function (a = x?.()) {} : undefined +>function (a = x?.()) {} : (a?: any) => void +>a : any +>x?.() : any +>x : any + +void function (a = new x?.()) {} +>void function (a = new x?.()) {} : undefined +>function (a = new x?.()) {} : (a?: any) => void +>a : any +>new x?.() : any +>x : any + +// - binding elements +// - initializers +void function ({ a = x?.y }) {} +>void function ({ a = x?.y }) {} : undefined +>function ({ a = x?.y }) {} : ({a}: { a?: any; }) => void +>a : any +>x?.y : any +>x : any +>y : any + +void function ({ a = x?.["y"] }) {} +>void function ({ a = x?.["y"] }) {} : undefined +>function ({ a = x?.["y"] }) {} : ({a}: { a?: any; }) => void +>a : any +>x?.["y"] : any +>x : any +>"y" : "y" + +void function ({ a = x?.() }) {} +>void function ({ a = x?.() }) {} : undefined +>function ({ a = x?.() }) {} : ({a}: { a?: any; }) => void +>a : any +>x?.() : any +>x : any + +void function ({ a = new x?.() }) {} +>void function ({ a = new x?.() }) {} : undefined +>function ({ a = new x?.() }) {} : ({a}: { a?: any; }) => void +>a : any +>new x?.() : any +>x : any + +// - computed properties +void function ({ [x?.y]: a }) {} +>void function ({ [x?.y]: a }) {} : undefined +>function ({ [x?.y]: a }) {} : ({[x?.y]: a}: {}) => void +>x?.y : any +>x : any +>y : any +>a : any + +void function ({ [x?.["y"]]: a }) {} +>void function ({ [x?.["y"]]: a }) {} : undefined +>function ({ [x?.["y"]]: a }) {} : ({[x?.["y"]]: a}: {}) => void +>x?.["y"] : any +>x : any +>"y" : "y" +>a : any + +void function ({ [x?.()]: a }) {} +>void function ({ [x?.()]: a }) {} : undefined +>function ({ [x?.()]: a }) {} : ({[x?.()]: a}: {}) => void +>x?.() : any +>x : any +>a : any + +void function ({ [new x?.()]: a }) {} +>void function ({ [new x?.()]: a }) {}// arrow functions// - parameters((a = x?.y) => {}) : undefined +>function ({ [new x?.()]: a }) {}// arrow functions// - parameters((a = x?.y) => {}) : void +>function ({ [new x?.()]: a }) {} : ({[new x?.()]: a}: (a?: any) => void) => void +>new x?.() : any +>x : any +>a : any + +// arrow functions +// - parameters +((a = x?.y) => {}); +>(a = x?.y) => {} : (a?: any) => void +>a : any +>x?.y : any +>x : any +>y : any + +((a = x?.["y"]) => {}); +>((a = x?.["y"]) => {}) : (a?: any) => void +>(a = x?.["y"]) => {} : (a?: any) => void +>a : any +>x?.["y"] : any +>x : any +>"y" : "y" + +((a = x?.()) => {}); +>((a = x?.()) => {}) : (a?: any) => void +>(a = x?.()) => {} : (a?: any) => void +>a : any +>x?.() : any +>x : any + +((a = new x?.()) => {}); +>((a = new x?.()) => {}) : (a?: any) => void +>(a = new x?.()) => {} : (a?: any) => void +>a : any +>new x?.() : any +>x : any + +// - expression bodies +(() => x?.y); +>(() => x?.y) : () => any +>() => x?.y : () => any +>x?.y : any +>x : any +>y : any + +(() => x?.["y"]); +>(() => x?.["y"]) : () => any +>() => x?.["y"] : () => any +>x?.["y"] : any +>x : any +>"y" : "y" + +(() => x?.()); +>(() => x?.()) : () => any +>() => x?.() : () => any +>x?.() : any +>x : any + +(() => new x?.()); +>(() => new x?.()) : () => any +>() => new x?.() : () => any +>new x?.() : any +>x : any + +// parenthesis +(x?.y); +>(x?.y) : any +>x?.y : any +>x : any +>y : any + +// comma +x?.y, f(); +>x?.y, f() : void +>x?.y : any +>x : any +>y : any +>f() : void +>f : { (): void; (): void; new (): any; new (): any; } + +f(), x?.y; +>f(), x?.y : any +>f() : void +>f : { (): void; (): void; new (): any; new (): any; } +>x?.y : any +>x : any +>y : any + +// conditional +x?.y ? 0 : 1 +>x?.y ? 0 : 1 : 1 | 0 +>x?.y : any +>x : any +>y : any +>0 : 0 +>1 : 1 + +0 ? x?.y : 1; +>0 ? x?.y : 1 : any +>0 : 0 +>x?.y : any +>x : any +>y : any +>1 : 1 + +0 ? 1 : x?.y; +>0 ? 1 : x?.y : any +>0 : 0 +>1 : 1 +>x?.y : any +>x : any +>y : any + +// binary +x?.y + 1; +>x?.y + 1 : any +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y - 1; +>x?.y - 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y * 1; +>x?.y * 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y / 1; +>x?.y / 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y ** 1; +>x?.y ** 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y % 1; +>x?.y % 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y ^ 1; +>x?.y ^ 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y & 1; +>x?.y & 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y | 1; +>x?.y | 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y << 1; +>x?.y << 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y >> 1; +>x?.y >> 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y >>> 1; +>x?.y >>> 1 : number +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y && 1; +>x?.y && 1 : 0 | 1 +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y || 1; +>x?.y || 1 : any +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y == 1; +>x?.y == 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y === 1; +>x?.y === 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y != 1; +>x?.y != 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y !== 1; +>x?.y !== 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y < 1; +>x?.y < 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y <= 1; +>x?.y <= 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y > 1; +>x?.y > 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +x?.y >= 1; +>x?.y >= 1 : boolean +>x?.y : any +>x : any +>y : any +>1 : 1 + +1 + x?.y; +>1 + x?.y : any +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 - x?.y; +>1 - x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 * x?.y; +>1 * x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 / x?.y; +>1 / x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 ** x?.y; +>1 ** x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 % x?.y; +>1 % x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 ^ x?.y; +>1 ^ x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 & x?.y; +>1 & x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 | x?.y; +>1 | x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 << x?.y; +>1 << x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 >> x?.y; +>1 >> x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 >>> x?.y; +>1 >>> x?.y : number +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 && x?.y; +>1 && x?.y : any +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 || x?.y; +>1 || x?.y : any +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 == x?.y; +>1 == x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 === x?.y; +>1 === x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 != x?.y; +>1 != x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 !== x?.y; +>1 !== x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 < x?.y; +>1 < x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 <= x?.y; +>1 <= x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 > x?.y; +>1 > x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +1 >= x?.y; +>1 >= x?.y : boolean +>1 : 1 +>x?.y : any +>x : any +>y : any + +// prefix unary ++x?.y; +>+x?.y : number +>x?.y : any +>x : any +>y : any + +-x?.y; +>-x?.y : number +>x?.y : any +>x : any +>y : any + +!x?.y; +>!x?.y : boolean +>x?.y : any +>x : any +>y : any + +~x?.y; +>~x?.y : number +>x?.y : any +>x : any +>y : any + +// unary +void x?.y; +>void x?.y : undefined +>x?.y : any +>x : any +>y : any + +typeof x?.y; +>typeof x?.y : "string" | "number" | "boolean" | "symbol" | "undefined" | "object" | "function" +>x?.y : any +>x : any +>y : any + +void function * () { yield x?.y; } +>void function * () { yield x?.y; } : undefined +>function * () { yield x?.y; } : () => IterableIterator +>yield x?.y : any +>x?.y : any +>x : any +>y : any + +void async function() { await x?.y; } +>void async function() { await x?.y; } : undefined +>async function() { await x?.y; } : () => Promise +>await x?.y : any +>x?.y : any +>x : any +>y : any + +// notnull +x?.y!.z; +>x?.y!.z : any +>x?.y! : any +>x?.y : any +>x : any +>y : any +>z : any + +// assertions +x?.y; +>x?.y : string +>x?.y : any +>x : any +>y : any + +x?.y as string; +>x?.y as string : string +>x?.y : any +>x : any +>y : any + +// array literals +[x?.y]; +>[x?.y] : any[] +>x?.y : any +>x : any +>y : any + +[, x?.y]; +>[, x?.y] : any[] +> : undefined +>x?.y : any +>x : any +>y : any + +[...x?.y]; +>[...x?.y] : any[] +>...x?.y : any +>x?.y : any +>x : any +>y : any + +// literals +1?.toString(); // no need for `..` +>1?.toString() : string +>1?.toString : (radix?: number) => string +>1 : 1 +>toString : (radix?: number) => string + +1.?.toString(); +>1.?.toString() : string +>1.?.toString : (radix?: number) => string +>1. : 1 +>toString : (radix?: number) => string + +.0?.toString(); +>.0?.toString() : string +>.0?.toString : (radix?: number) => string +>.0 : 0 +>toString : (radix?: number) => string + +4e3?.toString(); +>4e3?.toString() : string +>4e3?.toString : (radix?: number) => string +>4e3 : 4000 +>toString : (radix?: number) => string + +1.e3?.toString(); +>1.e3?.toString() : string +>1.e3?.toString : (radix?: number) => string +>1.e3 : 1000 +>toString : (radix?: number) => string + +""?.toString(); +>""?.toString() : string +>""?.toString : () => string +>"" : "" +>toString : () => string + +''?.toString(); +>''?.toString() : string +>''?.toString : () => string +>'' : "" +>toString : () => string + +``?.toString(); +>``?.toString() : string +>``?.toString : () => string +>`` : string +>toString : () => string + +/./?.toString(); +>/./?.toString() : string +>/./?.toString : () => string +>/./ : RegExp +>toString : () => string + +/./g?.toString(); +>/./g?.toString() : string +>/./g?.toString : () => string +>/./g : RegExp +>toString : () => string + +true?.toString(); +>true?.toString() : string +>true?.toString : () => string +>true : true +>toString : () => string + +false?.toString(); +>false?.toString() : string +>false?.toString : () => string +>false : false +>toString : () => string + +// templates +`${x?.y}`; +>`${x?.y}` : string +>x?.y : any +>x : any +>y : any + +// variables +var v = x?.y; +>v : any +>x?.y : any +>x : any +>y : any + +var [v] = x?.y; +>v : any +>x?.y : any +>x : any +>y : any + +var [v = x?.y] = [1]; +>v : any +>x?.y : any +>x : any +>y : any +>[1] : [number] +>1 : 1 + +var {v} = x?.y; +>v : any +>x?.y : any +>x : any +>y : any + +var {v = x?.y} = {v:1}; +>v : any +>x?.y : any +>x : any +>y : any +>{v:1} : { v?: number; } +>v : number +>1 : 1 + +var {[x?.y]: v} = null; +>x?.y : any +>x : any +>y : any +>v : any +>null : null + +// if/else if +if (x?.y) {} +>x?.y : any +>x : any +>y : any + +if (1) {} else if (x?.y) {} +>1 : 1 +>x?.y : any +>x : any +>y : any + +// switch +switch (x?.y) {} +>x?.y : any +>x : any +>y : any + +switch (1) { case x?.y: break; } +>1 : 1 +>x?.y : any +>x : any +>y : any + +// do/while +do {} while (x?.y) +>x?.y : any +>x : any +>y : any + +while (x?.y) {} +>x?.y : any +>x : any +>y : any + +// for +for (x?.y; x?.y; x?.y); +>x?.y : any +>x : any +>y : any +>x?.y : any +>x : any +>y : any +>x?.y : any +>x : any +>y : any + +// for..in +for (x?.y in {}); +>x?.y : any +>x : any +>y : any +>{} : {} + +// for..of +for (x?.y of []); +>x?.y : any +>x : any +>y : any +>[] : undefined[] + +// enums +enum E { +>E : E + + a = x?.y +>a : E +>x?.y : any +>x : any +>y : any +} + +=== tests/cases/conformance/emitter/esnext/safeNavigation/exportsOk.ts === +export default x?.y; +>x?.y : any +>x : any +>y : any + diff --git a/tests/baselines/reference/parser.safeNavigation.esnext.errors.txt b/tests/baselines/reference/parser.safeNavigation.esnext.errors.txt new file mode 100644 index 00000000000..e0590469eb7 --- /dev/null +++ b/tests/baselines/reference/parser.safeNavigation.esnext.errors.txt @@ -0,0 +1,383 @@ +tests/cases/conformance/parser/ecmascriptnext/safeNavigation/metaPropertyError.ts(4,12): error TS1109: Expression expected. +tests/cases/conformance/parser/ecmascriptnext/safeNavigation/missingIdentifierError.ts(1,4): error TS1003: Identifier expected. +tests/cases/conformance/parser/ecmascriptnext/safeNavigation/spaceInTokenError.ts(1,4): error TS1109: Expression expected. +tests/cases/conformance/parser/ecmascriptnext/safeNavigation/spaceInTokenError.ts(1,6): error TS1005: ':' expected. +tests/cases/conformance/parser/ecmascriptnext/safeNavigation/superError.ts(4,14): error TS1012: Unexpected token. +tests/cases/conformance/parser/ecmascriptnext/safeNavigation/superProperty1Error.ts(4,14): error TS1005: '.' expected. +tests/cases/conformance/parser/ecmascriptnext/safeNavigation/superProperty2Error.ts(4,14): error TS1012: Unexpected token. +tests/cases/conformance/parser/ecmascriptnext/safeNavigation/taggedTemplateError.ts(2,4): error TS1003: Identifier expected. +tests/cases/conformance/parser/ecmascriptnext/safeNavigation/taggedTemplateError.ts(2,10): error TS2304: Cannot find name 'bar'. + + +==== tests/cases/conformance/parser/ecmascriptnext/safeNavigation/declarations.d.ts (0 errors) ==== + declare var x: any; + declare var y: any; + declare var f: ({ + (): void; + (): void; + new (): any; + new (): any; + }) | undefined; + declare var o: { y: typeof f; } + declare class Base { x: any; } + declare namespace M { + export class y {} + export class z {} + } +==== tests/cases/conformance/parser/ecmascriptnext/safeNavigation/propertyAccessOk.ts (0 errors) ==== + x.y + x?.y + x?.y.z + x.y?.z + x?.y?.z +==== tests/cases/conformance/parser/ecmascriptnext/safeNavigation/elementAccessOk.ts (0 errors) ==== + x["y"] + x?.["y"] + x?.["y"]["z"] + x["y"]?.["z"] + x?.["y"]?.["z"] +==== tests/cases/conformance/parser/ecmascriptnext/safeNavigation/callExpressionOk.ts (0 errors) ==== + x() + x?.() + x.y?.() + x["y"]?.() + f?.() + o.y?.() + o["y"]?.() +==== tests/cases/conformance/parser/ecmascriptnext/safeNavigation/newExpressionOk.ts (0 errors) ==== + new x() + new x.y?.() + new x["y"]?.() + new f?.() + new o.y?.() + new o["y"]?.() +==== tests/cases/conformance/parser/ecmascriptnext/safeNavigation/mixedOk.ts (0 errors) ==== + x?.y?.["z"] + x?.["y"]?.z + x?.y() + x?.y?.() + o?.y() + o?.y?.() + x?.["z"]() + x?.["z"]?.() + o?.["y"]() + o?.["y"]?.() +==== tests/cases/conformance/parser/ecmascriptnext/safeNavigation/mutationOk.ts (0 errors) ==== + x?.y = 1 + x?.y += 1; + x?.y -= 1; + x?.y *= 1; + x?.y /= 1; + x?.y %= 1; + x?.y **= 1; + x?.y |= 1; + x?.y &= 1; + x?.y ^= 1; + x?.y <<= 1; + x?.y >>= 1; + x?.y >>>= 1; + x?.y++; + x?.y--; + ++x?.y; + --x?.y; + delete x?.y; + x?.["y"] = 1 + x?.["y"] += 1; + x?.["y"] -= 1; + x?.["y"] *= 1; + x?.["y"] /= 1; + x?.["y"] %= 1; + x?.["y"] **= 1; + x?.["y"] |= 1; + x?.["y"] &= 1; + x?.["y"] ^= 1; + x?.["y"] <<= 1; + x?.["y"] >>= 1; + x?.["y"] >>>= 1; + x?.["y"]++; + x?.["y"]--; + ++x?.["y"]; + --x?.["y"]; + delete x?.["y"]; +==== tests/cases/conformance/parser/ecmascriptnext/safeNavigation/arrayAssignmentPatternOk.ts (0 errors) ==== + [x?.y] = [1]; + [x?.["y"]] = [1]; + [...x?.y] = [1]; + [...x?.["y"]] = [1]; +==== tests/cases/conformance/parser/ecmascriptnext/safeNavigation/objectAssignmentPatternOk.ts (0 errors) ==== + ({ a: x?.y } = { a: 1 }); + ({ a: x?.["y"] } = { a: 1 }); +==== tests/cases/conformance/parser/ecmascriptnext/safeNavigation/questionDotDigitIsConditionalOk.ts (0 errors) ==== + x?.3:1; +==== tests/cases/conformance/parser/ecmascriptnext/safeNavigation/spaceInTokenError.ts (2 errors) ==== + x? .y + ~ +!!! error TS1109: Expression expected. + +!!! error TS1005: ':' expected. +==== tests/cases/conformance/parser/ecmascriptnext/safeNavigation/missingIdentifierError.ts (1 errors) ==== + x?. + +!!! error TS1003: Identifier expected. +==== tests/cases/conformance/parser/ecmascriptnext/safeNavigation/taggedTemplateError.ts (2 errors) ==== + // not supported for tagged templates + x?.`foo${bar}` + ~~~~~~ +!!! error TS1003: Identifier expected. + ~~~ +!!! error TS2304: Cannot find name 'bar'. +==== tests/cases/conformance/parser/ecmascriptnext/safeNavigation/superError.ts (1 errors) ==== + // not supported for super + void class extends Base { + constructor() { + super?.(); + ~~ +!!! error TS1012: Unexpected token. + } + } +==== tests/cases/conformance/parser/ecmascriptnext/safeNavigation/superProperty1Error.ts (1 errors) ==== + // not supported for super property + void class extends Base { + m() { + super?.x; + ~~ +!!! error TS1005: '.' expected. + } + } +==== tests/cases/conformance/parser/ecmascriptnext/safeNavigation/superProperty2Error.ts (1 errors) ==== + // not supported for super property + void class extends Base { + m() { + super?.["x"]; + ~~ +!!! error TS1012: Unexpected token. + } + } +==== tests/cases/conformance/parser/ecmascriptnext/safeNavigation/superPropertyInvocationOk.ts (0 errors) ==== + // supported for invocation of super property + void class extends Base { + m() { + super.x?.(); + super["x"]?.(); + } + } +==== tests/cases/conformance/parser/ecmascriptnext/safeNavigation/metaPropertyError.ts (1 errors) ==== + // not supported for meta property + void class { + constructor() { + new?.target; + ~~ +!!! error TS1109: Expression expected. + } + } + +==== tests/cases/conformance/parser/ecmascriptnext/safeNavigation/generalParsingOk.ts (0 errors) ==== + // object literals + // - computed property names + void { [x?.y]: 1 } + void { [x?.["y"]]: 1 } + void { [x?.()]: 1 } + void { [new x?.()]: 1 } + // - property assignments + void { a: x?.y } + void { a: x?.["y"] } + void { a: x?.() } + void { a: new x?.() } + + // classes + // - computed property names + // void class { [x?.y] = 1 } // legal parse, but causes a checker error + // void class { [x?.["y"]] = 1 } // legal parse, but causes a checker error + // void class { [x?.()] = 1 } // legal parse, but causes a checker error + // void class { [new f?.()] = 1 } // legal parse, but causes a checker error + void class { [Symbol?.toStringTag] = "" } + // - property declarations + void class { a = x?.y } + void class { a = x?.["y"] } + void class { a = x?.() } + void class { a = new x?.() } + // - heritage clauses + void class extends M?.y {} + void class extends M?.["y"] {} + void class extends M?.z {} + // - class decorators + @x?.y class C1 {} + @x?.["y"] class C2 {} + @x?.() class C3 {} + @new x?.() class C4 {} + // - member decorators + class C5 { @x?.y m() {} } + class C6 { @x?.["y"] m() {} } // allowed as ?.[ is not ambiguous with computed property names + class C7 { @x?.() m() {} } + class C8 { @new x?.() m () {} } + // - parameter decorators + class C9 { m(@x?.y a) {} } + class C10 { m(@x?.["y"] a) {} } + class C11 { m(@x?.() a) {} } + class C12 { m(@new x?.() a) {} } + + // functions + // - parameters + void function (a = x?.y) {} + void function (a = x?.["y"]) {} + void function (a = x?.()) {} + void function (a = new x?.()) {} + // - binding elements + // - initializers + void function ({ a = x?.y }) {} + void function ({ a = x?.["y"] }) {} + void function ({ a = x?.() }) {} + void function ({ a = new x?.() }) {} + // - computed properties + void function ({ [x?.y]: a }) {} + void function ({ [x?.["y"]]: a }) {} + void function ({ [x?.()]: a }) {} + void function ({ [new x?.()]: a }) {} + + // arrow functions + // - parameters + ((a = x?.y) => {}); + ((a = x?.["y"]) => {}); + ((a = x?.()) => {}); + ((a = new x?.()) => {}); + // - expression bodies + (() => x?.y); + (() => x?.["y"]); + (() => x?.()); + (() => new x?.()); + + // parenthesis + (x?.y); + + // comma + x?.y, f(); + f(), x?.y; + + // conditional + x?.y ? 0 : 1 + 0 ? x?.y : 1; + 0 ? 1 : x?.y; + + // binary + x?.y + 1; + x?.y - 1; + x?.y * 1; + x?.y / 1; + x?.y ** 1; + x?.y % 1; + x?.y ^ 1; + x?.y & 1; + x?.y | 1; + x?.y << 1; + x?.y >> 1; + x?.y >>> 1; + x?.y && 1; + x?.y || 1; + x?.y == 1; + x?.y === 1; + x?.y != 1; + x?.y !== 1; + x?.y < 1; + x?.y <= 1; + x?.y > 1; + x?.y >= 1; + 1 + x?.y; + 1 - x?.y; + 1 * x?.y; + 1 / x?.y; + 1 ** x?.y; + 1 % x?.y; + 1 ^ x?.y; + 1 & x?.y; + 1 | x?.y; + 1 << x?.y; + 1 >> x?.y; + 1 >>> x?.y; + 1 && x?.y; + 1 || x?.y; + 1 == x?.y; + 1 === x?.y; + 1 != x?.y; + 1 !== x?.y; + 1 < x?.y; + 1 <= x?.y; + 1 > x?.y; + 1 >= x?.y; + + // prefix unary + +x?.y; + -x?.y; + !x?.y; + ~x?.y; + + // unary + void x?.y; + typeof x?.y; + void function * () { yield x?.y; } + void async function() { await x?.y; } + + // notnull + x?.y!.z; + + // assertions + x?.y; + x?.y as string; + + // array literals + [x?.y]; + [, x?.y]; + [...x?.y]; + + // literals + 1?.toString(); // no need for `..` + 1.?.toString(); + .0?.toString(); + 4e3?.toString(); + 1.e3?.toString(); + ""?.toString(); + ''?.toString(); + ``?.toString(); + /./?.toString(); + /./g?.toString(); + true?.toString(); + false?.toString(); + + // templates + `${x?.y}`; + + // variables + var v = x?.y; + var [v] = x?.y; + var [v = x?.y] = [1]; + var {v} = x?.y; + var {v = x?.y} = {v:1}; + var {[x?.y]: v} = null; + + // if/else if + if (x?.y) {} + if (1) {} else if (x?.y) {} + + // switch + switch (x?.y) {} + switch (1) { case x?.y: break; } + + // do/while + do {} while (x?.y) + while (x?.y) {} + + // for + for (x?.y; x?.y; x?.y); + + // for..in + for (x?.y in {}); + + // for..of + for (x?.y of []); + + // enums + enum E { + a = x?.y + } + +==== tests/cases/conformance/parser/ecmascriptnext/safeNavigation/exportsOk.ts (0 errors) ==== + export default x?.y; \ No newline at end of file diff --git a/tests/baselines/reference/types.safeNavigation.esnext.1.symbols b/tests/baselines/reference/types.safeNavigation.esnext.1.symbols new file mode 100644 index 00000000000..f5a4ad6ceab --- /dev/null +++ b/tests/baselines/reference/types.safeNavigation.esnext.1.symbols @@ -0,0 +1,144 @@ +=== tests/cases/conformance/types/safeNavigation/types.safeNavigation.esnext.1.ts === +declare const x1: (() => number) | undefined | null; +>x1 : Symbol(x1, Decl(types.safeNavigation.esnext.1.ts, 0, 13)) + +declare const x2: { y: (() => number) | undefined | null; }; +>x2 : Symbol(x2, Decl(types.safeNavigation.esnext.1.ts, 1, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 1, 19)) + +declare const x3: { y: (() => number) | undefined | null; } | undefined | null; +>x3 : Symbol(x3, Decl(types.safeNavigation.esnext.1.ts, 2, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 2, 19)) + +declare const x4: { y: { z: (() => number) | undefined | null; } }; +>x4 : Symbol(x4, Decl(types.safeNavigation.esnext.1.ts, 3, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 3, 19)) +>z : Symbol(z, Decl(types.safeNavigation.esnext.1.ts, 3, 24)) + +declare const x5: { y: { z: (() => number) | undefined | null; } | undefined | null } | undefined | null; +>x5 : Symbol(x5, Decl(types.safeNavigation.esnext.1.ts, 4, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 4, 19)) +>z : Symbol(z, Decl(types.safeNavigation.esnext.1.ts, 4, 24)) + +declare const x6: { y: number } | undefined | null; +>x6 : Symbol(x6, Decl(types.safeNavigation.esnext.1.ts, 5, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 5, 19)) + +declare const x7: { y: any }; +>x7 : Symbol(x7, Decl(types.safeNavigation.esnext.1.ts, 6, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 6, 19)) + +declare const x8: { y: { z: number } | undefined | null } | undefined | null; +>x8 : Symbol(x8, Decl(types.safeNavigation.esnext.1.ts, 7, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 7, 19)) +>z : Symbol(z, Decl(types.safeNavigation.esnext.1.ts, 7, 24)) + +declare const y: "y"; +>y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 8, 13)) + +declare const z: "z"; +>z : Symbol(z, Decl(types.safeNavigation.esnext.1.ts, 9, 13)) + +x1?.(); +>x1 : Symbol(x1, Decl(types.safeNavigation.esnext.1.ts, 0, 13)) + +(x1)?.(); +>x1 : Symbol(x1, Decl(types.safeNavigation.esnext.1.ts, 0, 13)) + +x2.y?.(); +>x2.y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 1, 19)) +>x2 : Symbol(x2, Decl(types.safeNavigation.esnext.1.ts, 1, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 1, 19)) + +x2[y]?.(); +>x2 : Symbol(x2, Decl(types.safeNavigation.esnext.1.ts, 1, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 8, 13)) + +(x2.y)?.(); +>x2.y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 1, 19)) +>x2 : Symbol(x2, Decl(types.safeNavigation.esnext.1.ts, 1, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 1, 19)) + +(x2[y])?.(); +>x2 : Symbol(x2, Decl(types.safeNavigation.esnext.1.ts, 1, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 8, 13)) + +x3?.y?.(); +>x3?.y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 2, 19)) +>x3 : Symbol(x3, Decl(types.safeNavigation.esnext.1.ts, 2, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 2, 19)) + +x3?.[y]?.(); +>x3 : Symbol(x3, Decl(types.safeNavigation.esnext.1.ts, 2, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 8, 13)) + +x4.y.z?.(); +>x4.y.z : Symbol(z, Decl(types.safeNavigation.esnext.1.ts, 3, 24)) +>x4.y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 3, 19)) +>x4 : Symbol(x4, Decl(types.safeNavigation.esnext.1.ts, 3, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 3, 19)) +>z : Symbol(z, Decl(types.safeNavigation.esnext.1.ts, 3, 24)) + +x4.y[z]?.(); +>x4.y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 3, 19)) +>x4 : Symbol(x4, Decl(types.safeNavigation.esnext.1.ts, 3, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 3, 19)) +>z : Symbol(z, Decl(types.safeNavigation.esnext.1.ts, 9, 13)) + +(x4.y.z)?.(); +>x4.y.z : Symbol(z, Decl(types.safeNavigation.esnext.1.ts, 3, 24)) +>x4.y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 3, 19)) +>x4 : Symbol(x4, Decl(types.safeNavigation.esnext.1.ts, 3, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 3, 19)) +>z : Symbol(z, Decl(types.safeNavigation.esnext.1.ts, 3, 24)) + +(x4.y[z])?.(); +>x4.y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 3, 19)) +>x4 : Symbol(x4, Decl(types.safeNavigation.esnext.1.ts, 3, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 3, 19)) +>z : Symbol(z, Decl(types.safeNavigation.esnext.1.ts, 9, 13)) + +x5?.y?.z?.(); +>x5?.y?.z : Symbol(z, Decl(types.safeNavigation.esnext.1.ts, 4, 24)) +>x5?.y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 4, 19)) +>x5 : Symbol(x5, Decl(types.safeNavigation.esnext.1.ts, 4, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 4, 19)) +>z : Symbol(z, Decl(types.safeNavigation.esnext.1.ts, 4, 24)) + +x5?.y?.z; +>x5?.y?.z : Symbol(z, Decl(types.safeNavigation.esnext.1.ts, 4, 24)) +>x5?.y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 4, 19)) +>x5 : Symbol(x5, Decl(types.safeNavigation.esnext.1.ts, 4, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 4, 19)) +>z : Symbol(z, Decl(types.safeNavigation.esnext.1.ts, 4, 24)) + +x5?.[y]?.[z]; +>x5 : Symbol(x5, Decl(types.safeNavigation.esnext.1.ts, 4, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 8, 13)) +>z : Symbol(z, Decl(types.safeNavigation.esnext.1.ts, 9, 13)) + +x6?.y = 1; +>x6?.y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 5, 19)) +>x6 : Symbol(x6, Decl(types.safeNavigation.esnext.1.ts, 5, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 5, 19)) + +x6?.y += 1; +>x6?.y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 5, 19)) +>x6 : Symbol(x6, Decl(types.safeNavigation.esnext.1.ts, 5, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 5, 19)) + +x6?.y *= 1; +>x6?.y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 5, 19)) +>x6 : Symbol(x6, Decl(types.safeNavigation.esnext.1.ts, 5, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 5, 19)) + +x6?.y++; +>x6?.y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 5, 19)) +>x6 : Symbol(x6, Decl(types.safeNavigation.esnext.1.ts, 5, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 5, 19)) + +++x6?.y; +>x6?.y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 5, 19)) +>x6 : Symbol(x6, Decl(types.safeNavigation.esnext.1.ts, 5, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.1.ts, 5, 19)) + diff --git a/tests/baselines/reference/types.safeNavigation.esnext.1.types b/tests/baselines/reference/types.safeNavigation.esnext.1.types new file mode 100644 index 00000000000..6d51e2e820e --- /dev/null +++ b/tests/baselines/reference/types.safeNavigation.esnext.1.types @@ -0,0 +1,188 @@ +=== tests/cases/conformance/types/safeNavigation/types.safeNavigation.esnext.1.ts === +declare const x1: (() => number) | undefined | null; +>x1 : () => number +>null : null + +declare const x2: { y: (() => number) | undefined | null; }; +>x2 : { y: () => number; } +>y : () => number +>null : null + +declare const x3: { y: (() => number) | undefined | null; } | undefined | null; +>x3 : { y: () => number; } +>y : () => number +>null : null +>null : null + +declare const x4: { y: { z: (() => number) | undefined | null; } }; +>x4 : { y: { z: () => number; }; } +>y : { z: () => number; } +>z : () => number +>null : null + +declare const x5: { y: { z: (() => number) | undefined | null; } | undefined | null } | undefined | null; +>x5 : { y: { z: () => number; }; } +>y : { z: () => number; } +>z : () => number +>null : null +>null : null +>null : null + +declare const x6: { y: number } | undefined | null; +>x6 : { y: number; } +>y : number +>null : null + +declare const x7: { y: any }; +>x7 : { y: any; } +>y : any + +declare const x8: { y: { z: number } | undefined | null } | undefined | null; +>x8 : { y: { z: number; }; } +>y : { z: number; } +>z : number +>null : null +>null : null + +declare const y: "y"; +>y : "y" + +declare const z: "z"; +>z : "z" + +x1?.(); +>x1?.() : number +>x1 : () => number + +(x1)?.(); +>(x1)?.() : number +>(x1) : () => number +>x1 : () => number + +x2.y?.(); +>x2.y?.() : number +>x2.y : () => number +>x2 : { y: () => number; } +>y : () => number + +x2[y]?.(); +>x2[y]?.() : number +>x2[y] : () => number +>x2 : { y: () => number; } +>y : "y" + +(x2.y)?.(); +>(x2.y)?.() : number +>(x2.y) : () => number +>x2.y : () => number +>x2 : { y: () => number; } +>y : () => number + +(x2[y])?.(); +>(x2[y])?.() : number +>(x2[y]) : () => number +>x2[y] : () => number +>x2 : { y: () => number; } +>y : "y" + +x3?.y?.(); +>x3?.y?.() : number +>x3?.y : () => number +>x3 : { y: () => number; } +>y : () => number + +x3?.[y]?.(); +>x3?.[y]?.() : number +>x3?.[y] : () => number +>x3 : { y: () => number; } +>y : "y" + +x4.y.z?.(); +>x4.y.z?.() : number +>x4.y.z : () => number +>x4.y : { z: () => number; } +>x4 : { y: { z: () => number; }; } +>y : { z: () => number; } +>z : () => number + +x4.y[z]?.(); +>x4.y[z]?.() : number +>x4.y[z] : () => number +>x4.y : { z: () => number; } +>x4 : { y: { z: () => number; }; } +>y : { z: () => number; } +>z : "z" + +(x4.y.z)?.(); +>(x4.y.z)?.() : number +>(x4.y.z) : () => number +>x4.y.z : () => number +>x4.y : { z: () => number; } +>x4 : { y: { z: () => number; }; } +>y : { z: () => number; } +>z : () => number + +(x4.y[z])?.(); +>(x4.y[z])?.() : number +>(x4.y[z]) : () => number +>x4.y[z] : () => number +>x4.y : { z: () => number; } +>x4 : { y: { z: () => number; }; } +>y : { z: () => number; } +>z : "z" + +x5?.y?.z?.(); +>x5?.y?.z?.() : number +>x5?.y?.z : () => number +>x5?.y : { z: () => number; } +>x5 : { y: { z: () => number; }; } +>y : { z: () => number; } +>z : () => number + +x5?.y?.z; +>x5?.y?.z : () => number +>x5?.y : { z: () => number; } +>x5 : { y: { z: () => number; }; } +>y : { z: () => number; } +>z : () => number + +x5?.[y]?.[z]; +>x5?.[y]?.[z] : () => number +>x5?.[y] : { z: () => number; } +>x5 : { y: { z: () => number; }; } +>y : "y" +>z : "z" + +x6?.y = 1; +>x6?.y = 1 : 1 +>x6?.y : number +>x6 : { y: number; } +>y : number +>1 : 1 + +x6?.y += 1; +>x6?.y += 1 : number +>x6?.y : number +>x6 : { y: number; } +>y : number +>1 : 1 + +x6?.y *= 1; +>x6?.y *= 1 : number +>x6?.y : number +>x6 : { y: number; } +>y : number +>1 : 1 + +x6?.y++; +>x6?.y++ : number +>x6?.y : number +>x6 : { y: number; } +>y : number + +++x6?.y; +>++x6?.y : number +>x6?.y : number +>x6 : { y: number; } +>y : number + diff --git a/tests/baselines/reference/types.safeNavigation.esnext.2.symbols b/tests/baselines/reference/types.safeNavigation.esnext.2.symbols new file mode 100644 index 00000000000..4d715b65bd0 --- /dev/null +++ b/tests/baselines/reference/types.safeNavigation.esnext.2.symbols @@ -0,0 +1,164 @@ +=== tests/cases/conformance/types/safeNavigation/types.safeNavigation.esnext.2.ts === +declare const x1: (() => number) | undefined | null; +>x1 : Symbol(x1, Decl(types.safeNavigation.esnext.2.ts, 0, 13)) + +declare const x2: { y: (() => number) | undefined | null; }; +>x2 : Symbol(x2, Decl(types.safeNavigation.esnext.2.ts, 1, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 1, 19)) + +declare const x3: { y: (() => number) | undefined | null; } | undefined | null; +>x3 : Symbol(x3, Decl(types.safeNavigation.esnext.2.ts, 2, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 2, 19)) + +declare const x4: { y: { z: (() => number) | undefined | null; } }; +>x4 : Symbol(x4, Decl(types.safeNavigation.esnext.2.ts, 3, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 3, 19)) +>z : Symbol(z, Decl(types.safeNavigation.esnext.2.ts, 3, 24)) + +declare const x5: { y: { z: (() => number) | undefined | null; } | undefined | null } | undefined | null; +>x5 : Symbol(x5, Decl(types.safeNavigation.esnext.2.ts, 4, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 4, 19)) +>z : Symbol(z, Decl(types.safeNavigation.esnext.2.ts, 4, 24)) + +declare const x6: { y: number } | undefined | null; +>x6 : Symbol(x6, Decl(types.safeNavigation.esnext.2.ts, 5, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 5, 19)) + +declare const x7: { y: any }; +>x7 : Symbol(x7, Decl(types.safeNavigation.esnext.2.ts, 6, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 6, 19)) + +declare const x8: { y: { z: number } | undefined | null } | undefined | null; +>x8 : Symbol(x8, Decl(types.safeNavigation.esnext.2.ts, 7, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 7, 19)) +>z : Symbol(z, Decl(types.safeNavigation.esnext.2.ts, 7, 24)) + +declare const y: "y"; +>y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 8, 13)) + +declare const z: "z"; +>z : Symbol(z, Decl(types.safeNavigation.esnext.2.ts, 9, 13)) + +const a1 = x1?.(); +>a1 : Symbol(a1, Decl(types.safeNavigation.esnext.2.ts, 11, 5)) +>x1 : Symbol(x1, Decl(types.safeNavigation.esnext.2.ts, 0, 13)) + +const a2 = (x1)?.(); +>a2 : Symbol(a2, Decl(types.safeNavigation.esnext.2.ts, 12, 5)) +>x1 : Symbol(x1, Decl(types.safeNavigation.esnext.2.ts, 0, 13)) + +const a3 = x2.y?.(); +>a3 : Symbol(a3, Decl(types.safeNavigation.esnext.2.ts, 14, 5)) +>x2.y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 1, 19)) +>x2 : Symbol(x2, Decl(types.safeNavigation.esnext.2.ts, 1, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 1, 19)) + +const a4 = x2[y]?.(); +>a4 : Symbol(a4, Decl(types.safeNavigation.esnext.2.ts, 15, 5)) +>x2 : Symbol(x2, Decl(types.safeNavigation.esnext.2.ts, 1, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 8, 13)) + +const a5 = (x2.y)?.(); +>a5 : Symbol(a5, Decl(types.safeNavigation.esnext.2.ts, 16, 5)) +>x2.y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 1, 19)) +>x2 : Symbol(x2, Decl(types.safeNavigation.esnext.2.ts, 1, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 1, 19)) + +const a6 = (x2[y])?.(); +>a6 : Symbol(a6, Decl(types.safeNavigation.esnext.2.ts, 17, 5)) +>x2 : Symbol(x2, Decl(types.safeNavigation.esnext.2.ts, 1, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 8, 13)) + +const a7 = x3?.y?.(); +>a7 : Symbol(a7, Decl(types.safeNavigation.esnext.2.ts, 18, 5)) +>x3?.y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 2, 19)) +>x3 : Symbol(x3, Decl(types.safeNavigation.esnext.2.ts, 2, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 2, 19)) + +const a8 = x3?.[y]?.(); +>a8 : Symbol(a8, Decl(types.safeNavigation.esnext.2.ts, 19, 5)) +>x3 : Symbol(x3, Decl(types.safeNavigation.esnext.2.ts, 2, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 8, 13)) + +const a9 = x4.y.z?.(); +>a9 : Symbol(a9, Decl(types.safeNavigation.esnext.2.ts, 21, 5)) +>x4.y.z : Symbol(z, Decl(types.safeNavigation.esnext.2.ts, 3, 24)) +>x4.y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 3, 19)) +>x4 : Symbol(x4, Decl(types.safeNavigation.esnext.2.ts, 3, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 3, 19)) +>z : Symbol(z, Decl(types.safeNavigation.esnext.2.ts, 3, 24)) + +const a10 = x4.y[z]?.(); +>a10 : Symbol(a10, Decl(types.safeNavigation.esnext.2.ts, 22, 5)) +>x4.y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 3, 19)) +>x4 : Symbol(x4, Decl(types.safeNavigation.esnext.2.ts, 3, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 3, 19)) +>z : Symbol(z, Decl(types.safeNavigation.esnext.2.ts, 9, 13)) + +const a11 = (x4.y.z)?.(); +>a11 : Symbol(a11, Decl(types.safeNavigation.esnext.2.ts, 23, 5)) +>x4.y.z : Symbol(z, Decl(types.safeNavigation.esnext.2.ts, 3, 24)) +>x4.y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 3, 19)) +>x4 : Symbol(x4, Decl(types.safeNavigation.esnext.2.ts, 3, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 3, 19)) +>z : Symbol(z, Decl(types.safeNavigation.esnext.2.ts, 3, 24)) + +const a12 = (x4.y[z])?.(); +>a12 : Symbol(a12, Decl(types.safeNavigation.esnext.2.ts, 24, 5)) +>x4.y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 3, 19)) +>x4 : Symbol(x4, Decl(types.safeNavigation.esnext.2.ts, 3, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 3, 19)) +>z : Symbol(z, Decl(types.safeNavigation.esnext.2.ts, 9, 13)) + +const a13 = x5?.y?.z?.(); +>a13 : Symbol(a13, Decl(types.safeNavigation.esnext.2.ts, 25, 5)) +>x5?.y?.z : Symbol(z, Decl(types.safeNavigation.esnext.2.ts, 4, 24)) +>x5?.y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 4, 19)) +>x5 : Symbol(x5, Decl(types.safeNavigation.esnext.2.ts, 4, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 4, 19)) +>z : Symbol(z, Decl(types.safeNavigation.esnext.2.ts, 4, 24)) + +const a14 = x5?.y?.z; +>a14 : Symbol(a14, Decl(types.safeNavigation.esnext.2.ts, 26, 5)) +>x5?.y?.z : Symbol(z, Decl(types.safeNavigation.esnext.2.ts, 4, 24)) +>x5?.y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 4, 19)) +>x5 : Symbol(x5, Decl(types.safeNavigation.esnext.2.ts, 4, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 4, 19)) +>z : Symbol(z, Decl(types.safeNavigation.esnext.2.ts, 4, 24)) + +const a15 = x5?.[y]?.[z]; +>a15 : Symbol(a15, Decl(types.safeNavigation.esnext.2.ts, 27, 5)) +>x5 : Symbol(x5, Decl(types.safeNavigation.esnext.2.ts, 4, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 8, 13)) +>z : Symbol(z, Decl(types.safeNavigation.esnext.2.ts, 9, 13)) + +const a16 = x6?.y = 1; +>a16 : Symbol(a16, Decl(types.safeNavigation.esnext.2.ts, 29, 5)) +>x6?.y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 5, 19)) +>x6 : Symbol(x6, Decl(types.safeNavigation.esnext.2.ts, 5, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 5, 19)) + +const a17 = x6?.y += 1; +>a17 : Symbol(a17, Decl(types.safeNavigation.esnext.2.ts, 30, 5)) +>x6?.y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 5, 19)) +>x6 : Symbol(x6, Decl(types.safeNavigation.esnext.2.ts, 5, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 5, 19)) + +const a17a = x6?.y *= 1; +>a17a : Symbol(a17a, Decl(types.safeNavigation.esnext.2.ts, 31, 5)) +>x6?.y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 5, 19)) +>x6 : Symbol(x6, Decl(types.safeNavigation.esnext.2.ts, 5, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 5, 19)) + +const a18 = x6?.y++; +>a18 : Symbol(a18, Decl(types.safeNavigation.esnext.2.ts, 32, 5)) +>x6?.y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 5, 19)) +>x6 : Symbol(x6, Decl(types.safeNavigation.esnext.2.ts, 5, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 5, 19)) + +const a19 = ++x6?.y; +>a19 : Symbol(a19, Decl(types.safeNavigation.esnext.2.ts, 33, 5)) +>x6?.y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 5, 19)) +>x6 : Symbol(x6, Decl(types.safeNavigation.esnext.2.ts, 5, 13)) +>y : Symbol(y, Decl(types.safeNavigation.esnext.2.ts, 5, 19)) + diff --git a/tests/baselines/reference/types.safeNavigation.esnext.2.types b/tests/baselines/reference/types.safeNavigation.esnext.2.types new file mode 100644 index 00000000000..2639e325679 --- /dev/null +++ b/tests/baselines/reference/types.safeNavigation.esnext.2.types @@ -0,0 +1,208 @@ +=== tests/cases/conformance/types/safeNavigation/types.safeNavigation.esnext.2.ts === +declare const x1: (() => number) | undefined | null; +>x1 : (() => number) | null | undefined +>null : null + +declare const x2: { y: (() => number) | undefined | null; }; +>x2 : { y: (() => number) | null | undefined; } +>y : (() => number) | null | undefined +>null : null + +declare const x3: { y: (() => number) | undefined | null; } | undefined | null; +>x3 : { y: (() => number) | null | undefined; } | null | undefined +>y : (() => number) | null | undefined +>null : null +>null : null + +declare const x4: { y: { z: (() => number) | undefined | null; } }; +>x4 : { y: { z: (() => number) | null | undefined; }; } +>y : { z: (() => number) | null | undefined; } +>z : (() => number) | null | undefined +>null : null + +declare const x5: { y: { z: (() => number) | undefined | null; } | undefined | null } | undefined | null; +>x5 : { y: { z: (() => number) | null | undefined; } | null | undefined; } | null | undefined +>y : { z: (() => number) | null | undefined; } | null | undefined +>z : (() => number) | null | undefined +>null : null +>null : null +>null : null + +declare const x6: { y: number } | undefined | null; +>x6 : { y: number; } | null | undefined +>y : number +>null : null + +declare const x7: { y: any }; +>x7 : { y: any; } +>y : any + +declare const x8: { y: { z: number } | undefined | null } | undefined | null; +>x8 : { y: { z: number; } | null | undefined; } | null | undefined +>y : { z: number; } | null | undefined +>z : number +>null : null +>null : null + +declare const y: "y"; +>y : "y" + +declare const z: "z"; +>z : "z" + +const a1 = x1?.(); +>a1 : number | undefined +>x1?.() : number +>x1 : (() => number) | null | undefined + +const a2 = (x1)?.(); +>a2 : number | undefined +>(x1)?.() : number +>(x1) : (() => number) | null | undefined +>x1 : (() => number) | null | undefined + +const a3 = x2.y?.(); +>a3 : number | undefined +>x2.y?.() : number +>x2.y : (() => number) | null | undefined +>x2 : { y: (() => number) | null | undefined; } +>y : (() => number) | null | undefined + +const a4 = x2[y]?.(); +>a4 : number | undefined +>x2[y]?.() : number +>x2[y] : (() => number) | null | undefined +>x2 : { y: (() => number) | null | undefined; } +>y : "y" + +const a5 = (x2.y)?.(); +>a5 : number | undefined +>(x2.y)?.() : number +>(x2.y) : (() => number) | null | undefined +>x2.y : (() => number) | null | undefined +>x2 : { y: (() => number) | null | undefined; } +>y : (() => number) | null | undefined + +const a6 = (x2[y])?.(); +>a6 : number | undefined +>(x2[y])?.() : number +>(x2[y]) : (() => number) | null | undefined +>x2[y] : (() => number) | null | undefined +>x2 : { y: (() => number) | null | undefined; } +>y : "y" + +const a7 = x3?.y?.(); +>a7 : number | undefined +>x3?.y?.() : number +>x3?.y : (() => number) | null | undefined +>x3 : { y: (() => number) | null | undefined; } | null | undefined +>y : (() => number) | null | undefined + +const a8 = x3?.[y]?.(); +>a8 : number | undefined +>x3?.[y]?.() : number +>x3?.[y] : (() => number) | null | undefined +>x3 : { y: (() => number) | null | undefined; } | null | undefined +>y : "y" + +const a9 = x4.y.z?.(); +>a9 : number | undefined +>x4.y.z?.() : number +>x4.y.z : (() => number) | null | undefined +>x4.y : { z: (() => number) | null | undefined; } +>x4 : { y: { z: (() => number) | null | undefined; }; } +>y : { z: (() => number) | null | undefined; } +>z : (() => number) | null | undefined + +const a10 = x4.y[z]?.(); +>a10 : number | undefined +>x4.y[z]?.() : number +>x4.y[z] : (() => number) | null | undefined +>x4.y : { z: (() => number) | null | undefined; } +>x4 : { y: { z: (() => number) | null | undefined; }; } +>y : { z: (() => number) | null | undefined; } +>z : "z" + +const a11 = (x4.y.z)?.(); +>a11 : number | undefined +>(x4.y.z)?.() : number +>(x4.y.z) : (() => number) | null | undefined +>x4.y.z : (() => number) | null | undefined +>x4.y : { z: (() => number) | null | undefined; } +>x4 : { y: { z: (() => number) | null | undefined; }; } +>y : { z: (() => number) | null | undefined; } +>z : (() => number) | null | undefined + +const a12 = (x4.y[z])?.(); +>a12 : number | undefined +>(x4.y[z])?.() : number +>(x4.y[z]) : (() => number) | null | undefined +>x4.y[z] : (() => number) | null | undefined +>x4.y : { z: (() => number) | null | undefined; } +>x4 : { y: { z: (() => number) | null | undefined; }; } +>y : { z: (() => number) | null | undefined; } +>z : "z" + +const a13 = x5?.y?.z?.(); +>a13 : number | undefined +>x5?.y?.z?.() : number +>x5?.y?.z : (() => number) | null | undefined +>x5?.y : { z: (() => number) | null | undefined; } | null | undefined +>x5 : { y: { z: (() => number) | null | undefined; } | null | undefined; } | null | undefined +>y : { z: (() => number) | null | undefined; } | null | undefined +>z : (() => number) | null | undefined + +const a14 = x5?.y?.z; +>a14 : (() => number) | null | undefined +>x5?.y?.z : (() => number) | null | undefined +>x5?.y : { z: (() => number) | null | undefined; } | null | undefined +>x5 : { y: { z: (() => number) | null | undefined; } | null | undefined; } | null | undefined +>y : { z: (() => number) | null | undefined; } | null | undefined +>z : (() => number) | null | undefined + +const a15 = x5?.[y]?.[z]; +>a15 : (() => number) | null | undefined +>x5?.[y]?.[z] : (() => number) | null | undefined +>x5?.[y] : { z: (() => number) | null | undefined; } | null | undefined +>x5 : { y: { z: (() => number) | null | undefined; } | null | undefined; } | null | undefined +>y : "y" +>z : "z" + +const a16 = x6?.y = 1; +>a16 : 1 +>x6?.y = 1 : 1 +>x6?.y : number | undefined +>x6 : { y: number; } | null | undefined +>y : number | undefined +>1 : 1 + +const a17 = x6?.y += 1; +>a17 : number | undefined +>x6?.y += 1 : number | undefined +>x6?.y : number | undefined +>x6 : { y: number; } | null | undefined +>y : number | undefined +>1 : 1 + +const a17a = x6?.y *= 1; +>a17a : number | undefined +>x6?.y *= 1 : number | undefined +>x6?.y : number | undefined +>x6 : { y: number; } | null | undefined +>y : number | undefined +>1 : 1 + +const a18 = x6?.y++; +>a18 : number | undefined +>x6?.y++ : number | undefined +>x6?.y : number | undefined +>x6 : { y: number; } | null | undefined +>y : number | undefined + +const a19 = ++x6?.y; +>a19 : number | undefined +>++x6?.y : number | undefined +>x6?.y : number | undefined +>x6 : { y: number; } | null | undefined +>y : number | undefined + diff --git a/tests/cases/conformance/emitter/es2015/safeNavigation/emitter.safeNavigation.es2015.ts b/tests/cases/conformance/emitter/es2015/safeNavigation/emitter.safeNavigation.es2015.ts new file mode 100644 index 00000000000..1f9e63d0dd4 --- /dev/null +++ b/tests/cases/conformance/emitter/es2015/safeNavigation/emitter.safeNavigation.es2015.ts @@ -0,0 +1,323 @@ +// @target: es2015 +// @lib: esnext +// @module: commonjs +// @experimentalDecorators: true +// @filename: declarations.d.ts +declare var x: any; +declare var y: any; +declare var f: ({ + (): void; + (): void; + new (): any; + new (): any; +}) | undefined; +declare var o: { y: typeof f; } +declare class Base { x(): any; } +declare namespace M { + export class y {} + export class z {} +} +// @filename: propertyAccessOk.ts +x.y +x?.y +x?.y.z +x.y?.z +x?.y?.z +// @filename: elementAccessOk.ts +x["y"] +x?.["y"] +x?.["y"]["z"] +x["y"]?.["z"] +x?.["y"]?.["z"] +// @filename: callExpressionOk.ts +x() +x?.() +x.y?.() +x["y"]?.() +f?.() +o.y?.() +o["y"]?.() +// @filename: newExpressionOk.ts +new x() +new x.y?.() +new x["y"]?.() +new f?.() +new o.y?.() +new o["y"]?.() +// @filename: mixedOk.ts +x?.y?.["z"] +x?.["y"]?.z +x?.y() +x?.y?.() +o?.y() +o?.y?.() +x?.["z"]() +x?.["z"]?.() +o?.["y"]() +o?.["y"]?.() +// @filename: mutationOk.ts +x?.y = 1 +x?.y += 1; +x?.y -= 1; +x?.y *= 1; +x?.y /= 1; +x?.y %= 1; +x?.y **= 1; +x?.y |= 1; +x?.y &= 1; +x?.y ^= 1; +x?.y <<= 1; +x?.y >>= 1; +x?.y >>>= 1; +x?.y++; +x?.y--; +++x?.y; +--x?.y; +delete x?.y; +x?.["y"] = 1 +x?.["y"] += 1; +x?.["y"] -= 1; +x?.["y"] *= 1; +x?.["y"] /= 1; +x?.["y"] %= 1; +x?.["y"] **= 1; +x?.["y"] |= 1; +x?.["y"] &= 1; +x?.["y"] ^= 1; +x?.["y"] <<= 1; +x?.["y"] >>= 1; +x?.["y"] >>>= 1; +x?.["y"]++; +x?.["y"]--; +++x?.["y"]; +--x?.["y"]; +delete x?.["y"]; +// @filename: arrayAssignmentPatternOk.ts +[x?.y] = [1]; +[x?.["y"]] = [1]; +[...x?.y] = [1]; +[...x?.["y"]] = [1]; +// @filename: objectAssignmentPatternOk.ts +({ a: x?.y } = { a: 1 }); +({ a: x?.["y"] } = { a: 1 }); +// @filename: questionDotDigitIsConditionalOk.ts +x?.3:1; +// @filename: superPropertyInvocationOk.ts +// supported for invocation of super property +void class extends Base { + m() { + super.x?.(); + super["x"]?.(); + } +} + +// @filename: generalParsingOk.ts +// object literals +// - computed property names +void { [x?.y]: 1 } +void { [x?.["y"]]: 1 } +void { [x?.()]: 1 } +void { [new x?.()]: 1 } +// - property assignments +void { a: x?.y } +void { a: x?.["y"] } +void { a: x?.() } +void { a: new x?.() } + +// classes +// - computed property names +// void class { [x?.y] = 1 } // legal parse, but causes a checker error +// void class { [x?.["y"]] = 1 } // legal parse, but causes a checker error +// void class { [x?.()] = 1 } // legal parse, but causes a checker error +// void class { [new f?.()] = 1 } // legal parse, but causes a checker error +void class { [Symbol?.toStringTag] = "" } +// - property declarations +void class { a = x?.y } +void class { a = x?.["y"] } +void class { a = x?.() } +void class { a = new x?.() } +// - heritage clauses +void class extends M?.y {} +void class extends M?.["y"] {} +void class extends M?.z {} +// - class decorators +@x?.y class C1 {} +@x?.["y"] class C2 {} +@x?.() class C3 {} +@new x?.() class C4 {} +// - member decorators +class C5 { @x?.y m() {} } +class C6 { @x?.["y"] m() {} } // allowed as ?.[ is not ambiguous with computed property names +class C7 { @x?.() m() {} } +class C8 { @new x?.() m () {} } +// - parameter decorators +class C9 { m(@x?.y a) {} } +class C10 { m(@x?.["y"] a) {} } +class C11 { m(@x?.() a) {} } +class C12 { m(@new x?.() a) {} } + +// functions +// - parameters +void function (a = x?.y) {} +void function (a = x?.["y"]) {} +void function (a = x?.()) {} +void function (a = new x?.()) {} +// - binding elements +// - initializers +void function ({ a = x?.y }) {} +void function ({ a = x?.["y"] }) {} +void function ({ a = x?.() }) {} +void function ({ a = new x?.() }) {} +// - computed properties +void function ({ [x?.y]: a }) {} +void function ({ [x?.["y"]]: a }) {} +void function ({ [x?.()]: a }) {} +void function ({ [new x?.()]: a }) {} + +// arrow functions +// - parameters +((a = x?.y) => {}); +((a = x?.["y"]) => {}); +((a = x?.()) => {}); +((a = new x?.()) => {}); +// - expression bodies +(() => x?.y); +(() => x?.["y"]); +(() => x?.()); +(() => new x?.()); + +// parenthesis +(x?.y); + +// comma +x?.y, f(); +f(), x?.y; + +// conditional +x?.y ? 0 : 1 +0 ? x?.y : 1; +0 ? 1 : x?.y; + +// binary +x?.y + 1; +x?.y - 1; +x?.y * 1; +x?.y / 1; +x?.y ** 1; +x?.y % 1; +x?.y ^ 1; +x?.y & 1; +x?.y | 1; +x?.y << 1; +x?.y >> 1; +x?.y >>> 1; +x?.y && 1; +x?.y || 1; +x?.y == 1; +x?.y === 1; +x?.y != 1; +x?.y !== 1; +x?.y < 1; +x?.y <= 1; +x?.y > 1; +x?.y >= 1; +1 + x?.y; +1 - x?.y; +1 * x?.y; +1 / x?.y; +1 ** x?.y; +1 % x?.y; +1 ^ x?.y; +1 & x?.y; +1 | x?.y; +1 << x?.y; +1 >> x?.y; +1 >>> x?.y; +1 && x?.y; +1 || x?.y; +1 == x?.y; +1 === x?.y; +1 != x?.y; +1 !== x?.y; +1 < x?.y; +1 <= x?.y; +1 > x?.y; +1 >= x?.y; + +// prefix unary ++x?.y; +-x?.y; +!x?.y; +~x?.y; + +// unary +void x?.y; +typeof x?.y; +void function * () { yield x?.y; } +void async function() { await x?.y; } + +// notnull +x?.y!.z; + +// assertions +x?.y; +x?.y as string; + +// array literals +[x?.y]; +[, x?.y]; +[...x?.y]; + +// literals +1?.toString(); // no need for `..` +1.?.toString(); +.0?.toString(); +4e3?.toString(); +1.e3?.toString(); +""?.toString(); +''?.toString(); +``?.toString(); +/./?.toString(); +/./g?.toString(); +true?.toString(); +false?.toString(); + +// templates +`${x?.y}`; + +// variables +var v = x?.y; +var [v] = x?.y; +var [v = x?.y] = [1]; +var {v} = x?.y; +var {v = x?.y} = {v:1}; +var {[x?.y]: v} = null; + +// if/else if +if (x?.y) {} +if (1) {} else if (x?.y) {} + +// switch +switch (x?.y) {} +switch (1) { case x?.y: break; } + +// do/while +do {} while (x?.y) +while (x?.y) {} + +// for +for (x?.y; x?.y; x?.y); + +// for..in +for (x?.y in {}); + +// for..of +for (x?.y of []); + +// enums +enum E { + a = x?.y +} + +// @filename: exportsOk.ts +export default x?.y; \ No newline at end of file diff --git a/tests/cases/conformance/emitter/es3/safeNavigation/emitter.safeNavigation.es3.ts b/tests/cases/conformance/emitter/es3/safeNavigation/emitter.safeNavigation.es3.ts new file mode 100644 index 00000000000..89645bac4d3 --- /dev/null +++ b/tests/cases/conformance/emitter/es3/safeNavigation/emitter.safeNavigation.es3.ts @@ -0,0 +1,322 @@ +// @target: es3 +// @lib: esnext +// @module: commonjs +// @experimentalDecorators: true +// @filename: declarations.d.ts +declare var x: any; +declare var y: any; +declare var f: ({ + (): void; + (): void; + new (): any; + new (): any; +}) | undefined; +declare var o: { y: typeof f; } +declare class Base { x(): any; } +declare namespace M { + export class y {} + export class z {} +} +// @filename: propertyAccessOk.ts +x.y +x?.y +x?.y.z +x.y?.z +x?.y?.z +// @filename: elementAccessOk.ts +x["y"] +x?.["y"] +x?.["y"]["z"] +x["y"]?.["z"] +x?.["y"]?.["z"] +// @filename: callExpressionOk.ts +x() +x?.() +x.y?.() +x["y"]?.() +f?.() +o.y?.() +o["y"]?.() +// @filename: newExpressionOk.ts +new x() +new x.y?.() +new x["y"]?.() +new f?.() +new o.y?.() +new o["y"]?.() +// @filename: mixedOk.ts +x?.y?.["z"] +x?.["y"]?.z +x?.y() +x?.y?.() +o?.y() +o?.y?.() +x?.["z"]() +x?.["z"]?.() +o?.["y"]() +o?.["y"]?.() +// @filename: mutationOk.ts +x?.y = 1 +x?.y += 1; +x?.y -= 1; +x?.y *= 1; +x?.y /= 1; +x?.y %= 1; +x?.y **= 1; +x?.y |= 1; +x?.y &= 1; +x?.y ^= 1; +x?.y <<= 1; +x?.y >>= 1; +x?.y >>>= 1; +x?.y++; +x?.y--; +++x?.y; +--x?.y; +delete x?.y; +x?.["y"] = 1 +x?.["y"] += 1; +x?.["y"] -= 1; +x?.["y"] *= 1; +x?.["y"] /= 1; +x?.["y"] %= 1; +x?.["y"] **= 1; +x?.["y"] |= 1; +x?.["y"] &= 1; +x?.["y"] ^= 1; +x?.["y"] <<= 1; +x?.["y"] >>= 1; +x?.["y"] >>>= 1; +x?.["y"]++; +x?.["y"]--; +++x?.["y"]; +--x?.["y"]; +delete x?.["y"]; +// @filename: arrayAssignmentPatternOk.ts +[x?.y] = [1]; +[x?.["y"]] = [1]; +[...x?.y] = [1]; +[...x?.["y"]] = [1]; +// @filename: objectAssignmentPatternOk.ts +({ a: x?.y } = { a: 1 }); +({ a: x?.["y"] } = { a: 1 }); +// @filename: questionDotDigitIsConditionalOk.ts +x?.3:1; +// @filename: superPropertyInvocationOk.ts +// supported for invocation of super property +void class extends Base { + m() { + super.x?.(); + } +} + +// @filename: generalParsingOk.ts +// object literals +// - computed property names +void { [x?.y]: 1 } +void { [x?.["y"]]: 1 } +void { [x?.()]: 1 } +void { [new x?.()]: 1 } +// - property assignments +void { a: x?.y } +void { a: x?.["y"] } +void { a: x?.() } +void { a: new x?.() } + +// classes +// - computed property names +// void class { [x?.y] = 1 } // legal parse, but causes a checker error +// void class { [x?.["y"]] = 1 } // legal parse, but causes a checker error +// void class { [x?.()] = 1 } // legal parse, but causes a checker error +// void class { [new f?.()] = 1 } // legal parse, but causes a checker error +void class { [Symbol?.toStringTag] = "" } +// - property declarations +void class { a = x?.y } +void class { a = x?.["y"] } +void class { a = x?.() } +void class { a = new x?.() } +// - heritage clauses +void class extends M?.y {} +void class extends M?.["y"] {} +void class extends M?.z {} +// - class decorators +@x?.y class C1 {} +@x?.["y"] class C2 {} +@x?.() class C3 {} +@new x?.() class C4 {} +// - member decorators +class C5 { @x?.y m() {} } +class C6 { @x?.["y"] m() {} } // allowed as ?.[ is not ambiguous with computed property names +class C7 { @x?.() m() {} } +class C8 { @new x?.() m () {} } +// - parameter decorators +class C9 { m(@x?.y a) {} } +class C10 { m(@x?.["y"] a) {} } +class C11 { m(@x?.() a) {} } +class C12 { m(@new x?.() a) {} } + +// functions +// - parameters +void function (a = x?.y) {} +void function (a = x?.["y"]) {} +void function (a = x?.()) {} +void function (a = new x?.()) {} +// - binding elements +// - initializers +void function ({ a = x?.y }) {} +void function ({ a = x?.["y"] }) {} +void function ({ a = x?.() }) {} +void function ({ a = new x?.() }) {} +// - computed properties +void function ({ [x?.y]: a }) {} +void function ({ [x?.["y"]]: a }) {} +void function ({ [x?.()]: a }) {} +void function ({ [new x?.()]: a }) {} + +// arrow functions +// - parameters +((a = x?.y) => {}); +((a = x?.["y"]) => {}); +((a = x?.()) => {}); +((a = new x?.()) => {}); +// - expression bodies +(() => x?.y); +(() => x?.["y"]); +(() => x?.()); +(() => new x?.()); + +// parenthesis +(x?.y); + +// comma +x?.y, f(); +f(), x?.y; + +// conditional +x?.y ? 0 : 1 +0 ? x?.y : 1; +0 ? 1 : x?.y; + +// binary +x?.y + 1; +x?.y - 1; +x?.y * 1; +x?.y / 1; +x?.y ** 1; +x?.y % 1; +x?.y ^ 1; +x?.y & 1; +x?.y | 1; +x?.y << 1; +x?.y >> 1; +x?.y >>> 1; +x?.y && 1; +x?.y || 1; +x?.y == 1; +x?.y === 1; +x?.y != 1; +x?.y !== 1; +x?.y < 1; +x?.y <= 1; +x?.y > 1; +x?.y >= 1; +1 + x?.y; +1 - x?.y; +1 * x?.y; +1 / x?.y; +1 ** x?.y; +1 % x?.y; +1 ^ x?.y; +1 & x?.y; +1 | x?.y; +1 << x?.y; +1 >> x?.y; +1 >>> x?.y; +1 && x?.y; +1 || x?.y; +1 == x?.y; +1 === x?.y; +1 != x?.y; +1 !== x?.y; +1 < x?.y; +1 <= x?.y; +1 > x?.y; +1 >= x?.y; + +// prefix unary ++x?.y; +-x?.y; +!x?.y; +~x?.y; + +// unary +void x?.y; +typeof x?.y; +void function * () { yield x?.y; } +void async function() { await x?.y; } + +// notnull +x?.y!.z; + +// assertions +x?.y; +x?.y as string; + +// array literals +[x?.y]; +[, x?.y]; +[...x?.y]; + +// literals +1?.toString(); // no need for `..` +1.?.toString(); +.0?.toString(); +4e3?.toString(); +1.e3?.toString(); +""?.toString(); +''?.toString(); +``?.toString(); +/./?.toString(); +/./g?.toString(); +true?.toString(); +false?.toString(); + +// templates +`${x?.y}`; + +// variables +var v = x?.y; +var [v] = x?.y; +var [v = x?.y] = [1]; +var {v} = x?.y; +var {v = x?.y} = {v:1}; +var {[x?.y]: v} = null; + +// if/else if +if (x?.y) {} +if (1) {} else if (x?.y) {} + +// switch +switch (x?.y) {} +switch (1) { case x?.y: break; } + +// do/while +do {} while (x?.y) +while (x?.y) {} + +// for +for (x?.y; x?.y; x?.y); + +// for..in +for (x?.y in {}); + +// for..of +for (x?.y of []); + +// enums +enum E { + a = x?.y +} + +// @filename: exportsOk.ts +export default x?.y; \ No newline at end of file diff --git a/tests/cases/conformance/emitter/es5/safeNavigation/emitter.safeNavigation.es5.ts b/tests/cases/conformance/emitter/es5/safeNavigation/emitter.safeNavigation.es5.ts new file mode 100644 index 00000000000..17aad2559ab --- /dev/null +++ b/tests/cases/conformance/emitter/es5/safeNavigation/emitter.safeNavigation.es5.ts @@ -0,0 +1,322 @@ +// @target: es5 +// @lib: esnext +// @module: commonjs +// @experimentalDecorators: true +// @filename: declarations.d.ts +declare var x: any; +declare var y: any; +declare var f: ({ + (): void; + (): void; + new (): any; + new (): any; +}) | undefined; +declare var o: { y: typeof f; } +declare class Base { x(): any; } +declare namespace M { + export class y {} + export class z {} +} +// @filename: propertyAccessOk.ts +x.y +x?.y +x?.y.z +x.y?.z +x?.y?.z +// @filename: elementAccessOk.ts +x["y"] +x?.["y"] +x?.["y"]["z"] +x["y"]?.["z"] +x?.["y"]?.["z"] +// @filename: callExpressionOk.ts +x() +x?.() +x.y?.() +x["y"]?.() +f?.() +o.y?.() +o["y"]?.() +// @filename: newExpressionOk.ts +new x() +new x.y?.() +new x["y"]?.() +new f?.() +new o.y?.() +new o["y"]?.() +// @filename: mixedOk.ts +x?.y?.["z"] +x?.["y"]?.z +x?.y() +x?.y?.() +o?.y() +o?.y?.() +x?.["z"]() +x?.["z"]?.() +o?.["y"]() +o?.["y"]?.() +// @filename: mutationOk.ts +x?.y = 1 +x?.y += 1; +x?.y -= 1; +x?.y *= 1; +x?.y /= 1; +x?.y %= 1; +x?.y **= 1; +x?.y |= 1; +x?.y &= 1; +x?.y ^= 1; +x?.y <<= 1; +x?.y >>= 1; +x?.y >>>= 1; +x?.y++; +x?.y--; +++x?.y; +--x?.y; +delete x?.y; +x?.["y"] = 1 +x?.["y"] += 1; +x?.["y"] -= 1; +x?.["y"] *= 1; +x?.["y"] /= 1; +x?.["y"] %= 1; +x?.["y"] **= 1; +x?.["y"] |= 1; +x?.["y"] &= 1; +x?.["y"] ^= 1; +x?.["y"] <<= 1; +x?.["y"] >>= 1; +x?.["y"] >>>= 1; +x?.["y"]++; +x?.["y"]--; +++x?.["y"]; +--x?.["y"]; +delete x?.["y"]; +// @filename: arrayAssignmentPatternOk.ts +[x?.y] = [1]; +[x?.["y"]] = [1]; +[...x?.y] = [1]; +[...x?.["y"]] = [1]; +// @filename: objectAssignmentPatternOk.ts +({ a: x?.y } = { a: 1 }); +({ a: x?.["y"] } = { a: 1 }); +// @filename: questionDotDigitIsConditionalOk.ts +x?.3:1; +// @filename: superPropertyInvocationOk.ts +// supported for invocation of super property +void class extends Base { + m() { + super.x?.(); + } +} + +// @filename: generalParsingOk.ts +// object literals +// - computed property names +void { [x?.y]: 1 } +void { [x?.["y"]]: 1 } +void { [x?.()]: 1 } +void { [new x?.()]: 1 } +// - property assignments +void { a: x?.y } +void { a: x?.["y"] } +void { a: x?.() } +void { a: new x?.() } + +// classes +// - computed property names +// void class { [x?.y] = 1 } // legal parse, but causes a checker error +// void class { [x?.["y"]] = 1 } // legal parse, but causes a checker error +// void class { [x?.()] = 1 } // legal parse, but causes a checker error +// void class { [new f?.()] = 1 } // legal parse, but causes a checker error +void class { [Symbol?.toStringTag] = "" } +// - property declarations +void class { a = x?.y } +void class { a = x?.["y"] } +void class { a = x?.() } +void class { a = new x?.() } +// - heritage clauses +void class extends M?.y {} +void class extends M?.["y"] {} +void class extends M?.z {} +// - class decorators +@x?.y class C1 {} +@x?.["y"] class C2 {} +@x?.() class C3 {} +@new x?.() class C4 {} +// - member decorators +class C5 { @x?.y m() {} } +class C6 { @x?.["y"] m() {} } // allowed as ?.[ is not ambiguous with computed property names +class C7 { @x?.() m() {} } +class C8 { @new x?.() m () {} } +// - parameter decorators +class C9 { m(@x?.y a) {} } +class C10 { m(@x?.["y"] a) {} } +class C11 { m(@x?.() a) {} } +class C12 { m(@new x?.() a) {} } + +// functions +// - parameters +void function (a = x?.y) {} +void function (a = x?.["y"]) {} +void function (a = x?.()) {} +void function (a = new x?.()) {} +// - binding elements +// - initializers +void function ({ a = x?.y }) {} +void function ({ a = x?.["y"] }) {} +void function ({ a = x?.() }) {} +void function ({ a = new x?.() }) {} +// - computed properties +void function ({ [x?.y]: a }) {} +void function ({ [x?.["y"]]: a }) {} +void function ({ [x?.()]: a }) {} +void function ({ [new x?.()]: a }) {} + +// arrow functions +// - parameters +((a = x?.y) => {}); +((a = x?.["y"]) => {}); +((a = x?.()) => {}); +((a = new x?.()) => {}); +// - expression bodies +(() => x?.y); +(() => x?.["y"]); +(() => x?.()); +(() => new x?.()); + +// parenthesis +(x?.y); + +// comma +x?.y, f(); +f(), x?.y; + +// conditional +x?.y ? 0 : 1 +0 ? x?.y : 1; +0 ? 1 : x?.y; + +// binary +x?.y + 1; +x?.y - 1; +x?.y * 1; +x?.y / 1; +x?.y ** 1; +x?.y % 1; +x?.y ^ 1; +x?.y & 1; +x?.y | 1; +x?.y << 1; +x?.y >> 1; +x?.y >>> 1; +x?.y && 1; +x?.y || 1; +x?.y == 1; +x?.y === 1; +x?.y != 1; +x?.y !== 1; +x?.y < 1; +x?.y <= 1; +x?.y > 1; +x?.y >= 1; +1 + x?.y; +1 - x?.y; +1 * x?.y; +1 / x?.y; +1 ** x?.y; +1 % x?.y; +1 ^ x?.y; +1 & x?.y; +1 | x?.y; +1 << x?.y; +1 >> x?.y; +1 >>> x?.y; +1 && x?.y; +1 || x?.y; +1 == x?.y; +1 === x?.y; +1 != x?.y; +1 !== x?.y; +1 < x?.y; +1 <= x?.y; +1 > x?.y; +1 >= x?.y; + +// prefix unary ++x?.y; +-x?.y; +!x?.y; +~x?.y; + +// unary +void x?.y; +typeof x?.y; +void function * () { yield x?.y; } +void async function() { await x?.y; } + +// notnull +x?.y!.z; + +// assertions +x?.y; +x?.y as string; + +// array literals +[x?.y]; +[, x?.y]; +[...x?.y]; + +// literals +1?.toString(); // no need for `..` +1.?.toString(); +.0?.toString(); +4e3?.toString(); +1.e3?.toString(); +""?.toString(); +''?.toString(); +``?.toString(); +/./?.toString(); +/./g?.toString(); +true?.toString(); +false?.toString(); + +// templates +`${x?.y}`; + +// variables +var v = x?.y; +var [v] = x?.y; +var [v = x?.y] = [1]; +var {v} = x?.y; +var {v = x?.y} = {v:1}; +var {[x?.y]: v} = null; + +// if/else if +if (x?.y) {} +if (1) {} else if (x?.y) {} + +// switch +switch (x?.y) {} +switch (1) { case x?.y: break; } + +// do/while +do {} while (x?.y) +while (x?.y) {} + +// for +for (x?.y; x?.y; x?.y); + +// for..in +for (x?.y in {}); + +// for..of +for (x?.y of []); + +// enums +enum E { + a = x?.y +} + +// @filename: exportsOk.ts +export default x?.y; \ No newline at end of file diff --git a/tests/cases/conformance/emitter/esnext/safeNavigation/emitter.safeNavigation.esnext.ts b/tests/cases/conformance/emitter/esnext/safeNavigation/emitter.safeNavigation.esnext.ts new file mode 100644 index 00000000000..bdabd0b0f63 --- /dev/null +++ b/tests/cases/conformance/emitter/esnext/safeNavigation/emitter.safeNavigation.esnext.ts @@ -0,0 +1,323 @@ +// @target: esnext +// @lib: esnext +// @module: commonjs +// @experimentalDecorators: true +// @filename: declarations.d.ts +declare var x: any; +declare var y: any; +declare var f: ({ + (): void; + (): void; + new (): any; + new (): any; +}) | undefined; +declare var o: { y: typeof f; } +declare class Base { x(): any; } +declare namespace M { + export class y {} + export class z {} +} +// @filename: propertyAccessOk.ts +x.y +x?.y +x?.y.z +x.y?.z +x?.y?.z +// @filename: elementAccessOk.ts +x["y"] +x?.["y"] +x?.["y"]["z"] +x["y"]?.["z"] +x?.["y"]?.["z"] +// @filename: callExpressionOk.ts +x() +x?.() +x.y?.() +x["y"]?.() +f?.() +o.y?.() +o["y"]?.() +// @filename: newExpressionOk.ts +new x() +new x.y?.() +new x["y"]?.() +new f?.() +new o.y?.() +new o["y"]?.() +// @filename: mixedOk.ts +x?.y?.["z"] +x?.["y"]?.z +x?.y() +x?.y?.() +o?.y() +o?.y?.() +x?.["z"]() +x?.["z"]?.() +o?.["y"]() +o?.["y"]?.() +// @filename: mutationOk.ts +x?.y = 1 +x?.y += 1; +x?.y -= 1; +x?.y *= 1; +x?.y /= 1; +x?.y %= 1; +x?.y **= 1; +x?.y |= 1; +x?.y &= 1; +x?.y ^= 1; +x?.y <<= 1; +x?.y >>= 1; +x?.y >>>= 1; +x?.y++; +x?.y--; +++x?.y; +--x?.y; +delete x?.y; +x?.["y"] = 1 +x?.["y"] += 1; +x?.["y"] -= 1; +x?.["y"] *= 1; +x?.["y"] /= 1; +x?.["y"] %= 1; +x?.["y"] **= 1; +x?.["y"] |= 1; +x?.["y"] &= 1; +x?.["y"] ^= 1; +x?.["y"] <<= 1; +x?.["y"] >>= 1; +x?.["y"] >>>= 1; +x?.["y"]++; +x?.["y"]--; +++x?.["y"]; +--x?.["y"]; +delete x?.["y"]; +// @filename: arrayAssignmentPatternOk.ts +[x?.y] = [1]; +[x?.["y"]] = [1]; +[...x?.y] = [1]; +[...x?.["y"]] = [1]; +// @filename: objectAssignmentPatternOk.ts +({ a: x?.y } = { a: 1 }); +({ a: x?.["y"] } = { a: 1 }); +// @filename: questionDotDigitIsConditionalOk.ts +x?.3:1; +// @filename: superPropertyInvocationOk.ts +// supported for invocation of super property +void class extends Base { + m() { + super.x?.(); + super["x"]?.(); + } +} + +// @filename: generalParsingOk.ts +// object literals +// - computed property names +void { [x?.y]: 1 } +void { [x?.["y"]]: 1 } +void { [x?.()]: 1 } +void { [new x?.()]: 1 } +// - property assignments +void { a: x?.y } +void { a: x?.["y"] } +void { a: x?.() } +void { a: new x?.() } + +// classes +// - computed property names +// void class { [x?.y] = 1 } // legal parse, but causes a checker error +// void class { [x?.["y"]] = 1 } // legal parse, but causes a checker error +// void class { [x?.()] = 1 } // legal parse, but causes a checker error +// void class { [new f?.()] = 1 } // legal parse, but causes a checker error +void class { [Symbol?.toStringTag] = "" } +// - property declarations +void class { a = x?.y } +void class { a = x?.["y"] } +void class { a = x?.() } +void class { a = new x?.() } +// - heritage clauses +void class extends M?.y {} +void class extends M?.["y"] {} +void class extends M?.z {} +// - class decorators +@x?.y class C1 {} +@x?.["y"] class C2 {} +@x?.() class C3 {} +@new x?.() class C4 {} +// - member decorators +class C5 { @x?.y m() {} } +class C6 { @x?.["y"] m() {} } // allowed as ?.[ is not ambiguous with computed property names +class C7 { @x?.() m() {} } +class C8 { @new x?.() m () {} } +// - parameter decorators +class C9 { m(@x?.y a) {} } +class C10 { m(@x?.["y"] a) {} } +class C11 { m(@x?.() a) {} } +class C12 { m(@new x?.() a) {} } + +// functions +// - parameters +void function (a = x?.y) {} +void function (a = x?.["y"]) {} +void function (a = x?.()) {} +void function (a = new x?.()) {} +// - binding elements +// - initializers +void function ({ a = x?.y }) {} +void function ({ a = x?.["y"] }) {} +void function ({ a = x?.() }) {} +void function ({ a = new x?.() }) {} +// - computed properties +void function ({ [x?.y]: a }) {} +void function ({ [x?.["y"]]: a }) {} +void function ({ [x?.()]: a }) {} +void function ({ [new x?.()]: a }) {} + +// arrow functions +// - parameters +((a = x?.y) => {}); +((a = x?.["y"]) => {}); +((a = x?.()) => {}); +((a = new x?.()) => {}); +// - expression bodies +(() => x?.y); +(() => x?.["y"]); +(() => x?.()); +(() => new x?.()); + +// parenthesis +(x?.y); + +// comma +x?.y, f(); +f(), x?.y; + +// conditional +x?.y ? 0 : 1 +0 ? x?.y : 1; +0 ? 1 : x?.y; + +// binary +x?.y + 1; +x?.y - 1; +x?.y * 1; +x?.y / 1; +x?.y ** 1; +x?.y % 1; +x?.y ^ 1; +x?.y & 1; +x?.y | 1; +x?.y << 1; +x?.y >> 1; +x?.y >>> 1; +x?.y && 1; +x?.y || 1; +x?.y == 1; +x?.y === 1; +x?.y != 1; +x?.y !== 1; +x?.y < 1; +x?.y <= 1; +x?.y > 1; +x?.y >= 1; +1 + x?.y; +1 - x?.y; +1 * x?.y; +1 / x?.y; +1 ** x?.y; +1 % x?.y; +1 ^ x?.y; +1 & x?.y; +1 | x?.y; +1 << x?.y; +1 >> x?.y; +1 >>> x?.y; +1 && x?.y; +1 || x?.y; +1 == x?.y; +1 === x?.y; +1 != x?.y; +1 !== x?.y; +1 < x?.y; +1 <= x?.y; +1 > x?.y; +1 >= x?.y; + +// prefix unary ++x?.y; +-x?.y; +!x?.y; +~x?.y; + +// unary +void x?.y; +typeof x?.y; +void function * () { yield x?.y; } +void async function() { await x?.y; } + +// notnull +x?.y!.z; + +// assertions +x?.y; +x?.y as string; + +// array literals +[x?.y]; +[, x?.y]; +[...x?.y]; + +// literals +1?.toString(); // no need for `..` +1.?.toString(); +.0?.toString(); +4e3?.toString(); +1.e3?.toString(); +""?.toString(); +''?.toString(); +``?.toString(); +/./?.toString(); +/./g?.toString(); +true?.toString(); +false?.toString(); + +// templates +`${x?.y}`; + +// variables +var v = x?.y; +var [v] = x?.y; +var [v = x?.y] = [1]; +var {v} = x?.y; +var {v = x?.y} = {v:1}; +var {[x?.y]: v} = null; + +// if/else if +if (x?.y) {} +if (1) {} else if (x?.y) {} + +// switch +switch (x?.y) {} +switch (1) { case x?.y: break; } + +// do/while +do {} while (x?.y) +while (x?.y) {} + +// for +for (x?.y; x?.y; x?.y); + +// for..in +for (x?.y in {}); + +// for..of +for (x?.y of []); + +// enums +enum E { + a = x?.y +} + +// @filename: exportsOk.ts +export default x?.y; \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascriptnext/safeNavigation/parser.safeNavigation.esnext.ts b/tests/cases/conformance/parser/ecmascriptnext/safeNavigation/parser.safeNavigation.esnext.ts new file mode 100644 index 00000000000..91b01746398 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascriptnext/safeNavigation/parser.safeNavigation.esnext.ts @@ -0,0 +1,359 @@ +// @target: esnext +// @lib: esnext +// @noEmit: true +// @module: commonjs +// @experimentalDecorators: true +// @filename: declarations.d.ts +declare var x: any; +declare var y: any; +declare var f: ({ + (): void; + (): void; + new (): any; + new (): any; +}) | undefined; +declare var o: { y: typeof f; } +declare class Base { x: any; } +declare namespace M { + export class y {} + export class z {} +} +// @filename: propertyAccessOk.ts +x.y +x?.y +x?.y.z +x.y?.z +x?.y?.z +// @filename: elementAccessOk.ts +x["y"] +x?.["y"] +x?.["y"]["z"] +x["y"]?.["z"] +x?.["y"]?.["z"] +// @filename: callExpressionOk.ts +x() +x?.() +x.y?.() +x["y"]?.() +f?.() +o.y?.() +o["y"]?.() +// @filename: newExpressionOk.ts +new x() +new x.y?.() +new x["y"]?.() +new f?.() +new o.y?.() +new o["y"]?.() +// @filename: mixedOk.ts +x?.y?.["z"] +x?.["y"]?.z +x?.y() +x?.y?.() +o?.y() +o?.y?.() +x?.["z"]() +x?.["z"]?.() +o?.["y"]() +o?.["y"]?.() +// @filename: mutationOk.ts +x?.y = 1 +x?.y += 1; +x?.y -= 1; +x?.y *= 1; +x?.y /= 1; +x?.y %= 1; +x?.y **= 1; +x?.y |= 1; +x?.y &= 1; +x?.y ^= 1; +x?.y <<= 1; +x?.y >>= 1; +x?.y >>>= 1; +x?.y++; +x?.y--; +++x?.y; +--x?.y; +delete x?.y; +x?.["y"] = 1 +x?.["y"] += 1; +x?.["y"] -= 1; +x?.["y"] *= 1; +x?.["y"] /= 1; +x?.["y"] %= 1; +x?.["y"] **= 1; +x?.["y"] |= 1; +x?.["y"] &= 1; +x?.["y"] ^= 1; +x?.["y"] <<= 1; +x?.["y"] >>= 1; +x?.["y"] >>>= 1; +x?.["y"]++; +x?.["y"]--; +++x?.["y"]; +--x?.["y"]; +delete x?.["y"]; +// @filename: arrayAssignmentPatternOk.ts +[x?.y] = [1]; +[x?.["y"]] = [1]; +[...x?.y] = [1]; +[...x?.["y"]] = [1]; +// @filename: objectAssignmentPatternOk.ts +({ a: x?.y } = { a: 1 }); +({ a: x?.["y"] } = { a: 1 }); +// @filename: questionDotDigitIsConditionalOk.ts +x?.3:1; +// @filename: spaceInTokenError.ts +x? .y +// @filename: missingIdentifierError.ts +x?. +// @filename: taggedTemplateError.ts +// not supported for tagged templates +x?.`foo${bar}` +// @filename: superError.ts +// not supported for super +void class extends Base { + constructor() { + super?.(); + } +} +// @filename: superProperty1Error.ts +// not supported for super property +void class extends Base { + m() { + super?.x; + } +} +// @filename: superProperty2Error.ts +// not supported for super property +void class extends Base { + m() { + super?.["x"]; + } +} +// @filename: superPropertyInvocationOk.ts +// supported for invocation of super property +void class extends Base { + m() { + super.x?.(); + super["x"]?.(); + } +} +// @filename: metaPropertyError.ts +// not supported for meta property +void class { + constructor() { + new?.target; + } +} + +// @filename: generalParsingOk.ts +// object literals +// - computed property names +void { [x?.y]: 1 } +void { [x?.["y"]]: 1 } +void { [x?.()]: 1 } +void { [new x?.()]: 1 } +// - property assignments +void { a: x?.y } +void { a: x?.["y"] } +void { a: x?.() } +void { a: new x?.() } + +// classes +// - computed property names +// void class { [x?.y] = 1 } // legal parse, but causes a checker error +// void class { [x?.["y"]] = 1 } // legal parse, but causes a checker error +// void class { [x?.()] = 1 } // legal parse, but causes a checker error +// void class { [new f?.()] = 1 } // legal parse, but causes a checker error +void class { [Symbol?.toStringTag] = "" } +// - property declarations +void class { a = x?.y } +void class { a = x?.["y"] } +void class { a = x?.() } +void class { a = new x?.() } +// - heritage clauses +void class extends M?.y {} +void class extends M?.["y"] {} +void class extends M?.z {} +// - class decorators +@x?.y class C1 {} +@x?.["y"] class C2 {} +@x?.() class C3 {} +@new x?.() class C4 {} +// - member decorators +class C5 { @x?.y m() {} } +class C6 { @x?.["y"] m() {} } // allowed as ?.[ is not ambiguous with computed property names +class C7 { @x?.() m() {} } +class C8 { @new x?.() m () {} } +// - parameter decorators +class C9 { m(@x?.y a) {} } +class C10 { m(@x?.["y"] a) {} } +class C11 { m(@x?.() a) {} } +class C12 { m(@new x?.() a) {} } + +// functions +// - parameters +void function (a = x?.y) {} +void function (a = x?.["y"]) {} +void function (a = x?.()) {} +void function (a = new x?.()) {} +// - binding elements +// - initializers +void function ({ a = x?.y }) {} +void function ({ a = x?.["y"] }) {} +void function ({ a = x?.() }) {} +void function ({ a = new x?.() }) {} +// - computed properties +void function ({ [x?.y]: a }) {} +void function ({ [x?.["y"]]: a }) {} +void function ({ [x?.()]: a }) {} +void function ({ [new x?.()]: a }) {} + +// arrow functions +// - parameters +((a = x?.y) => {}); +((a = x?.["y"]) => {}); +((a = x?.()) => {}); +((a = new x?.()) => {}); +// - expression bodies +(() => x?.y); +(() => x?.["y"]); +(() => x?.()); +(() => new x?.()); + +// parenthesis +(x?.y); + +// comma +x?.y, f(); +f(), x?.y; + +// conditional +x?.y ? 0 : 1 +0 ? x?.y : 1; +0 ? 1 : x?.y; + +// binary +x?.y + 1; +x?.y - 1; +x?.y * 1; +x?.y / 1; +x?.y ** 1; +x?.y % 1; +x?.y ^ 1; +x?.y & 1; +x?.y | 1; +x?.y << 1; +x?.y >> 1; +x?.y >>> 1; +x?.y && 1; +x?.y || 1; +x?.y == 1; +x?.y === 1; +x?.y != 1; +x?.y !== 1; +x?.y < 1; +x?.y <= 1; +x?.y > 1; +x?.y >= 1; +1 + x?.y; +1 - x?.y; +1 * x?.y; +1 / x?.y; +1 ** x?.y; +1 % x?.y; +1 ^ x?.y; +1 & x?.y; +1 | x?.y; +1 << x?.y; +1 >> x?.y; +1 >>> x?.y; +1 && x?.y; +1 || x?.y; +1 == x?.y; +1 === x?.y; +1 != x?.y; +1 !== x?.y; +1 < x?.y; +1 <= x?.y; +1 > x?.y; +1 >= x?.y; + +// prefix unary ++x?.y; +-x?.y; +!x?.y; +~x?.y; + +// unary +void x?.y; +typeof x?.y; +void function * () { yield x?.y; } +void async function() { await x?.y; } + +// notnull +x?.y!.z; + +// assertions +x?.y; +x?.y as string; + +// array literals +[x?.y]; +[, x?.y]; +[...x?.y]; + +// literals +1?.toString(); // no need for `..` +1.?.toString(); +.0?.toString(); +4e3?.toString(); +1.e3?.toString(); +""?.toString(); +''?.toString(); +``?.toString(); +/./?.toString(); +/./g?.toString(); +true?.toString(); +false?.toString(); + +// templates +`${x?.y}`; + +// variables +var v = x?.y; +var [v] = x?.y; +var [v = x?.y] = [1]; +var {v} = x?.y; +var {v = x?.y} = {v:1}; +var {[x?.y]: v} = null; + +// if/else if +if (x?.y) {} +if (1) {} else if (x?.y) {} + +// switch +switch (x?.y) {} +switch (1) { case x?.y: break; } + +// do/while +do {} while (x?.y) +while (x?.y) {} + +// for +for (x?.y; x?.y; x?.y); + +// for..in +for (x?.y in {}); + +// for..of +for (x?.y of []); + +// enums +enum E { + a = x?.y +} + +// @filename: exportsOk.ts +export default x?.y; \ No newline at end of file diff --git a/tests/cases/conformance/types/safeNavigation/types.safeNavigation.esnext.1.ts b/tests/cases/conformance/types/safeNavigation/types.safeNavigation.esnext.1.ts new file mode 100644 index 00000000000..3b7a74b4fbb --- /dev/null +++ b/tests/cases/conformance/types/safeNavigation/types.safeNavigation.esnext.1.ts @@ -0,0 +1,39 @@ +// @target: esnext +// @lib: esnext +// @noEmit: true +// @module: commonjs +// @strictNullChecks: false +declare const x1: (() => number) | undefined | null; +declare const x2: { y: (() => number) | undefined | null; }; +declare const x3: { y: (() => number) | undefined | null; } | undefined | null; +declare const x4: { y: { z: (() => number) | undefined | null; } }; +declare const x5: { y: { z: (() => number) | undefined | null; } | undefined | null } | undefined | null; +declare const x6: { y: number } | undefined | null; +declare const x7: { y: any }; +declare const x8: { y: { z: number } | undefined | null } | undefined | null; +declare const y: "y"; +declare const z: "z"; + +x1?.(); +(x1)?.(); + +x2.y?.(); +x2[y]?.(); +(x2.y)?.(); +(x2[y])?.(); +x3?.y?.(); +x3?.[y]?.(); + +x4.y.z?.(); +x4.y[z]?.(); +(x4.y.z)?.(); +(x4.y[z])?.(); +x5?.y?.z?.(); +x5?.y?.z; +x5?.[y]?.[z]; + +x6?.y = 1; +x6?.y += 1; +x6?.y *= 1; +x6?.y++; +++x6?.y; diff --git a/tests/cases/conformance/types/safeNavigation/types.safeNavigation.esnext.2.ts b/tests/cases/conformance/types/safeNavigation/types.safeNavigation.esnext.2.ts new file mode 100644 index 00000000000..a87d3eecd14 --- /dev/null +++ b/tests/cases/conformance/types/safeNavigation/types.safeNavigation.esnext.2.ts @@ -0,0 +1,39 @@ +// @target: esnext +// @lib: esnext +// @noEmit: true +// @module: commonjs +// @strictNullChecks: true +declare const x1: (() => number) | undefined | null; +declare const x2: { y: (() => number) | undefined | null; }; +declare const x3: { y: (() => number) | undefined | null; } | undefined | null; +declare const x4: { y: { z: (() => number) | undefined | null; } }; +declare const x5: { y: { z: (() => number) | undefined | null; } | undefined | null } | undefined | null; +declare const x6: { y: number } | undefined | null; +declare const x7: { y: any }; +declare const x8: { y: { z: number } | undefined | null } | undefined | null; +declare const y: "y"; +declare const z: "z"; + +const a1 = x1?.(); +const a2 = (x1)?.(); + +const a3 = x2.y?.(); +const a4 = x2[y]?.(); +const a5 = (x2.y)?.(); +const a6 = (x2[y])?.(); +const a7 = x3?.y?.(); +const a8 = x3?.[y]?.(); + +const a9 = x4.y.z?.(); +const a10 = x4.y[z]?.(); +const a11 = (x4.y.z)?.(); +const a12 = (x4.y[z])?.(); +const a13 = x5?.y?.z?.(); +const a14 = x5?.y?.z; +const a15 = x5?.[y]?.[z]; + +const a16 = x6?.y = 1; +const a17 = x6?.y += 1; +const a17a = x6?.y *= 1; +const a18 = x6?.y++; +const a19 = ++x6?.y;