rsense-core 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (137) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +1 -0
  5. data/README.md +35 -0
  6. data/Rakefile +84 -0
  7. data/TypeAnnotation.tokens +41 -0
  8. data/build.xml +84 -0
  9. data/build_lib/antlr-3.2.jar +0 -0
  10. data/lib/jars/ant-1.7.0.jar +0 -0
  11. data/lib/jars/ant-launcher-1.7.0.jar +0 -0
  12. data/lib/jars/antlr-runtime-3.2.jar +0 -0
  13. data/lib/jars/bsf-2.3.0.jar +0 -0
  14. data/lib/rsense-core.rb +28 -0
  15. data/lib/rsense.jar +0 -0
  16. data/lib/rsense/core.rb +5 -0
  17. data/lib/rsense/core/version.rb +5 -0
  18. data/lib/rsense/parser.rb +6 -0
  19. data/lib/rsense/ruby.rb +19 -0
  20. data/lib/rsense/typing.rb +13 -0
  21. data/lib/rsense/typing/annotation.rb +20 -0
  22. data/lib/rsense/typing/runtime.rb +23 -0
  23. data/lib/rsense/typing/vertex.rb +15 -0
  24. data/lib/rsense/util.rb +9 -0
  25. data/rsense-core.gemspec +30 -0
  26. data/src/org/cx4a/rsense/CodeAssist.java +744 -0
  27. data/src/org/cx4a/rsense/CodeAssistError.java +31 -0
  28. data/src/org/cx4a/rsense/CodeAssistResult.java +42 -0
  29. data/src/org/cx4a/rsense/CodeCompletionResult.java +65 -0
  30. data/src/org/cx4a/rsense/FindDefinitionResult.java +24 -0
  31. data/src/org/cx4a/rsense/LoadResult.java +19 -0
  32. data/src/org/cx4a/rsense/Main.java +916 -0
  33. data/src/org/cx4a/rsense/Options.java +353 -0
  34. data/src/org/cx4a/rsense/Project.java +103 -0
  35. data/src/org/cx4a/rsense/TypeInferenceResult.java +25 -0
  36. data/src/org/cx4a/rsense/WhereResult.java +19 -0
  37. data/src/org/cx4a/rsense/parser/TypeAnnotation.g +221 -0
  38. data/src/org/cx4a/rsense/parser/TypeAnnotationLexer.java +1759 -0
  39. data/src/org/cx4a/rsense/parser/TypeAnnotationParser.java +2025 -0
  40. data/src/org/cx4a/rsense/ruby/Block.java +10 -0
  41. data/src/org/cx4a/rsense/ruby/Context.java +75 -0
  42. data/src/org/cx4a/rsense/ruby/DynamicMethod.java +10 -0
  43. data/src/org/cx4a/rsense/ruby/DynamicScope.java +51 -0
  44. data/src/org/cx4a/rsense/ruby/Frame.java +95 -0
  45. data/src/org/cx4a/rsense/ruby/IRubyObject.java +17 -0
  46. data/src/org/cx4a/rsense/ruby/LocalScope.java +43 -0
  47. data/src/org/cx4a/rsense/ruby/MetaClass.java +50 -0
  48. data/src/org/cx4a/rsense/ruby/Ruby.java +242 -0
  49. data/src/org/cx4a/rsense/ruby/RubyClass.java +146 -0
  50. data/src/org/cx4a/rsense/ruby/RubyModule.java +255 -0
  51. data/src/org/cx4a/rsense/ruby/RubyObject.java +94 -0
  52. data/src/org/cx4a/rsense/ruby/Scope.java +7 -0
  53. data/src/org/cx4a/rsense/ruby/SpecialObject.java +15 -0
  54. data/src/org/cx4a/rsense/ruby/Visibility.java +17 -0
  55. data/src/org/cx4a/rsense/typing/Graph.java +1690 -0
  56. data/src/org/cx4a/rsense/typing/Propagation.java +73 -0
  57. data/src/org/cx4a/rsense/typing/Template.java +84 -0
  58. data/src/org/cx4a/rsense/typing/TemplateAttribute.java +158 -0
  59. data/src/org/cx4a/rsense/typing/TypeSet.java +48 -0
  60. data/src/org/cx4a/rsense/typing/annotation/ClassType.java +57 -0
  61. data/src/org/cx4a/rsense/typing/annotation/MethodType.java +79 -0
  62. data/src/org/cx4a/rsense/typing/annotation/TypeAnnotation.java +4 -0
  63. data/src/org/cx4a/rsense/typing/annotation/TypeAny.java +7 -0
  64. data/src/org/cx4a/rsense/typing/annotation/TypeApplication.java +37 -0
  65. data/src/org/cx4a/rsense/typing/annotation/TypeConstraint.java +29 -0
  66. data/src/org/cx4a/rsense/typing/annotation/TypeExpression.java +11 -0
  67. data/src/org/cx4a/rsense/typing/annotation/TypeIdentity.java +59 -0
  68. data/src/org/cx4a/rsense/typing/annotation/TypeOptional.java +22 -0
  69. data/src/org/cx4a/rsense/typing/annotation/TypePragma.java +22 -0
  70. data/src/org/cx4a/rsense/typing/annotation/TypeSplat.java +22 -0
  71. data/src/org/cx4a/rsense/typing/annotation/TypeTuple.java +35 -0
  72. data/src/org/cx4a/rsense/typing/annotation/TypeUnion.java +23 -0
  73. data/src/org/cx4a/rsense/typing/annotation/TypeVariable.java +44 -0
  74. data/src/org/cx4a/rsense/typing/runtime/AliasMethod.java +94 -0
  75. data/src/org/cx4a/rsense/typing/runtime/AnnotationHelper.java +69 -0
  76. data/src/org/cx4a/rsense/typing/runtime/AnnotationResolver.java +523 -0
  77. data/src/org/cx4a/rsense/typing/runtime/Array.java +84 -0
  78. data/src/org/cx4a/rsense/typing/runtime/ClassTag.java +27 -0
  79. data/src/org/cx4a/rsense/typing/runtime/DefaultMethod.java +115 -0
  80. data/src/org/cx4a/rsense/typing/runtime/Hash.java +131 -0
  81. data/src/org/cx4a/rsense/typing/runtime/LoopTag.java +21 -0
  82. data/src/org/cx4a/rsense/typing/runtime/Method.java +32 -0
  83. data/src/org/cx4a/rsense/typing/runtime/MonomorphicObject.java +77 -0
  84. data/src/org/cx4a/rsense/typing/runtime/ObjectAllocator.java +40 -0
  85. data/src/org/cx4a/rsense/typing/runtime/PolymorphicObject.java +90 -0
  86. data/src/org/cx4a/rsense/typing/runtime/Proc.java +100 -0
  87. data/src/org/cx4a/rsense/typing/runtime/RuntimeHelper.java +1339 -0
  88. data/src/org/cx4a/rsense/typing/runtime/SpecialMethod.java +119 -0
  89. data/src/org/cx4a/rsense/typing/runtime/TypeVarMap.java +112 -0
  90. data/src/org/cx4a/rsense/typing/runtime/VertexHolder.java +48 -0
  91. data/src/org/cx4a/rsense/typing/vertex/CallVertex.java +122 -0
  92. data/src/org/cx4a/rsense/typing/vertex/MultipleAsgnVertex.java +23 -0
  93. data/src/org/cx4a/rsense/typing/vertex/PassThroughVertex.java +20 -0
  94. data/src/org/cx4a/rsense/typing/vertex/SValueVertex.java +24 -0
  95. data/src/org/cx4a/rsense/typing/vertex/SplatVertex.java +24 -0
  96. data/src/org/cx4a/rsense/typing/vertex/ToAryVertex.java +24 -0
  97. data/src/org/cx4a/rsense/typing/vertex/TypeVarVertex.java +22 -0
  98. data/src/org/cx4a/rsense/typing/vertex/Vertex.java +221 -0
  99. data/src/org/cx4a/rsense/typing/vertex/YieldVertex.java +70 -0
  100. data/src/org/cx4a/rsense/util/HereDocReader.java +48 -0
  101. data/src/org/cx4a/rsense/util/Logger.java +111 -0
  102. data/src/org/cx4a/rsense/util/NodeUtil.java +198 -0
  103. data/src/org/cx4a/rsense/util/SourceLocation.java +70 -0
  104. data/src/org/cx4a/rsense/util/StringUtil.java +63 -0
  105. data/src/resources/org/cx4a/rsense/rsense.properties +1 -0
  106. data/stubs/1.8/_builtin.rb +3006 -0
  107. data/stubs/1.8/bigdecimal.rb +131 -0
  108. data/stubs/1.8/cgi.rb +257 -0
  109. data/stubs/1.8/date.rb +147 -0
  110. data/stubs/1.8/optparse.rb +113 -0
  111. data/stubs/1.8/rational.rb +47 -0
  112. data/stubs/1.8/set.rb +94 -0
  113. data/stubs/1.8/socket.rb +461 -0
  114. data/stubs/1.8/stringio.rb +129 -0
  115. data/test/data/a file.rb +1 -0
  116. data/test/data/benchmark.rb +12 -0
  117. data/test/data/crlf.rb +5 -0
  118. data/test/data/test.rb +19 -0
  119. data/test/script/all.rsense +2 -0
  120. data/test/script/array_dynamic.rsense +25 -0
  121. data/test/script/block_nested.rsense +7 -0
  122. data/test/script/builtin.rsense +785 -0
  123. data/test/script/class_method_partial_update.rsense +52 -0
  124. data/test/script/class_partial_update.rsense +17 -0
  125. data/test/script/find-definition.rsense +72 -0
  126. data/test/script/method_arg_onearg.rsense +6 -0
  127. data/test/script/method_arg_optional.rsense +7 -0
  128. data/test/script/method_partial_update.rsense +14 -0
  129. data/test/script/method_yield_arrayarg.rsense +8 -0
  130. data/test/script/method_yield_arrayarg_expand.rsense +8 -0
  131. data/test/script/method_yield_arrayarg_splat.rsense +17 -0
  132. data/test/script/misc.rsense +2 -0
  133. data/test/script/proc_higher_order.rsense +22 -0
  134. data/test/script/regression.rsense +95 -0
  135. data/test/script/stdlib.rsense +66 -0
  136. data/test/script/where.rsense +41 -0
  137. metadata +315 -0
