Skip to content

Commit e881081

Browse files
author
Kanchalai Tanglertsampan
committed
Serialize type alias when type alias symbol is not accessible
1 parent a4864d0 commit e881081

File tree

3 files changed

+26
-14
lines changed

3 files changed

+26
-14
lines changed

src/compiler/checker.ts

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1758,15 +1758,23 @@ namespace ts {
17581758
return false;
17591759
}
17601760

1761-
function isSymbolAccessible(symbol: Symbol, enclosingDeclaration: Node, meaning: SymbolFlags): SymbolAccessibilityResult {
1761+
/**
1762+
* Check if the given symbol in given enclosing declaration is accessible and mark all associated alias to be visible if requested
1763+
*
1764+
* @param symbol a Symbol to check if accessible
1765+
* @param enclosingDeclaration a Node containing the symbol
1766+
* @param meaning a SymbolFlags to check if such meaning of the symbol is accessible
1767+
* @param shouldComputeAliasToMarkVisible a boolean value to indicate whether to return aliases to be mark visible in case the symbol is accessible
1768+
*/
1769+
function isSymbolAccessible(symbol: Symbol, enclosingDeclaration: Node, meaning: SymbolFlags, shouldComputeAliasesToMakeVisible: boolean): SymbolAccessibilityResult {
17621770
if (symbol && enclosingDeclaration && !(symbol.flags & SymbolFlags.TypeParameter)) {
17631771
const initialSymbol = symbol;
17641772
let meaningToLook = meaning;
17651773
while (symbol) {
17661774
// Symbol is accessible if it by itself is accessible
17671775
const accessibleSymbolChain = getAccessibleSymbolChain(symbol, enclosingDeclaration, meaningToLook, /*useOnlyExternalAliasing*/ false);
17681776
if (accessibleSymbolChain) {
1769-
const hasAccessibleDeclarations = hasVisibleDeclarations(accessibleSymbolChain[0]);
1777+
const hasAccessibleDeclarations = hasVisibleDeclarations(accessibleSymbolChain[0], shouldComputeAliasesToMakeVisible);
17701778
if (!hasAccessibleDeclarations) {
17711779
return <SymbolAccessibilityResult>{
17721780
accessibility: SymbolAccessibility.NotAccessible,
@@ -1830,7 +1838,7 @@ namespace ts {
18301838
return isAmbientModule(declaration) || (declaration.kind === SyntaxKind.SourceFile && isExternalOrCommonJsModule(<SourceFile>declaration));
18311839
}
18321840

1833-
function hasVisibleDeclarations(symbol: Symbol): SymbolVisibilityResult {
1841+
function hasVisibleDeclarations(symbol: Symbol, shouldComputeAliasToMarkVisible: boolean): SymbolVisibilityResult {
18341842
let aliasesToMakeVisible: AnyImportSyntax[];
18351843
if (forEach(symbol.declarations, declaration => !getIsDeclarationVisible(declaration))) {
18361844
return undefined;
@@ -1846,14 +1854,16 @@ namespace ts {
18461854
if (anyImportSyntax &&
18471855
!(getModifierFlags(anyImportSyntax) & ModifierFlags.Export) && // import clause without export
18481856
isDeclarationVisible(<Declaration>anyImportSyntax.parent)) {
1849-
getNodeLinks(declaration).isVisible = true;
1850-
if (aliasesToMakeVisible) {
1851-
if (!contains(aliasesToMakeVisible, anyImportSyntax)) {
1852-
aliasesToMakeVisible.push(anyImportSyntax);
1857+
if (shouldComputeAliasToMarkVisible) {
1858+
getNodeLinks(declaration).isVisible = true;
1859+
if (aliasesToMakeVisible) {
1860+
if (!contains(aliasesToMakeVisible, anyImportSyntax)) {
1861+
aliasesToMakeVisible.push(anyImportSyntax);
1862+
}
1863+
}
1864+
else {
1865+
aliasesToMakeVisible = [anyImportSyntax];
18531866
}
1854-
}
1855-
else {
1856-
aliasesToMakeVisible = [anyImportSyntax];
18571867
}
18581868
return true;
18591869
}
@@ -1888,7 +1898,7 @@ namespace ts {
18881898
const symbol = resolveName(enclosingDeclaration, (<Identifier>firstIdentifier).text, meaning, /*nodeNotFoundErrorMessage*/ undefined, /*nameArg*/ undefined);
18891899

18901900
// Verify if the symbol is accessible
1891-
return (symbol && hasVisibleDeclarations(symbol)) || <SymbolVisibilityResult>{
1901+
return (symbol && hasVisibleDeclarations(symbol, /*shouldComputeAliasToMarkVisible*/ true)) || <SymbolVisibilityResult>{
18921902
accessibility: SymbolAccessibility.NotAccessible,
18931903
errorSymbolName: getTextOfNode(firstIdentifier),
18941904
errorNode: firstIdentifier
@@ -2163,7 +2173,9 @@ namespace ts {
21632173
// The specified symbol flags need to be reinterpreted as type flags
21642174
buildSymbolDisplay(type.symbol, writer, enclosingDeclaration, SymbolFlags.Type, SymbolFormatFlags.None, nextFlags);
21652175
}
2166-
else if (!(flags & TypeFormatFlags.InTypeAlias) && type.flags & (TypeFlags.Anonymous | TypeFlags.UnionOrIntersection) && type.aliasSymbol) {
2176+
else if (!(flags & TypeFormatFlags.InTypeAlias) && type.flags & (TypeFlags.Anonymous | TypeFlags.UnionOrIntersection) && type.aliasSymbol &&
2177+
isSymbolAccessible(type.aliasSymbol, enclosingDeclaration, SymbolFlags.Type, /*shouldComputeAliasesToMakeVisible*/ false).accessibility === SymbolAccessibility.Accessible) {
2178+
// Only write out inferred type with its corresponding type-alias if type-alias is visible
21672179
const typeArguments = type.aliasTypeArguments;
21682180
writeSymbolTypeReference(type.aliasSymbol, typeArguments, 0, typeArguments ? typeArguments.length : 0, nextFlags);
21692181
}

src/compiler/declarationEmitter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ namespace ts {
306306
}
307307

308308
function trackSymbol(symbol: Symbol, enclosingDeclaration?: Node, meaning?: SymbolFlags) {
309-
handleSymbolAccessibilityError(resolver.isSymbolAccessible(symbol, enclosingDeclaration, meaning));
309+
handleSymbolAccessibilityError(resolver.isSymbolAccessible(symbol, enclosingDeclaration, meaning, /*shouldComputeAliasesToMakeVisible*/ true));
310310
recordTypeReferenceDirectivesIfNecessary(resolver.getTypeReferenceDirectivesForSymbol(symbol, meaning));
311311
}
312312

src/compiler/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2138,7 +2138,7 @@ namespace ts {
21382138
writeReturnTypeOfSignatureDeclaration(signatureDeclaration: SignatureDeclaration, enclosingDeclaration: Node, flags: TypeFormatFlags, writer: SymbolWriter): void;
21392139
writeTypeOfExpression(expr: Expression, enclosingDeclaration: Node, flags: TypeFormatFlags, writer: SymbolWriter): void;
21402140
writeBaseConstructorTypeOfClass(node: ClassLikeDeclaration, enclosingDeclaration: Node, flags: TypeFormatFlags, writer: SymbolWriter): void;
2141-
isSymbolAccessible(symbol: Symbol, enclosingDeclaration: Node, meaning: SymbolFlags): SymbolAccessibilityResult;
2141+
isSymbolAccessible(symbol: Symbol, enclosingDeclaration: Node, meaning: SymbolFlags, shouldComputeAliasToMarkVisible: boolean): SymbolAccessibilityResult;
21422142
isEntityNameVisible(entityName: EntityNameOrEntityNameExpression, enclosingDeclaration: Node): SymbolVisibilityResult;
21432143
// Returns the constant value this property access resolves to, or 'undefined' for a non-constant
21442144
getConstantValue(node: EnumMember | PropertyAccessExpression | ElementAccessExpression): number;

0 commit comments

Comments
 (0)