Skip to content

Commit 8bccb54

Browse files
committed
refactoring twig types to allow custom variables
1 parent d91764e commit 8bccb54

File tree

4 files changed

+82
-21
lines changed

4 files changed

+82
-21
lines changed

src/fr/adrienbrault/idea/symfony2plugin/templating/TwigTemplateCompletionContributor.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import fr.adrienbrault.idea.symfony2plugin.templating.util.TwigExtensionParser;
3434
import fr.adrienbrault.idea.symfony2plugin.templating.util.TwigTypeResolveUtil;
3535
import fr.adrienbrault.idea.symfony2plugin.templating.util.TwigUtil;
36+
import fr.adrienbrault.idea.symfony2plugin.templating.variable.TwigTypeContainer;
3637
import fr.adrienbrault.idea.symfony2plugin.templating.variable.collector.ControllerDocVariableCollector;
3738
import fr.adrienbrault.idea.symfony2plugin.translation.TranslationIndex;
3839
import fr.adrienbrault.idea.symfony2plugin.translation.TranslatorLookupElement;
@@ -453,16 +454,16 @@ protected void addCompletions(@NotNull CompletionParameters parameters, Processi
453454
String[] possibleTypes = TwigTypeResolveUtil.formatPsiTypeName(psiElement);
454455

455456
// find core function for that
456-
for(PhpNamedElement phpNamedElement: TwigTypeResolveUtil.resolveTwigMethodName(psiElement, possibleTypes)) {
457-
if(phpNamedElement instanceof PhpClass) {
457+
for(TwigTypeContainer twigTypeContainer: TwigTypeResolveUtil.resolveTwigMethodName(psiElement, possibleTypes)) {
458+
if(twigTypeContainer.getPhpNamedElement() instanceof PhpClass) {
458459

459-
for(Method method: ((PhpClass) phpNamedElement).getMethods()) {
460+
for(Method method: ((PhpClass) twigTypeContainer.getPhpNamedElement()).getMethods()) {
460461
if(!(!method.getModifier().isPublic() || method.getName().startsWith("set") || method.getName().startsWith("__"))) {
461462
resultSet.addElement(new PhpTwigMethodLookupElement(method));
462463
}
463464
}
464465

465-
for(Field field: ((PhpClass) phpNamedElement).getFields()) {
466+
for(Field field: ((PhpClass) twigTypeContainer.getPhpNamedElement()).getFields()) {
466467
if(field.getModifier().isPublic()) {
467468
resultSet.addElement(new PhpTwigMethodLookupElement(field));
468469
}

src/fr/adrienbrault/idea/symfony2plugin/templating/TwigTemplateGoToLocalDeclarationHandler.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import fr.adrienbrault.idea.symfony2plugin.templating.util.TwigExtensionParser;
2323
import fr.adrienbrault.idea.symfony2plugin.templating.util.TwigTypeResolveUtil;
2424
import fr.adrienbrault.idea.symfony2plugin.templating.util.TwigUtil;
25+
import fr.adrienbrault.idea.symfony2plugin.templating.variable.TwigTypeContainer;
2526
import fr.adrienbrault.idea.symfony2plugin.templating.variable.collector.ControllerDocVariableCollector;
2627
import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil;
2728
import fr.adrienbrault.idea.symfony2plugin.util.RegexPsiElementFilter;
@@ -98,12 +99,20 @@ private PsiElement[] getTypeGoto(PsiElement psiElement) {
9899
// click on first item is our class name
99100
String[] beforeLeaf = TwigTypeResolveUtil.formatPsiTypeName(psiElement);
100101
if(beforeLeaf.length == 0) {
101-
targetPsiElements.addAll(TwigTypeResolveUtil.resolveTwigMethodName(psiElement, TwigTypeResolveUtil.formatPsiTypeName(psiElement, true)));
102+
Collection<TwigTypeContainer> twigTypeContainers = TwigTypeResolveUtil.resolveTwigMethodName(psiElement, TwigTypeResolveUtil.formatPsiTypeName(psiElement, true));
103+
for(TwigTypeContainer twigTypeContainer: twigTypeContainers) {
104+
if(twigTypeContainer.getPhpNamedElement() != null) {
105+
targetPsiElements.add(twigTypeContainer.getPhpNamedElement());
106+
}
107+
}
108+
102109
} else {
103-
Collection<? extends PhpNamedElement> types = TwigTypeResolveUtil.resolveTwigMethodName(psiElement, beforeLeaf);
110+
Collection<TwigTypeContainer> types = TwigTypeResolveUtil.resolveTwigMethodName(psiElement, beforeLeaf);
104111
// provide method / field goto
105-
for(PhpNamedElement psiTarget: types) {
106-
targetPsiElements.addAll(TwigTypeResolveUtil.getTwigPhpNameTargets(psiTarget, psiElement.getText()));
112+
for(TwigTypeContainer twigTypeContainer: types) {
113+
if(twigTypeContainer.getPhpNamedElement() != null) {
114+
targetPsiElements.addAll(TwigTypeResolveUtil.getTwigPhpNameTargets(twigTypeContainer.getPhpNamedElement(), psiElement.getText()));
115+
}
107116
}
108117
}
109118

src/fr/adrienbrault/idea/symfony2plugin/templating/util/TwigTypeResolveUtil.java

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,13 @@
2020
import fr.adrienbrault.idea.symfony2plugin.TwigHelper;
2121
import fr.adrienbrault.idea.symfony2plugin.templating.variable.TwigFileVariableCollector;
2222
import fr.adrienbrault.idea.symfony2plugin.templating.variable.TwigFileVariableCollectorParameter;
23+
import fr.adrienbrault.idea.symfony2plugin.templating.variable.TwigTypeContainer;
2324
import fr.adrienbrault.idea.symfony2plugin.templating.variable.collector.*;
2425
import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil;
2526
import fr.adrienbrault.idea.symfony2plugin.util.PsiElementUtils;
2627
import fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper;
2728
import org.apache.commons.lang.StringUtils;
29+
import org.jetbrains.annotations.Nullable;
2830

2931
import java.util.*;
3032
import java.util.regex.Matcher;
@@ -71,18 +73,18 @@ public static String[] formatPsiTypeName(PsiElement psiElement) {
7173
return possibleTypes;
7274
}
7375

74-
public static Collection<? extends PhpNamedElement> resolveTwigMethodName(PsiElement psiElement, String[] typeName) {
76+
public static Collection<TwigTypeContainer> resolveTwigMethodName(PsiElement psiElement, String[] typeName) {
7577

7678
if(typeName.length == 0) {
7779
return Collections.emptyList();
7880
}
7981

8082
Collection<? extends PhpNamedElement> rootVariable = getRootVariableByName(psiElement, typeName[0]);
8183
if(typeName.length == 1) {
82-
return rootVariable;
84+
return TwigTypeContainer.fromCollection(rootVariable);
8385
}
8486

85-
Collection<? extends PhpNamedElement> type = rootVariable;
87+
Collection<TwigTypeContainer> type = TwigTypeContainer.fromCollection(rootVariable);
8688
for (int i = 1; i <= typeName.length - 1; i++ ) {
8789
type = resolveTwigMethodName(type, typeName[i]);
8890

@@ -93,7 +95,7 @@ public static Collection<? extends PhpNamedElement> resolveTwigMethodName(PsiEle
9395

9496
}
9597

96-
return type;
98+
return TwigTypeContainer.fromCollection(rootVariable);
9799
}
98100

99101
/**
@@ -250,20 +252,24 @@ private static Collection<? extends PhpNamedElement> getRootVariableByName(PsiEl
250252

251253
}
252254

253-
private static Collection<? extends PhpNamedElement> resolveTwigMethodName(Collection<? extends PhpNamedElement> previousElement, String typeName) {
255+
private static Collection<TwigTypeContainer> resolveTwigMethodName(Collection<TwigTypeContainer> previousElement, String typeName) {
254256

255-
ArrayList<PhpNamedElement> phpNamedElements = new ArrayList<PhpNamedElement>();
257+
ArrayList<TwigTypeContainer> phpNamedElements = new ArrayList<TwigTypeContainer>();
258+
259+
for(TwigTypeContainer phpNamedElement: previousElement) {
256260

257-
for(PhpNamedElement phpNamedElement: previousElement) {
258-
for(PhpNamedElement target : getTwigPhpNameTargets(phpNamedElement, typeName)) {
259-
PhpType phpType = target.getType();
260-
for(String typeString: phpType.getTypes()) {
261-
PhpNamedElement phpNamedElement1 = PhpElementsUtil.getClassInterface(phpNamedElement.getProject(), typeString);
262-
if(phpNamedElement1 != null) {
263-
phpNamedElements.add(phpNamedElement1);
261+
if(phpNamedElement.getPhpNamedElement() != null) {
262+
for(PhpNamedElement target : getTwigPhpNameTargets(phpNamedElement.getPhpNamedElement(), typeName)) {
263+
PhpType phpType = target.getType();
264+
for(String typeString: phpType.getTypes()) {
265+
PhpNamedElement phpNamedElement1 = PhpElementsUtil.getClassInterface(phpNamedElement.getPhpNamedElement().getProject(), typeString);
266+
if(phpNamedElement1 != null) {
267+
phpNamedElements.add(new TwigTypeContainer(phpNamedElement1));
268+
}
264269
}
265270
}
266271
}
272+
267273
}
268274

269275
return phpNamedElements;
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package fr.adrienbrault.idea.symfony2plugin.templating.variable;
2+
3+
import com.jetbrains.php.lang.psi.elements.PhpNamedElement;
4+
import org.jetbrains.annotations.Nullable;
5+
6+
import java.util.ArrayList;
7+
import java.util.Collection;
8+
import java.util.List;
9+
10+
public class TwigTypeContainer {
11+
12+
private PhpNamedElement phpNamedElement;
13+
private String stringElement;
14+
15+
public TwigTypeContainer(PhpNamedElement phpNamedElement) {
16+
this.phpNamedElement = phpNamedElement;
17+
}
18+
19+
public TwigTypeContainer(String stringElement) {
20+
this.stringElement = stringElement;
21+
}
22+
23+
@Nullable
24+
public PhpNamedElement getPhpNamedElement() {
25+
return phpNamedElement;
26+
}
27+
28+
@Nullable
29+
public String getStringElement() {
30+
return stringElement;
31+
}
32+
33+
public static Collection<TwigTypeContainer> fromCollection(Collection<? extends PhpNamedElement> phpNamedElements) {
34+
35+
List<TwigTypeContainer> twigTypeContainerList = new ArrayList<TwigTypeContainer>();
36+
37+
for(PhpNamedElement phpNamedElement :phpNamedElements) {
38+
twigTypeContainerList.add(new TwigTypeContainer(phpNamedElement));
39+
}
40+
41+
return twigTypeContainerList;
42+
}
43+
44+
45+
}

0 commit comments

Comments
 (0)