blob: 85402a4029c8870b801649eee3ff423ed62ae266 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2015 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets;
import java.util.LinkedHashMap;
import java.util.Map;
import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.types.TType;
import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.types.TypeEnvironment;
public class TypeSetEnvironment {
private final TypeEnvironment fTypeEnvironment;
private final TypeUniverseSet fUniverse;
private final EmptyTypeSet fEmptyTypeSet;
private final Map<TType, SubTypesOfSingleton> fSubtypesOfSingletons= new LinkedHashMap<>();//@perf
private final Map<TypeSet, SubTypesSet> fSubTypesSets= new LinkedHashMap<>();//@perf
private final Map<TType, SuperTypesOfSingleton> fSuperTypesOfSingletons= new LinkedHashMap<>();//@perf
private final Map<Object, SuperTypesSet> fSuperTypesSets= new LinkedHashMap<>();//@perf
private int fgCommonExprHits= 0;
private int fgCommonExprMisses= 0;
public TypeSetEnvironment(TypeEnvironment typeEnvironment) {
fTypeEnvironment= typeEnvironment;
fUniverse= new TypeUniverseSet(this);
fEmptyTypeSet= new EmptyTypeSet(this);
}
public TType getJavaLangObject() {
return fTypeEnvironment.getJavaLangObject();
}
public TypeUniverseSet getUniverseTypeSet() {
return fUniverse;
}
public EmptyTypeSet getEmptyTypeSet() {
return fEmptyTypeSet;
}
public SubTypesOfSingleton createSubTypesOfSingleton(TType superType) {
if (superType.isJavaLangObject())
return this.getUniverseTypeSet();
if (fSubtypesOfSingletons.containsKey(superType)) {
fgCommonExprHits++;
return fSubtypesOfSingletons.get(superType);
} else {
SubTypesOfSingleton s= new SubTypesOfSingleton(superType, this);
fgCommonExprMisses++;
fSubtypesOfSingletons.put(superType, s);
return s;
}
}
public SubTypesSet createSubTypesSet(TypeSet superTypes) {
if (fSubTypesSets.containsKey(superTypes)) {
fgCommonExprHits++;
return fSubTypesSets.get(superTypes);
} else {
SubTypesSet s= new SubTypesSet(superTypes);
fgCommonExprMisses++;
fSubTypesSets.put(superTypes, s);
return s;
}
}
public SuperTypesOfSingleton createSuperTypesOfSingleton(TType subType) {
if (fSuperTypesOfSingletons.containsKey(subType)) {
fgCommonExprHits++;
return fSuperTypesOfSingletons.get(subType);
} else {
SuperTypesOfSingleton s= new SuperTypesOfSingleton(subType, this);
fgCommonExprMisses++;
fSuperTypesOfSingletons.put(subType, s);
return s;
}
}
public SuperTypesSet createSuperTypesSet(TType subType) {
if (fSuperTypesSets.containsKey(subType)) {
fgCommonExprHits++;
return fSuperTypesSets.get(subType);
} else {
SuperTypesSet s= new SuperTypesSet(subType, this);
fgCommonExprMisses++;
fSuperTypesSets.put(subType, s);
return s;
}
}
public SuperTypesSet createSuperTypesSet(TypeSet subTypes) {
if (fSuperTypesSets.containsKey(subTypes))
return fSuperTypesSets.get(subTypes);
else {
SuperTypesSet s= new SuperTypesSet(subTypes, this);
fSuperTypesSets.put(subTypes, s);
return s;
}
}
public void dumpStats() {
System.out.println("Common expression hits: " + fgCommonExprHits); //$NON-NLS-1$
System.out.println("Common expression misses: " + fgCommonExprMisses); //$NON-NLS-1$
}
}