-
Notifications
You must be signed in to change notification settings - Fork 359
/
Issue.php
5694 lines (5600 loc) · 252 KB
/
Issue.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?php
declare(strict_types=1);
namespace Phan;
use AssertionError;
use InvalidArgumentException;
use Phan\Language\Context;
use Phan\Language\Element\TypedElement;
use Phan\Language\Element\UnaddressableTypedElement;
use Phan\Language\FQSEN;
use Phan\Language\Type;
use Phan\Language\UnionType;
use Phan\Library\ConversionSpec;
use Phan\Plugin\ConfigPluginSet;
/**
* An issue emitted during analysis.
* @phan-file-suppress PhanPluginDescriptionlessCommentOnPublicMethod
* @SuppressWarnings(PHPMD.ConstantNamingConventions) these constant names are deliberately used to match the values
* @phan-pure
*/
class Issue
{
// phpcs:disable Generic.NamingConventions.UpperCaseConstantName.ClassConstantNotUpperCase
// this is deliberate for issue names
// Issue::CATEGORY_SYNTAX
public const SyntaxError = 'PhanSyntaxError';
public const InvalidConstantExpression = 'PhanInvalidConstantExpression';
public const InvalidNode = 'PhanInvalidNode';
public const InvalidWriteToTemporaryExpression = 'PhanInvalidWriteToTemporaryExpression';
public const InvalidTraitUse = 'PhanInvalidTraitUse';
public const ContinueTargetingSwitch = 'PhanContinueTargetingSwitch';
public const ContinueOrBreakNotInLoop = 'PhanContinueOrBreakNotInLoop';
public const ContinueOrBreakTooManyLevels = 'PhanContinueOrBreakTooManyLevels';
public const SyntaxCompileWarning = 'PhanSyntaxCompileWarning';
public const SyntaxEmptyListArrayDestructuring = 'PhanSyntaxEmptyListArrayDestructuring';
public const SyntaxMixedKeyNoKeyArrayDestructuring = 'PhanSyntaxMixedKeyNoKeyArrayDestructuring';
public const SyntaxReturnExpectedValue = 'PhanSyntaxReturnExpectedValue';
public const SyntaxReturnValueInVoid = 'PhanSyntaxReturnValueInVoid';
// Issue::CATEGORY_UNDEFINED
public const AmbiguousTraitAliasSource = 'PhanAmbiguousTraitAliasSource';
public const ClassContainsAbstractMethodInternal = 'PhanClassContainsAbstractMethodInternal';
public const ClassContainsAbstractMethod = 'PhanClassContainsAbstractMethod';
public const EmptyFile = 'PhanEmptyFile';
public const MissingRequireFile = 'PhanMissingRequireFile';
public const InvalidRequireFile = 'PhanInvalidRequireFile';
public const ParentlessClass = 'PhanParentlessClass';
public const RequiredTraitNotAdded = 'PhanRequiredTraitNotAdded';
public const TraitParentReference = 'PhanTraitParentReference';
public const UndeclaredAliasedMethodOfTrait = 'PhanUndeclaredAliasedMethodOfTrait';
public const UndeclaredClass = 'PhanUndeclaredClass';
public const UndeclaredClassAliasOriginal = 'PhanUndeclaredClassAliasOriginal';
public const UndeclaredClassCatch = 'PhanUndeclaredClassCatch';
public const UndeclaredClassConstant = 'PhanUndeclaredClassConstant';
public const UndeclaredClassInstanceof = 'PhanUndeclaredClassInstanceof';
public const UndeclaredClassMethod = 'PhanUndeclaredClassMethod';
public const UndeclaredClassProperty = 'PhanUndeclaredClassProperty';
public const UndeclaredClassReference = 'PhanUndeclaredClassReference';
public const UndeclaredClassStaticProperty = 'PhanUndeclaredClassStaticProperty';
public const UndeclaredClosureScope = 'PhanUndeclaredClosureScope';
public const UndeclaredConstant = 'PhanUndeclaredConstant';
// Sadly, PhanUndeclaredClassConstant already exists and means the class is undeclared
public const UndeclaredConstantOfClass = 'PhanUndeclaredConstantOfClass';
public const UndeclaredMagicConstant = 'PhanUndeclaredMagicConstant';
public const UndeclaredExtendedClass = 'PhanUndeclaredExtendedClass';
public const UndeclaredFunction = 'PhanUndeclaredFunction';
public const UndeclaredInterface = 'PhanUndeclaredInterface';
public const UndeclaredMethod = 'PhanUndeclaredMethod';
public const PossiblyUndeclaredMethod = 'PhanPossiblyUndeclaredMethod';
public const UndeclaredProperty = 'PhanUndeclaredProperty';
public const PossiblyUndeclaredProperty = 'PhanPossiblyUndeclaredProperty';
public const UndeclaredStaticMethod = 'PhanUndeclaredStaticMethod';
public const UndeclaredStaticProperty = 'PhanUndeclaredStaticProperty';
public const UndeclaredTrait = 'PhanUndeclaredTrait';
public const UndeclaredTypeParameter = 'PhanUndeclaredTypeParameter';
public const UndeclaredTypeReturnType = 'PhanUndeclaredTypeReturnType';
public const UndeclaredTypeProperty = 'PhanUndeclaredTypeProperty';
public const UndeclaredTypeClassConstant = 'PhanUndeclaredTypeClassConstant';
public const UndeclaredTypeThrowsType = 'PhanUndeclaredTypeThrowsType';
public const UndeclaredVariable = 'PhanUndeclaredVariable';
public const PossiblyUndeclaredVariable = 'PhanPossiblyUndeclaredVariable';
public const UndeclaredGlobalVariable = 'PhanUndeclaredGlobalVariable';
public const PossiblyUndeclaredGlobalVariable = 'PhanPossiblyUndeclaredGlobalVariable';
public const UndeclaredThis = 'PhanUndeclaredThis';
public const UndeclaredVariableDim = 'PhanUndeclaredVariableDim';
public const UndeclaredVariableAssignOp = 'PhanUndeclaredVariableAssignOp';
public const UndeclaredClassInCallable = 'PhanUndeclaredClassInCallable';
public const UndeclaredStaticMethodInCallable = 'PhanUndeclaredStaticMethodInCallable';
public const UndeclaredFunctionInCallable = 'PhanUndeclaredFunctionInCallable';
public const UndeclaredMethodInCallable = 'PhanUndeclaredMethodInCallable';
public const UndeclaredInvokeInCallable = 'PhanUndeclaredInvokeInCallable';
public const EmptyFQSENInCallable = 'PhanEmptyFQSENInCallable';
public const InvalidFQSENInCallable = 'PhanInvalidFQSENInCallable';
public const EmptyFQSENInClasslike = 'PhanEmptyFQSENInClasslike';
public const InvalidFQSENInClasslike = 'PhanInvalidFQSENInClasslike';
public const PossiblyUnsetPropertyOfThis = 'PhanPossiblyUnsetPropertyOfThis';
// Issue::CATEGORY_TYPE
public const NonClassMethodCall = 'PhanNonClassMethodCall';
public const PossiblyNonClassMethodCall = 'PhanPossiblyNonClassMethodCall';
public const TypeArrayOperator = 'PhanTypeArrayOperator';
public const TypeInvalidBitwiseBinaryOperator = 'PhanTypeInvalidBitwiseBinaryOperator';
public const TypeMismatchBitwiseBinaryOperands = 'PhanTypeMismatchBitwiseBinaryOperands';
public const TypeArraySuspicious = 'PhanTypeArraySuspicious';
public const TypeArrayUnsetSuspicious = 'PhanTypeArrayUnsetSuspicious';
public const TypeArraySuspiciousNullable = 'PhanTypeArraySuspiciousNullable';
public const TypeArraySuspiciousNull = 'PhanTypeArraySuspiciousNull';
public const TypeSuspiciousIndirectVariable = 'PhanTypeSuspiciousIndirectVariable';
public const TypeObjectUnsetDeclaredProperty = 'PhanTypeObjectUnsetDeclaredProperty';
public const TypeComparisonFromArray = 'PhanTypeComparisonFromArray';
public const TypeComparisonToArray = 'PhanTypeComparisonToArray';
public const TypeConversionFromArray = 'PhanTypeConversionFromArray';
public const TypeInstantiateAbstract = 'PhanTypeInstantiateAbstract';
public const TypeInstantiateAbstractStatic = 'PhanTypeInstantiateAbstractStatic';
public const TypeInstantiateInterface = 'PhanTypeInstantiateInterface';
public const TypeInstantiateTrait = 'PhanTypeInstantiateTrait';
public const TypeInstantiateTraitStaticOrSelf = 'PhanTypeInstantiateTraitStaticOrSelf';
public const TypeInvalidCloneNotObject = 'PhanTypeInvalidCloneNotObject';
public const TypePossiblyInvalidCloneNotObject = 'PhanTypePossiblyInvalidCloneNotObject';
public const TypeInvalidClosureScope = 'PhanTypeInvalidClosureScope';
public const TypeInvalidLeftOperand = 'PhanTypeInvalidLeftOperand';
public const TypeInvalidRightOperand = 'PhanTypeInvalidRightOperand';
public const TypeInvalidLeftOperandOfAdd = 'PhanTypeInvalidLeftOperandOfAdd';
public const TypeInvalidRightOperandOfAdd = 'PhanTypeInvalidRightOperandOfAdd';
public const TypeInvalidLeftOperandOfNumericOp = 'PhanTypeInvalidLeftOperandOfNumericOp';
public const TypeInvalidRightOperandOfNumericOp = 'PhanTypeInvalidRightOperandOfNumericOp';
public const TypeInvalidLeftOperandOfIntegerOp = 'PhanTypeInvalidLeftOperandOfIntegerOp';
public const TypeInvalidRightOperandOfIntegerOp = 'PhanTypeInvalidRightOperandOfIntegerOp';
public const TypeInvalidLeftOperandOfBitwiseOp = 'PhanTypeInvalidLeftOperandOfBitwiseOp';
public const TypeInvalidRightOperandOfBitwiseOp = 'PhanTypeInvalidRightOperandOfBitwiseOp';
public const TypeInvalidUnaryOperandNumeric = 'PhanTypeInvalidUnaryOperandNumeric';
public const TypeInvalidUnaryOperandBitwiseNot = 'PhanTypeInvalidUnaryOperandBitwiseNot';
public const TypeInvalidUnaryOperandIncOrDec = 'PhanTypeInvalidUnaryOperandIncOrDec';
public const TypeInvalidInstanceof = 'PhanTypeInvalidInstanceof';
public const TypeInvalidDimOffset = 'PhanTypeInvalidDimOffset';
public const TypeInvalidDimOffsetArrayDestructuring = 'PhanTypeInvalidDimOffsetArrayDestructuring';
public const TypePossiblyInvalidDimOffset = 'PhanTypePossiblyInvalidDimOffset';
public const TypeInvalidCallExpressionAssignment = 'PhanTypeInvalidCallExpressionAssignment';
public const TypeInvalidExpressionArrayDestructuring = 'PhanTypeInvalidExpressionArrayDestructuring';
public const TypeInvalidThrowsNonObject = 'PhanTypeInvalidThrowsNonObject';
public const TypeInvalidThrowsNonThrowable = 'PhanTypeInvalidThrowsNonThrowable';
public const TypeInvalidThrowStatementNonThrowable = 'PhanTypeInvalidThrowStatementNonThrowable';
public const TypeInvalidThrowsIsTrait = 'PhanTypeInvalidThrowsIsTrait';
public const TypeInvalidThrowsIsInterface = 'PhanTypeInvalidThrowsIsInterface';
public const TypeMagicVoidWithReturn = 'PhanTypeMagicVoidWithReturn';
public const TypeMismatchArgument = 'PhanTypeMismatchArgument';
public const TypeMismatchArgumentProbablyReal = 'PhanTypeMismatchArgumentProbablyReal';
public const TypeMismatchArgumentReal = 'PhanTypeMismatchArgumentReal';
public const TypeMismatchArgumentNullable = 'PhanTypeMismatchArgumentNullable';
public const TypeMismatchArgumentInternal = 'PhanTypeMismatchArgumentInternal';
public const TypeMismatchArgumentInternalProbablyReal = 'PhanTypeMismatchArgumentInternalProbablyReal';
public const TypeMismatchArgumentInternalReal = 'PhanTypeMismatchArgumentInternalReal';
public const TypeMismatchArgumentNullableInternal = 'PhanTypeMismatchArgumentNullableInternal';
public const PartialTypeMismatchArgument = 'PhanPartialTypeMismatchArgument';
public const PartialTypeMismatchArgumentInternal = 'PhanPartialTypeMismatchArgumentInternal';
public const PossiblyNullTypeArgument = 'PhanPossiblyNullTypeArgument';
public const PossiblyNullTypeArgumentInternal = 'PhanPossiblyNullTypeArgumentInternal';
public const PossiblyFalseTypeArgument = 'PhanPossiblyFalseTypeArgument';
public const PossiblyFalseTypeArgumentInternal = 'PhanPossiblyFalseTypeArgumentInternal';
public const TypeMismatchDefault = 'PhanTypeMismatchDefault';
public const TypeMismatchDimAssignment = 'PhanTypeMismatchDimAssignment';
public const TypeMismatchDimEmpty = 'PhanTypeMismatchDimEmpty';
public const TypeMismatchDimFetch = 'PhanTypeMismatchDimFetch';
public const TypeMismatchDimFetchNullable = 'PhanTypeMismatchDimFetchNullable';
public const TypeMismatchUnpackKey = 'PhanTypeMismatchUnpackKey';
public const TypeMismatchUnpackKeyArraySpread = 'PhanTypeMismatchUnpackKeyArraySpread';
public const TypeMismatchUnpackValue = 'PhanTypeMismatchUnpackValue';
public const TypeMismatchArrayDestructuringKey = 'PhanTypeMismatchArrayDestructuringKey';
public const TypeMismatchVariadicComment = 'PhanMismatchVariadicComment';
public const TypeMismatchVariadicParam = 'PhanMismatchVariadicParam';
public const TypeMismatchForeach = 'PhanTypeMismatchForeach';
public const TypeNoAccessiblePropertiesForeach = 'PhanTypeNoAccessiblePropertiesForeach';
public const TypeNoPropertiesForeach = 'PhanTypeNoPropertiesForeach';
public const TypeSuspiciousNonTraversableForeach = 'PhanTypeSuspiciousNonTraversableForeach';
public const TypeMismatchProperty = 'PhanTypeMismatchProperty';
public const PossiblyNullTypeMismatchProperty = 'PhanPossiblyNullTypeMismatchProperty';
public const PossiblyFalseTypeMismatchProperty = 'PhanPossiblyFalseTypeMismatchProperty';
public const PartialTypeMismatchProperty = 'PhanPartialTypeMismatchProperty';
public const TypeMismatchReturn = 'PhanTypeMismatchReturn';
public const TypeMismatchReturnNullable = 'PhanTypeMismatchReturnNullable';
public const TypeMismatchReturnProbablyReal = 'PhanTypeMismatchReturnProbablyReal';
public const TypeMismatchReturnReal = 'PhanTypeMismatchReturnReal';
public const PartialTypeMismatchReturn = 'PhanPartialTypeMismatchReturn';
public const PossiblyNullTypeReturn = 'PhanPossiblyNullTypeReturn';
public const PossiblyFalseTypeReturn = 'PhanPossiblyFalseTypeReturn';
public const TypeMismatchDeclaredReturn = 'PhanTypeMismatchDeclaredReturn';
public const TypeMismatchDeclaredReturnNullable = 'PhanTypeMismatchDeclaredReturnNullable';
public const TypeMismatchDeclaredParam = 'PhanTypeMismatchDeclaredParam';
public const TypeMismatchDeclaredParamNullable = 'PhanTypeMismatchDeclaredParamNullable';
public const TypeMissingReturn = 'PhanTypeMissingReturn';
public const TypeMissingReturnReal = 'PhanTypeMissingReturnReal';
public const TypeNonVarPassByRef = 'PhanTypeNonVarPassByRef';
public const TypeNonVarReturnByRef = 'PhanTypeNonVarReturnByRef';
public const TypeParentConstructorCalled = 'PhanTypeParentConstructorCalled';
public const TypeSuspiciousEcho = 'PhanTypeSuspiciousEcho';
public const TypeSuspiciousStringExpression = 'PhanTypeSuspiciousStringExpression';
public const TypeVoidAssignment = 'PhanTypeVoidAssignment';
public const TypeVoidArgument = 'PhanTypeVoidArgument';
public const TypeVoidExpression = 'PhanTypeVoidExpression';
public const TypePossiblyInvalidCallable = 'PhanTypePossiblyInvalidCallable';
public const TypeInvalidCallable = 'PhanTypeInvalidCallable';
public const TypeInvalidCallableArraySize = 'PhanTypeInvalidCallableArraySize';
public const TypeInvalidCallableArrayKey = 'PhanTypeInvalidCallableArrayKey';
public const TypeInvalidCallableObjectOfMethod = 'PhanTypeInvalidCallableObjectOfMethod';
public const TypeExpectedObject = 'PhanTypeExpectedObject';
public const TypeExpectedObjectOrClassName = 'PhanTypeExpectedObjectOrClassName';
public const TypeExpectedObjectPropAccess = 'PhanTypeExpectedObjectPropAccess';
public const TypeExpectedObjectPropAccessButGotNull = 'PhanTypeExpectedObjectPropAccessButGotNull';
public const TypeExpectedObjectStaticPropAccess = 'PhanTypeExpectedObjectStaticPropAccess';
public const TypeMismatchGeneratorYieldValue = 'PhanTypeMismatchGeneratorYieldValue';
public const TypeMismatchGeneratorYieldKey = 'PhanTypeMismatchGeneratorYieldKey';
public const TypeInvalidYieldFrom = 'PhanTypeInvalidYieldFrom';
public const TypeInvalidMethodName = 'PhanTypeInvalidMethodName';
public const TypeInvalidStaticMethodName = 'PhanTypeInvalidStaticMethodName';
public const TypeInvalidCallableMethodName = 'PhanTypeInvalidCallableMethodName';
public const TypeInvalidRequire = 'PhanTypeInvalidRequire';
public const TypeInvalidEval = 'PhanTypeInvalidEval';
public const RelativePathUsed = 'PhanRelativePathUsed';
public const TypeInvalidTraitReturn = 'PhanTypeInvalidTraitReturn';
public const TypeInvalidTraitParam = 'PhanTypeInvalidTraitParam';
public const InfiniteRecursion = 'PhanInfiniteRecursion';
public const PossibleInfiniteRecursionSameParams = 'PhanPossiblyInfiniteRecursionSameParams';
public const TypeComparisonToInvalidClass = 'PhanTypeComparisonToInvalidClass';
public const TypeComparisonToInvalidClassType = 'PhanTypeComparisonToInvalidClassType';
public const TypeInvalidPropertyName = 'PhanTypeInvalidPropertyName';
public const TypeInvalidStaticPropertyName = 'PhanTypeInvalidStaticPropertyName';
public const TypeErrorInInternalCall = 'PhanTypeErrorInInternalCall';
public const TypeErrorInOperation = 'PhanTypeErrorInOperation';
public const TypeMismatchPropertyDefault = 'PhanTypeMismatchPropertyDefault';
public const TypeMismatchPropertyDefaultReal = 'PhanTypeMismatchPropertyDefaultReal';
public const TypeMismatchPropertyProbablyReal = 'PhanTypeMismatchPropertyProbablyReal';
public const TypeMismatchPropertyReal = 'PhanTypeMismatchPropertyReal';
public const TypeMismatchPropertyRealByRef = 'PhanTypeMismatchPropertyRealByRef';
public const TypeMismatchPropertyByRef = 'PhanTypeMismatchPropertyByRef';
public const ImpossibleCondition = 'PhanImpossibleCondition';
public const ImpossibleConditionInLoop = 'PhanImpossibleConditionInLoop';
public const ImpossibleConditionInGlobalScope = 'PhanImpossibleConditionInGlobalScope';
public const RedundantCondition = 'PhanRedundantCondition';
public const RedundantConditionInLoop = 'PhanRedundantConditionInLoop';
public const RedundantConditionInGlobalScope = 'PhanRedundantConditionInGlobalScope';
public const InfiniteLoop = 'PhanInfiniteLoop';
public const PossiblyInfiniteLoop = 'PhanPossiblyInfiniteLoop';
public const ImpossibleTypeComparison = 'PhanImpossibleTypeComparison';
public const ImpossibleTypeComparisonInLoop = 'PhanImpossibleTypeComparisonInLoop';
public const ImpossibleTypeComparisonInGlobalScope = 'PhanImpossibleTypeComparisonInGlobalScope';
public const SuspiciousValueComparison = 'PhanSuspiciousValueComparison';
public const SuspiciousValueComparisonInLoop = 'PhanSuspiciousValueComparisonInLoop';
public const SuspiciousValueComparisonInGlobalScope = 'PhanSuspiciousValueComparisonInGlobalScope';
public const SuspiciousLoopDirection = 'PhanSuspiciousLoopDirection';
public const SuspiciousWeakTypeComparison = 'PhanSuspiciousWeakTypeComparison';
public const SuspiciousWeakTypeComparisonInLoop = 'PhanSuspiciousWeakTypeComparisonInLoop';
public const SuspiciousWeakTypeComparisonInGlobalScope = 'PhanSuspiciousWeakTypeComparisonInGlobalScope';
public const SuspiciousTruthyCondition = 'PhanSuspiciousTruthyCondition';
public const SuspiciousTruthyString = 'PhanSuspiciousTruthyString';
public const CoalescingNeverNull = 'PhanCoalescingNeverNull';
public const CoalescingNeverNullInLoop = 'PhanCoalescingNeverNullInLoop';
public const CoalescingNeverNullInGlobalScope = 'PhanCoalescingNeverNullInGlobalScope';
public const CoalescingAlwaysNull = 'PhanCoalescingAlwaysNull';
public const CoalescingAlwaysNullInLoop = 'PhanCoalescingAlwaysNullInLoop';
public const CoalescingAlwaysNullInGlobalScope = 'PhanCoalescingAlwaysNullInGlobalScope';
public const CoalescingNeverUndefined = 'PhanCoalescingNeverUndefined';
public const TypeMismatchArgumentPropertyReference = 'PhanTypeMismatchArgumentPropertyReference';
public const TypeMismatchArgumentPropertyReferenceReal = 'PhanTypeMismatchArgumentPropertyReferenceReal';
public const DivisionByZero = 'PhanDivisionByZero';
public const ModuloByZero = 'PhanModuloByZero';
public const PowerOfZero = 'PhanPowerOfZero';
public const InvalidMixin = 'PhanInvalidMixin';
public const IncompatibleRealPropertyType = 'PhanIncompatibleRealPropertyType';
// Issue::CATEGORY_ANALYSIS
public const Unanalyzable = 'PhanUnanalyzable';
public const UnanalyzableInheritance = 'PhanUnanalyzableInheritance';
public const InvalidConstantFQSEN = 'PhanInvalidConstantFQSEN';
public const ReservedConstantName = 'PhanReservedConstantName';
// Issue::CATEGORY_VARIABLE
public const VariableUseClause = 'PhanVariableUseClause';
// Issue::CATEGORY_STATIC
public const StaticCallToNonStatic = 'PhanStaticCallToNonStatic';
public const StaticPropIsStaticType = 'PhanStaticPropIsStaticType';
public const AbstractStaticMethodCall = 'PhanAbstractStaticMethodCall';
public const AbstractStaticMethodCallInStatic = 'PhanAbstractStaticMethodCallInStatic';
public const AbstractStaticMethodCallInTrait = 'PhanAbstractStaticMethodCallInTrait';
// Issue::CATEGORY_CONTEXT
public const ContextNotObject = 'PhanContextNotObject';
public const ContextNotObjectInCallable = 'PhanContextNotObjectInCallable';
public const ContextNotObjectUsingSelf = 'PhanContextNotObjectUsingSelf';
public const SuspiciousMagicConstant = 'PhanSuspiciousMagicConstant';
// Issue::CATEGORY_DEPRECATED
public const DeprecatedClass = 'PhanDeprecatedClass';
public const DeprecatedInterface = 'PhanDeprecatedInterface';
public const DeprecatedTrait = 'PhanDeprecatedTrait';
public const DeprecatedFunction = 'PhanDeprecatedFunction';
public const DeprecatedFunctionInternal = 'PhanDeprecatedFunctionInternal';
public const DeprecatedProperty = 'PhanDeprecatedProperty';
public const DeprecatedClassConstant = 'PhanDeprecatedClassConstant';
public const DeprecatedCaseInsensitiveDefine = 'PhanDeprecatedCaseInsensitiveDefine';
// Issue::CATEGORY_PARAMETER
public const ParamReqAfterOpt = 'PhanParamReqAfterOpt';
public const ParamSpecial1 = 'PhanParamSpecial1';
public const ParamSpecial2 = 'PhanParamSpecial2';
public const ParamSpecial3 = 'PhanParamSpecial3';
public const ParamSpecial4 = 'PhanParamSpecial4';
public const ParamSuspiciousOrder = 'PhanParamSuspiciousOrder';
public const ParamTooFew = 'PhanParamTooFew';
public const ParamTooFewInternal = 'PhanParamTooFewInternal';
public const ParamTooFewCallable = 'PhanParamTooFewCallable';
public const ParamTooFewInPHPDoc = 'PhanParamTooFewInPHPDoc';
public const ParamTooMany = 'PhanParamTooMany';
public const ParamTooManyUnpack = 'PhanParamTooManyUnpack';
public const ParamTooManyInternal = 'PhanParamTooManyInternal';
public const ParamTooManyUnpackInternal = 'PhanParamTooManyUnpackInternal';
public const ParamTooManyCallable = 'PhanParamTooManyCallable';
public const ParamTypeMismatch = 'PhanParamTypeMismatch';
public const ParamSignatureMismatch = 'PhanParamSignatureMismatch';
public const ParamSignatureMismatchInternal = 'PhanParamSignatureMismatchInternal';
public const ParamRedefined = 'PhanParamRedefined';
public const ParamMustBeUserDefinedClassname = 'PhanParamMustBeUserDefinedClassname';
public const ParamSignatureRealMismatchReturnType = 'PhanParamSignatureRealMismatchReturnType';
public const ParamSignatureRealMismatchReturnTypeInternal = 'PhanParamSignatureRealMismatchReturnTypeInternal';
public const ParamSignaturePHPDocMismatchReturnType = 'PhanParamSignaturePHPDocMismatchReturnType';
public const ParamSignatureRealMismatchTooManyRequiredParameters = 'PhanParamSignatureRealMismatchTooManyRequiredParameters';
public const ParamSignatureRealMismatchTooManyRequiredParametersInternal = 'PhanParamSignatureRealMismatchTooManyRequiredParametersInternal';
public const ParamSignaturePHPDocMismatchTooManyRequiredParameters = 'PhanParamSignaturePHPDocMismatchTooManyRequiredParameters';
public const ParamSignatureRealMismatchTooFewParameters = 'PhanParamSignatureRealMismatchTooFewParameters';
public const ParamSignatureRealMismatchTooFewParametersInternal = 'PhanParamSignatureRealMismatchTooFewParametersInternal';
public const ParamSignaturePHPDocMismatchTooFewParameters = 'PhanParamSignaturePHPDocMismatchTooFewParameters';
public const ParamSignatureRealMismatchHasParamType = 'PhanParamSignatureRealMismatchHasParamType';
public const ParamSignatureRealMismatchHasParamTypeInternal = 'PhanParamSignatureRealMismatchHasParamTypeInternal';
public const ParamSignaturePHPDocMismatchHasParamType = 'PhanParamSignaturePHPDocMismatchHasParamType';
public const ParamSignatureRealMismatchHasNoParamType = 'PhanParamSignatureRealMismatchHasNoParamType';
public const ParamSignatureRealMismatchHasNoParamTypeInternal = 'PhanParamSignatureRealMismatchHasNoParamTypeInternal';
public const ParamSignaturePHPDocMismatchHasNoParamType = 'PhanParamSignaturePHPDocMismatchHasNoParamType';
public const ParamSignatureRealMismatchParamIsReference = 'PhanParamSignatureRealMismatchParamIsReference';
public const ParamSignatureRealMismatchParamIsReferenceInternal = 'PhanParamSignatureRealMismatchParamIsReferenceInternal';
public const ParamSignaturePHPDocMismatchParamIsReference = 'PhanParamSignaturePHPDocMismatchParamIsReference';
public const ParamSignatureRealMismatchParamIsNotReference = 'PhanParamSignatureRealMismatchParamIsNotReference';
public const ParamSignatureRealMismatchParamIsNotReferenceInternal = 'PhanParamSignatureRealMismatchParamIsNotReferenceInternal';
public const ParamSignaturePHPDocMismatchParamIsNotReference = 'PhanParamSignaturePHPDocMismatchParamIsNotReference';
public const ParamSignatureRealMismatchParamVariadic = 'PhanParamSignatureRealMismatchParamVariadic';
public const ParamSignatureRealMismatchParamVariadicInternal = 'PhanParamSignatureRealMismatchParamVariadicInternal';
public const ParamSignaturePHPDocMismatchParamVariadic = 'PhanParamSignaturePHPDocMismatchParamVariadic';
public const ParamSignatureRealMismatchParamNotVariadic = 'PhanParamSignatureRealMismatchParamNotVariadic';
public const ParamSignatureRealMismatchParamNotVariadicInternal = 'PhanParamSignatureRealMismatchParamNotVariadicInternal';
public const ParamSignaturePHPDocMismatchParamNotVariadic = 'PhanParamSignaturePHPDocMismatchParamNotVariadic';
public const ParamSignatureRealMismatchParamType = 'PhanParamSignatureRealMismatchParamType';
public const ParamSignatureRealMismatchParamTypeInternal = 'PhanParamSignatureRealMismatchParamTypeInternal';
public const ParamSignaturePHPDocMismatchParamType = 'PhanParamSignaturePHPDocMismatchParamType';
public const ParamNameIndicatingUnused = 'PhanParamNameIndicatingUnused';
public const ParamNameIndicatingUnusedInClosure = 'PhanParamNameIndicatingUnusedInClosure';
public const UndeclaredNamedArgument = 'PhanUndeclaredNamedArgument';
public const UndeclaredNamedArgumentInternal = 'PhanUndeclaredNamedArgumentInternal';
public const DuplicateNamedArgument = 'PhanDuplicateNamedArgument';
public const DuplicateNamedArgumentInternal = 'PhanDuplicateNamedArgumentInternal';
public const DefinitelyDuplicateNamedArgument = 'PhanDefinitelyDuplicateNamedArgument';
public const PositionalArgumentAfterNamedArgument = 'PhanPositionalArgumentAfterNamedArgument';
public const ArgumentUnpackingUsedWithNamedArgument = 'PhanArgumentUnpackingUsedWithNamedArgument';
public const MissingNamedArgument = 'PhanMissingNamedArgument';
public const MissingNamedArgumentInternal = 'PhanMissingNamedArgumentInternal';
public const SuspiciousNamedArgumentForVariadic = 'PhanSuspiciousNamedArgumentForVariadic';
public const SuspiciousNamedArgumentVariadicInternal = 'PhanSuspiciousNamedArgumentVariadicInternal';
// Issue::CATEGORY_NOOP
public const NoopArray = 'PhanNoopArray';
public const NoopClosure = 'PhanNoopClosure';
public const NoopConstant = 'PhanNoopConstant';
public const NoopProperty = 'PhanNoopProperty';
public const NoopArrayAccess = 'PhanNoopArrayAccess';
public const NoopVariable = 'PhanNoopVariable';
public const NoopUnaryOperator = 'PhanNoopUnaryOperator';
public const NoopBinaryOperator = 'PhanNoopBinaryOperator';
public const NoopStringLiteral = 'PhanNoopStringLiteral';
public const NoopEncapsulatedStringLiteral = 'PhanNoopEncapsulatedStringLiteral';
public const NoopNumericLiteral = 'PhanNoopNumericLiteral';
public const NoopEmpty = 'PhanNoopEmpty';
public const NoopIsset = 'PhanNoopIsset';
public const NoopCast = 'PhanNoopCast';
public const NoopTernary = 'PhanNoopTernary';
public const NoopNew = 'PhanNoopNew';
public const NoopNewNoSideEffects = 'PhanNoopNewNoSideEffects';
public const NoopSwitchCases = 'PhanNoopSwitchCases';
public const NoopMatchArms = 'PhanNoopMatchArms';
public const NoopMatchExpression = 'PhanNoopMatchExpression';
public const NoopRepeatedSilenceOperator = 'PhanNoopRepeatedSilenceOperator';
public const UnreachableCatch = 'PhanUnreachableCatch';
public const UnreferencedClass = 'PhanUnreferencedClass';
public const UnreferencedFunction = 'PhanUnreferencedFunction';
public const UnreferencedPublicMethod = 'PhanUnreferencedPublicMethod';
public const UnreferencedProtectedMethod = 'PhanUnreferencedProtectedMethod';
public const UnreferencedPrivateMethod = 'PhanUnreferencedPrivateMethod';
public const UnreferencedPublicProperty = 'PhanUnreferencedPublicProperty';
public const UnreferencedProtectedProperty = 'PhanUnreferencedProtectedProperty';
public const UnreferencedPrivateProperty = 'PhanUnreferencedPrivateProperty';
public const UnreferencedPHPDocProperty = 'PhanUnreferencedPHPDocProperty';
public const ReadOnlyPublicProperty = 'PhanReadOnlyPublicProperty';
public const ReadOnlyProtectedProperty = 'PhanReadOnlyProtectedProperty';
public const ReadOnlyPrivateProperty = 'PhanReadOnlyPrivateProperty';
public const ReadOnlyPHPDocProperty = 'PhanReadOnlyPHPDocProperty';
public const WriteOnlyPublicProperty = 'PhanWriteOnlyPublicProperty';
public const WriteOnlyProtectedProperty = 'PhanWriteOnlyProtectedProperty';
public const WriteOnlyPrivateProperty = 'PhanWriteOnlyPrivateProperty';
public const WriteOnlyPHPDocProperty = 'PhanWriteOnlyPHPDocProperty';
public const UnreferencedConstant = 'PhanUnreferencedConstant';
public const UnreferencedPublicClassConstant = 'PhanUnreferencedPublicClassConstant';
public const UnreferencedProtectedClassConstant = 'PhanUnreferencedProtectedClassConstant';
public const UnreferencedPrivateClassConstant = 'PhanUnreferencedPrivateClassConstant';
public const UnreferencedClosure = 'PhanUnreferencedClosure';
public const UnreferencedUseNormal = 'PhanUnreferencedUseNormal';
public const UnreferencedUseFunction = 'PhanUnreferencedUseFunction';
public const UnreferencedUseConstant = 'PhanUnreferencedUseConstant';
public const DuplicateUseNormal = 'PhanDuplicateUseNormal';
public const DuplicateUseFunction = 'PhanDuplicateUseFunction';
public const DuplicateUseConstant = 'PhanDuplicateUseConstant';
public const UseNormalNoEffect = 'PhanUseNormalNoEffect';
public const UseNormalNamespacedNoEffect = 'PhanUseNormalNamespacedNoEffect';
public const UseFunctionNoEffect = 'PhanUseFunctionNoEffect';
public const UseConstantNoEffect = 'PhanUseConstantNoEffect';
public const EmptyPublicMethod = 'PhanEmptyPublicMethod';
public const EmptyProtectedMethod = 'PhanEmptyProtectedMethod';
public const EmptyPrivateMethod = 'PhanEmptyPrivateMethod';
public const EmptyFunction = 'PhanEmptyFunction';
public const EmptyClosure = 'PhanEmptyClosure';
public const UnusedVariable = 'PhanUnusedVariable';
public const UnusedPublicMethodParameter = 'PhanUnusedPublicMethodParameter';
public const UnusedPublicFinalMethodParameter = 'PhanUnusedPublicFinalMethodParameter';
public const UnusedPublicNoOverrideMethodParameter = 'PhanUnusedPublicNoOverrideMethodParameter';
public const UnusedProtectedMethodParameter = 'PhanUnusedProtectedMethodParameter';
public const UnusedProtectedFinalMethodParameter = 'PhanUnusedProtectedFinalMethodParameter';
public const UnusedProtectedNoOverrideMethodParameter = 'PhanUnusedProtectedNoOverrideMethodParameter';
public const UnusedPrivateMethodParameter = 'PhanUnusedPrivateMethodParameter';
public const UnusedPrivateFinalMethodParameter = 'PhanUnusedPrivateFinalMethodParameter';
public const UnusedClosureUseVariable = 'PhanUnusedClosureUseVariable';
public const ShadowedVariableInArrowFunc = 'PhanShadowedVariableInArrowFunc';
public const UnusedClosureParameter = 'PhanUnusedClosureParameter';
public const UnusedGlobalFunctionParameter = 'PhanUnusedGlobalFunctionParameter';
public const UnusedVariableValueOfForeachWithKey = 'PhanUnusedVariableValueOfForeachWithKey'; // has higher false positive rates than UnusedVariable
public const EmptyForeach = 'PhanEmptyForeach';
public const EmptyForeachBody = 'PhanEmptyForeachBody';
public const SideEffectFreeForeachBody = 'PhanSideEffectFreeForeachBody';
public const SideEffectFreeForBody = 'PhanSideEffectFreeForBody';
public const SideEffectFreeWhileBody = 'PhanSideEffectFreeWhileBody';
public const SideEffectFreeDoWhileBody = 'PhanSideEffectFreeDoWhileBody';
public const EmptyYieldFrom = 'PhanEmptyYieldFrom';
public const UselessBinaryAddRight = 'PhanUselessBinaryAddRight';
public const SuspiciousBinaryAddLists = 'PhanSuspiciousBinaryAddLists';
public const UnusedVariableCaughtException = 'PhanUnusedVariableCaughtException'; // has higher false positive rates than UnusedVariable
public const UnusedGotoLabel = 'PhanUnusedGotoLabel';
public const UnusedVariableReference = 'PhanUnusedVariableReference';
public const UnusedVariableStatic = 'PhanUnusedVariableStatic';
public const UnusedVariableGlobal = 'PhanUnusedVariableGlobal';
public const UnusedReturnBranchWithoutSideEffects = 'PhanUnusedReturnBranchWithoutSideEffects';
public const RedundantArrayValuesCall = 'PhanRedundantArrayValuesCall';
public const VariableDefinitionCouldBeConstant = 'PhanVariableDefinitionCouldBeConstant';
public const VariableDefinitionCouldBeConstantEmptyArray = 'PhanVariableDefinitionCouldBeConstantEmptyArray';
public const VariableDefinitionCouldBeConstantString = 'PhanVariableDefinitionCouldBeConstantString';
public const VariableDefinitionCouldBeConstantFloat = 'PhanVariableDefinitionCouldBeConstantFloat';
public const VariableDefinitionCouldBeConstantInt = 'PhanVariableDefinitionCouldBeConstantInt';
public const VariableDefinitionCouldBeConstantTrue = 'PhanVariableDefinitionCouldBeConstantTrue';
public const VariableDefinitionCouldBeConstantFalse = 'PhanVariableDefinitionCouldBeConstantFalse';
public const VariableDefinitionCouldBeConstantNull = 'PhanVariableDefinitionCouldBeConstantNull';
public const ProvidingUnusedParameter = 'PhanProvidingUnusedParameter';
public const ProvidingUnusedParameterOfClosure = 'PhanProvidingUnusedParameterOfClosure';
// Issue::CATEGORY_REDEFINE
public const RedefineClass = 'PhanRedefineClass';
public const RedefineClassAlias = 'PhanRedefineClassAlias';
public const RedefineClassInternal = 'PhanRedefineClassInternal';
public const RedefineFunction = 'PhanRedefineFunction';
public const RedefineFunctionInternal = 'PhanRedefineFunctionInternal';
public const RedefineClassConstant = 'PhanRedefineClassConstant';
public const RedefineProperty = 'PhanRedefineProperty';
public const IncompatibleCompositionProp = 'PhanIncompatibleCompositionProp';
public const IncompatibleCompositionMethod = 'PhanIncompatibleCompositionMethod';
public const RedefinedUsedTrait = 'PhanRedefinedUsedTrait';
public const RedefinedInheritedInterface = 'PhanRedefinedInheritedInterface';
public const RedefinedExtendedClass = 'PhanRedefinedExtendedClass';
public const RedefinedClassReference = 'PhanRedefinedClassReference';
// Issue::CATEGORY_ACCESS
public const AccessPropertyPrivate = 'PhanAccessPropertyPrivate';
public const AccessPropertyProtected = 'PhanAccessPropertyProtected';
public const AccessReadOnlyProperty = 'PhanAccessReadOnlyProperty';
public const AccessWriteOnlyProperty = 'PhanAccessWriteOnlyProperty';
public const AccessReadOnlyMagicProperty = 'PhanAccessReadOnlyMagicProperty';
public const AccessWriteOnlyMagicProperty = 'PhanAccessWriteOnlyMagicProperty';
public const AccessMethodPrivate = 'PhanAccessMethodPrivate';
public const AccessMethodPrivateWithCallMagicMethod = 'PhanAccessMethodPrivateWithCallMagicMethod';
public const AccessMethodProtected = 'PhanAccessMethodProtected';
public const AccessMethodProtectedWithCallMagicMethod = 'PhanAccessMethodProtectedWithCallMagicMethod';
public const AccessSignatureMismatch = 'PhanAccessSignatureMismatch';
public const AccessSignatureMismatchInternal = 'PhanAccessSignatureMismatchInternal';
public const ConstructAccessSignatureMismatch = 'PhanConstructAccessSignatureMismatch';
public const PropertyAccessSignatureMismatch = 'PhanPropertyAccessSignatureMismatch';
public const PropertyAccessSignatureMismatchInternal = 'PhanPropertyAccessSignatureMismatchInternal';
public const ConstantAccessSignatureMismatch = 'PhanConstantAccessSignatureMismatch';
public const ConstantAccessSignatureMismatchInternal = 'PhanConstantAccessSignatureMismatchInternal';
public const AccessStaticToNonStatic = 'PhanAccessStaticToNonStatic';
public const AccessNonStaticToStatic = 'PhanAccessNonStaticToStatic';
public const AccessStaticToNonStaticProperty = 'PhanAccessStaticToNonStaticProperty';
public const AccessNonStaticToStaticProperty = 'PhanAccessNonStaticToStaticProperty';
public const AccessClassConstantPrivate = 'PhanAccessClassConstantPrivate';
public const AccessClassConstantProtected = 'PhanAccessClassConstantProtected';
public const AccessPropertyStaticAsNonStatic = 'PhanAccessPropertyStaticAsNonStatic';
public const AccessPropertyNonStaticAsStatic = 'PhanAccessPropertyNonStaticAsStatic';
public const AccessOwnConstructor = 'PhanAccessOwnConstructor';
public const AccessConstantInternal = 'PhanAccessConstantInternal';
public const AccessClassInternal = 'PhanAccessClassInternal';
public const AccessClassConstantInternal = 'PhanAccessClassConstantInternal';
public const AccessPropertyInternal = 'PhanAccessPropertyInternal';
public const AccessMethodInternal = 'PhanAccessMethodInternal';
public const AccessWrongInheritanceCategory = 'PhanAccessWrongInheritanceCategory';
public const AccessWrongInheritanceCategoryInternal = 'PhanAccessWrongInheritanceCategoryInternal';
public const AccessExtendsFinalClass = 'PhanAccessExtendsFinalClass';
public const AccessExtendsFinalClassInternal = 'PhanAccessExtendsFinalClassInternal';
public const AccessOverridesFinalMethod = 'PhanAccessOverridesFinalMethod';
public const AccessOverridesFinalMethodInTrait = 'PhanAccessOverridesFinalMethodInTrait';
public const AccessOverridesFinalMethodInternal = 'PhanAccessOverridesFinalMethodInternal';
public const AccessOverridesFinalMethodPHPDoc = 'PhanAccessOverridesFinalMethodPHPDoc';
// Issue::CATEGORY_COMPATIBLE
public const CompatibleExpressionPHP7 = 'PhanCompatibleExpressionPHP7';
public const CompatiblePHP7 = 'PhanCompatiblePHP7';
public const CompatibleNullableTypePHP70 = 'PhanCompatibleNullableTypePHP70';
public const CompatibleShortArrayAssignPHP70 = 'PhanCompatibleShortArrayAssignPHP70';
public const CompatibleKeyedArrayAssignPHP70 = 'PhanCompatibleKeyedArrayAssignPHP70';
public const CompatibleVoidTypePHP70 = 'PhanCompatibleVoidTypePHP70';
public const CompatibleIterableTypePHP70 = 'PhanCompatibleIterableTypePHP70';
public const CompatibleObjectTypePHP71 = 'PhanCompatibleObjectTypePHP71';
public const CompatibleMixedType = 'PhanCompatibleMixedType';
public const CompatibleUseVoidPHP70 = 'PhanCompatibleUseVoidPHP70';
public const CompatibleUseIterablePHP71 = 'PhanCompatibleUseIterablePHP71';
public const CompatibleUseObjectPHP71 = 'PhanCompatibleUseObjectPHP71';
public const CompatibleUseMixed = 'PhanCompatibleUseMixed';
public const CompatibleMultiExceptionCatchPHP70 = 'PhanCompatibleMultiExceptionCatchPHP70';
public const CompatibleNonCapturingCatch = 'PhanCompatibleNonCapturingCatch';
public const CompatibleNegativeStringOffset = 'PhanCompatibleNegativeStringOffset';
public const CompatibleAutoload = 'PhanCompatibleAutoload';
public const CompatibleUnsetCast = 'PhanCompatibleUnsetCast';
public const CompatibleSyntaxNotice = 'PhanCompatibleSyntaxNotice';
public const CompatibleDimAlternativeSyntax = 'PhanCompatibleDimAlternativeSyntax';
public const CompatibleImplodeOrder = 'PhanCompatibleImplodeOrder';
public const CompatibleUnparenthesizedTernary = 'PhanCompatibleUnparenthesizedTernary';
public const CompatibleTypedProperty = 'PhanCompatibleTypedProperty';
public const CompatibleDefaultEqualsNull = 'PhanCompatibleDefaultEqualsNull';
public const CompatiblePHP8PHP4Constructor = 'PhanCompatiblePHP8PHP4Constructor';
public const CompatibleScalarTypePHP56 = 'PhanCompatibleScalarTypePHP56';
public const CompatibleAnyReturnTypePHP56 = 'PhanCompatibleAnyReturnTypePHP56';
public const CompatibleUnionType = 'PhanCompatibleUnionType';
public const CompatibleStaticType = 'PhanCompatibleStaticType';
public const CompatibleThrowExpression = 'PhanCompatibleThrowExpression';
public const CompatibleArrowFunction = 'PhanCompatibleArrowFunction';
public const CompatibleMatchExpression = 'PhanCompatibleMatchExpression';
public const CompatibleNullsafeOperator = 'PhanCompatibleNullsafeOperator';
public const CompatibleNamedArgument = 'PhanCompatibleNamedArgument';
public const CompatibleTrailingCommaArgumentList = 'PhanCompatibleTrailingCommaArgumentList';
public const CompatibleTrailingCommaParameterList = 'PhanCompatibleTrailingCommaParameterList';
public const CompatibleConstructorPropertyPromotion = 'PhanCompatibleConstructorPropertyPromotion';
// Issue::CATEGORY_GENERIC
public const TemplateTypeConstant = 'PhanTemplateTypeConstant';
public const TemplateTypeStaticMethod = 'PhanTemplateTypeStaticMethod';
public const TemplateTypeStaticProperty = 'PhanTemplateTypeStaticProperty';
public const GenericGlobalVariable = 'PhanGenericGlobalVariable';
public const GenericConstructorTypes = 'PhanGenericConstructorTypes';
public const TemplateTypeNotUsedInFunctionReturn = 'PhanTemplateTypeNotUsedInFunctionReturn';
public const TemplateTypeNotDeclaredInFunctionParams = 'PhanTemplateTypeNotDeclaredInFunctionParams';
// Issue::CATEGORY_COMMENT
public const DebugAnnotation = 'PhanDebugAnnotation';
public const InvalidCommentForDeclarationType = 'PhanInvalidCommentForDeclarationType';
public const MisspelledAnnotation = 'PhanMisspelledAnnotation';
public const UnextractableAnnotation = 'PhanUnextractableAnnotation';
public const UnextractableAnnotationPart = 'PhanUnextractableAnnotationPart';
public const UnextractableAnnotationSuffix = 'PhanUnextractableAnnotationSuffix';
public const UnextractableAnnotationElementName = 'PhanUnextractableAnnotationElementName';
public const CommentParamWithoutRealParam = 'PhanCommentParamWithoutRealParam';
public const CommentParamAssertionWithoutRealParam = 'PhanCommentParamAssertionWithoutRealParam';
public const CommentParamOnEmptyParamList = 'PhanCommentParamOnEmptyParamList';
public const CommentOverrideOnNonOverrideMethod = 'PhanCommentOverrideOnNonOverrideMethod';
public const CommentOverrideOnNonOverrideConstant = 'PhanCommentOverrideOnNonOverrideConstant';
public const CommentOverrideOnNonOverrideProperty = 'PhanCommentOverrideOnNonOverrideProperty';
public const CommentAbstractOnInheritedConstant = 'PhanCommentAbstractOnInheritedConstant';
public const CommentAbstractOnInheritedProperty = 'PhanCommentAbstractOnInheritedProperty';
public const CommentAbstractOnInheritedMethod = 'PhanCommentAbstractOnInheritedMethod';
public const CommentParamOutOfOrder = 'PhanCommentParamOutOfOrder';
public const CommentVarInsteadOfParam = 'PhanCommentVarInsteadOfParam';
public const ThrowTypeAbsent = 'PhanThrowTypeAbsent';
public const ThrowTypeAbsentForCall = 'PhanThrowTypeAbsentForCall';
public const ThrowTypeMismatch = 'PhanThrowTypeMismatch';
public const ThrowTypeMismatchForCall = 'PhanThrowTypeMismatchForCall';
public const ThrowStatementInToString = 'PhanThrowStatementInToString';
public const ThrowCommentInToString = 'PhanThrowCommentInToString';
public const CommentAmbiguousClosure = 'PhanCommentAmbiguousClosure';
public const CommentDuplicateParam = 'PhanCommentDuplicateParam';
public const CommentDuplicateMagicMethod = 'PhanCommentDuplicateMagicMethod';
public const CommentDuplicateMagicProperty = 'PhanCommentDuplicateMagicProperty';
public const CommentObjectInClassConstantType = 'PhanCommentObjectInClassConstantType';
// phpcs:enable Generic.NamingConventions.UpperCaseConstantName.ClassConstantNotUpperCase
// end of issue name constants
/** This category of issue is emitted when you're trying to access things that you can't access. */
public const CATEGORY_ACCESS = 1 << 1;
/** This category will be emitted when Phan doesn't know how to analyze something. */
public const CATEGORY_ANALYSIS = 1 << 2;
/** This category of issue is emitted when there are compatibility issues between PHP versions */
public const CATEGORY_COMPATIBLE = 1 << 3;
/** This category of issue is for when you're doing stuff out of the context in which you're allowed to do it, e.g. referencing `self` or `parent` when not in a class, interface or trait. */
public const CATEGORY_CONTEXT = 1 << 4;
/** This category of issue comes up when you're accessing deprecated elements (as marked by the `(at)deprecated` comment). */
public const CATEGORY_DEPRECATED = 1 << 5;
/** Issues in this category are emitted when you have reasonable code but it isn't doing anything. */
public const CATEGORY_NOOP = 1 << 6;
/** This category of error comes up when you're messing up your method or function parameters in some way. */
public const CATEGORY_PARAMETER = 1 << 7;
/** This category of issue comes up when more than one thing of whatever type have the same name and namespace. */
public const CATEGORY_REDEFINE = 1 << 8;
/** Static access to non-static methods, etc. */
public const CATEGORY_STATIC = 1 << 9;
/** This category of issue come from using incorrect types or types that cannot cast to the expected types. */
public const CATEGORY_TYPE = 1 << 10;
/** This category of issue comes up when there are references to undefined things. */
public const CATEGORY_UNDEFINED = 1 << 11;
/** This category is for using non-variables where variables are expected. */
public const CATEGORY_VARIABLE = 1 << 12;
/** This category is for plugins. */
public const CATEGORY_PLUGIN = 1 << 13;
/** This category contains issues related to [Phan's generic type support](https://github.com/phan/phan/wiki/Generic-Types). */
public const CATEGORY_GENERIC = 1 << 14;
/** This issue category comes up when there is an attempt to access an `(at)internal` element outside of the namespace in which it's defined. */
public const CATEGORY_INTERNAL = 1 << 15;
/** This is emitted for some (but not all) comments which Phan thinks are invalid or unparsable. */
public const CATEGORY_COMMENT = 1 << 16;
/** Emitted for syntax errors. */
public const CATEGORY_SYNTAX = 1 << 17;
public const CATEGORY_NAME = [
self::CATEGORY_ACCESS => 'AccessError',
self::CATEGORY_ANALYSIS => 'Analysis',
self::CATEGORY_COMMENT => 'CommentError',
self::CATEGORY_COMPATIBLE => 'CompatError',
self::CATEGORY_CONTEXT => 'Context',
self::CATEGORY_DEPRECATED => 'DeprecatedError',
self::CATEGORY_GENERIC => 'Generic',
self::CATEGORY_INTERNAL => 'Internal',
self::CATEGORY_NOOP => 'NOOPError',
self::CATEGORY_PARAMETER => 'ParamError',
self::CATEGORY_PLUGIN => 'Plugin',
self::CATEGORY_REDEFINE => 'RedefineError',
self::CATEGORY_STATIC => 'StaticCallError',
self::CATEGORY_SYNTAX => 'Syntax',
self::CATEGORY_TYPE => 'TypeError',
self::CATEGORY_UNDEFINED => 'UndefError',
self::CATEGORY_VARIABLE => 'VarError',
];
/** Low severity. E.g. documentation errors or code that would cause a (typically harmless) PHP notice. */
public const SEVERITY_LOW = 0;
/** Normal severity. E.g. something that may cause a minor bug. */
public const SEVERITY_NORMAL = 5;
/** Highest severity. Likely to cause an uncaught Error, Exception, or fatal error at runtime. */
public const SEVERITY_CRITICAL = 10;
// See https://docs.codeclimate.com/v1.0/docs/remediation
// TODO: Decide on a way to estimate these and bring these up to date once codeclimate updates phan.
// Right now, almost everything is REMEDIATION_B.
public const REMEDIATION_A = 1000000;
public const REMEDIATION_B = 3000000;
/** @suppress PhanUnreferencedPublicClassConstant */
public const REMEDIATION_C = 6000000;
/** @suppress PhanUnreferencedPublicClassConstant */
public const REMEDIATION_D = 12000000;
/** @suppress PhanUnreferencedPublicClassConstant */
public const REMEDIATION_E = 16000000;
/** @suppress PhanUnreferencedPublicClassConstant */
public const REMEDIATION_F = 18000000;
// type id constants.
public const TYPE_ID_UNKNOWN = 999;
// Keep sorted and in sync with Colorizing::default_color_for_template
public const UNCOLORED_FORMAT_STRING_FOR_TEMPLATE = [
'CLASS' => '%s',
'CLASSLIKE' => '%s',
'CODE' => '%s', // A snippet from the code
'COMMENT' => '%s', // contents of a phpdoc comment
'CONST' => '%s',
'COUNT' => '%d',
'DETAILS' => '%s', // additional details about an error
'FILE' => '%s',
'FUNCTIONLIKE' => '%s',
'FUNCTION' => '%s',
'INDEX' => '%d',
'INTERFACE' => '%s',
'ISSUETYPE' => '%s', // used by Phan\Output\Printer, for minor issues.
'ISSUETYPE_CRITICAL' => '%s', // for critical issues
'ISSUETYPE_NORMAL' => '%s', // for normal issues
'LINE' => '%d',
'METHOD' => '%s',
'NAMESPACE' => '%s',
'OPERATOR' => '%s',
'PARAMETER' => '%s',
'PROPERTY' => '%s',
'SCALAR' => '%s', // A scalar from the code
'STRING_LITERAL' => '%s', // A string literal from the code
'SUGGESTION' => '%s',
'TYPE' => '%s',
'TRAIT' => '%s',
'VARIABLE' => '%s',
];
/** @var string the type of this issue */
private $type;
/**
* @var int (a preferably unique integer for $type, for the pylint output formatter)
* Built in issue types must have a unique type id.
*/
private $type_id;
/** @var int the category of this issue (self::CATEGORY_*) */
private $category;
/** @var int the severity of this issue (self::SEVERITY_*) */
private $severity;
/** @var string The format string for this issue type. Contains a mix of {CLASS} and %s/%d annotations. Used for colorizing option. */
private $template_raw;
/** @var string The printf format string for this issue type. If --color is enabled, this will have unix color codes. */
private $template;
/** @var int the expected number of arguments to the format string $this->template */
private $argument_count;
/** @var int self::REMEDIATION_* */
private $remediation_difficulty;
/**
* @param string $type the type of this issue
* @param int $category the category of this issue (self::CATEGORY_*)
* @param int $severity the severity of this issue (self::SEVERITY_*)
* @param string $template_raw the template string for issue messages. Contains a mix of {CLASS} and %s/%d annotations.
* @param int $remediation_difficulty self::REMEDIATION_*
* @param int $type_id (unique integer id for $type)
*/
public function __construct(
string $type,
int $category,
int $severity,
string $template_raw,
int $remediation_difficulty,
int $type_id
) {
$this->type = $type;
$this->category = $category;
$this->severity = $severity;
$this->template_raw = $template_raw;
$this->template = self::templateToFormatString($template_raw);
$this->remediation_difficulty = $remediation_difficulty;
$this->type_id = $type_id;
}
/**
* Converts the Phan template string to a regular format string.
*/
public static function templateToFormatString(
string $template
): string {
/** @param list<string> $matches */
return \preg_replace_callback('/{([A-Z_]+)}/', static function (array $matches) use ($template): string {
$key = $matches[1];
$replacement_exists = \array_key_exists($key, self::UNCOLORED_FORMAT_STRING_FOR_TEMPLATE);
if (!$replacement_exists) {
\error_log(\sprintf(
"No coloring info for issue message (%s), key {%s}. Valid template types: %s",
$template,
$key,
\implode(', ', \array_keys(self::UNCOLORED_FORMAT_STRING_FOR_TEMPLATE))
));
return '%s';
}
return self::UNCOLORED_FORMAT_STRING_FOR_TEMPLATE[$key];
}, $template);
}
/**
* @return array<string,Issue>
*/
public static function issueMap(): array
{
static $error_map;
return $error_map ?? ($error_map = self::generateIssueMap());
}
/**
* @return array<string,Issue>
*/
private static function generateIssueMap(): array
{
// phpcs:disable Generic.Files.LineLength
/**
* @var list<Issue>
* Note: All type ids should be unique, and be grouped by the category.
* (E.g. If the category is (1 << x), then the type_id should be x*1000 + y
* If new type ids are added, existing ones should not be changed.
*/
$error_list = [
// Issue::CATEGORY_SYNTAX
new Issue(
self::SyntaxError,
self::CATEGORY_SYNTAX,
self::SEVERITY_CRITICAL,
"%s",
self::REMEDIATION_A,
17000
),
new Issue(
self::InvalidConstantExpression,
self::CATEGORY_SYNTAX,
self::SEVERITY_CRITICAL,
"Constant expression contains invalid operations",
self::REMEDIATION_A,
17001
),
new Issue(
self::InvalidNode,
self::CATEGORY_SYNTAX,
self::SEVERITY_CRITICAL,
"%s",
self::REMEDIATION_A,
17002
),
new Issue(
self::InvalidWriteToTemporaryExpression,
self::CATEGORY_SYNTAX,
self::SEVERITY_CRITICAL,
"Cannot use temporary expression ({CODE} of type {TYPE}) in write context",
self::REMEDIATION_A,
17003
),
new Issue(
self::InvalidTraitUse,
self::CATEGORY_SYNTAX,
self::SEVERITY_CRITICAL,
'Invalid trait use: {DETAILS}',
self::REMEDIATION_A,
17004
),
// Could try to make a better suggestion, optionally
new Issue(
self::ContinueTargetingSwitch,
self::CATEGORY_SYNTAX,
self::SEVERITY_NORMAL,
'"continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?',
self::REMEDIATION_A,
17005
),
new Issue(
self::ContinueOrBreakNotInLoop,
self::CATEGORY_SYNTAX,
self::SEVERITY_CRITICAL,
'\'{OPERATOR}\' not in the \'loop\' or \'switch\' context.',
self::REMEDIATION_A,
17006
),
new Issue(
self::ContinueOrBreakTooManyLevels,
self::CATEGORY_SYNTAX,
self::SEVERITY_CRITICAL,
'Cannot \'{OPERATOR}\' {INDEX} levels.',
self::REMEDIATION_A,
17007
),
new Issue(
self::DuplicateUseNormal,
self::CATEGORY_SYNTAX,
self::SEVERITY_CRITICAL,
"Cannot use {CLASSLIKE} as {CLASSLIKE} because the name is already in use",
self::REMEDIATION_B,
17008
),
new Issue(
self::DuplicateUseFunction,
self::CATEGORY_SYNTAX,
self::SEVERITY_CRITICAL,
"Cannot use function {FUNCTION} as {FUNCTION} because the name is already in use",
self::REMEDIATION_B,
17009
),
new Issue(
self::DuplicateUseConstant,
self::CATEGORY_SYNTAX,
self::SEVERITY_CRITICAL,
"Cannot use constant {CONST} as {CONST} because the name is already in use",
self::REMEDIATION_B,
17010
),
new Issue(
self::SyntaxCompileWarning,
self::CATEGORY_SYNTAX,
self::SEVERITY_NORMAL,
'Saw a warning while parsing: {DETAILS}',
self::REMEDIATION_A,
17011
),
new Issue(
self::SyntaxEmptyListArrayDestructuring,
self::CATEGORY_SYNTAX,
self::SEVERITY_CRITICAL,
'Cannot use an empty list in the left hand side of an array destructuring operation',
self::REMEDIATION_A,
17012
),
new Issue(
self::SyntaxMixedKeyNoKeyArrayDestructuring,
self::CATEGORY_SYNTAX,
self::SEVERITY_CRITICAL,
'Cannot mix keyed and unkeyed array entries in array destructuring assignments ({CODE})',
self::REMEDIATION_A,
17013
),
new Issue(
self::SyntaxReturnValueInVoid,
self::CATEGORY_SYNTAX,
self::SEVERITY_CRITICAL,
'Syntax error: {TYPE} function {FUNCTIONLIKE} must not return a value (did you mean "{CODE}" instead of "{CODE}"?)',
self::REMEDIATION_A,
17014
),
new Issue(
self::SyntaxReturnExpectedValue,
self::CATEGORY_SYNTAX,
self::SEVERITY_CRITICAL,
'Syntax error: Function {FUNCTIONLIKE} with return type {TYPE} must return a value (did you mean "{CODE}" instead of "{CODE}"?)',
self::REMEDIATION_A,
17015
),
// Issue::CATEGORY_UNDEFINED
new Issue(
self::EmptyFile,
self::CATEGORY_UNDEFINED,
self::SEVERITY_LOW,
"Empty file {FILE}",
self::REMEDIATION_B,
11000
),
new Issue(
self::MissingRequireFile,
self::CATEGORY_UNDEFINED,
self::SEVERITY_CRITICAL,
"Missing required file {FILE}",
self::REMEDIATION_B,
11040
),
new Issue(
self::InvalidRequireFile,
self::CATEGORY_UNDEFINED,
self::SEVERITY_CRITICAL,
"Required file {FILE} is not a file",
self::REMEDIATION_B,
11041
),
new Issue(
self::ParentlessClass,
self::CATEGORY_UNDEFINED,
self::SEVERITY_CRITICAL,
"Reference to parent of class {CLASS} that does not extend anything",
self::REMEDIATION_B,
11001
),
new Issue(
self::UndeclaredClass,
self::CATEGORY_UNDEFINED,
self::SEVERITY_CRITICAL,
"Reference to undeclared class {CLASS}",
self::REMEDIATION_B,
11002
),
new Issue(
self::UndeclaredExtendedClass,
self::CATEGORY_UNDEFINED,
self::SEVERITY_CRITICAL,
"Class extends undeclared class {CLASS}",
self::REMEDIATION_B,
11003