Skip to content

Commit 08f68a1

Browse files
committed
add reference provider for twig block function Haehnchen#266
1 parent 26b7710 commit 08f68a1

File tree

7 files changed

+99
-15
lines changed

7 files changed

+99
-15
lines changed

META-INF/plugin.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@
365365

366366
<typedHandler implementation="fr.adrienbrault.idea.symfony2plugin.templating.WorkaroundTwigTypedHandler"/>
367367

368-
<completion.contributor language="PHP" implementationClass="fr.adrienbrault.idea.symfony2plugin.codeInsight.completion.CompletionContributor"/>
368+
<completion.contributor language="any" implementationClass="fr.adrienbrault.idea.symfony2plugin.codeInsight.completion.CompletionContributor"/>
369369
<gotoDeclarationHandler implementation="fr.adrienbrault.idea.symfony2plugin.codeInsight.navigation.GotoHandler"/>
370370

371371
<completion.contributor language="PHP" implementationClass="fr.adrienbrault.idea.symfony2plugin.completion.ConstantEnumCompletionContributor"/>

src/fr/adrienbrault/idea/symfony2plugin/codeInsight/GotoCompletionProviderInterface.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ public interface GotoCompletionProviderInterface {
1313
public Collection<LookupElement> getLookupElements();
1414

1515
@NotNull
16-
public Collection<PsiElement> getPsiTargets(StringLiteralExpression element);
16+
public Collection<PsiElement> getPsiTargets(PsiElement element);
1717

1818
}

