|
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