/*
* Copyright (C) 2011 Red Hat, Inc. and/or its affiliates.
*
* 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 org.jboss.errai.codegen.meta;
/**
* @author Mike Brock <cbrock@redhat.com>
*/
public abstract class MetaParameter extends AbstractHasAnnotations {
public abstract String getName();
public abstract MetaClass getType();
public abstract MetaClassMember getDeclaringMember();
private String _hashString;
private Integer index = null;
public String hashString() {
if (_hashString != null) return _hashString;
return _hashString = MetaParameter.class.getName() + ":" + getName() + ":"
+ getType().getFullyQualifiedName();
}
@Override
public int hashCode() {
return hashString().hashCode() * 31;
}
@Override
public boolean equals(Object o) {
return o instanceof MetaParameter && ((MetaParameter) o).hashString().equals(hashString());
}
public Integer getIndex() {
if (index == null) {
final MetaClassMember member = getDeclaringMember();
final MetaParameter[] params;
if (member instanceof MetaMethod) {
params = ((MetaMethod) member).getParameters();
} else if (member instanceof MetaConstructor) {
params = ((MetaConstructor) member).getParameters();
} else {
throw new RuntimeException("Not yet implemented!");
}
for (int i = 0; i < params.length; i++) {
if (params[i] == this || params[i].getName().equals(getName())) {
index = i;
return index;
}
}
throw new RuntimeException("Could not find index of parameter " + getName() + " in "
+ getDeclaringMember().getName() + " in " + getDeclaringMember().getDeclaringClassName());
}
return index;
}
}