blob: 313bfccf204fe67f2b59f72b1915d8c2ff6733fc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2012 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.jdi.internal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Utility class to perform operations on generic signatures
*/
public class GenericSignature {
private static final char C_CLASS_TYPE = 'L';
private static final char C_TYPE_VARIABLE = 'T';
private static final char C_ARRAY = '[';
private static final char C_WILDCARD_PLUS = '+';
private static final char C_WILDCARD_MINUS = '-';
private static final char C_TYPE_END = ';';
private static final char C_PARAMETERS_START = '(';
private static final char C_PARAMETERS_END = ')';
private static final char C_TYPE_ARGUMENTS_START = '<';
private static final char C_TYPE_ARGUMENTS_END = '>';
public static List<String> getParameterTypes(String methodSignature) {
int parameterStart = methodSignature.indexOf(C_PARAMETERS_START);
int parametersEnd = methodSignature.lastIndexOf(C_PARAMETERS_END);
if (parameterStart == -1 || parametersEnd == -1) {
// used to throw illegal argument exception, but now return empty
// list if we can't parse it
return Collections.EMPTY_LIST;
}
return getTypeSignatureList(methodSignature.substring(parameterStart + 1, parametersEnd));
}
private static List<String> getTypeSignatureList(String typeSignatureList) {
List<String> list = new ArrayList<>();
int pos = 0;
while (pos < typeSignatureList.length()) {
int signatureLength = nextTypeSignatureLength(typeSignatureList, pos);
list.add(typeSignatureList.substring(pos, pos += signatureLength));
}
return list;
}
private static int nextTypeSignatureLength(String signature, int startPos) {
int inclusionLevel = 0;
for (int i = startPos, length = signature.length(); i < length; i++) {
if (inclusionLevel == 0) {
switch (signature.charAt(i)) {
case C_CLASS_TYPE:
case C_TYPE_VARIABLE:
case C_WILDCARD_PLUS:
case C_WILDCARD_MINUS:
inclusionLevel = 1;
break;
case C_ARRAY:
break;
default:
return i - startPos + 1;
}
} else {
switch (signature.charAt(i)) {
case C_TYPE_END:
if (inclusionLevel == 1) {
return i - startPos + 1;
}
break;
case C_TYPE_ARGUMENTS_START:
inclusionLevel++;
break;
case C_TYPE_ARGUMENTS_END:
inclusionLevel--;
break;
}
}
}
throw new IllegalArgumentException();
}
}