diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 5fd9aadf280c9..49aacf7c9b447 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -1975,8 +1975,7 @@ namespace ts { if (name.kind === SyntaxKind.QualifiedName) { left = (name).left; } - else if (name.kind === SyntaxKind.PropertyAccessExpression && - (name.expression.kind === SyntaxKind.ParenthesizedExpression || isEntityNameExpression(name.expression))) { + else if (name.kind === SyntaxKind.PropertyAccessExpression) { left = name.expression; } else { @@ -2005,15 +2004,6 @@ namespace ts { return undefined; } } - else if (name.kind === SyntaxKind.ParenthesizedExpression) { - // If the expression in parenthesizedExpression is not an entity-name (e.g. it is a call expression), it won't be able to successfully resolve the name. - // This is the case when we are trying to do any language service operation in heritage clauses. - // By return undefined, the getSymbolOfEntityNameOrPropertyAccessExpression will attempt to checkPropertyAccessExpression to resolve symbol. - // i.e class C extends foo()./*do language service operation here*/B {} - return isEntityNameExpression(name.expression) ? - resolveEntityName(name.expression as EntityNameOrEntityNameExpression, meaning, ignoreErrors, dontResolveAlias, location) : - undefined; - } else { Debug.assertNever(name, "Unknown entity name kind."); } @@ -24203,8 +24193,8 @@ namespace ts { } } - if (entityName.parent.kind === SyntaxKind.ExportAssignment && isEntityNameExpression(entityName)) { - return resolveEntityName(entityName, + if (entityName.parent.kind === SyntaxKind.ExportAssignment && isEntityNameExpression(entityName)) { + return resolveEntityName(entityName, /*all meanings*/ SymbolFlags.Value | SymbolFlags.Type | SymbolFlags.Namespace | SymbolFlags.Alias); } @@ -24219,7 +24209,7 @@ namespace ts { entityName = entityName.parent; } - if (isHeritageClauseElementIdentifier(entityName)) { + if (isHeritageClauseElementIdentifier(entityName)) { let meaning = SymbolFlags.None; // In an interface or class, we're definitely interested in a type. if (entityName.parent.kind === SyntaxKind.ExpressionWithTypeArguments) { @@ -24235,7 +24225,7 @@ namespace ts { } meaning |= SymbolFlags.Alias; - const entityNameSymbol = resolveEntityName(entityName, meaning); + const entityNameSymbol = isEntityNameExpression(entityName) ? resolveEntityName(entityName, meaning) : undefined; if (entityNameSymbol) { return entityNameSymbol; } diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 30eb518961176..4bf4b814c1ea1 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -1622,7 +1622,7 @@ namespace ts { multiLine?: boolean; } - export type EntityNameExpression = Identifier | PropertyAccessEntityNameExpression | ParenthesizedExpression; + export type EntityNameExpression = Identifier | PropertyAccessEntityNameExpression; export type EntityNameOrEntityNameExpression = EntityName | EntityNameExpression; export interface PropertyAccessExpression extends MemberExpression, NamedDeclaration { diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index f2874b6b66595..7b81b23cd7ae5 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -3286,7 +3286,7 @@ namespace ts { && isClassLike(node.parent.parent); } - export function isEntityNameExpression(node: Expression): node is EntityNameExpression { + export function isEntityNameExpression(node: Node): node is EntityNameExpression { return node.kind === SyntaxKind.Identifier || node.kind === SyntaxKind.PropertyAccessExpression && isEntityNameExpression((node).expression); } diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index 09cf8199ddb99..5d215bec3e6e1 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -969,7 +969,7 @@ declare namespace ts { interface ObjectLiteralExpression extends ObjectLiteralExpressionBase { kind: SyntaxKind.ObjectLiteralExpression; } - type EntityNameExpression = Identifier | PropertyAccessEntityNameExpression | ParenthesizedExpression; + type EntityNameExpression = Identifier | PropertyAccessEntityNameExpression; type EntityNameOrEntityNameExpression = EntityName | EntityNameExpression; interface PropertyAccessExpression extends MemberExpression, NamedDeclaration { kind: SyntaxKind.PropertyAccessExpression; diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index f8ffc686008a2..b61163320ecff 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -969,7 +969,7 @@ declare namespace ts { interface ObjectLiteralExpression extends ObjectLiteralExpressionBase { kind: SyntaxKind.ObjectLiteralExpression; } - type EntityNameExpression = Identifier | PropertyAccessEntityNameExpression | ParenthesizedExpression; + type EntityNameExpression = Identifier | PropertyAccessEntityNameExpression; type EntityNameOrEntityNameExpression = EntityName | EntityNameExpression; interface PropertyAccessExpression extends MemberExpression, NamedDeclaration { kind: SyntaxKind.PropertyAccessExpression;