fix DummyHolder copying and stubbed PSI mark/release after copying

fixes LambdaToAnonymousTransformTest
This commit is contained in:
peter
2018-02-07 17:42:25 +01:00
parent 82896b926b
commit 7cf6d47db3
2 changed files with 10 additions and 11 deletions
@@ -1,6 +1,7 @@
// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.psi.util;
import com.intellij.lang.ASTNode;
import com.intellij.lang.Language;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Condition;
@@ -879,13 +880,14 @@ public class PsiTreeUtil {
}
public static void mark(@NotNull PsiElement element, @NotNull Object marker) {
element.putCopyableUserData(MARKER, marker);
element.getNode().putCopyableUserData(MARKER, marker);
}
@Nullable
public static PsiElement releaseMark(@NotNull PsiElement root, @NotNull Object marker) {
if (marker.equals(root.getCopyableUserData(MARKER))) {
root.putCopyableUserData(MARKER, null);
ASTNode node = root.getNode();
if (marker.equals(node.getCopyableUserData(MARKER))) {
node.putCopyableUserData(MARKER, null);
return root;
}
else {
@@ -152,16 +152,13 @@ public class DummyHolder extends PsiFileImpl {
}
@Override
@SuppressWarnings({"CloneDoesntDeclareCloneNotSupportedException"})
@SuppressWarnings({"CloneDoesntDeclareCloneNotSupportedException", "MethodDoesntCallSuperMethod"})
protected PsiFileImpl clone() {
final PsiFileImpl psiClone = cloneImpl(getTreeElement());
final DummyHolderViewProvider dummyHolderViewProvider = new DummyHolderViewProvider(getManager());
myViewProvider = dummyHolderViewProvider;
dummyHolderViewProvider.setDummyHolder((DummyHolder)psiClone);
final FileElement treeClone = (FileElement)calcTreeElement().clone();
psiClone.setTreeElementPointer(treeClone); // should not use setTreeElement here because cloned file still have VirtualFile (SCR17963)
DummyHolder psiClone = (DummyHolder)cloneImpl((FileElement)calcTreeElement().clone());
DummyHolderViewProvider dummyHolderViewProvider = new DummyHolderViewProvider(getManager());
psiClone.myViewProvider = dummyHolderViewProvider;
dummyHolderViewProvider.setDummyHolder(psiClone);
psiClone.myOriginalFile = isPhysical() ? this : myOriginalFile;
treeClone.setPsi(psiClone);
return psiClone;
}