Skip to content

Commit 56e3ac5

Browse files
committed
add weak routes on yaml index Haehnchen#261
1 parent c58dd3a commit 56e3ac5

10 files changed

+126
-48
lines changed

src/fr/adrienbrault/idea/symfony2plugin/Symfony2Icons.java

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public class Symfony2Icons {
1515
public static final Icon DOCTRINE = IconLoader.getIcon("icons/doctrine.png");
1616
public static final Icon MONGODB = IconLoader.getIcon("icons/mongodb.png");
1717
public static final Icon ROUTE = IconLoader.getIcon("icons/route.png");
18+
public static final Icon ROUTE_WEAK = IconLoader.getIcon("icons/route_weak.png");
1819
public static final Icon SERVICE = IconLoader.getIcon("icons/service.png");
1920
public static final Icon SERVICE_OPACITY = IconLoader.getIcon("icons/service_opacity.png");
2021
public static final Icon FORM_TYPE = IconLoader.getIcon("icons/form_type.png");
Loading
Loading

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

+43-5
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,20 @@
22

33
import com.intellij.lang.annotation.AnnotationHolder;
44
import com.intellij.lang.annotation.Annotator;
5+
import com.intellij.openapi.project.Project;
56
import com.intellij.psi.PsiElement;
7+
import com.intellij.psi.search.GlobalSearchScope;
8+
import com.intellij.util.Processor;
9+
import com.intellij.util.indexing.FileBasedIndexImpl;
610
import com.jetbrains.php.lang.psi.elements.MethodReference;
711
import fr.adrienbrault.idea.symfony2plugin.Settings;
812
import fr.adrienbrault.idea.symfony2plugin.Symfony2InterfacesUtil;
913
import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent;
14+
import fr.adrienbrault.idea.symfony2plugin.stubs.indexes.YamlRoutesStubIndex;
1015
import fr.adrienbrault.idea.symfony2plugin.util.ParameterBag;
1116
import fr.adrienbrault.idea.symfony2plugin.util.PsiElementUtils;
1217
import org.jetbrains.annotations.NotNull;
18+
import org.jetbrains.yaml.YAMLFileType;
1319

1420
import java.util.Map;
1521

@@ -35,15 +41,47 @@ public void annotate(@NotNull final PsiElement element, @NotNull AnnotationHolde
3541
return;
3642
}
3743

38-
Symfony2ProjectComponent symfony2ProjectComponent = element.getProject().getComponent(Symfony2ProjectComponent.class);
39-
Map<String,Route> routes = symfony2ProjectComponent.getRoutes();
40-
String routeName = Symfony2InterfacesUtil.getFirstArgumentStringValue(methodReference);
44+
45+
final String routeName = Symfony2InterfacesUtil.getFirstArgumentStringValue(methodReference);
46+
if(routeName == null) {
47+
return;
48+
}
49+
50+
annotateRouteName(element, holder, routeName);
51+
52+
}
53+
54+
public static void annotateRouteName(PsiElement target, @NotNull AnnotationHolder holder, final String routeName) {
55+
56+
Symfony2ProjectComponent symfony2ProjectComponent = target.getProject().getComponent(Symfony2ProjectComponent.class);
57+
Map<String, Route> routes = symfony2ProjectComponent.getRoutes();
58+
4159

4260
if(routes.containsKey(routeName)) {
43-
return;
61+
return;
62+
}
63+
64+
final boolean[] isWeak = {false};
65+
FileBasedIndexImpl.getInstance().processAllKeys(YamlRoutesStubIndex.KEY, new Processor<String>() {
66+
@Override
67+
public boolean process(String s) {
68+
69+
if(routeName.equals(s)) {
70+
isWeak[0] = true;
71+
return false;
72+
}
73+
74+
return true;
75+
}
76+
}, GlobalSearchScope.getScopeRestrictedByFileTypes(GlobalSearchScope.allScope(target.getProject()), YAMLFileType.YML), null);
77+
78+
if(isWeak[0]) {
79+
holder.createWeakWarningAnnotation(target, "Weak Route");
80+
return;
4481
}
4582

46-
holder.createWarningAnnotation(element, "Missing Route");
83+
holder.createWarningAnnotation(target, "Missing Route");
4784

4885
}
86+
4987
}

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

