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}