1 /*******************************************************************************
2  * Copyright (c) 2005, 2015 IBM Corporation and others.
3  *
4  * This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License 2.0
6  * which accompanies this distribution, and is available at
7  * https://www.eclipse.org/legal/epl-2.0/
8  *
9  * SPDX-License-Identifier: EPL-2.0
10  *
11  * Contributors:
12  *     IBM Corporation - initial API and implementation
13  *******************************************************************************/
14 
15 package org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets;
16 
17 import java.util.LinkedHashMap;
18 import java.util.Map;
19 
20 import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.types.TType;
21 import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.types.TypeEnvironment;
22 
23 
24 
25 public class TypeSetEnvironment {
26 
27 	private final TypeEnvironment fTypeEnvironment;
28 	private final TypeUniverseSet fUniverse;
29 	private final EmptyTypeSet fEmptyTypeSet;
30 
31 	private final Map<TType, SubTypesOfSingleton> fSubtypesOfSingletons= new LinkedHashMap<>();//@perf
32 	private final Map<TypeSet, SubTypesSet> fSubTypesSets= new LinkedHashMap<>();//@perf
33 	private final Map<TType, SuperTypesOfSingleton> fSuperTypesOfSingletons= new LinkedHashMap<>();//@perf
34 	private final Map<Object, SuperTypesSet> fSuperTypesSets= new LinkedHashMap<>();//@perf
35 
36 	private int fgCommonExprHits= 0;
37 	private int fgCommonExprMisses= 0;
38 
TypeSetEnvironment(TypeEnvironment typeEnvironment)39 	public TypeSetEnvironment(TypeEnvironment typeEnvironment) {
40 		fTypeEnvironment= typeEnvironment;
41 		fUniverse= new TypeUniverseSet(this);
42 		fEmptyTypeSet= new EmptyTypeSet(this);
43 	}
44 
getJavaLangObject()45 	public TType getJavaLangObject() {
46 		return fTypeEnvironment.getJavaLangObject();
47 	}
48 
getUniverseTypeSet()49 	public TypeUniverseSet getUniverseTypeSet() {
50 		return fUniverse;
51 	}
52 
getEmptyTypeSet()53 	public EmptyTypeSet getEmptyTypeSet() {
54 		return fEmptyTypeSet;
55 	}
56 
createSubTypesOfSingleton(TType superType)57 	public SubTypesOfSingleton createSubTypesOfSingleton(TType superType) {
58 		if (superType.isJavaLangObject())
59 			return this.getUniverseTypeSet();
60 		if (fSubtypesOfSingletons.containsKey(superType)) {
61 			fgCommonExprHits++;
62 			return fSubtypesOfSingletons.get(superType);
63 		} else {
64 			SubTypesOfSingleton s= new SubTypesOfSingleton(superType, this);
65 
66 			fgCommonExprMisses++;
67 			fSubtypesOfSingletons.put(superType, s);
68 			return s;
69 		}
70 	}
71 
createSubTypesSet(TypeSet superTypes)72 	public SubTypesSet createSubTypesSet(TypeSet superTypes) {
73 		if (fSubTypesSets.containsKey(superTypes)) {
74 			fgCommonExprHits++;
75 			return fSubTypesSets.get(superTypes);
76 		} else {
77 			SubTypesSet s= new SubTypesSet(superTypes);
78 
79 			fgCommonExprMisses++;
80 			fSubTypesSets.put(superTypes, s);
81 			return s;
82 		}
83 	}
84 
createSuperTypesOfSingleton(TType subType)85 	public SuperTypesOfSingleton createSuperTypesOfSingleton(TType subType) {
86 		if (fSuperTypesOfSingletons.containsKey(subType)) {
87 			fgCommonExprHits++;
88 			return fSuperTypesOfSingletons.get(subType);
89 		} else {
90 			SuperTypesOfSingleton s= new SuperTypesOfSingleton(subType, this);
91 
92 			fgCommonExprMisses++;
93 			fSuperTypesOfSingletons.put(subType, s);
94 			return s;
95 		}
96 	}
97 
createSuperTypesSet(TType subType)98 	public SuperTypesSet createSuperTypesSet(TType subType) {
99 		if (fSuperTypesSets.containsKey(subType)) {
100 			fgCommonExprHits++;
101 			return fSuperTypesSets.get(subType);
102 		} else {
103 			SuperTypesSet s= new SuperTypesSet(subType, this);
104 
105 			fgCommonExprMisses++;
106 			fSuperTypesSets.put(subType, s);
107 			return s;
108 		}
109 	}
110 
createSuperTypesSet(TypeSet subTypes)111 	public SuperTypesSet createSuperTypesSet(TypeSet subTypes) {
112 		if (fSuperTypesSets.containsKey(subTypes))
113 			return fSuperTypesSets.get(subTypes);
114 		else {
115 			SuperTypesSet s= new SuperTypesSet(subTypes, this);
116 
117 			fSuperTypesSets.put(subTypes, s);
118 			return s;
119 		}
120 	}
121 
dumpStats()122 	public void dumpStats() {
123 		System.out.println("Common expression hits:   " + fgCommonExprHits); //$NON-NLS-1$
124 		System.out.println("Common expression misses: " + fgCommonExprMisses); //$NON-NLS-1$
125 	}
126 
127 }
128