blob: e7ded3e6bedbe6451fe570d96aa05296077fd148 [file] [log] [blame]
Federico Tomassettib36f3302015-10-30 10:53:10 +01001package me.tomassetti.symbolsolver.resolution.typesolvers;
Federico Tomassettib30d5c12015-08-01 08:29:42 +02002
Federico Tomassetti630eb942015-08-03 08:37:52 +02003import me.tomassetti.symbolsolver.model.declarations.TypeDeclaration;
Federico Tomassetti4a18b1e2015-11-13 10:59:15 +01004import me.tomassetti.symbolsolver.model.resolution.SymbolReference;
5import me.tomassetti.symbolsolver.model.resolution.TypeSolver;
Federico Tomassetti8e655d32015-11-22 11:45:05 +01006import me.tomassetti.symbolsolver.javaparsermodel.UnsolvedSymbolException;
Federico Tomassettib30d5c12015-08-01 08:29:42 +02007
Federico Tomassettid420a492015-08-02 17:54:31 +02008import java.util.ArrayList;
Federico Tomassettid420a492015-08-02 17:54:31 +02009import java.util.List;
10
Federico Tomassettib30d5c12015-08-01 08:29:42 +020011public class CombinedTypeSolver implements TypeSolver {
12
Federico Tomassetti0e81f512015-10-30 23:37:45 +010013 private TypeSolver parent;
Federico Tomassetti49719b42015-11-02 21:33:40 +010014 private List<TypeSolver> elements = new ArrayList<>();
Federico Tomassetti0e81f512015-10-30 23:37:45 +010015
Federico Tomassetti767fd202015-11-02 20:20:57 +010016 public CombinedTypeSolver(TypeSolver... elements) {
17 for (TypeSolver el : elements) {
18 add(el);
19 }
20 }
21
Federico Tomassetti0e81f512015-10-30 23:37:45 +010022 @Override
Federico Tomassetti49719b42015-11-02 21:33:40 +010023 public TypeSolver getParent() {
24 return parent;
25 }
26
27 @Override
Federico Tomassetti0e81f512015-10-30 23:37:45 +010028 public void setParent(TypeSolver parent) {
29 this.parent = parent;
30 }
31
Federico Tomassetti49719b42015-11-02 21:33:40 +010032 public void add(TypeSolver typeSolver) {
Federico Tomassettid420a492015-08-02 17:54:31 +020033 this.elements.add(typeSolver);
Federico Tomassetti0e81f512015-10-30 23:37:45 +010034 typeSolver.setParent(this);
Federico Tomassettid420a492015-08-02 17:54:31 +020035 }
36
Federico Tomassettib30d5c12015-08-01 08:29:42 +020037 @Override
38 public SymbolReference<TypeDeclaration> tryToSolveType(String name) {
Federico Tomassetti49719b42015-11-02 21:33:40 +010039 for (TypeSolver ts : elements) {
Federico Tomassettid420a492015-08-02 17:54:31 +020040 SymbolReference<TypeDeclaration> res = ts.tryToSolveType(name);
41 if (res.isSolved()) {
42 return res;
43 }
44 }
45 return SymbolReference.unsolved(TypeDeclaration.class);
Federico Tomassettib30d5c12015-08-01 08:29:42 +020046 }
47
48 @Override
49 public TypeDeclaration solveType(String name) throws UnsolvedSymbolException {
Federico Tomassettid420a492015-08-02 17:54:31 +020050 SymbolReference<TypeDeclaration> res = tryToSolveType(name);
51 if (res.isSolved()) {
52 return res.getCorrespondingDeclaration();
53 } else {
Federico Tomassetti0c4c8592015-08-21 23:00:06 +020054 throw new UnsolvedSymbolException(name);
Federico Tomassettid420a492015-08-02 17:54:31 +020055 }
Federico Tomassettib30d5c12015-08-01 08:29:42 +020056 }
57}