diff --git a/src/Symfony/Bridge/Monolog/Handler/SwiftMailerHandler.php b/src/Symfony/Bridge/Monolog/Handler/SwiftMailerHandler.php index fcbd98ac7d..c912614a2a 100644 --- a/src/Symfony/Bridge/Monolog/Handler/SwiftMailerHandler.php +++ b/src/Symfony/Bridge/Monolog/Handler/SwiftMailerHandler.php @@ -59,6 +59,14 @@ class SwiftMailerHandler extends BaseSwiftMailerHandler } } + /** + * {@inheritdoc} + */ + public function reset() + { + $this->flushMemorySpool(); + } + /** * Flushes the mail queue if a memory spool is used. */ diff --git a/src/Symfony/Bridge/Twig/TokenParser/TransChoiceTokenParser.php b/src/Symfony/Bridge/Twig/TokenParser/TransChoiceTokenParser.php index 5261d7ad52..1cda1dcb3c 100644 --- a/src/Symfony/Bridge/Twig/TokenParser/TransChoiceTokenParser.php +++ b/src/Symfony/Bridge/Twig/TokenParser/TransChoiceTokenParser.php @@ -68,7 +68,7 @@ class TransChoiceTokenParser extends TransTokenParser $body = $this->parser->subparse(array($this, 'decideTransChoiceFork'), true); if (!$body instanceof TextNode && !$body instanceof AbstractExpression) { - throw new SyntaxError('A message inside a transchoice tag must be a simple text.', $body->getTemplateLine(), $stream->getSourceContext()->getName()); + throw new SyntaxError('A message inside a transchoice tag must be a simple text.', $body->getTemplateLine(), $stream->getSourceContext()); } $stream->expect(Token::BLOCK_END_TYPE); diff --git a/src/Symfony/Bridge/Twig/TokenParser/TransTokenParser.php b/src/Symfony/Bridge/Twig/TokenParser/TransTokenParser.php index 76c8dc0610..5fe2255fcd 100644 --- a/src/Symfony/Bridge/Twig/TokenParser/TransTokenParser.php +++ b/src/Symfony/Bridge/Twig/TokenParser/TransTokenParser.php @@ -60,7 +60,7 @@ class TransTokenParser extends AbstractTokenParser $stream->next(); $locale = $this->parser->getExpressionParser()->parseExpression(); } elseif (!$stream->test(Token::BLOCK_END_TYPE)) { - throw new SyntaxError('Unexpected token. Twig was looking for the "with", "from", or "into" keyword.', $stream->getCurrent()->getLine(), $stream->getSourceContext()->getName()); + throw new SyntaxError('Unexpected token. Twig was looking for the "with", "from", or "into" keyword.', $stream->getCurrent()->getLine(), $stream->getSourceContext()); } } @@ -69,7 +69,7 @@ class TransTokenParser extends AbstractTokenParser $body = $this->parser->subparse(array($this, 'decideTransFork'), true); if (!$body instanceof TextNode && !$body instanceof AbstractExpression) { - throw new SyntaxError('A message inside a trans tag must be a simple text.', $body->getTemplateLine(), $stream->getSourceContext()->getName()); + throw new SyntaxError('A message inside a trans tag must be a simple text.', $body->getTemplateLine(), $stream->getSourceContext()); } $stream->expect(Token::BLOCK_END_TYPE); diff --git a/src/Symfony/Component/Console/composer.json b/src/Symfony/Component/Console/composer.json index d3aadfbc1d..3a11972c1b 100644 --- a/src/Symfony/Component/Console/composer.json +++ b/src/Symfony/Component/Console/composer.json @@ -27,11 +27,14 @@ "symfony/process": "~3.4|~4.0", "psr/log": "~1.0" }, + "provide": { + "psr/log-implementation": "1.0" + }, "suggest": { "symfony/event-dispatcher": "", "symfony/lock": "", "symfony/process": "", - "psr/log-implementation": "For using the console logger" + "psr/log": "For using the console logger" }, "conflict": { "symfony/dependency-injection": "<3.4", diff --git a/src/Symfony/Component/CssSelector/Tests/XPath/TranslatorTest.php b/src/Symfony/Component/CssSelector/Tests/XPath/TranslatorTest.php index 610458297e..92957df5f1 100644 --- a/src/Symfony/Component/CssSelector/Tests/XPath/TranslatorTest.php +++ b/src/Symfony/Component/CssSelector/Tests/XPath/TranslatorTest.php @@ -12,8 +12,12 @@ namespace Symfony\Component\CssSelector\Tests\XPath; use PHPUnit\Framework\TestCase; +use Symfony\Component\CssSelector\Node\ElementNode; +use Symfony\Component\CssSelector\Node\FunctionNode; +use Symfony\Component\CssSelector\Parser\Parser; use Symfony\Component\CssSelector\XPath\Extension\HtmlExtension; use Symfony\Component\CssSelector\XPath\Translator; +use Symfony\Component\CssSelector\XPath\XPathExpr; class TranslatorTest extends TestCase { @@ -31,6 +35,73 @@ class TranslatorTest extends TestCase $this->assertEquals($xpath, $translator->cssToXPath($css, '')); } + /** + * @expectedException \Symfony\Component\CssSelector\Exception\ExpressionErrorException + */ + public function testCssToXPathPseudoElement() + { + $translator = new Translator(); + $translator->registerExtension(new HtmlExtension($translator)); + $translator->cssToXPath('e::first-line'); + } + + /** + * @expectedException \Symfony\Component\CssSelector\Exception\ExpressionErrorException + */ + public function testGetExtensionNotExistsExtension() + { + $translator = new Translator(); + $translator->registerExtension(new HtmlExtension($translator)); + $translator->getExtension('fake'); + } + + /** + * @expectedException \Symfony\Component\CssSelector\Exception\ExpressionErrorException + */ + public function testAddCombinationNotExistsExtension() + { + $translator = new Translator(); + $translator->registerExtension(new HtmlExtension($translator)); + $parser = new Parser(); + $xpath = $parser->parse('*')[0]; + $combinedXpath = $parser->parse('*')[0]; + $translator->addCombination('fake', $xpath, $combinedXpath); + } + + /** + * @expectedException \Symfony\Component\CssSelector\Exception\ExpressionErrorException + */ + public function testAddFunctionNotExistsFunction() + { + $translator = new Translator(); + $translator->registerExtension(new HtmlExtension($translator)); + $xpath = new XPathExpr(); + $function = new FunctionNode(new ElementNode(), 'fake'); + $translator->addFunction($xpath, $function); + } + + /** + * @expectedException \Symfony\Component\CssSelector\Exception\ExpressionErrorException + */ + public function testAddPseudoClassNotExistsClass() + { + $translator = new Translator(); + $translator->registerExtension(new HtmlExtension($translator)); + $xpath = new XPathExpr(); + $translator->addPseudoClass($xpath, 'fake'); + } + + /** + * @expectedException \Symfony\Component\CssSelector\Exception\ExpressionErrorException + */ + public function testAddAttributeMatchingClassNotExistsClass() + { + $translator = new Translator(); + $translator->registerExtension(new HtmlExtension($translator)); + $xpath = new XPathExpr(); + $translator->addAttributeMatching($xpath, '', '', ''); + } + /** @dataProvider getXmlLangTestData */ public function testXmlLang($css, array $elementsId) { diff --git a/src/Symfony/Component/Debug/DebugClassLoader.php b/src/Symfony/Component/Debug/DebugClassLoader.php index 9933e123a5..22bc9380d6 100644 --- a/src/Symfony/Component/Debug/DebugClassLoader.php +++ b/src/Symfony/Component/Debug/DebugClassLoader.php @@ -123,6 +123,14 @@ class DebugClassLoader } } + /** + * @return string|null + */ + public function findFile($class) + { + return $this->isFinder ? $this->classLoader[0]->findFile($class) ?: null : null; + } + /** * Loads the given class or interface. * diff --git a/src/Symfony/Component/DependencyInjection/Compiler/ResolveBindingsPass.php b/src/Symfony/Component/DependencyInjection/Compiler/ResolveBindingsPass.php index 8cd4aada66..a63b6def41 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/ResolveBindingsPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/ResolveBindingsPass.php @@ -34,8 +34,6 @@ class ResolveBindingsPass extends AbstractRecursivePass */ public function process(ContainerBuilder $container) { - $this->usedBindings = $container->getRemovedBindingIds(); - try { parent::process($container); diff --git a/src/Symfony/Component/DependencyInjection/ContainerBuilder.php b/src/Symfony/Component/DependencyInjection/ContainerBuilder.php index c7d99aade2..89135fc767 100644 --- a/src/Symfony/Component/DependencyInjection/ContainerBuilder.php +++ b/src/Symfony/Component/DependencyInjection/ContainerBuilder.php @@ -122,8 +122,6 @@ class ContainerBuilder extends Container implements TaggedContainerInterface private $removedIds = array(); - private $removedBindingIds = array(); - private static $internalTypes = array( 'int' => true, 'float' => true, @@ -500,8 +498,7 @@ class ContainerBuilder extends Container implements TaggedContainerInterface throw new BadMethodCallException(sprintf('Setting service "%s" for an unknown or non-synthetic service definition on a compiled container is not allowed.', $id)); } - $this->removeId($id); - unset($this->removedIds[$id]); + unset($this->definitions[$id], $this->aliasDefinitions[$id], $this->removedIds[$id]); parent::set($id, $service); } @@ -514,7 +511,8 @@ class ContainerBuilder extends Container implements TaggedContainerInterface public function removeDefinition($id) { if (isset($this->definitions[$id = (string) $id])) { - $this->removeId($id); + unset($this->definitions[$id]); + $this->removedIds[$id] = true; } } @@ -836,8 +834,7 @@ class ContainerBuilder extends Container implements TaggedContainerInterface throw new InvalidArgumentException(sprintf('An alias can not reference itself, got a circular reference on "%s".', $alias)); } - $this->removeId($alias); - unset($this->removedIds[$alias]); + unset($this->definitions[$alias], $this->removedIds[$alias]); return $this->aliasDefinitions[$alias] = $id; } @@ -850,7 +847,8 @@ class ContainerBuilder extends Container implements TaggedContainerInterface public function removeAlias($alias) { if (isset($this->aliasDefinitions[$alias = (string) $alias])) { - $this->removeId($alias); + unset($this->aliasDefinitions[$alias]); + $this->removedIds[$alias] = true; } } @@ -979,8 +977,7 @@ class ContainerBuilder extends Container implements TaggedContainerInterface $id = (string) $id; - $this->removeId($id); - unset($this->removedIds[$id]); + unset($this->aliasDefinitions[$id], $this->removedIds[$id]); return $this->definitions[$id] = $definition; } @@ -1482,18 +1479,6 @@ class ContainerBuilder extends Container implements TaggedContainerInterface return $services; } - /** - * Gets removed binding ids. - * - * @return array - * - * @internal - */ - public function getRemovedBindingIds() - { - return $this->removedBindingIds; - } - /** * Computes a reasonably unique hash of a value. * @@ -1598,21 +1583,4 @@ class ContainerBuilder extends Container implements TaggedContainerInterface return false; } - - private function removeId($id) - { - $this->removedIds[$id] = true; - unset($this->aliasDefinitions[$id]); - - if (!isset($this->definitions[$id])) { - return; - } - - foreach ($this->definitions[$id]->getBindings() as $binding) { - list(, $identifier) = $binding->getValues(); - $this->removedBindingIds[$identifier] = true; - } - - unset($this->definitions[$id]); - } } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveBindingsPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveBindingsPassTest.php index 24909e1155..d59b95af5c 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveBindingsPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveBindingsPassTest.php @@ -111,22 +111,4 @@ class ResolveBindingsPassTest extends TestCase $this->assertEquals(array(array('setDefaultLocale', array('fr'))), $definition->getMethodCalls()); } - - public function testOverriddenBindings() - { - $container = new ContainerBuilder(); - - $binding = new BoundArgument('bar'); - - $container->register('foo', 'stdClass') - ->setBindings(array('$foo' => clone $binding)); - $container->register('bar', 'stdClass') - ->setBindings(array('$foo' => clone $binding)); - - $container->register('foo', 'stdClass'); - - (new ResolveBindingsPass())->process($container); - - $this->assertInstanceOf('stdClass', $container->get('foo')); - } } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveChildDefinitionsPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveChildDefinitionsPassTest.php index 9a39159aa1..a1630691ea 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveChildDefinitionsPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveChildDefinitionsPassTest.php @@ -399,7 +399,7 @@ class ResolveChildDefinitionsPassTest extends TestCase /** * @expectedException \Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException - * @expectedExceptionMessageRegExp /^Circular reference detected for service "a", path: "a -> c -> b -> a"./ + * @expectedExceptionMessageRegExp /^Circular reference detected for service "c", path: "c -> b -> a -> c"./ */ public function testProcessDetectsChildDefinitionIndirectCircularReference() { diff --git a/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php b/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php index 2102c750c4..82a4921e7c 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php @@ -559,7 +559,7 @@ class ContainerBuilderTest extends TestCase $config->setDefinition('baz', new Definition('BazClass')); $config->setAlias('alias_for_foo', 'foo'); $container->merge($config); - $this->assertEquals(array('foo', 'bar', 'service_container', 'baz'), array_keys($container->getDefinitions()), '->merge() merges definitions already defined ones'); + $this->assertEquals(array('service_container', 'foo', 'bar', 'baz'), array_keys($container->getDefinitions()), '->merge() merges definitions already defined ones'); $aliases = $container->getAliases(); $this->assertArrayHasKey('alias_for_foo', $aliases); diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/instanceof.expected.yml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/instanceof.expected.yml index 9f0bfbba78..b12a304221 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/instanceof.expected.yml +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/instanceof.expected.yml @@ -4,9 +4,6 @@ services: class: Symfony\Component\DependencyInjection\ContainerInterface public: true synthetic: true - foo: - class: App\FooService - public: true Symfony\Component\DependencyInjection\Tests\Fixtures\Prototype\Foo: class: Symfony\Component\DependencyInjection\Tests\Fixtures\Prototype\Foo public: true @@ -19,3 +16,6 @@ services: shared: false configurator: c + foo: + class: App\FooService + public: true diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/prototype.expected.yml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/prototype.expected.yml index 0af4d530a0..ebfe087d77 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/prototype.expected.yml +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/prototype.expected.yml @@ -4,6 +4,15 @@ services: class: Symfony\Component\DependencyInjection\ContainerInterface public: true synthetic: true + Symfony\Component\DependencyInjection\Tests\Fixtures\Prototype\Foo: + class: Symfony\Component\DependencyInjection\Tests\Fixtures\Prototype\Foo + public: true + tags: + - { name: foo } + - { name: baz } + deprecated: '%service_id%' + arguments: [1] + factory: f Symfony\Component\DependencyInjection\Tests\Fixtures\Prototype\Sub\Bar: class: Symfony\Component\DependencyInjection\Tests\Fixtures\Prototype\Sub\Bar public: true @@ -14,12 +23,3 @@ services: lazy: true arguments: [1] factory: f - Symfony\Component\DependencyInjection\Tests\Fixtures\Prototype\Foo: - class: Symfony\Component\DependencyInjection\Tests\Fixtures\Prototype\Foo - public: true - tags: - - { name: foo } - - { name: baz } - deprecated: '%service_id%' - arguments: [1] - factory: f diff --git a/src/Symfony/Component/Form/Test/Traits/ValidatorExtensionTrait.php b/src/Symfony/Component/Form/Test/Traits/ValidatorExtensionTrait.php index d5bcb04a4d..07dd9e0d55 100644 --- a/src/Symfony/Component/Form/Test/Traits/ValidatorExtensionTrait.php +++ b/src/Symfony/Component/Form/Test/Traits/ValidatorExtensionTrait.php @@ -18,8 +18,14 @@ use Symfony\Component\Validator\Validator\ValidatorInterface; trait ValidatorExtensionTrait { + /** + * @var ValidatorInterface|null + */ protected $validator; + /** + * @return ValidatorExtension + */ protected function getValidatorExtension() { if (!interface_exists(ValidatorInterface::class)) { @@ -31,9 +37,9 @@ trait ValidatorExtensionTrait } $this->validator = $this->getMockBuilder(ValidatorInterface::class)->getMock(); - $metadata = $this->getMockBuilder(ClassMetadata::class)->disableOriginalConstructor()->setMethods(array('addPropertyConstraint'))->getMock(); + $metadata = $this->getMockBuilder(ClassMetadata::class)->disableOriginalConstructor()->setMethods(['addPropertyConstraint'])->getMock(); $this->validator->expects($this->any())->method('getMetadataFor')->will($this->returnValue($metadata)); - $this->validator->expects($this->any())->method('validate')->will($this->returnValue(array())); + $this->validator->expects($this->any())->method('validate')->will($this->returnValue([])); return new ValidatorExtension($this->validator); } diff --git a/src/Symfony/Component/Validator/ContainerConstraintValidatorFactory.php b/src/Symfony/Component/Validator/ContainerConstraintValidatorFactory.php index 43c8a0d7cb..62e5530dc2 100644 --- a/src/Symfony/Component/Validator/ContainerConstraintValidatorFactory.php +++ b/src/Symfony/Component/Validator/ContainerConstraintValidatorFactory.php @@ -28,7 +28,7 @@ class ContainerConstraintValidatorFactory implements ConstraintValidatorFactoryI public function __construct(ContainerInterface $container) { $this->container = $container; - $this->validators = array(); + $this->validators = []; } /** @@ -46,7 +46,7 @@ class ContainerConstraintValidatorFactory implements ConstraintValidatorFactoryI $this->validators[$name] = $this->container->get($name); } else { if (!class_exists($name)) { - throw new ValidatorException(sprintf('Constraint validator "%s" does not exist or it is not enabled. Check the "validatedBy" method in your constraint class "%s".', $name, \get_class($constraint))); + throw new ValidatorException(sprintf('Constraint validator "%s" does not exist or is not enabled. Check the "validatedBy" method in your constraint class "%s".', $name, \get_class($constraint))); } $this->validators[$name] = new $name();