1 package com.github.javaparser.symbolsolver.resolution.typeinference; 2 3 import com.github.javaparser.ast.expr.LambdaExpr; 4 import com.github.javaparser.resolution.types.ResolvedType; 5 import com.github.javaparser.symbolsolver.model.resolution.TypeSolver; 6 7 import java.util.*; 8 9 /** 10 * @author Federico Tomassetti 11 */ 12 public class TypeInferenceCache { 13 14 private static Map<TypeSolver, IdentityHashMap<LambdaExpr, Map<String, ResolvedType>>> typeForLambdaParameters = new HashMap<>(); 15 private static Map<TypeSolver, IdentityHashMap<LambdaExpr, List<InferenceVariable>>> inferenceVariables = new HashMap<>(); 16 record(TypeSolver typeSolver, LambdaExpr lambdaExpr, String paramName, ResolvedType type)17 public static void record(TypeSolver typeSolver, LambdaExpr lambdaExpr, String paramName, ResolvedType type) { 18 if (!typeForLambdaParameters.containsKey(typeSolver)) { 19 typeForLambdaParameters.put(typeSolver, new IdentityHashMap<>()); 20 } 21 if (!typeForLambdaParameters.get(typeSolver).containsKey(lambdaExpr)) { 22 typeForLambdaParameters.get(typeSolver).put(lambdaExpr, new HashMap<>()); 23 } 24 typeForLambdaParameters.get(typeSolver).get(lambdaExpr).put(paramName, type); 25 } 26 retrieve(TypeSolver typeSolver, LambdaExpr lambdaExpr, String paramName)27 public static Optional<ResolvedType> retrieve(TypeSolver typeSolver, LambdaExpr lambdaExpr, String paramName) { 28 if (!typeForLambdaParameters.containsKey(typeSolver)) { 29 return Optional.empty(); 30 } 31 if (!typeForLambdaParameters.get(typeSolver).containsKey(lambdaExpr)) { 32 return Optional.empty(); 33 } 34 if (!typeForLambdaParameters.get(typeSolver).get(lambdaExpr).containsKey(paramName)) { 35 return Optional.empty(); 36 } 37 return Optional.of(typeForLambdaParameters.get(typeSolver).get(lambdaExpr).get(paramName)); 38 } 39 recordInferenceVariables(TypeSolver typeSolver, LambdaExpr lambdaExpr, List<InferenceVariable> _inferenceVariables)40 public static void recordInferenceVariables(TypeSolver typeSolver, LambdaExpr lambdaExpr, List<InferenceVariable> _inferenceVariables) { 41 if (!inferenceVariables.containsKey(typeSolver)) { 42 inferenceVariables.put(typeSolver, new IdentityHashMap<>()); 43 } 44 inferenceVariables.get(typeSolver).put(lambdaExpr, _inferenceVariables); 45 } 46 retrieveInferenceVariables(TypeSolver typeSolver, LambdaExpr lambdaExpr)47 public static Optional<List<InferenceVariable>> retrieveInferenceVariables(TypeSolver typeSolver, LambdaExpr lambdaExpr) { 48 if (!inferenceVariables.containsKey(typeSolver)) { 49 return Optional.empty(); 50 } 51 if (!inferenceVariables.get(typeSolver).containsKey(lambdaExpr)) { 52 return Optional.empty(); 53 } 54 return Optional.of(inferenceVariables.get(typeSolver).get(lambdaExpr)); 55 } 56 } 57