Search in sources :

Example 6 with PerlSubNameElement

use of com.perl5.lang.perl.psi.PerlSubNameElement in project Perl5-IDEA by Camelcade.

the class PerlFancyMethodQuickFix method applyFix.

@Override
public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) {
    PsiElement method = descriptor.getPsiElement();
    assert method instanceof PerlMethod;
    PsiElement currentCallExpression = method.getParent();
    assert currentCallExpression instanceof PsiPerlSubCallExpr;
    // fixme ok, this is works, but we make syntax tree invalid, will be updated with next reparsing. Not sure it's a problem
    PerlNamespaceElement namespaceElement = ((PerlMethod) method).getNamespaceElement();
    assert namespaceElement != null;
    PerlSubNameElement subNameElement = ((PerlMethod) method).getSubNameElement();
    assert subNameElement != null;
    method.replace(PerlElementFactory.createMethodCall(project, namespaceElement.getCanonicalName(), subNameElement.getName()));
}
Also used : PerlMethod(com.perl5.lang.perl.psi.PerlMethod) PerlSubNameElement(com.perl5.lang.perl.psi.PerlSubNameElement) PsiPerlSubCallExpr(com.perl5.lang.perl.psi.PsiPerlSubCallExpr) PerlNamespaceElement(com.perl5.lang.perl.psi.PerlNamespaceElement) PsiElement(com.intellij.psi.PsiElement)

Example 7 with PerlSubNameElement

use of com.perl5.lang.perl.psi.PerlSubNameElement in project Perl5-IDEA by Camelcade.

the class PerlAnnotator method annotate.

