blob: c6c4a6c2130d93801970a67be65b019f2001370d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2005 IBM Corporation 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
* https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jem.internal.instantiation.impl;
/*
*/
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.jem.internal.instantiation.*;
import org.eclipse.jem.internal.instantiation.PTCharacterLiteral;
import org.eclipse.jem.internal.instantiation.InstantiationPackage;
/**
* <!-- begin-user-doc -->
* An implementation of the model object '<em><b>Character Literal</b></em>'.
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
* <ul>
* <li>{@link org.eclipse.jem.internal.instantiation.impl.PTCharacterLiteralImpl#getEscapedValue <em>Escaped Value</em>}</li>
* <li>{@link org.eclipse.jem.internal.instantiation.impl.PTCharacterLiteralImpl#getCharValue <em>Char Value</em>}</li>
* </ul>
* </p>
*
* @generated
*/
public class PTCharacterLiteralImpl extends PTExpressionImpl implements PTCharacterLiteral {
/**
* The default value of the '{@link #getEscapedValue() <em>Escaped Value</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getEscapedValue()
* @generated
* @ordered
*/
protected static final String ESCAPED_VALUE_EDEFAULT = null;
/**
* The cached value of the '{@link #getEscapedValue() <em>Escaped Value</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getEscapedValue()
* @generated
* @ordered
*/
protected String escapedValue = ESCAPED_VALUE_EDEFAULT;
/**
* The default value of the '{@link #getCharValue() <em>Char Value</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getCharValue()
* @generated
* @ordered
*/
protected static final char CHAR_VALUE_EDEFAULT = '\u0000';
/**
* The cached value of the '{@link #getCharValue() <em>Char Value</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getCharValue()
* @generated
* @ordered
*/
protected char charValue = CHAR_VALUE_EDEFAULT;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected PTCharacterLiteralImpl() {
super();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected EClass eStaticClass() {
return InstantiationPackage.eINSTANCE.getPTCharacterLiteral();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public String getEscapedValue() {
return escapedValue;
}
public void setEscapedValue(String newEscapedValue) {
charValueSet = false;
setCharValueGen(CHAR_VALUE_EDEFAULT);
setEscapedValueGen(newEscapedValue);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void setEscapedValueGen(String newEscapedValue) {
String oldEscapedValue = escapedValue;
escapedValue = newEscapedValue;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, InstantiationPackage.PT_CHARACTER_LITERAL__ESCAPED_VALUE, oldEscapedValue, escapedValue));
}
private boolean charValueSet;
public char getCharValue() {
if (!charValueSet && escapedValue != ESCAPED_VALUE_EDEFAULT) {
String s = getEscapedValue();
int len = s.length();
if (len < 2 || s.charAt(0) != '\'' || s.charAt(len-1) != '\'' ) {
throw new IllegalArgumentException();
}
char c = s.charAt(1);
if (c == '\'') {
throw new IllegalArgumentException();
}
if (c == '\\') {
if (len == 4) {
setCharValueGen(getCharEscaped(s.charAt(2)));
} else if (len == 8) {
//handle the case of unicode.
int currentPosition = 2;
int c1 = 0, c2 = 0, c3 = 0, c4 = 0;
if (s.charAt(currentPosition++) == 'u') {
if ((c1 = Character.getNumericValue(s.charAt(currentPosition++))) > 15
|| c1 < 0
|| (c2 = Character.getNumericValue(s.charAt(currentPosition++))) > 15
|| c2 < 0
|| (c3 = Character.getNumericValue(s.charAt(currentPosition++))) > 15
|| c3 < 0
|| (c4 = Character.getNumericValue(s.charAt(currentPosition++))) > 15
|| c4 < 0){
throw new IllegalArgumentException("illegal character literal");//$NON-NLS-1$
} else {
setCharValueGen((char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4));
}
} else {
throw new IllegalArgumentException("illegal character literal");//$NON-NLS-1$
}
} else {
throw new IllegalArgumentException("illegal character literal");//$NON-NLS-1$
}
} else
setCharValueGen(c);
charValueSet = true;
}
return getCharValueGen();
}
public static char getCharEscaped(char nextChar) {
switch(nextChar) {
case 'b' :
return '\b';
case 't' :
return '\t';
case 'n' :
return '\n';
case 'f' :
return '\f';
case 'r' :
return '\r';
case '\"':
return '\"';
case '\'':
return '\'';
case '\\':
return '\\';
case '0' :
return '\0';
case '1' :
return '\1';
case '2' :
return '\2';
case '3' :
return '\3';
case '4' :
return '\4';
case '5' :
return '\5';
case '6' :
return '\6';
case '7' :
return '\7';
default:
throw new IllegalArgumentException("illegal character");//$NON-NLS-1$
}
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public char getCharValueGen() {
return charValue;
}
public void setCharValue(char newCharValue) {
charValueSet = true;
setCharValueGen(newCharValue);
StringBuffer b = new StringBuffer(8);
b.append('\''); // opening delimiter
appendCharacter(newCharValue, b);
b.append('\''); // closing delimiter
setEscapedValueGen(b.toString());
}
public static void appendCharacter(char character, StringBuffer b) {
switch(character) {
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(character);
}
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void setCharValueGen(char newCharValue) {
char oldCharValue = charValue;
charValue = newCharValue;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, InstantiationPackage.PT_CHARACTER_LITERAL__CHAR_VALUE, oldCharValue, charValue));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public Object eGet(EStructuralFeature eFeature, boolean resolve) {
switch (eDerivedStructuralFeatureID(eFeature)) {
case InstantiationPackage.PT_CHARACTER_LITERAL__ESCAPED_VALUE:
return getEscapedValue();
case InstantiationPackage.PT_CHARACTER_LITERAL__CHAR_VALUE:
return new Character(getCharValue());
}
return eDynamicGet(eFeature, resolve);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void eSet(EStructuralFeature eFeature, Object newValue) {
switch (eDerivedStructuralFeatureID(eFeature)) {
case InstantiationPackage.PT_CHARACTER_LITERAL__ESCAPED_VALUE:
setEscapedValue((String)newValue);
return;
case InstantiationPackage.PT_CHARACTER_LITERAL__CHAR_VALUE:
setCharValue(((Character)newValue).charValue());
return;
}
eDynamicSet(eFeature, newValue);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void eUnset(EStructuralFeature eFeature) {
switch (eDerivedStructuralFeatureID(eFeature)) {
case InstantiationPackage.PT_CHARACTER_LITERAL__ESCAPED_VALUE:
setEscapedValue(ESCAPED_VALUE_EDEFAULT);
return;
case InstantiationPackage.PT_CHARACTER_LITERAL__CHAR_VALUE:
setCharValue(CHAR_VALUE_EDEFAULT);
return;
}
eDynamicUnset(eFeature);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean eIsSet(EStructuralFeature eFeature) {
switch (eDerivedStructuralFeatureID(eFeature)) {
case InstantiationPackage.PT_CHARACTER_LITERAL__ESCAPED_VALUE:
return ESCAPED_VALUE_EDEFAULT == null ? escapedValue != null : !ESCAPED_VALUE_EDEFAULT.equals(escapedValue);
case InstantiationPackage.PT_CHARACTER_LITERAL__CHAR_VALUE:
return charValue != CHAR_VALUE_EDEFAULT;
}
return eDynamicIsSet(eFeature);
}
public String toString() {
return super.toString(); // Really want toString to be final at PTExpression, but EMF doesn't allow it.
}
/*
* (non-Javadoc)
* @see org.eclipse.jem.internal.instantiation.impl.ExpressionImpl#accept0(org.eclipse.jem.internal.instantiation.ParseVisitor)
*/
protected void accept0(ParseVisitor visitor) {
visitor.visit(this);
visitor.endVisit(this);
}
} //CharacterLiteralImpl