• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/* @internal */
2namespace ts {
3    export type GetSymbolAccessibilityDiagnostic = (symbolAccessibilityResult: SymbolAccessibilityResult) => (SymbolAccessibilityDiagnostic | undefined);
4
5    export interface SymbolAccessibilityDiagnostic {
6        errorNode: Node;
7        diagnosticMessage: DiagnosticMessage;
8        typeName?: DeclarationName | QualifiedName;
9    }
10
11    export type DeclarationDiagnosticProducing =
12        | VariableDeclaration
13        | PropertyDeclaration
14        | PropertySignature
15        | BindingElement
16        | SetAccessorDeclaration
17        | GetAccessorDeclaration
18        | ConstructSignatureDeclaration
19        | CallSignatureDeclaration
20        | MethodDeclaration
21        | MethodSignature
22        | FunctionDeclaration
23        | ParameterDeclaration
24        | TypeParameterDeclaration
25        | ExpressionWithTypeArguments
26        | ImportEqualsDeclaration
27        | TypeAliasDeclaration
28        | ConstructorDeclaration
29        | IndexSignatureDeclaration
30        | PropertyAccessExpression
31        | JSDocTypedefTag
32        | JSDocCallbackTag
33        | JSDocEnumTag;
34
35    export function canProduceDiagnostics(node: Node): node is DeclarationDiagnosticProducing {
36        return isVariableDeclaration(node) ||
37            isPropertyDeclaration(node) ||
38            isPropertySignature(node) ||
39            isBindingElement(node) ||
40            isSetAccessor(node) ||
41            isGetAccessor(node) ||
42            isConstructSignatureDeclaration(node) ||
43            isCallSignatureDeclaration(node) ||
44            isMethodDeclaration(node) ||
45            isMethodSignature(node) ||
46            isFunctionDeclaration(node) ||
47            isParameter(node) ||
48            isTypeParameterDeclaration(node) ||
49            isExpressionWithTypeArguments(node) ||
50            isImportEqualsDeclaration(node) ||
51            isTypeAliasDeclaration(node) ||
52            isConstructorDeclaration(node) ||
53            isIndexSignatureDeclaration(node) ||
54            isPropertyAccessExpression(node) ||
55            isJSDocTypeAlias(node);
56    }
57
58    export function createGetSymbolAccessibilityDiagnosticForNodeName(node: DeclarationDiagnosticProducing) {
59        if (isSetAccessor(node) || isGetAccessor(node)) {
60            return getAccessorNameVisibilityError;
61        }
62        else if (isMethodSignature(node) || isMethodDeclaration(node)) {
63            return getMethodNameVisibilityError;
64        }
65        else {
66            return createGetSymbolAccessibilityDiagnosticForNode(node);
67        }
68        function getAccessorNameVisibilityError(symbolAccessibilityResult: SymbolAccessibilityResult) {
69            const diagnosticMessage = getAccessorNameVisibilityDiagnosticMessage(symbolAccessibilityResult);
70            return diagnosticMessage !== undefined ? {
71                diagnosticMessage,
72                errorNode: node,
73                typeName: (node as NamedDeclaration).name
74            } : undefined;
75        }
76
77        function getAccessorNameVisibilityDiagnosticMessage(symbolAccessibilityResult: SymbolAccessibilityResult) {
78            if (hasSyntacticModifier(node, ModifierFlags.Static)) {
79                return symbolAccessibilityResult.errorModuleName ?
80                    symbolAccessibilityResult.accessibility === SymbolAccessibility.CannotBeNamed ?
81                        Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
82                        Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 :
83                    Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_private_name_1;
84            }
85            else if (node.parent.kind === SyntaxKind.ClassDeclaration) {
86                return symbolAccessibilityResult.errorModuleName ?
87                    symbolAccessibilityResult.accessibility === SymbolAccessibility.CannotBeNamed ?
88                        Diagnostics.Public_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
89                        Diagnostics.Public_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 :
90                    Diagnostics.Public_property_0_of_exported_class_has_or_is_using_private_name_1;
91            }
92            else {
93                return symbolAccessibilityResult.errorModuleName ?
94                    Diagnostics.Property_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2 :
95                    Diagnostics.Property_0_of_exported_interface_has_or_is_using_private_name_1;
96            }
97        }
98
99        function getMethodNameVisibilityError(symbolAccessibilityResult: SymbolAccessibilityResult): SymbolAccessibilityDiagnostic | undefined {
100            const diagnosticMessage = getMethodNameVisibilityDiagnosticMessage(symbolAccessibilityResult);
101            return diagnosticMessage !== undefined ? {
102                diagnosticMessage,
103                errorNode: node,
104                typeName: (node as NamedDeclaration).name
105            } : undefined;
106        }
107
108        function getMethodNameVisibilityDiagnosticMessage(symbolAccessibilityResult: SymbolAccessibilityResult) {
109            if (hasSyntacticModifier(node, ModifierFlags.Static)) {
110                return symbolAccessibilityResult.errorModuleName ?
111                    symbolAccessibilityResult.accessibility === SymbolAccessibility.CannotBeNamed ?
112                        Diagnostics.Public_static_method_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
113                        Diagnostics.Public_static_method_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 :
114                    Diagnostics.Public_static_method_0_of_exported_class_has_or_is_using_private_name_1;
115            }
116            else if (node.parent.kind === SyntaxKind.ClassDeclaration) {
117                return symbolAccessibilityResult.errorModuleName ?
118                    symbolAccessibilityResult.accessibility === SymbolAccessibility.CannotBeNamed ?
119                        Diagnostics.Public_method_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
120                        Diagnostics.Public_method_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 :
121                    Diagnostics.Public_method_0_of_exported_class_has_or_is_using_private_name_1;
122            }
123            else {
124                return symbolAccessibilityResult.errorModuleName ?
125                    Diagnostics.Method_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2 :
126                    Diagnostics.Method_0_of_exported_interface_has_or_is_using_private_name_1;
127            }
128        }
129    }
130
131    export function createGetSymbolAccessibilityDiagnosticForNode(node: DeclarationDiagnosticProducing): GetSymbolAccessibilityDiagnostic {
132        if (isVariableDeclaration(node) || isPropertyDeclaration(node) || isPropertySignature(node) || isPropertyAccessExpression(node) || isBindingElement(node) || isConstructorDeclaration(node)) {
133            return getVariableDeclarationTypeVisibilityError;
134        }
135        else if (isSetAccessor(node) || isGetAccessor(node)) {
136            return getAccessorDeclarationTypeVisibilityError;
137        }
138        else if (isConstructSignatureDeclaration(node) || isCallSignatureDeclaration(node) || isMethodDeclaration(node) || isMethodSignature(node) || isFunctionDeclaration(node) || isIndexSignatureDeclaration(node)) {
139            return getReturnTypeVisibilityError;
140        }
141        else if (isParameter(node)) {
142            if (isParameterPropertyDeclaration(node, node.parent) && hasSyntacticModifier(node.parent, ModifierFlags.Private)) {
143                return getVariableDeclarationTypeVisibilityError;
144            }
145            return getParameterDeclarationTypeVisibilityError;
146        }
147        else if (isTypeParameterDeclaration(node)) {
148            return getTypeParameterConstraintVisibilityError;
149        }
150        else if (isExpressionWithTypeArguments(node)) {
151            return getHeritageClauseVisibilityError;
152        }
153        else if (isImportEqualsDeclaration(node)) {
154            return getImportEntityNameVisibilityError;
155        }
156        else if (isTypeAliasDeclaration(node) || isJSDocTypeAlias(node)) {
157            return getTypeAliasDeclarationVisibilityError;
158        }
159        else {
160            return Debug.assertNever(node, `Attempted to set a declaration diagnostic context for unhandled node kind: ${(ts as any).SyntaxKind[(node as any).kind]}`);
161        }
162
163        function getVariableDeclarationTypeVisibilityDiagnosticMessage(symbolAccessibilityResult: SymbolAccessibilityResult) {
164            if (node.kind === SyntaxKind.VariableDeclaration || node.kind === SyntaxKind.BindingElement) {
165                return symbolAccessibilityResult.errorModuleName ?
166                    symbolAccessibilityResult.accessibility === SymbolAccessibility.CannotBeNamed ?
167                        Diagnostics.Exported_variable_0_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
168                        Diagnostics.Exported_variable_0_has_or_is_using_name_1_from_private_module_2 :
169                    Diagnostics.Exported_variable_0_has_or_is_using_private_name_1;
170            }
171            // This check is to ensure we don't report error on constructor parameter property as that error would be reported during parameter emit
172            // The only exception here is if the constructor was marked as private. we are not emitting the constructor parameters at all.
173            else if (node.kind === SyntaxKind.PropertyDeclaration || node.kind === SyntaxKind.PropertyAccessExpression || node.kind === SyntaxKind.PropertySignature ||
174                (node.kind === SyntaxKind.Parameter && hasSyntacticModifier(node.parent, ModifierFlags.Private))) {
175                // TODO(jfreeman): Deal with computed properties in error reporting.
176                if (hasSyntacticModifier(node, ModifierFlags.Static)) {
177                    return symbolAccessibilityResult.errorModuleName ?
178                        symbolAccessibilityResult.accessibility === SymbolAccessibility.CannotBeNamed ?
179                            Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
180                            Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 :
181                        Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_private_name_1;
182                }
183                else if (node.parent.kind === SyntaxKind.ClassDeclaration || node.kind === SyntaxKind.Parameter) {
184                    return symbolAccessibilityResult.errorModuleName ?
185                        symbolAccessibilityResult.accessibility === SymbolAccessibility.CannotBeNamed ?
186                            Diagnostics.Public_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
187                            Diagnostics.Public_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 :
188                        Diagnostics.Public_property_0_of_exported_class_has_or_is_using_private_name_1;
189                }
190                else {
191                    // Interfaces cannot have types that cannot be named
192                    return symbolAccessibilityResult.errorModuleName ?
193                        Diagnostics.Property_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2 :
194                        Diagnostics.Property_0_of_exported_interface_has_or_is_using_private_name_1;
195                }
196            }
197        }
198
199        function getVariableDeclarationTypeVisibilityError(symbolAccessibilityResult: SymbolAccessibilityResult): SymbolAccessibilityDiagnostic | undefined {
200            const diagnosticMessage = getVariableDeclarationTypeVisibilityDiagnosticMessage(symbolAccessibilityResult);
201            return diagnosticMessage !== undefined ? {
202                diagnosticMessage,
203                errorNode: node,
204                typeName: (node as NamedDeclaration).name
205            } : undefined;
206        }
207
208        function getAccessorDeclarationTypeVisibilityError(symbolAccessibilityResult: SymbolAccessibilityResult): SymbolAccessibilityDiagnostic {
209            let diagnosticMessage: DiagnosticMessage;
210            if (node.kind === SyntaxKind.SetAccessor) {
211                // Getters can infer the return type from the returned expression, but setters cannot, so the
212                // "_from_external_module_1_but_cannot_be_named" case cannot occur.
213                if (hasSyntacticModifier(node, ModifierFlags.Static)) {
214                    diagnosticMessage = symbolAccessibilityResult.errorModuleName ?
215                        Diagnostics.Parameter_type_of_public_static_setter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2 :
216                        Diagnostics.Parameter_type_of_public_static_setter_0_from_exported_class_has_or_is_using_private_name_1;
217                }
218                else {
219                    diagnosticMessage = symbolAccessibilityResult.errorModuleName ?
220                        Diagnostics.Parameter_type_of_public_setter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2 :
221                        Diagnostics.Parameter_type_of_public_setter_0_from_exported_class_has_or_is_using_private_name_1;
222                }
223            }
224            else {
225                if (hasSyntacticModifier(node, ModifierFlags.Static)) {
226                    diagnosticMessage = symbolAccessibilityResult.errorModuleName ?
227                        symbolAccessibilityResult.accessibility === SymbolAccessibility.CannotBeNamed ?
228                            Diagnostics.Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
229                            Diagnostics.Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2 :
230                        Diagnostics.Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_private_name_1;
231                }
232                else {
233                    diagnosticMessage = symbolAccessibilityResult.errorModuleName ?
234                        symbolAccessibilityResult.accessibility === SymbolAccessibility.CannotBeNamed ?
235                            Diagnostics.Return_type_of_public_getter_0_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
236                            Diagnostics.Return_type_of_public_getter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2 :
237                        Diagnostics.Return_type_of_public_getter_0_from_exported_class_has_or_is_using_private_name_1;
238                }
239            }
240            return {
241                diagnosticMessage,
242                errorNode: (node as NamedDeclaration).name!,
243                typeName: (node as NamedDeclaration).name
244            };
245        }
246
247        function getReturnTypeVisibilityError(symbolAccessibilityResult: SymbolAccessibilityResult): SymbolAccessibilityDiagnostic {
248            let diagnosticMessage: DiagnosticMessage;
249            switch (node.kind) {
250                case SyntaxKind.ConstructSignature:
251                    // Interfaces cannot have return types that cannot be named
252                    diagnosticMessage = symbolAccessibilityResult.errorModuleName ?
253                        Diagnostics.Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 :
254                        Diagnostics.Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_0;
255                    break;
256
257                case SyntaxKind.CallSignature:
258                    // Interfaces cannot have return types that cannot be named
259                    diagnosticMessage = symbolAccessibilityResult.errorModuleName ?
260                        Diagnostics.Return_type_of_call_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 :
261                        Diagnostics.Return_type_of_call_signature_from_exported_interface_has_or_is_using_private_name_0;
262                    break;
263
264                case SyntaxKind.IndexSignature:
265                    // Interfaces cannot have return types that cannot be named
266                    diagnosticMessage = symbolAccessibilityResult.errorModuleName ?
267                        Diagnostics.Return_type_of_index_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 :
268                        Diagnostics.Return_type_of_index_signature_from_exported_interface_has_or_is_using_private_name_0;
269                    break;
270
271                case SyntaxKind.MethodDeclaration:
272                case SyntaxKind.MethodSignature:
273                    if (hasSyntacticModifier(node, ModifierFlags.Static)) {
274                        diagnosticMessage = symbolAccessibilityResult.errorModuleName ?
275                            symbolAccessibilityResult.accessibility === SymbolAccessibility.CannotBeNamed ?
276                                Diagnostics.Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named :
277                                Diagnostics.Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_private_module_1 :
278                            Diagnostics.Return_type_of_public_static_method_from_exported_class_has_or_is_using_private_name_0;
279                    }
280                    else if (node.parent.kind === SyntaxKind.ClassDeclaration) {
281                        diagnosticMessage = symbolAccessibilityResult.errorModuleName ?
282                            symbolAccessibilityResult.accessibility === SymbolAccessibility.CannotBeNamed ?
283                                Diagnostics.Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named :
284                                Diagnostics.Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_private_module_1 :
285                            Diagnostics.Return_type_of_public_method_from_exported_class_has_or_is_using_private_name_0;
286                    }
287                    else {
288                        // Interfaces cannot have return types that cannot be named
289                        diagnosticMessage = symbolAccessibilityResult.errorModuleName ?
290                            Diagnostics.Return_type_of_method_from_exported_interface_has_or_is_using_name_0_from_private_module_1 :
291                            Diagnostics.Return_type_of_method_from_exported_interface_has_or_is_using_private_name_0;
292                    }
293                    break;
294
295                case SyntaxKind.FunctionDeclaration:
296                    diagnosticMessage = symbolAccessibilityResult.errorModuleName ?
297                        symbolAccessibilityResult.accessibility === SymbolAccessibility.CannotBeNamed ?
298                            Diagnostics.Return_type_of_exported_function_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named :
299                            Diagnostics.Return_type_of_exported_function_has_or_is_using_name_0_from_private_module_1 :
300                        Diagnostics.Return_type_of_exported_function_has_or_is_using_private_name_0;
301                    break;
302
303                default:
304                    return Debug.fail("This is unknown kind for signature: " + node.kind);
305            }
306
307            return {
308                diagnosticMessage,
309                errorNode: (node as NamedDeclaration).name || node
310            };
311        }
312
313        function getParameterDeclarationTypeVisibilityError(symbolAccessibilityResult: SymbolAccessibilityResult): SymbolAccessibilityDiagnostic | undefined {
314            const diagnosticMessage: DiagnosticMessage = getParameterDeclarationTypeVisibilityDiagnosticMessage(symbolAccessibilityResult);
315            return diagnosticMessage !== undefined ? {
316                diagnosticMessage,
317                errorNode: node,
318                typeName: (node as NamedDeclaration).name
319            } : undefined;
320        }
321
322        function getParameterDeclarationTypeVisibilityDiagnosticMessage(symbolAccessibilityResult: SymbolAccessibilityResult): DiagnosticMessage {
323            switch (node.parent.kind) {
324                case SyntaxKind.Constructor:
325                    return symbolAccessibilityResult.errorModuleName ?
326                        symbolAccessibilityResult.accessibility === SymbolAccessibility.CannotBeNamed ?
327                            Diagnostics.Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
328                            Diagnostics.Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_private_module_2 :
329                        Diagnostics.Parameter_0_of_constructor_from_exported_class_has_or_is_using_private_name_1;
330
331                case SyntaxKind.ConstructSignature:
332                case SyntaxKind.ConstructorType:
333                    // Interfaces cannot have parameter types that cannot be named
334                    return symbolAccessibilityResult.errorModuleName ?
335                        Diagnostics.Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2 :
336                        Diagnostics.Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1;
337
338                case SyntaxKind.CallSignature:
339                    // Interfaces cannot have parameter types that cannot be named
340                    return symbolAccessibilityResult.errorModuleName ?
341                        Diagnostics.Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2 :
342                        Diagnostics.Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1;
343
344                case SyntaxKind.IndexSignature:
345                    // Interfaces cannot have parameter types that cannot be named
346                    return symbolAccessibilityResult.errorModuleName ?
347                        Diagnostics.Parameter_0_of_index_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2 :
348                        Diagnostics.Parameter_0_of_index_signature_from_exported_interface_has_or_is_using_private_name_1;
349
350                case SyntaxKind.MethodDeclaration:
351                case SyntaxKind.MethodSignature:
352                    if (hasSyntacticModifier(node.parent, ModifierFlags.Static)) {
353                        return symbolAccessibilityResult.errorModuleName ?
354                            symbolAccessibilityResult.accessibility === SymbolAccessibility.CannotBeNamed ?
355                                Diagnostics.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
356                                Diagnostics.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_private_module_2 :
357                            Diagnostics.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1;
358                    }
359                    else if (node.parent.parent.kind === SyntaxKind.ClassDeclaration) {
360                        return symbolAccessibilityResult.errorModuleName ?
361                            symbolAccessibilityResult.accessibility === SymbolAccessibility.CannotBeNamed ?
362                                Diagnostics.Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
363                                Diagnostics.Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_private_module_2 :
364                            Diagnostics.Parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1;
365                    }
366                    else {
367                        // Interfaces cannot have parameter types that cannot be named
368                        return symbolAccessibilityResult.errorModuleName ?
369                            Diagnostics.Parameter_0_of_method_from_exported_interface_has_or_is_using_name_1_from_private_module_2 :
370                            Diagnostics.Parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1;
371                    }
372
373                case SyntaxKind.FunctionDeclaration:
374                case SyntaxKind.FunctionType:
375                    return symbolAccessibilityResult.errorModuleName ?
376                        symbolAccessibilityResult.accessibility === SymbolAccessibility.CannotBeNamed ?
377                            Diagnostics.Parameter_0_of_exported_function_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
378                            Diagnostics.Parameter_0_of_exported_function_has_or_is_using_name_1_from_private_module_2 :
379                        Diagnostics.Parameter_0_of_exported_function_has_or_is_using_private_name_1;
380                case SyntaxKind.SetAccessor:
381                case SyntaxKind.GetAccessor:
382                    return symbolAccessibilityResult.errorModuleName ?
383                        symbolAccessibilityResult.accessibility === SymbolAccessibility.CannotBeNamed ?
384                            Diagnostics.Parameter_0_of_accessor_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
385                            Diagnostics.Parameter_0_of_accessor_has_or_is_using_name_1_from_private_module_2 :
386                        Diagnostics.Parameter_0_of_accessor_has_or_is_using_private_name_1;
387
388                default:
389                    return Debug.fail(`Unknown parent for parameter: ${(ts as any).SyntaxKind[node.parent.kind]}`);
390            }
391        }
392
393        function getTypeParameterConstraintVisibilityError(): SymbolAccessibilityDiagnostic {
394            // Type parameter constraints are named by user so we should always be able to name it
395            let diagnosticMessage: DiagnosticMessage;
396            switch (node.parent.kind) {
397                case SyntaxKind.ClassDeclaration:
398                    diagnosticMessage = Diagnostics.Type_parameter_0_of_exported_class_has_or_is_using_private_name_1;
399                    break;
400
401                case SyntaxKind.InterfaceDeclaration:
402                    diagnosticMessage = Diagnostics.Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1;
403                    break;
404
405                case SyntaxKind.MappedType:
406                    diagnosticMessage = Diagnostics.Type_parameter_0_of_exported_mapped_object_type_is_using_private_name_1;
407                    break;
408
409                case SyntaxKind.ConstructorType:
410                case SyntaxKind.ConstructSignature:
411                    diagnosticMessage = Diagnostics.Type_parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1;
412                    break;
413
414                case SyntaxKind.CallSignature:
415                    diagnosticMessage = Diagnostics.Type_parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1;
416                    break;
417
418                case SyntaxKind.MethodDeclaration:
419                case SyntaxKind.MethodSignature:
420                    if (hasSyntacticModifier(node.parent, ModifierFlags.Static)) {
421                        diagnosticMessage = Diagnostics.Type_parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1;
422                    }
423                    else if (node.parent.parent.kind === SyntaxKind.ClassDeclaration) {
424                        diagnosticMessage = Diagnostics.Type_parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1;
425                    }
426                    else {
427                        diagnosticMessage = Diagnostics.Type_parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1;
428                    }
429                    break;
430
431                case SyntaxKind.FunctionType:
432                case SyntaxKind.FunctionDeclaration:
433                    diagnosticMessage = Diagnostics.Type_parameter_0_of_exported_function_has_or_is_using_private_name_1;
434                    break;
435
436                case SyntaxKind.TypeAliasDeclaration:
437                    diagnosticMessage = Diagnostics.Type_parameter_0_of_exported_type_alias_has_or_is_using_private_name_1;
438                    break;
439
440                default:
441                    return Debug.fail("This is unknown parent for type parameter: " + node.parent.kind);
442            }
443
444            return {
445                diagnosticMessage,
446                errorNode: node,
447                typeName: (node as NamedDeclaration).name
448            };
449        }
450
451        function getHeritageClauseVisibilityError(): SymbolAccessibilityDiagnostic {
452            let diagnosticMessage: DiagnosticMessage;
453            // Heritage clause is written by user so it can always be named
454            if (isClassDeclaration(node.parent.parent)) {
455                // Class or Interface implemented/extended is inaccessible
456                diagnosticMessage = isHeritageClause(node.parent) && node.parent.token === SyntaxKind.ImplementsKeyword ?
457                    Diagnostics.Implements_clause_of_exported_class_0_has_or_is_using_private_name_1 :
458                        node.parent.parent.name ? Diagnostics.extends_clause_of_exported_class_0_has_or_is_using_private_name_1 :
459                            Diagnostics.extends_clause_of_exported_class_has_or_is_using_private_name_0;
460            }
461            else {
462                // interface is inaccessible
463                diagnosticMessage = Diagnostics.extends_clause_of_exported_interface_0_has_or_is_using_private_name_1;
464            }
465
466            return {
467                diagnosticMessage,
468                errorNode: node,
469                typeName: getNameOfDeclaration(node.parent.parent as Declaration)
470            };
471        }
472
473        function getImportEntityNameVisibilityError(): SymbolAccessibilityDiagnostic {
474            return {
475                diagnosticMessage: Diagnostics.Import_declaration_0_is_using_private_name_1,
476                errorNode: node,
477                typeName: (node as NamedDeclaration).name
478            };
479        }
480
481        function getTypeAliasDeclarationVisibilityError(symbolAccessibilityResult: SymbolAccessibilityResult): SymbolAccessibilityDiagnostic {
482            return {
483                diagnosticMessage: symbolAccessibilityResult.errorModuleName
484                    ? Diagnostics.Exported_type_alias_0_has_or_is_using_private_name_1_from_module_2
485                    : Diagnostics.Exported_type_alias_0_has_or_is_using_private_name_1,
486                errorNode: isJSDocTypeAlias(node) ? Debug.checkDefined(node.typeExpression) : (node as TypeAliasDeclaration).type,
487                typeName: isJSDocTypeAlias(node) ? getNameOfDeclaration(node) : (node as TypeAliasDeclaration).name,
488            };
489        }
490    }
491}
492