/* * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 org.apache.flex.compiler.mxml; import org.apache.flex.compiler.common.ISourceLocation; import org.apache.flex.compiler.common.PrefixMap; import org.apache.flex.compiler.common.XMLName; /** * Represents an open tag, a close tag, or an empty tag in MXML. */ public interface IMXMLTagData extends IMXMLUnitData { /** * Gets the tag that contains this tag. * <p> * If the document is not balanced before this tag, this method returns * <code>null</code>. * * @return An {@code IMXMLTagData} object. */ IMXMLTagData getParentTag(); /** * Determines whether this tag is empty. * * @return <code>true</code> if it is.</code> */ boolean isEmptyTag(); /** * Determines whether this tag is a close tag. * * @return <code>true</code> if it is.</code> */ boolean isCloseTag(); /** * Determines whether this tag has an actual close tag, and was not closed * as a post-process step of MXML repair. * * @return If we have an explicit close tag. */ boolean hasExplicitCloseTag(); /** * Gets the name of this tag as written, such as <code>"s:width.over"</code> * . * * @return The complete tag name, including a possible prefix and state. */ String getName(); /** * Gets the prefix of this tag. * <p> * If the tag does not have a prefix, this method returns <code>null</code>. * * @return The prefix as a String, or <code>null</code>. */ String getPrefix(); /** * Gets the namespace mappings specified on this tag. * * @return A prefix map. */ PrefixMap getPrefixMap(); /** * Gets the namespace mapping that apply to this tag, taking ancestor tags * into account. * * @return A prefix map. */ PrefixMap getCompositePrefixMap(); /** * Gets the URI of this tag. * <p> * If the tag does not have a prefix, this method returns <code>null</code>. * * @return The URI as a String, or <code>null</code>. */ String getURI(); /** * Gets the short name of this tag, not including the prefix or state. * * @return The short tag name as a <code>String</code> */ String getShortName(); /** * Gets the name of this tag as an {@code XMLName}. * <p> * This takes into account the prefix but not the state. * * @return The tag name as an {@code XMLName}. */ XMLName getXMLName(); /** * Gets the state name for this tag. * * @return The state name as a <code>String</code> */ String getStateName(); /** * Determines whether the specified offset falls inside the attribute list * of this tag. * * @param offset The offset to test. * @return <code>true</code> if the offset falls inside this tag's attribute * list. */ boolean isOffsetInAttributeList(int offset); /** * Gets all of the attributes in this tag. * * @return All of the attributes as a array of {@code IMXMLTagAttributeData} * objects. */ IMXMLTagAttributeData[] getAttributeDatas(); /** * Gets the attribute in this tag that has the specified name. * * @param attributeName The name of the attribute. * @return The attribute, or <code>null</code> if no such attribute exists. */ IMXMLTagAttributeData getTagAttributeData(String attributeName); /** * Gets the attribute value in this tag for the specified attribute name. * <p> * This value does not include the quotes. * * @param attributeName The name of the attribute. * @return The value of the attribute, or <code>null</code> if no such * attribute exists. */ // TODO Rename to getAttributevalue() String getRawAttributeValue(String attributeName); /** * Gets the source location of this tag's child units. * * @return A source location. */ ISourceLocation getLocationOfChildUnits(); /** * Gets the first child unit inside this tag. * <p> * The child unit may be a tag or text. If there is no child unit, this * method returns <code>null</code>. * * @return The first child unit inside this tag. */ IMXMLUnitData getFirstChildUnit(); /** * Gets the first child open tag of this tag. * <p> * "First child" means the first open (or maybe empty) tag found before a * close tag. If this is a close tag, this method starts looking after the * corresponding start tag. * * @return Child tag, or null if none. */ IMXMLTagData getFirstChild(boolean includeEmptyTags); /** * Gets the next sibling open tag of this tag. * <p> * "Sibling" is defined as the first open (or maybe empty) tag after this * tag's close tag. If this is a close tag, this method starts looking after * the corresponding start tag. * * @return Sibling, or null if none. */ IMXMLTagData getNextSibling(boolean includeEmptyTags); /** * Finds the close tag that matches this tag. * <p> * Returns null if this tag is a close or empty tag. * <p> * Returns null if a surrounding tag is unbalanced; this is determined by * backing up to the innermost parent tag with a different tag. * <p> * {@code <a> <b> <b> <-- find matching for this one will return null * </b> </a> * } */ IMXMLTagData findMatchingEndTag(); /** * Gets this compilable text inside this tag. The compilable text may appear * as multiple child text units, and there may also be comments (which are * ignored). If any child units are tags rather than text, they are simply * ignored. * * @return The compilable text inside this tag. */ String getCompilableText(); /** * Determines whether this tag does not actually exist within the MXML * document that is its source. * * @return <code>true</code> if this tag is implicit. */ boolean isImplicit(); }