mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
global inspections: build reference only once per element
GitOrigin-RevId: c7665b3fecc5cd8ea181ad7e844c191af1267dab
This commit is contained in:
committed by
intellij-monorepo-bot
parent
f827bbd8c0
commit
e61d97c6e1
+12
-13
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
-1
@@ -76,7 +76,6 @@ public class RefFunctionalExpressionImpl extends RefJavaElementImpl implements R
|
||||
addReference(parameter, parameter.getPsiElement(), element, false, true, null);
|
||||
}
|
||||
}
|
||||
getRefManager().fireBuildReferences(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
-3
@@ -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() {
|
||||
|
||||
+23
-24
@@ -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
|
||||
|
||||
-2
@@ -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.
|
||||
*
|
||||
|
||||
+15
-5
@@ -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);
|
||||
}
|
||||
|
||||
+4
-1
@@ -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);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user