Commit graph

127 commits

Author SHA1 Message Date
Umherirrender
6caf78c2c8 phan: Remove PhanPossiblyUndeclaredVariable suppression
Make phan stricter about conditional variable declaration
Remaining false positive issues are suppressed.
The suppression and the setting change can only be done together

Bug: T259172
Change-Id: I1f200ac37df7448453688bf464a8250c97313e5d
2022-03-30 19:47:15 +00:00
Umherirrender
1f71eccf63 phan: Disable null_casts_as_any_type setting
Make phan stricter about null types by setting null_casts_as_any_type to
false (the default in mediawiki-phan-config)
Remaining false positive issues are suppressed.
The suppression and the setting change can only be done together

Bug: T242536
Bug: T301991
Change-Id: I0f295382b96fb3be8037a01c10487d9d591e7e01
2022-03-21 18:25:07 +00:00
Tim Starling
54c735354f Stop using is_resource() where possible
* Enforce the ban on is_resource in phpcs
* In OrderedStreamingForkController, the comment was incorrect. I
  confirmed using a small test script that if the child closes one end
  of a socket pair, the other end will still be open, and is_resource()
  will still return true, and fclose() will not fail. The issue was
  introduced in c82d30d19c, it was not present in the
  CirrusSearch copy of the class.
* Allow is_resource() for debug logging.
* Allow is_resource() for parameter validation where a stream may be
  passed to a function, since there is no alternative.

Bug: T260735
Change-Id: I59a752f7bb4b043ddfb2434b52a02f9221bf54db
2022-01-26 10:03:23 +11:00
Arlo Breault
b38114c890 Revert "API: Work around PHP bug 45959"
This reverts commit 8deb49f534.

The added tests are left in place to avoid regression.

There's no longer a need for the workaround,
https://wiki.php.net/rfc/convert_numeric_keys_in_object_array_casts

It requires PHP 7.2 which seems like it would be ok,
https://www.mediawiki.org/wiki/Compatibility#PHP

Bug: T123663
Change-Id: I09cef8acb71bbeee262b982780a8b9fb3935fb4e
2021-09-02 13:45:02 -04:00
Tim Starling
9c3c0b704b Use array_fill_keys() instead of array_flip() if that reflects the developer's intention
array_fill_keys() was introduced in PHP 5.2.0 and works like
array_flip() except that it does only one thing (copying keys) instead
of two things (copying keys and values). That makes it faster and more
obvious.

When array_flip() calls were paired, I left them as is, because that
pattern is too cute. I couldn't kill something so cute.

Sometimes it was hard to figure out whether the values in array_flip()
result were used. That's the point of this change. If you use
array_fill_keys(), the intention is obvious.

Change-Id: If8d340a8bc816a15afec37e64f00106ae45e10ed
2021-06-15 00:11:10 +00:00
Daimona Eaytoy
1716f52aa6 Api: Cache the ContentLanguage object in ApiResult
This code was querying the service locator for each value, which
showed up on xhgui: according to
https://performance.wikimedia.org/xhgui/run/view?id=601eefa1beb2155092df5c24,
there are 6945 calls to MediaWikiServices::getContentLanguage for a
request, of which roughly 500 outside of this method.

Change-Id: Ibabdd236d6945a1c742a724c8357a0b7015e9071
2021-02-11 16:21:58 +01:00
Thiemo Kreuz
93690e1c19 API: Optimize hot code paths in ApiResult by re-arranging
This does not change what this code does in any way. All it
does is re-arranging the code paths from most likely to least
likely. For example:

* It's much more likely that an element in an API result is a
string, and much less likely it's an array. This change
increases the chance that the long if-elseif ends after the
first check, and rarely executes the other checks.

* There are not many arrays in an API result, but many, many
more scalar values. Doing the is_array() check first avoids
many, many calls of the hot isMetadataKey() function.

This makes quite a difference in my benchmarks.

Change-Id: I47c1525bdedbc8ca26e10ea7480715a7ecd7d5b2
2021-02-11 12:33:08 +00:00
Daimona Eaytoy
4175998db2 Micro-optimize ApiResult::isMetadataKey even more
Since this is a very hot method, it must be really quick. ord() is
useful here, because it discards everything after the first character
and it works with integers.

