/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.plugin.ij.lang;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.util.Key;
import com.intellij.psi.PsiMember;
import com.intellij.psi.impl.source.tree.CompositeElement;
import com.intellij.psi.impl.source.tree.TreeCopyHandler;
import com.intellij.psi.impl.source.tree.TreeElement;
import gw.plugin.ij.lang.parser.GosuElementTypes;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Map;
public class GosuChangeUtilSupport implements TreeCopyHandler {
private static final Key<PsiMember> REFERENCED_MEMBER_KEY = Key.create("REFERENCED_MEMBER_KEY");
public void encodeInformation(final TreeElement element, final ASTNode original, final Map<Object, Object> encodingState) {
// if (original instanceof CompositeElement) {
// if (original.getElementType() == GosuElementTypes.ELEM_TYPE_IdentifierExpression ||
// original.getElementType() == GosuElementTypes.ELEM_TYPE_TypeLiteral
// ) {
// final IGosuResolveResult result = ((GosuReferenceExpressionImpl)original.getPsi()).advancedResolve();
// if (result != null) {
// final PsiElement target = result.getElement();
//
// if (target instanceof PsiClass ||
// (target instanceof PsiMethod || target instanceof PsiField) &&
// ((PsiMember) target).hasModifierProperty(PsiModifier.STATIC) &&
// result.getCurrentFileResolveContext() instanceof GrImportStatement) {
// element.putCopyableUserData(REFERENCED_MEMBER_KEY, (PsiMember) target);
// }
// }
// }
// }
}
@Nullable
public TreeElement decodeInformation(@NotNull TreeElement element, final Map<Object, Object> decodingState) {
if (element instanceof CompositeElement) {
if (element.getElementType() == GosuElementTypes.ELEM_TYPE_IdentifierExpression ||
element.getElementType() == GosuElementTypes.ELEM_TYPE_TypeLiteral) {
// GosuReferenceExpressionImpl ref = (GosuReferenceExpressionImpl) SourceTreeToPsiMap.treeElementToPsi(element);
// final PsiMember refMember = element.getCopyableUserData(REFERENCED_MEMBER_KEY);
// if (refMember != null) {
// element.putCopyableUserData(REFERENCED_MEMBER_KEY, null);
// PsiElement refElement1 = ref.resolve();
// if (!refMember.getManager().areElementsEquivalent(refMember, refElement1)) {
// try {
// if (!(refMember instanceof PsiClass) || ref.getQualifier() == null) {
// // can restore only if short (otherwise qualifier should be already restored)
// ref = (GosuReferenceExpressionImpl) ref.bindToElement(refMember);
// }
// } catch (IncorrectOperationException ignored) {
// }
// return (TreeElement) SourceTreeToPsiMap.psiElementToTree(ref);
// } else {
// // shorten references to the same package and to inner classes that can be accessed by short name
// new ReferenceAdjuster(true, false).collect(element, false, false);
// }
// }
return element;
}
}
return null;
}
}