44import com .intellij .openapi .editor .Editor ;
55import com .intellij .openapi .project .Project ;
66import com .intellij .psi .PsiElement ;
7+ import com .intellij .psi .PsiRecursiveElementWalkingVisitor ;
8+ import com .jetbrains .php .PhpIndex ;
79import com .jetbrains .php .PhpWorkaroundUtil ;
810import com .jetbrains .php .codeInsight .PhpCodeInsightUtil ;
911import com .jetbrains .php .lang .documentation .phpdoc .psi .PhpDocType ;
1012import com .jetbrains .php .lang .psi .PhpPsiElementFactory ;
1113import com .jetbrains .php .lang .psi .elements .ClassReference ;
14+ import com .jetbrains .php .lang .psi .elements .PhpClass ;
1215import 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 ;
1617import org .jetbrains .annotations .NotNull ;
1718import 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