A quick benchmark on 3v4l reveals that it's consistently faster than
the previoust code on all PHP versions, taking something between
38% and 71% of the current runtime, with an average of 50%.

Follow-up: I368cd3b526edeb247a6ebda7420897a51357407d
Change-Id: I0b471dafd645aeb11ecdc68915c28aff93f809d9
2021-02-08 20:59:09 +00:00
jenkins-bot
53bfbc281c Merge "API: Micro-optimize ApiResult::isMetadataKey()" 2021-01-31 18:34:29 +00:00
Kunal Mehta
ca6bfc79e8 API: Micro-optimize ApiResult::isMetadataKey()
This is an extremely hot function, appearing at the top or second in a
few XHGUI profiles I ran when sorted by self wall time.

We can micro-optimize by switching the substr() function call to check
the 0th character of the string.

In my benchmarking of 1,000,000 loops (see P14054), this went from a
total time of 784.20ms to 651.67ms.

A further optimization could remove checking whether the string is empty
but that would be a behavior change and while I'm pretty sure all API
keys are non-zero length, I'm not 100% sure.

Change-Id: I368cd3b526edeb247a6ebda7420897a51357407d
2021-01-31 00:08:41 -08:00
Ammarpad
57ef9fcaf4 ApiResult: Avoid huge conditional clause
Huge `if` clause is almost always bad. It impacts code readability and
requires a lot of scrolling (both mental and physical) to see the `else`
block and make sense of everything together.

Use early return to improve the code readability. The functionality of
the logic remains the same.

Change-Id: Ibdb706cd35a5fbd219c042a882326c5b21cd18ba
2021-01-30 16:39:53 +00:00
Lucas Werkmeister
1bf4af094f Allow replacing ApiResult value with same value
There’s no need for setValue() to raise an error if the old and new
value are identical.

Bug: T160504
Bug: T202725
Bug: T271105
Change-Id: Icfa6c181666b2293494c67875777d3de8816587a
2021-01-26 15:51:07 +01:00
Tim Starling
9af96ef4c7 Improve custom folding and grouping
PHPStorm can use custom folding regions defined in either the
VisualStudio style or the NetBeans style. The VisualStudio style is more
pleasing to the eye and also works as a vim foldmarker. So get rid of
the previous vim foldmarkers, and use region/endregion.

region/endregion need to be in a single-line comment which is not a doc
comment, and the rest of the comment is used as a region heading (by
both PHPStorm and vim). So to retain Doxygen @name tags, it is
necessary to repeat the section heading, once in a @name and once in a
region. Establish a standard style for this, with a divider and three
spaces before the heading, to better set off the heading name in plain
text.

