Skip to content

Commit a3b06d4

Browse files
committedMar 9, 2014
add references provider for console HelperSet #243
1 parent 4bd9978 commit a3b06d4

File tree

4 files changed

+120
-56
lines changed

4 files changed

+120
-56
lines changed
 

‎src/fr/adrienbrault/idea/symfony2plugin/config/SymfonyPhpReferenceContributor.java

+23-1
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@
66
import com.jetbrains.php.lang.PhpLanguage;
77
import com.jetbrains.php.lang.psi.elements.PhpClass;
88
import com.jetbrains.php.lang.psi.elements.StringLiteralExpression;
9-
import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent;
9+
import fr.adrienbrault.idea.symfony2plugin.dic.MapClassReference;
1010
import fr.adrienbrault.idea.symfony2plugin.dic.ServiceReference;
1111
import fr.adrienbrault.idea.symfony2plugin.doctrine.EntityHelper;
1212
import fr.adrienbrault.idea.symfony2plugin.doctrine.EntityReference;
1313
import fr.adrienbrault.idea.symfony2plugin.doctrine.ModelFieldReference;
1414
import fr.adrienbrault.idea.symfony2plugin.doctrine.dict.DoctrineTypes;
1515
import fr.adrienbrault.idea.symfony2plugin.templating.TemplateReference;
16+
import fr.adrienbrault.idea.symfony2plugin.util.CommandUtil;
1617
import fr.adrienbrault.idea.symfony2plugin.util.MethodMatcher;
1718
import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil;
1819
import org.jetbrains.annotations.NotNull;
@@ -45,6 +46,12 @@ public class SymfonyPhpReferenceContributor extends PsiReferenceContributor {
4546
new MethodMatcher.CallToSignature("\\Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller", "stream"),
4647
};
4748

49+
public static MethodMatcher.CallToSignature[] CONSOLE_HELP_SET = new MethodMatcher.CallToSignature[] {
50+
new MethodMatcher.CallToSignature("\\Symfony\\Component\\Console\\Helper\\HelperSet", "get"),
51+
new MethodMatcher.CallToSignature("\\Symfony\\Component\\Console\\Helper\\HelperSet", "has"),
52+
new MethodMatcher.CallToSignature("\\Symfony\\Component\\Console\\Command\\Command", "getHelper"),
53+
};
54+
4855
@Override
4956
public void registerReferenceProviders(PsiReferenceRegistrar psiReferenceRegistrar) {
5057

@@ -149,6 +156,21 @@ public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @No
149156
}
150157
);
151158

159+
psiReferenceRegistrar.registerReferenceProvider(
160+
PlatformPatterns.psiElement(StringLiteralExpression.class),
161+
new PsiReferenceProvider() {
162+
@NotNull
163+
@Override
164+
public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @NotNull ProcessingContext processingContext) {
165+
166+
if (MethodMatcher.getMatchedSignatureWithDepth(psiElement, CONSOLE_HELP_SET) == null) {
167+
return new PsiReference[0];
168+
}
169+
170+
return new PsiReference[]{ new MapClassReference((StringLiteralExpression) psiElement, CommandUtil.getCommandHelper(psiElement.getProject()))};
171+
}
172+
}
173+
);
152174

153175
}
154176

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package fr.adrienbrault.idea.symfony2plugin.dic;
2+
3+
import com.intellij.codeInsight.lookup.LookupElement;
4+
import com.intellij.codeInsight.lookup.LookupElementBuilder;
5+
import com.intellij.psi.PsiElement;
6+
import com.intellij.psi.PsiElementResolveResult;
7+
import com.intellij.psi.PsiPolyVariantReferenceBase;
8+
import com.intellij.psi.ResolveResult;
9+
import com.jetbrains.php.PhpIcons;
10+
import com.jetbrains.php.lang.psi.elements.PhpClass;
11+
import com.jetbrains.php.lang.psi.elements.StringLiteralExpression;
12+
import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil;
13+
import org.jetbrains.annotations.NotNull;
14+
15+
import java.util.ArrayList;
16+
import java.util.List;
17+
import java.util.Map;
18+
19+
public class MapClassReference extends PsiPolyVariantReferenceBase<PsiElement> {
20+
21+
private Map<String, String> variants;
22+
23+
public MapClassReference(@NotNull StringLiteralExpression element, Map<String, String> variants) {
24+
super(element);
25+
this.variants = variants;
26+
}
27+
28+
@NotNull
29+
@Override
30+
public ResolveResult[] multiResolve(boolean incompleteCode) {
31+
32+
List<ResolveResult> resolveResults = new ArrayList<ResolveResult>();
33+
34+
for (Map.Entry<String, String> entry: this.variants.entrySet()) {
35+
PhpClass phpClass = PhpElementsUtil.getClassInterface(getElement().getProject(), entry.getValue());
36+
if(phpClass != null) {
37+
resolveResults.add(new PsiElementResolveResult(phpClass));
38+
}
39+
}
40+
41+
42+
return resolveResults.toArray(new ResolveResult[resolveResults.size()]);
43+
}
44+
45+
@NotNull
46+
@Override
47+
public Object[] getVariants() {
48+
49+
List<LookupElement> lookupElements = new ArrayList<LookupElement>();
50+
for (Map.Entry<String, String> entry: this.variants.entrySet()) {
51+
PhpClass phpClass = PhpElementsUtil.getClassInterface(getElement().getProject(), entry.getValue());
52+
if(phpClass != null) {
53+
lookupElements.add(LookupElementBuilder.create(entry.getKey()).withIcon(PhpIcons.CLASS).withTypeText(phpClass.getPresentableFQN()));
54+
}
55+
}
56+
57+
return lookupElements.toArray();
58+
59+
}
60+
}

‎src/fr/adrienbrault/idea/symfony2plugin/dic/StringArrayListReference.java

-55
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package fr.adrienbrault.idea.symfony2plugin.util;
2+
3+
import com.intellij.openapi.project.Project;
4+
import com.intellij.psi.util.PsiTreeUtil;
5+
import com.jetbrains.php.PhpIndex;
6+
import com.jetbrains.php.lang.psi.elements.Method;
7+
import com.jetbrains.php.lang.psi.elements.PhpClass;
8+
import com.jetbrains.php.lang.psi.elements.PhpReturn;
9+
10+
import java.util.Collection;
11+
import java.util.HashMap;
12+
import java.util.Map;
13+
14+
public class CommandUtil {
15+
16+
public static Map<String, String> getCommandHelper(Project project) {
17+
18+
Map<String, String> map = new HashMap<String, String>();
19+
Collection<PhpClass> phpClasses = PhpIndex.getInstance(project).getAllSubclasses("\\Symfony\\Component\\Console\\Helper\\HelperInterface");
20+
for(PhpClass phpClass: phpClasses) {
21+
Method method = PhpElementsUtil.getClassMethod(phpClass, "getName");
22+
for(PhpReturn phpReturn: PsiTreeUtil.findChildrenOfType(method, PhpReturn.class)) {
23+
String nameValue = PhpElementsUtil.getStringValue(phpReturn.getArgument());
24+
if(nameValue != null) {
25+
String presentableFQN = phpClass.getPresentableFQN();
26+
if(presentableFQN != null) {
27+
map.put(nameValue, presentableFQN);
28+
}
29+
}
30+
}
31+
}
32+
33+
return map;
34+
}
35+
36+
37+
}

0 commit comments

Comments
 (0)
Please sign in to comment.