+47-4
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55
import com.intellij.openapi.project.Project;
66
import com.intellij.openapi.vfs.VfsUtil;
77
import com.intellij.openapi.vfs.VirtualFile;
8-
import com.intellij.psi.PsiElement;
9-
import com.intellij.psi.PsiFile;
10-
import com.intellij.psi.PsiManager;
8+
import com.intellij.psi.*;
9+
import com.intellij.psi.search.GlobalSearchScope;
1110
import com.intellij.psi.util.PsiTreeUtil;
1211
import com.intellij.util.Processor;
1312
import com.intellij.util.indexing.FileBasedIndexImpl;
1413
import com.jetbrains.php.PhpIndex;
1514
import com.jetbrains.php.lang.psi.PhpFile;
1615
import com.jetbrains.php.lang.psi.elements.*;
16+
import com.jetbrains.twig.TwigFileType;
1717
import fr.adrienbrault.idea.symfony2plugin.Symfony2Icons;
1818
import fr.adrienbrault.idea.symfony2plugin.Symfony2InterfacesUtil;
1919
import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent;
@@ -24,6 +24,7 @@
2424
import fr.adrienbrault.idea.symfony2plugin.util.controller.ControllerIndex;
2525
import fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper;
2626
import org.jetbrains.annotations.Nullable;
27+
import org.jetbrains.yaml.YAMLFileType;
2728
import org.jetbrains.yaml.psi.YAMLCompoundValue;
2829
import org.jetbrains.yaml.psi.YAMLDocument;
2930
import org.jetbrains.yaml.psi.YAMLKeyValue;
@@ -291,7 +292,7 @@ public boolean process(VirtualFile virtualFile) {
291292
virtualFiles.add(virtualFile);
292293
return true;
293294
}
294-
}, PhpIndex.getInstance(project).getSearchScope());
295+
}, GlobalSearchScope.getScopeRestrictedByFileTypes(GlobalSearchScope.allScope(project), YAMLFileType.YML));
295296

296297
return virtualFiles.toArray(new VirtualFile[virtualFiles.size()]);
297298

@@ -388,4 +389,46 @@ public static String getRouteUrl(List<Collection<String>> routeTokens) {
388389
return url.length() == 0 ? null : url;
389390
}
390391

392+
public static List<LookupElement> getRoutesLookupElements(Project project) {
393+
394+
Symfony2ProjectComponent symfony2ProjectComponent = project.getComponent(Symfony2ProjectComponent.class);
395+
Map<String, Route> routes = symfony2ProjectComponent.getRoutes();
396+
397+
final List<LookupElement> lookupElements = new ArrayList<LookupElement>();
398+
399+
final Set<String> uniqueSet = new HashSet<String>();
400+
for (Route route : routes.values()) {
401+
lookupElements.add(new RouteLookupElement(route));
402+
uniqueSet.add(route.getName());
403+
}
404+
405+
FileBasedIndexImpl.getInstance().processAllKeys(YamlRoutesStubIndex.KEY, new Processor<String>() {
406+
@Override
407+
public boolean process(String s) {
408+
409+
if(!uniqueSet.contains(s)) {
410+
lookupElements.add(new RouteLookupElement(new Route(s, null), true));
411+
}
412+
413+
return true;
414+
}
415+
}, GlobalSearchScope.getScopeRestrictedByFileTypes(GlobalSearchScope.allScope(project), YAMLFileType.YML), null);
416+
417+
return lookupElements;
418+
419+
}
420+
421+
public static List<PsiElement> getRouteDefinitionTargets(Project project, String routeName) {
422+
423+
List<PsiElement> targets = new ArrayList<PsiElement>();
424+
Collections.addAll(targets, RouteHelper.getMethods(project, routeName));
425+
426+
PsiElement yamlKey = RouteHelper.getRouteNameTarget(project, routeName);
427+
if(yamlKey != null) {
428+
targets.add(yamlKey);
429+
}
430+
431+
return targets;
432+
}
433+
391434
}

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

