|
8 | 8 | import com.jetbrains.php.lang.psi.elements.Method;
|
9 | 9 | import com.jetbrains.php.lang.psi.elements.PhpClass;
|
10 | 10 | import com.jetbrains.php.lang.psi.elements.StringLiteralExpression;
|
11 |
| -import fr.adrienbrault.idea.symfony2plugin.doctrine.EntityHelper; |
12 |
| -import fr.adrienbrault.idea.symfony2plugin.doctrine.dict.DoctrineModelField; |
13 |
| -import fr.adrienbrault.idea.symfony2plugin.doctrine.dict.DoctrineModelFieldLookupElement; |
14 |
| -import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil; |
15 | 11 | import fr.adrienbrault.idea.symfony2plugin.util.StringUtils;
|
16 | 12 | import org.jetbrains.annotations.NotNull;
|
17 | 13 |
|
18 | 14 | import java.util.*;
|
| 15 | +import java.util.stream.Collectors; |
19 | 16 |
|
20 | 17 | /**
|
21 | 18 | * @author Daniel Espendiller <daniel@espendiller.net>
|
22 | 19 | */
|
23 |
| -public class FormUnderscoreMethodReference extends PsiPolyVariantReferenceBase<PsiElement> { |
24 |
| - |
25 |
| - private StringLiteralExpression element; |
| 20 | +public class FormUnderscoreMethodReference extends PsiPolyVariantReferenceBase<StringLiteralExpression> { |
| 21 | + @NotNull |
26 | 22 | private PhpClass phpClass;
|
27 | 23 |
|
28 |
| - public FormUnderscoreMethodReference(@NotNull StringLiteralExpression element, PhpClass phpClass) { |
| 24 | + public FormUnderscoreMethodReference(@NotNull StringLiteralExpression element, @NotNull PhpClass phpClass) { |
29 | 25 | super(element);
|
30 |
| - this.element = element; |
31 | 26 | this.phpClass = phpClass;
|
32 | 27 | }
|
33 | 28 |
|
34 | 29 | @NotNull
|
35 | 30 | @Override
|
36 | 31 | public ResolveResult[] multiResolve(boolean incompleteCode) {
|
37 |
| - |
38 | 32 | Collection<PsiElement> psiElements = new ArrayList<>();
|
39 | 33 |
|
40 |
| - String value = element.getContents(); |
41 |
| - for(DoctrineModelField field: EntityHelper.getModelFields(this.phpClass)) { |
42 |
| - if(value.equals(field.getName())) { |
43 |
| - psiElements.addAll(field.getTargets()); |
44 |
| - } |
45 |
| - } |
| 34 | + Set<String> methods = getCamelizeAndUnderscoreString(getElement().getContents()); |
46 | 35 |
|
47 | 36 | // provide setter fallback for non model class or or unknown methods
|
48 |
| - String methodCamel = StringUtils.camelize(element.getContents()); |
49 |
| - Method method = phpClass.findMethodByName("set" + methodCamel); |
50 |
| - if (method != null) { |
51 |
| - psiElements.add(method); |
| 37 | + for (String value : methods) { |
| 38 | + Method method = phpClass.findMethodByName("set" + value); |
| 39 | + if (method != null) { |
| 40 | + psiElements.add(method); |
| 41 | + } |
52 | 42 | }
|
53 | 43 |
|
| 44 | + // property path |
| 45 | + psiElements.addAll(this.phpClass.getFields().stream() |
| 46 | + .filter(field -> !field.isConstant() && field.getModifier().isPublic() && methods.contains(field.getName())) |
| 47 | + .collect(Collectors.toList()) |
| 48 | + ); |
| 49 | + |
54 | 50 | return PsiElementResolveResult.createResults(psiElements);
|
55 | 51 | }
|
56 | 52 |
|
57 | 53 | @NotNull
|
58 | 54 | @Override
|
59 | 55 | public Object[] getVariants() {
|
60 |
| - |
61 |
| - List<LookupElement> lookupElements = new ArrayList<>(); |
62 |
| - |
63 |
| - Set<String> strings = new HashSet<>(); |
64 |
| - for(DoctrineModelField field: EntityHelper.getModelFields(this.phpClass)) { |
65 |
| - addCamelUnderscoreName(strings, org.apache.commons.lang.StringUtils.trim(field.getName())); |
66 |
| - lookupElements.add(new DoctrineModelFieldLookupElement(field).withBoldness(true)); |
67 |
| - } |
| 56 | + Collection<LookupElement> lookupElements = new ArrayList<>(); |
68 | 57 |
|
69 | 58 | // provide setter fallback for non model class or unknown methods
|
70 | 59 | for(Method method: this.phpClass.getMethods()) {
|
71 | 60 | String name = method.getName();
|
72 | 61 | if(name.length() > 3 && name.startsWith("set")) {
|
73 |
| - name = name.substring(3); |
74 |
| - if(!isCamelUnderscoreEqual(strings, name)) { |
75 |
| - // @TODO: should we really stay this underscore way? |
76 |
| - lookupElements.add(new PhpUnderscoreMethodLookupElement(method)); |
77 |
| - } |
| 62 | + lookupElements.add(new PhpFormPropertyMethodLookupElement(method, StringUtils.lcfirst(name.substring(3)))); |
78 | 63 | }
|
79 | 64 | }
|
80 | 65 |
|
| 66 | + // Symfony\Component\PropertyAccess\PropertyAccessor::getWriteAccessInfo |
| 67 | + // property: public $foobar |
| 68 | + lookupElements.addAll(this.phpClass.getFields().stream() |
| 69 | + .filter(field -> !field.isConstant() && field.getModifier().isPublic()) |
| 70 | + .map(field -> new PhpFormPropertyMethodLookupElement(field, field.getName())) |
| 71 | + .collect(Collectors.toList()) |
| 72 | + ); |
| 73 | + |
81 | 74 | return lookupElements.toArray();
|
82 | 75 | }
|
83 | 76 |
|
84 |
| - private boolean isCamelUnderscoreEqual(Set<String> strings, String string) { |
85 |
| - return strings.contains(string) || strings.contains(StringUtils.camelize(string)) || strings.contains(StringUtils.underscore(string)); |
86 |
| - } |
| 77 | + @NotNull |
| 78 | + private Set<String> getCamelizeAndUnderscoreString(@NotNull String string) { |
| 79 | + TreeSet<String> strings = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); |
87 | 80 |
|
88 |
| - private void addCamelUnderscoreName(Set<String> strings, String string) { |
89 |
| - strings.add(StringUtils.camelize(string)); |
90 |
| - strings.add(StringUtils.underscore(string)); |
91 |
| - } |
| 81 | + string = StringUtils.lcfirst(string); |
92 | 82 |
|
| 83 | + strings.addAll(Arrays.asList( |
| 84 | + StringUtils.underscore(string), |
| 85 | + StringUtils.camelize(string), |
| 86 | + string |
| 87 | + )); |
| 88 | + |
| 89 | + return strings; |
| 90 | + } |
93 | 91 | }
|
0 commit comments