Federico Tomassetti | b36f330 | 2015-10-30 10:53:10 +0100 | [diff] [blame] | 1 | package me.tomassetti.symbolsolver.resolution.typesolvers; |
Federico Tomassetti | b30d5c1 | 2015-08-01 08:29:42 +0200 | [diff] [blame] | 2 | |
Federico Tomassetti | 630eb94 | 2015-08-03 08:37:52 +0200 | [diff] [blame] | 3 | import me.tomassetti.symbolsolver.model.declarations.TypeDeclaration; |
Federico Tomassetti | 4a18b1e | 2015-11-13 10:59:15 +0100 | [diff] [blame] | 4 | import me.tomassetti.symbolsolver.model.resolution.SymbolReference; |
| 5 | import me.tomassetti.symbolsolver.model.resolution.TypeSolver; |
Federico Tomassetti | 8e655d3 | 2015-11-22 11:45:05 +0100 | [diff] [blame^] | 6 | import me.tomassetti.symbolsolver.javaparsermodel.UnsolvedSymbolException; |
Federico Tomassetti | b30d5c1 | 2015-08-01 08:29:42 +0200 | [diff] [blame] | 7 | |
Federico Tomassetti | d420a49 | 2015-08-02 17:54:31 +0200 | [diff] [blame] | 8 | import java.util.ArrayList; |
Federico Tomassetti | d420a49 | 2015-08-02 17:54:31 +0200 | [diff] [blame] | 9 | import java.util.List; |
| 10 | |
Federico Tomassetti | b30d5c1 | 2015-08-01 08:29:42 +0200 | [diff] [blame] | 11 | public class CombinedTypeSolver implements TypeSolver { |
| 12 | |
Federico Tomassetti | 0e81f51 | 2015-10-30 23:37:45 +0100 | [diff] [blame] | 13 | private TypeSolver parent; |
Federico Tomassetti | 49719b4 | 2015-11-02 21:33:40 +0100 | [diff] [blame] | 14 | private List<TypeSolver> elements = new ArrayList<>(); |
Federico Tomassetti | 0e81f51 | 2015-10-30 23:37:45 +0100 | [diff] [blame] | 15 | |
Federico Tomassetti | 767fd20 | 2015-11-02 20:20:57 +0100 | [diff] [blame] | 16 | public CombinedTypeSolver(TypeSolver... elements) { |
| 17 | for (TypeSolver el : elements) { |
| 18 | add(el); |
| 19 | } |
| 20 | } |
| 21 | |
Federico Tomassetti | 0e81f51 | 2015-10-30 23:37:45 +0100 | [diff] [blame] | 22 | @Override |
Federico Tomassetti | 49719b4 | 2015-11-02 21:33:40 +0100 | [diff] [blame] | 23 | public TypeSolver getParent() { |
| 24 | return parent; |
| 25 | } |
| 26 | |
| 27 | @Override |
Federico Tomassetti | 0e81f51 | 2015-10-30 23:37:45 +0100 | [diff] [blame] | 28 | public void setParent(TypeSolver parent) { |
| 29 | this.parent = parent; |
| 30 | } |
| 31 | |
Federico Tomassetti | 49719b4 | 2015-11-02 21:33:40 +0100 | [diff] [blame] | 32 | public void add(TypeSolver typeSolver) { |
Federico Tomassetti | d420a49 | 2015-08-02 17:54:31 +0200 | [diff] [blame] | 33 | this.elements.add(typeSolver); |
Federico Tomassetti | 0e81f51 | 2015-10-30 23:37:45 +0100 | [diff] [blame] | 34 | typeSolver.setParent(this); |
Federico Tomassetti | d420a49 | 2015-08-02 17:54:31 +0200 | [diff] [blame] | 35 | } |
| 36 | |
Federico Tomassetti | b30d5c1 | 2015-08-01 08:29:42 +0200 | [diff] [blame] | 37 | @Override |
| 38 | public SymbolReference<TypeDeclaration> tryToSolveType(String name) { |
Federico Tomassetti | 49719b4 | 2015-11-02 21:33:40 +0100 | [diff] [blame] | 39 | for (TypeSolver ts : elements) { |
Federico Tomassetti | d420a49 | 2015-08-02 17:54:31 +0200 | [diff] [blame] | 40 | SymbolReference<TypeDeclaration> res = ts.tryToSolveType(name); |
| 41 | if (res.isSolved()) { |
| 42 | return res; |
| 43 | } |
| 44 | } |
| 45 | return SymbolReference.unsolved(TypeDeclaration.class); |
Federico Tomassetti | b30d5c1 | 2015-08-01 08:29:42 +0200 | [diff] [blame] | 46 | } |
| 47 | |
| 48 | @Override |
| 49 | public TypeDeclaration solveType(String name) throws UnsolvedSymbolException { |
Federico Tomassetti | d420a49 | 2015-08-02 17:54:31 +0200 | [diff] [blame] | 50 | SymbolReference<TypeDeclaration> res = tryToSolveType(name); |
| 51 | if (res.isSolved()) { |
| 52 | return res.getCorrespondingDeclaration(); |
| 53 | } else { |
Federico Tomassetti | 0c4c859 | 2015-08-21 23:00:06 +0200 | [diff] [blame] | 54 | throw new UnsolvedSymbolException(name); |
Federico Tomassetti | d420a49 | 2015-08-02 17:54:31 +0200 | [diff] [blame] | 55 | } |
Federico Tomassetti | b30d5c1 | 2015-08-01 08:29:42 +0200 | [diff] [blame] | 56 | } |
| 57 | } |