From decbcebf075f64bfad64ae6a2cc9df70b388ad59 Mon Sep 17 00:00:00 2001 From: Maria Solano Date: Mon, 13 Mar 2023 11:08:32 -0700 Subject: [PATCH 1/2] 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 --- src/services/codefixes/helpers.ts | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/services/codefixes/helpers.ts b/src/services/codefixes/helpers.ts index 154f1ad1b573c..bba8251e52ef8 100644 --- a/src/services/codefixes/helpers.ts +++ b/src/services/codefixes/helpers.ts @@ -5,6 +5,7 @@ import { ArrowFunction, Block, CallExpression, + canHaveSymbol, CharacterCodes, ClassLikeDeclaration, CodeFixContextBase, @@ -38,8 +39,10 @@ import { IntersectionType, isArrowFunction, isAutoAccessorPropertyDeclaration, + isConstructorTypeNode, isFunctionDeclaration, isFunctionExpression, + isFunctionTypeNode, isGetAccessorDeclaration, isIdentifier, isImportTypeNode, @@ -64,6 +67,7 @@ import { NodeArray, NodeBuilderFlags, NodeFlags, + nodeIsSynthesized, nullTransformationContext, ObjectFlags, ObjectLiteralExpression, @@ -84,6 +88,7 @@ import { some, SourceFile, Symbol, + SymbolAccessibility, SymbolFlags, SymbolTracker, SyntaxKind, @@ -363,6 +368,7 @@ export function createSignatureDeclarationFromSignature( ) { const program = context.program; const checker = program.getTypeChecker(); + const resolver = checker.getEmitResolver(); const scriptTarget = getEmitScriptTarget(program.getCompilerOptions()); const isJs = isInJSFile(enclosingDeclaration); const flags = @@ -417,6 +423,9 @@ export function createSignatureDeclarationFromSignature( type = importableReference.typeNode; importSymbols(importAdder, importableReference.symbols); } + else if (!isDeclTypeSymbolVisible(parameterDecl.type)) { + type = factory.createKeywordTypeNode(SyntaxKind.AnyKeyword); + } } return factory.updateParameterDeclaration( parameterDecl, @@ -455,6 +464,23 @@ export function createSignatureDeclarationFromSignature( return factory.updateFunctionDeclaration(signatureDeclaration, modifiers, signatureDeclaration.asteriskToken, tryCast(name, isIdentifier), typeParameters, parameters, type, body ?? signatureDeclaration.body); } return undefined; + + function isDeclTypeSymbolVisible(declType: TypeNode | undefined) { + if (!declType || !canHaveSymbol(declType)) { + return true; + } + + if (!declType.symbol) { + // These nodes won't have a symbol when generated via a code fix, so we treat them as an exception. + if (isFunctionTypeNode(declType) || isConstructorTypeNode(declType)) { + return nodeIsSynthesized(declType); + } + return false; + } + + const access = resolver.isSymbolAccessible(declType.symbol, declType, declType.symbol.flags, /* shouldComputeAliasToMarkVisible */ true); + return access.accessibility === SymbolAccessibility.Accessible; + } } /** @internal */ From 56768f525ddd61078dbb1c3d510e1523bb4cf703 Mon Sep 17 00:00:00 2001 From: Maria Solano Date: Mon, 20 Mar 2023 14:54:10 -0700 Subject: [PATCH 2/2] Update baseline --- tests/baselines/reference/completionsClassMembers4.baseline | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/baselines/reference/completionsClassMembers4.baseline b/tests/baselines/reference/completionsClassMembers4.baseline index ecbe05f1c207d..b6d67571555f3 100644 --- a/tests/baselines/reference/completionsClassMembers4.baseline +++ b/tests/baselines/reference/completionsClassMembers4.baseline @@ -207,7 +207,7 @@ "kind": "method", "kindModifiers": "", "sortText": "17", - "insertText": "pipe(): Observable;\npipe(): Observable;\npipe(): Observable;\npipe(): Observable;\npipe(): Observable;\npipe(): Observable;\npipe(): Observable;\npipe(): Observable;\npipe(): Observable;\npipe(): Observable;\npipe(): Observable;\npipe(): Observable | Observable | Observable | Observable | Observable | Observable | Observable | Observable | Observable | Observable | Observable {\n $0\n}", + "insertText": "pipe(): Observable;\npipe(): Observable;\npipe(): Observable;\npipe(): Observable;\npipe(): Observable;\npipe(): Observable;\npipe(): Observable;\npipe(): Observable;\npipe(): Observable;\npipe(): Observable;\npipe(): Observable;\npipe(): Observable | Observable | Observable | Observable | Observable | Observable | Observable | Observable | Observable | Observable | Observable {\n $0\n}", "isSnippet": true, "displayParts": [ {