blob: b01e79d8f24e7bbb4240c5aab941fafe880fac46 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2020 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.swt.tools.internal;
import java.lang.reflect.Modifier;
import java.util.*;
import org.eclipse.jdt.core.dom.*;
public class ASTMethod extends ASTItem implements JNIMethod {
String name, qualifiedName;
int modifiers;
ASTClass declaringClass;
ASTType[] paramTypes;
ASTType returnType;
ASTParameter[] parameters;
Boolean unique;
String data;
int start;
public ASTMethod(ASTClass declaringClass, MethodDeclaration method) {
this.declaringClass = declaringClass;
name = method.getName().getIdentifier();
modifiers = method.getModifiers();
start = method.getStartPosition();
Javadoc doc = method.getJavadoc();
List<TagElement> tags = null;
if (doc != null) {
tags = doc.tags();
for (TagElement tag : tags) {
if ("@method".equals(tag.getTagName())) {
String data = tag.fragments().get(0).toString();
setMetaData(data);
break;
}
}
}
returnType = new ASTType(declaringClass.resolver, method.getReturnType2(), method.getExtraDimensions());
List<SingleVariableDeclaration> parameters = method.parameters();
paramTypes = new ASTType[parameters.size()];
this.parameters = new ASTParameter[paramTypes.length];
int i = 0;
for (Iterator<SingleVariableDeclaration> iterator = parameters.iterator(); iterator.hasNext(); i++) {
SingleVariableDeclaration param = iterator.next();
paramTypes[i] = new ASTType(declaringClass.resolver, param.getType(), param.getExtraDimensions());
this.parameters[i] = new ASTParameter(this, i, param.getName().getIdentifier());
if (tags != null) {
String name = param.getName().getIdentifier();
for (TagElement tag : tags) {
if ("@param".equals(tag.getTagName())) {
List<?> fragments = tag.fragments();
if (fragments.size() >= 2 && name.equals(fragments.get(0).toString())) {
String data = fragments.get(1).toString();
this.parameters[i].setMetaData(data);
}
}
}
}
}
}
@Override
public JNIClass getDeclaringClass() {
return declaringClass;
}
@Override
public int getModifiers() {
return modifiers;
}
@Override
public String getName() {
return name;
}
@Override
public boolean isNativeUnique() {
if (unique != null) return unique.booleanValue();
boolean result = true;
String name = getName();
for (JNIMethod mth : declaringClass.getDeclaredMethods()) {
if ((mth.getModifiers() & Modifier.NATIVE) != 0 &&
this != mth && !this.equals(mth) &&
name.equals(mth.getName()))
{
result = false;
break;
}
}
unique = Boolean.valueOf(result);
return result;
}
@Override
public JNIType[] getParameterTypes() {
return paramTypes;
}
@Override
public JNIParameter[] getParameters() {
return this.parameters;
}
@Override
public JNIType getReturnType() {
return returnType;
}
@Override
public String getAccessor() {
return (String)getParam("accessor");
}
@Override
public String getExclude() {
return (String)getParam("exclude");
}
@Override
public String getMetaData() {
if (data != null) return data;
String className = getDeclaringClass().getSimpleName();
String key = className + "_" + JNIGenerator.getFunctionName(this);
MetaData metaData = declaringClass.metaData;
String value = metaData.getMetaData(key, null);
if (value == null) {
key = className + "_" + getName();
value = metaData.getMetaData(key, null);
}
/*
* Support for lock.
*/
if (value == null && getName().startsWith("_")) {
key = className + "_" + JNIGenerator.getFunctionName(this).substring(2);
value = metaData.getMetaData(key, null);
if (value == null) {
key = className + "_" + getName().substring(1);
value = metaData.getMetaData(key, null);
}
}
if (value == null) value = "";
return value;
}
@Override
public void setAccessor(String str) {
setParam("accessor", str);
}
@Override
public void setExclude(String str) {
setParam("exclude", str);
}
@Override
public void setMetaData(String value) {
data = value;
}
@Override
public String toString() {
return getName();
}
}