JavaNames.java

    1/*******************************************************************************
    2 * Copyright (c) 2009, 2010 Mountainminds GmbH & Co. KG and Contributors
    3 * All rights reserved. This program and the accompanying materials
    4 * are made available under the terms of the Eclipse Public License v1.0
    5 * which accompanies this distribution, and is available at
    6 * http://www.eclipse.org/legal/epl-v10.html
    7 *
    8 * Contributors:
    9 *    Marc R. Hoffmann - initial API and implementation
   10 *    
   11 * $Id: $
   12 *******************************************************************************/
   13package org.jacoco.report;
   14
   15import org.objectweb.asm.Type;
   16
   17/**
   18 * Names for the Java language.
   19 * 
   20 * @author Marc R. Hoffmann
   21 * @version $Revision: $
   22 */
   23public class JavaNames implements ILanguageNames {
   24
   25    public String getPackageName(final String vmname) {
   26        if (vmname.length() == 0) {
   27            return "default";
   28        }
   29        return vmname.replace('/', '.');
   30    }
   31
   32    private String getClassName(final String vmname) {
   33        final int pos = vmname.lastIndexOf('/');
   34        final String name = pos == -1 ? vmname : vmname.substring(pos + 1);
   35        return name.replace('$', '.');
   36    }
   37
   38    private boolean isAnonymous(final String vmname) {
   39        // assume non-identifier start character for anonymous classes
   40        final char start = vmname.charAt(vmname.lastIndexOf('$') + 1);
   41        return start > 0 && !Character.isJavaIdentifierStart(start);
   42    }
   43
   44    public String getClassName(final String vmname, final String vmsignature,
   45            final String vmsuperclass, final String[] vminterfaces) {
   46        if (isAnonymous(vmname)) {
   47            final String vmsupertype;
   48            if (vminterfaces != null && vminterfaces.length > 0) {
   49                vmsupertype = vminterfaces[0];
   50            } else if (vmsuperclass != null) {
   51                vmsupertype = vmsuperclass;
   52            } else {
   53                vmsupertype = null;
   54            }
   55            // Append Eclipse style label, e.g. "Foo.new Bar() {...}"
   56            if (vmsupertype != null) {
   57                final StringBuilder builder = new StringBuilder();
   58                final String vmenclosing = vmname.substring(0, vmname
   59                        .lastIndexOf('$'));
   60                builder.append(getClassName(vmenclosing)).append(".new ")
   61                        .append(getClassName(vmsupertype)).append("() {...}");
   62                return builder.toString();
   63            }
   64        }
   65        return getClassName(vmname);
   66    }
   67
   68    public String getMethodName(final String vmclassname,
   69            final String vmmethodname, final String vmdesc,
   70            final String vmsignature) {
   71        if (vmmethodname.equals("<clinit>")) {
   72            return "static {...}";
   73        }
   74        final StringBuilder result = new StringBuilder();
   75        if (vmmethodname.equals("<init>")) {
   76            if (isAnonymous(vmclassname)) {
   77                return "{...}";
   78            } else {
   79                result.append(getClassName(vmclassname));
   80            }
   81        } else {
   82            result.append(vmmethodname);
   83        }
   84        result.append('(');
   85        final Type[] arguments = Type.getArgumentTypes(vmdesc);
   86        boolean comma = false;
   87        for (final Type arg : arguments) {
   88            if (comma) {
   89                result.append(", ");
   90            } else {
   91                comma = true;
   92            }
   93            result.append(getShortTypeName(arg));
   94        }
   95        result.append(')');
   96        return result.toString();
   97    }
   98
   99    private String getShortTypeName(final Type type) {
  100        final String name = type.getClassName();
  101        final int pos = name.lastIndexOf('.');
  102        final String shortName = pos == -1 ? name : name.substring(pos + 1);
  103        return shortName.replace('$', '.');
  104    }
  105
  106}