Core Platform Team/Initiative/Stability annotations/newable

List of classes intended to be "newable".

Data objects
includes/title/TitleValue.php includes/Revision/RevisionSlots.php includes/Revision/MutableRevisionRecord.php includes/DerivativeRequest.php includes/MWTimestamp.php includes/mail/MailAddress.php includes/session/Token.php includes/session/SessionId.php includes/user/LoggedOutEditToken.php includes/user/UserIdentityValue.php includes/exception/ErrorPageError.php includes/exception/MWException.php includes/FauxRequest.php includes/libs/Message/MessageValue.php includes/libs/Message/DataMessageValue.php includes/libs/Message/ScalarParam.php includes/libs/Message/ListParam.php includes/libs/HtmlArmor.php includes/session/SessionInfo.php includes/RawMessage.php includes/api/ApiHelpParamValueMessage.php includes/api/ApiMessage.php includes/api/ApiRawMessage.php includes/language/Message.php includes/cache/dependency/FileDependency.php includes/config/GlobalVarConfig.php includes/libs/StaticArrayWriter.php includes/libs/StatusValue.php includes/parser/StripState.php includes/Status.php includes/content/TextContent.php includes/content/WikitextContent.php includes/content/JavaScriptContent.php includes/content/CssContent.php

Also: (nearly) all Exceptions!

Wrapper objects
includes/libs/objectcache/HashBagOStuff.php includes/libs/objectcache/CachedBagOStuff.php includes/utils/BatchRowIterator.php includes/StubObject.php includes/ListToggle.php includes/context/DerivativeContext.php

Tolerated, but need an alternative
These should be changed to not be newable, but alternatives need to be created first. Direct constructor usage will have to go though deprecation.

includes/ApiMain.php - needs factory includes/media/BitmapMetadataHandler.php - should become a stateless service or use handler pattern includes/GitInfo.php - should become a stateless service includes/logging/LogPage.php - should become a stateless service or use command pattern includes/logging/ManualLogEntry.php - should become a stateless service or use command pattern includes/poolcounter/PoolCounterWorkViaCallback.php - needs a factory includes/context/RequestContext.php - needs to be narrowed down, and should use a factory includes/search/SearchHighlighter.php - should have a factory includes/TitleArrayFromResult.php - should perhaps be part of TitleFactory includes/user/User.php - should at least get a factory method for anons includes/diff/Diff.php: needs a TextDiffGenerator service or a factory includes/EditPage.php: needs a factory

DiffFormatter may need services, but the caller usually wants to control the specific type. Each could be a service, or we could have a registry for them. includes/diff/ArrayDiffFormatter.php includes/diff/UnifiedDiffFormatter.php includes/diff/TableDiffFormatter.php includes/diff/InlineDiffFormatter.php

Classes instantiated by extensions that should not be
Alternatives exist for:

includes/CommentStoreComment.php: FileImporter should use a factory method or mocks when constructing CommentStoreComment in tests. includes/Revision/SlotRecord.php: Wikibase should use a factory method or mocks when constructing SlotRecords in tests. includes/Title.php: several extensions need a better way to represent no title. includes/cache/LinkBatch.php: several extensions should use LinkBatchFactory instead. includes/interwiki/Interwiki.php JsonConfig: FauxInterwikiLookup includes/page/Article.php: several extensions should use Article::newFromTitle instead. includes/page/WikiPage.php: several extensions should use WikiPage::factory instead. maintenance/includes/FakeMaintenance.php: OpenIDConnect needs to find a better way to run a maintenance script. includes/filerepo/LocalRepo.php: some extensions should use RepoGroup instead. includes/MovePage.php: several extensions should use MovePageFactory instead. includes/parser/Parser.php: several extensions should use ParserFactory instead. includes/parser/ParserOptions.php: several extensions should use one of the static factory methods instead.