blob: a949bf4c67e8e64fd3242e4a6914331b67cd95ec [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2012 QNX Software Systems 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:
* QNX Software Systems - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.ui;
/**
* This class is a helper class which takes care of implementing some of the
* function prototype parsing and stripping.
*/
public class FunctionPrototypeSummary implements IFunctionSummary.IFunctionPrototypeSummary {
String fname;
String freturn;
String farguments;
/**
* Create a function prototype summary based on a prototype string.
* @param proto The string describing the prototype which is properly
* formed with following format -- returntype function(arguments)
* The following formats will be converted as follows:
* function(arguments) --> function(arguments) //constructors!
* returntype function --> returntype function()
* function --> void function()
*/
public FunctionPrototypeSummary(String proto) {
int leftbracket = proto.indexOf('(');
int rightbracket = proto.lastIndexOf(')');
//If there are brackets missing, then assume void parameters
if (leftbracket == -1 || rightbracket == -1) {
if (leftbracket != -1) {
proto = proto.substring(leftbracket) + ")"; //$NON-NLS-1$
} else if (rightbracket != -1) {
proto = proto.substring(rightbracket - 1) + "()"; //$NON-NLS-1$
} else {
proto = proto + "()"; //$NON-NLS-1$
}
leftbracket = proto.indexOf('(');
rightbracket = proto.lastIndexOf(')');
}
farguments = proto.substring(leftbracket + 1, rightbracket);
// fix for bug #44359
if (farguments.equals("void")) //$NON-NLS-1$
farguments = ""; //$NON-NLS-1$
int nameend = leftbracket - 1;
while (proto.charAt(nameend) == ' ') {
nameend--;
}
int namestart = nameend;
while (namestart > 0 && proto.charAt(namestart) != ' ') {
namestart--;
}
fname = proto.substring(namestart, nameend + 1).trim();
if (namestart == 0) {
//Constructors are like this, don't stick a type on them.
freturn = ""; //$NON-NLS-1$
} else {
freturn = proto.substring(0, namestart).trim();
}
}
@Override
public String getName() {
return fname;
}
@Override
public String getReturnType() {
return freturn;
}
@Override
public String getArguments() {
return farguments;
}
@Override
public String getPrototypeString(boolean namefirst) {
return getPrototypeString(namefirst, true);
}
public String getPrototypeString(boolean namefirst, boolean appendReturnType) {
StringBuilder buffer = new StringBuilder();
if ((!namefirst) && (appendReturnType)) {
buffer.append(getReturnType());
buffer.append(" "); //$NON-NLS-1$
}
buffer.append(getName());
buffer.append("("); //$NON-NLS-1$
if (getArguments() != null) {
buffer.append(getArguments());
}
buffer.append(")"); //$NON-NLS-1$
if ((namefirst) && (appendReturnType) && getReturnType().length() > 0) {
buffer.append(" "); //$NON-NLS-1$
buffer.append(getReturnType());
}
buffer.append(";"); //$NON-NLS-1$
return buffer.toString();
}
}