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