@@ -968,37 +968,34 @@ namespace ts {
968968
969969
970970 function checkAndReportErrorForExtendingInterface(errorLocation: Node): boolean {
971- const parentExpression = climbToSupportedExpressionWithTypeArguments(errorLocation);
972- if (!parentExpression) {
973- return false;
974- }
975- const expression = parentExpression.expression;
976-
977- if (resolveEntityName(expression, SymbolFlags.Interface, /*ignoreErrors*/ true)) {
971+ const expression = climbToEntityNameOfExpressionWithTypeArguments(errorLocation);
972+ const isError = !!(expression && resolveEntityName(expression, SymbolFlags.Interface, /*ignoreErrors*/ true));
973+ if (isError) {
978974 error(errorLocation, Diagnostics.Cannot_extend_an_interface_0_Did_you_mean_implements, getTextOfNode(expression));
979- return true;
980975 }
981- return false ;
976+ return isError ;
982977 }
983978 /**
984- * Climbs up parents to a SupportedExpressionWIthTypeArguments.
985- * Does *not* just climb to an ExpressionWithTypeArguments; instead, ensures that this really is supported .
979+ * Climbs up parents to an ExpressionWithTypeArguments, and returns its expression,
980+ * but returns undefined if that expression is not an EntityNameExpression .
986981 */
987- function climbToSupportedExpressionWithTypeArguments (node: Node): SupportedExpressionWithTypeArguments | undefined {
988- while (node) {
989- switch (node.kind) {
990- case SyntaxKind.Identifier :
991- case SyntaxKind.PropertyAccessExpression:
982+ function climbToEntityNameOfExpressionWithTypeArguments (node: Node): EntityNameExpression | undefined {
983+ switch (node.kind ) {
984+ case SyntaxKind.Identifier:
985+ case SyntaxKind.PropertyAccessExpression :
986+ if (node.parent) {
992987 node = node.parent;
993- break;
994- case SyntaxKind.ExpressionWithTypeArguments:
995- Debug.assert(isSupportedExpressionWithTypeArguments(<ExpressionWithTypeArguments>node));
996- return <SupportedExpressionWithTypeArguments>node;
997- default:
988+ }
989+ else {
998990 return undefined;
999- }
991+ }
992+ break;
993+ case SyntaxKind.ExpressionWithTypeArguments:
994+ Debug.assert(isEntityNameExpression((<ExpressionWithTypeArguments>node).expression));
995+ return <EntityNameExpression>(<ExpressionWithTypeArguments>node).expression;
996+ default:
997+ return undefined;
1000998 }
1001- return undefined;
1002999 }
10031000
10041001
@@ -3686,7 +3683,7 @@ namespace ts {
36863683 const baseTypeNodes = getInterfaceBaseTypeNodes(<InterfaceDeclaration>declaration);
36873684 if (baseTypeNodes) {
36883685 for (const node of baseTypeNodes) {
3689- if (isSupportedExpressionWithTypeArguments (node)) {
3686+ if (isEntityNameExpression (node.expression )) {
36903687 const baseSymbol = resolveEntityName(node.expression, SymbolFlags.Type, /*ignoreErrors*/ true);
36913688 if (!baseSymbol || !(baseSymbol.flags & SymbolFlags.Interface) || getDeclaredTypeOfClassOrInterface(baseSymbol).thisType) {
36923689 return false;
@@ -5042,9 +5039,9 @@ namespace ts {
50425039 case SyntaxKind.ExpressionWithTypeArguments:
50435040 // We only support expressions that are simple qualified names. For other
50445041 // expressions this produces undefined.
5045- const expr = <ExpressionWithTypeArguments>node;
5046- if (isSupportedExpressionWithTypeArguments (expr)) {
5047- return expr.expression ;
5042+ const expr = ( <ExpressionWithTypeArguments>node).expression ;
5043+ if (isEntityNameExpression (expr)) {
5044+ return expr;
50485045 }
50495046
50505047 // fall through;
@@ -5101,8 +5098,8 @@ namespace ts {
51015098 // We only support expressions that are simple qualified names. For other expressions this produces undefined.
51025099 const typeNameOrExpression: EntityNameOrEntityNameExpression = node.kind === SyntaxKind.TypeReference
51035100 ? (<TypeReferenceNode>node).typeName
5104- : isSupportedExpressionWithTypeArguments( <ExpressionWithTypeArguments>node)
5105- ? (<SupportedExpressionWithTypeArguments >node).expression
5101+ : isEntityNameExpression(( <ExpressionWithTypeArguments>node).expression )
5102+ ? <EntityNameExpression>(<ExpressionWithTypeArguments >node).expression
51065103 : undefined;
51075104 symbol = typeNameOrExpression && resolveEntityName(typeNameOrExpression, SymbolFlags.Type) || unknownSymbol;
51085105 type = symbol === unknownSymbol ? unknownType :
@@ -16255,7 +16252,7 @@ namespace ts {
1625516252 const implementedTypeNodes = getClassImplementsHeritageClauseElements(node);
1625616253 if (implementedTypeNodes) {
1625716254 for (const typeRefNode of implementedTypeNodes) {
16258- if (!isSupportedExpressionWithTypeArguments (typeRefNode)) {
16255+ if (!isEntityNameExpression (typeRefNode.expression )) {
1625916256 error(typeRefNode.expression, Diagnostics.A_class_can_only_implement_an_identifier_Slashqualified_name_with_optional_type_arguments);
1626016257 }
1626116258 checkTypeReferenceNode(typeRefNode);
@@ -16497,7 +16494,7 @@ namespace ts {
1649716494 checkObjectTypeForDuplicateDeclarations(node);
1649816495 }
1649916496 forEach(getInterfaceBaseTypeNodes(node), heritageElement => {
16500- if (!isSupportedExpressionWithTypeArguments (heritageElement)) {
16497+ if (!isEntityNameExpression (heritageElement.expression )) {
1650116498 error(heritageElement.expression, Diagnostics.An_interface_can_only_extend_an_identifier_Slashqualified_name_with_optional_type_arguments);
1650216499 }
1650316500 checkTypeReferenceNode(heritageElement);
0 commit comments