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 @@ -19,6 +19,8 @@
import com.intellij.java.language.psi.*;
import com.intellij.java.language.psi.util.PsiUtil;
import com.intellij.java.language.util.VisibilityUtil;
import consulo.annotation.access.RequiredReadAction;
import consulo.annotation.access.RequiredWriteAction;
import consulo.language.codeStyle.CodeStyleManager;
import consulo.language.editor.refactoring.BaseRefactoringProcessor;
import consulo.language.editor.refactoring.localize.RefactoringLocalize;
Expand All @@ -40,12 +42,8 @@
import consulo.util.collection.MultiMap;
import consulo.util.lang.ref.SimpleReference;
import jakarta.annotation.Nonnull;
import org.jetbrains.annotations.NonNls;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.*;

/**
* @author dsl
Expand All @@ -65,7 +63,7 @@ public ReplaceConstructorWithFactoryProcessor(
PsiMethod originalConstructor,
PsiClass originalClass,
PsiClass targetClass,
@NonNls String factoryName
String factoryName
) {
super(project);
myOriginalClass = originalClass;
Expand All @@ -79,15 +77,16 @@ public ReplaceConstructorWithFactoryProcessor(
}

private boolean isInner(PsiClass originalClass) {
final boolean result = PsiUtil.isInnerClass(originalClass);
boolean result = PsiUtil.isInnerClass(originalClass);
if (result) {
LOG.assertTrue(PsiTreeUtil.isAncestor(myTargetClass, originalClass, false));
}
return result;
}

@Nonnull
protected UsageViewDescriptor createUsageViewDescriptor(UsageInfo[] usages) {
@Override
protected UsageViewDescriptor createUsageViewDescriptor(@Nonnull UsageInfo[] usages) {
if (myConstructor != null) {
return new ReplaceConstructorWithFactoryViewDescriptor(myConstructor);
}
Expand All @@ -99,11 +98,13 @@ protected UsageViewDescriptor createUsageViewDescriptor(UsageInfo[] usages) {
private List<PsiElement> myNonNewConstructorUsages;

@Nonnull
@Override
@RequiredReadAction
protected UsageInfo[] findUsages() {
GlobalSearchScope projectScope = GlobalSearchScope.projectScope(myProject);

ArrayList<UsageInfo> usages = new ArrayList<UsageInfo>();
myNonNewConstructorUsages = new ArrayList<PsiElement>();
ArrayList<UsageInfo> usages = new ArrayList<>();
myNonNewConstructorUsages = new ArrayList<>();

for (PsiReference reference : ReferencesSearch.search(
myConstructor == null ? myOriginalClass : myConstructor,
Expand All @@ -112,13 +113,13 @@ protected UsageInfo[] findUsages() {
)) {
PsiElement element = reference.getElement();

if (element.getParent() instanceof PsiNewExpression) {
usages.add(new UsageInfo(element.getParent()));
if (element.getParent() instanceof PsiNewExpression newExpr) {
usages.add(new UsageInfo(newExpr));
}
else if ("super".equals(element.getText()) || "this".equals(element.getText())) {
myNonNewConstructorUsages.add(element);
}
else if (element instanceof PsiMethod && ((PsiMethod)element).isConstructor()) {
else if (element instanceof PsiMethod method && method.isConstructor()) {
myNonNewConstructorUsages.add(element);
}
else if (element instanceof PsiClass) {
Expand Down Expand Up @@ -146,9 +147,9 @@ else if (element instanceof PsiClass) {
protected boolean preprocessUsages(@Nonnull SimpleReference<UsageInfo[]> refUsages) {
UsageInfo[] usages = refUsages.get();

MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
final PsiResolveHelper helper = JavaPsiFacade.getInstance(myProject).getResolveHelper();
final PsiClass constructorContainingClass = getConstructorContainingClass();
MultiMap<PsiElement, String> conflicts = new MultiMap<>();
PsiResolveHelper helper = JavaPsiFacade.getInstance(myProject).getResolveHelper();
PsiClass constructorContainingClass = getConstructorContainingClass();
if (!helper.isAccessible(constructorContainingClass, myTargetClass, null)) {
LocalizeValue message = RefactoringLocalize.class0IsNotAccessibleFromTarget1(
RefactoringUIUtil.getDescription(constructorContainingClass, true),
Expand All @@ -157,10 +158,10 @@ protected boolean preprocessUsages(@Nonnull SimpleReference<UsageInfo[]> refUsag
conflicts.putValue(constructorContainingClass, message.get());
}

HashSet<PsiElement> reportedContainers = new HashSet<PsiElement>();
final String targetClassDescription = RefactoringUIUtil.getDescription(myTargetClass, true);
Set<PsiElement> reportedContainers = new HashSet<>();
String targetClassDescription = RefactoringUIUtil.getDescription(myTargetClass, true);
for (UsageInfo usage : usages) {
final PsiElement container = ConflictsUtil.getContainer(usage.getElement());
PsiElement container = ConflictsUtil.getContainer(usage.getElement());
if (!reportedContainers.contains(container)) {
reportedContainers.add(container);
if (!helper.isAccessible(myTargetClass, usage.getElement(), null)) {
Expand All @@ -175,9 +176,9 @@ protected boolean preprocessUsages(@Nonnull SimpleReference<UsageInfo[]> refUsag

if (myIsInner) {
for (UsageInfo usage : usages) {
final PsiField field = PsiTreeUtil.getParentOfType(usage.getElement(), PsiField.class);
PsiField field = PsiTreeUtil.getParentOfType(usage.getElement(), PsiField.class);
if (field != null) {
final PsiClass containingClass = field.getContainingClass();
PsiClass containingClass = field.getContainingClass();

if (PsiTreeUtil.isAncestor(containingClass, myTargetClass, true)) {
LocalizeValue message = RefactoringLocalize.constructorBeingRefactoredIsUsedInInitializerOf0(
Expand All @@ -203,8 +204,9 @@ private PsiClass getConstructorContainingClass() {
}
}

protected void performRefactoring(UsageInfo[] usages) {

@Override
@RequiredWriteAction
protected void performRefactoring(@Nonnull UsageInfo[] usages) {
try {
PsiReferenceExpression classReferenceExpression =
myFactory.createReferenceExpression(myTargetClass);
Expand Down Expand Up @@ -263,16 +265,17 @@ protected void performRefactoring(UsageInfo[] usages) {
}
}

@RequiredReadAction
private PsiMethod createFactoryMethod() throws IncorrectOperationException {
final PsiClass containingClass = getConstructorContainingClass();
PsiClass containingClass = getConstructorContainingClass();
PsiClassType type = myFactory.createType(containingClass, PsiSubstitutor.EMPTY);
final PsiMethod factoryMethod = myFactory.createMethod(myFactoryName, type);
PsiMethod factoryMethod = myFactory.createMethod(myFactoryName, type);
if (myConstructor != null) {
factoryMethod.getParameterList().replace(myConstructor.getParameterList());
factoryMethod.getThrowsList().replace(myConstructor.getThrowsList());
}

Collection<String> names = new HashSet<String>();
Collection<String> names = new HashSet<>();
for (PsiTypeParameter typeParameter : PsiUtil.typeParametersIterable(myConstructor != null ? myConstructor : containingClass)) {
if (!names.contains(typeParameter.getName())) { //Otherwise type parameter is hidden in the constructor
names.add(typeParameter.getName());
Expand All @@ -285,7 +288,7 @@ private PsiMethod createFactoryMethod() throws IncorrectOperationException {
PsiNewExpression newExpression = (PsiNewExpression)returnStatement.getReturnValue();
PsiJavaCodeReferenceElement classRef = myFactory.createReferenceElementByType(type);
newExpression.getClassReference().replace(classRef);
final PsiExpressionList argumentList = newExpression.getArgumentList();
PsiExpressionList argumentList = newExpression.getArgumentList();

PsiParameter[] params = factoryMethod.getParameterList().getParameters();

Expand All @@ -306,7 +309,7 @@ private PsiMethod createFactoryMethod() throws IncorrectOperationException {

@PsiModifier.ModifierConstant
private String getDefaultFactoryVisibility() {
final PsiModifierList modifierList;
PsiModifierList modifierList;
if (myConstructor != null) {
modifierList = myConstructor.getModifierList();
}
Expand All @@ -316,7 +319,9 @@ private String getDefaultFactoryVisibility() {
return VisibilityUtil.getVisibilityModifier(modifierList);
}


@Nonnull
@Override
@RequiredReadAction
protected String getCommandName() {
if (myConstructor != null) {
return RefactoringLocalize.replaceConstructor0WithAFactoryMethod(DescriptiveNameUtil.getDescriptiveName(myConstructor)).get();
Expand Down
Loading
Loading