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 *******************************************************************************/
   12package org.jacoco.report;
   13
   14import org.objectweb.asm.Type;
   15
   16/**
   17 * Names for the Java language.
   18 * 
   19 * @author Marc R. Hoffmann
   20 * @version 0.4.1.20101007204400
   21 */
   22public class JavaNames implements ILanguageNames {
   23
   24    public String getPackageName(final String vmname) {
   25        if (vmname.length() == 0) {
   26            return "default";
   27        }
   28        return vmname.replace('/', '.');
   29    }
   30
   31    private String getClassName(final String vmname) {
   32        final int pos = vmname.lastIndexOf('/');
   33        final String name = pos == -1 ? vmname : vmname.substring(pos + 1);
   34        return name.replace('$', '.');
   35    }
   36
   37    private boolean isAnonymous(final String vmname) {
   38        // assume non-identifier start character for anonymous classes
   39        final char start = vmname.charAt(vmname.lastIndexOf('$') + 1);
   40        return start > 0 && !Character.isJavaIdentifierStart(start);
   41    }
   42
   43    public String getClassName(final String vmname, final String vmsignature,
   44            final String vmsuperclass, final String[] vminterfaces) {
   45        if (isAnonymous(vmname)) {
   46            final String vmsupertype;
   47            if (vminterfaces != null && vminterfaces.length > 0) {
   48                vmsupertype = vminterfaces[0];
   49            } else if (vmsuperclass != null) {
   50                vmsupertype = vmsuperclass;
   51            } else {
   52                vmsupertype = null;
   53            }
   54            // Append Eclipse style label, e.g. "Foo.new Bar() {...}"
   55            if (vmsupertype != null) {
   56                final StringBuilder builder = new StringBuilder();
   57                final String vmenclosing = vmname.substring(0, vmname
   58                        .lastIndexOf('$'));
   59                builder.append(getClassName(vmenclosing)).append(".new ")
   60                        .append(getClassName(vmsupertype)).append("() {...}");
   61                return builder.toString();
   62            }
   63        }
   64        return getClassName(vmname);
   65    }
   66
   67    public String getQualifiedClassName(final String vmname) {
   68        return vmname.replace('/', '.').replace('$', '.');
   69    }
   70
   71    public String getMethodName(final String vmclassname,
   72            final String vmmethodname, final String vmdesc,
   73            final String vmsignature) {
   74        if (vmmethodname.equals("<clinit>")) {
   75            return "static {...}";
   76        }
   77        final StringBuilder result = new StringBuilder();
   78        if (vmmethodname.equals("<init>")) {
   79            if (isAnonymous(vmclassname)) {
   80                return "{...}";
   81            } else {
   82                result.append(getClassName(vmclassname));
   83            }
   84        } else {
   85            result.append(vmmethodname);
   86        }
   87        result.append('(');
   88        final Type[] arguments = Type.getArgumentTypes(vmdesc);
   89        boolean comma = false;
   90        for (final Type arg : arguments) {
   91            if (comma) {
   92                result.append(", ");
   93            } else {
   94                comma = true;
   95            }
   96            result.append(getShortTypeName(arg));
   97        }
   98        result.append(')');
   99        return result.toString();
  100    }
  101
  102    private String getShortTypeName(final Type type) {
  103        final String name = type.getClassName();
  104        final int pos = name.lastIndexOf('.');
  105        final String shortName = pos == -1 ? name : name.substring(pos + 1);
  106        return shortName.replace('$', '.');
  107    }
  108
  109}