duke@1: /* ohair@554: * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. duke@1: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. duke@1: * duke@1: * This code is free software; you can redistribute it and/or modify it duke@1: * under the terms of the GNU General Public License version 2 only, as ohair@554: * published by the Free Software Foundation. Oracle designates this duke@1: * particular file as subject to the "Classpath" exception as provided ohair@554: * by Oracle in the LICENSE file that accompanied this code. duke@1: * duke@1: * This code is distributed in the hope that it will be useful, but WITHOUT duke@1: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or duke@1: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License duke@1: * version 2 for more details (a copy is included in the LICENSE file that duke@1: * accompanied this code). duke@1: * duke@1: * You should have received a copy of the GNU General Public License version duke@1: * 2 along with this work; if not, write to the Free Software Foundation, duke@1: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. duke@1: * ohair@554: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ohair@554: * or visit www.oracle.com if you need additional information or have any ohair@554: * questions. duke@1: */ duke@1: duke@1: package com.sun.tools.javac.util; duke@1: duke@1: import com.sun.tools.javac.code.Type; duke@1: duke@1: import static com.sun.tools.javac.code.TypeTags.*; duke@1: duke@1: /** duke@1: * Utilities for operating on constant values. duke@1: * jjg@581: *

This is NOT part of any supported API. jjg@581: * If you write code that depends on this, you do so at your own risk. duke@1: * This code and its internal interfaces are subject to change or duke@1: * deletion without notice. duke@1: */ duke@1: public class Constants { duke@1: duke@1: /** duke@1: * Converts a constant in internal representation (in which duke@1: * boolean, char, byte, short, and int are each represented by an duke@1: * Integer) into standard representation. Other values (including duke@1: * null) are returned unchanged. duke@1: */ duke@1: public static Object decode(Object value, Type type) { duke@1: if (value instanceof Integer) { duke@1: int i = (Integer) value; duke@1: switch (type.tag) { duke@1: case BOOLEAN: return i != 0; duke@1: case CHAR: return (char) i; duke@1: case BYTE: return (byte) i; duke@1: case SHORT: return (short) i; duke@1: } duke@1: } duke@1: return value; duke@1: } duke@1: duke@1: /** duke@1: * Returns a string representation of a constant value (given in duke@1: * internal representation), quoted and formatted as in Java source. duke@1: */ duke@1: public static String format(Object value, Type type) { duke@1: value = decode(value, type); duke@1: switch (type.tag) { duke@1: case BYTE: return formatByte((Byte) value); duke@1: case LONG: return formatLong((Long) value); duke@1: case FLOAT: return formatFloat((Float) value); duke@1: case DOUBLE: return formatDouble((Double) value); duke@1: case CHAR: return formatChar((Character) value); duke@1: } duke@1: if (value instanceof String) duke@1: return formatString((String) value); duke@1: return value + ""; duke@1: } duke@1: duke@1: /** duke@1: * Returns a string representation of a constant value (given in duke@1: * standard wrapped representation), quoted and formatted as in duke@1: * Java source. duke@1: */ duke@1: public static String format(Object value) { duke@1: if (value instanceof Byte) return formatByte((Byte) value); darcy@414: if (value instanceof Short) return formatShort((Short) value); duke@1: if (value instanceof Long) return formatLong((Long) value); duke@1: if (value instanceof Float) return formatFloat((Float) value); duke@1: if (value instanceof Double) return formatDouble((Double) value); duke@1: if (value instanceof Character) return formatChar((Character) value); duke@1: if (value instanceof String) return formatString((String) value); darcy@414: if (value instanceof Integer || darcy@414: value instanceof Boolean) return value.toString(); darcy@414: else darcy@414: throw new IllegalArgumentException("Argument is not a primitive type or a string; it " + darcy@414: ((value == null) ? darcy@414: "is a null value." : darcy@414: "has class " + darcy@414: value.getClass().getName()) + "." ); duke@1: } duke@1: duke@1: private static String formatByte(byte b) { darcy@414: return String.format("(byte)0x%02x", b); darcy@414: } darcy@414: darcy@414: private static String formatShort(short s) { darcy@414: return String.format("(short)%d", s); duke@1: } duke@1: duke@1: private static String formatLong(long lng) { duke@1: return lng + "L"; duke@1: } duke@1: duke@1: private static String formatFloat(float f) { duke@1: if (Float.isNaN(f)) duke@1: return "0.0f/0.0f"; duke@1: else if (Float.isInfinite(f)) duke@1: return (f < 0) ? "-1.0f/0.0f" : "1.0f/0.0f"; duke@1: else duke@1: return f + "f"; duke@1: } duke@1: duke@1: private static String formatDouble(double d) { duke@1: if (Double.isNaN(d)) duke@1: return "0.0/0.0"; duke@1: else if (Double.isInfinite(d)) duke@1: return (d < 0) ? "-1.0/0.0" : "1.0/0.0"; duke@1: else duke@1: return d + ""; duke@1: } duke@1: duke@1: private static String formatChar(char c) { duke@1: return '\'' + Convert.quote(c) + '\''; duke@1: } duke@1: duke@1: private static String formatString(String s) { duke@1: return '"' + Convert.quote(s) + '"'; duke@1: } duke@1: }