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