Skip to content

Commit bc2d020

Browse files
authored
Merge pull request #1779 from Haehnchen/feature/instanceof-superclass
reflect changes in instanceOf check for PhpClass
2 parents 5f96247 + 3260ffb commit bc2d020

File tree

1 file changed

+38
-6
lines changed

1 file changed

+38
-6
lines changed

src/main/java/fr/adrienbrault/idea/symfony2plugin/util/PhpElementsUtil.java

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import com.intellij.codeInsight.completion.CompletionResultSet;
44
import com.intellij.openapi.project.Project;
5+
import com.intellij.openapi.util.Ref;
6+
import com.intellij.openapi.util.text.StringUtil;
57
import com.intellij.patterns.ElementPattern;
68
import com.intellij.patterns.PatternCondition;
79
import com.intellij.patterns.PlatformPatterns;
@@ -10,6 +12,7 @@
1012
import com.intellij.psi.util.PsiTreeUtil;
1113
import com.intellij.util.ProcessingContext;
1214
import com.intellij.util.Processor;
15+
import com.jetbrains.php.PhpClassHierarchyUtils;
1316
import com.jetbrains.php.PhpIndex;
1417
import com.jetbrains.php.codeInsight.PhpCodeInsightUtil;
1518
import com.jetbrains.php.completion.PhpLookupElement;
@@ -482,23 +485,52 @@ static public PhpClass getClassInterface(Project project, @NotNull String classN
482485
* @param expectedClass eg DateTimeInterface
483486
*/
484487
public static boolean isInstanceOf(@NotNull PhpClass subjectClass, @NotNull PhpClass expectedClass) {
488+
Ref<Boolean> result = new Ref<>(false);
489+
490+
PhpClassHierarchyUtils.processSupers(subjectClass, true, true, superClass -> {
491+
boolean b = StringUtil.equalsIgnoreCase(superClass.getFQN(), expectedClass.getFQN())
492+
|| StringUtil.equalsIgnoreCase(StringUtils.stripStart(superClass.getFQN(), "\\"), StringUtils.stripStart(expectedClass.getFQN(), "\\"));
493+
494+
if (b) {
495+
result.set(true);
496+
}
497+
498+
return !(Boolean)result.get();
499+
});
500+
501+
if (result.get()) {
502+
return true;
503+
}
504+
485505
return new PhpType().add(expectedClass).isConvertibleFrom(new PhpType().add(subjectClass), PhpIndex.getInstance(subjectClass.getProject()));
486506
}
487507

488508
/**
489509
* @param subjectClass eg DateTime
490-
* @param expectedClass eg DateTimeInterface
510+
* @param expectedClassAsString eg DateTimeInterface
491511
*/
492-
public static boolean isInstanceOf(@NotNull PhpClass subjectClass, @NotNull String expectedClass) {
493-
return new PhpType().add(expectedClass).isConvertibleFrom(new PhpType().add(subjectClass), PhpIndex.getInstance(subjectClass.getProject()));
512+
public static boolean isInstanceOf(@NotNull PhpClass subjectClass, @NotNull String expectedClassAsString) {
513+
for (PhpClass expectedClass : PhpIndex.getInstance(subjectClass.getProject()).getAnyByFQN(expectedClassAsString)) {
514+
if (isInstanceOf(subjectClass, expectedClass)) {
515+
return true;
516+
}
517+
}
518+
519+
return false;
494520
}
495521

496522
/**
497-
* @param subjectClass eg DateTime
523+
* @param subjectClassAsString eg DateTime
498524
* @param expectedClass eg DateTimeInterface
499525
*/
500-
public static boolean isInstanceOf(@NotNull Project project, @NotNull String subjectClass, @NotNull String expectedClass) {
501-
return new PhpType().add(expectedClass).isConvertibleFrom(new PhpType().add(subjectClass), PhpIndex.getInstance(project));
526+
public static boolean isInstanceOf(@NotNull Project project, @NotNull String subjectClassAsString, @NotNull String expectedClass) {
527+
for (PhpClass subjectClass : PhpIndex.getInstance(project).getAnyByFQN(subjectClassAsString)) {
528+
if (isInstanceOf(subjectClass, expectedClass)) {
529+
return true;
530+
}
531+
}
532+
533+
return false;
502534
}
503535

504536
static public Collection<PhpClass> getClassesInterface(Project project, @NotNull String className) {

0 commit comments

Comments
 (0)