PageRenderTime 37ms CodeModel.GetById 31ms app.highlight 2ms RepoModel.GetById 0ms app.codeStats 0ms

/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
Possible License(s): Apache-2.0
 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 */
33package de.tud.cs.st.bat.resolved
34
35/**
36 * Associates each unique ID with its underlying source element.
37 *
38 * @author Michael Eichberg
39 */
40trait ReverseMapping extends CategorizedSourceElementIDs {
41
42    private[this] val typeIDs = new scala.collection.mutable.ArrayBuffer[Type](50000)
43
44    private[this] val fieldIDs = new scala.collection.mutable.ArrayBuffer[(ObjectType, String)](100000)
45
46    private[this] val methodIDs = new scala.collection.mutable.ArrayBuffer[(ReferenceType, String, MethodDescriptor)](250000)
47
48    abstract override def sourceElementID(t: Type): Int = {
49        val id = super.sourceElementID(t)
50        val index = id - LOWEST_TYPE_ID
51        if (index >= typeIDs.size) // the type may already have an associated ID
52            typeIDs.insert(index, t)
53        id
54    }
55
56    abstract override def sourceElementID(declaringType: ObjectType, fieldName: String): Int = {
57        val id = super.sourceElementID(declaringType, fieldName)
58        val index = id - LOWEST_FIELD_ID
59        if (index >= fieldIDs.size)
60            fieldIDs.insert(index, (declaringType, fieldName))
61        id
62    }
63
64    abstract override def sourceElementID(declaringType: ReferenceType, methodName: String, methodDescriptor: MethodDescriptor): Int = {
65        val id = super.sourceElementID(declaringType, methodName, methodDescriptor)
66        val index = id - LOWEST_METHOD_ID
67        if (index >= methodIDs.size)
68            methodIDs.insert(index, (declaringType, methodName, methodDescriptor))
69        id
70    }
71
72    /**
73     * Returns a human readable representation of the source element identified by the
74     * given id.
75     *
76     * @param id A valid identifier; i.e., an id returned by one of the sourceElementID methods.
77     *  If the id is not valid, the behavior is undefined.
78     */
79    def sourceElementIDtoString(id: Int): String = {
80        if (id < LOWEST_FIELD_ID) {
81            return typeIDs(id - LOWEST_TYPE_ID).toJava
82        }
83        // ID >= LOWEST_FIELD_ID
84        if (id < LOWEST_METHOD_ID) {
85            val (declaringType, fieldName) = fieldIDs(id - LOWEST_FIELD_ID)
86            return declaringType.toJava+"."+fieldName
87        }
88
89        // ID >= LOWEST_METHOD_ID
90        val (declaringType, methodName, methodDescriptor) = methodIDs(id - LOWEST_METHOD_ID)
91        return declaringType.toJava+"."+methodName+""+(methodDescriptor.toUMLNotation)
92    }
93
94}