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}