/******************************************************************************* * 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 v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * 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