Skip to content

Commit 469aef8

Browse files
author
Ivan Scherbak
committed
0.0.3 [Unimport class] Add support for the class alias. Can be invoked on the use statement
1 parent 3cc0ae6 commit 469aef8

File tree

3 files changed

+79
-30
lines changed

3 files changed

+79
-30
lines changed

.idea/dictionaries/ivan.xml

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

META-INF/plugin.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<idea-plugin version="2">
22
<id>com.funivan.phpstorm.refactoring</id>
33
<name>Refactoring</name>
4-
<version>0.0.2</version>
4+
<version>0.0.3</version>
55
<vendor email="[email protected]" url="http://funivan.com">Funivan</vendor>
66

77
<description><![CDATA[
@@ -10,6 +10,9 @@
1010
]]></description>
1111

1212
<change-notes><![CDATA[
13+
<h4>0.0.3</h4>
14+
- [Unimport class] Add support for the class alias. Can be invoked on the use statement
15+
1316
<h4>0.0.2</h4>
1417
- [Unimport class] invoke action inside php doc comments
1518
- [Find magic methods] run task in background

src/com/funivan/phpstorm/refactoring/UnimportClass/UnimportClassIntention.java

Lines changed: 74 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,22 @@
44
import com.intellij.openapi.editor.Editor;
55
import com.intellij.openapi.project.Project;
66
import com.intellij.psi.PsiElement;
7+
import com.intellij.psi.PsiRecursiveElementWalkingVisitor;
8+
import com.jetbrains.php.PhpIndex;
79
import com.jetbrains.php.PhpWorkaroundUtil;
810
import com.jetbrains.php.codeInsight.PhpCodeInsightUtil;
911
import com.jetbrains.php.lang.documentation.phpdoc.psi.PhpDocType;
1012
import com.jetbrains.php.lang.psi.PhpPsiElementFactory;
1113
import com.jetbrains.php.lang.psi.elements.ClassReference;
14+
import com.jetbrains.php.lang.psi.elements.PhpClass;
1215
import com.jetbrains.php.lang.psi.elements.PhpPsiElement;
13-
import com.jetbrains.php.lang.psi.elements.PhpReference;
14-
import com.jetbrains.php.lang.psi.elements.PhpUse;
15-
import com.jetbrains.php.lang.psi.visitors.PhpRecursiveElementVisitor;
16+
import com.jetbrains.php.lang.psi.elements.impl.PhpUseImpl;
1617
import org.jetbrains.annotations.NotNull;
1718
import org.jetbrains.annotations.Nullable;
1819

20+
import java.util.ArrayList;
21+
import java.util.Collection;
22+
1923
/**
2024
* Created by funivan
2125
*/
@@ -58,22 +62,27 @@ public boolean isAvailable(@NotNull Project project, Editor editor, @Nullable Ps
5862

5963
PsiElement baseElement = element.getParent();
6064

61-
if (!(baseElement instanceof PhpReference)) {
65+
66+
if (!(baseElement instanceof ClassReference)) {
6267
return false;
6368
}
64-
PhpReference ref = (PhpReference) baseElement;
6569

66-
if (ref.isAbsolute()) {
67-
return false;
70+
String fqn = ((ClassReference) baseElement).getFQN();
71+
72+
73+
if (baseElement.getParent() instanceof PhpUseImpl) {
74+
return true;
6875
}
6976

70-
String fqn = ref.getFQN();
7177

72-
if (fqn == null) {
78+
if (baseElement.getText().equals(fqn)) {
7379
return false;
7480
}
7581

76-
return !fqn.equals(baseElement.getText());
82+
Collection<PhpClass> classes = PhpIndex.getInstance(project).getClassesByFQN(fqn);
83+
84+
return classes.size() != 0;
85+
7786
}
7887

7988
/**
@@ -85,16 +94,31 @@ public boolean isAvailable(@NotNull Project project, Editor editor, @Nullable Ps
8594
*/
8695
public void invoke(@NotNull Project project, Editor editor, @NotNull PsiElement element) {
8796
element = element.getParent();
88-
if (!(element instanceof PhpReference)) {
89-
return;
97+
98+
99+
ClassReference classReference = (ClassReference) element;
100+
String shortFqn = classReference.getText();
101+
102+
PsiElement parentElement = classReference.getParent();
103+
if (parentElement instanceof PhpUseImpl) {
104+
105+
PhpUseImpl useStatement = (PhpUseImpl) parentElement;
106+
107+
String alias = useStatement.getAliasName();
108+
if (alias != null) {
109+
shortFqn = alias;
110+
} else {
111+
shortFqn = useStatement.getName();
112+
}
90113
}
91-
PhpReference classReference = (PhpReference) element;
114+
115+
116+
final String searchClassName = shortFqn;
92117

93118
PhpPsiElement scopeForUseOperator = PhpCodeInsightUtil.findScopeForUseOperator(classReference);
94119

95-
if (scopeForUseOperator == null) {
96-
return;
97-
}
120+
121+
assert scopeForUseOperator != null;
98122

99123

100124
String fqn = classReference.getFQN();
@@ -103,29 +127,41 @@ public void invoke(@NotNull Project project, Editor editor, @NotNull PsiElement
103127
}
104128
ClassReference newClassRef = PhpPsiElementFactory.createClassReference(project, fqn);
105129

130+
final ArrayList<PsiElement> replaceElements = new ArrayList<>();
131+
132+
133+
scopeForUseOperator.acceptChildren(new PsiRecursiveElementWalkingVisitor() {
134+
@Override
135+
public void visitElement(PsiElement element) {
106136

107-
scopeForUseOperator.acceptChildren(new PhpRecursiveElementVisitor() {
108-
public void visitPhpElement(PhpPsiElement element) {
109-
if (!PhpCodeInsightUtil.isScopeForUseOperator(element)) {
110-
super.visitPhpElement(element);
137+
if (element instanceof ClassReference) {
138+
visitPhpClassReference((ClassReference) element);
111139
}
112140

141+
if (element instanceof PhpDocType) {
142+
visitPhpDocType((PhpDocType) element);
143+
}
144+
145+
super.visitElement(element);
146+
113147
}
114148

115-
public void visitPhpDocType(PhpDocType phpDocType) {
149+
private void visitPhpDocType(PhpDocType phpDocType) {
116150

117151
if (phpDocType.isAbsolute()) {
118152
return;
119153
}
120154

121-
if (phpDocType.getText().equals(classReference.getText())) {
122-
// probably idea byg. FQN of docElement consist of Current namespace + ClassName
123-
replace(phpDocType);
155+
156+
if (phpDocType.getText().equals(searchClassName)) {
157+
collectElement(phpDocType);
124158
}
125159
}
126160

127-
public void visitPhpClassReference(ClassReference classReference) {
128-
if (classReference.getParent() instanceof PhpUse) {
161+
private void visitPhpClassReference(ClassReference classReference) {
162+
163+
// Skip import use statements
164+
if (classReference.getParent() instanceof PhpUseImpl) {
129165
return;
130166
}
131167

@@ -137,17 +173,26 @@ public void visitPhpClassReference(ClassReference classReference) {
137173
return;
138174
}
139175

140-
replace(classReference);
176+
collectElement(classReference);
141177
}
142178

143-
private void replace(PsiElement currentElement) {
179+
private void collectElement(PsiElement currentElement) {
144180
if (currentElement.getText().equals(newClassRef.getText())) {
145181
return;
146182
}
147-
currentElement.replace(newClassRef);
183+
184+
replaceElements.add(currentElement);
148185
}
186+
187+
149188
});
150189

190+
191+
for (PsiElement oldReference : replaceElements) {
192+
oldReference.replace(newClassRef);
193+
}
194+
195+
151196
}
152197

153198
}

0 commit comments

Comments
 (0)