Skip to content

Commit 78e99b8

Browse files
authored
Merge pull request #1932 from Haehnchen/feature/resource-namespace
provide navigation for "resource" and "exclude" of yaml files
2 parents ea88509 + 27336ad commit 78e99b8

File tree

6 files changed

+125
-11
lines changed

6 files changed

+125
-11
lines changed

src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/YamlCompletionContributor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ public void addCompletions(@NotNull CompletionParameters parameters,
239239
// tags: [ foobar ]
240240
extend(
241241
CompletionType.BASIC,
242-
YamlElementPatternHelper.getTagsAsSequencePattern(),
242+
YamlElementPatternHelper.getSequenceValueWithArrayKeyPattern("tags"),
243243
new TagNameCompletionProvider()
244244
);
245245

src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/YamlElementPatternHelper.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -710,12 +710,12 @@ public static PsiElementPattern.Capture<PsiElement> getRootConfigKeyPattern() {
710710
/**
711711
* tags: [ foobar ]
712712
*/
713-
public static PsiElementPattern.Capture<PsiElement> getTagsAsSequencePattern() {
713+
public static PsiElementPattern.Capture<PsiElement> getSequenceValueWithArrayKeyPattern(@NotNull String... keys) {
714714
return PlatformPatterns.psiElement().withParent(
715715
PlatformPatterns.psiElement(YAMLScalar.class).withParent(
716716
PlatformPatterns.psiElement(YAMLSequenceItem.class).withParent(
717717
PlatformPatterns.psiElement(YAMLSequence.class).withParent(
718-
PlatformPatterns.psiElement(YAMLKeyValue.class).withName("tags")
718+
PlatformPatterns.psiElement(YAMLKeyValue.class).withName(keys)
719719
)
720720
)
721721
)

src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/YamlGoToDeclarationHandler.java

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33
import com.intellij.codeInsight.navigation.actions.GotoDeclarationHandler;
44
import com.intellij.openapi.actionSystem.DataContext;
55
import com.intellij.openapi.editor.Editor;
6-
import com.intellij.openapi.project.Project;
6+
import com.intellij.openapi.vfs.VfsUtil;
77
import com.intellij.openapi.vfs.VirtualFile;
88
import com.intellij.patterns.PlatformPatterns;
99
import com.intellij.patterns.PsiElementPattern;
1010
import com.intellij.patterns.StandardPatterns;
11+
import com.intellij.psi.PsiDirectory;
1112
import com.intellij.psi.PsiElement;
1213
import com.intellij.psi.PsiFile;
1314
import com.intellij.psi.tree.IElementType;
@@ -25,18 +26,23 @@
2526
import fr.adrienbrault.idea.symfony2plugin.stubs.ServiceIndexUtil;
2627
import fr.adrienbrault.idea.symfony2plugin.templating.util.TwigUtil;
2728
import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil;
28-
import fr.adrienbrault.idea.symfony2plugin.util.PhpIndexUtil;
2929
import fr.adrienbrault.idea.symfony2plugin.util.PsiElementUtils;
3030
import fr.adrienbrault.idea.symfony2plugin.util.dict.ServiceUtil;
3131
import fr.adrienbrault.idea.symfony2plugin.util.resource.FileResourceUtil;
3232
import fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper;
33+
import kotlin.Pair;
3334
import org.apache.commons.lang.StringUtils;
3435
import org.jetbrains.annotations.NotNull;
3536
import org.jetbrains.annotations.Nullable;
3637
import org.jetbrains.yaml.YAMLTokenTypes;
3738
import org.jetbrains.yaml.psi.*;
3839

40+
import java.io.File;
41+
import java.io.IOException;
42+
import java.nio.file.*;
43+
import java.nio.file.attribute.BasicFileAttributes;
3944
import java.util.*;
45+
import java.util.stream.Collectors;
4046

4147
/**
4248
* @author Daniel Espendiller <daniel@espendiller.net>
@@ -136,7 +142,7 @@ public PsiElement[] getGotoDeclarationTargets(PsiElement psiElement, int i, Edit
136142
}
137143

138144
// tags: [ name: foobar ]
139-
if(YamlElementPatternHelper.getTagsAsSequencePattern().accepts(psiElement)) {
145+
if(YamlElementPatternHelper.getSequenceValueWithArrayKeyPattern("tags").accepts(psiElement)) {
140146
targets.addAll(getTagClassesGoto(psiElement));
141147
}
142148

@@ -183,7 +189,17 @@ public PsiElement[] getGotoDeclarationTargets(PsiElement psiElement, int i, Edit
183189
targets.addAll(getClassesForServiceKey(psiElement));
184190
}
185191

186-
return targets.toArray(new PsiElement[targets.size()]);
192+
// resource: '../src/'
193+
// exclude:
194+
// - '../src/DependencyInjection/'
195+
if (StandardPatterns.or(
196+
YamlElementPatternHelper.getSingleLineScalarKey("exclude", "resource"),
197+
YamlElementPatternHelper.getSequenceValueWithArrayKeyPattern("exclude", "resource")
198+
).accepts(psiElement)) {
199+
targets.addAll(attachGlobResources(psiElement));
200+
}
201+
202+
return targets.toArray(new PsiElement[0]);
187203
}
188204

189205
private Collection<? extends PsiElement> namedDefaultBindArgumentGoto(@NotNull PsiElement psiElement, @NotNull String parameterName) {
@@ -449,6 +465,38 @@ private Collection<PsiElement> attachResourceBundleGoto(@NotNull PsiElement psiE
449465

450466
}
451467

468+
@NotNull
469+
private Collection<PsiElement> attachGlobResources(@NotNull PsiElement psiElement) {
470+
String resource = PsiElementUtils.trimQuote(psiElement.getText());
471+
if (StringUtils.isBlank(resource)) {
472+
return Collections.emptyList();
473+
}
474+
475+
PsiFile containingFile = psiElement.getContainingFile();
476+
if (containingFile == null) {
477+
return Collections.emptyList();
478+
}
479+
480+
VirtualFile virtualFile = containingFile.getVirtualFile();
481+
if (virtualFile == null) {
482+
return Collections.emptyList();
483+
}
484+
485+
PsiElement quotedText = psiElement.getParent();
486+
if (!(quotedText instanceof YAMLQuotedText)) {
487+
return Collections.emptyList();
488+
}
489+
490+
String name = YamlHelper.getServiceKeyFromResourceFromStringOrArray((YAMLQuotedText) quotedText);
491+
if (name == null) {
492+
return Collections.emptyList();
493+
}
494+
495+
return new HashSet<>(
496+
ServiceContainerUtil.getPhpClassFromResources(psiElement.getProject(), name, virtualFile, List.of(resource), Collections.emptyList())
497+
);
498+
}
499+
452500
@NotNull
453501
private Collection<PsiElement> attachResourceOnPathGoto(@NotNull PsiElement psiElement) {
454502
String text = PsiElementUtils.trimQuote(psiElement.getText());

src/main/java/fr/adrienbrault/idea/symfony2plugin/util/yaml/YamlHelper.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1366,4 +1366,54 @@ public static boolean isElementAfterEol(PsiElement psiElement) {
13661366
}
13671367
return PsiElementUtils.getPrevSiblingOfType(psiElement, PlatformPatterns.psiElement(YAMLTokenTypes.EOL)) != null;
13681368
}
1369+
1370+
/**
1371+
* App\\:
1372+
* resource: 'foobar_2'
1373+
* App\\:
1374+
* resource: ['foobar_2', 'foobar_3']
1375+
*/
1376+
@Nullable
1377+
public static String getServiceKeyFromResourceFromStringOrArray(@NotNull YAMLQuotedText yamlQuotedText) {
1378+
PsiElement yamlSequence = yamlQuotedText.getParent();
1379+
if (yamlSequence == null) {
1380+
return null;
1381+
}
1382+
1383+
YAMLKeyValue serviceKeyValue = null;
1384+
if (yamlSequence instanceof YAMLSequenceItem) {
1385+
PsiElement yamlArray = yamlSequence.getParent();
1386+
if (yamlArray instanceof YAMLSequence) {
1387+
PsiElement yamlKeyValueResource = yamlArray.getParent();
1388+
if (yamlKeyValueResource instanceof YAMLKeyValue) {
1389+
PsiElement mapping = yamlKeyValueResource.getParent();
1390+
if (mapping instanceof YAMLMapping) {
1391+
PsiElement serviceKeyValueElement = mapping.getParent();
1392+
if (serviceKeyValueElement instanceof YAMLKeyValue) {
1393+
serviceKeyValue = (YAMLKeyValue) serviceKeyValueElement;
1394+
}
1395+
}
1396+
}
1397+
}
1398+
} else {
1399+
PsiElement yamlKeyValueResource = yamlSequence.getParent();
1400+
if (yamlKeyValueResource != null) {
1401+
PsiElement serviceKeyValueElement = yamlKeyValueResource.getParent();
1402+
if (serviceKeyValueElement instanceof YAMLKeyValue) {
1403+
serviceKeyValue = (YAMLKeyValue) serviceKeyValueElement;
1404+
}
1405+
}
1406+
}
1407+
1408+
if (serviceKeyValue == null) {
1409+
return null;
1410+
}
1411+
1412+
String name = serviceKeyValue.getName();
1413+
if (StringUtils.isBlank(name)) {
1414+
return null;
1415+
}
1416+
1417+
return name;
1418+
}
13691419
}

src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/util/resource/FileResourceUtilTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.jetbrains.php.lang.psi.elements.PhpClass;
66
import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyLightCodeInsightFixtureTestCase;
77
import fr.adrienbrault.idea.symfony2plugin.util.resource.FileResourceUtil;
8+
import kotlin.Pair;
89

910
/**
1011
* @author Daniel Espendiller <daniel@espendiller.net>

src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/util/yaml/YamlHelperLightTest.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,7 @@
1313
import org.apache.commons.lang.StringUtils;
1414
import org.jetbrains.annotations.NotNull;
1515
import org.jetbrains.yaml.YAMLFileType;
16-
import org.jetbrains.yaml.psi.YAMLCompoundValue;
17-
import org.jetbrains.yaml.psi.YAMLFile;
18-
import org.jetbrains.yaml.psi.YAMLKeyValue;
19-
import org.jetbrains.yaml.psi.YAMLScalar;
16+
import org.jetbrains.yaml.psi.*;
2017
import org.jetbrains.yaml.psi.impl.YAMLHashImpl;
2118

2219
import java.util.ArrayList;
@@ -590,6 +587,24 @@ public void testGetTaggedServices() {
590587
assertTrue(taggedServices2.stream().anyMatch(yamlKeyValue -> "foobar2".equals(yamlKeyValue.getKey().getText())));
591588
}
592589

590+
public void testGetServiceKeyFromResourceFromStringOrArray() {
591+
YAMLQuotedText fromText = YamlPsiElementFactory.createFromText(getProject(), YAMLQuotedText.class,
592+
"services:\n" +
593+
" App\\:\n" +
594+
" resource: 'foobar'"
595+
);
596+
597+
assertEquals("App\\", YamlHelper.getServiceKeyFromResourceFromStringOrArray(fromText));
598+
599+
fromText = YamlPsiElementFactory.createFromText(getProject(), YAMLQuotedText.class,
600+
"services:\n" +
601+
" App\\:\n" +
602+
" resource: ['foobar_2', 'foobar_3']"
603+
);
604+
605+
assertEquals("App\\", YamlHelper.getServiceKeyFromResourceFromStringOrArray(fromText));
606+
}
607+
593608
private int getIndentForTextContent(@NotNull String content) {
594609
return YamlHelper.getIndentSpaceForFile((YAMLFile) YamlPsiElementFactory.createDummyFile(
595610
getProject(),

0 commit comments

Comments
 (0)