use of com.intellij.psi.impl.source.tree.FileElement in project intellij-community by JetBrains.
the class CDATAOnAnyEncodedPolicy method createCDATAElement.
@SuppressWarnings({ "HardCodedStringLiteral" })
public static FileElement createCDATAElement(final PsiManager manager, final CharTable charTableByTree, final String displayText) {
final FileElement dummyParent = DummyHolderFactory.createHolder(manager, null, charTableByTree).getTreeElement();
final CompositeElement cdata = ASTFactory.composite(XmlElementType.XML_CDATA);
dummyParent.rawAddChildren(cdata);
cdata.rawAddChildren(ASTFactory.leaf(XmlTokenType.XML_CDATA_START, "<![CDATA["));
cdata.rawAddChildren(ASTFactory.leaf(XmlTokenType.XML_DATA_CHARACTERS, dummyParent.getCharTable().intern(displayText)));
cdata.rawAddChildren(ASTFactory.leaf(XmlTokenType.XML_CDATA_END, "]]>"));
dummyParent.acceptTree(new GeneratedMarkerVisitor());
return dummyParent;
}
use of com.intellij.psi.impl.source.tree.FileElement in project intellij-community by JetBrains.
the class EncodeEachSymbolPolicy method encodeXmlTextContents.
@Override
public ASTNode encodeXmlTextContents(String displayText, PsiElement text) {
if (!toCode(displayText))
return super.encodeXmlTextContents(displayText, text);
final FileElement dummyParent = DummyHolderFactory.createHolder(text.getManager(), null, SharedImplUtil.findCharTableByTree(text.getNode())).getTreeElement();
int sectionStartOffset = 0;
int offset = 0;
while (offset < displayText.length()) {
if (toCode(displayText.charAt(offset))) {
final String plainSection = displayText.substring(sectionStartOffset, offset);
if (!plainSection.isEmpty()) {
dummyParent.rawAddChildren((TreeElement) super.encodeXmlTextContents(plainSection, text));
}
dummyParent.rawAddChildren(createCharEntity(displayText.charAt(offset), dummyParent.getCharTable()));
sectionStartOffset = offset + 1;
}
offset++;
}
final String plainSection = displayText.substring(sectionStartOffset, offset);
if (!plainSection.isEmpty()) {
dummyParent.rawAddChildren((TreeElement) super.encodeXmlTextContents(plainSection, text));
}
dummyParent.acceptTree(new GeneratedMarkerVisitor());
return dummyParent.getFirstChildNode();
}
use of com.intellij.psi.impl.source.tree.FileElement in project intellij-community by JetBrains.
the class PyExpressionCodeFragmentImpl method clone.
protected PyExpressionCodeFragmentImpl clone() {
final PyExpressionCodeFragmentImpl clone = (PyExpressionCodeFragmentImpl) cloneImpl((FileElement) calcTreeElement().clone());
clone.myPhysical = false;
clone.myOriginalFile = this;
FileManager fileManager = ((PsiManagerEx) getManager()).getFileManager();
SingleRootFileViewProvider cloneViewProvider = (SingleRootFileViewProvider) fileManager.createFileViewProvider(new LightVirtualFile(getName(), getLanguage(), getText()), false);
cloneViewProvider.forceCachedPsi(clone);
clone.myViewProvider = cloneViewProvider;
return clone;
}
use of com.intellij.psi.impl.source.tree.FileElement in project intellij-community by JetBrains.
the class XmlAspectImpl method update.
@Override
public void update(PomModelEvent event) {
if (!event.getChangedAspects().contains(myTreeAspect))
return;
final TreeChangeEvent changeSet = (TreeChangeEvent) event.getChangeSet(myTreeAspect);
if (changeSet == null)
return;
final ASTNode rootElement = changeSet.getRootElement();
final PsiFile file = (PsiFile) rootElement.getPsi();
if (!(file instanceof XmlFile))
return;
final XmlAspectChangeSetImpl xmlChangeSet = event.registerChangeSetIfAbsent(this, new XmlAspectChangeSetImpl(myModel));
xmlChangeSet.addChangedFile((XmlFile) file);
final ASTNode[] changedElements = changeSet.getChangedElements();
final CharTable table = ((FileElement) changeSet.getRootElement()).getCharTable();
for (ASTNode changedElement : changedElements) {
TreeChange changesByElement = changeSet.getChangesByElement(changedElement);
PsiElement psiElement = null;
while (changedElement != null && (psiElement = changedElement.getPsi()) == null) {
final ASTNode parent = changedElement.getTreeParent();
final ChangeInfoImpl changeInfo = ChangeInfoImpl.create(ChangeInfo.CONTENTS_CHANGED, changedElement);
changeInfo.compactChange(changesByElement);
changesByElement = new TreeChangeImpl(parent);
changesByElement.addChange(changedElement, changeInfo);
changedElement = parent;
}
if (changedElement == null)
continue;
final TreeChange finalChangedElement = changesByElement;
psiElement.accept(new XmlElementVisitor() {
TreeChange myChange = finalChangedElement;
@Override
public void visitElement(PsiElement element) {
final ASTNode child = element.getNode();
final ASTNode treeParent = child.getTreeParent();
if (treeParent == null)
return;
final PsiElement parent = treeParent.getPsi();
final ChangeInfoImpl changeInfo = ChangeInfoImpl.create(ChangeInfo.CONTENTS_CHANGED, child);
changeInfo.compactChange(myChange);
myChange = new TreeChangeImpl(treeParent);
myChange.addChange(child, changeInfo);
parent.accept(this);
}
@Override
public void visitXmlAttribute(XmlAttribute attribute) {
final ASTNode[] affectedChildren = myChange.getAffectedChildren();
String oldName = null;
String oldValue = null;
for (final ASTNode treeElement : affectedChildren) {
final ChangeInfo changeByChild = myChange.getChangeByChild(treeElement);
final int changeType = changeByChild.getChangeType();
if (treeElement.getElementType() == XmlTokenType.XML_NAME) {
if (changeType == ChangeInfo.REMOVED) {
oldName = treeElement.getText();
} else if (changeType == ChangeInfo.REPLACE) {
oldName = ((ReplaceChangeInfo) changeByChild).getReplaced().getText();
}
}
if (treeElement.getElementType() == XmlElementType.XML_ATTRIBUTE_VALUE) {
if (changeType == ChangeInfo.REMOVED) {
oldValue = treeElement.getText();
} else if (changeType == ChangeInfo.REPLACE) {
oldValue = ((ReplaceChangeInfo) changeByChild).getReplaced().getText();
}
}
}
if (oldName != null && !oldName.equals(attribute.getName())) {
xmlChangeSet.add(new XmlAttributeSetImpl(attribute.getParent(), oldName, null));
xmlChangeSet.add(new XmlAttributeSetImpl(attribute.getParent(), attribute.getName(), attribute.getValue()));
} else if (oldValue != null) {
xmlChangeSet.add(new XmlAttributeSetImpl(attribute.getParent(), attribute.getName(), attribute.getValue()));
} else {
xmlChangeSet.add(new XmlElementChangedImpl(attribute));
}
}
@Override
public void visitXmlTag(XmlTag tag) {
ASTNode[] affectedChildren = shortenChange(myChange.getAffectedChildren(), changeSet);
for (final ASTNode treeElement : affectedChildren) {
if (!(treeElement.getPsi() instanceof XmlTagChild)) {
visitElement(tag);
return;
}
}
for (final ASTNode treeElement : affectedChildren) {
final ChangeInfo changeByChild = myChange.getChangeByChild(treeElement);
final int changeType = changeByChild.getChangeType();
final IElementType type = treeElement.getElementType();
if (type == TokenType.WHITE_SPACE)
continue;
/*
if (type == ElementType.XML_NAME) {
final XmlToken xmlToken = (XmlToken)((ReplaceChangeInfo)changeByChild).getReplaced();
xmlChangeSet.add(new XmlTagNameChangedImpl(tag, xmlToken.getText()));
continue;
}
*/
final PsiElement element = treeElement.getPsi();
switch(changeType) {
case ChangeInfo.ADD:
xmlChangeSet.add(new XmlTagChildAddImpl(tag, (XmlTagChild) element));
break;
case ChangeInfo.REMOVED:
treeElement.putUserData(CharTable.CHAR_TABLE_KEY, table);
xmlChangeSet.add(new XmlTagChildRemovedImpl(tag, (XmlTagChild) element));
break;
case ChangeInfo.CONTENTS_CHANGED:
xmlChangeSet.add(new XmlTagChildChangedImpl(tag, (XmlTagChild) element));
break;
case ChangeInfo.REPLACE:
final PsiElement psi = ((ReplaceChangeInfo) changeByChild).getReplaced().getPsi();
if (psi instanceof XmlTagChild) {
final XmlTagChild replaced = (XmlTagChild) psi;
replaced.putUserData(CharTable.CHAR_TABLE_KEY, table);
xmlChangeSet.add(new XmlTagChildRemovedImpl(tag, replaced));
xmlChangeSet.add(new XmlTagChildAddImpl(tag, (XmlTagChild) element));
}
break;
}
}
}
@Override
public void visitXmlDocument(XmlDocument document) {
xmlChangeSet.clear();
xmlChangeSet.add(new XmlDocumentChangedImpl(document));
}
@Override
public void visitFile(PsiFile file) {
final XmlDocument document = ((XmlFile) file).getDocument();
if (document != null) {
xmlChangeSet.clear();
xmlChangeSet.add(new XmlDocumentChangedImpl(document));
}
}
});
}
}
use of com.intellij.psi.impl.source.tree.FileElement in project intellij-community by JetBrains.
the class DtdParsing method parse.
public ASTNode parse() {
final PsiBuilder.Marker root = myBuilder.mark();
if (myRootType == XML_MARKUP_DECL) {
parseTopLevelMarkupDecl();
root.done(myRootType);
return myBuilder.getTreeBuilt();
}
PsiBuilder.Marker document = null;
if (myRootType == DTD_FILE) {
document = myBuilder.mark();
parseProlog();
}
switch(myContextType) {
case GENERIC_XML:
parseGenericXml();
break;
case ELEMENT_CONTENT_SPEC:
doParseContentSpec(true);
break;
case ATTLIST_SPEC:
parseAttlistContent();
break;
case ATTR_VALUE:
parseAttrValue();
case ATTRIBUTE_SPEC:
parseAttributeContentSpec();
break;
case ENTITY_DECL_CONTENT:
parseEntityDeclContent();
break;
case ENUMERATED_TYPE:
parseEnumeratedTypeContent();
break;
}
while (!myBuilder.eof()) myBuilder.advanceLexer();
if (document != null)
document.done(XML_DOCUMENT);
root.done(myRootType);
ASTNode astNode = myBuilder.getTreeBuilt();
if (myRootType != DTD_FILE) {
PsiFile file = myBuilder.getUserDataUnprotected(FileContextUtil.CONTAINING_FILE_KEY);
if (file != null) {
final DummyHolder result = DummyHolderFactory.createHolder(file.getManager(), DTDLanguage.INSTANCE, file);
final FileElement holder = result.getTreeElement();
holder.rawAddChildren((TreeElement) astNode);
}
}
return astNode;
}
Aggregations