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()));
}
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);
}
}
}
}
}
}
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;
}
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;
}
Aggregations