@Override public Void visit(InitializerDeclaration decl, AElement elem) { BlockStmt block = decl.getBlock(); AClass clazz = (AClass) elem; block.accept(this, clazz.methods.vivify(decl.isStatic() ? "<clinit>" : "<init>")); return null; }
@Override public Void visit(ConstructorDeclaration decl, AElement elem) { int i = 0; List<Parameter> params = decl.getParameters(); List<AnnotationExpr> rcvrAnnos = decl.getReceiverAnnotations(); BlockStmt body = decl.getBlock(); StringBuilder sb = new StringBuilder("<init>("); AClass clazz = (AClass) elem; AMethod method; if (params != null) { for (Parameter param : params) { Type ptype = param.getType(); sb.append(getJVML(ptype)); } } sb.append(")V"); method = clazz.methods.vivify(sb.toString()); visitDecl(decl, method); if (params != null) { for (Parameter param : params) { AField field = method.parameters.vivify(i++); visitType(param.getType(), field.type); } } if (rcvrAnnos != null) { for (AnnotationExpr expr : rcvrAnnos) { Annotation anno = extractAnnotation(expr); method.receiver.tlAnnotationsHere.add(anno); } } return body == null ? null : body.accept(this, method); // return super.visit(decl, elem); }
@Override public Void visit(MethodDeclaration decl, AElement elem) { Type type = decl.getType(); List<Parameter> params = decl.getParameters(); List<TypeParameter> typeParams = decl.getTypeParameters(); List<AnnotationExpr> rcvrAnnos = decl.getReceiverAnnotations(); BlockStmt body = decl.getBody(); StringBuilder sb = new StringBuilder(decl.getName()).append('('); AClass clazz = (AClass) elem; AMethod method; if (params != null) { for (Parameter param : params) { Type ptype = param.getType(); sb.append(getJVML(ptype)); } } sb.append(')').append(getJVML(type)); method = clazz.methods.vivify(sb.toString()); visitDecl(decl, method); visitType(type, method.returnType); if (params != null) { int i = 0; for (Parameter param : params) { AField field = method.parameters.vivify(i++); visitType(param.getType(), field.type); } } if (rcvrAnnos != null) { for (AnnotationExpr expr : rcvrAnnos) { Annotation anno = extractAnnotation(expr); method.receiver.type.tlAnnotationsHere.add(anno); } } if (typeParams != null) { int i = 0; for (TypeParameter typeParam : typeParams) { List<ClassOrInterfaceType> bounds = typeParam.getTypeBound(); if (bounds != null) { int j = 0; for (ClassOrInterfaceType bound : bounds) { BoundLocation loc = new BoundLocation(i, j); bound.accept(this, method.bounds.vivify(loc)); ++j; } } ++i; } } return body == null ? null : body.accept(this, method); }