]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.graph.compiler/src/org/simantics/graph/compiler/internal/parsing/SourceSplitter.java
Fixed multiple issues causing dangling references to discarded queries
[simantics/platform.git] / bundles / org.simantics.graph.compiler / src / org / simantics / graph / compiler / internal / parsing / SourceSplitter.java
1 package org.simantics.graph.compiler.internal.parsing;
2
3 import java.io.InputStream;
4 import java.nio.charset.Charset;
5 import java.util.ArrayList;
6
7 import org.simantics.databoard.util.StreamUtil;
8
9 public class SourceSplitter {
10         
11         public static class SplitPoint {
12                 public final int characterId;
13                 public final int lineId;
14                 
15                 public SplitPoint(int characterId, int lineId) {
16                         this.characterId = characterId;
17                         this.lineId = lineId;
18                 }
19         }
20         
21         public static ArrayList<SplitPoint> split(String source, int minSplit) {
22                 int length = source.length();
23                 int inPar = 0;
24                 int lineId = 0;
25                 int lastSplit = 0;
26                 ArrayList<SplitPoint> result = new ArrayList<SplitPoint>();
27                 result.add(new SplitPoint(0, 0));
28                 loop: for(int i=0;i<length;++i) {
29                         char c = source.charAt(i);
30
31                         switch(c) {
32                         case '/':
33                                 ++i;
34                                 c = source.charAt(i);
35                                 if(c == '/') {
36                                         do {
37                                                 ++i;
38                                                 if(i == length)
39                                                         break loop;
40                                         } while(source.charAt(i) != '\n');
41                                         --i;
42                                 }
43                                 else if(c == '*') {
44                                         ++i;
45                                         if(source.charAt(i) == '\n')
46                                                 ++lineId;
47                                         do {
48                                                 ++i;
49                                                 if(i >= length)
50                                                         break loop;
51                                                 c = source.charAt(i);
52                                                 if(c == '\n')
53                                                         ++lineId;
54                                         } while(c != '/' || source.charAt(i-1) != '*');
55                                 }
56                                 break;
57                         case '<':
58                                 ++i;
59                                 c = source.charAt(i);
60                                 if(c != 'h') {
61                                         if(c == '\n')
62                                                 ++lineId;
63                                         break;
64                                 }
65                                 do {
66                                         ++i;
67                                         if(i == length)
68                                                 break loop;
69                                         c = source.charAt(i);
70                                         if(c == '\n') {
71                                                 ++lineId;
72                                                 break;
73                                         }
74                                 } while(c != '>');
75                                 break;
76                         case '"':
77                                 ++i;
78                                 if(i == length)
79                                         break loop;
80                                 c = source.charAt(i);
81                                 if(c == '"') {
82                                         ++i;
83                                         if(i == length)
84                                                 break loop;
85                                         c = source.charAt(i);
86                                         if(c == '"') {
87                                                 while(true) {
88                                                         ++i;
89                                                         if(i >= length)
90                                                                 break;
91                                                         c = source.charAt(i);
92                                                         if(c == '\n')
93                                                                 ++lineId;
94                                                         else if(c == '"' && i < length-2 && source.charAt(i+1) == '"' && source.charAt(i+2) == '"') {
95                                                                 i+=2;
96                                                                 break;                  
97                                                         }
98                                                 }
99                                         }
100                                         else
101                                                 --i;
102                                 }
103                                 else {
104                                         while(true) {
105                                                 ++i;
106                                                 if(i >= length)
107                                                         break;
108                                                 c = source.charAt(i);
109                                                 if(c == '"')
110                                                         break;
111                                                 else if(c == '\\')
112                                                         ++i;                    
113                                                 else if(c == '\n') {
114                                                         ++lineId;
115                                                         break;
116                                                 }
117                                         }
118                                 }
119                                 break;
120                         case '[':
121                         case '{':
122                         case '(':
123                                 ++inPar;
124                                 break;
125                         case ']':
126                         case '}':
127                         case ')':
128                                 --inPar;
129                                 break;
130                         case '\n':
131                                 ++lineId;
132                                 ++i;
133                                 if(i == length)
134                                         break;
135                                 c = source.charAt(i);
136                                 if(c == '\r') {
137                                         ++i;
138                                         if(i == length)
139                                                 break;
140                                         c = source.charAt(i);
141                                 }
142                                 if(c == '\n') {
143                                         --i;
144                                         break;
145                                 }
146                                 /*System.out.println();
147                                 System.out.print(lineId + "# ");
148                                 System.out.print(c);
149                                 */
150                                 if(i > lastSplit + minSplit && inPar == 0 && ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))) {
151                                         result.add(new SplitPoint(i, lineId));
152                                         lastSplit = i;
153                                 }
154                                 else
155                                         --i;
156                                 break;
157                         case '\r':
158                                 break;
159                         default:
160                                 //System.out.print(c);
161                         }
162                 }
163                 result.add(new SplitPoint(length, lineId));
164                 return result;
165         }
166         
167         public static void main(String[] args) throws Exception {               
168                 InputStream stream = SourceSplitter.class.getResourceAsStream("Layer0Deprecated.pgraph");
169                 String source = StreamUtil.readString(stream, Charset.forName("UTF-8"));
170                 stream.close();
171                 
172                 ArrayList<SplitPoint> sps = split(source, 1000); 
173                 for(int i=1;i<sps.size();++i) {
174                         SplitPoint begin = sps.get(i-1);
175                         SplitPoint end = sps.get(i);
176                         System.out.println("-- " + begin.lineId + ":" + end.lineId);
177                         System.out.print(source.subSequence(begin.characterId, end.characterId));
178                 }
179         }
180         
181 }