@Override
public void annotate(@NotNull final PsiElement element, @NotNull AnnotationHolder holder) {
    IElementType elementType = PsiUtilCore.getElementType(element);
    if (elementType == NYI_STATEMENT) {
        holder.createInfoAnnotation(element, "Unimplemented statement").setTextAttributes(CodeInsightColors.TODO_DEFAULT_ATTRIBUTES);
    } else if (element instanceof PerlGlobVariable && ((PerlGlobVariable) element).isBuiltIn()) {
        holder.createInfoAnnotation(element, null).setTextAttributes(PERL_GLOB_BUILTIN);
    } else if (element instanceof PerlVariable && ((PerlVariable) element).isBuiltIn()) {
        holder.createInfoAnnotation(element, null).setTextAttributes(VARIABLE_KEYS_MAP.get(element.getClass()));
    } else if (elementType == LABEL_DECLARATION || elementType == LABEL_EXPR) {
        holder.createInfoAnnotation(element.getFirstChild(), null).setTextAttributes(PerlSyntaxHighlighter.PERL_LABEL);
    } else if (elementType == PACKAGE) {
        assert element instanceof PerlNamespaceElement;
        PerlNamespaceElement namespaceElement = (PerlNamespaceElement) element;
        PsiElement parent = namespaceElement.getParent();
        if (parent instanceof PerlNamespaceDefinitionWithIdentifier) {
            decorateElement(namespaceElement, holder, PerlSyntaxHighlighter.PERL_PACKAGE_DEFINITION, false);
        } else {
            if (namespaceElement.isPragma()) {
                decorateElement(namespaceElement, holder, PerlSyntaxHighlighter.PERL_PACKAGE_PRAGMA, false);
            } else if (namespaceElement.isBuiltin()) {
                decorateElement(namespaceElement, holder, PerlSyntaxHighlighter.PERL_PACKAGE_CORE, false);
            }
        }
    } else if (element instanceof PerlPolyNamedElement) {
        TextAttributesKey subAttribute = PerlSyntaxHighlighter.PERL_SUB_DEFINITION;
        if (elementType == PerlConstantsWrapperElementType.CONSTANT_WRAPPER) {
            // fixme some interface?
            subAttribute = PerlSyntaxHighlighter.PERL_CONSTANT;
        }
        for (PerlDelegatingLightNamedElement lightNamedElement : ((PerlPolyNamedElement) element).getLightElements()) {
            TextAttributesKey currentKey = lightNamedElement instanceof PerlSubDefinition ? subAttribute : PerlSyntaxHighlighter.PERL_PACKAGE_DEFINITION;
            PsiElement navigationElement = lightNamedElement.getNavigationElement();
            holder.createInfoAnnotation(ElementManipulators.getValueTextRange(navigationElement).shiftRight(lightNamedElement.getTextOffset()), null).setEnforcedTextAttributes(adjustTextAttributes(currentScheme.getAttributes(currentKey), false));
        }
    } else if (// instanceof PerlSubNameElement
    elementType == SUB_NAME) {
        PsiElement parent = element.getParent();
        if (parent instanceof PsiPerlSubDeclaration) {
            holder.createInfoAnnotation(element, null).setTextAttributes(PerlSyntaxHighlighter.PERL_SUB_DECLARATION);
        } else if (parent instanceof PerlSubDefinitionElement) {
            if ("AUTOLOAD".equals(((PerlSubNameElement) element).getName())) {
                holder.createInfoAnnotation(element, null).setTextAttributes(PerlSyntaxHighlighter.PERL_AUTOLOAD);
            } else {
                holder.createInfoAnnotation(element, null).setTextAttributes(PerlSyntaxHighlighter.PERL_SUB_DEFINITION);
            }
        } else if (parent instanceof PerlMethod) {
            // fixme don't we need to take multiple references here?
            PsiElement grandParent = parent.getParent();
            PerlNamespaceElement methodNamespace = ((PerlMethod) parent).getNamespaceElement();
            if (// / not ...->method fixme shouldn't we use isObjectMethod here?
            !(grandParent instanceof PsiPerlNestedCall) && // no explicit NS or it's core
            (methodNamespace == null || methodNamespace.isCORE()) && ((PerlSubNameElement) element).isBuiltIn()) {
                decorateElement(element, holder, PerlSyntaxHighlighter.PERL_SUB_BUILTIN);
            } else {
                PsiReference reference = element.getReference();
                if (reference instanceof PerlSubReference) {
                    ((PerlSubReference) reference).multiResolve(false);
                    if (((PerlSubReference) reference).isConstant()) {
                        holder.createInfoAnnotation(element, "Constant").setTextAttributes(PerlSyntaxHighlighter.PERL_CONSTANT);
                    } else if (((PerlSubReference) reference).isAutoloaded()) {
                        holder.createInfoAnnotation(element, "Auto-loaded sub").setTextAttributes(PerlSyntaxHighlighter.PERL_AUTOLOAD);
                    } else if (((PerlSubReference) reference).isXSub()) {
                        holder.createInfoAnnotation(element, "XSub").setTextAttributes(PerlSyntaxHighlighter.PERL_XSUB);
                    }
                }
            }
        }
    }
}
Also used : PerlSubReference(com.perl5.lang.perl.psi.references.PerlSubReference) PsiReference(com.intellij.psi.PsiReference) TextAttributesKey(com.intellij.openapi.editor.colors.TextAttributesKey) IElementType(com.intellij.psi.tree.IElementType) PerlDelegatingLightNamedElement(com.perl5.lang.perl.psi.light.PerlDelegatingLightNamedElement) PsiElement(com.intellij.psi.PsiElement)

Example 8 with PerlSubNameElement

use of com.perl5.lang.perl.psi.PerlSubNameElement in project Perl5-IDEA by Camelcade.

the class PerlParameterInfoHandler method getMethodCallArguments.

@Nullable
private static PerlParameterInfo[] getMethodCallArguments(@NotNull PsiPerlCallArgumentsImpl arguments) {
    PsiElement run = arguments.getPrevSibling();
    while (run != null) {
        if (run instanceof PerlMethodMixin) {
            PerlSubNameElement subNameElement = ((PerlMethodMixin) run).getSubNameElement();
            if (subNameElement == null) {
                break;
            }
            PerlParameterInfo[] parameterInfos;
            for (PsiReference reference : subNameElement.getReferences()) {
                if (reference instanceof PsiPolyVariantReference) {
                    for (ResolveResult resolveResult : ((PsiPolyVariantReference) reference).multiResolve(false)) {
                        parameterInfos = getTargetParameterInfo(resolveResult.getElement());
                        if (parameterInfos != null) {
                            return parameterInfos;
                        }
                    }
                } else {
                    parameterInfos = getTargetParameterInfo(reference.resolve());
                    if (parameterInfos != null) {
                        return parameterInfos;
                    }
                }
            }
        }
        run = run.getPrevSibling();
    }
    return null;
}
Also used : PerlMethodMixin(com.perl5.lang.perl.psi.mixins.PerlMethodMixin) PerlSubNameElement(com.perl5.lang.perl.psi.PerlSubNameElement) PsiReference(com.intellij.psi.PsiReference) ResolveResult(com.intellij.psi.ResolveResult) PsiElement(com.intellij.psi.PsiElement) PsiPolyVariantReference(com.intellij.psi.PsiPolyVariantReference) Nullable(org.jetbrains.annotations.Nullable)

