Skip to content

Commit 4d7dddd

Browse files
authored
Merge pull request #497 from magento/forwardport_3.1.2->3.2.0
Forwardport 3.1.2 >3.2.0
2 parents bd7df28 + 0b69098 commit 4d7dddd

File tree

7 files changed

+80
-24
lines changed

7 files changed

+80
-24
lines changed

CHANGELOG.md

+7
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0).
66

77
## 3.2.0
88

9+
## 3.1.2
10+
11+
### Fixed
12+
13+
- Reference navigation for classes under directories with underscores
14+
- Fixed the array access exception when using copy path action
15+
916
## 3.1.1
1017

1118
### Fixed

src/com/magento/idea/magento2plugin/actions/CopyMagentoPath.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ public class CopyMagentoPath extends CopyPathProvider {
2525
private final String[] templatePaths = {
2626
"view/frontend/templates/",
2727
"view/adminhtml/templates/",
28-
"view/base/templates/"
28+
"view/base/templates/",
29+
"templates/"
2930
};
3031

3132
@Override
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

+1-1
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 + ")*";
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

+9
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)