blob: 4e86444facb6a22fe58666c3d49512edc8c8fe70 [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.util.xml;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.util.UserDataHolder;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.xml.XmlElement;
import com.intellij.psi.xml.XmlTag;
import com.intellij.util.xml.reflect.AbstractDomChildrenDescription;
import com.intellij.util.xml.reflect.DomGenericInfo;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.lang.reflect.Type;
/**
* Base interface for DOM elements. Every DOM interface should extend this one.
*
* @author peter
*/
public interface DomElement extends AnnotatedElement, UserDataHolder {
DomElement[] EMPTY_ARRAY = new DomElement[0];
XmlTag getXmlTag();
/**
* Returns the underlying XML element/file.
*
* @return {@link com.intellij.psi.xml.XmlFile}, {@link com.intellij.psi.xml.XmlTag} or {@link com.intellij.psi.xml.XmlAttribute}
*/
@Nullable
XmlElement getXmlElement();
DomElement getParent();
XmlTag ensureTagExists();
XmlElement ensureXmlElementExists();
/**
* Removes all corresponding XML content. In case of being collection member, invalidates the element.
*/
void undefine();
boolean isValid();
/**
* @return true if corresponding XML element exists
*/
boolean exists();
@NotNull
DomGenericInfo getGenericInfo();
@NotNull @NonNls String getXmlElementName();
@NotNull @NonNls String getXmlElementNamespace();
/**
* @return namespace key if this element or one of its ancestors is annotated with
* {@link Namespace}, or null otherwise, which means that namespace should be equal
* to that of the element's parent
*/
@Nullable @NonNls String getXmlElementNamespaceKey();
void accept(final DomElementVisitor visitor);
void acceptChildren(DomElementVisitor visitor);
@NotNull
DomManager getManager();
@NotNull
Type getDomElementType();
AbstractDomChildrenDescription getChildDescription();
@NotNull
DomNameStrategy getNameStrategy();
@NotNull
ElementPresentation getPresentation();
GlobalSearchScope getResolveScope();
/**
* Walk up the DOM tree searching for element of requiredClass type
* @param requiredClass parent element's type
* @param strict
* <ul>
* <li>strict = false: if the current element is already of the correct type, then it is returned.</li>
* <li>strict = true: the returned element must be higher in the hierarchy.</li>
* </ul>
* @return the parent of requiredClass type
*/
@Nullable
<T extends DomElement> T getParentOfType(Class<T> requiredClass, boolean strict);
@Nullable
Module getModule();
void copyFrom(DomElement other);
<T extends DomElement> T createMockCopy(final boolean physical);
/**
* @return stable element (see {@link DomManager#createStableValue(com.intellij.openapi.util.Factory)}}),
* that holds the complete 'XPath' to this element in XML. If this element is in collection, and something
* is inserted before it, the stable copy behaviour may be unexpected. So use this method only when you
* are sure that nothing serious will happen during the lifetime of the stable copy. The most usual use
* case is when one creates something inside {@link com.intellij.openapi.command.WriteCommandAction} and
* wants to use it outside the action. Due to formatting done on the command finish the element may become
* invalidated, but the stable copy will survive, because nothing in fact has changed in its 'XPath'.
*/
<T extends DomElement> T createStableCopy();
}