use of com.perl5.lang.perl.psi.properties.PerlNamespaceElementContainer in project Perl5-IDEA by Camelcade.
the class PerlSubReference method resolveInner.
@NotNull
@Override
protected ResolveResult[] resolveInner(boolean incompleteCode) {
PsiElement myElement = getElement();
assert myElement instanceof PerlSubNameElement;
PsiElement parent = myElement.getParent();
if (parent instanceof PerlSubDeclarationElement || parent instanceof PerlSubDefinitionElement) {
return ResolveResult.EMPTY_ARRAY;
}
PerlSubNameElement subNameElement = (PerlSubNameElement) myElement;
List<PsiElement> relatedItems = new ArrayList<>();
String packageName = subNameElement.getPackageName();
String subName = subNameElement.getName();
Project project = subNameElement.getProject();
PerlNamespaceElement expliclitPackageElement = null;
if (parent instanceof PerlNamespaceElementContainer) {
expliclitPackageElement = ((PerlNamespaceElementContainer) parent).getNamespaceElement();
}
if (!subName.isEmpty()) {
if (parent instanceof PerlMethod && ((PerlMethod) parent).isObjectMethod()) {
boolean isSuper = expliclitPackageElement != null && expliclitPackageElement.isSUPER();
relatedItems.addAll(PerlMro.resolveSub(project, isSuper ? PerlPackageUtil.getContextPackageName(subNameElement) : packageName, subName, isSuper));
} else // static resolution
{
if (PerlSharedSettings.getInstance(project).SIMPLE_MAIN_RESOLUTION && // fixme this is a dirty hack until proper names resolution implemented
PerlPackageUtil.isMain(packageName)) {
PsiFile file = subNameElement.getContainingFile();
GlobalSearchScope fileScope = GlobalSearchScope.fileScope(file);
collectRelatedItems(packageName + PerlPackageUtil.PACKAGE_SEPARATOR + subName, project, parent, relatedItems, fileScope);
// if (file instanceof PerlFile)
// ((PerlFile) file).getElementsResolveScope();
// System.err.println("Checking for " + subName);
}
if (relatedItems.isEmpty()) {
GlobalSearchScope globalSearchScope = GlobalSearchScope.allScope(project);
// check indexes for defined subs
collectRelatedItems(packageName + PerlPackageUtil.PACKAGE_SEPARATOR + subName, project, parent, relatedItems, globalSearchScope);
if (expliclitPackageElement == null) {
// check for imports to the current file
PerlNamespaceDefinitionElement namespaceContainer = PerlPackageUtil.getNamespaceContainerForElement(subNameElement);
if (namespaceContainer != null) {
for (PerlExportDescriptor exportDescriptor : namespaceContainer.getImportedSubsDescriptors()) {
if (exportDescriptor.getImportedName().equals(subName)) {
int currentSize = relatedItems.size();
collectRelatedItems(exportDescriptor.getTargetCanonicalName(), project, parent, relatedItems, globalSearchScope);
if (// imported, but not found, attempting autoload
relatedItems.size() == currentSize) {
collectRelatedItems(exportDescriptor.getRealPackage() + PerlSubUtil.SUB_AUTOLOAD_WITH_PREFIX, project, parent, relatedItems, globalSearchScope);
}
}
}
}
} else // check imports to target namespace
{
String targetPackageName = expliclitPackageElement.getCanonicalName();
if (targetPackageName != null) {
// fixme partially not DRY with previous block
for (PerlNamespaceDefinitionElement namespaceDefinition : PerlPackageUtil.getNamespaceDefinitions(project, targetPackageName)) {
for (PerlExportDescriptor exportDescriptor : namespaceDefinition.getImportedSubsDescriptors()) {
if (exportDescriptor.getImportedName().equals(subName)) {
collectRelatedItems(exportDescriptor.getTargetCanonicalName(), project, parent, relatedItems, globalSearchScope);
}
}
}
}
}
// check for builtins
if (relatedItems.isEmpty()) {
PerlSubDefinitionElement builtInSub = PerlBuiltInSubsService.getInstance(project).findSub(subName);
if (builtInSub != null) {
relatedItems.add(builtInSub);
}
}
// check for autoload
if (relatedItems.isEmpty() && // don't check for UNIVERSAL::AUTOLOAD
!PerlPackageUtil.isUNIVERSAL(packageName)) {
collectRelatedItems(packageName + PerlSubUtil.SUB_AUTOLOAD_WITH_PREFIX, project, parent, relatedItems, globalSearchScope);
}
}
}
}
List<ResolveResult> result = getResolveResults(relatedItems);
return result.toArray(new ResolveResult[result.size()]);
}
Aggregations