/******************************************************************************* * Copyright (c) 2005, 2012 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jdt.internal.debug.eval.ast.engine; import java.util.ArrayList; import org.eclipse.jdt.core.Signature; import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.util.Util; public class SignatureExt { public static char[][] getTypeSuperClassInterfaces(char[] typeSignature) throws IllegalArgumentException { try { int length = typeSignature.length; if (length == 0) return CharOperation.NO_CHAR_CHAR; int i = 0; if (typeSignature[0] == Signature.C_GENERIC_START) { i++; // leading '<' while (i < length && typeSignature[i] != Signature.C_GENERIC_END) { i = CharOperation.indexOf(Signature.C_COLON, typeSignature, i); if (i < 0 || i >= length) throw new IllegalArgumentException(); // iterate over bounds nextBound: while (typeSignature[i] == ':') { i++; // skip colon if (typeSignature[i] == ':') { continue nextBound; // empty bound } i = Util.scanTypeSignature(typeSignature, i); i++; // position at start of next param if any } } if (i < 0 || i >= length) throw new IllegalArgumentException(); i++; // trailing '>' } ArrayList<char[]> superList = new ArrayList<>(); while (i < length) { int superStart = i; i = Util.scanTypeSignature(typeSignature, i); i++; superList.add(CharOperation.subarray(typeSignature, superStart, i)); } char[][] result; superList.toArray(result = new char[superList.size()][]); return result; } catch (ArrayIndexOutOfBoundsException e) { // invalid signature, fall through } throw new IllegalArgumentException(); } public static String[] getTypeSuperClassInterfaces(String typeSignature) throws IllegalArgumentException { char[][] params = getTypeSuperClassInterfaces(typeSignature .toCharArray()); return CharOperation.toStrings(params); } }