diff --git a/src/fr/adrienbrault/idea/symfony2plugin/form/FormDefaultOptionsKeyReference.java b/src/fr/adrienbrault/idea/symfony2plugin/form/FormDefaultOptionsKeyReference.java index 900f60fa3..d6f3dc3e9 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/form/FormDefaultOptionsKeyReference.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/form/FormDefaultOptionsKeyReference.java @@ -14,11 +14,13 @@ * @author Daniel Espendiller */ public class FormDefaultOptionsKeyReference extends PsiReferenceBase implements PsiReference { + @NotNull + final private StringLiteralExpression element; - private StringLiteralExpression element; - private String formType; + @NotNull + final private String formType; - public FormDefaultOptionsKeyReference(@NotNull StringLiteralExpression element, String formType) { + public FormDefaultOptionsKeyReference(@NotNull StringLiteralExpression element, @NotNull String formType) { super(element); this.element = element; this.formType = formType; @@ -27,8 +29,7 @@ public FormDefaultOptionsKeyReference(@NotNull StringLiteralExpression element, @Nullable @Override public PsiElement resolve() { - - Collection defaultOptionTargets = FormOptionsUtil.getDefaultOptionTargets(element, this.formType); + Collection defaultOptionTargets = FormOptionsUtil.getDefaultOptionTargets(element, formType); if(defaultOptionTargets.size() > 0) { return defaultOptionTargets.iterator().next(); } @@ -40,7 +41,7 @@ public PsiElement resolve() { @NotNull @Override public Object[] getVariants() { - return FormOptionsUtil.getDefaultOptionLookupElements(getElement().getProject(), this.formType).toArray(); + return FormOptionsUtil.getDefaultOptionLookupElements(getElement().getProject(), formType).toArray(); } } diff --git a/src/fr/adrienbrault/idea/symfony2plugin/form/FormExtensionKeyReference.java b/src/fr/adrienbrault/idea/symfony2plugin/form/FormExtensionKeyReference.java index 76ed7a1b9..992508490 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/form/FormExtensionKeyReference.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/form/FormExtensionKeyReference.java @@ -1,48 +1,47 @@ package fr.adrienbrault.idea.symfony2plugin.form; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiReference; -import com.intellij.psi.PsiReferenceBase; +import com.intellij.psi.*; import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; import fr.adrienbrault.idea.symfony2plugin.form.util.FormOptionsUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Collection; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * @author Daniel Espendiller */ -public class FormExtensionKeyReference extends PsiReferenceBase implements PsiReference { - - private StringLiteralExpression element; +public class FormExtensionKeyReference extends PsiPolyVariantReferenceBase { + @NotNull + final private StringLiteralExpression element; - private String[] formTypes = new String[] { - "form", - "Symfony\\Component\\Form\\Extension\\Core\\Type\\FormType", - }; + @NotNull + final private Set formTypes = Stream + .of("form", "Symfony\\Component\\Form\\Extension\\Core\\Type\\FormType") + .collect(Collectors.toCollection(HashSet::new)); - public FormExtensionKeyReference(@NotNull StringLiteralExpression element) { + public FormExtensionKeyReference(@NotNull StringLiteralExpression element, @Nullable String formType) { super(element); this.element = element; - } - - @Nullable - @Override - public PsiElement resolve() { - Collection targets = FormOptionsUtil.getFormExtensionsKeysTargets(element, formTypes); - if(targets.size() > 0) { - return targets.iterator().next(); + if(formType != null) { + this.formTypes.add(formType); } + } - return null; + @NotNull + @Override + public ResolveResult[] multiResolve(boolean b) { + return PsiElementResolveResult.createResults( + FormOptionsUtil.getFormExtensionsKeysTargets(element, formTypes.toArray(new String[formTypes.size()])) + ); } @NotNull @Override public Object[] getVariants() { - return FormOptionsUtil.getFormExtensionKeysLookupElements(getElement().getProject(), formTypes).toArray(); + return FormOptionsUtil.getFormExtensionKeysLookupElements(getElement().getProject(), formTypes.toArray(new String[formTypes.size()])).toArray(); } - } diff --git a/src/fr/adrienbrault/idea/symfony2plugin/form/FormGotoCompletionRegistrar.java b/src/fr/adrienbrault/idea/symfony2plugin/form/FormGotoCompletionRegistrar.java index aebfeaff1..3fc4bf152 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/form/FormGotoCompletionRegistrar.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/form/FormGotoCompletionRegistrar.java @@ -60,7 +60,7 @@ public void register(GotoCompletionRegistrarParameter registrar) { return new FormBuilderAddGotoCompletionProvider(parent); }); - /** + /* * $options lookup * public function createNamedBuilder($name, $type = 'form', $data = null, array $options = array()) */ @@ -80,11 +80,9 @@ public void register(GotoCompletionRegistrarParameter registrar) { } return getFormProvider((StringLiteralExpression) parent, methodMatchParameter.getParameters()[1]); - }); - - /** + /* * $this->createForm(new FormType(), $entity, array('' => '')); * $this->createForm('foo', $entity, array('')); */ @@ -229,11 +227,13 @@ public void register(GotoCompletionRegistrarParameter registrar) { * Form options on extension or form type default options */ private static class FormOptionsGotoCompletionProvider extends GotoCompletionProvider { - + @NotNull private final String formType; + + @NotNull private final Collection options; - public FormOptionsGotoCompletionProvider(@NotNull PsiElement element, @NotNull String formType, FormOption... options) { + FormOptionsGotoCompletionProvider(@NotNull PsiElement element, @NotNull String formType, FormOption... options) { super(element); this.formType = formType; this.options = Arrays.asList(options); @@ -242,7 +242,6 @@ public FormOptionsGotoCompletionProvider(@NotNull PsiElement element, @NotNull S @NotNull @Override public Collection getLookupElements() { - Collection lookupElements = new ArrayList<>(); if(options.contains(FormOption.EXTENSION)) { @@ -259,7 +258,6 @@ public Collection getLookupElements() { @NotNull @Override public Collection getPsiTargets(PsiElement psiElement) { - PsiElement element = psiElement.getParent(); if(!(element instanceof StringLiteralExpression)) { return Collections.emptyList(); @@ -276,7 +274,6 @@ public Collection getPsiTargets(PsiElement psiElement) { } return targets; - } } @@ -284,8 +281,7 @@ public Collection getPsiTargets(PsiElement psiElement) { * All registered form type with their getName() return alias name */ private static class FormBuilderAddGotoCompletionProvider extends GotoCompletionProvider { - - public FormBuilderAddGotoCompletionProvider(PsiElement element) { + FormBuilderAddGotoCompletionProvider(PsiElement element) { super(element); } @@ -298,7 +294,6 @@ public Collection getLookupElements() { @NotNull @Override public Collection getPsiTargets(PsiElement psiElement) { - PsiElement element = psiElement.getParent(); if(!(element instanceof StringLiteralExpression)) { return Collections.emptyList(); diff --git a/src/fr/adrienbrault/idea/symfony2plugin/form/FormTypeReferenceContributor.java b/src/fr/adrienbrault/idea/symfony2plugin/form/FormTypeReferenceContributor.java index 5f4bb290b..bd8b0d17f 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/form/FormTypeReferenceContributor.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/form/FormTypeReferenceContributor.java @@ -60,8 +60,8 @@ public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @No ArrayHashElement arrayHash = PsiTreeUtil.getParentOfType(psiElement, ArrayHashElement.class); if(arrayHash != null && arrayHash.getKey() instanceof StringLiteralExpression) { - ArrayCreationExpression arrayCreation = PsiTreeUtil.getParentOfType(psiElement, ArrayCreationExpression.class); + if(arrayCreation == null) { return new PsiReference[0]; } @@ -81,8 +81,8 @@ public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @No // @TODO: how to handle custom bundle fields like help_block if(keyString.equals("label") || keyString.equals("help_block") || keyString.equals("help_inline") || keyString.equals("placeholder")) { - // translation_domain in current array block + String translationDomain = FormOptionsUtil.getTranslationFromScope(arrayCreation); if(translationDomain == null) { translationDomain = "messages"; @@ -94,15 +94,11 @@ public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @No if(keyString.equals("class")) { return new PsiReference[]{ new EntityReference((StringLiteralExpression) psiElement, true)}; } - } return new PsiReference[0]; - } - } - ); /* @@ -115,7 +111,6 @@ public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @No @NotNull @Override public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @NotNull ProcessingContext processingContext) { - // match add('foo', 'type name') MethodMatcher.MethodMatchParameter methodMatchParameter = new MethodMatcher.StringParameterMatcher(psiElement, 1) .withSignature(FormUtil.PHP_FORM_BUILDER_SIGNATURES) @@ -133,11 +128,8 @@ public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @No } return new PsiReference[]{ new FormTypeReferenceRef((StringLiteralExpression) psiElement) }; - } - } - ); // FormBuilderInterface::add('underscore_method') @@ -180,9 +172,7 @@ public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @No return new PsiReference[]{new FormUnderscoreMethodReference((StringLiteralExpression) psiElement, phpClass)}; } - } - ); // TODO: migrate to FormGotoCompletionRegistrar for better performance as lazy condition @@ -228,7 +218,7 @@ public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @No if(PhpElementsUtil.getCompletableArrayCreationElement(psiElement) != null) { return new PsiReference[]{ - new FormExtensionKeyReference((StringLiteralExpression) psiElement), + new FormExtensionKeyReference((StringLiteralExpression) psiElement, FormUtil.getFormTypeClassFromScope(psiElement)), new FormDefaultOptionsKeyReference((StringLiteralExpression) psiElement, "form"), new FormDefaultOptionsKeyReference((StringLiteralExpression) psiElement, "Symfony\\Component\\Form\\Extension\\Core\\Type\\FormType"), }; @@ -248,8 +238,6 @@ public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @No @NotNull @Override public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @NotNull ProcessingContext processingContext) { - - MethodMatcher.MethodMatchParameter methodMatchParameter = new MethodMatcher.StringParameterMatcher(psiElement, 0) .withSignature("\\Symfony\\Component\\Form\\FormInterface", "get") .withSignature("\\Symfony\\Component\\Form\\FormInterface", "has") @@ -268,23 +256,20 @@ public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @No new FormFieldNameReference((StringLiteralExpression) psiElement, method) }; } - } - ); - /** + /* * $options * public function buildForm(FormBuilderInterface $builder, array $options) { * $options['foo'] * } * * public function setDefaultOptions(OptionsResolverInterface $resolver) { - * $resolver->setDefaults(array( + * $resolver->setDefaults([ * 'foo' => 'bar', - * )); - } - + * ]); + * } */ psiReferenceRegistrar.registerReferenceProvider( PlatformPatterns.psiElement(StringLiteralExpression.class), @@ -334,21 +319,15 @@ public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @No } return new PsiReference[]{ - new FormExtensionKeyReference((StringLiteralExpression) psiElement), + new FormExtensionKeyReference((StringLiteralExpression) psiElement, FormUtil.getFormTypeClassFromScope(psiElement)), new FormDefaultOptionsKeyReference((StringLiteralExpression) psiElement, phpClass.getPresentableFQN()) }; - } - } - ); - - } private static class FormTypeReferenceRef extends FormTypeReference { - public FormTypeReferenceRef(@NotNull StringLiteralExpression element) { super(element); } @@ -358,6 +337,5 @@ public FormTypeReferenceRef(@NotNull StringLiteralExpression element) { public Object[] getVariants() { return new Object[0]; } - } } diff --git a/src/fr/adrienbrault/idea/symfony2plugin/form/dict/FormOption.java b/src/fr/adrienbrault/idea/symfony2plugin/form/dict/FormOption.java index 2bd48148e..77bb1c414 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/form/dict/FormOption.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/form/dict/FormOption.java @@ -1,5 +1,6 @@ package fr.adrienbrault.idea.symfony2plugin.form.dict; +import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import java.util.Collection; @@ -9,22 +10,23 @@ * @author Daniel Espendiller */ public class FormOption { - + @NotNull private final String option; + + @NotNull private final FormClass formClass; + @NotNull + private final Collection psiElements = new HashSet<>(); + @NotNull private final Collection optionEnum = new HashSet<>(); - public FormOption(@NotNull String option, @NotNull FormClass formClass) { + public FormOption(@NotNull String option, @NotNull FormClass formClass, @NotNull FormOptionEnum optionEnum, @NotNull PsiElement psiElement) { this.option = option; this.formClass = formClass; - this.optionEnum.add(FormOptionEnum.DEFAULT); - } - public FormOption(@NotNull String option, @NotNull FormClass formClass, @NotNull FormOptionEnum optionEnum) { - this.option = option; - this.formClass = formClass; + this.psiElements.add(psiElement); this.optionEnum.add(optionEnum); } @@ -42,10 +44,17 @@ public FormClass getFormClass() { public Collection getOptionEnum() { return optionEnum; } - @NotNull - public FormOption addOptionEnum(@NotNull FormOptionEnum optionEnum) { + + public void addOptionEnum(@NotNull FormOptionEnum optionEnum) { this.optionEnum.add(optionEnum); - return this; } + public void addTarget(@NotNull PsiElement psiElement) { + this.psiElements.add(psiElement); + } + + @NotNull + public Collection getPsiTargets() { + return psiElements; + } } diff --git a/src/fr/adrienbrault/idea/symfony2plugin/form/util/FormOptionsUtil.java b/src/fr/adrienbrault/idea/symfony2plugin/form/util/FormOptionsUtil.java index 4841ac8b0..293a884c1 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/form/util/FormOptionsUtil.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/form/util/FormOptionsUtil.java @@ -102,7 +102,7 @@ public static Map getFormExtensionKeys(@NotNull Project proj Map extensionClassMap = new HashMap<>(); for(FormClass extensionClass: typeClasses) { - extensionClassMap.putAll(getDefaultOptions(project, extensionClass.getPhpClass(), extensionClass)); + extensionClassMap.putAll(getDefaultOptions(extensionClass.getPhpClass(), extensionClass)); } return extensionClassMap; @@ -223,9 +223,9 @@ private static Map visitFormOptions(Project project, String form return defaultValues; } - getDefaultOptions(project, phpClass, new FormClass(FormClassEnum.FORM_TYPE, phpClass, false), visitor); + getDefaultOptions(phpClass, new FormClass(FormClassEnum.FORM_TYPE, phpClass, false), visitor); for (FormClass formClass : getExtendedTypeClasses(project, formTypeName)) { - getDefaultOptions(project, formClass.getPhpClass(), new FormClass(FormClassEnum.EXTENSION, formClass.getPhpClass(), false), visitor); + getDefaultOptions(formClass.getPhpClass(), new FormClass(FormClassEnum.EXTENSION, formClass.getPhpClass(), false), visitor); } // recursive search for parent form types @@ -239,21 +239,21 @@ private static Map visitFormOptions(Project project, String form } private static void getFormDefaultKeys(@NotNull Project project, @NotNull String formTypeName, @NotNull FormOptionVisitor visitor) { - getFormDefaultKeys(project, formTypeName, new HashMap<>(), new FormUtil.FormTypeCollector(project).collect(), 0, visitor); + getFormDefaultKeys(formTypeName, new HashMap<>(), new FormUtil.FormTypeCollector(project).collect(), 0, visitor); } - private static Map getFormDefaultKeys(Project project, String formTypeName, HashMap defaultValues, FormUtil.FormTypeCollector collector, int depth, @NotNull FormOptionVisitor visitor) { + private static Map getFormDefaultKeys(String formTypeName, HashMap defaultValues, FormUtil.FormTypeCollector collector, int depth, @NotNull FormOptionVisitor visitor) { PhpClass phpClass = collector.getFormTypeToClass(formTypeName); if(phpClass == null) { return defaultValues; } - getDefaultOptions(project, phpClass, new FormClass(FormClassEnum.FORM_TYPE, phpClass, false), visitor); + getDefaultOptions(phpClass, new FormClass(FormClassEnum.FORM_TYPE, phpClass, false), visitor); // recursive search for parent form types if (depth < 10) { for (String formParent : FormUtil.getFormParentOfPhpClass(phpClass)) { - getFormDefaultKeys(project, formParent, defaultValues, collector, ++depth, visitor); + getFormDefaultKeys(formParent, defaultValues, collector, ++depth, visitor); } } @@ -261,26 +261,29 @@ private static Map getFormDefaultKeys(Project project, String fo } @NotNull - private static Map getDefaultOptions(@NotNull Project project, @NotNull PhpClass phpClass, @NotNull FormClass formClass) { + private static Map getDefaultOptions(@NotNull PhpClass phpClass, @NotNull FormClass formClass) { final Map options = new HashMap<>(); - getDefaultOptions(project, phpClass, formClass, (psiElement, option, formClass1, optionEnum) -> { + getDefaultOptions(phpClass, formClass, (psiElement, option, formClass1, optionEnum) -> { // append REQUIRED, if we already know this value if(options.containsKey(option)) { - options.get(option).addOptionEnum(optionEnum); + FormOption formOption = options.get(option); + + formOption.addOptionEnum(optionEnum); + formOption.addTarget(psiElement); } else { - options.put(option, new FormOption(option, formClass1, optionEnum)); + options.put(option, new FormOption(option, formClass1, optionEnum, psiElement)); } }); return options; } - private static void getDefaultOptions(@NotNull Project project, @NotNull PhpClass phpClass, @NotNull FormClass formClass, @NotNull FormOptionVisitor visitor) { - getDefaultOptions(project, phpClass, formClass, visitor, 10); + private static void getDefaultOptions(@NotNull PhpClass phpClass, @NotNull FormClass formClass, @NotNull FormOptionVisitor visitor) { + getDefaultOptions(phpClass, formClass, visitor, 10); } - private static void getDefaultOptions(@NotNull Project project, @NotNull PhpClass phpClass, @NotNull FormClass formClass, @NotNull FormOptionVisitor visitor, int depth) { + private static void getDefaultOptions(@NotNull PhpClass phpClass, @NotNull FormClass formClass, @NotNull FormOptionVisitor visitor, int depth) { if(depth-- < 0) { return; } @@ -303,15 +306,28 @@ private static void getDefaultOptions(@NotNull Project project, @NotNull PhpClas } else { // ->setRequired(['test', 'test2']) + // ->setRequired('test') for(String currentMethod: OPTIONS_VIA_METHOD_PARAMETER) { - if(PhpElementsUtil.isEqualMethodReferenceName(methodReference, currentMethod)) { - PsiElement[] parameters = methodReference.getParameters(); - if(parameters.length > 0 && parameters[0] instanceof ArrayCreationExpression) { - for (Map.Entry entry : PhpElementsUtil.getArrayValuesAsMap((ArrayCreationExpression) parameters[0]).entrySet()) { - visitor.visit(entry.getValue(), entry.getKey(), formClass, FormOptionEnum.getEnum(currentMethod)); - } + if(!PhpElementsUtil.isEqualMethodReferenceName(methodReference, currentMethod)) { + continue; + } + + PsiElement[] parameters = methodReference.getParameters(); + if(parameters.length == 0) { + continue; + } + + if(parameters[0] instanceof ArrayCreationExpression) { + // ->setRequired(['test', 'test2']) + for (Map.Entry entry : PhpElementsUtil.getArrayValuesAsMap((ArrayCreationExpression) parameters[0]).entrySet()) { + visitor.visit(entry.getValue(), entry.getKey(), formClass, FormOptionEnum.getEnum(currentMethod)); + } + } else { + // ->setRequired('test') + String stringValue = PhpElementsUtil.getStringValue(parameters[0]); + if(stringValue != null) { + visitor.visit(parameters[0], stringValue, formClass, FormOptionEnum.getEnum(currentMethod)); } - break; } } } @@ -319,12 +335,12 @@ private static void getDefaultOptions(@NotNull Project project, @NotNull PhpClas // 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()); + PsiElement parentMethod = PhpElementsUtil.getPsiElementsBySignatureSingle(phpClass.getProject(), methodReference.getSignature()); if(parentMethod instanceof Method) { PhpClass phpClassInner = ((Method) parentMethod).getContainingClass(); if(phpClassInner != null) { // @TODO only use setDefaultOptions, recursive call get setDefaults again - getDefaultOptions(project, phpClassInner, formClass, visitor, depth); + getDefaultOptions(phpClassInner, formClass, visitor, depth); } } } @@ -339,9 +355,9 @@ private static void getDefaultOptions(@NotNull Project project, @NotNull PhpClas * @param formOption Extension or a default option * @return lookup element */ - public static LookupElement getOptionLookupElement(FormOption formOption) { - + private static LookupElement getOptionLookupElement(FormOption formOption) { String typeText = formOption.getFormClass().getPhpClass().getPresentableFQN(); + if(typeText.lastIndexOf("\\") != -1) { typeText = typeText.substring(typeText.lastIndexOf("\\") + 1); if(typeText.endsWith("Extension")) { @@ -357,29 +373,13 @@ public static LookupElement getOptionLookupElement(FormOption formOption) { @NotNull public static Collection getFormExtensionsKeysTargets(@NotNull StringLiteralExpression psiElement, String... formTypes) { Map extensionKeys = FormOptionsUtil.getFormExtensionKeys(psiElement.getProject(), formTypes); - String value = psiElement.getContents(); + String optionName = psiElement.getContents(); - if(!extensionKeys.containsKey(value)) { + if(StringUtils.isBlank(optionName) || !extensionKeys.containsKey(optionName)) { return Collections.emptyList(); } - Collection psiElements = new HashSet<>(); - PhpClass phpClass = extensionKeys.get(value).getFormClass().getPhpClass(); - - // Symfony <= 2.7 and > 2.7 api level search - for (String methodName : FORM_OPTION_METHODS) { - Method method = phpClass.findMethodByName(methodName); - if(method == null) { - continue; - } - - ContainerUtil.addIfNotNull( - psiElements, - PhpElementsUtil.findArrayKeyValueInsideReference(method, "setDefaults", value) - ); - } - - return psiElements; + return extensionKeys.get(optionName).getPsiTargets(); } public static Collection getFormExtensionKeysLookupElements(Project project, String... formTypes) { diff --git a/src/fr/adrienbrault/idea/symfony2plugin/form/util/FormUtil.java b/src/fr/adrienbrault/idea/symfony2plugin/form/util/FormUtil.java index 7c04ccb85..8427aab27 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/form/util/FormUtil.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/form/util/FormUtil.java @@ -243,7 +243,7 @@ public static Map> getTags(XmlFile psiFile) { return map; } - /** + /* * * * @@ -334,7 +334,7 @@ public static class FormTypeCollector { private final Map formTypesMap; private final Project project; - public FormTypeCollector(Project project) { + FormTypeCollector(Project project) { this.project = project; this.formTypesMap = new HashMap<>(); } @@ -354,16 +354,6 @@ public FormTypeCollector collect() { return this; } - @Nullable - public FormTypeClass getFormType(String formTypeName) { - - if(this.formTypesMap.containsKey(formTypeName)) { - return this.formTypesMap.get(formTypeName); - } - - return null; - } - @Nullable public PhpClass getFormTypeToClass(@Nullable String formType) { @@ -410,7 +400,6 @@ public PhpClass getFormTypeClass(String formTypeName) { public Map getFormTypesMap() { return formTypesMap; } - } /** @@ -532,6 +521,7 @@ public static String getFormNameOfPhpClass(@NotNull PhpClass phpClass) { } } } + continue; } @@ -576,4 +566,21 @@ public static Collection getFormExtendedType(@NotNull PhpClass phpClass) return types; } + + /** + * Find form php class scope: FormType or FormExtension + */ + @Nullable + public static String getFormTypeClassFromScope(@NotNull PsiElement psiElement) { + Method methodScope = PsiTreeUtil.getParentOfType(psiElement, Method.class); + + if(methodScope != null) { + PhpClass phpClass = methodScope.getContainingClass(); + if(phpClass != null && (PhpElementsUtil.isInstanceOf(phpClass, "\\Symfony\\Component\\Form\\FormTypeInterface") || PhpElementsUtil.isInstanceOf(phpClass, "\\Symfony\\Component\\Form\\FormExtensionInterface"))) { + return phpClass.getFQN(); + } + } + + return null; + } } diff --git a/tests/fr/adrienbrault/idea/symfony2plugin/tests/form/util/FormUtilTest.java b/tests/fr/adrienbrault/idea/symfony2plugin/tests/form/util/FormUtilTest.java index 8c8bd3527..056dbfb2f 100644 --- a/tests/fr/adrienbrault/idea/symfony2plugin/tests/form/util/FormUtilTest.java +++ b/tests/fr/adrienbrault/idea/symfony2plugin/tests/form/util/FormUtilTest.java @@ -239,5 +239,25 @@ public void testGetFormExtendedType() { ); assertContainsElements(FormUtil.getFormExtendedType(phpClass), "foobar", "Foobar"); + + phpClass = PhpPsiElementFactory.createFromText(getProject(), PhpClass.class, "