Skip to content

Commit 16de93a

Browse files
committed
add repository related controller files, update template related targets to use recursive method references matcher
1 parent dd4d3c5 commit 16de93a

File tree

3 files changed

+80
-42
lines changed

3 files changed

+80
-42
lines changed

src/fr/adrienbrault/idea/symfony2plugin/dic/ControllerMethodLineMarkerProvider.java

Lines changed: 53 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,28 @@
44
import com.intellij.codeInsight.daemon.LineMarkerProvider;
55
import com.intellij.codeInsight.navigation.NavigationGutterIconBuilder;
66
import com.intellij.navigation.GotoRelatedItem;
7-
import com.intellij.openapi.util.Iconable;
87
import com.intellij.psi.PsiElement;
9-
import com.intellij.psi.impl.ElementBase;
8+
import com.intellij.psi.PsiFile;
9+
import com.intellij.psi.util.PsiElementFilter;
1010
import com.intellij.psi.util.PsiTreeUtil;
1111
import com.intellij.util.ConstantFunction;
1212
import com.jetbrains.php.lang.documentation.phpdoc.psi.PhpDocComment;
1313
import com.jetbrains.php.lang.documentation.phpdoc.psi.tags.PhpDocTag;
1414
import com.jetbrains.php.lang.psi.elements.*;
1515
import fr.adrienbrault.idea.symfony2plugin.Symfony2Icons;
16-
import fr.adrienbrault.idea.symfony2plugin.Symfony2InterfacesUtil;
1716
import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent;
1817
import fr.adrienbrault.idea.symfony2plugin.TwigHelper;
18+
import fr.adrienbrault.idea.symfony2plugin.config.SymfonyPhpReferenceContributor;
19+
import fr.adrienbrault.idea.symfony2plugin.doctrine.EntityHelper;
1920
import fr.adrienbrault.idea.symfony2plugin.routing.Route;
2021
import fr.adrienbrault.idea.symfony2plugin.routing.RouteHelper;
2122
import fr.adrienbrault.idea.symfony2plugin.templating.util.TwigUtil;
23+
import fr.adrienbrault.idea.symfony2plugin.util.MethodMatcher;
2224
import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil;
23-
import fr.adrienbrault.idea.symfony2plugin.util.PsiElementUtils;
2425
import icons.TwigIcons;
2526
import org.jetbrains.annotations.NotNull;
2627
import org.jetbrains.annotations.Nullable;
28+
import org.jetbrains.yaml.psi.YAMLFile;
2729

2830
import javax.swing.*;
2931
import java.util.*;
@@ -90,8 +92,19 @@ public LineMarkerInfo collect(PsiElement psiElement) {
9092
public static List<GotoRelatedItem> getGotoRelatedItems(Method method) {
9193
List<GotoRelatedItem> gotoRelatedItems = new ArrayList<GotoRelatedItem>();
9294

93-
attachRelatedTemplates(method, gotoRelatedItems);
95+
96+
// inside method
97+
PsiElement[] methodParameter = PsiTreeUtil.collectElements(method, new PsiElementFilter() {
98+
@Override
99+
public boolean isAccepted(PsiElement psiElement) {
100+
return psiElement.getParent() instanceof ParameterList;
101+
}
102+
});
103+
104+
attachRelatedTemplates(method, methodParameter, gotoRelatedItems);
94105
attachRelatedRoutes(method, gotoRelatedItems);
106+
attachRelatedModels(method, methodParameter, gotoRelatedItems);
107+
95108
return gotoRelatedItems;
96109
}
97110

@@ -120,7 +133,7 @@ private static void attachRelatedRoutes(PsiElement psiElement, List<GotoRelatedI
120133
}
121134
}
122135