+8-2
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,18 @@
1010
*/
1111
public class RouteLookupElement extends LookupElement {
1212

13-
private Route route;
13+
final private Route route;
14+
private boolean isWeak = false;
1415

1516
public RouteLookupElement(Route route) {
1617
this.route = route;
1718
}
1819

20+
public RouteLookupElement(Route route, boolean isWeak) {
21+
this(route);
22+
this.isWeak = isWeak;
23+
}
24+
1925
@NotNull
2026
@Override
2127
public String getLookupString() {
@@ -26,7 +32,7 @@ public void renderElement(LookupElementPresentation presentation) {
2632
presentation.setItemText(getLookupString());
2733
presentation.setTypeText(route.getController());
2834
presentation.setTypeGrayed(true);
29-
presentation.setIcon(Symfony2Icons.ROUTE);
35+
presentation.setIcon(!this.isWeak ? Symfony2Icons.ROUTE : Symfony2Icons.ROUTE_WEAK);
3036
}
3137

3238
}
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,11 @@
11
package fr.adrienbrault.idea.symfony2plugin.routing;
22

3-
import com.intellij.codeInsight.lookup.LookupElement;
43
import com.intellij.psi.PsiElement;
54
import com.intellij.psi.PsiElementResolveResult;
65
import com.intellij.psi.PsiPolyVariantReferenceBase;
76
import com.intellij.psi.ResolveResult;
87
import com.jetbrains.php.lang.psi.elements.StringLiteralExpression;
9-
import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent;
108
import org.jetbrains.annotations.NotNull;
11-
import org.jetbrains.annotations.Nullable;
12-
13-
import java.util.ArrayList;
14-
import java.util.List;
15-
import java.util.Map;
169

1710
/**
1811
* @author Adrien Brault <adrien.brault@gmail.com>
@@ -29,26 +22,13 @@ public RouteReference(@NotNull StringLiteralExpression element) {
2922
@NotNull
3023
@Override
3124
public ResolveResult[] multiResolve(boolean incompleteCode) {
32-
List<ResolveResult> results = new ArrayList<ResolveResult>();
33-
34-
for (PsiElement psiElement : RouteHelper.getMethods(this.getElement().getProject(), this.routeName)) {
35-
results.add(new PsiElementResolveResult(psiElement));
36-
}
37-
38-
return results.toArray(new ResolveResult[results.size()]);
25+
return PsiElementResolveResult.createResults(RouteHelper.getRouteDefinitionTargets(getElement().getProject(), this.routeName));
3926
}
4027

4128
@NotNull
4229
@Override
4330
public Object[] getVariants() {
44-
Symfony2ProjectComponent symfony2ProjectComponent = getElement().getProject().getComponent(Symfony2ProjectComponent.class);
45-
Map<String,Route> routes = symfony2ProjectComponent.getRoutes();
46-
47-
List<LookupElement> lookupElements = new ArrayList<LookupElement>();
48-
for (Route route : routes.values()) {
49-
lookupElements.add(new RouteLookupElement(route));
50-
}
51-
52-
return lookupElements.toArray();
31+
return RouteHelper.getRoutesLookupElements(getElement().getProject()).toArray();
5332
}
33+
5434
}

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

+6-5
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@
1212
import fr.adrienbrault.idea.symfony2plugin.TwigHelper;
1313
import fr.adrienbrault.idea.symfony2plugin.asset.dic.AssetDirectoryReader;
1414
import fr.adrienbrault.idea.symfony2plugin.asset.dic.AssetFile;
15+
import fr.adrienbrault.idea.symfony2plugin.routing.PhpRoutingAnnotator;
1516
import fr.adrienbrault.idea.symfony2plugin.routing.Route;
1617
import fr.adrienbrault.idea.symfony2plugin.templating.util.TwigUtil;
1718
import fr.adrienbrault.idea.symfony2plugin.translation.TranslationKeyIntentionAction;
1819
import fr.adrienbrault.idea.symfony2plugin.translation.dict.TranslationUtil;
1920
import fr.adrienbrault.idea.symfony2plugin.util.PsiElementUtils;
21+
import org.apache.commons.lang.StringUtils;
2022
import org.jetbrains.annotations.NotNull;
2123
import org.jetbrains.yaml.psi.YAMLFile;
2224

@@ -91,18 +93,17 @@ private void annotateTranslationDomain(@NotNull final PsiElement psiElement, @No
9193
}
9294

9395
private void annotateRoute(@NotNull final PsiElement element, @NotNull AnnotationHolder holder) {
96+
9497
if(!TwigHelper.getAutocompletableRoutePattern().accepts(element)) {
9598
return;
9699
}
97100

98-
Symfony2ProjectComponent symfony2ProjectComponent = element.getProject().getComponent(Symfony2ProjectComponent.class);
99-
Map<String,Route> routes = symfony2ProjectComponent.getRoutes();
100-
101-
if(routes.containsKey(element.getText())) {
101+
String text = element.getText();
102+
if(StringUtils.isBlank(text)) {
102103
return;
103104
}
104105

105-
holder.createWarningAnnotation(element, "Missing Route");
106+
PhpRoutingAnnotator.annotateRouteName(element, holder, text);
106107
}
107108

108109
private void annotateTemplate(@NotNull final PsiElement element, @NotNull AnnotationHolder holder) {

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

+3-8
Original file line numberDiff line numberDiff line change
@@ -335,24 +335,19 @@ public void addCompletions(@NotNull CompletionParameters parameters,
335335
return;
336336
}
337337

338-
Symfony2ProjectComponent symfony2ProjectComponent = parameters.getPosition().getProject().getComponent(Symfony2ProjectComponent.class);
339-
Map<String,Route> routes = symfony2ProjectComponent.getRoutes();
340-
341-
for (Route route : routes.values()) {
342-
resultSet.addElement(new RouteLookupElement(route));
343-
}
338+
resultSet.addAllElements(RouteHelper.getRoutesLookupElements(parameters.getPosition().getProject()));
344339
}
345340
}
346341
);
347342

348-
// routing completion like path() function
343+
// routing parameter completion
349344
extend(
350345
CompletionType.BASIC,
351346
TwigHelper.getPathAfterLeafPattern(),
352347
new PathParameterCompletionProvider()
353348
);
354349

355-
// routing completion like path() function
350+
// simulated php completion var.<foo>
356351
extend(
357352
CompletionType.BASIC,
358353
TwigHelper.getTypeCompletionPattern(),

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

+15-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil;
2222
import fr.adrienbrault.idea.symfony2plugin.util.PsiElementUtils;
2323
import fr.adrienbrault.idea.symfony2plugin.util.controller.ControllerIndex;
24+
import org.apache.commons.lang.StringUtils;
2425
import org.jetbrains.annotations.Nullable;
2526

2627
import java.util.*;
@@ -165,7 +166,20 @@ public static PsiElement[] getBlockNameGoTo(PsiFile psiFile, String blockName) {
165166
}
166167

167168
private PsiElement[] getRouteGoTo(PsiElement psiElement) {
168-
return RouteHelper.getMethods(psiElement.getProject(), PsiElementUtils.getText(psiElement));
169+
170+
String text = PsiElementUtils.getText(psiElement);
171+
172+
if(StringUtils.isBlank(text)) {
173+
return new PsiElement[0];
174+
}
175+
176+
PsiElement[] methods = RouteHelper.getMethods(psiElement.getProject(), text);
177+
if(methods.length > 0) {
178+
return methods;
179+
}
180+
181+
List<PsiElement> psiElementList = RouteHelper.getRouteDefinitionTargets(psiElement.getProject(), text);
182+
return psiElementList.toArray(new PsiElement[psiElementList.size()]);
169183
}
170184

171185
private PsiElement[] getTranslationKeyGoTo(PsiElement psiElement) {

0 commit comments

Comments
 (0)