1
0
mirror of https://github.com/danog/psalm.git synced 2024-12-15 10:57:08 +01:00
Commit Graph

5413 Commits

Author SHA1 Message Date
Brown
b6fd821172 Fix broken build 2020-04-17 14:39:33 -04:00
Brown
aa3846758e Fix #3153 - narrow template types in conditional branches 2020-04-17 09:53:58 -04:00
Brown
e53c79b66e Break out SimpleNegatedAssertionReconciler 2020-04-17 09:28:42 -04:00
Brown
edc164c549 Simplify conditionals a little 2020-04-17 09:10:33 -04:00
Brown
239234e803 Migrate simple assertions to self-enclosed method 2020-04-17 08:59:15 -04:00
Brown
5ef82b53f6 Fix #3137 - support nested templates in class definitions 2020-04-17 01:16:15 -04:00
Brown
1309eece2e At the very least interpret nested templates as templates 2020-04-17 00:56:11 -04:00
Anthony Rainer
6f36f33630
Added new language server options and functionality. (#3161)
* Added new language server options and functionality.

Added new extended diagnostic code information to the language server.
 -- It must be enabled via a command line switch.
Added telemetry data for language server initialization and operation.
Added verbose log messages for language server.
 -- It must be enabled via a command line switch.

* fixed phpcs issues

* fixed failing tests

* changed the language server reported error code to be the help link

Co-authored-by: Anthony Rainer <0@0ze.ro>
2020-04-17 00:47:18 -04:00
Brown
35d376cbe7 Fix #3164 - allow nested templates in conditional classes 2020-04-17 00:46:27 -04:00
Matthew Brown
6f28ee684a Fix #3156 - only override existing property types with @property suggestions 2020-04-16 00:22:00 -04:00
Jáchym Toušek
7841581122
Update ext-ds.php (#3146) 2020-04-15 07:31:17 -04:00
Brown
2e4aaac5bb Add better inference for date calls 2020-04-14 21:07:44 -04:00
Brown
fbe0669921 Change evaluation order of conditionals 2020-04-14 21:07:16 -04:00
Matthew Brown
e4bfe9e6be Fix #3142 - array_unique should remove count info 2020-04-14 11:08:45 -04:00
Brown
d470903722 Make Algebra::negateFormula a little more safe 2020-04-13 08:47:11 -04:00
Brown
a25610cefd Fix #3133 - prevent crash when analysing isset 2020-04-13 08:34:38 -04:00
Brown
8533b866ab Simplify template bounds message
Ref #3126
2020-04-12 22:19:49 -04:00
Brown
e17cfd8dba Fix #3125 - only apply clauses where applicable 2020-04-12 21:50:10 -04:00
Brown
633b210a32 Fix test 2020-04-12 21:47:50 -04:00
Brown
73f8f963fa Expand out class constants as early as possible
Fixes #3128
2020-04-12 20:38:36 -04:00
Brown
15df39f72f Fix #3127 - allow templated param to be accepted where static is expected 2020-04-12 20:09:49 -04:00
Brown
5bc9b095d1 Allow memoisation of ArrayAccess::offsetGet 2020-04-12 14:43:12 -04:00
Brown
5988149272 Prevent checking assertions on $this-> types, always accessible 2020-04-12 14:13:42 -04:00
Brown
9c129f3bac Suppress issue for now 2020-04-12 14:01:17 -04:00
Brown
547efcc022 Prevent ArrayAccess on object from being memoised 2020-04-12 14:00:12 -04:00
Brown
c733d6d373 Only perform assertions where the property type is known
cc @m0003r
2020-04-12 12:56:33 -04:00
Brown
95ec189e0b Remove Amp stubs 2020-04-12 11:47:10 -04:00
Brown
370ffa28e4 Fix #3117 - invalidate all caches when composer lockfile changes 2020-04-12 11:41:37 -04:00
m0003r
77270dc9b7
Getters automagic (#3122)
* When method is a plain getter: (1) correct method return type if property type is known (2) auto assert-if-true that corresponding property is not falsy

* do not use getter automagic if getter is overridden somewhere
2020-04-12 08:40:24 -04:00
Brown
ee50542b8f Allow users to disable caching full files 2020-04-12 08:34:57 -04:00
Brown
9d2957d339 Fix a few more edge-cases 2020-04-12 01:26:11 -04:00
Brown
7dfa37beb2 Improve ergonomics of array assignment 2020-04-11 17:50:24 -04:00
Jose Maria Valera Reales
2fe8717639
Add missing output-format "text" to available formats examples (#3120) 2020-04-11 11:18:44 -04:00
Brown
d530fce4b3 Fall through with PossiblyInvalidIterator issue 2020-04-11 11:17:54 -04:00
Brown
739f2c7faf Fix array key type 2020-04-11 08:12:28 -04:00
Brown
db7447abd7 Make array coercion-to--mixed rules a little more lenient 2020-04-10 16:21:48 -04:00
Brown
672baea6fc Fix #3116 - allow class to be compared to a templated class-string 2020-04-10 00:26:11 -04:00
Brown
556d5625b5 Prevent Throwable being intersected with itself 2020-04-10 00:10:31 -04:00
Brown
fea1310d67 Fix #3092 - round always returns a float 2020-04-09 23:31:26 -04:00
Brown
f4a6b24e34 Fix style errors 2020-04-09 23:24:52 -04:00
m0003r
1749c19a29
Fix $assertion_var_id calculation in method calls (#3115) 2020-04-09 23:03:53 -04:00
Brown
09663b5938 Fix #3095 - allow intersection of arrays after assertions 2020-04-09 23:02:28 -04:00
Brown
13d9354cde Fix #3107 - prevent bad @method with dash 2020-04-09 12:16:58 -04:00
Brown
3a4dd70403 Prevent MixedMethodCall from generated array offsetGet calls 2020-04-09 11:45:15 -04:00
Brown
bd92ec6cd3 Detect nested issues 2020-04-09 10:42:54 -04:00
Brown
bd2104c5ba Merge with mixed in nested arrays 2020-04-09 09:27:21 -04:00
m0003r
4d1be3f0c4
Allow plain assertions (@psalm-assert) about $this (fixes #3105) (#3108)
* Allow plain assertions (@psalm-assert) about $this (fixes #3105)

* Fix multiple assertion combining

* Fix multiple assertion combining for $this again

* Add test for multiple assertion combining for $this again
2020-04-09 08:15:07 -04:00
Mikko Pesari
184be78405
Update mysqli property maps (#3114)
From ca92e03c12/src/Phan/Language/Internal/PropertyMap.php
2020-04-09 08:14:09 -04:00
m0003r
28f740fddb
@psalm-trace is now a specific low-level issue, because plain debug print breaks structured output (after #3080) (#3106) 2020-04-08 21:03:05 -04:00
Brown
d868710b2b Fix handling of built arrays 2020-04-08 16:11:11 -04:00
Brown
43287812ce Suppress issue 2020-04-08 14:49:23 -04:00
Brown
b2e010b431 Fix #3102 - identify issues with possibly-mixed output 2020-04-08 14:07:09 -04:00
Brown
a117c48bb2 Add back nuance to error messages for conflicting type bounds 2020-04-08 12:37:46 -04:00
lhchavez
be87bb7300
Support intersection types for object-like arrays (#3064)
This change allows expressing the intersection of multiple object-like
arrays. The resulting type will contain the (merged via intersection)
properties of all the object-like arrays involved in the intersection.

This should allow to express the resulting type of an `array_merge()`
operation, which is tricky to do in the context of a templated type.
2020-04-08 09:35:53 -04:00
Marco Pivetta
0d1e893151
Added ReflectionProperty#getType() to psalm type stubs for PHP 7.4+ (#3093) 2020-04-08 09:04:49 -04:00
Bruce Weirdan
0161f25ef6
Bump callmap version to 7.4 (#3094)
The content of the callmap corresponds to 7.4, but internally the
version was set to 7.3. This caused 7.4 delta to be ignored, and 7.4
types to be used for 7.3.
2020-04-08 01:04:34 -04:00
Brown
2d4381eb4e Fix #3096 - forget clauses in context after call 2020-04-08 01:03:37 -04:00
Brown
5db9f0e8c0 Fix #2722 - change behaviour to inherit params to match just on position
And not name + position
2020-04-08 00:54:17 -04:00
Brown
a79122256c Use conditional return type for range 2020-04-07 19:59:20 -04:00
Brown
69045daea9 Convert a bunch of custom-handled functions to conditional stubbed ones 2020-04-07 16:48:29 -04:00
Brown
550ba0a4c9 Compare to real outer context, not if one
Fixes #3091
2020-04-07 15:13:17 -04:00
Brown
61c979136f Fix #3091 - simplify elseif negated clauses where possible 2020-04-07 13:04:24 -04:00
Brown
41b165c096 Remove stray comma 2020-04-07 11:17:52 -04:00
Brown
067104e170 Fix #3084 - keep track of upper and lower bounds of inferred template types 2020-04-07 00:13:56 -04:00
m0003r
11edb22c72
Implement @psalm-trace annotation, fixes #3079 (#3080) 2020-04-06 12:42:22 -04:00
Brown
26fcde10fa Fix #3081 - use correct property type for ownerDocument 2020-04-06 12:41:18 -04:00
Brown
387bc02e71 Fix #3082 - merge intersection types when replacing template types 2020-04-06 10:19:36 -04:00
Brown
27032e875f Ensure Generator return types are enforced for a function using yield from 2020-04-06 09:23:13 -04:00
Brown
aca84e6f96 Fix inconsistency in partial template matching 2020-04-05 18:40:25 -04:00
Bruce Weirdan
5be4cc2582
Expose queueClassLikeForScanning (#3070) 2020-04-05 17:25:47 -04:00
Mikko Pesari
166b4d04a5
ZipArchive::open() does not return resource (#3067) 2020-04-05 14:28:01 -04:00
m0003r
c8e7e43bb0
Type::getString already respects maxStringLength config, there is no need to additional checks (#3069) 2020-04-05 14:27:02 -04:00
Matthew Brown
e34a3a9281 Fix handling of old amp 2020-04-05 01:14:26 -04:00
Matthew Brown
4191f7a259 Remove unnecessary annotation 2020-04-05 00:54:31 -04:00
Matthew Brown
f0b4533ba4 Use same sort order regardless of OS 2020-04-05 00:37:46 -04:00
Matthew Brown
05f7c9757a Write debug to stdout 2020-04-05 00:28:55 -04:00
Matthew Brown
6cea065bca Attempt to export file order in Linux CI 2020-04-05 00:10:50 -04:00
Matthew Brown
4c52032491 Use mixed if yield type not known 2020-04-04 23:54:41 -04:00
Matthew Brown
120595f480 Clone a little earlier 2020-04-04 23:45:38 -04:00
Brown
c6afa0fef6 Be more explicit about references 2020-04-04 21:48:14 -04:00
Brown
003212fa15 Make sure to record class references even when we don’t know whether the class exists 2020-04-04 21:47:35 -04:00
Brown
81534bbe18 Fix possibly null issue 2020-04-04 18:57:33 -04:00
Brown
2930eb3f99 Prevent storing references to classes from within those classes 2020-04-04 18:42:14 -04:00
Brown
690b29762e ZipArchive::open can return true cc @LeSuisse 2020-04-04 17:45:26 -04:00
Brown
6b25b33d81 Revert "Stub out str_replace types"
This reverts commit 94fefde376.
2020-04-04 17:38:34 -04:00
Brown
649a33b27b Remove json_decode stub, because it introduces too many false-positives 2020-04-04 17:23:15 -04:00
Brown
1bf1a6e46b Accept partial match of template type 2020-04-04 17:14:33 -04:00
Brown
c82834ebe4 Also add back MixedAssignment suppression 2020-04-04 12:15:53 -04:00
Brown
eacb3d7aa0 Add back possibly undefined docblock class suppression 2020-04-04 12:14:53 -04:00
Brown
4b36c4e4bf Add stub for json_encode 2020-04-04 11:18:24 -04:00
Brown
4aae4fc631 Add slash 2020-04-04 11:16:26 -04:00
Brown
fca6585f6e Be more lenient when inside isset 2020-04-04 11:15:13 -04:00
Brown
94fefde376 Stub out str_replace types 2020-04-04 11:05:13 -04:00
Brown
b73b75f1a1 Allow newlines in shortcut version of return type provider 2020-04-04 11:04:00 -04:00
Brown
f3d278609e Remove blank line 2020-04-04 10:14:32 -04:00
Brown
989269a6f6 Ignore issue 2020-04-04 09:39:39 -04:00
Brown
56cc5fb611 Allow shortcut for specifying conditional template types 2020-04-04 09:31:12 -04:00
Brown
eef4feea0b Throw TypeParseTreeException if template type not recognised 2020-04-04 09:26:19 -04:00
Brown
c0e573ab6a Try harder to understand templated array_map callable array
Fixes #3039
2020-04-03 16:53:56 -04:00
Brown
4f07a8fc5d Fix false positive in trait comparison in 7.4
Fixes #3042
2020-04-03 15:11:37 -04:00
Brown
3c9ec90919 Fix deprecated call 2020-04-03 14:56:11 -04:00
Brown
08594cf712 Always be cloning 2020-04-03 13:56:03 -04:00
orklah
b340f2b0ce
allow psalter to be run without cache (#3063) 2020-04-03 12:52:18 -04:00
Matthew Brown
ecac9d56c0 Fix #3061 - prevent array_key_exists from completely changing type 2020-04-03 08:05:21 -04:00
Brown
af4a7cabe9 Fix #3057 and add support for @psalm-yield annotation 2020-04-02 22:38:10 -04:00
Brown
63b35fc889 Fix #3058 - use value for generator inference 2020-04-02 20:37:09 -04:00
Brown
72104a52ad Improve file invalidation when using --diff mode 2020-04-02 17:18:04 -04:00
LeSuisse
3ecd6bbd00
Fix return type of \zip_open() (#3046)
This function can return an int [0] or false [1] in case of error.

The return value of ZipArchive has also been fixed, it returns either a
boolean or an int [2][3].

Close vimeo/psalm#3209.

[0] https://github.com/php/php-src/blob/php-7.4.4/ext/zip/php_zip.c#L1176
[1] https://github.com/php/php-src/blob/php-7.4.4/ext/zip/php_zip.c#L1160
[3] https://github.com/php/php-src/blob/php-7.4.4/ext/zip/php_zip.c#L1483
[4] https://github.com/php/php-src/blob/php-7.4.4/ext/zip/php_zip.c#L1478
2020-04-01 17:12:45 -04:00
Brown
fa43d3a8ff Don’t check stub files for non-unused-code checks 2020-04-01 16:31:28 -04:00
Brown
ba8e5e8209 Fix diff file load order 2020-04-01 15:57:25 -04:00
Brown
943d10854d Clear existing issues before re-adding 2020-04-01 15:30:35 -04:00
Brown
04a49102ec Small test improvements 2020-04-01 12:56:32 -04:00
Brown
fa28d767fc Prevent a templated type from hitting covariance checks 2020-04-01 10:53:40 -04:00
Brown
5876635d6d Always be clonin 2020-04-01 00:45:29 -04:00
Brown
001f064bd4 Don’t modify contents of IssueBuffer in baseline before caching 2020-03-31 23:38:58 -04:00
Brown
1a678068b7 Consolidate conditionals 2020-03-31 23:05:20 -04:00
Brown
fc06250678 Add number_format slash 2020-03-31 22:52:39 -04:00
Brown
8328c1d3aa Fix build 2020-03-31 22:32:48 -04:00
Matthew Brown
66dd794101 Add return function 2020-03-31 22:26:48 -04:00
Brown
4ef7cb50a5 Make Psalm faster when there aren’t any changes whatsoever 2020-03-31 22:22:34 -04:00
Brown
d5f43e52e7 Fix coercion 2020-03-31 16:57:08 -04:00
Brown
191a3febac Return all cached errors not in analyzed files 2020-03-31 16:56:22 -04:00
Brown
cc38f25ed7 Don’t remove non-method issues 2020-03-31 16:33:05 -04:00
Brown
da729cfbc6 Don’t check params when mutations are being collected 2020-03-31 15:49:43 -04:00
Brown
ddc8c50d2a Prevent some inheritance issues 2020-03-31 11:28:36 -04:00
Brown
687ce87995 Ensure issues from unused classes & params is always saved to cache 2020-03-31 09:56:27 -04:00
Matthew Brown
b46e147735 Add some limits on switch case assertion calculation
Ref #2728
2020-03-30 00:20:00 -04:00
Matthew Brown
4fe36a21a4 Use array_pop, not array_shift, because it’s a bit faster 2020-03-29 19:47:40 -04:00
Matthew Brown
1b88316c51 Convert method from recursive to inline 2020-03-29 19:42:22 -04:00
Matthew Brown
d84c5db7ae Prevent complexity explosion a little earlier 2020-03-29 17:12:10 -04:00
Matthew Brown
82197f1761 Add many slashes 2020-03-29 15:56:45 -04:00
Matthew Brown
ce3532490c Add profiling for analysing slow methods 2020-03-29 15:42:00 -04:00
Matthew Brown
194f02507d Allow conditional types to reference class constants 2020-03-29 13:37:37 -04:00
Matthew Brown
1b2017e4f4 Add slash 2020-03-29 10:44:38 -04:00
Matthew Brown
5ad55ae693 Fix type inference on simple conditional function calls 2020-03-29 10:42:57 -04:00
Matthew Brown
0e919a0696 Allow arithmetic on simple templated types 2020-03-29 10:34:46 -04:00
Matthew Brown
f097b9ae6c Add better reconciliation of ints from array keys 2020-03-29 10:22:22 -04:00
Matthew Brown
788da0680e Allow var_export userland implementation 2020-03-29 10:19:09 -04:00
Matthew Brown
1439c90789 Add support for conditional checks on literal ints & strings 2020-03-29 10:02:24 -04:00
Matthew Brown
7fdccc0439 Fix #3014 - change constant class access rules 2020-03-29 09:47:29 -04:00
Matthew Brown
39f7296670 Fix #2191 - allow inheritance from stub-only files 2020-03-29 00:13:01 -04:00
Matthew Brown
e85d22f004 Fix #3033 - allow __invoke on unions with non-objects 2020-03-28 23:41:05 -04:00
Matthew Brown
5395183837 Use more accurate means of determining whether function did return 2020-03-28 23:37:42 -04:00
Matthew Brown
7195ea6842 Fix #3030 - don’t suggest return types can do more 2020-03-28 23:15:54 -04:00
Brown
1c8581f4db Add more fields to API existence checks 2020-03-28 21:39:44 -04:00
Matthew Brown
93735712f0 Fix #3032 - always replay docblock issues when analysing files 2020-03-28 19:54:55 -04:00
Matthew Brown
86a89b2d27 Fix #3034 - expand out while expressions for more accurate variable initialisation 2020-03-28 18:22:08 -04:00
Matthew Brown
de6aee32d1 Fix #3035 - improve templating for property assignments 2020-03-28 17:18:21 -04:00
Matthew Brown
47c1470e3b Refactor reference checks to use more appropriate properties 2020-03-28 16:30:56 -04:00
Brown
cc548a45fa Improve detection of unused classes 2020-03-28 14:45:58 -04:00
Brown
60613462fe Improve static resolution a little more 2020-03-28 08:14:35 -04:00
Brown
5835c34a29 Expand out static extra types 2020-03-28 00:08:31 -04:00
Brown
e3ff856cac Improve treatment of static in intersection 2020-03-27 19:17:44 -04:00
Brown
5cb1538448 Don’t add unnecessary taints 2020-03-27 19:09:15 -04:00
Brown
056f4aaac6 Fix #3027 - inherited properties should be templated properly 2020-03-27 18:31:48 -04:00
Brown
b57563c8cf Renamed function to be a little better 2020-03-27 18:30:59 -04:00
Tyson Andre
e560858b23
Fix grammar nit in "is can never happen" message (#3025)
Should either be "is impossible" or "can never happen"
2020-03-27 17:32:49 -04:00
Brown
4021114b04 Fix too-long line 2020-03-27 10:43:12 -04:00
Brown
ae31ec6805 Fix resolution of get_called_class 2020-03-27 09:51:53 -04:00
Brown
3253f57c94 Don’t rescan everything when finding unused code 2020-03-27 09:45:54 -04:00
Brown
05f8f30d8c Use more specific type description 2020-03-27 09:45:18 -04:00
Brown
031c5be8e6 Check trait methods better 2020-03-27 00:37:33 -04:00
Brown
53612d0df6 Make --diff imply --diff-methods 2020-03-26 18:14:54 -04:00
Brown
75432536f7 Add slashes 2020-03-26 14:43:48 -04:00
Brown
f88c7c1ec5 Fix closure return type inference 2020-03-26 14:38:32 -04:00
Brown
820bd95d8b Fix existing issue check 2020-03-26 14:25:11 -04:00
Brown
4ced26bec2 Fix #3024 - replay errors in --diff --diff-methods mode 2020-03-26 14:22:06 -04:00
Brown
971ae50bea Do prep work for #3024 - improve handling of absent class references 2020-03-26 12:35:27 -04:00
Matthew Brown
68c95c622a Save information about last runs whether or not there were errors 2020-03-26 00:46:39 -04:00
m0003r
71826ad69e
Fix #2994 (#3016)
More carefully handling stream_select errors when system call is interrupted. It can be detected by parsing error message. If it is interrupted, just try again.
2020-03-25 21:25:33 -04:00
Matthew Brown
f94ab22a5f Be better about strict inference 2020-03-25 09:18:49 -04:00
Matthew Brown
4734583444 Don’t overwrite already-defined template 2020-03-24 23:40:01 -04:00
Brown
467da32f84 Fix instanceof static and isa (static::class) handling 2020-03-24 18:58:15 -04:00
iggyvolz
94b246b987
Initial commit (#3013) 2020-03-24 18:32:57 -04:00
Brown
a9b6c51748 Improve new $class to make it more static-y 2020-03-24 18:30:08 -04:00
Brown
1bfc61d402 Allow final classes to bypass static checks 2020-03-24 18:14:10 -04:00
Brown
ec34a16291 Warn about invalid static returns 2020-03-24 18:00:20 -04:00
Brown
f6759c3d16 Check return statement types for inherited docblocks 2020-03-24 17:59:48 -04:00
Brown
1e480ade12 Fix bugs 2020-03-24 14:49:05 -04:00
Brown
cae15b6c62 Use appropriate template types when applying array_filter asssertions
Fixes #3008
2020-03-24 12:15:56 -04:00
Brown
25bd2ed5fb Fix #3010 - prevent false-negative after calling isset on possibly-false array 2020-03-24 12:01:39 -04:00
Brown
a83651050c Seal objectlike arrays inferred from constants 2020-03-23 16:28:20 -04:00
Brown
a7245b4459 Fix bugs 2020-03-23 13:29:00 -04:00
Matthew Brown
27a0651b6c Fix #3009 - make sure return type is set when returning early 2020-03-23 13:25:55 -04:00
Matthew Brown
ce9eef9ed7 Improve returning 2020-03-23 13:25:55 -04:00
Brown
4c081f7835 Things with mixed values can be the same 2020-03-23 12:08:05 -04:00
Matthew Brown
eeed5ecccc Only prevent AbstractMethodCall on direct calls
Fixes #3007
2020-03-23 07:40:30 -04:00
Matthew Brown
6058725256 Add prototype for conditional return type 2020-03-22 10:44:48 -04:00
Matthew Brown
26694345d6 Fix unknown variable 2020-03-21 20:53:46 -04:00
Matthew Brown
6746f1c047 Fix #3004 - reset property types inside a closure defined in a class 2020-03-21 20:46:38 -04:00
Matthew Brown
c986cdf12e Allow edge-case of by-reference assignment with unitiliazed property
Fixes #3003
2020-03-21 19:23:32 -04:00
Niklas Keller
a7affbe716
Add \Error stub (#3002)
Otherwise, errors are generated if \Error is extended: https://psalm.dev/r/8169465beb
2020-03-21 19:11:23 -04:00
Niklas Keller
dd9924ea26
Fix Generator::throw return type (#3001) 2020-03-21 19:08:47 -04:00
LeSuisse
6353b614fa
$ignore parameter of \sodium_base642bin() is optional (#2997)
https://github.com/php/php-src/blob/php-7.3.15/ext/sodium/libsodium.c#L2775
2020-03-20 21:09:45 -04:00
Matthew Brown
44713a48ac Add default shortcode 2020-03-20 14:41:25 -04:00
Matthew Brown
a237ba307c Use simpler method for generating links 2020-03-19 17:12:16 -04:00
Matthew Brown
fa2adfe1b3 Add slashes 2020-03-19 16:35:04 -04:00
Matthew Brown
4e07dfebaa Make link part of IssueData so it’s available to all consumers 2020-03-19 16:22:43 -04:00
Matthew Brown
f532dc316c Add informational links to Psalm‘s output
Fixes #2978
2020-03-19 16:04:40 -04:00
Matthew Brown
89a3af54a6 Add slash 2020-03-18 21:53:44 -04:00