NamingTools.java

  1. /*
  2.  * Copyright © 2017, Salesforce.com, Inc
  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 are met:
  7.  *     * Redistributions of source code must retain the above copyright
  8.  *       notice, this list of conditions and the following disclaimer.
  9.  *     * Redistributions in binary form must reproduce the above copyright
  10.  *       notice, this list of conditions and the following disclaimer in the
  11.  *       documentation and/or other materials provided with the distribution.
  12.  *     * Neither the name of the <organization> nor the
  13.  *       names of its contributors may be used to endorse or promote products
  14.  *       derived from this software without specific prior written permission.
  15.  *
  16.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  17.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  18.  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  19.  * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
  20.  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  21.  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  22.  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  23.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  24.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  25.  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26.  */
  27. package com.salesforce.apt.graph.naming;

  28. import javax.lang.model.element.Element;
  29. import javax.lang.model.element.ElementKind;

  30. public class NamingTools {
  31.  
  32.   /*
  33.   public String elementToName(Element element) {
  34.     switch (element.getKind()) {
  35.       case CLASS:
  36.         return element.toString();
  37.       case METHOD:
  38.         return element.getEnclosingElement().toString() + "." + element.toString();
  39.       case CONSTRUCTOR:
  40.         return element.getEnclosingElement().toString() + "." + element.toString();
  41.       default:
  42.         return element.toString();
  43.     }
  44.   }*/

  45.   public String elementToName(Element element) {
  46.     return elementToFileName(element);
  47.   }

  48.   /**
  49.    * Creates a unique name (suitable for storage) from an element.
  50.    * Note that nested class names must be delimited by '$' so that
  51.    * they may be used as filenames.
  52.    *
  53.    * @param element to turn in to a name.
  54.    * @return a uniquely identifying string.
  55.    */
  56.   public String elementToFileName(Element element) {
  57.     switch (element.getKind()) {
  58.       //case PACKAGE:
  59.       //  //so looks like there is difference between jdt and jdk here.... sigh.
  60.       //  //jdk returns the full package name on toString, jdt returns on the last part.
  61.       //  return element.asType().toString();  
  62.       case CLASS:
  63.         return  calculateClassName(element,  element.getSimpleName().toString());
  64.       case METHOD:
  65.         return elementToFileName(element.getEnclosingElement()) + "." + element.toString();
  66.       case CONSTRUCTOR:
  67.         return elementToFileName(element.getEnclosingElement()) + "." + element.toString();
  68.       default:
  69.         return element.toString();
  70.     }
  71.   }
  72.  
  73.   private String calculateClassName(Element element, String current) {
  74.     Element enclosing = element.getEnclosingElement();
  75.     if (enclosing.getKind() == ElementKind.PACKAGE) {
  76.       return element.toString().substring(0, element.toString().lastIndexOf(".")) + "." + current;
  77.     }
  78.     if (enclosing.getKind() == ElementKind.CLASS) {
  79.       return calculateClassName(element.getEnclosingElement(), enclosing.getSimpleName().toString() + "$" + current);
  80.     }
  81.     return element.toString();
  82.   }

  83. }