// Transmogrify License // // Copyright (c) 2001, ThoughtWorks, Inc. // All rights reserved. // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // - Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // Neither the name of the ThoughtWorks, Inc. nor the names of its // contributors may be used to endorse or promote products derived from this // software without specific prior written permission. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED // TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package com.puppycrawl.tools.checkstyle.checks.usage.transmogrify; import java.util.HashMap; import java.util.Map; import com.puppycrawl.tools.checkstyle.api.TokenTypes; /** * Resolves primitive identifiers (int, double) to their corresponding * <code>ClassDef</code>. This class uses the Singleton pattern. * * @author <a href="mailto:smileyy@thoughtworks.com">andrew</a> * @version 1.0 * @since 1.0 */ public class LiteralResolver { private static Map intMap; private static Map nameMap; private static Map classMap; static { nameMap = new HashMap(); nameMap.put("boolean", new ExternalClass(Boolean.TYPE)); nameMap.put("byte", new ExternalClass(Byte.TYPE)); nameMap.put("char", new ExternalClass(Character.TYPE)); nameMap.put("short", new ExternalClass(Short.TYPE)); nameMap.put("int", new ExternalClass(Integer.TYPE)); nameMap.put("float", new ExternalClass(Float.TYPE)); nameMap.put("long", new ExternalClass(Long.TYPE)); nameMap.put("double", new ExternalClass(Double.TYPE)); intMap = new HashMap(); intMap.put( new Integer(TokenTypes.LITERAL_BOOLEAN), new ExternalClass(Boolean.TYPE)); intMap.put( new Integer(TokenTypes.LITERAL_BYTE), new ExternalClass(Byte.TYPE)); intMap.put( new Integer(TokenTypes.LITERAL_CHAR), new ExternalClass(Character.TYPE)); intMap.put( new Integer(TokenTypes.LITERAL_SHORT), new ExternalClass(Short.TYPE)); intMap.put( new Integer(TokenTypes.LITERAL_INT), new ExternalClass(Integer.TYPE)); intMap.put( new Integer(TokenTypes.LITERAL_FLOAT), new ExternalClass(Float.TYPE)); intMap.put( new Integer(TokenTypes.LITERAL_LONG), new ExternalClass(Long.TYPE)); intMap.put( new Integer(TokenTypes.LITERAL_DOUBLE), new ExternalClass(Double.TYPE)); intMap.put( new Integer(TokenTypes.STRING_LITERAL), new ExternalClass("".getClass())); classMap = new HashMap(); classMap.put( new ExternalClass(Boolean.TYPE), SymTabASTFactory.create(TokenTypes.LITERAL_BOOLEAN, "boolean")); classMap.put( new ExternalClass(Byte.TYPE), SymTabASTFactory.create(TokenTypes.LITERAL_BYTE, "byte")); classMap.put( new ExternalClass(Character.TYPE), SymTabASTFactory.create(TokenTypes.LITERAL_CHAR, "char")); classMap.put( new ExternalClass(Short.TYPE), SymTabASTFactory.create(TokenTypes.LITERAL_SHORT, "short")); classMap.put( new ExternalClass(Integer.TYPE), SymTabASTFactory.create(TokenTypes.LITERAL_INT, "int")); classMap.put( new ExternalClass(Float.TYPE), SymTabASTFactory.create(TokenTypes.LITERAL_FLOAT, "float")); classMap.put( new ExternalClass(Long.TYPE), SymTabASTFactory.create(TokenTypes.LITERAL_LONG, "long")); classMap.put( new ExternalClass(Double.TYPE), SymTabASTFactory.create(TokenTypes.LITERAL_DOUBLE, "double")); } /** * Returns a <code>LiteralResolver</code> * * @return a <code>LiteralResolver</code> */ public static LiteralResolver getResolver() { return new LiteralResolver(); } /** * Returns the <code>ClassDef</code> for a primitive type reference. * * <p> * We could probably do without passing in the context, if we could figure * out a way to access the base scope. * </p> * * @param literalType the JavaTokenType for the literal type * @param context the scope in which the search performed * @return returns the <code>ClassDef</code>corresponding to the primitive * type */ public static IClass getDefinition(int literalType) { Integer key = new Integer(literalType); return (IClass) intMap.get(key); } public static IClass getDefinition(String name) { return (IClass) nameMap.get(name); } public static SymTabAST getASTNode(IClass primitive) { return (SymTabAST) classMap.get(primitive); } }