mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
push down: provide context for newly created class to check resulted accessibility (IDEA-155387)
This commit is contained in:
+14
-3
@@ -45,6 +45,7 @@ import com.intellij.util.IncorrectOperationException;
|
||||
import com.intellij.util.containers.HashSet;
|
||||
import com.intellij.util.containers.MultiMap;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
@@ -90,11 +91,21 @@ public class JavaPushDownDelegate extends PushDownDelegate<MemberInfo, PsiMember
|
||||
}
|
||||
|
||||
@Override
|
||||
public void checkTargetClassConflicts(PsiElement targetClass,
|
||||
public void checkTargetClassConflicts(@Nullable PsiElement targetClass,
|
||||
PushDownData<MemberInfo, PsiMember> pushDownData,
|
||||
MultiMap<PsiElement, String> conflicts) {
|
||||
MultiMap<PsiElement, String> conflicts,
|
||||
NewSubClassData subClassData) {
|
||||
List<MemberInfo> toMove = pushDownData.getMembersToMove();
|
||||
new PushDownConflicts((PsiClass)pushDownData.getSourceClass(), toMove.toArray(new MemberInfo[0]), conflicts).checkTargetClassConflicts(targetClass, targetClass);
|
||||
PsiElement context = targetClass;
|
||||
if (context == null) {
|
||||
assert subClassData != null;
|
||||
Object newClassContext = subClassData.getContext();
|
||||
if (newClassContext instanceof PsiElement) {
|
||||
context = (PsiElement)newClassContext;
|
||||
}
|
||||
}
|
||||
new PushDownConflicts((PsiClass)pushDownData.getSourceClass(), toMove.toArray(new MemberInfo[0]), conflicts)
|
||||
.checkTargetClassConflicts(targetClass, context);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+6
-3
@@ -54,7 +54,7 @@ public abstract class PushDownDelegate<MemberInfo extends MemberInfoBase<Member>
|
||||
* Implementations are supposed to override this method when overriding default behaviour for the language,
|
||||
* e.g. pushing members from groovy class to java, groovy could provide additional delegate which inherits delegate for java and accepts groovy sources.
|
||||
* Methods to process target class should be updated to cope with source of another language (e.g. calling super on PushDownData translated to java):
|
||||
* {@link #checkTargetClassConflicts(PsiElement, PushDownData, MultiMap) },
|
||||
* {@link #checkTargetClassConflicts(PsiElement, PushDownData, MultiMap, NewSubClassData) },
|
||||
* {@link #pushDownToClass(PsiElement, PushDownData)}
|
||||
*/
|
||||
protected abstract boolean isApplicableForSource(@NotNull PsiElement sourceClass);
|
||||
@@ -78,10 +78,13 @@ public abstract class PushDownDelegate<MemberInfo extends MemberInfoBase<Member>
|
||||
* Collect conflicts inside targetClass assuming methods would be pushed,
|
||||
* e.g. check if target class already has field with the same name, some references types
|
||||
* won't be accessible anymore, etc
|
||||
*
|
||||
* If <code>targetClass == null</code> (target class should be created), then subClassData would be not null
|
||||
*/
|
||||
protected abstract void checkTargetClassConflicts(PsiElement targetClass,
|
||||
protected abstract void checkTargetClassConflicts(@Nullable PsiElement targetClass,
|
||||
PushDownData<MemberInfo, Member> pushDownData,
|
||||
MultiMap<PsiElement, String> conflicts);
|
||||
MultiMap<PsiElement, String> conflicts,
|
||||
@Nullable NewSubClassData subClassData);
|
||||
|
||||
/**
|
||||
* Could be used e.g. to encode mutual references between moved members
|
||||
|
||||
+2
-2
@@ -109,7 +109,7 @@ public class PushDownProcessor<MemberInfo extends MemberInfoBase<Member>,
|
||||
}
|
||||
Runnable runnable = () -> ApplicationManager.getApplication().runReadAction(() -> {
|
||||
if (mySubClassData != null) {
|
||||
myDelegate.checkTargetClassConflicts(null, myPushDownData, conflicts);
|
||||
myDelegate.checkTargetClassConflicts(null, myPushDownData, conflicts, mySubClassData);
|
||||
}
|
||||
else {
|
||||
for (UsageInfo usage : usagesIn) {
|
||||
@@ -117,7 +117,7 @@ public class PushDownProcessor<MemberInfo extends MemberInfoBase<Member>,
|
||||
if (element != null) {
|
||||
final PushDownDelegate delegate = PushDownDelegate.findDelegateForTarget(myPushDownData.getSourceClass(), element);
|
||||
if (delegate != null) {
|
||||
delegate.checkTargetClassConflicts(element, myPushDownData, conflicts);
|
||||
delegate.checkTargetClassConflicts(element, myPushDownData, conflicts, null);
|
||||
}
|
||||
else {
|
||||
conflicts.putValue(element, "Not supported source/target pair detected");
|
||||
|
||||
Reference in New Issue
Block a user