rsense-core 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ }