/*
*
* 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.parts;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.flex.compiler.asdoc.IASDocComment;
import org.apache.flex.compiler.internal.tree.as.ModifiersContainerNode;
import org.apache.flex.compiler.internal.tree.as.metadata.MetaTagsNode;
import org.apache.flex.compiler.tree.as.INamespaceDecorationNode;
import org.apache.flex.utils.CheapArray;
public class DecorationPart implements IDecorationPart
{
private static final Object[] EMPTY_ARRAY = new Object[0];
private byte modId;
private byte metaId;
private byte namespaceId;
private byte commentId;
private Object store;
public DecorationPart()
{
store = CheapArray.create(2);
metaId = -1;
modId = -1;
namespaceId = -1;
commentId = -1;
}
@Override
public void compact()
{
if (store instanceof List)
store = CheapArray.optimize(store, EMPTY_ARRAY);
}
protected byte insert(Object object)
{
if (object == null)
return -1;
byte id = (byte)CheapArray.size(store);
if (!(store instanceof List))
{
ArrayList<Object> list = new ArrayList<Object>(((Object[])store).length);
list.addAll(Arrays.asList((Object[])store));
int size = list.size();
for (int i = 0; i < size; i++)
{
Object entry = list.get(i);
if (entry instanceof INamespaceDecorationNode)
{
namespaceId = (byte)i;
}
else if (entry instanceof MetaTagsNode)
{
metaId = (byte)i;
}
else if (entry instanceof IASDocComment)
{
commentId = (byte)i;
}
else if (entry instanceof ModifiersContainerNode)
{
modId = (byte)i;
}
else
{
insertUnknownObject(entry, i);
}
}
store = list;
}
CheapArray.add(object, store);
return id;
}
protected Object getFromStore(byte index)
{
if (index >= 0)
{
return CheapArray.get(index, store);
}
return null;
}
protected void insertUnknownObject(Object entry, int offset)
{
//do nothing
}
@Override
public void setASDocComment(IASDocComment ref)
{
commentId = insert(ref);
}
@Override
public IASDocComment getASDocComment()
{
if (commentId >= 0)
{
Object object = CheapArray.get(commentId, store);
if (object instanceof IASDocComment)
return (IASDocComment)object;
}
return null;
}
@Override
public void setMetadata(MetaTagsNode meta)
{
metaId = insert(meta);
}
@Override
public MetaTagsNode getMetadata()
{
if (metaId >= 0)
{
Object object = CheapArray.get(metaId, store);
if (object instanceof MetaTagsNode)
return (MetaTagsNode)object;
}
return null;
}
@Override
public void setModifiers(ModifiersContainerNode set)
{
modId = insert(set);
}
@Override
public ModifiersContainerNode getModifiers()
{
if (modId >= 0)
{
Object object = CheapArray.get(modId, store);
if (object instanceof ModifiersContainerNode)
return (ModifiersContainerNode)object;
}
return null;
}
@Override
public void setNamespace(INamespaceDecorationNode ns)
{
namespaceId = insert(ns);
}
@Override
public INamespaceDecorationNode getNamespace()
{
if (namespaceId >= 0)
{
Object object = CheapArray.get(namespaceId, store);
if (object instanceof INamespaceDecorationNode)
return (INamespaceDecorationNode)object;
}
return null;
}
}