]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.databoard/src/org/simantics/databoard/binding/util/IsReferableQuery.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.databoard / src / org / simantics / databoard / binding / util / IsReferableQuery.java
1 /*******************************************************************************\r
2  * Copyright (c) 2010- Association for Decentralized Information Management in\r
3  * Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  * \r
9  * Contributors:\r
10  *    VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.databoard.binding.util;\r
13 \r
14 import java.util.IdentityHashMap;\r
15 \r
16 import org.simantics.databoard.type.ArrayType;\r
17 import org.simantics.databoard.type.BooleanType;\r
18 import org.simantics.databoard.type.ByteType;\r
19 import org.simantics.databoard.type.Component;\r
20 import org.simantics.databoard.type.Datatype;\r
21 import org.simantics.databoard.type.Datatype.Visitor;\r
22 import org.simantics.databoard.type.DoubleType;\r
23 import org.simantics.databoard.type.FloatType;\r
24 import org.simantics.databoard.type.IntegerType;\r
25 import org.simantics.databoard.type.LongType;\r
26 import org.simantics.databoard.type.MapType;\r
27 import org.simantics.databoard.type.OptionalType;\r
28 import org.simantics.databoard.type.RecordType;\r
29 import org.simantics.databoard.type.StringType;\r
30 import org.simantics.databoard.type.UnionType;\r
31 import org.simantics.databoard.type.VariantType;\r
32 \r
33 public class IsReferableQuery implements Visitor<Result> {\r
34         \r
35         public static Result isReferable(Datatype type) {\r
36                 IsReferableQuery query = new IsReferableQuery();\r
37                 Result result = type.accept(query);\r
38                 return result;\r
39         }\r
40         \r
41         IdentityHashMap<Datatype, Result> visited = new IdentityHashMap<Datatype, Result>();    \r
42         \r
43         @Override\r
44         public Result visit(ArrayType b) {\r
45                 visited.put(b, Result.No);\r
46                 Datatype ct = b.componentType();\r
47                 Result cr = visited.get(ct);\r
48                 if (cr!=null) return cr;                \r
49                 cr = ct.accept(this);\r
50                 if (cr!=Result.No) visited.put(b, cr);          \r
51                 return cr; \r
52         }\r
53 \r
54         @Override\r
55         public Result visit(BooleanType b) {\r
56                 return null;\r
57         }\r
58 \r
59         @Override\r
60         public Result visit(DoubleType b) {\r
61                 return null;\r
62         }\r
63 \r
64         @Override\r
65         public Result visit(FloatType b) {\r
66                 return null;\r
67         }\r
68 \r
69         @Override\r
70         public Result visit(IntegerType b) {\r
71                 return null;\r
72         }\r
73 \r
74         @Override\r
75         public Result visit(ByteType b) {\r
76                 return null;\r
77         }\r
78 \r
79         @Override\r
80         public Result visit(LongType b) {\r
81                 return null;\r
82         }\r
83 \r
84         @Override\r
85         public Result visit(OptionalType b) {\r
86                 visited.put(b, Result.No);\r
87                 Datatype ct = b.getComponentType();\r
88                 Result cr = visited.get(ct);\r
89                 if (cr!=null) return cr;                \r
90                 cr = ct.accept(this);\r
91                 if (cr!=Result.No) visited.put(b, cr);          \r
92                 return cr; \r
93         }\r
94 \r
95         @Override\r
96         public Result visit(RecordType b) {             \r
97                 if (b.isReferable()) {\r
98                         visited.put(b, Result.Yes);\r
99                         return Result.Yes;\r
100                 }\r
101                                 \r
102                 Result result = Result.No;\r
103                 visited.put(b, result);\r
104                 \r
105                 for (Component c : b.getComponents()) {\r
106                         Datatype ct = c.type;\r
107                         \r
108                         Result cr = visited.get(ct);\r
109                         if (cr==null) cr = ct.accept(this);\r
110                         if (cr!=null) {\r
111                                 if (cr == Result.Yes) {\r
112                                         result = cr;\r
113                                         break;\r
114                                 }\r
115                                 if (cr == Result.Possible) {\r
116                                         result = cr;                                    \r
117                                 }\r
118                         }                       \r
119                 }\r
120                 \r
121                 if (result!=Result.No) visited.put(b, result);          \r
122                 return result;\r
123         }\r
124 \r
125         @Override\r
126         public Result visit(StringType b) {\r
127                 return Result.No;\r
128         }\r
129 \r
130         @Override\r
131         public Result visit(UnionType b) {\r
132                 Result result = Result.No;\r
133                 visited.put(b, result);\r
134                 \r
135                 for (Component c : b.getComponents()) {\r
136                         Datatype ct = c.type;\r
137                         \r
138                         Result cr = visited.get(ct);\r
139                         if (cr==null) cr = ct.accept(this);\r
140                         if (cr!=null) {\r
141                                 if (cr == Result.Yes) {\r
142                                         result = cr;\r
143                                         break;\r
144                                 }\r
145                                 if (cr == Result.Possible) {\r
146                                         result = cr;                                    \r
147                                 }\r
148                         }                       \r
149                 }\r
150                 \r
151                 if (result!=Result.No) visited.put(b, result);          \r
152                 return result;\r
153         }\r
154 \r
155         @Override\r
156         public Result visit(VariantType b) {\r
157                 return Result.Possible;\r
158         }\r
159 \r
160         @Override\r
161         public Result visit(MapType b) {\r
162                 visited.put(b, Result.No);\r
163                 Datatype kt = b.keyType;\r
164                 Result kr = visited.get(kt);\r
165                 if (kr == null) kr = kt.accept(this);\r
166                 \r
167                 Datatype vt = b.valueType;\r
168                 Result vr = visited.get(vt);\r
169                 if (vr == null) vr = vt.accept(this);\r
170                 \r
171                 Result result = Result.No;\r
172                 if (kr==Result.Yes || vr==Result.Yes) result = Result.Yes;\r
173                 else if (kr==Result.Possible || vr==Result.Possible) result = Result.Possible;\r
174 \r
175                 if (result!=Result.No) \r
176                         visited.put(b, Result.No);\r
177                 \r
178                 return result; \r
179         }\r
180         \r
181 }\r
182 \r