Example 9 with PerlSubNameElement

use of com.perl5.lang.perl.psi.PerlSubNameElement in project Perl5-IDEA by Camelcade.

the class PerlSubUtil method getMethodReturnValue.

/**
 * Detects return value of method container
 *
 * @param methodContainer method container inspected
 * @return package name or null
 */
@Nullable
public static String getMethodReturnValue(PerlMethodContainer methodContainer) {
    if (methodContainer instanceof PerlSmartMethodContainer) {
        return ((PerlSmartMethodContainer) methodContainer).getReturnPackageName();
    }
    PerlMethod methodElement = methodContainer.getMethod();
    if (methodElement == null) {
        return null;
    }
    PerlSubNameElement subNameElement = methodElement.getSubNameElement();
    if (subNameElement == null) {
        return null;
    }
    if ("new".equals(subNameElement.getName())) {
        return methodElement.getPackageName();
    }
    PsiReference reference = subNameElement.getReference();
    if (reference instanceof PerlSubReference) {
        for (ResolveResult resolveResult : ((PerlSubReference) reference).multiResolve(false)) {
            PsiElement targetElement = resolveResult.getElement();
            if (targetElement instanceof PerlSub) {
                String returnType = ((PerlSub) targetElement).getReturns(subNameElement.getPackageName(), methodContainer.getCallArgumentsList());
                if (returnType != null) {
                    return returnType;
                }
            }
        }
    }
    return null;
}
Also used : PerlSubReference(com.perl5.lang.perl.psi.references.PerlSubReference) PsiReference(com.intellij.psi.PsiReference) ResolveResult(com.intellij.psi.ResolveResult) PsiElement(com.intellij.psi.PsiElement) Nullable(org.jetbrains.annotations.Nullable)

Aggregations

PsiElement (com.intellij.psi.PsiElement)7 PsiReference (com.intellij.psi.PsiReference)6 PerlSubNameElement (com.perl5.lang.perl.psi.PerlSubNameElement)5 PerlNamespaceElement (com.perl5.lang.perl.psi.PerlNamespaceElement)4 NotNull (org.jetbrains.annotations.NotNull)4 ResolveResult (com.intellij.psi.ResolveResult)3 IElementType (com.intellij.psi.tree.IElementType)3 Nullable (org.jetbrains.annotations.Nullable)3 PsiFile (com.intellij.psi.PsiFile)2 PerlMethod (com.perl5.lang.perl.psi.PerlMethod)2 PerlVisitor (com.perl5.lang.perl.psi.PerlVisitor)2 PerlSubReference (com.perl5.lang.perl.psi.references.PerlSubReference)2 TextAttributesKey (com.intellij.openapi.editor.colors.TextAttributesKey)1 Project (com.intellij.openapi.project.Project)1 PsiPolyVariantReference (com.intellij.psi.PsiPolyVariantReference)1 GlobalSearchScope (com.intellij.psi.search.GlobalSearchScope)1 PerlExportDescriptor (com.perl5.lang.perl.extensions.packageprocessor.PerlExportDescriptor)1 PerlFancyMethodQuickFix (com.perl5.lang.perl.idea.quickfixes.PerlFancyMethodQuickFix)1 PerlSubElement (com.perl5.lang.perl.psi.PerlSubElement)1 PerlVariable (com.perl5.lang.perl.psi.PerlVariable)1