blob: d50a45c2d1927c49bee0be2e63b6768ec44ab6ae [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 Mia-Software and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Romain Dervaux (Mia-Software) - initial API and implementation
*******************************************************************************/
package org.eclipse.modisco.java.discoverer.internal.io.library;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.modisco.java.Model;
import org.eclipse.modisco.java.NamedElement;
import org.eclipse.modisco.java.Type;
import org.eclipse.modisco.java.TypeAccess;
import org.eclipse.modisco.java.discoverer.internal.io.java.binding.Binding;
import org.eclipse.modisco.java.discoverer.internal.io.java.binding.BindingManager;
import org.eclipse.modisco.java.discoverer.internal.io.java.binding.PendingElement;
import org.eclipse.modisco.java.discoverer.internal.io.library.binding.JavaModelDelegateBindingFactory;
import org.eclipse.modisco.java.emf.JavaFactory;
/**
* The class provides tools for the ClassFileParser.
*/
public final class ClassFileParserUtils {
private static final int ESCAPED_CHAR_LENGTH = 3;
/**
* No instantiation.
*/
private ClassFileParserUtils() {
// nothing
}
/**
* Resolves the Java model element and sorts the targeted
* <code>element</code> in the global <code>BindingManager</code>.
*
* @param element
* the declared Java entity.
* @param javaElement
* The Java model element corresponding to the declared Java
* entity.
* @param visitor
* the {@code ClassFileParser}.
*/
public static void manageBindingDeclaration(final NamedElement element,
final IJavaElement javaElement, final ClassFileParser visitor) {
Binding id = JavaModelDelegateBindingFactory.getInstance().getBindingForElement(
javaElement, visitor);
visitor.getGlobalBindings().addTarget(id, element);
}
/**
* Manage a reference on a type. If the targeted type is already known, the
* reference is resolved and the supplied {@code TypeAccess} is completed.
* If unknown, a pending reference is created and sorted in the global
* {@code BindingManager}.
*
* @param element
* the {@code TypeAccess} associated with this reference
* @param name
* The qualified dot based name of the referenced java entity.
* @param visitor
* the {@code ClassFileParser}
*/
public static void manageBindingRef(final TypeAccess element, final String name,
final ClassFileParser visitor) {
Binding id = JavaModelDelegateBindingFactory.getInstance().getBindingForName(name, visitor,
false);
NamedElement target = visitor.getGlobalBindings().getTarget(id);
if (target != null) {
element.setType((Type) target);
} else {
PendingElement pending = new PendingElement(visitor.getFactory());
pending.setClientNode(element);
pending.setLinkName("type"); //$NON-NLS-1$
visitor.getGlobalBindings().addPending(pending, id);
}
}
/**
* First creation of the Java primitives types which are placed as targets
* in the global {@code BindingManager}.
*
* @param factory
* the EMF {@code factory}
* @param model
* the EMF {@code Model} object
* @param globalBindings
* the global {@code BindingManager}
*/
public static void initializePrimitiveTypes(final JavaFactory factory, final Model model,
final BindingManager globalBindings) {
org.eclipse.modisco.java.PrimitiveType primitiveType;
if (globalBindings.getTarget(org.eclipse.jdt.core.dom.PrimitiveType.INT.toString()) == null) {
primitiveType = factory.createPrimitiveTypeInt();
primitiveType.setName(org.eclipse.jdt.core.dom.PrimitiveType.INT.toString());
model.getOrphanTypes().add(primitiveType);
globalBindings.addTarget(org.eclipse.jdt.core.dom.PrimitiveType.INT.toString(),
primitiveType);
}
if (globalBindings.getTarget(org.eclipse.jdt.core.dom.PrimitiveType.LONG.toString()) == null) {
primitiveType = factory.createPrimitiveTypeLong();
primitiveType.setName(org.eclipse.jdt.core.dom.PrimitiveType.LONG.toString());
model.getOrphanTypes().add(primitiveType);
globalBindings.addTarget(org.eclipse.jdt.core.dom.PrimitiveType.LONG.toString(),
primitiveType);
}
if (globalBindings.getTarget(org.eclipse.jdt.core.dom.PrimitiveType.FLOAT.toString()) == null) {
primitiveType = factory.createPrimitiveTypeFloat();
primitiveType.setName(org.eclipse.jdt.core.dom.PrimitiveType.FLOAT.toString());
model.getOrphanTypes().add(primitiveType);
globalBindings.addTarget(org.eclipse.jdt.core.dom.PrimitiveType.FLOAT.toString(),
primitiveType);
}
if (globalBindings.getTarget(org.eclipse.jdt.core.dom.PrimitiveType.DOUBLE.toString()) == null) {
primitiveType = factory.createPrimitiveTypeDouble();
primitiveType.setName(org.eclipse.jdt.core.dom.PrimitiveType.DOUBLE.toString());
model.getOrphanTypes().add(primitiveType);
globalBindings.addTarget(org.eclipse.jdt.core.dom.PrimitiveType.DOUBLE.toString(),
primitiveType);
}
if (globalBindings.getTarget(org.eclipse.jdt.core.dom.PrimitiveType.BOOLEAN.toString()) == null) {
primitiveType = factory.createPrimitiveTypeBoolean();
primitiveType.setName(org.eclipse.jdt.core.dom.PrimitiveType.BOOLEAN.toString());
model.getOrphanTypes().add(primitiveType);
globalBindings.addTarget(org.eclipse.jdt.core.dom.PrimitiveType.BOOLEAN.toString(),
primitiveType);
}
if (globalBindings.getTarget(org.eclipse.jdt.core.dom.PrimitiveType.VOID.toString()) == null) {
primitiveType = factory.createPrimitiveTypeVoid();
primitiveType.setName(org.eclipse.jdt.core.dom.PrimitiveType.VOID.toString());
model.getOrphanTypes().add(primitiveType);
globalBindings.addTarget(org.eclipse.jdt.core.dom.PrimitiveType.VOID.toString(),
primitiveType);
}
if (globalBindings.getTarget(org.eclipse.jdt.core.dom.PrimitiveType.CHAR.toString()) == null) {
primitiveType = factory.createPrimitiveTypeChar();
primitiveType.setName(org.eclipse.jdt.core.dom.PrimitiveType.CHAR.toString());
model.getOrphanTypes().add(primitiveType);
globalBindings.addTarget(org.eclipse.jdt.core.dom.PrimitiveType.CHAR.toString(),
primitiveType);
}
if (globalBindings.getTarget(org.eclipse.jdt.core.dom.PrimitiveType.SHORT.toString()) == null) {
primitiveType = factory.createPrimitiveTypeShort();
primitiveType.setName(org.eclipse.jdt.core.dom.PrimitiveType.SHORT.toString());
model.getOrphanTypes().add(primitiveType);
globalBindings.addTarget(org.eclipse.jdt.core.dom.PrimitiveType.SHORT.toString(),
primitiveType);
}
if (globalBindings.getTarget(org.eclipse.jdt.core.dom.PrimitiveType.BYTE.toString()) == null) {
primitiveType = factory.createPrimitiveTypeByte();
primitiveType.setName(org.eclipse.jdt.core.dom.PrimitiveType.BYTE.toString());
model.getOrphanTypes().add(primitiveType);
globalBindings.addTarget(org.eclipse.jdt.core.dom.PrimitiveType.BYTE.toString(),
primitiveType);
}
}
/**
* Returns the string as it would be in the source code.
*
* @see org.eclipse.jdt.core.dom.StringLiteral#getEscapedValue
*/
public static String escapeString(final String value) {
int len = value.length();
StringBuilder b = new StringBuilder(len + 2);
b.append("\""); //$NON-NLS-1$
for (int i = 0; i < len; i++) {
char c = value.charAt(i);
switch (c) {
case '\b':
b.append("\\b"); //$NON-NLS-1$
break;
case '\t':
b.append("\\t"); //$NON-NLS-1$
break;
case '\n':
b.append("\\n"); //$NON-NLS-1$
break;
case '\f':
b.append("\\f"); //$NON-NLS-1$
break;
case '\r':
b.append("\\r"); //$NON-NLS-1$
break;
case '\"':
b.append("\\\""); //$NON-NLS-1$
break;
case '\'':
b.append("\\\'"); //$NON-NLS-1$
break;
case '\\':
b.append("\\\\"); //$NON-NLS-1$
break;
case '\0':
b.append("\\0"); //$NON-NLS-1$
break;
case '\1':
b.append("\\1"); //$NON-NLS-1$
break;
case '\2':
b.append("\\2"); //$NON-NLS-1$
break;
case '\3':
b.append("\\3"); //$NON-NLS-1$
break;
case '\4':
b.append("\\4"); //$NON-NLS-1$
break;
case '\5':
b.append("\\5"); //$NON-NLS-1$
break;
case '\6':
b.append("\\6"); //$NON-NLS-1$
break;
case '\7':
b.append("\\7"); //$NON-NLS-1$
break;
default:
b.append(c);
}
}
b.append("\""); //$NON-NLS-1$
return b.toString();
}
/**
* Returns the character as it would be in the source code.
*
* @see org.eclipse.jdt.core.dom.CharacterLiteral#getEscapedValue
*/
public static String escapeCharacter(final char value) {
StringBuilder b = new StringBuilder(ClassFileParserUtils.ESCAPED_CHAR_LENGTH);
b.append('\'');
switch (value) {
case '\b':
b.append("\\b"); //$NON-NLS-1$
break;
case '\t':
b.append("\\t"); //$NON-NLS-1$
break;
case '\n':
b.append("\\n"); //$NON-NLS-1$
break;
case '\f':
b.append("\\f"); //$NON-NLS-1$
break;
case '\r':
b.append("\\r"); //$NON-NLS-1$
break;
case '\"':
b.append("\\\""); //$NON-NLS-1$
break;
case '\'':
b.append("\\\'"); //$NON-NLS-1$
break;
case '\\':
b.append("\\\\"); //$NON-NLS-1$
break;
case '\0':
b.append("\\0"); //$NON-NLS-1$
break;
case '\1':
b.append("\\1"); //$NON-NLS-1$
break;
case '\2':
b.append("\\2"); //$NON-NLS-1$
break;
case '\3':
b.append("\\3"); //$NON-NLS-1$
break;
case '\4':
b.append("\\4"); //$NON-NLS-1$
break;
case '\5':
b.append("\\5"); //$NON-NLS-1$
break;
case '\6':
b.append("\\6"); //$NON-NLS-1$
break;
case '\7':
b.append("\\7"); //$NON-NLS-1$
break;
default:
b.append(value);
}
b.append('\'');
return b.toString();
}
/**
* Indicate if a type signature corresponds to the {@link Object} type.
*
* @param signature
* the signature
* @return {@code true} if the supplied signature corresponds to the Object
* type, {@code false} otherwise
*/
public static boolean isJavaLangObject(final String signature) {
return JavaModelDelegateBindingFactory.JAVA_LANG_OBJECT_SIGNATURE.equals(signature);
}
}