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