Skip to content

Commit

Permalink
add support for new configureOptions in replacement for deprecated se…
Browse files Browse the repository at this point in the history
…tDefaultOptions #491, #486, #490
  • Loading branch information
Haehnchen committed May 2, 2015
1 parent 5d3cd95 commit 1aa7212
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 59 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -124,11 +124,13 @@ public Collection<PsiElement> getPsiTargets(PsiElement psiElement) {
Collection<PsiElement> psiElements = new ArrayList<PsiElement>();

for(String className: classNames) {
Method method = PhpElementsUtil.getClassMethod(getProject(), className, "setDefaultOptions");
if(method != null) {
PsiElement keyValue = PhpElementsUtil.findArrayKeyValueInsideReference(method, "setDefaults", value);
if(keyValue != null) {
psiElements.add(keyValue);
for (String formOptionMethod : FormOptionsUtil.FORM_OPTION_METHODS) {
Method method = PhpElementsUtil.getClassMethod(getProject(), className, formOptionMethod);
if(method != null) {
PsiElement keyValue = PhpElementsUtil.findArrayKeyValueInsideReference(method, "setDefaults", value);
if(keyValue != null) {
psiElements.add(keyValue);
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent;
import fr.adrienbrault.idea.symfony2plugin.doctrine.EntityReference;
import fr.adrienbrault.idea.symfony2plugin.form.util.FormFieldNameReference;
import fr.adrienbrault.idea.symfony2plugin.form.util.FormOptionsUtil;
import fr.adrienbrault.idea.symfony2plugin.form.util.FormUtil;
import fr.adrienbrault.idea.symfony2plugin.translation.TranslationDomainReference;
import fr.adrienbrault.idea.symfony2plugin.translation.TranslationReference;
Expand Down Expand Up @@ -87,7 +88,7 @@ public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @No
// translation_domain in current array block
String translationDomain = PhpElementsUtil.getArrayHashValue(arrayCreation, "translation_domain");
if(translationDomain == null) {
translationDomain = PhpElementsUtil.getArrayKeyValueInsideSignature(psiElement, "setDefaultOptions", "setDefaults", "translation_domain");
translationDomain = PhpElementsUtil.getArrayKeyValueInsideSignature(psiElement, FormOptionsUtil.FORM_OPTION_METHODS, "setDefaults", "translation_domain");
}

if(translationDomain == null) {
Expand Down Expand Up @@ -174,7 +175,7 @@ public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @No
return new PsiReference[0];
}

String className = PhpElementsUtil.getArrayKeyValueInsideSignature(psiElement, "setDefaultOptions", "setDefaults", "data_class");
String className = PhpElementsUtil.getArrayKeyValueInsideSignature(psiElement, FormOptionsUtil.FORM_OPTION_METHODS, "setDefaults", "data_class");
if (className != null) {
PhpClass dataClass = PhpElementsUtil.getClass(PhpIndex.getInstance(psiElement.getProject()), className);
if (dataClass != null) {
Expand Down
113 changes: 64 additions & 49 deletions src/fr/adrienbrault/idea/symfony2plugin/form/util/FormOptionsUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
public class FormOptionsUtil {

private static final String EXTENDED_TYPE_METHOD = "getExtendedType";
public static final String[] FORM_OPTION_METHODS = new String[]{"setDefaultOptions", "configureOptions"};

public static List<FormClass> getExtendedTypeClasses(Project project, String... formTypeNames) {

Expand Down Expand Up @@ -223,35 +224,40 @@ private static Map<String, String> getFormDefaultKeys(Project project, String fo
* use getDefaultOptions
*/
@Deprecated
private static void attachOnDefaultOptions(Project project, Map<String, String> defaultValues, PhpClass phpClass) {
private static void attachOnDefaultOptions(@NotNull Project project, @NotNull Map<String, String> defaultValues, @NotNull PhpClass phpClass) {

Method setDefaultOptionsMethod = PhpElementsUtil.getClassMethod(phpClass, "setDefaultOptions");
if(setDefaultOptionsMethod == null) {
return;
}
for(String methodName: FORM_OPTION_METHODS) {

Collection<MethodReference> tests = PsiTreeUtil.findChildrenOfType(setDefaultOptionsMethod, MethodReference.class);
for(MethodReference methodReference: tests) {
// instance check
// methodReference.getSignature().equals("#M#C\\Symfony\\Component\\OptionsResolver\\OptionsResolverInterface.setDefaults")
if(PhpElementsUtil.isEqualMethodReferenceName(methodReference, "setDefaults")) {
PsiElement[] parameters = methodReference.getParameters();
if(parameters.length > 0 && parameters[0] instanceof ArrayCreationExpression) {
for(String key: PhpElementsUtil.getArrayCreationKeys((ArrayCreationExpression) parameters[0])) {
defaultValues.put(key, phpClass.getPresentableFQN());
Method method = PhpElementsUtil.getClassMethod(phpClass, methodName);
if(method == null) {
continue;
}

for(MethodReference methodReference: PsiTreeUtil.findChildrenOfType(method, MethodReference.class)) {

// instance check
// methodReference.getSignature().equals("#M#C\\Symfony\\Component\\OptionsResolver\\OptionsResolverInterface.setDefaults")
if(PhpElementsUtil.isEqualMethodReferenceName(methodReference, "setDefaults")) {
PsiElement[] parameters = methodReference.getParameters();
if(parameters.length > 0 && parameters[0] instanceof ArrayCreationExpression) {
for(String key: PhpElementsUtil.getArrayCreationKeys((ArrayCreationExpression) parameters[0])) {
String presentableFQN = phpClass.getPresentableFQN();
if(presentableFQN != null) {
defaultValues.put(key, presentableFQN);
}
}
}
}

}

// support: parent::setDefaultOptions($resolver)
// Symfony\Component\Form\Extension\Core\Type\FormType:setDefaultOptions
if(PhpElementsUtil.isEqualMethodReferenceName(methodReference, "setDefaultOptions") && methodReference.getReferenceType() == PhpModifier.State.PARENT) {
PsiElement parentMethod = PhpElementsUtil.getPsiElementsBySignatureSingle(project, methodReference.getSignature());
if(parentMethod instanceof Method) {
PhpClass phpClassInner = ((Method) parentMethod).getContainingClass();
if(phpClass != null) {
attachOnDefaultOptions(project, defaultValues, phpClassInner);
// support: parent::setDefaultOptions($resolver)
// Symfony\Component\Form\Extension\Core\Type\FormType:setDefaultOptions
if(PhpElementsUtil.isEqualMethodReferenceName(methodReference, methodName) && methodReference.getReferenceType() == PhpModifier.State.PARENT) {
PsiElement parentMethod = PhpElementsUtil.getPsiElementsBySignatureSingle(project, methodReference.getSignature());
if(parentMethod instanceof Method) {
PhpClass phpClassInner = ((Method) parentMethod).getContainingClass();
if(phpClassInner != null) {
attachOnDefaultOptions(project, defaultValues, phpClassInner);
}
}
}
}
Expand All @@ -260,40 +266,49 @@ private static void attachOnDefaultOptions(Project project, Map<String, String>
}

@NotNull
private static Map<String, FormOption> getDefaultOptions(Project project, PhpClass phpClass, FormClass formClass) {
private static Map<String, FormOption> getDefaultOptions(@NotNull Project project, @NotNull PhpClass phpClass, @NotNull FormClass formClass) {

Map<String, FormOption> options = new HashMap<String, FormOption>();

Method setDefaultOptionsMethod = PhpElementsUtil.getClassMethod(phpClass, "setDefaultOptions");
if(setDefaultOptionsMethod == null) {
return options;
}
for(String methodName: new String[] {"setDefaultOptions", "configureOptions"}) {

Collection<MethodReference> tests = PsiTreeUtil.findChildrenOfType(setDefaultOptionsMethod, MethodReference.class);
for(MethodReference methodReference: tests) {
// instance check
// methodReference.getSignature().equals("#M#C\\Symfony\\Component\\OptionsResolver\\OptionsResolverInterface.setDefaults")
if(PhpElementsUtil.isEqualMethodReferenceName(methodReference, "setDefaults")) {
PsiElement[] parameters = methodReference.getParameters();
if(parameters.length > 0 && parameters[0] instanceof ArrayCreationExpression) {
for(String key: PhpElementsUtil.getArrayCreationKeys((ArrayCreationExpression) parameters[0])) {
options.put(key, new FormOption(key, formClass));
}
}
Method method = PhpElementsUtil.getClassMethod(phpClass, methodName);
if(method == null) {
continue;
}

Method setDefaultOptionsMethod = PhpElementsUtil.getClassMethod(phpClass, "setDefaultOptions");
if(setDefaultOptionsMethod == null) {
return options;
}

// support: parent::setDefaultOptions($resolver)
// Symfony\Component\Form\Extension\Core\Type\FormType:setDefaultOptions
if(PhpElementsUtil.isEqualMethodReferenceName(methodReference, "setDefaultOptions") && methodReference.getReferenceType() == PhpModifier.State.PARENT) {
PsiElement parentMethod = PhpElementsUtil.getPsiElementsBySignatureSingle(project, methodReference.getSignature());
if(parentMethod instanceof Method) {
PhpClass phpClassInner = ((Method) parentMethod).getContainingClass();
if(phpClassInner != null) {
// @TODO only use setDefaultOptions, recursive call get setDefaults again
options.putAll(getDefaultOptions(project, phpClassInner, formClass));
Collection<MethodReference> tests = PsiTreeUtil.findChildrenOfType(setDefaultOptionsMethod, MethodReference.class);
for(MethodReference methodReference: tests) {
// instance check
// methodReference.getSignature().equals("#M#C\\Symfony\\Component\\OptionsResolver\\OptionsResolverInterface.setDefaults")
if(PhpElementsUtil.isEqualMethodReferenceName(methodReference, "setDefaults")) {
PsiElement[] parameters = methodReference.getParameters();
if(parameters.length > 0 && parameters[0] instanceof ArrayCreationExpression) {
for(String key: PhpElementsUtil.getArrayCreationKeys((ArrayCreationExpression) parameters[0])) {
options.put(key, new FormOption(key, formClass));
}
}

}

// support: parent::setDefaultOptions($resolver)
// Symfony\Component\Form\Extension\Core\Type\FormType:setDefaultOptions
if(PhpElementsUtil.isEqualMethodReferenceName(methodReference, methodName) && methodReference.getReferenceType() == PhpModifier.State.PARENT) {
PsiElement parentMethod = PhpElementsUtil.getPsiElementsBySignatureSingle(project, methodReference.getSignature());
if(parentMethod instanceof Method) {
PhpClass phpClassInner = ((Method) parentMethod).getContainingClass();
if(phpClassInner != null) {
// @TODO only use setDefaultOptions, recursive call get setDefaults again
options.putAll(getDefaultOptions(project, phpClassInner, formClass));
}
}
}

}

}
Expand Down
18 changes: 15 additions & 3 deletions src/fr/adrienbrault/idea/symfony2plugin/util/PhpElementsUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,11 @@ static public PsiElement findArrayKeyValueInsideReference(PsiElement psiElement,

@Nullable
static public String getArrayKeyValueInsideSignature(PsiElement psiElementInsideClass, String callTo, String methodName, String keyName) {
return getArrayKeyValueInsideSignature(psiElementInsideClass, new String[] {callTo}, methodName, keyName);
}

@Nullable
static public String getArrayKeyValueInsideSignature(PsiElement psiElementInsideClass, String callTo[], String methodName, String keyName) {
PhpClass phpClass = PsiTreeUtil.getParentOfType(psiElementInsideClass, PhpClass.class);
if(phpClass == null) {
return null;
Expand All @@ -408,7 +413,15 @@ static public String getArrayKeyValueInsideSignature(PsiElement psiElementInside
return null;
}

return PhpElementsUtil.getArrayKeyValueInsideSignature(psiElementInsideClass.getProject(), "#M#C\\" + className + "." + callTo, methodName, keyName);
for (String s : callTo) {
// @TODO: replace signature
String arrayKeyValueInsideSignature = PhpElementsUtil.getArrayKeyValueInsideSignature(psiElementInsideClass.getProject(), "#M#C\\" + className + "." + s, methodName, keyName);
if(arrayKeyValueInsideSignature != null) {
return arrayKeyValueInsideSignature;
}
}

return null;
}

@Nullable
Expand All @@ -419,8 +432,7 @@ static public String getArrayKeyValueInsideSignature(Project project, String sig
return null;
}

Collection<MethodReference> tests = PsiTreeUtil.findChildrenOfType(psiElement, MethodReference.class);
for(MethodReference methodReference: tests) {
for(MethodReference methodReference: PsiTreeUtil.findChildrenOfType(psiElement, MethodReference.class)) {

if(PhpElementsUtil.isEqualMethodReferenceName(methodReference, methodName)) {
PsiElement[] parameters = methodReference.getParameters();
Expand Down

0 comments on commit 1aa7212

Please sign in to comment.