123-
private static void attachRelatedTemplates(Method method, List<GotoRelatedItem> gotoRelatedItems) {
136+
private static void attachRelatedTemplates(Method method, PsiElement[] parameterValues, List<GotoRelatedItem> gotoRelatedItems) {
124137

125138
Set<String> uniqueTemplates = new HashSet<String>();
126139

@@ -151,23 +164,46 @@ private static void attachRelatedTemplates(Method method, List<GotoRelatedItem>
151164
}
152165
}
153166

154-
// inside method
155-
for(MethodReference methodReference : PsiTreeUtil.findChildrenOfType(method, MethodReference.class)) {
156-
if(new Symfony2InterfacesUtil().isTemplatingRenderCall(methodReference)) {
157-
PsiElement templateParameter = PsiElementUtils.getMethodParameterPsiElementAt((methodReference).getParameterList(), 0);
158-
if(templateParameter != null) {
159-
String resolveString = PhpElementsUtil.getStringValue(templateParameter);
160-
if(resolveString != null && !uniqueTemplates.contains(resolveString)) {
161-
uniqueTemplates.add(resolveString);
162-
for(PsiElement templateTarget: TwigHelper.getTemplatePsiElements(method.getProject(), resolveString)) {
163-
gotoRelatedItems.add(new RelatedPopupGotoLineMarker.PopupGotoRelatedItem(templateTarget, resolveString).withIcon(TwigIcons.TwigFileIcon, Symfony2Icons.TWIG_LINE_MARKER));
164-
}
167+
for(PsiElement psiElement: parameterValues) {
168+
MethodMatcher.MethodMatchParameter matchedSignature = MethodMatcher.getMatchedSignatureWithDepth(psiElement, SymfonyPhpReferenceContributor.TEMPLATE_SIGNATURES);
169+
if (matchedSignature != null) {
170+
String resolveString = PhpElementsUtil.getStringValue(psiElement);
171+
if(resolveString != null && !uniqueTemplates.contains(resolveString)) {
172+
uniqueTemplates.add(resolveString);
173+
for(PsiElement templateTarget: TwigHelper.getTemplatePsiElements(method.getProject(), resolveString)) {
174+
gotoRelatedItems.add(new RelatedPopupGotoLineMarker.PopupGotoRelatedItem(templateTarget, resolveString).withIcon(TwigIcons.TwigFileIcon, Symfony2Icons.TWIG_LINE_MARKER));
165175
}
166176
}
167177
}
178+
168179
}
169180

170181

171182
}
172183

184+
private static void attachRelatedModels(Method method, PsiElement[] parameterValues, List<GotoRelatedItem> gotoRelatedItems) {
185+
186+
for(PsiElement psiElement: parameterValues) {
187+
MethodMatcher.MethodMatchParameter matchedSignature = MethodMatcher.getMatchedSignatureWithDepth(psiElement, SymfonyPhpReferenceContributor.REPOSITORY_SIGNATURES);
188+
if (matchedSignature != null) {
189+
String resolveString = PhpElementsUtil.getStringValue(psiElement);
190+
if(resolveString != null) {
191+
for(PsiElement templateTarget: EntityHelper.getModelPsiTargets(method.getProject(), resolveString)) {
192+
193+
// we can provide targets to model config and direct class targets
194+
if(templateTarget instanceof PsiFile) {
195+
gotoRelatedItems.add(new RelatedPopupGotoLineMarker.PopupGotoRelatedItem(templateTarget, resolveString).withIcon(templateTarget.getIcon(0), Symfony2Icons.SYMFONY_LINE_MARKER));
196+
} else {
197+
// @TODO: we can resolve for model types and provide icons, but not for now
198+
gotoRelatedItems.add(new RelatedPopupGotoLineMarker.PopupGotoRelatedItem(templateTarget, resolveString).withIcon(Symfony2Icons.DOCTRINE, Symfony2Icons.SYMFONY_LINE_MARKER));
199+
}
200+
201+
}
202+
}
203+
}
204+
205+
}
206+
207+
}
208+
173209
}

src/fr/adrienbrault/idea/symfony2plugin/doctrine/EntityHelper.java

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@
22

33
import com.intellij.openapi.project.Project;
44
import com.intellij.openapi.vfs.VirtualFile;
5-
import com.intellij.psi.PsiElement;
6-
import com.intellij.psi.PsiElementResolveResult;
7-
import com.intellij.psi.PsiFile;
8-
import com.intellij.psi.PsiManager;
5+
import com.intellij.psi.*;
96
import com.jetbrains.php.PhpIndex;
107
import com.jetbrains.php.lang.documentation.phpdoc.psi.PhpDocComment;
118
import com.jetbrains.php.lang.psi.elements.*;
@@ -20,6 +17,7 @@
2017
import fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper;
2118
import fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlKeyFinder;
2219
import fr.adrienbrault.idea.symfony2plugin.util.StringUtils;
20+
import org.jetbrains.annotations.NotNull;
2321
import org.jetbrains.annotations.Nullable;
2422
import org.jetbrains.yaml.psi.YAMLDocument;
2523
import org.jetbrains.yaml.psi.YAMLFile;
@@ -297,4 +295,28 @@ public static DoctrineTypes.Manager getManager(MethodReference methodReference)
297295
return null;
298296
}
299297

298+
public static PsiElement[] getModelPsiTargets(Project project, @NotNull String entityName) {
299+
List<PsiElement> results = new ArrayList<PsiElement>();
300+
301+
PhpClass phpClass = EntityHelper.getEntityRepositoryClass(project, entityName);
302+
if(phpClass != null) {
303+
results.add(phpClass);
304+
}
305+
306+
// search any php model file
307+
PhpClass entity = EntityHelper.resolveShortcutName(project, entityName);
308+
if(entity != null) {
309+
results.add(entity);
310+
311+
// find model config eg ClassName.orm.yml
312+
PsiFile psiFile = EntityHelper.getModelConfigFile(entity);
313+
if(psiFile != null) {
314+
results.add(psiFile);
315+
}
316+
317+
}
318+
319+
return results.toArray(new PsiElement[results.size()]);
320+
}
321+
300322
}

src/fr/adrienbrault/idea/symfony2plugin/doctrine/EntityReference.java

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -48,27 +48,7 @@ public EntityReference(@NotNull StringLiteralExpression element, DoctrineTypes.M
4848
@NotNull
4949
@Override
5050
public ResolveResult[] multiResolve(boolean incompleteCode) {
51-
List<ResolveResult> results = new ArrayList<ResolveResult>();
52-
53-
PhpClass phpClass = EntityHelper.getEntityRepositoryClass(getElement().getProject(), this.entityName);
54-
if(phpClass != null) {
55-
results.add(new PsiElementResolveResult(phpClass));
56-
}
57-
58-
// search any php model file
59-
PhpClass entity = EntityHelper.resolveShortcutName(getElement().getProject(), this.entityName);
60-
if(entity != null) {
61-
results.add(new PsiElementResolveResult(entity));
62-
63-
// find model config eg ClassName.orm.yml
64-
PsiFile psiFile = EntityHelper.getModelConfigFile(entity);
65-
if(psiFile != null) {
66-
results.add(new PsiElementResolveResult(psiFile));
67-
}
68-
69-
}
70-
71-
return results.toArray(new ResolveResult[results.size()]);
51+
return PsiElementResolveResult.createResults(EntityHelper.getModelPsiTargets(getElement().getProject(), this.entityName));
7252
}
7353

7454
@NotNull

0 commit comments

Comments
 (0)