TreeElement (TreeElement element, Map<Object, Object> decodingState) { boolean shallDecodeEscapedTexts = shallEncodeEscapedTexts(element, decodingState); if (element instanceof CompositeElement) { IElementType elementType = element.getElementType(); if (elementType == JavaElementType.JAVA_CODE_REFERENCE || elementType == JavaElementType.REFERENCE_EXPRESSION || elementType == JavaElementType.METHOD_REF_EXPRESSION) { PsiJavaCodeReferenceElement ref = SourceTreeToPsiMap.treeToPsiNotNull(element); PsiClass refClass = element.getCopyableUserData(JavaTreeGenerator.REFERENCED_CLASS_KEY); if (refClass != null) { element.putCopyableUserData(JavaTreeGenerator.REFERENCED_CLASS_KEY, null); PsiManager manager = refClass.getManager(); JavaCodeStyleManager codeStyleManager = JavaCodeStyleManager.getInstance(refClass.getProject()); PsiElement refElement = ref.resolve(); try { if (refClass != refElement && !manager.areElementsEquivalent(refClass, refElement)) { if (((CompositeElement)element).findChildByRole(ChildRole.QUALIFIER) == null) { // can restore only if short (otherwise qualifier should be already restored) ref = (PsiJavaCodeReferenceElement)ref.bindToElement(refClass); } } else { // shorten references to the same package and to inner classes that can be accessed by short name ref = (PsiJavaCodeReferenceElement)codeStyleManager.shortenClassReferences(ref, JavaCodeStyleManager.DO_NOT_ADD_IMPORTS); } return (TreeElement)SourceTreeToPsiMap.psiElementToTree(ref); } catch (IncorrectOperationException e) { ((PsiImportHolder)ref.getContainingFile()).importClass(refClass); } } else { PsiMember refMember = element.getCopyableUserData(JavaTreeGenerator.REFERENCED_MEMBER_KEY); if (refMember != null) { LOG.assertTrue(ref instanceof PsiReferenceExpression); element.putCopyableUserData(JavaTreeGenerator.REFERENCED_MEMBER_KEY, null); PsiElement refElement = ref.resolve(); if (refMember != refElement && !refMember.getManager().areElementsEquivalent(refMember, refElement)) { PsiClass containingClass = refMember.getContainingClass(); if (containingClass != null) { try { ref = (PsiJavaCodeReferenceElement)((PsiReferenceExpression)ref).bindToElementViaStaticImport(containingClass); } catch (IncorrectOperationException e) { // TODO[yole] ignore? } } return SourceTreeToPsiMap.psiToTreeNotNull(ref); } } } } else if (element.getElementType() == JavaElementType.MODIFIER_LIST) { if (element.getUserData(INTERFACE_MODIFIERS_FLAG_KEY) != null) { element.putUserData(INTERFACE_MODIFIERS_FLAG_KEY, null); try { PsiModifierList modifierList = SourceTreeToPsiMap.treeToPsiNotNull(element); if (element.getTreeParent().getElementType() == JavaElementType.FIELD) { modifierList.setModifierProperty(PsiModifier.PUBLIC, true); modifierList.setModifierProperty(PsiModifier.STATIC, true); modifierList.setModifierProperty(PsiModifier.FINAL, true); } else if (element.getTreeParent().getElementType() == JavaElementType.METHOD && !PsiUtil.isLanguageLevel8OrHigher(modifierList) || element.getTreeParent().getElementType() == JavaElementType.ANNOTATION_METHOD) { modifierList.setModifierProperty(PsiModifier.PUBLIC, true); modifierList.setModifierProperty(PsiModifier.ABSTRACT, true); } } catch (IncorrectOperationException e) { LOG.error(e); } } } } else if (shallDecodeEscapedTexts && element instanceof LeafElement && !(element instanceof OuterLanguageElement)) { if (!isInCData(element)) { String original = element.getText(); String escaped = StringUtil.escapeXmlEntities(original); if (!Objects.equals(original, escaped) && element.getCopyableUserData(ALREADY_ESCAPED) == null) { LeafElement copy = ((LeafElement)element).replaceWithText(escaped); copy.putCopyableUserData(ALREADY_ESCAPED, Boolean.TRUE); return copy; } } } return null; }