|
9 | 9 | import com.intellij.psi.PsiFile;
|
10 | 10 | import com.intellij.psi.PsiManager;
|
11 | 11 | import com.intellij.psi.PsiWhiteSpace;
|
| 12 | +import com.intellij.psi.util.PsiTreeUtil; |
12 | 13 | import com.intellij.util.ProcessingContext;
|
13 | 14 | import com.jetbrains.php.PhpIcons;
|
14 | 15 | import com.jetbrains.php.PhpIndex;
|
15 |
| -import com.jetbrains.php.completion.PhpLookupElement; |
16 |
| -import com.jetbrains.php.completion.PhpVariantsUtil; |
17 |
| -import com.jetbrains.php.completion.insert.PhpReferenceInsertHandler; |
18 |
| -import com.jetbrains.php.lang.psi.elements.Field; |
19 |
| -import com.jetbrains.php.lang.psi.elements.Method; |
20 |
| -import com.jetbrains.php.lang.psi.elements.PhpClass; |
21 |
| -import com.jetbrains.php.lang.psi.elements.PhpNamedElement; |
22 |
| -import com.jetbrains.php.lang.psi.stubs.indexes.PhpClassIndex; |
| 16 | +import com.jetbrains.php.lang.psi.elements.*; |
23 | 17 | import com.jetbrains.twig.TwigLanguage;
|
24 | 18 | import com.jetbrains.twig.TwigTokenTypes;
|
| 19 | +import fr.adrienbrault.idea.symfony2plugin.Symfony2Icons; |
25 | 20 | import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent;
|
26 | 21 | import fr.adrienbrault.idea.symfony2plugin.TwigHelper;
|
27 | 22 | import fr.adrienbrault.idea.symfony2plugin.asset.dic.AssetDirectoryReader;
|
|
48 | 43 | import fr.adrienbrault.idea.symfony2plugin.util.controller.ControllerCompletionProvider;
|
49 | 44 | import fr.adrienbrault.idea.symfony2plugin.util.service.ServiceXmlParserFactory;
|
50 | 45 | import icons.TwigIcons;
|
| 46 | +import org.apache.commons.lang.StringUtils; |
51 | 47 | import org.jetbrains.annotations.NotNull;
|
52 | 48 |
|
53 | 49 | import java.util.*;
|
@@ -362,6 +358,12 @@ public void addCompletions(@NotNull CompletionParameters parameters,
|
362 | 358 | new FormThemeCompletionProvider()
|
363 | 359 | );
|
364 | 360 |
|
| 361 | + // {% <carpet> %} |
| 362 | + extend(CompletionType.BASIC, |
| 363 | + TwigHelper.getTagTokenParserPattern(), |
| 364 | + new TagTokenParserCompletionProvider() |
| 365 | + ); |
| 366 | + |
365 | 367 | // {% constant('FOO') %}
|
366 | 368 | extend(
|
367 | 369 | CompletionType.BASIC,
|
@@ -429,6 +431,47 @@ public void addCompletions(@NotNull CompletionParameters parameters,
|
429 | 431 |
|
430 | 432 | }
|
431 | 433 |
|
| 434 | + /** |
| 435 | + * Parse all classes that implements Twig_TokenParserInterface::getTag |
| 436 | + * and provide completion on string |
| 437 | + */ |
| 438 | + private static class TagTokenParserCompletionProvider extends CompletionProvider<CompletionParameters> { |
| 439 | + @Override |
| 440 | + protected void addCompletions(@NotNull CompletionParameters parameters, ProcessingContext processingContext, @NotNull CompletionResultSet resultSet) { |
| 441 | + |
| 442 | + if(!Symfony2ProjectComponent.isEnabled(parameters.getPosition())) { |
| 443 | + return; |
| 444 | + } |
| 445 | + |
| 446 | + Collection<PhpClass> allSubclasses = PhpIndex.getInstance(parameters.getPosition().getProject()).getAllSubclasses("\\Twig_TokenParserInterface"); |
| 447 | + for (PhpClass allSubclass : allSubclasses) { |
| 448 | + |
| 449 | + // we dont want to see test extension like "§" |
| 450 | + if(allSubclass.getName().endsWith("Test") || allSubclass.getContainingFile().getVirtualFile().getNameWithoutExtension().endsWith("Test")) { |
| 451 | + continue; |
| 452 | + } |
| 453 | + |
| 454 | + Method getTag = allSubclass.findMethodByName("getTag"); |
| 455 | + if(getTag == null) { |
| 456 | + continue; |
| 457 | + } |
| 458 | + |
| 459 | + // get string return value |
| 460 | + PhpReturn childrenOfType = PsiTreeUtil.findChildOfType(getTag, PhpReturn.class); |
| 461 | + if(childrenOfType != null) { |
| 462 | + PhpPsiElement returnValue = childrenOfType.getFirstPsiChild(); |
| 463 | + if(returnValue instanceof StringLiteralExpression) { |
| 464 | + String contents = ((StringLiteralExpression) returnValue).getContents(); |
| 465 | + if(StringUtils.isNotBlank(contents)) { |
| 466 | + resultSet.addElement(LookupElementBuilder.create(contents).withIcon(Symfony2Icons.SYMFONY)); |
| 467 | + } |
| 468 | + } |
| 469 | + } |
| 470 | + } |
| 471 | + |
| 472 | + } |
| 473 | + } |
| 474 | + |
432 | 475 | private class FormThemeCompletionProvider extends CompletionProvider<CompletionParameters> {
|
433 | 476 |
|
434 | 477 | @Override
|
|
0 commit comments