/src/main/scala/de/tud/cs/st/bat/resolved/ReverseMapping.scala

http://github.com/Delors/BAT · Scala · 94 lines · 38 code · 10 blank · 46 comment · 5 complexity · 600fe9fbd82c5a9853137f3f0673e946 MD5 · raw file

  1. /* License (BSD Style License):
  2. * Copyright (c) 2009, 2011
  3. * Software Technology Group
  4. * Department of Computer Science
  5. * Technische Universit?t Darmstadt
  6. * All rights reserved.
  7. *
  8. * Redistribution and use in source and binary forms, with or without
  9. * modification, are permitted provided that the following conditions are met:
  10. *
  11. * - Redistributions of source code must retain the above copyright notice,
  12. * this list of conditions and the following disclaimer.
  13. * - Redistributions in binary form must reproduce the above copyright notice,
  14. * this list of conditions and the following disclaimer in the documentation
  15. * and/or other materials provided with the distribution.
  16. * - Neither the name of the Software Technology Group or Technische
  17. * Universit?t Darmstadt nor the names of its contributors may be used to
  18. * endorse or promote products derived from this software without specific
  19. * prior written permission.
  20. *
  21. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  22. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24. * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  25. * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  26. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  27. * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  28. * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  29. * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  30. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  31. * POSSIBILITY OF SUCH DAMAGE.
  32. */
  33. package de.tud.cs.st.bat.resolved
  34. /**
  35. * Associates each unique ID with its underlying source element.
  36. *
  37. * @author Michael Eichberg
  38. */
  39. trait ReverseMapping extends CategorizedSourceElementIDs {
  40. private[this] val typeIDs = new scala.collection.mutable.ArrayBuffer[Type](50000)
  41. private[this] val fieldIDs = new scala.collection.mutable.ArrayBuffer[(ObjectType, String)](100000)
  42. private[this] val methodIDs = new scala.collection.mutable.ArrayBuffer[(ReferenceType, String, MethodDescriptor)](250000)
  43. abstract override def sourceElementID(t: Type): Int = {
  44. val id = super.sourceElementID(t)
  45. val index = id - LOWEST_TYPE_ID
  46. if (index >= typeIDs.size) // the type may already have an associated ID
  47. typeIDs.insert(index, t)
  48. id
  49. }
  50. abstract override def sourceElementID(declaringType: ObjectType, fieldName: String): Int = {
  51. val id = super.sourceElementID(declaringType, fieldName)
  52. val index = id - LOWEST_FIELD_ID
  53. if (index >= fieldIDs.size)
  54. fieldIDs.insert(index, (declaringType, fieldName))
  55. id
  56. }
  57. abstract override def sourceElementID(declaringType: ReferenceType, methodName: String, methodDescriptor: MethodDescriptor): Int = {
  58. val id = super.sourceElementID(declaringType, methodName, methodDescriptor)
  59. val index = id - LOWEST_METHOD_ID
  60. if (index >= methodIDs.size)
  61. methodIDs.insert(index, (declaringType, methodName, methodDescriptor))
  62. id
  63. }
  64. /**
  65. * Returns a human readable representation of the source element identified by the
  66. * given id.
  67. *
  68. * @param id A valid identifier; i.e., an id returned by one of the sourceElementID methods.
  69. * If the id is not valid, the behavior is undefined.
  70. */
  71. def sourceElementIDtoString(id: Int): String = {
  72. if (id < LOWEST_FIELD_ID) {
  73. return typeIDs(id - LOWEST_TYPE_ID).toJava
  74. }
  75. // ID >= LOWEST_FIELD_ID
  76. if (id < LOWEST_METHOD_ID) {
  77. val (declaringType, fieldName) = fieldIDs(id - LOWEST_FIELD_ID)
  78. return declaringType.toJava+"."+fieldName
  79. }
  80. // ID >= LOWEST_METHOD_ID
  81. val (declaringType, methodName, methodDescriptor) = methodIDs(id - LOWEST_METHOD_ID)
  82. return declaringType.toJava+"."+methodName+""+(methodDescriptor.toUMLNotation)
  83. }
  84. }