Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,29 +8,32 @@
import consulo.language.ast.ASTNode;

import jakarta.annotation.Nonnull;

import java.util.Collection;
import java.util.Collections;

/**
* @author peter
*/
public class PsiAdviceExecutionExpression extends AopElementBase implements PsiPointcutExpression{
public PsiAdviceExecutionExpression(@Nonnull ASTNode node) {
super(node);
}
public class PsiAdviceExecutionExpression extends AopElementBase implements PsiPointcutExpression {
public PsiAdviceExecutionExpression(@Nonnull ASTNode node) {
super(node);
}

@Override
public String toString() {
return "PsiAdviceExecutionExpression";
}
@Override
public String toString() {
return "PsiAdviceExecutionExpression";
}

@Nonnull
public PointcutMatchDegree acceptsSubject(PointcutContext context, PsiMember member) {
return PointcutMatchDegree.FALSE;
}
@Nonnull
@Override
public PointcutMatchDegree acceptsSubject(PointcutContext context, PsiMember member) {
return PointcutMatchDegree.FALSE;
}

@Nonnull
public Collection<AopPsiTypePattern> getPatterns() {
return Collections.emptyList();
}
@Nonnull
@Override
public Collection<AopPsiTypePattern> getPatterns() {
return Collections.emptyList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
package com.intellij.aop.psi;

import com.intellij.java.language.psi.*;
import consulo.language.psi.PsiElement;

import consulo.annotation.access.RequiredReadAction;
import jakarta.annotation.Nonnull;

import java.util.HashSet;
import java.util.Set;

Expand All @@ -24,55 +24,60 @@ public AopPsiTypePattern getAnnotationPattern() {
return myAnnotationPattern;
}

@Override
@RequiredReadAction
public boolean accepts(@Nonnull PsiType type) {
if (type instanceof PsiClassType) {
PsiClass psiClass = ((PsiClassType)type).resolve();
if (type instanceof PsiClassType classType) {
PsiClass psiClass = classType.resolve();
if (psiClass != null && acceptsAnnotationPattern(psiClass, myAnnotationPattern, false)) return true;
}
return false;
}

public static boolean acceptsAnnotationPattern(@Nonnull PsiModifierListOwner owner, AopPsiTypePattern annoPattern, boolean shoulBeInherited) {
return acceptsAnnotationPattern(owner, annoPattern, shoulBeInherited, new HashSet<PsiModifierListOwner>());
@RequiredReadAction
public static boolean acceptsAnnotationPattern(@Nonnull PsiModifierListOwner owner, AopPsiTypePattern annoPattern, boolean shouldBeInherited) {
return acceptsAnnotationPattern(owner, annoPattern, shouldBeInherited, new HashSet<>());
}

private static boolean acceptsAnnotationPattern(PsiModifierListOwner owner, AopPsiTypePattern annoPattern,
boolean shoulBeInherited,
Set<PsiModifierListOwner> visited) {
@RequiredReadAction
private static boolean acceptsAnnotationPattern(
PsiModifierListOwner owner,
AopPsiTypePattern annoPattern,
boolean shouldBeInherited,
Set<PsiModifierListOwner> visited
) {
visited.add(owner);
if (annoPattern instanceof NotPattern) {
return !acceptsAnnotationPattern(owner, ((NotPattern)annoPattern).getInnerPattern(), shoulBeInherited);
if (annoPattern instanceof NotPattern notPattern) {
return !acceptsAnnotationPattern(owner, notPattern.getInnerPattern(), shouldBeInherited);
}

PsiModifierList modifierList = owner.getModifierList();
if (modifierList != null) {
for (PsiAnnotation annotation : modifierList.getAnnotations()) {
PsiJavaCodeReferenceElement element = annotation.getNameReferenceElement();
if (element != null) {
PsiElement psiElement = element.resolve();
if (psiElement instanceof PsiClass) {
PsiClass annoClass = (PsiClass)psiElement;
if (annoPattern.accepts(JavaPsiFacade.getInstance(psiElement.getProject()).getElementFactory().createType(annoClass))) {
PsiModifierList list = annoClass.getModifierList();
return !shoulBeInherited || list != null && list.findAnnotation(CommonClassNames.JAVA_LANG_ANNOTATION_INHERITED) != null;
}
}
if (element != null
&& element.resolve() instanceof PsiClass annoClass
&& annoPattern.accepts(JavaPsiFacade.getInstance(annoClass.getProject()).getElementFactory().createType(annoClass))) {
PsiModifierList list = annoClass.getModifierList();
return !shouldBeInherited || list != null && list.findAnnotation(CommonClassNames.JAVA_LANG_ANNOTATION_INHERITED) != null;
}
String qualifiedName = annotation.getQualifiedName();
if (qualifiedName != null && annoPattern.accepts(qualifiedName)) {
return true;
}
}
}
if (owner instanceof PsiClass) {
PsiClass superClass = ((PsiClass) owner).getSuperClass();
if (owner instanceof PsiClass psiClass) {
PsiClass superClass = psiClass.getSuperClass();
return superClass != null && !visited.contains(superClass) && acceptsAnnotationPattern(superClass, annoPattern, true);
}

return false;
}

@Nonnull
@Override
@RequiredReadAction
public PointcutMatchDegree canBeAssignableFrom(@Nonnull PsiType type) {
return PointcutMatchDegree.valueOf(accepts(type));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
/*
* Copyright (c) 2000-2007 JetBrains s.r.o. All Rights Reserved.
*/

package com.intellij.aop.psi;

import com.intellij.java.language.impl.psi.impl.PsiElementFactoryImpl;
import com.intellij.java.language.psi.*;
import consulo.annotation.access.RequiredReadAction;
import consulo.language.ast.ASTNode;
import consulo.util.lang.Comparing;

Expand All @@ -19,6 +19,7 @@
*/
public class PsiArgsExpression extends AopElementBase implements PsiPointcutExpression{
private static final TypeArgumentMatcher ARGS_MATCHER = new TypeArgumentMatcher() {
@Override
public PointcutMatchDegree fun(PsiType actualType, AopReferenceTarget target) {
if (super.fun(actualType, target) == PointcutMatchDegree.TRUE || target.isAssignableFrom(actualType)) {
return PointcutMatchDegree.TRUE;
Expand All @@ -42,16 +43,20 @@ public PsiArgsExpression(@Nonnull ASTNode node) {
super(node);
}

@Override
public String toString() {
return "PsiArgsExpression";
}

@Nullable
@RequiredReadAction
public AopParameterList getParameterList() {
return findChildByClass(AopParameterList.class);
}

@Nonnull
@Override
@RequiredReadAction
public PointcutMatchDegree acceptsSubject(PointcutContext context, PsiMember member) {
if (member instanceof PsiMethod) {
AopParameterList parameterList = getParameterList();
Expand All @@ -61,6 +66,7 @@ public PointcutMatchDegree acceptsSubject(PointcutContext context, PsiMember mem
}

@Nonnull
@Override
public Collection<AopPsiTypePattern> getPatterns() {
return Arrays.asList(AopPsiTypePattern.TRUE);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,39 +1,43 @@
/*
* Copyright (c) 2000-2007 JetBrains s.r.o. All Rights Reserved.
*/

package com.intellij.aop.psi;

import com.intellij.java.language.psi.PsiMember;
import consulo.language.ast.ASTNode;

import jakarta.annotation.Nonnull;

import java.util.Arrays;
import java.util.Collection;

/**
* @author peter
*/
public class PsiAtAnnotationExpression extends PsiTypedPointcutExpression implements PsiAtPointcutDesignator{

public PsiAtAnnotationExpression(@Nonnull ASTNode node) {
super(node);
}

public String toString() {
return "PsiAtAnnotationExpression";
}

@Nonnull
public PointcutMatchDegree acceptsSubject(PointcutContext context, PsiMember member) {
AopReferenceHolder pattern = getTypeReference();
if (pattern == null) return PointcutMatchDegree.FALSE;

return PointcutMatchDegree.valueOf(member.getModifierList().findAnnotation(context.resolve(pattern).getQualifiedName()) != null);
}

@Nonnull
public Collection<AopPsiTypePattern> getPatterns() {
return Arrays.asList(AopPsiTypePattern.TRUE);
}
public class PsiAtAnnotationExpression extends PsiTypedPointcutExpression implements PsiAtPointcutDesignator {
public PsiAtAnnotationExpression(@Nonnull ASTNode node) {
super(node);
}

@Override
public String toString() {
return "PsiAtAnnotationExpression";
}

@Nonnull
@Override
public PointcutMatchDegree acceptsSubject(PointcutContext context, PsiMember member) {
AopReferenceHolder pattern = getTypeReference();
if (pattern == null) {
return PointcutMatchDegree.FALSE;
}

return PointcutMatchDegree.valueOf(member.getModifierList().findAnnotation(context.resolve(pattern).getQualifiedName()) != null);
}

@Nonnull
@Override
public Collection<AopPsiTypePattern> getPatterns() {
return Arrays.asList(AopPsiTypePattern.TRUE);
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
/*
* Copyright (c) 2000-2007 JetBrains s.r.o. All Rights Reserved.
*/

package com.intellij.aop.psi;

import com.intellij.java.language.psi.*;
import consulo.annotation.access.RequiredReadAction;
import consulo.language.ast.ASTNode;
import consulo.util.lang.function.PairFunction;

import jakarta.annotation.Nonnull;
import jakarta.annotation.Nullable;

import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
Expand All @@ -19,50 +18,53 @@
* @author peter
*/
public class PsiAtArgsExpression extends AopElementBase implements PsiPointcutExpression, PsiAtPointcutDesignator{

public PsiAtArgsExpression(@Nonnull ASTNode node) {
super(node);
}

@Override
public String toString() {
return "PsiAtArgsExpression";
}

@Nullable
@RequiredReadAction
public AopParameterList getParameterList() {
return findChildByClass(AopParameterList.class);
}

@Nonnull
@Override
@RequiredReadAction
public PointcutMatchDegree acceptsSubject(PointcutContext context, PsiMember member) {
if (!(member instanceof PsiMethod)) return PointcutMatchDegree.FALSE;
if (!(member instanceof PsiMethod method)) return PointcutMatchDegree.FALSE;

AopParameterList list = getParameterList();
if (list == null) return PointcutMatchDegree.FALSE;



return list.matches(context, ((PsiMethod)member).getParameterList(), new PairFunction<PsiType, AopReferenceTarget, PointcutMatchDegree>() {
public PointcutMatchDegree fun(PsiType actualType, AopReferenceTarget holder) {
return actualType instanceof PsiClassType
? canHaveAnnotation(((PsiClassType)actualType).resolve(), holder, PointcutMatchDegree.TRUE, PointcutMatchDegree.MAYBE)
: PointcutMatchDegree.FALSE;
}
});
return list.matches(
context,
method.getParameterList(),
(actualType, holder) -> actualType instanceof PsiClassType classType
? canHaveAnnotation(classType.resolve(), holder, PointcutMatchDegree.TRUE, PointcutMatchDegree.MAYBE)
: PointcutMatchDegree.FALSE
);
}

@Nonnull
@Override
public Collection<AopPsiTypePattern> getPatterns() {
return Arrays.asList(AopPsiTypePattern.TRUE);
}


@RequiredReadAction
public static PointcutMatchDegree canHaveAnnotation(@Nullable PsiClass psiClass, @Nullable AopReferenceHolder holder, PointcutContext context,
PointcutMatchDegree maybeTrue, PointcutMatchDegree maybeFalse) {
if (holder == null) return PointcutMatchDegree.FALSE;
return canHaveAnnotation(psiClass, context.resolve(holder), maybeTrue, maybeFalse);
}

@RequiredReadAction
public static PointcutMatchDegree canHaveAnnotation(@Nullable PsiClass psiClass, @Nonnull AopReferenceTarget holder,
PointcutMatchDegree maybeTrue, PointcutMatchDegree maybeFalse) {
if (psiClass == null) return PointcutMatchDegree.FALSE;
Expand All @@ -84,7 +86,7 @@ public static PointcutMatchDegree canHaveAnnotation(@Nullable PsiClass psiClass,

if (psiClass.isInterface()) return maybeFalse;

Set<PsiClass> visited = new HashSet<PsiClass>();
Set<PsiClass> visited = new HashSet<>();
visited.add(psiClass);

while (true) {
Expand Down
Loading
Loading