@@ -0,0 +1,353 @@
1
+ package org.cx4a.rsense;
2
+
3
+ import java.io.File;
4
+ import java.io.InputStream;
5
+ import java.io.FileInputStream;
6
+ import java.io.Reader;
7
+ import java.io.InputStreamReader;
8
+ import java.io.BufferedReader;
9
+ import java.io.IOException;
10
+
11
+ import java.util.List;
12
+ import java.util.ArrayList;
13
+ import java.util.HashMap;
14
+ import java.util.Set;
15
+ import java.util.HashSet;
16
+ import java.util.Arrays;
17
+ import java.util.Collections;
18
+
19
+ import org.cx4a.rsense.util.HereDocReader;
20
+ import org.cx4a.rsense.util.Logger;
21
+
22
+ public class Options extends HashMap<String, List<String>> {
23
+ private static final long serialVersionUID = 0L;
24
+
25
+ public static class InvalidOptionException extends RuntimeException {
26
+ private static final long serialVersionUID = 0L;
27
+
28
+ public InvalidOptionException(String msg) {
29
+ super(msg);
30
+ }
31
+ }
32
+
33
+ private List<String> rest = new ArrayList<String>();
34
+
35
+ public Options() {}
36
+
37
+ public void addOption(String name) {
38
+ addOption(name, null);
39
+ }
40
+
41
+ public void addOption(String name, String value) {
42
+ List<String> list = get(name);
43
+ if (list == null) {
44
+ list = new ArrayList<String>();
45
+ put(name, list);
46
+ }
47
+ if (value != null) {
48
+ list.add(value);
49
+ }
50
+ }
51
+
52
+ public void addOptions(String name, List<String> value) {
53
+ List<String> list = get(name);
54
+ if (list == null) {
55
+ list = new ArrayList<String>();
56
+ put(name, list);
57
+ }
58
+ if (value != null) {
59
+ list.addAll(value);
60
+ }
61
+ }
62
+
63
+ public boolean hasOption(String name) {
64
+ return containsKey(name);
65
+ }
66
+
67
+ public String getOption(String name) {
68
+ List<String> list = get(name);
69
+ return list != null && !list.isEmpty() ? list.get(0) : null;
70
+ }
71
+
72
+ public List<String> getOptions(String name) {
73
+ return get(name);
74
+ }
75
+
76
+ public void addRestArg(String arg) {
77
+ rest.add(arg);
78
+ }
79
+
80
+ public List<String> getRestArgs() {
81
+ return rest;
82
+ }
83
+
84
+ public boolean isFormatGiven() {
85
+ return hasOption("format");
86
+ }
87
+
88
+ public boolean isEncodingGiven() {
89
+ return hasOption("encoding");
90
+ }
91
+
92
+ public String getFormat() {
93
+ String format = getOption("format");
94
+ return format != null ? format : defaultFormat();
95
+ }
96
+
97
+ public boolean isPlainFormat() {
98
+ return "plain".equals(getFormat());
99
+ }
100
+
101
+ public boolean isEmacsFormat() {
102
+ return "emacs".equals(getFormat());
103
+ }
104
+
105
+ public String getEncoding() {
106
+ String encoding = getOption("encoding");
107
+ return encoding != null ? encoding : defaultEncoding();
108
+ }
109
+
110
+ public String getPrompt() {
111
+ return hasOption("no-prompt") ? "" : getOption("prompt");
112
+ }
113
+
114
+ public File getFile() {
115
+ String file = getOption("file");
116
+ return file == null ? null : new File(file);
117
+ }
118
+
119
+ public boolean isFileStdin() {
120
+ return !hasOption("file") || "-".equals(getOption("file"));
121
+ }
122
+
123
+ public HereDocReader getHereDocReader(Reader reader) {
124
+ return new HereDocReader(reader, "EOF");
125
+ }
126
+
127
+ public CodeAssist.Location getLocation() {
128
+ String location = getOption("location");
129
+ if (location == null) {
130
+ return CodeAssist.Location.markLocation("_|_");
131
+ }
132
+ String[] lr = location.split(":");
133
+ if (lr.length == 2) {
134
+ return CodeAssist.Location.logicalLocation(Integer.parseInt(lr[0]), Integer.parseInt(lr[1]));
135
+ } else {
136
+ try {
137
+ return CodeAssist.Location.offsetLocation(Integer.parseInt(lr[0]));
138
+ } catch (NumberFormatException e) {
139
+ return CodeAssist.Location.markLocation(lr[0]);
140
+ }
141
+ }
142
+ }
143
+
144
+ public int getLine() {
145
+ try {
146
+ return Integer.parseInt(getOption("line"));
147
+ } catch (NumberFormatException e) {
148
+ throw new InvalidOptionException("line number is not given with --line");
149
+ }
150
+ }
151
+
152
+ public String getEndMark() {
153
+ return getOption("end-mark");
154
+ }
155
+
156
+ public boolean isDebug() {
157
+ return hasOption("debug");
158
+ }
159
+
160
+ public String getLog() {
161
+ return getOption("log");
162
+ }
163
+
164
+ public Logger.Level getLogLevel() {
165
+ if (isDebug()) {
166
+ return Logger.Level.DEBUG;
167
+ }
168
+ String level = getOption("log-level");
169
+ return level != null ? Logger.Level.valueOf(level.toUpperCase()) : Logger.Level.MESSAGE;
170
+ }
171
+
172
+ public Integer getProgress() {
173
+ if (hasOption("progress")) {
174
+ try {
175
+ return Integer.parseInt(getOption("progress"));
176
+ } catch (NumberFormatException e) {
177
+ return 0;
178
+ }
179
+ }
180
+ return null;
181
+ }
182
+
183
+ public String getRsenseHome() {
184
+ String rsenseHome = getOption("home");
185
+ return rsenseHome != null ? rsenseHome : ".";
186
+ }
187
+
188
+ public List<String> getLoadPath() {
189
+ List<String> loadPath = getPathList("load-path");
190
+
191
+ // add stub path
192
+ String sep = File.separator;
193
+ String psep = File.pathSeparator;
194
+ loadPath.add(0, getRsenseHome() + sep + "stubs" + sep + "1.8");
195
+
196
+ return loadPath;
197
+ }
198
+
199
+ public List<String> getGemPath() {
200
+ return getPathList("gem-path");
201
+ }
202
+
203
+ public String getProject() {
204
+ return getOption("project");
205
+ }
206
+
207
+ public boolean isDetectProject() {
208
+ return hasOption("detect-project");
209
+ }
210
+
211
+ public File getDetectProject() {
212
+ return getOption("detect-project") != null ? new File(getOption("detect-project")) : null;
213
+ }
214
+
215
+ public boolean isKeepEnv() {
216
+ return hasOption("keep-env");
217
+ }
218
+
219
+ public boolean isTime() {
220
+ return hasOption("time");
221
+ }
222
+
223
+ public boolean isTest() {
224
+ return hasOption("test");
225
+ }
226
+
227
+ public boolean isTestColor() {
228
+ return hasOption("test-color");
229
+ }
230
+
231
+ public String getTest() {
232
+ return getOption("test");
233
+ }
234
+
235
+ public Set<String> getShouldContain() {
236
+ return getStringSet("should-contain");
237
+ }
238
+
239
+ public Set<String> getShouldNotContain() {
240
+ return getStringSet("should-not-contain");
241
+ }
242
+
243
+ public Set<String> getShouldBe() {
244
+ if (hasOption("should-be-empty")) {
245
+ return Collections.<String>emptySet();
246
+ } else {
247
+ return getStringSet("should-be");
248
+ }
249
+ }
250
+
251
+ public boolean isShouldBeGiven() {
252
+ return hasOption("should-be") || hasOption("should-be-empty");
253
+ }
254
+
255
+ public boolean isPrintAST() {
256
+ return hasOption("print-ast");
257
+ }
258
+
259
+ public String getName() {
260
+ return getOption("name");
261
+ }
262
+
263
+ public String getPrefix() {
264
+ return getOption("prefix");
265
+ }
266
+
267
+ public boolean isVerbose() {
268
+ return hasOption("verbose");
269
+ }
270
+
271
+ public void inherit(Options parent) {
272
+ addOption("home", parent.getRsenseHome());
273
+ if (parent.isDebug()) {
274
+ addOption("debug");
275
+ }
276
+ addOption("log", parent.getLog());
277
+ addOption("log-level", parent.getOption("log-level"));
278
+ addOptions("load-path", parent.getOptions("load-path"));
279
+ addOptions("gem-path", parent.getOptions("gem-path"));
280
+ addOption("format", parent.getFormat());
281
+ addOption("encoding", parent.getEncoding());
282
+ if (parent.isTime()) {
283
+ addOption("time");
284
+ }
285
+ if (parent.isTestColor()) {
286
+ addOption("test-color");
287
+ }
288
+ }
289
+
290
+ public String getConfig() {
291
+ return getOption("config");
292
+ }
293
+
294
+ public void loadConfig(File config) {
295
+ try {
296
+ InputStream in = new FileInputStream(config);
297
+ try {
298
+ BufferedReader reader = new BufferedReader(new InputStreamReader(in));
299
+ String line;
300
+ while ((line = reader.readLine()) != null) {
301
+ String[] lr = line.split("\\s*=\\s*", 2);
302
+ if (lr.length >= 1) {
303
+ addOption(lr[0], lr.length >= 2 ? lr[1] : null);
304
+ }
305
+ }
306
+ } finally {
307
+ in.close();
308
+ }
309
+ } catch (IOException e) {
310
+ throw new RuntimeException(e);
311
+ }
312
+ }
313
+
314
+ private Set<String> getStringSet(String name) {
315
+ Set<String> result;
316
+ String str = getOption(name);
317
+ if (str == null) {
318
+ result = Collections.<String>emptySet();
319
+ } else {
320
+ result = new HashSet<String>(Arrays.asList(str.split(",")));
321
+ }
322
+ return result;
323
+ }
324
+
325
+ private List<String> getPathList(String name) {
326
+ List<String> list = getOptions(name);
327
+ List<String> result = new ArrayList<String>();
328
+ if (list != null) {
329
+ for (String paths : list) {
330
+ for (String path : paths.split(File.pathSeparator)) {
331
+ result.add(path);
332
+ }
333
+ }
334
+ }
335
+ return result;
336
+ }
337
+
338
+ public static String defaultFormat() {
339
+ return "plain";
340
+ }
341
+
342
+ public static String defaultEncoding() {
343
+ return "UTF-8";
344
+ }
345
+
346
+ public static String defaultEndMark() {
347
+ return "END";
348
+ }
349
+
350
+ public static String defaultPrompt() {
351
+ return "> ";
352
+ }
353
+ }
@@ -0,0 +1,103 @@
1
+ package org.cx4a.rsense;
2
+
3
+ import java.io.File;
4
+
5
+ import java.util.List;
6
+ import java.util.ArrayList;
7
+ import java.util.Set;
8
+ import java.util.HashSet;
9
+
10
+ import org.cx4a.rsense.ruby.Ruby;
11
+ import org.cx4a.rsense.typing.Graph;
12
+ import org.cx4a.rsense.util.Logger;
13
+
14
+ public class Project {
15
+ public static interface EventListener extends Graph.EventListener {
16
+ }
17
+
18
+ private String name;
19
+ private File path;
20
+ private Ruby runtime;
21
+ private Graph graph;
22
+ private List<File> loadPath;
23
+ private List<File> gemPath;
24
+ private Set<String> loaded;
25
+
26
+ public Project(String name, File path) {
27
+ this.name = name;
28
+ this.path = path;
29
+ this.graph = new Graph();
30
+ this.runtime = graph.getRuntime();
31
+ this.loadPath = new ArrayList<File>();
32
+ this.gemPath = new ArrayList<File>();
33
+ this.loaded = new HashSet<String>();
34
+ }
35
+
36
+ public String getName() {
37
+ return name;
38
+ }
39
+
40
+ public File getPath() {
41
+ return path;
42
+ }
43
+
44
+ public Ruby getRuntime() {
45
+ return runtime;
46
+ }
47
+
48
+ public Graph getGraph() {
49
+ return graph;
50
+ }
51
+
52
+ public List<File> getLoadPath() {
53
+ return loadPath;
54
+ }
55
+
56
+ public void setLoadPath(List<String> loadPath) {
57
+ this.loadPath.addAll(getAbsoluteLoadPath(loadPath));
58
+ }
59
+
60
+ public List<File> getGemPath() {
61
+ return gemPath;
62
+ }
63
+
64
+ public void setGemPath(List<String> gemPath) {
65
+ this.gemPath.addAll(getAbsoluteLoadPath(gemPath));
66
+ }
67
+
68
+ public boolean isLoaded(String name) {
69
+ return loaded.contains(name);
70
+ }
71
+
72
+ public void setLoaded(String name) {
73
+ loaded.add(name);
74
+ }
75
+
76
+ public void addEventListener(EventListener eventListener) {
77
+ graph.addEventListener(eventListener);
78
+ }
79
+
80
+ public void removeEventListener(EventListener eventListener) {
81
+ graph.removeEventListener(eventListener);
82
+ }
83
+
84
+ private List<File> getAbsoluteLoadPath(List<String> loadPath) {
85
+ ArrayList<File> result = new ArrayList<File>();
86
+ for (String elem : loadPath) {
87
+ File dir = new File(elem);
88
+ if (!dir.isAbsolute()) {
89
+ File absdir = new File(path, dir.getPath());
90
+ if (absdir.isDirectory()) {
91
+ dir = absdir;
92
+ }
93
+ }
94
+
95
+ if (dir.isDirectory()) {
96
+ result.add(dir);
97
+ } else {
98
+ Logger.warn("Load-path not found: %s", dir);
99
+ }
100
+ }
101
+ return result;
102
+ }
103
+ }