use of com.perl5.lang.perl.psi.PerlNamespaceElement in project Perl5-IDEA by Camelcade.
the class PerlUseStatementMixin method getPackageName.
@Override
public String getPackageName() {
PerlUseStatementStub stub = getStub();
if (stub != null) {
return stub.getPackageName();
}
PerlNamespaceElement ns = getNamespaceElement();
if (ns != null) {
return ns.getCanonicalName();
}
return null;
}
use of com.perl5.lang.perl.psi.PerlNamespaceElement in project Perl5-IDEA by Camelcade.
the class PerlUseStatementMixin method getImportParameters.
@Override
@Nullable
public List<String> getImportParameters() {
PerlUseStatementStub stub = getStub();
if (stub != null) {
return stub.getImportParameters();
}
if (getExpr() == null) {
return null;
}
PerlNamespaceElement namespaceElement = getNamespaceElement();
if (namespaceElement != null) {
return PerlPsiUtil.collectStringContents(namespaceElement.getNextSibling());
} else {
return Collections.emptyList();
}
}
use of com.perl5.lang.perl.psi.PerlNamespaceElement 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.PerlNamespaceElement in project Perl5-IDEA by Camelcade.
the class PerlRedundantNamespaceInspection method buildVisitor.
@NotNull
@Override
public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder, boolean isOnTheFly) {
return new PerlVisitor() {
@Override
public void visitMethod(@NotNull PsiPerlMethod o) {
PerlNamespaceElement namespaceElement = o.getNamespaceElement();
if (namespaceElement != null) {
String packageName = namespaceElement.getCanonicalName();
if (StringUtil.isNotEmpty(packageName)) {
String contextPackageName = PerlPackageUtil.getContextPackageName(o);
if (StringUtil.equals(packageName, contextPackageName)) {
if (!namespaceElement.getTextRange().isEmpty()) {
holder.registerProblem(namespaceElement, "Redundant namespace qualifier", ProblemHighlightType.LIKE_UNUSED_SYMBOL);
}
}
}
}
super.visitMethod(o);
}
};
}
use of com.perl5.lang.perl.psi.PerlNamespaceElement 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);
}
}
}
}
}
}
Aggregations