Bladeren bron

signature parsing for methods and fields now complete also

tags/PRE_ANDY
acolyer 19 jaren geleden
bovenliggende
commit
14f1ca3554

+ 4
- 1
bcel-builder/src/org/aspectj/apache/bcel/classfile/GenericSignatureParser.java Bestand weergeven

@@ -163,7 +163,6 @@ public class GenericSignatureParser {
private ArrayTypeSignature parseArrayTypeSignature() {
// opening [ already eaten
eat("["); // grammar adds another one!
FieldTypeSignature fieldType = parseFieldTypeSignature(true);
if (fieldType != null) {
return new ArrayTypeSignature(fieldType);
@@ -273,6 +272,7 @@ public class GenericSignatureParser {
}
private boolean maybeEat(String token) {
if (tokenStream.length <= tokenIndex) return false;
if (tokenStream[tokenIndex].equals(token)) {
tokenIndex++;
return true;
@@ -329,6 +329,8 @@ public class GenericSignatureParser {
tokens.add(";");
break;
case '^':
if (identifier.length() > 0) tokens.add(identifier.toString());
identifier = new StringBuffer();
tokens.add("^");
break;
case '+':
@@ -350,6 +352,7 @@ public class GenericSignatureParser {
break;
case ')' :
tokens.add(")");
break;
case '[' :
tokens.add("[");
break;

+ 3
- 3
bcel-builder/src/org/aspectj/apache/bcel/classfile/Signature.java Bestand weergeven

@@ -71,7 +71,7 @@ import org.aspectj.apache.bcel.Constants;
* This class is derived from <em>Attribute</em> and represents a reference
* to a <href="http://wwwipd.ira.uka.de/~pizza/gj/">GJ</a> attribute.
*
* @version $Id: Signature.java,v 1.4 2005/07/01 09:10:45 acolyer Exp $
* @version $Id: Signature.java,v 1.5 2005/07/01 11:29:54 acolyer Exp $
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
* @see Attribute
*/
@@ -457,7 +457,7 @@ public final class Signature extends Attribute {
}
}

static class TypeVariableSignature extends FieldTypeSignature {
public static class TypeVariableSignature extends FieldTypeSignature {
public String typeVariableName;
public TypeVariableSignature(String typeVarToken) {
this.typeVariableName = typeVarToken.substring(1);
@@ -468,7 +468,7 @@ public final class Signature extends Attribute {
}
}

static class ArrayTypeSignature extends FieldTypeSignature {
public static class ArrayTypeSignature extends FieldTypeSignature {
public TypeSignature typeSig;
public ArrayTypeSignature(TypeSignature aTypeSig) {
this.typeSig = aTypeSig;

+ 91
- 0
bcel-builder/testsrc/org/aspectj/apache/bcel/classfile/tests/GenericSignatureParserTest.java Bestand weergeven

@@ -1,13 +1,18 @@
package org.aspectj.apache.bcel.classfile.tests;


import org.aspectj.apache.bcel.classfile.GenericSignatureParser;
import org.aspectj.apache.bcel.classfile.JavaClass;
import org.aspectj.apache.bcel.classfile.Method;
import org.aspectj.apache.bcel.classfile.Signature;
import org.aspectj.apache.bcel.classfile.Signature.ClassSignature;
import org.aspectj.apache.bcel.classfile.Signature.ClassTypeSignature;
import org.aspectj.apache.bcel.classfile.Signature.FieldTypeSignature;
import org.aspectj.apache.bcel.classfile.Signature.SimpleClassTypeSignature;
import org.aspectj.apache.bcel.util.SyntheticRepository;

import sun.reflect.generics.scope.MethodScope;

import junit.framework.TestCase;

public class GenericSignatureParserTest extends TestCase {
@@ -117,6 +122,92 @@ public class GenericSignatureParserTest extends TestCase {
assertEquals("Ljava/lang/String;",fsig.toString());
}
public void testFieldSignatureParsingArrayType() {
FieldTypeSignature fsig = parser.parseAsFieldSignature("[Ljava/lang/String;");
assertTrue("ArrayTypeSignature", fsig instanceof Signature.ArrayTypeSignature);
assertEquals("[Ljava/lang/String;",fsig.toString());
}
public void testFieldSignatureParsingTypeVariable() {
FieldTypeSignature fsig = parser.parseAsFieldSignature("TT;");
assertTrue("TypeVariableSignature",fsig instanceof Signature.TypeVariableSignature);
assertEquals("TT;",fsig.toString());
}
public void testSimpleMethodSignatureParsing() {
Signature.MethodTypeSignature mSig = parser.parseAsMethodSignature("()V");
assertEquals("No type parameters",0,mSig.formalTypeParameters.length);
assertEquals("No parameters",0,mSig.parameters.length);
assertEquals("Void return type","V",mSig.returnType.toString());
assertEquals("No throws",0,mSig.throwsSignatures.length);
}
public void testMethodSignatureTypeParams() {
Signature.MethodTypeSignature mSig = parser.parseAsMethodSignature("<T:>(TT;)V");
assertEquals("One type parameter",1,mSig.formalTypeParameters.length);
assertEquals("T",mSig.formalTypeParameters[0].identifier);
assertEquals("Ljava/lang/Object;",mSig.formalTypeParameters[0].classBound.toString());
assertEquals("One parameter",1,mSig.parameters.length);
assertEquals("TT;",mSig.parameters[0].toString());
assertEquals("Void return type","V",mSig.returnType.toString());
assertEquals("No throws",0,mSig.throwsSignatures.length);
}
public void testMethodSignatureGenericReturn() {
Signature.MethodTypeSignature mSig = parser.parseAsMethodSignature("<T:>()TT;");
assertEquals("One type parameter",1,mSig.formalTypeParameters.length);
assertEquals("T",mSig.formalTypeParameters[0].identifier);
assertEquals("Ljava/lang/Object;",mSig.formalTypeParameters[0].classBound.toString());
assertEquals("No parameters",0,mSig.parameters.length);
assertEquals("'T' return type","TT;",mSig.returnType.toString());
assertEquals("No throws",0,mSig.throwsSignatures.length);
}
public void testMethodSignatureThrows() {
Signature.MethodTypeSignature mSig = parser.parseAsMethodSignature("<T:>(TT;)V^Ljava/lang/Exception;^Ljava/lang/RuntimeException;");
assertEquals("One type parameter",1,mSig.formalTypeParameters.length);
assertEquals("T",mSig.formalTypeParameters[0].identifier);
assertEquals("Ljava/lang/Object;",mSig.formalTypeParameters[0].classBound.toString());
assertEquals("One parameter",1,mSig.parameters.length);
assertEquals("TT;",mSig.parameters[0].toString());
assertEquals("Void return type","V",mSig.returnType.toString());
assertEquals("2 throws",2,mSig.throwsSignatures.length);
assertEquals("Ljava/lang/Exception;",mSig.throwsSignatures[0].toString());
assertEquals("Ljava/lang/RuntimeException;",mSig.throwsSignatures[1].toString());
}
public void testMethodSignatureParsingInJDK() throws Exception{
SyntheticRepository repository = SyntheticRepository.getInstance();
String[] testClasses = new String[] {
"java.lang.Comparable",
"java.lang.Iterable",
"java.lang.Class",
"java.lang.Enum",
"java.lang.InheritableThreadLocal",
"java.lang.ThreadLocal",
"java.util.Collection",
"java.util.Comparator",
"java.util.Enumeration",
"java.util.Iterator",
"java.util.List",
"java.util.ListIterator",
"java.util.Map",
"java.util.Map$Entry",
"java.util.Queue",
"java.util.Set",
"java.util.SortedMap",
"java.util.SortedSet"
};
for (int i = 0; i < testClasses.length; i++) {
JavaClass jc = repository.loadClass(testClasses[i]);
Method[] methods = jc.getMethods();
for (int j = 0; j < methods.length; j++) {
String sig = methods[j].getGenericSignature();
if (sig != null) parser.parseAsMethodSignature(sig);
}
}
}
private void assertEquals(String[] expected, String[] actual) {
if (actual.length != expected.length) {
int shorter = Math.min(expected.length,actual.length);

Laden…
Annuleren
Opslaan