|
2 | 2 |
|
3 | 3 | import com.intellij.codeInsight.completion.CompletionResultSet; |
4 | 4 | import com.intellij.openapi.project.Project; |
| 5 | +import com.intellij.openapi.util.Ref; |
| 6 | +import com.intellij.openapi.util.text.StringUtil; |
5 | 7 | import com.intellij.patterns.ElementPattern; |
6 | 8 | import com.intellij.patterns.PatternCondition; |
7 | 9 | import com.intellij.patterns.PlatformPatterns; |
|
10 | 12 | import com.intellij.psi.util.PsiTreeUtil; |
11 | 13 | import com.intellij.util.ProcessingContext; |
12 | 14 | import com.intellij.util.Processor; |
| 15 | +import com.jetbrains.php.PhpClassHierarchyUtils; |
13 | 16 | import com.jetbrains.php.PhpIndex; |
14 | 17 | import com.jetbrains.php.codeInsight.PhpCodeInsightUtil; |
15 | 18 | import com.jetbrains.php.completion.PhpLookupElement; |
@@ -482,23 +485,52 @@ static public PhpClass getClassInterface(Project project, @NotNull String classN |
482 | 485 | * @param expectedClass eg DateTimeInterface |
483 | 486 | */ |
484 | 487 | 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 | + |
485 | 505 | return new PhpType().add(expectedClass).isConvertibleFrom(new PhpType().add(subjectClass), PhpIndex.getInstance(subjectClass.getProject())); |
486 | 506 | } |
487 | 507 |
|
488 | 508 | /** |
489 | 509 | * @param subjectClass eg DateTime |
490 | | - * @param expectedClass eg DateTimeInterface |
| 510 | + * @param expectedClassAsString eg DateTimeInterface |
491 | 511 | */ |
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; |
494 | 520 | } |
495 | 521 |
|
496 | 522 | /** |
497 | | - * @param subjectClass eg DateTime |
| 523 | + * @param subjectClassAsString eg DateTime |
498 | 524 | * @param expectedClass eg DateTimeInterface |
499 | 525 | */ |
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; |
502 | 534 | } |
503 | 535 |
|
504 | 536 | static public Collection<PhpClass> getClassesInterface(Project project, @NotNull String className) { |
|
0 commit comments