Skip to content

Commit eff7209

Browse files
authored
Merge pull request #488 from magento/464-underscore-within-directories-name
464: fixed reference navigation for classes under directories with underscores
2 parents 73b5292 + 830d2e6 commit eff7209

File tree

6 files changed

+75
-23
lines changed

6 files changed

+75
-23
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0).
66

77
## 3.1.2
88

9+
### Fixed
10+
11+
- Reference navigation for classes under directories with underscores
12+
913
## 3.1.1
1014

1115
### Fixed
Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
/**
1+
/*
22
* Copyright © Magento, Inc. All rights reserved.
33
* See COPYING.txt for license details.
44
*/
5+
56
package com.magento.idea.magento2plugin.reference.provider;
67

78
import com.intellij.openapi.util.TextRange;
@@ -14,60 +15,69 @@
1415
import com.jetbrains.php.lang.psi.elements.PhpNamespace;
1516
import com.magento.idea.magento2plugin.reference.xml.PolyVariantReferenceBase;
1617
import com.magento.idea.magento2plugin.util.RegExUtil;
17-
import org.jetbrains.annotations.NotNull;
1818
import java.util.ArrayList;
1919
import java.util.Collection;
2020
import java.util.List;
21+
import java.util.Locale;
2122
import java.util.regex.Matcher;
2223
import java.util.regex.Pattern;
24+
import org.jetbrains.annotations.NotNull;
2325

26+
@SuppressWarnings({"PMD.AvoidInstantiatingObjectsInLoops"})
2427
public class PhpClassReferenceProvider extends PsiReferenceProvider {
2528

2629
@NotNull
2730
@Override
28-
public PsiReference[] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) {
29-
List<PsiReference> psiReferences = new ArrayList<>();
31+
public PsiReference[] getReferencesByElement(
32+
final @NotNull PsiElement element,
33+
final @NotNull ProcessingContext context
34+
) {
3035

31-
String origValue = element.getText();
36+
final String origValue = element.getText();
3237

33-
Pattern pattern = Pattern.compile(RegExUtil.PhpRegex.FQN);
34-
Matcher matcher = pattern.matcher(origValue);
38+
final Pattern pattern = Pattern.compile(RegExUtil.PhpRegex.FQN);
39+
final Matcher matcher = pattern.matcher(origValue);
3540
if (!matcher.find()) {
3641
return PsiReference.EMPTY_ARRAY;
3742
}
3843

39-
String classFQN = matcher.group();
40-
String[] fqnParts = classFQN.split("\\\\");
44+
final String classFQN = origValue.replaceAll("^\"|\"$", "");
45+
final String[] fqnParts = classFQN.split("\\\\");
4146

42-
PhpIndex phpIndex = PhpIndex.getInstance(element.getProject());
47+
final PhpIndex phpIndex = PhpIndex.getInstance(element.getProject());
4348

44-
StringBuilder namespace = new StringBuilder();
49+
final StringBuilder namespace = new StringBuilder();
4550
String namespacePart;
51+
final List<PsiReference> psiReferences = new ArrayList<>();
4652
for (int i = 0; i < fqnParts.length - 1; i++) {
4753
namespacePart = fqnParts[i];
4854

49-
namespace.append("\\");
50-
namespace.append(namespacePart);
51-
Collection<PhpNamespace> references = phpIndex.getNamespacesByName(namespace.toString().toLowerCase());
52-
if (references.size() > 0) {
53-
TextRange range = new TextRange(
55+
namespace.append("\\");//NOPMD
56+
namespace.append(namespacePart);//NOPMD
57+
final Collection<PhpNamespace> references =
58+
phpIndex.getNamespacesByName(namespace.toString().toLowerCase(
59+
new Locale("en","EN"))
60+
);
61+
if (!references.isEmpty()) {
62+
final TextRange range = new TextRange(
5463
origValue.indexOf(classFQN) + namespace.toString().lastIndexOf(92),
55-
origValue.indexOf(classFQN) + namespace.toString().lastIndexOf(92) + namespacePart.length()
64+
origValue.indexOf(classFQN) + namespace.toString().lastIndexOf(92)
65+
+ namespacePart.length()
5666
);
5767
psiReferences.add(new PolyVariantReferenceBase(element, range, references));
5868
}
5969
}
6070

61-
String className = classFQN.substring(classFQN.lastIndexOf(92) + 1);
62-
Collection<PhpClass> classes = phpIndex.getAnyByFQN(classFQN);
63-
if (classes.size() > 0) {
64-
TextRange range = new TextRange(
71+
final String className = classFQN.substring(classFQN.lastIndexOf(92) + 1);
72+
final Collection<PhpClass> classes = phpIndex.getAnyByFQN(classFQN);
73+
if (!classes.isEmpty()) {
74+
final TextRange range = new TextRange(
6575
origValue.lastIndexOf(92) + 1,
6676
origValue.lastIndexOf(92) + 1 + className.length()
6777
);
6878
psiReferences.add(new PolyVariantReferenceBase(element, range, classes));
6979
}
7080

71-
return psiReferences.toArray(new PsiReference[psiReferences.size()]);
81+
return psiReferences.toArray(new PsiReference[0]);
7282
}
7383
}

src/com/magento/idea/magento2plugin/util/RegExUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public static class Magento {
7373
public class PhpRegex {
7474

7575
public static final String CLASS_NAME
76-
= "[A-Z][a-zA-Z0-9_\\x7f-\\xff]*";
76+
= "[a-zA-Z0-9_\\x7f-\\xff]*";
7777

7878
public static final String FQN
7979
= CLASS_NAME + "(\\\\" + CLASS_NAME + ")*";
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\Catalog\test_event;
8+
9+
use Magento\Framework\Event\ObserverInterface;
10+
11+
class TestObserver implements ObserverInterface
12+
{
13+
public function execute()
14+
{
15+
}
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
9+
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
10+
<event name="test_event">
11+
<observer name="test_observer" instance="Magento\Catalog\test_event\TestObserver<caret>" />
12+
</event>
13+
</config>

tests/com/magento/idea/magento2plugin/reference/xml/ObserverReferenceRegistrarTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,15 @@ public void testObserverInstanceMustHaveReference() {
1818
assertHasReferencePhpClass("Magento\\Catalog\\Observer\\TestObserver");
1919
}
2020

21+
/**
22+
* Tests for observer instance with snake case reference in events.xml.
23+
*/
24+
public void testObserverInstanceDirectorySnakeCaseMustHaveReference() {
25+
myFixture.configureByFile(this.getFixturePath(ModuleEventsXml.FILE_NAME));
26+
27+
assertHasReferencePhpClass("Magento\\Catalog\\test_event\\TestObserver");
28+
}
29+
2130
/**
2231
* Tests for event name reference in events.xml.
2332
*/

0 commit comments

Comments
 (0)