diff --git a/src/main/java/com/intellij/plugins/haxe/ide/index/HaxeConstructorIndex.java b/src/main/java/com/intellij/plugins/haxe/ide/index/HaxeConstructorIndex.java index 2ac236056..03d95f6f0 100644 --- a/src/main/java/com/intellij/plugins/haxe/ide/index/HaxeConstructorIndex.java +++ b/src/main/java/com/intellij/plugins/haxe/ide/index/HaxeConstructorIndex.java @@ -163,8 +163,10 @@ private static HaxeClass tryToFindClassFromTypeDef(HaxeClass cls) { final HaxeTypeOrAnonymous haxeTypeOrAnonymous = haxeTypeDef.getTypeOrAnonymous(); final HaxeType type = haxeTypeOrAnonymous == null ? null : haxeTypeOrAnonymous.getType(); if (type != null) { - final String classNameCandidate = type.getReferenceExpression().getText(); - String name = HaxeResolveUtil.getQName(cls.getContainingFile(), classNameCandidate, true); + HaxeReferenceExpression expression = type.getReferenceExpression(); + final String classNameCandidate = expression.getText(); + String name = HaxeResolveUtil.getQName(cls.getContainingFile(), classNameCandidate, true, true, type); + if (name == null) name = classNameCandidate;// fallback so key wont be null return HaxeResolveUtil.findClassByQName(name, cls); } } diff --git a/src/main/java/com/intellij/plugins/haxe/ide/index/HaxeInheritanceIndex.java b/src/main/java/com/intellij/plugins/haxe/ide/index/HaxeInheritanceIndex.java index 263812f98..a6fa707fb 100644 --- a/src/main/java/com/intellij/plugins/haxe/ide/index/HaxeInheritanceIndex.java +++ b/src/main/java/com/intellij/plugins/haxe/ide/index/HaxeInheritanceIndex.java @@ -119,7 +119,7 @@ public HaxeClass fun(PsiElement element) { final String classNameCandidate = getClassNameCandidate(haxeType); final String key = classNameCandidate.indexOf('.') != -1 ? classNameCandidate : - getQNameAndCache(qNameCache, psiFile, classNameCandidate); + getQNameAndCache(qNameCache, psiFile, classNameCandidate, haxeType); put(result, key, value); } for (HaxeType haxeType : haxeClass.getHaxeImplementsList()) { @@ -127,7 +127,7 @@ public HaxeClass fun(PsiElement element) { final String classNameCandidate = getClassNameCandidate(haxeType); final String key = classNameCandidate.indexOf('.') != -1 ? classNameCandidate : - getQNameAndCache(qNameCache, psiFile, classNameCandidate); + getQNameAndCache(qNameCache, psiFile, classNameCandidate, haxeType); put(result, key, value); } } @@ -139,10 +139,11 @@ private static String getClassNameCandidate(HaxeType haxeType) { return haxeType.getReferenceExpression().getText(); } - private static String getQNameAndCache(Map qNameCache, PsiFile psiFile, String classNameCandidate) { + private static String getQNameAndCache(Map qNameCache, PsiFile psiFile, String classNameCandidate, HaxeType haxeType) { String result = qNameCache.get(classNameCandidate); if (result == null) { - result = HaxeResolveUtil.getQName(psiFile, classNameCandidate, true); + result = HaxeResolveUtil.getQName(psiFile, classNameCandidate, true, true, haxeType); + if (result == null) result = classNameCandidate;// fallback so key wont be null qNameCache.put(classNameCandidate, result); } return result; diff --git a/src/main/java/com/intellij/plugins/haxe/ide/index/HaxeTypeDefInheritanceIndex.java b/src/main/java/com/intellij/plugins/haxe/ide/index/HaxeTypeDefInheritanceIndex.java index cea792469..6efa300bf 100644 --- a/src/main/java/com/intellij/plugins/haxe/ide/index/HaxeTypeDefInheritanceIndex.java +++ b/src/main/java/com/intellij/plugins/haxe/ide/index/HaxeTypeDefInheritanceIndex.java @@ -113,7 +113,7 @@ public Map> map(final FileContent inputData) { final String classNameCandidate = haxeType.getText(); final String key = classNameCandidate.indexOf('.') != -1 ? classNameCandidate : - getQNameAndCache(qNameCache, psiFile, classNameCandidate); + getQNameAndCache(qNameCache, psiFile, classNameCandidate, haxeType); put(result, key, value); } } @@ -121,17 +121,18 @@ else if (type != null) { final String classNameCandidate = type.getText(); final String qName = classNameCandidate.indexOf('.') != -1 ? classNameCandidate : - getQNameAndCache(qNameCache, psiFile, classNameCandidate); + getQNameAndCache(qNameCache, psiFile, classNameCandidate, type); put(result, qName, value); } } return result; } - private static String getQNameAndCache(Map qNameCache, PsiFile psiFile, String classNameCandidate) { + private static String getQNameAndCache(Map qNameCache, PsiFile psiFile, String classNameCandidate, HaxeType haxeType) { String result = qNameCache.get(classNameCandidate); if (result == null) { - result = HaxeResolveUtil.getQName(psiFile, classNameCandidate, true); + result = HaxeResolveUtil.getQName(psiFile, classNameCandidate, true, true, haxeType); + if (result == null) result = classNameCandidate;// fallback so key wont be null qNameCache.put(classNameCandidate, result); } return result; diff --git a/src/main/java/com/intellij/plugins/haxe/util/HaxeResolveUtil.java b/src/main/java/com/intellij/plugins/haxe/util/HaxeResolveUtil.java index 4f5bcbcfc..b9a1d0402 100644 --- a/src/main/java/com/intellij/plugins/haxe/util/HaxeResolveUtil.java +++ b/src/main/java/com/intellij/plugins/haxe/util/HaxeResolveUtil.java @@ -1369,14 +1369,17 @@ public static PsiElement searchInSamePackage(@NotNull HaxeFileModel file, @NotNu return classModel; } - public static String getQName(PsiFile file, final String result, boolean searchInSamePackage) { + @Nullable + public static String getQName(PsiFile file, final String name, boolean searchInSamePackage, boolean searchParentPackages, HaxeType targetReference) { + + HaxeModule module = PsiTreeUtil.getChildOfType(file, HaxeModule.class); if (module != null) { @NotNull PsiElement[] moduleChildren = module.getChildren(); HaxeClass classForType = null; for (PsiElement child : moduleChildren) { - if (child instanceof HaxeClass && result.equals(((HaxeClass)child).getName())) { + if (child instanceof HaxeClass && name.equals(((HaxeClass)child).getName())) { classForType = (HaxeClass)child; break; } @@ -1391,13 +1394,13 @@ public static String getQName(PsiFile file, final String result, boolean searchI (HaxeImportStatement)(StreamUtil.reverse(Arrays.stream(fileChildren)) .filter(element -> element instanceof HaxeImportStatement impStatement - && impStatement.getModel().exposeByName(result) != null) + && impStatement.getModel().exposeByName(name) != null) .findFirst() .orElse(null)); final HaxeExpression importStatementExpression = importStatement == null ? null : importStatement.getReferenceExpression(); if (importStatementExpression != null) { - PsiElement element = importStatement.getModel().exposeByName(result); + PsiElement element = importStatement.getModel().exposeByName(name); if (element instanceof HaxeClass classModel) { return classModel.getQualifiedName(); } @@ -1410,15 +1413,18 @@ public static String getQName(PsiFile file, final String result, boolean searchI if (fileModel != null) { final HaxePackageModel packageModel = fileModel.getPackageModel(); if (packageModel != null) { - final HaxeClassModel classModel = packageModel.getClassModel(result); + final HaxeClassModel classModel = packageModel.getClassModel(name); if (classModel != null) { return classModel.haxeClass.getQualifiedName(); } } } } - - return result; + if (searchParentPackages && targetReference != null) { + HaxeClass haxeClass = findClassByQNameInSuperPackages(targetReference); + if (haxeClass != null) return haxeClass.getQualifiedName(); + } + return null; } @Nullable