Skip to content

Commit decbceb

Browse files
author
Maria Solano
committed
Check symbol accessibility when generating snippet
Repros without abstract I think this fixes it?? Leave the checker alone for now Make type any when there is no importableReference Remove compiler test YAYY just 3 failing tests! Consider edge cases with function types Check symbol accessibility when generating snippet
1 parent 74a37f8 commit decbceb

File tree

1 file changed

+26
-0
lines changed

1 file changed

+26
-0
lines changed

src/services/codefixes/helpers.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
ArrowFunction,
66
Block,
77
CallExpression,
8+
canHaveSymbol,
89
CharacterCodes,
910
ClassLikeDeclaration,
1011
CodeFixContextBase,
@@ -38,8 +39,10 @@ import {
3839
IntersectionType,
3940
isArrowFunction,
4041
isAutoAccessorPropertyDeclaration,
42+
isConstructorTypeNode,
4143
isFunctionDeclaration,
4244
isFunctionExpression,
45+
isFunctionTypeNode,
4346
isGetAccessorDeclaration,
4447
isIdentifier,
4548
isImportTypeNode,
@@ -64,6 +67,7 @@ import {
6467
NodeArray,
6568
NodeBuilderFlags,
6669
NodeFlags,
70+
nodeIsSynthesized,
6771
nullTransformationContext,
6872
ObjectFlags,
6973
ObjectLiteralExpression,
@@ -84,6 +88,7 @@ import {
8488
some,
8589
SourceFile,
8690
Symbol,
91+
SymbolAccessibility,
8792
SymbolFlags,
8893
SymbolTracker,
8994
SyntaxKind,
@@ -363,6 +368,7 @@ export function createSignatureDeclarationFromSignature(
363368
) {
364369
const program = context.program;
365370
const checker = program.getTypeChecker();
371+
const resolver = checker.getEmitResolver();
366372
const scriptTarget = getEmitScriptTarget(program.getCompilerOptions());
367373
const isJs = isInJSFile(enclosingDeclaration);
368374
const flags =
@@ -417,6 +423,9 @@ export function createSignatureDeclarationFromSignature(
417423
type = importableReference.typeNode;
418424
importSymbols(importAdder, importableReference.symbols);
419425
}
426+
else if (!isDeclTypeSymbolVisible(parameterDecl.type)) {
427+
type = factory.createKeywordTypeNode(SyntaxKind.AnyKeyword);
428+
}
420429
}
421430
return factory.updateParameterDeclaration(
422431
parameterDecl,
@@ -455,6 +464,23 @@ export function createSignatureDeclarationFromSignature(
455464
return factory.updateFunctionDeclaration(signatureDeclaration, modifiers, signatureDeclaration.asteriskToken, tryCast(name, isIdentifier), typeParameters, parameters, type, body ?? signatureDeclaration.body);
456465
}
457466
return undefined;
467+
468+
function isDeclTypeSymbolVisible(declType: TypeNode | undefined) {
469+
if (!declType || !canHaveSymbol(declType)) {
470+
return true;
471+
}
472+
473+
if (!declType.symbol) {
474+
// These nodes won't have a symbol when generated via a code fix, so we treat them as an exception.
475+
if (isFunctionTypeNode(declType) || isConstructorTypeNode(declType)) {
476+
return nodeIsSynthesized(declType);
477+
}
478+
return false;
479+
}
480+
481+
const access = resolver.isSymbolAccessible(declType.symbol, declType, declType.symbol.flags, /* shouldComputeAliasToMarkVisible */ true);
482+
return access.accessibility === SymbolAccessibility.Accessible;
483+
}
458484
}
459485

460486
/** @internal */

0 commit comments

Comments
 (0)