Skip to content

Commit 765f24e

Browse files
committed
add services routes to controller related files #428
1 parent 016a275 commit 765f24e

File tree

4 files changed

+144
-11
lines changed

4 files changed

+144
-11
lines changed

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public LineMarkerInfo collect(PsiElement psiElement) {
3737
return null;
3838
}
3939

40-
if(!(psiElement instanceof Method)) {
40+
if(!(psiElement instanceof Method) || !((Method) psiElement).getAccess().isPublic()) {
4141
return null;
4242
}
4343

src/fr/adrienbrault/idea/symfony2plugin/routing/RouteHelper.java

+22-9
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import fr.adrienbrault.idea.symfony2plugin.Symfony2Icons;
3030
import fr.adrienbrault.idea.symfony2plugin.Symfony2InterfacesUtil;
3131
import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent;
32+
import fr.adrienbrault.idea.symfony2plugin.routing.dic.ServiceRouteContainer;
3233
import fr.adrienbrault.idea.symfony2plugin.routing.dict.RoutesContainer;
3334
import fr.adrienbrault.idea.symfony2plugin.stubs.SymfonyProcessors;
3435
import fr.adrienbrault.idea.symfony2plugin.stubs.dict.StubIndexedRoute;
@@ -653,6 +654,10 @@ public static PsiElement getXmlRouteNameTarget(@NotNull XmlFile psiFile,@NotNull
653654
return null;
654655
}
655656

657+
public static boolean isServiceController(@NotNull String shortcutName) {
658+
return !shortcutName.contains("::") && shortcutName.contains(":") && !shortcutName.contains("\\") && shortcutName.split(":").length == 2;
659+
}
660+
656661
@Nullable
657662
public static List<Route> getRoutesOnControllerAction(@NotNull Method method) {
658663

@@ -668,18 +673,25 @@ public static List<Route> getRoutesOnControllerAction(@NotNull Method method) {
668673
routeNames.add(shortcutName);
669674
}
670675

671-
if(routeNames.size() == 0) {
672-
return null;
673-
}
674-
676+
Map<String, Route> allRoutes = getAllRoutes(method.getProject());
675677
List<Route> routes = new ArrayList<Route>();
676-
for(Map.Entry<String, Route> routeEntry: getAllRoutes(method.getProject()).entrySet()) {
677-
String controller = routeEntry.getValue().getController();
678-
if(controller != null && routeNames.contains(controller)) {
679-
routes.add(routeEntry.getValue());
678+
679+
// resolve indexed routes
680+
if(routeNames.size() > 0) {
681+
for(Map.Entry<String, Route> routeEntry: allRoutes.entrySet()) {
682+
String controller = routeEntry.getValue().getController();
683+
if(controller != null && routeNames.contains(controller)) {
684+
routes.add(routeEntry.getValue());
685+
}
680686
}
681687
}
682688

689+
// search for services
690+
Collection<Route> methodMatch = ServiceRouteContainer.build(allRoutes).getMethodMatches(method);
691+
if(methodMatch.size() > 0) {
692+
routes.addAll(methodMatch);
693+
}
694+
683695
return routes;
684696
}
685697

@@ -807,7 +819,8 @@ public static List<PsiElement> getRouteDefinitionTargets(Project project, String
807819
return targets;
808820
}
809821

810-
public static Map<String, Route> getAllRoutes(Project project) {
822+
@NotNull
823+
public static Map<String, Route> getAllRoutes(@NotNull Project project) {
811824

812825
Map<String, Route> routes = new HashMap<String, Route>();
813826
routes.putAll(RouteHelper.getCompiledRoutes(project));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
package fr.adrienbrault.idea.symfony2plugin.routing.dic;
2+
3+
import com.intellij.openapi.project.Project;
4+
import com.jetbrains.php.lang.psi.elements.Method;
5+
import com.jetbrains.php.lang.psi.elements.PhpClass;
6+
import fr.adrienbrault.idea.symfony2plugin.routing.Route;
7+
import fr.adrienbrault.idea.symfony2plugin.routing.RouteHelper;
8+
import fr.adrienbrault.idea.symfony2plugin.stubs.ContainerCollectionResolver;
9+
import fr.adrienbrault.idea.symfony2plugin.util.dict.ServiceUtil;
10+
import org.jetbrains.annotations.NotNull;
11+
12+
import java.util.*;
13+
14+
/**
15+
* @author Daniel Espendiller <daniel@espendiller.net>
16+
*/
17+
public class ServiceRouteContainer {
18+
19+
private final Collection<Route> routes;
20+
private ContainerCollectionResolver.LazyServiceCollector lazyServiceCollector;
21+
22+
private Map<String, PhpClass> serviceCache = new HashMap<String, PhpClass>();
23+
24+
private ServiceRouteContainer(@NotNull Collection<Route> routes) {
25+
this.routes = routes;
26+
}
27+
28+
public Set<String> getServiceNames() {
29+
30+
Set<String> services = new HashSet<String>();
31+
32+
for (Route route : this.routes) {
33+
34+
String controller = route.getController();
35+
if(controller == null) {
36+
continue;
37+
}
38+
39+
String[] split = controller.split(":");
40+
if(split.length > 1) {
41+
services.add(split[0]);
42+
}
43+
44+
}
45+
46+
return services;
47+
}
48+
49+
@NotNull
50+
public Collection<Route> getMethodMatches(Method method) {
51+
52+
PhpClass originClass = method.getContainingClass();
53+
if(originClass == null) {
54+
return Collections.emptyList();
55+
}
56+
57+
String classFqn = originClass.getPresentableFQN();
58+
if(classFqn == null) {
59+
return Collections.emptyList();
60+
}
61+
62+
Collection<Route> routes = new ArrayList<Route>();
63+
64+
for (Route route : this.routes) {
65+
66+
String serviceRoute = route.getController();
67+
if(serviceRoute == null) {
68+
continue;
69+
}
70+
71+
String[] split = serviceRoute.split(":");
72+
if(split.length != 2) {
73+
continue;
74+
}
75+
76+
if(!serviceCache.containsKey(split[0])) {
77+
serviceCache.put(split[0], ServiceUtil.getResolvedClassDefinition(method.getProject(), split[0], getLazyServiceCollector(method.getProject())));
78+
}
79+
80+
PhpClass phpClass = serviceCache.get(split[0]);
81+
if(phpClass != null && classFqn.equals(phpClass.getPresentableFQN())) {
82+
routes.add(route);
83+
}
84+
}
85+
86+
return routes;
87+
}
88+
89+
private ContainerCollectionResolver.LazyServiceCollector getLazyServiceCollector(Project project) {
90+
return this.lazyServiceCollector == null ? this.lazyServiceCollector = new ContainerCollectionResolver.LazyServiceCollector(project) : this.lazyServiceCollector;
91+
}
92+
93+
/**
94+
* Build container which stores all service routes
95+
*
96+
* @param routes Unfiltered routes
97+
*/
98+
@NotNull
99+
public static ServiceRouteContainer build(@NotNull Map<String, Route> routes) {
100+
101+
Collection<Route> serviceRoutes = new ArrayList<Route>();
102+
103+
for (Route route : routes.values()) {
104+
105+
String controller = route.getController();
106+
if(controller == null || !RouteHelper.isServiceController(controller)) {
107+
continue;
108+
}
109+
110+
String[] split = controller.split(":");
111+
if(split.length > 1) {
112+
serviceRoutes.add(route);
113+
}
114+
115+
}
116+
117+
return new ServiceRouteContainer(serviceRoutes);
118+
}
119+
120+
}

src/fr/adrienbrault/idea/symfony2plugin/util/controller/ControllerIndex.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public List<ControllerAction> getActions() {
4949
public ControllerAction getControllerActionOnService(String shortcutName) {
5050

5151
// only foo_bar:Method is valid
52-
if(shortcutName.contains("::") || !shortcutName.contains(":") || shortcutName.contains("\\")) {
52+
if(!RouteHelper.isServiceController(shortcutName)) {
5353
return null;
5454
}
5555

0 commit comments

Comments
 (0)