src/fr/adrienbrault/idea/symfony2plugin/codeInsight/completion/CompletionContributor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ public CompletionContributor() {
2020
@Override
2121
protected void addCompletions(@NotNull CompletionParameters completionParameters, ProcessingContext processingContext, @NotNull CompletionResultSet completionResultSet) {
2222

23-
PsiElement psiElement = completionParameters.getOriginalPosition();
24-
if (psiElement == null || !Symfony2ProjectComponent.isEnabled(psiElement)) {
23+
PsiElement psiElement = completionParameters.getPosition();
24+
if (!Symfony2ProjectComponent.isEnabled(psiElement)) {
2525
return;
2626
}
2727

src/fr/adrienbrault/idea/symfony2plugin/codeInsight/navigation/GotoHandler.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,11 @@ public PsiElement[] getGotoDeclarationTargets(PsiElement psiElement, int i, Edit
2626
return new PsiElement[0];
2727
}
2828

29-
PsiElement parent = psiElement.getParent();
30-
if(!(parent instanceof StringLiteralExpression)) {
31-
return new PsiElement[0];
32-
}
33-
3429
Collection<PsiElement> psiTargets = new ArrayList<PsiElement>();
3530
for(GotoCompletionContributor contributor: GotoCompletionUtil.getContributors(psiElement)) {
3631
GotoCompletionProviderInterface formReferenceCompletionContributor = contributor.getProvider(psiElement);
3732
if(formReferenceCompletionContributor != null) {
38-
psiTargets.addAll(formReferenceCompletionContributor.getPsiTargets((StringLiteralExpression) parent));
33+
psiTargets.addAll(formReferenceCompletionContributor.getPsiTargets(psiElement));
3934
}
4035
}
4136

src/fr/adrienbrault/idea/symfony2plugin/codeInsight/utils/GotoCompletionUtil.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,17 @@
66
import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionRegistrar;
77
import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionRegistrarParameter;
88
import fr.adrienbrault.idea.symfony2plugin.form.FormOptionGotoCompletionRegistrar;
9+
import fr.adrienbrault.idea.symfony2plugin.templating.BlockCompletionRegistrar;
910
import org.jetbrains.annotations.NotNull;
1011

1112
import java.util.ArrayList;
1213
import java.util.Collection;
1314

1415
public class GotoCompletionUtil {
1516

16-
private static GotoCompletionRegistrar[] CONTRIBUTORS = new FormOptionGotoCompletionRegistrar[] {
17-
new FormOptionGotoCompletionRegistrar()
17+
private static GotoCompletionRegistrar[] CONTRIBUTORS = new GotoCompletionRegistrar[] {
18+
new FormOptionGotoCompletionRegistrar(),
19+
new BlockCompletionRegistrar(),
1820
};
1921

2022
public static Collection<GotoCompletionContributor> getContributors(final PsiElement psiElement) {

src/fr/adrienbrault/idea/symfony2plugin/form/FormOptionGotoCompletionRegistrar.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@
55
import com.intellij.patterns.ElementPattern;
66
import com.intellij.patterns.PlatformPatterns;
77
import com.intellij.psi.PsiElement;
8+
import com.jetbrains.php.lang.PhpLanguage;
89
import com.jetbrains.php.lang.psi.elements.*;
910
import com.jetbrains.php.lang.psi.elements.impl.PhpTypedElementImpl;
1011
import fr.adrienbrault.idea.symfony2plugin.Symfony2Icons;
1112
import fr.adrienbrault.idea.symfony2plugin.Symfony2InterfacesUtil;
1213
import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent;
14+
import fr.adrienbrault.idea.symfony2plugin.TwigHelper;
1315
import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionContributor;
1416
import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionProvider;
1517
import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionRegistrar;
@@ -28,7 +30,7 @@
2830
public class FormOptionGotoCompletionRegistrar implements GotoCompletionRegistrar {
2931

3032
public void register(GotoCompletionRegistrarParameter registrar) {
31-
registrar.register(PlatformPatterns.psiElement(), new FormOptionBuilderCompletionContributor());
33+
registrar.register(PlatformPatterns.psiElement().withLanguage(PhpLanguage.INSTANCE), new FormOptionBuilderCompletionContributor());
3234
}
3335

3436
private static class FormOptionBuilderCompletionContributor implements GotoCompletionContributor {
@@ -90,9 +92,14 @@ public FormReferenceCompletionProvider(@NotNull PsiElement element, @Nullable St
9092
}
9193

9294
@NotNull
93-
public Collection<PsiElement> getPsiTargets(StringLiteralExpression element) {
95+
public Collection<PsiElement> getPsiTargets(PsiElement psiElement) {
9496

95-
String value = element.getContents();
97+
PsiElement element = psiElement.getParent();
98+
if(!(element instanceof StringLiteralExpression)) {
99+
return Collections.emptyList();
100+
}
101+
102+
String value = ((StringLiteralExpression) element).getContents();
96103
if(StringUtils.isBlank(value)) {
97104
return Collections.emptyList();
98105
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package fr.adrienbrault.idea.symfony2plugin.templating;
2+
3+
import com.intellij.codeInsight.lookup.LookupElement;
4+
import com.intellij.openapi.vfs.VirtualFile;
5+
import com.intellij.psi.PsiElement;
6+
import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent;
7+
import fr.adrienbrault.idea.symfony2plugin.TwigHelper;
8+
import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionContributor;
9+
import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionProvider;
10+
import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionRegistrar;
11+
import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionRegistrarParameter;
12+
import fr.adrienbrault.idea.symfony2plugin.templating.dict.TwigBlock;
13+
import fr.adrienbrault.idea.symfony2plugin.templating.dict.TwigBlockLookupElement;
14+
import fr.adrienbrault.idea.symfony2plugin.templating.dict.TwigBlockParser;
15+
import fr.adrienbrault.idea.symfony2plugin.util.PsiElementUtils;
16+
import org.apache.commons.lang.StringUtils;
17+
import org.jetbrains.annotations.NotNull;
18+
import org.jetbrains.annotations.Nullable;
19+
20+
import java.util.*;
21+
22+
public class BlockCompletionRegistrar implements GotoCompletionRegistrar {
23+
24+
public void register(GotoCompletionRegistrarParameter registrar) {
25+
26+
// {{ block('foo_block') }}
27+
registrar.register(TwigHelper.getPrintBlockFunctionPattern("block"), new GotoCompletionContributor() {
28+
@Nullable
29+
@Override
30+
public GotoCompletionProvider getProvider(@Nullable PsiElement psiElement) {
31+
32+
if (psiElement == null || !Symfony2ProjectComponent.isEnabled(psiElement)) {
33+
return null;
34+
}
35+
36+
return new BlockFunctionReferenceCompletionProvider(psiElement);
37+
}
38+
});
39+
}
40+
41+
private static class BlockFunctionReferenceCompletionProvider extends GotoCompletionProvider {
42+
43+
public BlockFunctionReferenceCompletionProvider(@NotNull PsiElement element) {
44+
super(element);
45+
}
46+
47+
@NotNull
48+
public Collection<PsiElement> getPsiTargets(PsiElement element) {
49+
50+
String blockName = PsiElementUtils.trimQuote(element.getText());
51+
if(StringUtils.isBlank(blockName)) {
52+
return Collections.emptyList();
53+
}
54+
55+
return Arrays.asList(
56+
TwigTemplateGoToDeclarationHandler.getBlockNameGoTo(element.getContainingFile(), blockName)
57+
);
58+
59+
}
60+
61+
@NotNull
62+
public Collection<LookupElement> getLookupElements() {
63+
64+
Collection<LookupElement> lookupElements = new ArrayList<LookupElement>();
65+
66+
Map<String, VirtualFile> twigFilesByName = TwigHelper.getTwigFilesByName(getElement().getProject());
67+
List<TwigBlock> blocks = new TwigBlockParser(twigFilesByName).walk(getElement().getContainingFile());
68+
List<String> uniqueList = new ArrayList<String>();
69+
for (TwigBlock block : blocks) {
70+
if(!uniqueList.contains(block.getName())) {
71+
uniqueList.add(block.getName());
72+
lookupElements.add(new TwigBlockLookupElement(block));
73+
}
74+
}
75+
76+
return lookupElements;
77+
}
78+
79+
}
80+
}

0 commit comments

Comments
 (0)