blob: 01bd107f936ad7caaddcba262b1ca06e9117fe44 [file] [log] [blame]
/*
*
* 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.abc.semantics;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import org.apache.flex.abc.ABCConstants;
import org.apache.flex.abc.semantics.Name;
/**
* A representation of a method's <a href="http://learn.adobe.com/wiki/display/AVM2/4.5+Method+signature">method signature</a>.
*/
public class MethodInfo
{
// Unknown parameter name.
public static final String UNKNOWN_PARAM_NAME = "";
private int flags = 0;
private String methodName;
private Name returnType;
private Vector<Name> paramTypes = new Vector<Name>();
private Vector<PooledValue> defaultValues = new Vector<PooledValue>();
private List<String> paramNames;
/**
* @return the number of parameters present.
*/
public int getParamCount()
{
return paramTypes.size() + 1;
}
/**
* @param methodName the methodName to set
*/
public void setMethodName(String methodName)
{
this.methodName = methodName;
}
/**
* @return the methodName
*/
public String getMethodName()
{
return methodName;
}
/**
* @param paramTypes the paramTypes to set
*/
public void setParamTypes(Vector<Name> paramTypes)
{
this.paramTypes = paramTypes;
}
/**
* @return the paramTypes
*/
public Vector<Name> getParamTypes()
{
return paramTypes;
}
/**
* @param returnType the returnType to set
*/
public void setReturnType(Name returnType)
{
this.returnType = returnType;
}
/**
* @return the returnType
*/
public Name getReturnType()
{
return returnType;
}
/**
* @param flags the method's flags
*/
public void setFlags(int flags)
{
this.flags = flags;
}
/**
* @return method flags
*/
public int getFlags()
{
return flags;
}
/**
* @return true if the method has optional args
*/
public boolean hasOptional()
{
return (flags & ABCConstants.HAS_OPTIONAL) > 0;
}
/**
* @return true if this method has parameter names.
*/
public boolean hasParamNames()
{
return (flags & ABCConstants.HAS_PARAM_NAMES) > 0;
}
public boolean needsRest()
{
return (flags & ABCConstants.NEED_REST) > 0;
}
/**
* @return true if this is a native method.
*/
public boolean isNative()
{
return (flags & ABCConstants.NATIVE) > 0;
}
@Override
public String toString()
{
if (this.methodName != null)
return this.methodName;
else
return super.toString();
}
/**
* Add a default parameter value.
*
* @post No attempt made to verify consistency of the defaults and the
* corresponding parameters.
*/
public void addDefaultValue(PooledValue value)
{
if (this.defaultValues == null)
this.defaultValues = new Vector<PooledValue>();
this.defaultValues.add(value);
this.flags |= ABCConstants.HAS_OPTIONAL;
}
/**
* @return this method's default values.
* @see #hasOptional()
*/
public Vector<PooledValue> getDefaultValues()
{
assert (this.defaultValues != null) : "No default values";
return this.defaultValues;
}
/**
* @return This method's parameter names, or an empty list if its param
* names are not set.
*/
public final List<String> getParamNames()
{
if (paramNames == null)
paramNames = new ArrayList<String>();
return paramNames;
}
/**
* Set the method's parameter names, and update its flags accordingly.
*
* @param param_names - parameter names. Caller should pass null if
* parameter names are not provided.
* @post method flags' HAS_PARAM_NAMES field set if param_names not null,
* reset otherwise.
*/
public void setParamNames(List<String> param_names)
{
this.paramNames = param_names;
if (this.paramNames != null)
this.flags |= ABCConstants.HAS_PARAM_NAMES;
else
this.flags = this.flags & ~ABCConstants.HAS_PARAM_NAMES;
}
}