]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/translation/ValueRepository.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / parsing / translation / ValueRepository.java
1 package org.simantics.scl.compiler.internal.parsing.translation;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Collection;\r
5 \r
6 import org.simantics.scl.compiler.elaboration.errors.NotPatternException;\r
7 import org.simantics.scl.compiler.elaboration.expressions.EVar;\r
8 import org.simantics.scl.compiler.errors.Locations;\r
9 import org.simantics.scl.compiler.internal.parsing.declarations.DAnnotationAst;\r
10 import org.simantics.scl.compiler.internal.parsing.declarations.DValueAst;\r
11 \r
12 import gnu.trove.impl.Constants;\r
13 import gnu.trove.map.hash.THashMap;\r
14 import gnu.trove.map.hash.TObjectLongHashMap;\r
15 \r
16 public class ValueRepository {\r
17     THashMap<String, ArrayList<DValueAst>> values = \r
18             new THashMap<String, ArrayList<DValueAst>>();\r
19     THashMap<String, ArrayList<DAnnotationAst>> annotations = \r
20             new THashMap<String, ArrayList<DAnnotationAst>>();\r
21     TObjectLongHashMap<String> locations = new TObjectLongHashMap<String>(Constants.DEFAULT_CAPACITY, Constants.DEFAULT_LOAD_FACTOR,\r
22             Locations.NO_LOCATION); \r
23             \r
24     public String add(DValueAst value) throws NotPatternException {\r
25         EVar name = value.lhs.getPatternHead();\r
26         ArrayList<DValueAst> vs = values.get(name.name);\r
27         if(vs == null) {\r
28             vs = new ArrayList<DValueAst>(2);\r
29             values.put(name.name, vs);\r
30         }\r
31         long oldLocation = locations.get(name.name);\r
32         if(oldLocation == Locations.NO_LOCATION || name.location < oldLocation)\r
33             locations.put(name.name, name.location);\r
34         vs.add(value);\r
35         return name.name;\r
36     }\r
37     \r
38     public void addDefinitions(String name, ArrayList<DValueAst> valueList) {\r
39         ArrayList<DValueAst> vs = values.get(name);\r
40         if(vs == null) {\r
41             vs = new ArrayList<DValueAst>(valueList.size());\r
42             values.put(name, vs);\r
43         }\r
44         vs.addAll(valueList);\r
45     }\r
46     \r
47     public void addAnnotation(String name, DAnnotationAst annotation) {\r
48         ArrayList<DAnnotationAst> as = annotations.get(name);\r
49         if(as == null) {\r
50             as = new ArrayList<DAnnotationAst>(2);\r
51             annotations.put(name, as);\r
52         }\r
53         as.add(annotation);\r
54     }\r
55     \r
56     public void addAnnotations(String name, ArrayList<DAnnotationAst> annotationList) {\r
57         ArrayList<DAnnotationAst> as = annotations.get(name);\r
58         if(as == null) {\r
59             as = new ArrayList<DAnnotationAst>(annotationList.size());\r
60             annotations.put(name, as);\r
61         }\r
62         as.addAll(annotationList);\r
63     }\r
64     \r
65     public Collection<String> getValueNames() {\r
66         return values.keySet();\r
67     }\r
68 \r
69     public ArrayList<DValueAst> getDefinition(String name) {\r
70         return values.get(name);\r
71     }\r
72 \r
73     public ArrayList<DAnnotationAst> getAnnotations(String name) {\r
74         return annotations.get(name);\r
75     }\r
76 \r
77     public void addFrom(ValueRepository repo, String oldName, String newName) {\r
78         addDefinitions(newName, repo.getDefinition(oldName));\r
79         \r
80         ArrayList<DAnnotationAst> as = repo.getAnnotations(oldName);\r
81         if(as != null)\r
82             addAnnotations(newName, as);\r
83     }\r
84 \r
85     public long getLocation(String name) {\r
86         return locations.get(name);\r
87     }\r
88 }\r