Besides being the previous vim foldmarker, @{ is also a Doxygen
grouping command. However, almost all prior usages of @{ ... @} in this
sense were broken for one reason or another. It's necessary for the @{
to be in a doc comment, and DISTRIBUTE_GROUP_DOC doesn't work if any of
the individual members in the group are separately documented.

@name alone is sufficient to create a Doxygen section when the sections
are adjacent, but if there is ungrouped content after the section, it
is necessary to use @{ ... @} to avoid having the Doxygen group run on.
So I retained, fixed or added @{ ... @} in certain cases.

I wasn't able to test the changes to the trait documentation in Doxygen
since trait syntax is not recognised and the output is badly broken.

Change-Id: I7d819fdb376c861f40bfc01aed74cd3706141b20
2020-12-23 12:41:47 +11:00
Umherirrender
083a0e57cb Improve docs in api related classes
Change-Id: I78338d48530f098fa5d36fe84cfd45c0d160f444
2020-11-13 23:11:06 +01:00
Thiemo Kreuz
1fc8d79ac6 Remove documentation that literally repeats the code
For example, documenting the method getUser() with "get the User
object" does not add any information that's not already there.
But I have to read the text first to understand that it doesn't
document anything that's not already obvious from the code.

Some of this is from a time when we had a PHPCS sniff that was
complaining when a line like `@param User $user` doesn't end
with some descriptive text. Some users started adding text like
`@param User $user The User` back then. Let's please remove
this.

Change-Id: I0ea8d051bc732466c73940de9259f87ffb86ce7a
2020-10-27 19:20:26 +00:00
Reedy
b80a9f4f6a Fix even more PSR12.Properties.ConstantVisibility.NotFound
Change-Id: I5e04824d6fa6a4c36ce489850bb0ed7b4ac588f9
2020-05-16 00:51:14 +01:00
Daimona Eaytoy
c1200325fc Stop accepting ApiMain instances in ApiResult::__construct
This was deprecated in 1.25, no code doing that:
https://codesearch.wmflabs.org/search/?q=new%20%5C%5C%3FApiResult%5C(%5Cs*(new%7C%5C%24)&i=nope&files=&repos=

Change-Id: I21fff4fa66478d2eada13e2ff801bcd6a58b865a
2020-03-18 15:57:05 +00:00
Umherirrender
2664eeb632 Clean up spacing of doc comments
Align the doc stars and normalize start and end tokens

Change-Id: Ib0d92e128e7b882bb5b838bd00c74fc16ef14303
2019-08-05 22:29:50 +00:00
Kunal Mehta
dac8ba4bd6 API: Fix missing return in ApiResult::addContentValue()
Spotted by phan.

Change-Id: Ifca5e15a1360008b5d91e1b6f483da8e0367819a
2019-03-23 18:06:35 -07:00
Aryeh Gregor
90d4f56fe4 Mass conversion of $wgContLang to service
Brought to you by vim macros.

Bug: T200246
Change-Id: I79e919f4553e3bd3eb714073fed7a43051b4fb2a
2018-08-11 22:44:29 -06:00
Umherirrender
130ec2523d Fix PhanTypeMismatchDeclaredParam
Auto fix MediaWiki.Commenting.FunctionComment.DefaultNullTypeParam sniff

Change-Id: I865323fd0295aabd06f3e3c75e0e5043fb31069e
2018-07-07 00:34:30 +00:00
Bartosz Dziewoński
485f66f174 Use PHP 7 '??' operator instead of '?:' with 'isset()' where convenient
Find: /isset\(\s*([^()]+?)\s*\)\s*\?\s*\1\s*:\s*/
Replace with: '\1 ?? '

(Everywhere except includes/PHPVersionCheck.php)
(Then, manually fix some line length and indentation issues)

Then manually reviewed the replacements for cases where confusing
operator precedence would result in incorrect results
(fixing those in I478db046a1cc162c6767003ce45c9b56270f3372).

Change-Id: I33b421c8cb11cdd4ce896488c9ff5313f03a38cf
2018-05-30 18:06:13 -07:00
Bartosz Dziewoński
52b0799e8d Use PHP 5.6 constant expressions for some bitfield constants
I searched the entire codebase for 'const' and looked for things
that looked suspiciously like manually calculated bitfield unions.
As of PHP 5.6, we can have them calculated automatically when
defining constants.

Change-Id: I7d971d1a63f8916db2f8f6c053c7dd0a13add92d
2018-05-30 18:05:18 -07:00
Kunal Mehta
d1cf48a397 build: Update mediawiki/mediawiki-codesniffer to 0.10.1
And auto-fix all errors.

The `<exclude-pattern>` stanzas are now included in the default ruleset
and don't need to be repeated.

Change-Id: I928af549dc88ac2c6cb82058f64c7c7f3111598a
2017-07-22 18:24:09 -07:00
James D. Forrester
50e796e948 includes/api: Replace implicitly-Bugzilla bug numbers with Phab ones
It's unreasonable to expect newbies to know that "bug 12345" means "Task T14345"
except where it doesn't, so let's just standardise on the real numbers.

Change-Id: I49e2a10350a328a8572fcedd44012751a29e1068
2017-02-24 16:41:47 +00:00
Brad Jorsch
a066419628 ApiResult: Add ApiResult::formatExpiry()
This allows for removing $wgContLang from many API modules where it was
only used to call $wgContLang->formatExpiry() in a way in which the
results don't actually depend on the language.

Change-Id: Ib0f25f288b9b87d2e4131297c552e5971696db87
2017-01-11 11:11:19 -08:00
Brad Jorsch
4e6810e4a2 API: i18n for warnings and errors
API warnings and error messages are currently hard-coded English
strings. This patch changes that.

With a few exceptions, this patch should be compatible with non-updated
extensions:
* The change to ApiBase::$messageMap will blow up anything trying to
  mess with it.
* The changes to the 'ApiCheckCanExecute' hook will cause a wrong
  (probably unparsed) error message to be emitted for extensions not
  already using an ApiMessage. Unless they're currently broken like
  Wikibase.

Bug: T37074
Bug: T47843
Depends-On: Ia2b66b57cd4eaddc30b3ffdd7b97d6ca3e02d898
Depends-On: I2e1bb975bb0045476c03ebe6cdec00259bae22ec
Depends-On: I53987bf87c48f6c00deec17a8e957d24fcc3eaa6
Depends-On: Ibf93a459eb62d30f7c70d20e91ec9faeb80d10ed
Depends-On: I3cf889811f44a15935e454dd42f081164d4a098c
Depends-On: Ieae527de86735ddcba34724730e8730fb277b99b
Depends-On: I535344c29d51521147c2a26c341dae38cec3e931
Change-Id: Iae0e2ce3bd42dd4776a9779664086119ac188412
2016-12-06 10:20:48 -05:00
Brad Jorsch
892c31ebaf API: Remove deprecated methods
All deprecated ApiResult methods are removed. These have been deprecated
since 1.24 or 1.25, and the only users remaining in Gerrit are wrapped
in backwards-compatibility checks and so should not be being called.

ApiBase, ApiFormatBase, ApiMain, and ApiQuery methods for generating the
pre-Ib14c00df help text are removed. Nothing has called these for a long
time, and only Flow implemented them in any way. Deprecated methods for
providing the text for such help, such as getDescription(), haven't been
removed yet, though, since some extensions still call some of them.

Change-Id: I3ca7c98174b4a3f6f67f2b023e0f4446637e7a84
2016-09-20 17:21:00 -04:00
Bartosz Dziewoński
f465c7feb4 ApiResult: Remove double space in error message
Change-Id: I5888d617ab9aebe5ae1fe4da6873639a81f60fc3
2016-08-29 16:02:04 +02:00
Amir Sarabadani
8771ae9872 Clean up array() syntax in docs, part II
Change-Id: I226ce6bcb5bbf6ed3802042dd2790f85617833e1
2016-08-07 14:57:38 +04:30
Amir Sarabadani
7fd83c2102 Clean up array() in docs, Part I
Change-Id: Ia6bb3944c05b056677979035cb38385554ee8a4f
2016-07-25 17:15:18 +04:30
Ricordisamoa
1617e7822e Always use 'bool' instead of 'boolean' in Doxygen tags
Just like commit f86a5590aa

Change-Id: Ic9d08bca6524d6bb4baf5170c081ad0f3d738e28
2016-03-24 09:44:09 +01:00
Siebrand Mazeland
5b119a0e44 Replace uses of join() by implode()
All of core uses implode() consistently now.

Change-Id: Iba50898c64c43f356d1caf8869f484e90d9ff651
2016-03-08 18:24:16 +00:00
Siebrand Mazeland
bc0ae710e3 Use single quotes in API where possible
Change-Id: I972e296f4820f78f5dfcecc27bc4912ca84a3178
2016-03-08 17:27:00 +01:00
Kunal Mehta
6e9b4f0e9c Convert all array() syntax to []
Per wikitech-l consensus:
 https://lists.wikimedia.org/pipermail/wikitech-l/2016-February/084821.html

Notes:
* Disabled CallTimePassByReference due to false positives (T127163)

Change-Id: I2c8ce713ce6600a0bb7bf67537c87044c7a45c4b
2016-02-17 01:33:00 -08:00
Brad Jorsch
8deb49f534 API: Work around PHP bug 45959
Sigh, PHP. You allow for an array to have string "1" as a key (e.g. when
casting from object to array), but then you do everything wrong when
trying to deal with it.

Bug: T123663
Change-Id: I49f09901a69aab39ca1519bbe9e41267bf9a1216
2016-01-14 16:13:04 -05:00
Yuri Astrakhan
393378d2cb Fixed incorrect size for api result
Added a unit test to highlight the problem

Change-Id: I5d4bcb755bd3686a92e7b111946a49892699729f
2015-12-12 15:59:32 +00:00
Reedy
0a787f60ac Add/update phpdoc
Change-Id: I9cb6f041a0242c3257a24aac6538f7fbbca60cb0
2015-11-07 21:25:04 +00:00
Reedy
32ff1f4c47 Remove various unused variables
Change-Id: I4b1b20b4126735cb32a80e473fe48d523bcb24d1
2015-11-07 21:22:17 +00:00
Brad Jorsch
f9c1bfa594 API: Finish killing "raw mode"
It was kept around in the ApiResult rewrite because Wikibase was
(mis)using it as an "XML mode" flag.

Bug: T96596
Change-Id: Ic8259649c8cb0cce0444c907607c36d96fb2eb7e
2015-09-17 13:51:45 +00:00
jeroendedauw
10d117368f Remove return of void method results
Change-Id: I095ba37ceb150fcb7bee9df80201437c78426938
2015-09-10 18:45:22 +00:00
Brad Jorsch
46322fff07 ApiResult: Fix size checking
Two bugs here:
* Setting NO_SIZE_CHECK also bypassed validation
* ApiResult::valueSize() didn't handle ApiSerializable, which is fixed
  by defining that the value needs to be passed through
  ApiResult::validateValue() first.

Bug: T111796
Change-Id: I7c00d8ee53364a26f8f63f82a4d83b92baf5383e
2015-09-08 11:40:23 -04:00
Brad Jorsch
0841b74ca1 Comment typo fix
Change-Id: I52e36f1ecbef8e8c18066d3dde84bda086ef9808
2015-08-31 10:32:06 -04:00
Brad Jorsch
0ec057e73c API: Add ApiResult::META_KVP_MERGE
This allows for merging the KVP key into the value for the alternative
output format. Specifically,

 { "key": { "foo": "bar" } }

can now be turned into

 [{ "name": "key", "foo": "bar" }]

instead of

 [{ "name": "key", "value": { "foo": "bar" } }]

Change-Id: Ie1f9235893dbbcd2948c46e0356360b5635a3ddd
2015-08-28 11:10:20 -04:00
Marc Ordinas i Llopis
8929182a67 Expose RL modules and js config vars in action=expandtemplates
Adds the 'modules', 'jsconfigvars', and 'encodedjsconfigvars' props
to action=expandtemplates, that output the modules and Javascript
configuration variables added to ResourceLoader by extensions and
parser functions, in the same way action=parse does.

This is needed by Parsoid to correctly include all modules used by
parser functions.

Based on I5c3ccb25385e57633639bb0c7e6f562eb58b05a2 by @Jackmcbarn.

Bug: T69540
Change-Id: Iaf58c66c987a318c0dd1ee2b81774106c40e7561
2015-06-05 09:04:47 -07:00
Brad Jorsch
0e61e0edd2 API: Ignore META_BC_SUBELEMENTS elements that aren't actually set
Shouldn't happen, but if it does let's not log a bunch of warnings.

Bug: T98185
Change-Id: I7e626ab2c829633a84f3db0358080011baf5d9f2
2015-05-05 16:19:16 -04:00
Brad Jorsch
ce6e288ee8 API: ApiResult must validate even when using numeric auto-indexes
Bug: T97490
Change-Id: I5301a615a992b090000a59f86e13b9f78dcd5aec
2015-04-29 10:43:45 -04:00
jenkins-bot
f34b83ef67 Merge "API: Add wfDeprecated() to deprecated ApiResult methods" 2015-04-21 20:39:15 +00:00
Brad Jorsch
beab6b009e Change API result data structure to be cleaner in new formats
Nothing in this patch should result in changed output for format=json or
format=php except as noted in RELEASE-NOTES-1.25, and changed output for
format=xml should be similar or cosmetic. However, other code accessing
the result data directly may need to be updated.

Bug: T87053
Bug: T12887
Change-Id: I3500708965cb8869b5aed1543381aad208dadd13
2015-04-20 17:49:37 -04:00
Brad Jorsch
0c86649f4b API: Add wfDeprecated() to deprecated ApiResult methods
Bug: T96596
Change-Id: Ib0068b4cd3cc9c1765d82a8ade7b3d435c57f1d5
2015-04-20 16:20:24 -04:00