push down: provide context for newly created class to check resulted accessibility (IDEA-155387)

This commit is contained in:
Anna.Kozlova
2016-04-29 14:41:28 +02:00
parent ce9556a909
commit e72fe6bd81
3 changed files with 22 additions and 8 deletions
@@ -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
@@ -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
@@ -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");