| 1 | /* | 
| 2 |  *   Copyright (C) Christian Schulte, 2012-253 | 
| 3 |  *   All rights reserved. | 
| 4 |  * | 
| 5 |  *   Redistribution and use in source and binary forms, with or without | 
| 6 |  *   modification, are permitted provided that the following conditions | 
| 7 |  *   are met: | 
| 8 |  * | 
| 9 |  *     o Redistributions of source code must retain the above copyright | 
| 10 |  *       notice, this list of conditions and the following disclaimer. | 
| 11 |  * | 
| 12 |  *     o Redistributions in binary form must reproduce the above copyright | 
| 13 |  *       notice, this list of conditions and the following disclaimer in | 
| 14 |  *       the documentation and/or other materials provided with the | 
| 15 |  *       distribution. | 
| 16 |  * | 
| 17 |  *   THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, | 
| 18 |  *   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY | 
| 19 |  *   AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL | 
| 20 |  *   THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT, | 
| 21 |  *   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | 
| 22 |  *   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
| 23 |  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
| 24 |  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
| 25 |  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | 
| 26 |  *   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
| 27 |  * | 
| 28 |  *   $JOMC: JavaLanguage.java 4681 2012-12-29 00:30:19Z schulte $ | 
| 29 |  * | 
| 30 |  */ | 
| 31 | package org.jomc.model; | 
| 32 |   | 
| 33 | import java.util.HashSet; | 
| 34 | import java.util.Set; | 
| 35 |   | 
| 36 | /** | 
| 37 |  * Java language support. | 
| 38 |  * | 
| 39 |  * @author <a href="mailto:cs@schulte.it">Christian Schulte</a> | 
| 40 |  * @version $JOMC: JavaLanguage.java 4681 2012-12-29 00:30:19Z schulte $ | 
| 41 |  * @since 1.4 | 
| 42 |  */ | 
| 43 | class JavaLanguage | 
| 44 | { | 
| 45 |   | 
| 46 |     /** | 
| 47 |      * The Java Language Specification - Java SE 7 Edition - Chapter 18. Syntax | 
| 48 |      * <pre> | 
| 49 |      * BasicType: | 
| 50 |      *      byte | 
| 51 |      *      short | 
| 52 |      *      char | 
| 53 |      *      int | 
| 54 |      *      long | 
| 55 |      *      float | 
| 56 |      *      double | 
| 57 |      * </pre> | 
| 58 |      */ | 
| 59 |     static final Set<String> BASIC_TYPES = new HashSet<String>( 8 ); | 
| 60 |   | 
| 61 |     /** | 
| 62 |      * The Java Language Specification - Java SE 7 Edition - Chapter 3.10.3. Boolean Literals | 
| 63 |      * <pre> | 
| 64 |      * BooleanLiteral: one of | 
| 65 |      *      true false | 
| 66 |      * </pre> | 
| 67 |      */ | 
| 68 |     static final Set<String> BOOLEAN_LITERALS = new HashSet<String>( 2 ); | 
| 69 |   | 
| 70 |     /** | 
| 71 |      * The Java Language Specification - Java SE 7 Edition - Chapter 3.9. Keywords | 
| 72 |      * <pre> | 
| 73 |      * Keyword: one of | 
| 74 |      *      abstract   continue   for          new         switch | 
| 75 |      *      assert     default    if           package     synchronized | 
| 76 |      *      boolean    do         goto         private     this | 
| 77 |      *      break      double     implements   protected   throw | 
| 78 |      *      byte       else       import       public      throws | 
| 79 |      *      case       enum       instanceof   return      transient | 
| 80 |      *      catch      extends    int          short       try | 
| 81 |      *      char       final      interface    static      void | 
| 82 |      *      class      finally    long         strictfp    volatile | 
| 83 |      *      const      float      native       super       while | 
| 84 |      * </pre> | 
| 85 |      */ | 
| 86 |     static final Set<String> KEYWORDS = new HashSet<String>( 50 ); | 
| 87 |   | 
| 88 |     /** | 
| 89 |      * The Java Language Specification - Java SE 7 Edition - Chapter 3.10.7. The Null Literal | 
| 90 |      * <pre> | 
| 91 |      * NullLiteral: | 
| 92 |      *      null | 
| 93 |      * </pre> | 
| 94 |      */ | 
| 95 |     static final String NULL_LITERAL = "null"; | 
| 96 |   | 
| 97 |     static | 
| 98 |     { | 
| 99 |         // JLS - Java SE 7 Edition - Chapter 18. Syntax - BasicType | 
| 100 |         BASIC_TYPES.add( "boolean" ); | 
| 101 |         BASIC_TYPES.add( "byte" ); | 
| 102 |         BASIC_TYPES.add( "char" ); | 
| 103 |         BASIC_TYPES.add( "double" ); | 
| 104 |         BASIC_TYPES.add( "float" ); | 
| 105 |         BASIC_TYPES.add( "short" ); | 
| 106 |         BASIC_TYPES.add( "int" ); | 
| 107 |         BASIC_TYPES.add( "long" ); | 
| 108 |   | 
| 109 |         // JLS - Java SE 7 Edition - 3.10.3. Boolean Literals | 
| 110 |         BOOLEAN_LITERALS.add( "true" ); | 
| 111 |         BOOLEAN_LITERALS.add( "false" ); | 
| 112 |   | 
| 113 |         // JLS - Java SE 7 Edition - Chapter 3. Lexical Structure - 3.9. Keywords | 
| 114 |         KEYWORDS.add( "abstract" ); | 
| 115 |         KEYWORDS.add( "assert" ); | 
| 116 |         KEYWORDS.add( "boolean" ); | 
| 117 |         KEYWORDS.add( "break" ); | 
| 118 |         KEYWORDS.add( "byte" ); | 
| 119 |         KEYWORDS.add( "case" ); | 
| 120 |         KEYWORDS.add( "catch" ); | 
| 121 |         KEYWORDS.add( "char" ); | 
| 122 |         KEYWORDS.add( "class" ); | 
| 123 |         KEYWORDS.add( "const" ); | 
| 124 |         KEYWORDS.add( "continue" ); | 
| 125 |         KEYWORDS.add( "default" ); | 
| 126 |         KEYWORDS.add( "do" ); | 
| 127 |         KEYWORDS.add( "double" ); | 
| 128 |         KEYWORDS.add( "else" ); | 
| 129 |         KEYWORDS.add( "enum" ); | 
| 130 |         KEYWORDS.add( "extends" ); | 
| 131 |         KEYWORDS.add( "final" ); | 
| 132 |         KEYWORDS.add( "finally" ); | 
| 133 |         KEYWORDS.add( "float" ); | 
| 134 |         KEYWORDS.add( "for" ); | 
| 135 |         KEYWORDS.add( "if" ); | 
| 136 |         KEYWORDS.add( "goto" ); | 
| 137 |         KEYWORDS.add( "implements" ); | 
| 138 |         KEYWORDS.add( "import" ); | 
| 139 |         KEYWORDS.add( "instanceof" ); | 
| 140 |         KEYWORDS.add( "int" ); | 
| 141 |         KEYWORDS.add( "interface" ); | 
| 142 |         KEYWORDS.add( "long" ); | 
| 143 |         KEYWORDS.add( "native" ); | 
| 144 |         KEYWORDS.add( "new" ); | 
| 145 |         KEYWORDS.add( "package" ); | 
| 146 |         KEYWORDS.add( "private" ); | 
| 147 |         KEYWORDS.add( "protected" ); | 
| 148 |         KEYWORDS.add( "public" ); | 
| 149 |         KEYWORDS.add( "return" ); | 
| 150 |         KEYWORDS.add( "short" ); | 
| 151 |         KEYWORDS.add( "static" ); | 
| 152 |         KEYWORDS.add( "strictfp" ); | 
| 153 |         KEYWORDS.add( "super" ); | 
| 154 |         KEYWORDS.add( "switch" ); | 
| 155 |         KEYWORDS.add( "synchronized" ); | 
| 156 |         KEYWORDS.add( "this" ); | 
| 157 |         KEYWORDS.add( "throw" ); | 
| 158 |         KEYWORDS.add( "throws" ); | 
| 159 |         KEYWORDS.add( "transient" ); | 
| 160 |         KEYWORDS.add( "try" ); | 
| 161 |         KEYWORDS.add( "void" ); | 
| 162 |         KEYWORDS.add( "volatile" ); | 
| 163 |         KEYWORDS.add( "while" ); | 
| 164 |     } | 
| 165 |   | 
| 166 |     /** | 
| 167 |      * Tests whether a given string is case-insensitively equal to a Java keyword. | 
| 168 |      * | 
| 169 |      * @param s The string to test. | 
| 170 |      * | 
| 171 |      * @return {@code true}, if {@code s} is case-insensitively equal to a Java keyword; {@code false}, if not. | 
| 172 |      */ | 
| 173 |     static boolean isKeyword( final String s ) | 
| 174 |     { | 
| 175 |         for ( final String keyword : KEYWORDS ) | 
| 176 |         { | 
| 177 |             if ( keyword.equalsIgnoreCase( s ) ) | 
| 178 |             { | 
| 179 |                 return true; | 
| 180 |             } | 
| 181 |         } | 
| 182 |   | 
| 183 |         return false; | 
| 184 |     } | 
| 185 |   | 
| 186 |     /** | 
| 187 |      * Tests whether a given string is case-insensitively equal to a Java boolean literal. | 
| 188 |      * | 
| 189 |      * @param s The string to test. | 
| 190 |      * | 
| 191 |      * @return {@code true}, if {@code s} is case-insensitively equal to a Java boolean literal; {@code false}, if not. | 
| 192 |      */ | 
| 193 |     static boolean isBooleanLiteral( final String s ) | 
| 194 |     { | 
| 195 |         for ( final String literal : BOOLEAN_LITERALS ) | 
| 196 |         { | 
| 197 |             if ( literal.equalsIgnoreCase( s ) ) | 
| 198 |             { | 
| 199 |                 return true; | 
| 200 |             } | 
| 201 |         } | 
| 202 |   | 
| 203 |         return false; | 
| 204 |     } | 
| 205 |   | 
| 206 |     /** | 
| 207 |      * Tests whether a given string is case-insensitively equal to the Java {@code null} literal. | 
| 208 |      * | 
| 209 |      * @param s The string to test. | 
| 210 |      * | 
| 211 |      * @return {@code true}, if {@code s} is case-insensitively equal to the Java ·{@code null} literal; {@code false}, | 
| 212 |      * if not. | 
| 213 |      */ | 
| 214 |     static boolean isNullLiteral( final String s ) | 
| 215 |     { | 
| 216 |         return NULL_LITERAL.equalsIgnoreCase( s ); | 
| 217 |     } | 
| 218 |   | 
| 219 | } |