Fix detectMappingType if the entity contain a package attribute#2115
Conversation
092e5f7 to
1e2cb74
Compare
| if ( | ||
| preg_match('/^(?: \*|\/\*\*) @.*' . $quotedMappingObjectName . '\b/m', $content) | ||
| || preg_match('/^(?: \*|\/\*\*) @.*Embeddable\b/m', $content) | ||
| preg_match('/^(?: \*|\/\*\*) @[a-zA-Z\\\\]*' . $quotedMappingObjectName . '\b/m', $content) |
There was a problem hiding this comment.
a-zA-Z is not the range of characters allowed in PHP namespaces. Your current regex will reject some valid class names.
There was a problem hiding this comment.
Yes, my bad and thank for the feedback
| preg_match('/^(?: \*|\/\*\*) @[a-zA-Z\\\\]*' . $quotedMappingObjectName . '\b/m', $content) | ||
| || preg_match('/^(?: \*|\/\*\*) @[a-zA-Z\\\\]*Embeddable\b/m', $content) | ||
| preg_match('/^(?: \*|\/\*\*) @\\\\?([a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*\\\\?)*' . $quotedMappingObjectName . '\b/m', $content) | ||
| || preg_match('/^(?: \*|\/\*\*) @\\\\?([a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*\\\\?)*Embeddable\b/m', $content) |
There was a problem hiding this comment.
This regex is becoming hard to read. Please use the x modifier and add comments.
There was a problem hiding this comment.
I'm not familiar with the x modifier, so I'll take a look and update the code.
Note: I'm away for a few day, so I'm happy to update the pr but it will only be tuesday.
There was a problem hiding this comment.
Don't worry, I'm not in a hurry 😉
Currently I need to create a bundle for each positive test case ( |
That seems overkill when what you truly want to do is test a regex against a string. |
Ok for me, was thinking about that but afraid to change too much the structure :) |
|
The regex-based detection logic is removed in 3.0.x so don't worry too much about the structure, it will eventually be OK. |
| { | ||
| return preg_match('/^(?:[ ]\*|\/\*\*)[ ]@ # Match phpdoc start or line with an at | ||
| \\\\? # Can start with antislash | ||
| ([a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*\\\\?)* # Match 0-n namespace, the antislash is optionnal as it may be a prefix if an alias is used |
There was a problem hiding this comment.
| ([a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*\\\\?)* # Match 0-n namespace, the antislash is optionnal as it may be a prefix if an alias is used | |
| ([a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*\\\\?)* # Match 0-n namespace, the antislash is optional as it may be a prefix if an alias is used |
There was a problem hiding this comment.
Also, what do you mean by "0-n namespace"? It seems you're saying that in Doctrine\DoctrineBundle, DoctruneBundle is a namespace, which it isn't, only Doctrine and Doctrine\DoctrineBundle are.
There was a problem hiding this comment.
Yes, that it, to say that it can be of namespace component like Doctrine or DoctrineBundle.
I can replace by Match namespace, the antislash is optional as it may be a prefix if an alias is used if you prefer ?
There was a problem hiding this comment.
Or "Match namespace components", just like you wrote above. That's fine.
| \\\\? # Can start with antislash | ||
| ([a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*\\\\?)* # Match 0-n namespace, the antislash is optionnal as it may be a prefix if an alias is used | ||
| ' . $quotedMappingObjectName . ' # The target class | ||
| [a-zA-Z0-9_\x80-\xff]* # Match a suffix if the class is aliased |
There was a problem hiding this comment.
this does not make sense. Aliasing a class does not restrict it to apply a suffix anyway, and it would match unrelated things. This part should be reverted.
There was a problem hiding this comment.
The idea was to match also if you have :
use Doctrine\ORM\Mapping\Entity as ORMEntity;
use Doctrine\ORM\Mapping\Entity as EntityORM;
/** @EntityORM */
/** @ORMEntity */
class Something { ... }
But yes, if you alias to DatabaseObject it would not match like the previous version.
Do you still want me to revert this part ?
There was a problem hiding this comment.
if we want to matching these, we would have to match it only when there is no namespace part (we cannot have a namespace reference before an aliased name). And making it reliable would require inspecting use statements to detect such aliases, which is overkill IMO (if the detection fails, the dev can always provide a type explicitly)
| { | ||
| return preg_match('/^(?:[ ]\*|\/\*\*)[ ]@ # Match phpdoc start or line with an at | ||
| \\\\? # Can start with antislash | ||
| ([a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*\\\\?)* # Match 0-n namespace, the antislash is optionnal as it may be a prefix if an alias is used |
There was a problem hiding this comment.
-1 for the part about the prefix thing. This leads to matching anyway annotation that has Entity somewhere in its name).
We should keep checking for the Entity word
|
I've fixed the build in #2125 , you may want to rebase. |
26ff530 to
126ec9e
Compare
|
Thank for the fixes, the rebase is done |
|
Thanks @jtattevin ! |
Update the regex used to discover if the class is using annotations or attribute to fix the case
Fix #2111