global inspections: build reference only once per element

GitOrigin-RevId: c7665b3fecc5cd8ea181ad7e844c191af1267dab
This commit is contained in:
Bas Leijdekkers
2022-06-29 20:02:27 +00:00
committed by intellij-monorepo-bot
parent f827bbd8c0
commit e61d97c6e1
10 changed files with 59 additions and 52 deletions
@@ -71,7 +71,7 @@ public final class RefClassImpl extends RefJavaElementImpl implements RefClass {
for (UClass innerClass : innerClasses) {
final PsiElement psi = innerClass.getSourcePsi();
if (psi != null) {
final RefClass refInnerClass = (RefClass)manager.getReference(psi);
final RefElement refInnerClass = manager.getReference(psi);
if (refInnerClass != null) {
addChild(refInnerClass);
if (!innerClass.isStatic()) utilityClass = false;
@@ -121,17 +121,17 @@ public final class RefClassImpl extends RefJavaElementImpl implements RefClass {
boolean memberSeen = false;
for (UField uField : uFields) {
final RefField field = ObjectUtils.tryCast(getRefManager().getReference(uField.getSourcePsi()), RefField.class);
final RefField field = ObjectUtils.tryCast(manager.getReference(uField.getSourcePsi()), RefField.class);
if (field != null) {
memberSeen = true;
addChild(field);
if (!uField.isStatic() || uField instanceof UEnumConstant) utilityClass = false;
}
}
RefMethod varargConstructor = null;
RefMethodImpl varargConstructor = null;
boolean constructorSeen = false;
for (UMethod uMethod : uMethods) {
RefMethod refMethod = ObjectUtils.tryCast(getRefManager().getReference(uMethod.getSourcePsi()), RefMethod.class);
RefMethodImpl refMethod = ObjectUtils.tryCast(manager.getReference(uMethod.getSourcePsi()), RefMethodImpl.class);
if (refMethod != null) {
addChild(refMethod);
@@ -143,7 +143,7 @@ public final class RefClassImpl extends RefJavaElementImpl implements RefClass {
}
if (parameters.isEmpty()) {
setDefaultConstructor((RefMethodImpl)refMethod);
setDefaultConstructor(refMethod);
}
else if (parameters.size() == 1) {
PsiElement parameterPsi = parameters.get(0).getJavaPsi();
@@ -169,7 +169,7 @@ public final class RefClassImpl extends RefJavaElementImpl implements RefClass {
synchronized (this) {
if (varargConstructor != null && myDefaultConstructor == null) {
setDefaultConstructor((RefMethodImpl)varargConstructor);
setDefaultConstructor(varargConstructor);
}
}
@@ -312,8 +312,6 @@ public final class RefClassImpl extends RefJavaElementImpl implements RefClass {
}
}
refUtil.addReferencesTo(uClass, this, uClass.getUastSuperTypes().toArray(UElementKt.EMPTY_ARRAY));
getRefManager().fireBuildReferences(this);
}
}
@@ -321,7 +319,8 @@ public final class RefClassImpl extends RefJavaElementImpl implements RefClass {
public void accept(final @NotNull RefVisitor visitor) {
if (visitor instanceof RefJavaVisitor) {
ApplicationManager.getApplication().runReadAction(() -> ((RefJavaVisitor)visitor).visitClass(this));
} else {
}
else {
super.accept(visitor);
}
}
@@ -333,7 +332,7 @@ public final class RefClassImpl extends RefJavaElementImpl implements RefClass {
return myBases instanceof Set ? (Set<RefClass>)myBases : Collections.singleton((RefClass)myBases);
}
private synchronized void addBaseClass(RefClass refClass){
private synchronized void addBaseClass(RefClass refClass) {
if (myBases == null) {
myBases = refClass;
}
@@ -405,7 +404,7 @@ public final class RefClassImpl extends RefJavaElementImpl implements RefClass {
void addTypeReference(RefJavaElement from) {
if (from != null) {
synchronized (this) {
if (myInTypeReferences == null){
if (myInTypeReferences == null) {
myInTypeReferences = new HashSet<>(1);
}
myInTypeReferences.add(from);
@@ -461,7 +460,7 @@ public final class RefClassImpl extends RefJavaElementImpl implements RefClass {
static @Nullable RefClass classFromExternalName(RefManager manager, String externalName) {
return (RefClass) manager.getReference(ClassUtil.findPsiClass(PsiManager.getInstance(manager.getProject()), externalName));
return (RefClass)manager.getReference(ClassUtil.findPsiClass(PsiManager.getInstance(manager.getProject()), externalName));
}
@Override
@@ -559,7 +558,7 @@ public final class RefClassImpl extends RefJavaElementImpl implements RefClass {
@Override
synchronized void addOutTypeReference(RefClass refClass) {
if (myOutTypeReferences == null){
if (myOutTypeReferences == null) {
myOutTypeReferences = new HashSet<>();
}
myOutTypeReferences.add(refClass);
@@ -170,7 +170,6 @@ public class RefFieldImpl extends RefJavaElementImpl implements RefField {
}
refUtil.addTypeReference(uField, uField.getType(), getRefManager(), this);
getRefManager().fireBuildReferences(this);
}
}
@@ -76,7 +76,6 @@ public class RefFunctionalExpressionImpl extends RefJavaElementImpl implements R
addReference(parameter, parameter.getPsiElement(), element, false, true, null);
}
}
getRefManager().fireBuildReferences(this);
}
@Override
@@ -21,9 +21,7 @@ public class RefImplicitConstructorImpl extends RefMethodImpl implements RefImpl
}
@Override
public void buildReferences() {
getRefManager().fireBuildReferences(this);
}
public void buildReferences() {}
@Override
public boolean isSuspicious() {
@@ -16,35 +16,34 @@ public class RefJavaFileImpl extends RefFileImpl {
public void buildReferences() {
PsiFile file = getPsiElement();
if (file != null && PsiPackage.PACKAGE_INFO_FILE.equals(file.getName())) {
PsiPackageStatement packageStatement = ((PsiJavaFile)file).getPackageStatement();
if (packageStatement != null) {
packageStatement.accept(new JavaRecursiveElementWalkingVisitor() {
@Override
public void visitReferenceElement(@NotNull PsiJavaCodeReferenceElement reference) {
super.visitReferenceElement(reference);
PsiPackageStatement packageStatement = ((PsiJavaFile)file).getPackageStatement();
if (packageStatement != null) {
packageStatement.accept(new JavaRecursiveElementWalkingVisitor() {
@Override
public void visitReferenceElement(@NotNull PsiJavaCodeReferenceElement reference) {
super.visitReferenceElement(reference);
processReference(reference.resolve());
}
@Override
public void visitNameValuePair(@NotNull PsiNameValuePair pair) {
super.visitNameValuePair(pair);
PsiReference reference = pair.getReference();
if (reference != null) {
processReference(reference.resolve());
}
}
@Override
public void visitNameValuePair(@NotNull PsiNameValuePair pair) {
super.visitNameValuePair(pair);
PsiReference reference = pair.getReference();
if (reference != null) {
processReference(reference.resolve());
}
private void processReference(PsiElement element) {
RefElement refElement = getRefManager().getReference(element);
if (refElement instanceof RefJavaElementImpl) {
addOutReference(refElement);
((RefJavaElementImpl)refElement).markReferenced(RefJavaFileImpl.this, false, true, null);
}
private void processReference(PsiElement element) {
RefElement refElement = getRefManager().getReference(element);
if (refElement instanceof RefJavaElementImpl) {
addOutReference(refElement);
((RefJavaElementImpl)refElement).markReferenced(RefJavaFileImpl.this, false, true, null);
}
}
});
}
}
});
}
getRefManager().fireBuildReferences(this);
}
}
@Override
@@ -207,8 +207,6 @@ public final class RefJavaModuleImpl extends RefElementImpl implements RefJavaMo
buildExportsReferences(javaModule);
buildProvidesReferences(javaModule);
buildUsesReferences(javaModule);
getRefManager().fireBuildReferences(this);
}
}
@@ -293,8 +293,6 @@ public class RefMethodImpl extends RefJavaElementImpl implements RefMethod {
setBodyEmpty(isOnlyCallsSuper() || !isExternalOverride() && isEmptyExpression(method.getUastBody()));
refUtil.addTypeReference(method, method.getReturnType(), getRefManager(), this);
getRefManager().fireBuildReferences(this);
}
private void collectUncaughtExceptions(@NotNull PsiMethod method) {
@@ -43,6 +43,10 @@ public interface RefElement extends RefEntity {
default void buildReferences() {}
default boolean areReferencesBuilt() {
return false;
}
/**
* Checks if a chain of references exists from one of the entry points to this element.
*
@@ -25,11 +25,12 @@ import java.util.List;
public abstract class RefElementImpl extends RefEntityImpl implements RefElement, WritableRefElement {
protected static final Logger LOG = Logger.getInstance(RefElement.class);
private static final int IS_DELETED_MASK = 0b10000;
private static final int IS_INITIALIZED_MASK = 0b100000;
private static final int IS_REACHABLE_MASK = 0b1000000;
private static final int IS_ENTRY_MASK = 0b10000000;
private static final int IS_PERMANENT_ENTRY_MASK = 0b1_00000000;
private static final int IS_DELETED_MASK = 0b10000; // 5th bit
private static final int IS_INITIALIZED_MASK = 0b100000; // 6th bit
private static final int IS_REACHABLE_MASK = 0b1000000; // 7th bit
private static final int IS_ENTRY_MASK = 0b10000000; // 8th bit
private static final int IS_PERMANENT_ENTRY_MASK = 0b1_00000000; // 9th bit
private static final int REFERENCES_BUILT_MASK = 0b10_00000000; // 10th bit
private final SmartPsiElementPointer<?> myID;
@@ -192,6 +193,15 @@ public abstract class RefElementImpl extends RefEntityImpl implements RefElement
}
}
public void setReferencesBuilt(boolean built) {
setFlag(built, REFERENCES_BUILT_MASK);
}
@Override
public boolean areReferencesBuilt() {
return checkFlag(REFERENCES_BUILT_MASK);
}
public void setEntry(boolean entry) {
setFlag(entry, IS_ENTRY_MASK);
}
@@ -198,7 +198,7 @@ public class RefManagerImpl extends RefManager {
}
}
public void fireBuildReferences(RefElement refElement) {
private void fireBuildReferences(RefElement refElement) {
for (RefGraphAnnotator annotator : myGraphAnnotators) {
annotator.onReferencesBuild(refElement);
}
@@ -427,9 +427,12 @@ public class RefManagerImpl extends RefManager {
}
public void buildReferences(RefElement element) {
if (element.areReferencesBuilt()) return;
((RefElementImpl)element).setReferencesBuilt(true);
executeTask(() -> {
element.initializeIfNeeded();
element.buildReferences();
fireBuildReferences(element);
});
}