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