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