/*
*
* 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.internal.tree.as.metadata;
import java.util.Collection;
import java.util.EnumSet;
import org.apache.flex.compiler.asdoc.IASDocComment;
import org.apache.flex.compiler.common.ASModifier;
import org.apache.flex.compiler.common.IMetaInfo;
import org.apache.flex.compiler.constants.IMetaAttributeConstants;
import org.apache.flex.compiler.internal.scopes.ASScope;
import org.apache.flex.compiler.internal.semantics.PostProcessStep;
import org.apache.flex.compiler.internal.tree.as.BaseDefinitionNode;
import org.apache.flex.compiler.internal.tree.as.IdentifierNode;
import org.apache.flex.compiler.problems.ICompilerProblem;
import org.apache.flex.compiler.tree.as.IASNode;
import org.apache.flex.compiler.tree.as.IDefinitionNode;
import org.apache.flex.compiler.tree.as.IDocumentableDefinitionNode;
import org.apache.flex.compiler.tree.as.IExpressionNode;
import org.apache.flex.compiler.tree.as.INamespaceNode;
import org.apache.flex.compiler.tree.metadata.IMetaTagsNode;
/**
* For metatags that decorate a definition, such as Events, Effects and Styles,
* we treat them internally as IDefinitions. This is the common baseclass for
* all of them
*/
public abstract class BaseDefinitionMetaTagNode extends MetaTagNode implements IDefinitionNode, IDocumentableDefinitionNode
{
/**
* The name of the node
*/
protected IdentifierNode nameNode;
/**
* Node that represents the comment range
*/
private IASDocComment asDocComment;
public BaseDefinitionMetaTagNode(MetaTagNode other)
{
super(other);
}
public BaseDefinitionMetaTagNode(String name)
{
super(name);
}
public void setName(IdentifierNode name)
{
if (name != null)
{
nameNode = name;
nameNode.setParent(this);
}
addToMap(IMetaAttributeConstants.NAME_EVENT_NAME, getName());
}
@Override
public String getName()
{
if (nameNode != null)
return nameNode.getName();
return "";
}
@Override
public IExpressionNode getNameExpressionNode()
{
return nameNode;
}
public IdentifierNode getNameNode()
{
return nameNode;
}
@Override
public int getNameEnd()
{
if (nameNode != null)
return nameNode.getEnd();
return -1;
}
@Override
public int getNameStart()
{
if (nameNode != null)
return nameNode.getStart();
return -1;
}
@Override
public int getNameAbsoluteStart()
{
if (nameNode != null)
return nameNode.getAbsoluteStart();
return -1;
}
@Override
public int getNameAbsoluteEnd()
{
if (nameNode != null)
return nameNode.getAbsoluteEnd();
return -1;
}
@Override
protected void analyze(EnumSet<PostProcessStep> set, ASScope scope, Collection<ICompilerProblem> problems)
{
}
@Override
public String getShortName()
{
return getName();
}
@Override
public String getQualifiedName()
{
String parentQualifiedName = getParentQualifiedName();
if (parentQualifiedName != null && parentQualifiedName.length() > 0)
return parentQualifiedName + "." + getShortName();
if (getPackageName() != null && getPackageName().length() > 0)
return getPackageName() + "." + getShortName();
return getShortName();
}
/**
* Returns true if our definition matches the passed in definition
*
* @param node the {@link BaseDefinitionNode} to compare against
* @return true if we are a match
*/
public boolean matches(BaseDefinitionMetaTagNode node)
{
if (node == null)
return false;
if (node.getClass() != getClass())
return false;
if (node == this)
return true;
if (node.getQualifiedName().compareTo(getQualifiedName()) != 0)
return false;
String packageName = node.getPackageName();
String packageName2 = getPackageName();
if (packageName == null && packageName2 != null)
return false;
if (packageName != null && packageName2 != null && packageName.compareTo(packageName2) != 0)
return false;
if (node.getContainingFilePath().compareTo(getContainingFilePath()) != 0)
return false;
return true;
}
public String getParentQualifiedName()
{
IASNode parent = getParent();
if (parent instanceof MetaTagsNode)
{
IASNode decNode = ((MetaTagsNode)parent).getDecoratedDefinition();
if (decNode != null)
return ((IDefinitionNode)decNode).getQualifiedName();
}
return null;
}
@Override
public boolean hasModifier(ASModifier modifier)
{
return false;
}
@Override
public boolean hasNamespace(String namespace)
{
return false;
}
@Override
public boolean isImplicit()
{
return false;
}
@Override
public IMetaTagsNode getMetaTags()
{
return null;
}
@Override
public IMetaInfo[] getMetaInfos()
{
return new IMetaInfo[0];
}
@Override
public String getNamespace()
{
return null;
}
public INamespaceNode resolveNamespace()
{
return null;
}
public void setASDocComment(IASDocComment ref)
{
asDocComment = ref;
}
/**
* Determines if this node has an explicit comment
*/
@Override
public boolean hasExplicitComment()
{
return asDocComment != null;
}
/**
* Returns the raw {@link IASDocComment} without any processing
*
* @return an {@link IASDocComment} or null
*/
public IASDocComment getASDocComment()
{
return asDocComment;
}
}