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