/******************************************************************************* * Copyright (c) 2006 IBM Corporation. * 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 com.ibm.wala.types.generics; import com.ibm.wala.classLoader.IMethod; import com.ibm.wala.classLoader.ShrikeCTMethod; import com.ibm.wala.shrikeCT.InvalidClassFileException; /** * UNDER CONSTRUCTION. * * MethodTypeSignature: FormalTypeParameters? (TypeSignature*) ReturnType ThrowsSignature* * * ReturnType: TypeSignature * * @author sjfink * */ public class MethodTypeSignature extends Signature { private MethodTypeSignature(String s) { super(s); } public static MethodTypeSignature make(String genericsSignature) throws IllegalArgumentException { if (genericsSignature == null) { throw new IllegalArgumentException("genericsSignature is null"); } if (genericsSignature.length() == 0) { throw new IllegalArgumentException(); } return new MethodTypeSignature(genericsSignature); } /** * @return null if no arguments */ public TypeSignature[] getArguments() { String typeSig = rawString().replaceAll(".*\\(", "\\(").replaceAll("\\).*", "\\)"); String[] args = TypeSignature.parseForTypeSignatures(typeSig); if (args == null) { return null; } TypeSignature[] result = new TypeSignature[args.length]; for (int i = 0; i < args.length; i++) { result[i] = TypeSignature.make(args[i]); } return result; } public TypeSignature getReturnType() { String rtString = rawString().substring(rawString().indexOf(')') + 1); return TypeSignature.make(rtString); } public FormalTypeParameter[] getFormalTypeParameters() { if (rawString().charAt(0) != '<') { // no formal type parameters return null; } int index = endOfFormalTypeParameters(); String[] args = FormalTypeParameter.parseForFormalTypeParameters(rawString().substring(0, index)); FormalTypeParameter[] result = new FormalTypeParameter[args.length]; for (int i = 0; i < args.length; i++) { result[i] = FormalTypeParameter.make(args[i]); } return result; } private int endOfFormalTypeParameters() { if (rawString().charAt(0) != '<') { return 0; } int i = 1; int depth = 1; while (depth > 0) { if (rawString().charAt(i) == '>') { depth--; } if (rawString().charAt(i) == '<') { depth++; } i++; } return i; } /** * @return {@link TypeSignature} for arguments, which includes information about generic types * @throws InvalidClassFileException */ public static TypeSignature[] getArguments(IMethod method) throws InvalidClassFileException { if (method instanceof ShrikeCTMethod) { ShrikeCTMethod sm = (ShrikeCTMethod) method; if (sm.getMethodTypeSignature() == null) { return null; } else { return sm.getMethodTypeSignature().getArguments(); } } else { return null; } } public static MethodTypeSignature getMethodTypeSignature(IMethod method) throws InvalidClassFileException { if (method instanceof ShrikeCTMethod) { ShrikeCTMethod sm = (ShrikeCTMethod) method; return sm.getMethodTypeSignature(); } else { return null; } } }