@@ -213,7 +213,7 @@ namespace ts {
213
213
return node ? getConstantValue(node) : undefined;
214
214
},
215
215
isValidPropertyAccess: (node, propertyName) => {
216
- node = getParseTreeNode(node, isPropertyAccessOrQualifiedName );
216
+ node = getParseTreeNode(node, isPropertyAccessOrQualifiedNameOrImportTypeNode );
217
217
return !!node && isValidPropertyAccess(node, escapeLeadingUnderscores(propertyName));
218
218
},
219
219
isValidPropertyAccessForCompletions: (node, type, property) => {
@@ -8550,7 +8550,7 @@ namespace ts {
8550
8550
return links.resolvedType = unknownType;
8551
8551
}
8552
8552
const moduleSymbol = resolveExternalModuleSymbol(innerModuleSymbol, /*dontResolveAlias*/ false);
8553
- if (node.qualifier) {
8553
+ if (!nodeIsMissing( node.qualifier) ) {
8554
8554
const nameStack: Identifier[] = getIdentifierChain(node.qualifier);
8555
8555
let currentNamespace = moduleSymbol;
8556
8556
let current: Identifier | undefined;
@@ -16240,11 +16240,13 @@ namespace ts {
16240
16240
* @param type The type of left.
16241
16241
* @param prop The symbol for the right hand side of the property access.
16242
16242
*/
16243
- function checkPropertyAccessibility(node: PropertyAccessExpression | QualifiedName | VariableLikeDeclaration, left: Expression | QualifiedName, type: Type, prop: Symbol): boolean {
16243
+ function checkPropertyAccessibility(node: PropertyAccessExpression | QualifiedName | VariableLikeDeclaration | ImportTypeNode , left: Expression | QualifiedName | ImportTypeNode , type: Type, prop: Symbol): boolean {
16244
16244
const flags = getDeclarationModifierFlagsFromSymbol(prop);
16245
16245
const errorNode = node.kind === SyntaxKind.PropertyAccessExpression || node.kind === SyntaxKind.VariableDeclaration ?
16246
16246
node.name :
16247
- (<QualifiedName>node).right;
16247
+ node.kind === SyntaxKind.ImportTypeNode ?
16248
+ node :
16249
+ (<QualifiedName>node).right;
16248
16250
16249
16251
if (getCheckFlags(prop) & CheckFlags.ContainsPrivate) {
16250
16252
// Synthetic property with private constituent property
@@ -16683,13 +16685,19 @@ namespace ts {
16683
16685
(getCheckFlags(prop) & CheckFlags.Instantiated ? getSymbolLinks(prop).target : prop).isReferenced = SymbolFlags.All;
16684
16686
}
16685
16687
16686
- function isValidPropertyAccess(node: PropertyAccessExpression | QualifiedName, propertyName: __String): boolean {
16687
- const left = node.kind === SyntaxKind.PropertyAccessExpression ? node.expression : node.left;
16688
- return isValidPropertyAccessWithType(node, left, propertyName, getWidenedType(checkExpression(left)));
16688
+ function isValidPropertyAccess(node: PropertyAccessExpression | QualifiedName | ImportTypeNode, propertyName: __String): boolean {
16689
+ switch (node.kind) {
16690
+ case SyntaxKind.PropertyAccessExpression:
16691
+ return isValidPropertyAccessWithType(node, node.expression, propertyName, getWidenedType(checkExpression(node.expression)));
16692
+ case SyntaxKind.QualifiedName:
16693
+ return isValidPropertyAccessWithType(node, node.left, propertyName, getWidenedType(checkExpression(node.left)));
16694
+ case SyntaxKind.ImportTypeNode:
16695
+ return isValidPropertyAccessWithType(node, node, propertyName, getTypeFromTypeNode(node));
16696
+ }
16689
16697
}
16690
16698
16691
- function isValidPropertyAccessForCompletions(node: PropertyAccessExpression, type: Type, property: Symbol): boolean {
16692
- return isValidPropertyAccessWithType(node, node.expression, property.escapedName, type)
16699
+ function isValidPropertyAccessForCompletions(node: PropertyAccessExpression | ImportTypeNode , type: Type, property: Symbol): boolean {
16700
+ return isValidPropertyAccessWithType(node, node.kind === SyntaxKind.ImportTypeNode ? node : node. expression, property.escapedName, type)
16693
16701
&& (!(property.flags & SymbolFlags.Method) || isValidMethodAccess(property, type));
16694
16702
}
16695
16703
function isValidMethodAccess(method: Symbol, actualThisType: Type): boolean {
@@ -16711,8 +16719,8 @@ namespace ts {
16711
16719
}
16712
16720
16713
16721
function isValidPropertyAccessWithType(
16714
- node: PropertyAccessExpression | QualifiedName,
16715
- left: LeftHandSideExpression | QualifiedName,
16722
+ node: PropertyAccessExpression | QualifiedName | ImportTypeNode ,
16723
+ left: LeftHandSideExpression | QualifiedName | ImportTypeNode ,
16716
16724
propertyName: __String,
16717
16725
type: Type): boolean {
16718
16726
@@ -25336,6 +25344,8 @@ namespace ts {
25336
25344
case SyntaxKind.FunctionKeyword:
25337
25345
case SyntaxKind.EqualsGreaterThanToken:
25338
25346
return getSymbolOfNode(node.parent);
25347
+ case SyntaxKind.ImportTypeNode:
25348
+ return isLiteralImportTypeNode(node) ? getSymbolAtLocation(node.argument.literal) : undefined;
25339
25349
25340
25350
default:
25341
25351
return undefined;
0 commit comments