2 * Copyright (c) 2018, Facebook, Inc.
5 * This source code is licensed under the MIT license found in the
6 * LICENSE file in the "hack" directory of this source tree.
13 module GenErr
(M
: Errors.Error_category
) = struct
14 let generate_errors buffer name
=
15 add_string buffer
@@ sprintf
"%s Errors:\n" name
;
16 for i
= M.min
to M.max
do
17 match M.of_enum i
with
18 | Some err
-> add_string buffer
@@ sprintf
"%s = %d\n" (M.show err
) i
21 add_string buffer
"\n"
24 module P
= GenErr
(Errors.Parsing
)
25 module N
= GenErr
(Errors.Naming
)
26 module NC
= GenErr
(Errors.NastCheck
)
27 module T
= GenErr
(Errors.Typing
)
29 let gen_error_map_content () : string =
30 let buffer = create
4096 in
31 P.generate_errors buffer "Parsing";
32 N.generate_errors buffer "Naming";
33 NC.generate_errors buffer "NastCheck";
34 T.generate_errors buffer "Typing";
38 Please modify the error map below if you have changed the error codes.
41 let%expect_test
"error_map" =
42 let map = gen_error_map_content () in
43 Printf.printf
"%s\n" map;
49 UnexpectedEofDEPRECATED
= 1003
50 UnterminatedCommentDEPRECATED
= 1004
51 UnterminatedXhpCommentDEPRECATED
= 1005
52 CallTimePassByReferenceDEPRECATED
= 1006
56 TypeparamAlokDEPRECATED
= 2002
58 PrimitiveInvalidAlias
= 2004
59 CyclicConstraintDEPRECATED
= 2005
60 DidYouMeanNaming
= 2006
61 DifferentScopeDEPRECATED
= 2007
62 DisallowedXhpType
= 2008
63 DoubleInsteadOfFloatDEPRECATED
= 2009
64 DynamicClassDEPRECATED
= 2010
66 ErrorNameAlreadyBound
= 2012
67 ExpectedCollection
= 2013
68 ExpectedVariable
= 2014
69 FdNameAlreadyBound
= 2015
70 GenArrayRecArityDEPRECATED
= 2016
71 GenArrayVaRecArityDEPRECATED
= 2017
72 GenaArityDEPRECATED
= 2018
73 GenericClassVarDEPRECATED
= 2019
76 IllegalClassMeth
= 2022
77 IllegalConstant
= 2023
79 IllegalInstMeth
= 2025
80 IllegalMethCaller
= 2026
82 IntegerInsteadOfIntDEPRECATED
= 2028
83 InvalidReqExtends
= 2029
84 InvalidReqImplements
= 2030
85 LocalConstDEPRECATED
= 2031
87 MethodNameAlreadyBound
= 2033
89 MissingTypehint
= 2035
90 NameAlreadyBound
= 2036
91 NamingTooFewArguments
= 2037
92 NamingTooManyArguments
= 2038
93 PrimitiveToplevel
= 2039
94 RealInsteadOfFloatDEPRECATED
= 2040
95 ShadowedTypeParam
= 2041
97 ThisMustBeReturn
= 2043
99 ThisHintOutsideClass
= 2045
101 TparamWithTparam
= 2047
102 TypedefConstraintDEPRECATED
= 2048
105 UnexpectedArrow
= 2051
106 UnexpectedTypedef
= 2052
107 UsingInternalClass
= 2053
111 NullsafePropertyAccessDEPRECATED
= 2057
113 ShapeTypehintDEPRECATED
= 2059
114 DynamicNewInStrictMode
= 2060
115 InvalidTypeAccessRoot
= 2061
116 DuplicateUserAttribute
= 2062
117 ReturnOnlyTypehint
= 2063
118 UnexpectedTypeArguments
= 2064
119 TooManyTypeArguments
= 2065
120 ClassnameParam
= 2066
121 InvalidInstanceofDEPRECATED
= 2067
122 NameIsReserved
= 2068
123 DollardollarUnused
= 2069
124 IllegalMemberVariableClass
= 2070
125 TooFewTypeArguments
= 2071
126 GotoLabelAlreadyDefined
= 2072
127 GotoLabelUndefined
= 2073
128 GotoLabelDefinedInFinally
= 2074
129 GotoInvokedInFinally
= 2075
130 DynamicClassPropertyNameInStrictModeDEPRECATED
= 2076
131 ThisAsLexicalVariable
= 2077
132 DynamicClassNameInStrictMode
= 2078
133 XhpOptionalRequiredAttr
= 2079
134 XhpRequiredWithDefault
= 2080
135 VariableVariablesDisallowedDEPRECATED
= 2081
136 ArrayTypehintsDisallowed
= 2082
137 ArrayLiteralsDisallowed
= 2083
138 WildcardDisallowed
= 2084
139 AttributeClassNameConflict
= 2085
140 MethodNeedsVisibility
= 2086
141 ReferenceInStrictMode
= 2087
143 DeclareStatementDEPRECATED
= 2089
144 MisplacedRxOfScopeDEPRECATED
= 2090
145 RxOfScopeAndExplicitRxDEPRECATED
= 2091
146 UnsupportedFeatureDEPRECATED
= 2092
147 TraitInterfaceConstructorPromoDEPRECATED
= 2093
148 NonstaticPropertyWithLSB
= 2094
149 ReferenceInAnonUseClauseDEPRECATED
= 2095
150 RxMoveInvalidLocation
= 2096
151 MisplacedMutabilityHint
= 2097
152 MutabilityHintInNonRx
= 2098
153 InvalidReturnMutableHint
= 2099
154 NoTparamsOnTypeConstsDEPRECATED
= 2100
155 PocketUniversesDuplication
= 2101
156 UnsupportedTraitUseAs
= 2102
157 UnsupportedInsteadOf
= 2103
158 InvalidTraitUseAsVisibility
= 2104
159 InvalidFunPointer
= 2105
160 IllegalUseOfDynamicallyCallable
= 2106
161 PocketUniversesNotInClass
= 2107
162 PocketUniversesAtomMissing
= 2108
163 PocketUniversesAtomUnknown
= 2109
167 AbstractWithBody
= 3002
168 AwaitInSyncFunction
= 3003
169 CallBeforeInit
= 3004
170 CaseFallthrough
= 3005
171 ContinueInSwitch
= 3006
172 DangerousMethodNameDEPRECATED
= 3007
173 DefaultFallthrough
= 3008
174 InterfaceWithMemberVariable
= 3009
175 InterfaceWithStaticMemberVariable
= 3010
177 NoConstructParent
= 3012
179 NotAbstractWithoutBody
= 3014
180 NotInitialized
= 3015
181 NotPublicInterface
= 3016
182 RequiresNonClass
= 3017
183 ReturnInFinally
= 3018
185 ToStringReturnsString
= 3020
186 ToStringVisibility
= 3021
188 ToplevelContinue
= 3023
190 IllegalFunctionName
= 3025
191 NotAbstractWithoutTypeconst
= 3026
192 TypeconstDependsOnExternalTparam
= 3027
193 TypeconstAssignedTparamDEPRECATED
= 3028
194 AbstractWithTypeconstDEPRECATED
= 3029
195 ConstructorRequired
= 3030
196 InterfaceWithPartialTypeconst
= 3031
197 MultipleXhpCategory
= 3032
198 OptionalShapeFieldsNotSupportedDEPRECATED
= 3033
199 AwaitNotAllowedDEPRECATED
= 3034
200 AsyncInInterfaceDEPRECATED
= 3035
201 AwaitInCoroutine
= 3036
202 YieldInCoroutine
= 3037
203 SuspendOutsideOfCoroutine
= 3038
204 SuspendInFinally
= 3039
205 BreakContinueNNotSupported
= 3040
206 StaticMemoizedFunction
= 3041
207 InoutParamsOutsideOfSync
= 3042
208 InoutParamsSpecial
= 3043
209 InoutParamsMixByref
= 3044
210 InoutParamsMemoize
= 3045
211 InoutParamsRetByRefDEPRECATED
= 3046
212 ReadingFromAppend
= 3047
213 ConstAttributeProhibitedDEPRECATED
= 3048
214 RetiredError3049DEPRECATED
= 3049
215 InoutArgumentBadExpr
= 3050
216 MutableParamsOutsideOfSyncDEPRECATED
= 3051
217 MutableAsyncMethodDEPRECATED
= 3052
218 MutableMethodsMustBeReactive
= 3053
219 MutableAttributeOnFunction
= 3054
220 MutableReturnAnnotatedDeclsMustBeReactive
= 3055
221 IllegalDestructor
= 3056
222 ConditionallyReactiveFunctionDEPRECATED
= 3057
223 MultipleConditionallyReactiveAnnotations
= 3058
224 ConditionallyReactiveAnnotationInvalidArguments
= 3059
225 MissingReactivityForConditionDEPRECATED
= 3060
226 MultipleReactivityAnnotationsDEPRECATED
= 3061
227 RxIsEnabledInvalidLocation
= 3062
228 MaybeRxInvalidLocation
= 3063
229 NoOnlyrxIfRxfuncForRxIfArgs
= 3064
230 CoroutineInConstructor
= 3065
231 IllegalReturnByRefDEPRECATED
= 3066
232 IllegalByRefExpr
= 3067
233 VariadicByRefParam
= 3068
234 MaybeMutableAttributeOnFunction
= 3069
235 ConflictingMutableAndMaybeMutableAttributes
= 3070
236 MaybeMutableMethodsMustBeReactive
= 3071
237 RequiresFinalClass
= 3072
238 InterfaceUsesTrait
= 3073
239 NonstaticMethodInAbstractFinalClass
= 3074
240 MutableOnStaticDEPRECATED
= 3075
241 ClassnameConstInstanceOfDEPRECATED
= 3076
242 ByRefParamOnConstruct
= 3077
243 ByRefDynamicCall
= 3078
246 SwitchNonTerminalDefault
= 3081
247 SwitchMultipleDefault
= 3082
250 AbstractClassFinalDEPRECATED
= 4001
251 UninstantiableClass
= 4002
252 AnonymousRecursive
= 4003
253 AnonymousRecursiveCall
= 4004
259 ClassArityDEPRECATED
= 4010
261 ConstructorNoArgs
= 4012
262 CyclicClassDef
= 4013
264 DiscardedAwaitable
= 4015
265 IssetEmptyInStrict
= 4016
266 DynamicYieldPrivateDEPRECATED
= 4017
267 EnumConstantTypeBad
= 4018
268 EnumSwitchNonexhaustive
= 4019
269 EnumSwitchNotConst
= 4020
270 EnumSwitchRedundant
= 4021
271 EnumSwitchRedundantDefault
= 4022
272 EnumSwitchWrongClass
= 4023
274 EnumTypeTypedefMixedDEPRECATED
= 4025
276 ExpectedLiteralFormatString
= 4027
277 ExpectedStaticIntDEPRECATED
= 4028
278 ExpectedTparam
= 4029
279 ExpectingReturnTypeHint
= 4030
280 ExpectingReturnTypeHintSuggestDEPRECATED
= 4031
281 ExpectingTypeHint
= 4032
282 ExpectingTypeHintVariadic
= 4033
283 RetiredError4034DEPRECATED
= 4034
286 FieldMissingDEPRECATED
= 4037
288 FunArityMismatch
= 4039
290 FunTooManyArgs
= 4041
291 FunUnexpectedNonvariadic
= 4042
292 FunVariadicityHhVsPhp56
= 4043
293 GenaExpectsArrayDEPRECATED
= 4044
294 GenericArrayStrict
= 4045
296 ImplementAbstract
= 4047
297 InterfaceFinalDEPRECATED
= 4048
298 InvalidShapeFieldConst
= 4049
299 InvalidShapeFieldLiteral
= 4050
300 InvalidShapeFieldName
= 4051
301 InvalidShapeFieldType
= 4052
302 MemberNotFound
= 4053
303 MemberNotImplemented
= 4054
305 MissingConstructor
= 4056
307 NegativeTupleIndexDEPRECATED
= 4058
308 SelfOutsideClass
= 4059
309 NewStaticInconsistent
= 4060
310 StaticOutsideClass
= 4061
311 NonObjectMember
= 4062
314 NullableParameterDEPRECATED
= 4065
315 OptionReturnOnlyTypehint
= 4066
318 OverflowDEPRECATED
= 4069
320 OverridePerTrait
= 4071
321 PairArityDEPRECATED
= 4072
324 ParentOutsideClass
= 4075
325 ParentUndefined
= 4076
326 PreviousDefault
= 4077
327 PrivateClassMeth
= 4078
328 PrivateInstMeth
= 4079
329 PrivateOverride
= 4080
330 ProtectedClassMeth
= 4081
331 ProtectedInstMeth
= 4082
332 ReadBeforeWrite
= 4083
334 ShapeFieldClassMismatch
= 4085
335 ShapeFieldTypeMismatch
= 4086
336 ShouldBeOverride
= 4087
337 SketchyNullCheckDEPRECATED
= 4088
338 SketchyNullCheckPrimitiveDEPRECATED
= 4089
339 SmemberNotFound
= 4090
341 StaticOverflowDEPRECATED
= 4092
342 RetiredError4093DEPRECATED
= 4093
343 ThisInStaticDEPRECATED
= 4094
344 ThisVarOutsideClass
= 4095
345 TraitFinalDEPRECATED
= 4096
346 TupleArityDEPRECATED
= 4097
347 TupleArityMismatchDEPRECATED
= 4098
348 TupleIndexTooLargeDEPRECATED
= 4099
350 TypeArityMismatch
= 4101
351 TypeParamArityDEPRECATED
= 4102
352 RetiredError4103DEPRECATED
= 4103
353 TypingTooFewArgs
= 4104
354 TypingTooManyArgs
= 4105
356 UnboundNameTyping
= 4107
357 UndefinedField
= 4108
358 UndefinedParent
= 4109
360 UnsatisfiedReq
= 4111
362 VisibilityExtends
= 4113
363 VoidParameterDEPRECATED
= 4114
364 WrongExtendKind
= 4115
366 NullsafeNotNeeded
= 4117
367 TrivialStrictEq
= 4118
369 DeclaredCovariant
= 4120
370 DeclaredContravariant
= 4121
371 UnsetInStrictDEPRECATED
= 4122
372 StrictMembersNotKnown
= 4123
373 ErasedGenericAtRuntime
= 4124
374 DynamicClassDEPRECATED
= 4125
375 AttributeTooManyArguments
= 4126
376 AttributeParamType
= 4127
378 AbstractConstUsage
= 4129
379 CannotDeclareConstant
= 4130
380 CyclicTypeconst
= 4131
381 NullsafePropertyWriteContext
= 4132
383 ThisLvalueDEPRECATED
= 4134
384 UnsetNonidxInStrict
= 4135
385 InvalidShapeFieldNameEmpty
= 4136
386 InvalidShapeFieldNameNumberDEPRECATED
= 4137
387 ShapeFieldsUnknown
= 4138
388 InvalidShapeRemoveKey
= 4139
389 MissingOptionalFieldDEPRECATED
= 4140
390 ShapeFieldUnset
= 4141
391 AbstractConcreteOverride
= 4142
392 LocalVariableModifedAndUsed
= 4143
393 LocalVariableModifedTwice
= 4144
394 AssignDuringCase
= 4145
395 CyclicEnumConstraint
= 4146
396 UnpackingDisallowed
= 4147
397 InvalidClassname
= 4148
398 InvalidMemoizedParam
= 4149
399 IllegalTypeStructure
= 4150
400 NotNullableCompareNullTrivial
= 4151
401 ClassPropertyOnlyStaticLiteralDEPRECATED
= 4152
402 AttributeTooFewArguments
= 4153
403 ReferenceExprDEPRECATED
= 4154
404 UnificationCycle
= 4155
406 EqIncompatibleTypes
= 4157
407 ContravariantThis
= 4158
408 InstanceofAlwaysFalseDEPRECATED
= 4159
409 InstanceofAlwaysTrueDEPRECATED
= 4160
410 AmbiguousMember
= 4161
411 InstanceofGenericClassnameDEPRECATED
= 4162
412 RequiredFieldIsOptional
= 4163
414 ArrayGetWithOptionalField
= 4165
415 UnknownFieldDisallowedInShape
= 4166
417 PassByRefAnnotationMissing
= 4168
418 NonCallArgumentInSuspend
= 4169
419 NonCoroutineCallInSuspend
= 4170
420 CoroutineCallOutsideOfSuspend
= 4171
421 FunctionIsNotCoroutine
= 4172
422 CoroutinnessMismatch
= 4173
423 ExpectingAwaitableReturnTypeHint
= 4174
424 ReffinessInvariant
= 4175
425 DollardollarLvalue
= 4176
426 StaticMethodOnInterfaceDEPRECATED
= 4177
427 DuplicateUsingVar
= 4178
428 IllegalDisposable
= 4179
429 EscapingDisposable
= 4180
430 PassByRefAnnotationUnexpected
= 4181
431 InoutAnnotationMissing
= 4182
432 InoutAnnotationUnexpected
= 4183
433 InoutnessMismatch
= 4184
434 StaticSyntheticMethod
= 4185
436 InvalidNewDisposable
= 4187
437 EscapingDisposableParameter
= 4188
438 AcceptDisposableInvariant
= 4189
439 InvalidDisposableHint
= 4190
442 IllegalXhpChild
= 4193
443 MustExtendDisposable
= 4194
444 InvalidIsAsExpressionHint
= 4195
445 AssigningToConst
= 4196
446 SelfConstParentNot
= 4197
447 ParentConstSelfNotDEPRECATED
= 4198
448 PartiallyValidIsAsExpressionHintDEPRECATED
= 4199
449 NonreactiveFunctionCall
= 4200
450 NonreactiveIndexing
= 4201
451 ObjSetReactive
= 4202
452 FunReactivityMismatch
= 4203
453 OverridingPropConstMismatch
= 4204
454 InvalidReturnDisposable
= 4205
455 InvalidDisposableReturnHint
= 4206
456 ReturnDisposableMismatch
= 4207
457 InoutArgumentBadType
= 4208
458 InconsistentUnsetDEPRECATED
= 4209
459 ReassignMutableVar
= 4210
460 InvalidFreezeTarget
= 4211
461 InvalidFreezeUse
= 4212
462 FreezeInNonreactiveContext
= 4213
463 MutableCallOnImmutable
= 4214
464 MutableArgumentMismatch
= 4215
465 InvalidMutableReturnResult
= 4216
466 MutableReturnResultMismatch
= 4217
467 NonreactiveCallFromShallow
= 4218
468 EnumTypeTypedefNonnull
= 4219
469 RxEnabledInNonRxContext
= 4220
470 RxEnabledInLambdasDEPRECATED
= 4221
471 AmbiguousLambda
= 4222
472 EllipsisStrictMode
= 4223
473 UntypedLambdaStrictMode
= 4224
474 BindingRefInArray
= 4225
475 EchoInReactiveContext
= 4226
476 SuperglobalInReactiveContext
= 4227
477 StaticPropertyInReactiveContext
= 4228
478 StaticInReactiveContextDEPRECATED
= 4229
479 GlobalInReactiveContextDEPRECATED
= 4230
480 WrongExpressionKindAttribute
= 4231
481 AttributeClassNoConstructorArgsDEPRECATED
= 4232
482 InvalidTypeForOnlyrxIfRxfuncParameter
= 4233
483 MissingAnnotationForOnlyrxIfRxfuncParameter
= 4234
484 CannotReturnBorrowedValueAsImmutable
= 4235
485 DeclOverrideMissingHint
= 4236
486 InvalidConditionallyReactiveCall
= 4237
488 SealedFinalDEPRECATED
= 4239
489 ComparisonInvalidTypes
= 4240
490 OptionVoidDEPRECATED
= 4241
491 MutableInNonreactiveContext
= 4242
492 InvalidArgumentOfRxMutableFunction
= 4243
493 LetVarImmutabilityViolation
= 4244
494 UnsealableDEPRECATED
= 4245
495 ReturnVoidToRxMismatch
= 4246
496 ReturnsVoidToRxAsNonExpressionStatement
= 4247
497 NonawaitedAwaitableInReactiveContext
= 4248
498 ShapesKeyExistsAlwaysTrue
= 4249
499 ShapesKeyExistsAlwaysFalse
= 4250
500 ShapesMethodAccessWithNonExistentField
= 4251
501 NonClassMember
= 4252
502 PassingArrayCellByRef
= 4253
503 CallSiteReactivityMismatch
= 4254
504 RxParameterConditionMismatch
= 4255
505 AmbiguousObjectAccess
= 4256
507 ReassignMaybeMutableVar
= 4258
508 MaybeMutableArgumentMismatch
= 4259
509 ImmutableArgumentMismatch
= 4260
510 ImmutableCallOnMutable
= 4261
511 InvalidCallMaybeMutable
= 4262
512 MutabilityMismatch
= 4263
513 InvalidPPLCall
= 4264
514 InvalidPPLStaticCall
= 4265
515 TypeTestInLambdaDEPRECATED
= 4266
516 InvalidTraversableInRx
= 4267
517 ReassignMutableThis
= 4268
518 MutableExpressionAsMultipleMutableArguments
= 4269
519 InvalidUnsetTargetInRx
= 4270
520 CoroutineOutsideExperimental
= 4271
521 PPLMethPointer
= 4272
522 InvalidTruthinessTestDEPRECATED
= 4273
523 RePrefixedNonString
= 4274
524 BadRegexPattern
= 4275
525 SketchyTruthinessTestDEPRECATED
= 4276
526 LateInitWithDefault
= 4277
527 OverrideMemoizeLSB
= 4278
528 ClassVarTypeGenericParam
= 4279
529 InvalidSwitchCaseValueType
= 4280
531 BadLateInitOverride
= 4282
532 EscapingMutableObject
= 4283
534 MultipleConcreteDefs
= 4285
535 MoveInNonreactiveContext
= 4286
536 InvalidMoveUse
= 4287
537 InvalidMoveTarget
= 4288
538 IgnoredResultOfFreezeDEPRECATED
= 4289
539 IgnoredResultOfMoveDEPRECATED
= 4290
541 UnserializableType
= 4292
542 InconsistentMutability
= 4293
543 InvalidMutabilityFlavorInAssignment
= 4294
545 UnknownObjectMember
= 4296
547 InvalidArrayKey
= 4298
548 ReferenceExprNotFunctionArg
= 4299
549 RedundantRxCondition
= 4300
550 RedeclaringMissingMethod
= 4301
551 InvalidEnforceableTypeArgument
= 4302
552 RequireArgsReify
= 4303
553 TypecheckerTimeout
= 4304
554 InvalidReifiedArgument
= 4305
555 GenericsNotAllowed
= 4306
556 InvalidNewableTypeArgument
= 4307
557 InvalidNewableTypeParamConstraints
= 4308
558 NewWithoutNewable
= 4309
559 NewStaticClassReified
= 4310
560 MemoizeReified
= 4311
561 ConsistentConstructReified
= 4312
562 MethodVariance
= 4313
563 MissingXhpRequiredAttr
= 4314
564 BadXhpAttrRequiredOverride
= 4315
565 ReifiedTparamVariadicDEPRECATED
= 4316
566 UnresolvedTypeVariable
= 4317
567 InvalidSubString
= 4318
568 InvalidArrayKeyConstraint
= 4319
569 OverrideNoDefaultTypeconst
= 4320
570 ShapeAccessWithNonExistentField
= 4321
571 DisallowPHPArraysAttr
= 4322
572 TypeConstraintViolation
= 4323
573 IndexTypeMismatch
= 4324
574 ExpectedStringlike
= 4325
575 TypeConstantMismatch
= 4326
576 TypeConstantRedeclarationDEPRECATED
= 4327
577 ConstantDoesNotMatchEnumType
= 4328
578 EnumConstraintMustBeArraykey
= 4329
579 EnumSubtypeMustHaveCompatibleConstraint
= 4330
580 ParameterDefaultValueWrongType
= 4331
581 NewtypeAliasMustSatisfyConstraint
= 4332
582 BadFunctionTypevar
= 4333
583 BadClassTypevar
= 4334
584 BadMethodTypevar
= 4335
585 MissingReturnInNonVoidFunction
= 4336
586 InoutReturnTypeMismatch
= 4337
587 ClassConstantValueDoesNotMatchHint
= 4338
588 ClassPropertyInitializerTypeDoesNotMatchHint
= 4339
589 BadDeclOverride
= 4340
590 BadMethodOverride
= 4341
591 BadEnumExtends
= 4342
592 XhpAttributeValueDoesNotMatchHint
= 4343
593 TraitPropConstClass
= 4344
594 EnumUnderlyingTypeMustBeArraykey
= 4345
595 ClassGetReified
= 4346
596 RequireGenericExplicit
= 4347
597 ClassConstantTypeMismatch
= 4348
598 PocketUniversesExpansion
= 4349
599 PocketUniversesTyping
= 4350
600 RecordInitValueDoesNotMatchHint
= 4351