rsense-core 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +22 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +1 -0
- data/README.md +35 -0
- data/Rakefile +84 -0
- data/TypeAnnotation.tokens +41 -0
- data/build.xml +84 -0
- data/build_lib/antlr-3.2.jar +0 -0
- data/lib/jars/ant-1.7.0.jar +0 -0
- data/lib/jars/ant-launcher-1.7.0.jar +0 -0
- data/lib/jars/antlr-runtime-3.2.jar +0 -0
- data/lib/jars/bsf-2.3.0.jar +0 -0
- data/lib/rsense-core.rb +28 -0
- data/lib/rsense.jar +0 -0
- data/lib/rsense/core.rb +5 -0
- data/lib/rsense/core/version.rb +5 -0
- data/lib/rsense/parser.rb +6 -0
- data/lib/rsense/ruby.rb +19 -0
- data/lib/rsense/typing.rb +13 -0
- data/lib/rsense/typing/annotation.rb +20 -0
- data/lib/rsense/typing/runtime.rb +23 -0
- data/lib/rsense/typing/vertex.rb +15 -0
- data/lib/rsense/util.rb +9 -0
- data/rsense-core.gemspec +30 -0
- data/src/org/cx4a/rsense/CodeAssist.java +744 -0
- data/src/org/cx4a/rsense/CodeAssistError.java +31 -0
- data/src/org/cx4a/rsense/CodeAssistResult.java +42 -0
- data/src/org/cx4a/rsense/CodeCompletionResult.java +65 -0
- data/src/org/cx4a/rsense/FindDefinitionResult.java +24 -0
- data/src/org/cx4a/rsense/LoadResult.java +19 -0
- data/src/org/cx4a/rsense/Main.java +916 -0
- data/src/org/cx4a/rsense/Options.java +353 -0
- data/src/org/cx4a/rsense/Project.java +103 -0
- data/src/org/cx4a/rsense/TypeInferenceResult.java +25 -0
- data/src/org/cx4a/rsense/WhereResult.java +19 -0
- data/src/org/cx4a/rsense/parser/TypeAnnotation.g +221 -0
- data/src/org/cx4a/rsense/parser/TypeAnnotationLexer.java +1759 -0
- data/src/org/cx4a/rsense/parser/TypeAnnotationParser.java +2025 -0
- data/src/org/cx4a/rsense/ruby/Block.java +10 -0
- data/src/org/cx4a/rsense/ruby/Context.java +75 -0
- data/src/org/cx4a/rsense/ruby/DynamicMethod.java +10 -0
- data/src/org/cx4a/rsense/ruby/DynamicScope.java +51 -0
- data/src/org/cx4a/rsense/ruby/Frame.java +95 -0
- data/src/org/cx4a/rsense/ruby/IRubyObject.java +17 -0
- data/src/org/cx4a/rsense/ruby/LocalScope.java +43 -0
- data/src/org/cx4a/rsense/ruby/MetaClass.java +50 -0
- data/src/org/cx4a/rsense/ruby/Ruby.java +242 -0
- data/src/org/cx4a/rsense/ruby/RubyClass.java +146 -0
- data/src/org/cx4a/rsense/ruby/RubyModule.java +255 -0
- data/src/org/cx4a/rsense/ruby/RubyObject.java +94 -0
- data/src/org/cx4a/rsense/ruby/Scope.java +7 -0
- data/src/org/cx4a/rsense/ruby/SpecialObject.java +15 -0
- data/src/org/cx4a/rsense/ruby/Visibility.java +17 -0
- data/src/org/cx4a/rsense/typing/Graph.java +1690 -0
- data/src/org/cx4a/rsense/typing/Propagation.java +73 -0
- data/src/org/cx4a/rsense/typing/Template.java +84 -0
- data/src/org/cx4a/rsense/typing/TemplateAttribute.java +158 -0
- data/src/org/cx4a/rsense/typing/TypeSet.java +48 -0
- data/src/org/cx4a/rsense/typing/annotation/ClassType.java +57 -0
- data/src/org/cx4a/rsense/typing/annotation/MethodType.java +79 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeAnnotation.java +4 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeAny.java +7 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeApplication.java +37 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeConstraint.java +29 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeExpression.java +11 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeIdentity.java +59 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeOptional.java +22 -0
- data/src/org/cx4a/rsense/typing/annotation/TypePragma.java +22 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeSplat.java +22 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeTuple.java +35 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeUnion.java +23 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeVariable.java +44 -0
- data/src/org/cx4a/rsense/typing/runtime/AliasMethod.java +94 -0
- data/src/org/cx4a/rsense/typing/runtime/AnnotationHelper.java +69 -0
- data/src/org/cx4a/rsense/typing/runtime/AnnotationResolver.java +523 -0
- data/src/org/cx4a/rsense/typing/runtime/Array.java +84 -0
- data/src/org/cx4a/rsense/typing/runtime/ClassTag.java +27 -0
- data/src/org/cx4a/rsense/typing/runtime/DefaultMethod.java +115 -0
- data/src/org/cx4a/rsense/typing/runtime/Hash.java +131 -0
- data/src/org/cx4a/rsense/typing/runtime/LoopTag.java +21 -0
- data/src/org/cx4a/rsense/typing/runtime/Method.java +32 -0
- data/src/org/cx4a/rsense/typing/runtime/MonomorphicObject.java +77 -0
- data/src/org/cx4a/rsense/typing/runtime/ObjectAllocator.java +40 -0
- data/src/org/cx4a/rsense/typing/runtime/PolymorphicObject.java +90 -0
- data/src/org/cx4a/rsense/typing/runtime/Proc.java +100 -0
- data/src/org/cx4a/rsense/typing/runtime/RuntimeHelper.java +1339 -0
- data/src/org/cx4a/rsense/typing/runtime/SpecialMethod.java +119 -0
- data/src/org/cx4a/rsense/typing/runtime/TypeVarMap.java +112 -0
- data/src/org/cx4a/rsense/typing/runtime/VertexHolder.java +48 -0
- data/src/org/cx4a/rsense/typing/vertex/CallVertex.java +122 -0
- data/src/org/cx4a/rsense/typing/vertex/MultipleAsgnVertex.java +23 -0
- data/src/org/cx4a/rsense/typing/vertex/PassThroughVertex.java +20 -0
- data/src/org/cx4a/rsense/typing/vertex/SValueVertex.java +24 -0
- data/src/org/cx4a/rsense/typing/vertex/SplatVertex.java +24 -0
- data/src/org/cx4a/rsense/typing/vertex/ToAryVertex.java +24 -0
- data/src/org/cx4a/rsense/typing/vertex/TypeVarVertex.java +22 -0
- data/src/org/cx4a/rsense/typing/vertex/Vertex.java +221 -0
- data/src/org/cx4a/rsense/typing/vertex/YieldVertex.java +70 -0
- data/src/org/cx4a/rsense/util/HereDocReader.java +48 -0
- data/src/org/cx4a/rsense/util/Logger.java +111 -0
- data/src/org/cx4a/rsense/util/NodeUtil.java +198 -0
- data/src/org/cx4a/rsense/util/SourceLocation.java +70 -0
- data/src/org/cx4a/rsense/util/StringUtil.java +63 -0
- data/src/resources/org/cx4a/rsense/rsense.properties +1 -0
- data/stubs/1.8/_builtin.rb +3006 -0
- data/stubs/1.8/bigdecimal.rb +131 -0
- data/stubs/1.8/cgi.rb +257 -0
- data/stubs/1.8/date.rb +147 -0
- data/stubs/1.8/optparse.rb +113 -0
- data/stubs/1.8/rational.rb +47 -0
- data/stubs/1.8/set.rb +94 -0
- data/stubs/1.8/socket.rb +461 -0
- data/stubs/1.8/stringio.rb +129 -0
- data/test/data/a file.rb +1 -0
- data/test/data/benchmark.rb +12 -0
- data/test/data/crlf.rb +5 -0
- data/test/data/test.rb +19 -0
- data/test/script/all.rsense +2 -0
- data/test/script/array_dynamic.rsense +25 -0
- data/test/script/block_nested.rsense +7 -0
- data/test/script/builtin.rsense +785 -0
- data/test/script/class_method_partial_update.rsense +52 -0
- data/test/script/class_partial_update.rsense +17 -0
- data/test/script/find-definition.rsense +72 -0
- data/test/script/method_arg_onearg.rsense +6 -0
- data/test/script/method_arg_optional.rsense +7 -0
- data/test/script/method_partial_update.rsense +14 -0
- data/test/script/method_yield_arrayarg.rsense +8 -0
- data/test/script/method_yield_arrayarg_expand.rsense +8 -0
- data/test/script/method_yield_arrayarg_splat.rsense +17 -0
- data/test/script/misc.rsense +2 -0
- data/test/script/proc_higher_order.rsense +22 -0
- data/test/script/regression.rsense +95 -0
- data/test/script/stdlib.rsense +66 -0
- data/test/script/where.rsense +41 -0
- metadata +315 -0
@@ -0,0 +1,73 @@
|
|
1
|
+
package org.cx4a.rsense.typing;
|
2
|
+
|
3
|
+
import java.util.Set;
|
4
|
+
import java.util.HashSet;
|
5
|
+
|
6
|
+
import org.cx4a.rsense.typing.vertex.Vertex;
|
7
|
+
|
8
|
+
public class Propagation {
|
9
|
+
public final static int MAX_DEPTH = 10;
|
10
|
+
|
11
|
+
private Graph graph;
|
12
|
+
private Set<Object> visited;
|
13
|
+
private int depth;
|
14
|
+
private int refCount;
|
15
|
+
|
16
|
+
public Propagation(Graph graph) {
|
17
|
+
this.graph = graph;
|
18
|
+
this.depth = 0;
|
19
|
+
this.refCount = 0;
|
20
|
+
}
|
21
|
+
|
22
|
+
public Graph getGraph() {
|
23
|
+
return graph;
|
24
|
+
}
|
25
|
+
|
26
|
+
public boolean isVisited(Vertex vertex) {
|
27
|
+
return visited != null ? visited.contains(getVisitTag(vertex)) : false;
|
28
|
+
}
|
29
|
+
|
30
|
+
public void addVisited(Vertex vertex) {
|
31
|
+
if (visited == null) {
|
32
|
+
// lazy allocation
|
33
|
+
visited = new HashSet<Object>();
|
34
|
+
}
|
35
|
+
visited.add(getVisitTag(vertex));
|
36
|
+
}
|
37
|
+
|
38
|
+
public boolean checkVisited(Vertex vertex) {
|
39
|
+
if (isVisited(vertex)) {
|
40
|
+
return true;
|
41
|
+
} else {
|
42
|
+
addVisited(vertex);
|
43
|
+
return false;
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
public boolean visit(Vertex vertex, Vertex src) {
|
48
|
+
// Cut out deper branches.
|
49
|
+
// This makes results inprecise but also performace improved.
|
50
|
+
if (depth >= MAX_DEPTH) {
|
51
|
+
return false;
|
52
|
+
}
|
53
|
+
|
54
|
+
try {
|
55
|
+
depth++;
|
56
|
+
return vertex.accept(this, src);
|
57
|
+
} finally {
|
58
|
+
depth--;
|
59
|
+
}
|
60
|
+
}
|
61
|
+
|
62
|
+
public void retain() {
|
63
|
+
refCount++;
|
64
|
+
}
|
65
|
+
|
66
|
+
public boolean release() {
|
67
|
+
return --refCount == 0;
|
68
|
+
}
|
69
|
+
|
70
|
+
private Object getVisitTag(Vertex vertex) {
|
71
|
+
return vertex.getNode() != null ? vertex.getNode() : vertex;
|
72
|
+
}
|
73
|
+
}
|
@@ -0,0 +1,84 @@
|
|
1
|
+
package org.cx4a.rsense.typing;
|
2
|
+
|
3
|
+
import java.util.ArrayList;
|
4
|
+
import java.util.Map;
|
5
|
+
|
6
|
+
import org.cx4a.rsense.ruby.Frame;
|
7
|
+
import org.cx4a.rsense.ruby.Scope;
|
8
|
+
import org.cx4a.rsense.ruby.IRubyObject;
|
9
|
+
import org.cx4a.rsense.ruby.Block;
|
10
|
+
import org.cx4a.rsense.typing.runtime.Method;
|
11
|
+
import org.cx4a.rsense.typing.runtime.RuntimeHelper;
|
12
|
+
import org.cx4a.rsense.typing.runtime.MonomorphicObject;
|
13
|
+
import org.cx4a.rsense.typing.runtime.Proc;
|
14
|
+
import org.cx4a.rsense.typing.vertex.Vertex;
|
15
|
+
import org.cx4a.rsense.typing.vertex.YieldVertex;
|
16
|
+
import org.cx4a.rsense.typing.annotation.TypeVariable;
|
17
|
+
|
18
|
+
public class Template {
|
19
|
+
private Method method;
|
20
|
+
private TemplateAttribute attr;
|
21
|
+
private Vertex returnVertex;
|
22
|
+
private Frame frame;
|
23
|
+
private Scope scope;
|
24
|
+
|
25
|
+
public Template(Method method, Frame frame, Scope scope, TemplateAttribute attr) {
|
26
|
+
this.method = method;
|
27
|
+
this.attr = attr;
|
28
|
+
this.frame = frame;
|
29
|
+
this.scope = scope;
|
30
|
+
this.returnVertex = new Vertex();
|
31
|
+
}
|
32
|
+
|
33
|
+
public Method getMethod() {
|
34
|
+
return method;
|
35
|
+
}
|
36
|
+
|
37
|
+
public TemplateAttribute getAttribute() {
|
38
|
+
return attr;
|
39
|
+
}
|
40
|
+
|
41
|
+
public Vertex getReturnVertex() {
|
42
|
+
return returnVertex;
|
43
|
+
}
|
44
|
+
|
45
|
+
public Frame getFrame() {
|
46
|
+
return frame;
|
47
|
+
}
|
48
|
+
|
49
|
+
public Scope getScope() {
|
50
|
+
return scope;
|
51
|
+
}
|
52
|
+
|
53
|
+
public void reproduceSideEffect(Graph graph, IRubyObject receiver, IRubyObject[] args, Block block) {
|
54
|
+
reproduceSideEffect(graph, attr.getMutableReceiver(false), receiver);
|
55
|
+
for (int i = 0; i < attr.getArgs().length && i < args.length; i++) {
|
56
|
+
reproduceSideEffect(graph, attr.getMutableArg(i, false), args[i]);
|
57
|
+
}
|
58
|
+
reproduceYield(graph, receiver, args, block);
|
59
|
+
}
|
60
|
+
|
61
|
+
private void reproduceSideEffect(Graph graph, IRubyObject from, IRubyObject to) {
|
62
|
+
if (from instanceof MonomorphicObject && to instanceof MonomorphicObject) {
|
63
|
+
MonomorphicObject a = (MonomorphicObject) from;
|
64
|
+
MonomorphicObject b = (MonomorphicObject) to;
|
65
|
+
for (Map.Entry<TypeVariable, Vertex> entry : a.getTypeVarMap().entrySet()) {
|
66
|
+
Vertex src = entry.getValue();
|
67
|
+
Vertex dest = b.getTypeVarMap().get(entry.getKey());
|
68
|
+
if (dest != null) {
|
69
|
+
graph.propagateEdge(src, dest);
|
70
|
+
}
|
71
|
+
}
|
72
|
+
}
|
73
|
+
}
|
74
|
+
|
75
|
+
private void reproduceYield(Graph graph, IRubyObject receiver, IRubyObject[] args, Block block) {
|
76
|
+
Proc templateProc = (Proc) attr.getBlock();
|
77
|
+
if (templateProc != null && block != null) {
|
78
|
+
// Yield records may change during loop
|
79
|
+
for (YieldVertex vertex : new ArrayList<YieldVertex>(templateProc.getYields())) {
|
80
|
+
RuntimeHelper.yield(graph, new YieldVertex(vertex.getNode(), this, block, vertex.getArgsVertex(), vertex.getExpandArguments()));
|
81
|
+
}
|
82
|
+
}
|
83
|
+
}
|
84
|
+
}
|
@@ -0,0 +1,158 @@
|
|
1
|
+
package org.cx4a.rsense.typing;
|
2
|
+
|
3
|
+
import java.util.Arrays;
|
4
|
+
|
5
|
+
import org.cx4a.rsense.ruby.Block;
|
6
|
+
import org.cx4a.rsense.ruby.IRubyObject;
|
7
|
+
import org.cx4a.rsense.typing.runtime.PolymorphicObject;
|
8
|
+
|
9
|
+
public class TemplateAttribute {
|
10
|
+
private IRubyObject receiver;
|
11
|
+
private IRubyObject[] args;
|
12
|
+
private Block block;
|
13
|
+
private int hashCode = 0;
|
14
|
+
|
15
|
+
// For to keep original state of receiver and args
|
16
|
+
// See AnnotationResolver
|
17
|
+
private IRubyObject mutableReceiver;
|
18
|
+
private IRubyObject[] mutableArgs;
|
19
|
+
|
20
|
+
public TemplateAttribute(IRubyObject[] args) {
|
21
|
+
this.args = args;
|
22
|
+
}
|
23
|
+
|
24
|
+
public IRubyObject getReceiver() {
|
25
|
+
return receiver;
|
26
|
+
}
|
27
|
+
|
28
|
+
public void setReceiver(IRubyObject receiver) {
|
29
|
+
this.receiver = receiver;
|
30
|
+
}
|
31
|
+
|
32
|
+
public IRubyObject getArg(int i) {
|
33
|
+
return args[i];
|
34
|
+
}
|
35
|
+
|
36
|
+
public void setArg(int i, IRubyObject arg) {
|
37
|
+
args[i] = arg;
|
38
|
+
}
|
39
|
+
|
40
|
+
public IRubyObject[] getArgs() {
|
41
|
+
return args;
|
42
|
+
}
|
43
|
+
|
44
|
+
public Block getBlock() {
|
45
|
+
return block;
|
46
|
+
}
|
47
|
+
|
48
|
+
public void setBlock(Block block) {
|
49
|
+
this.block = block;
|
50
|
+
}
|
51
|
+
|
52
|
+
public IRubyObject getMutableReceiver() {
|
53
|
+
return getMutableReceiver(true);
|
54
|
+
}
|
55
|
+
|
56
|
+
public IRubyObject getMutableReceiver(boolean create) {
|
57
|
+
if (mutableReceiver == null && create) {
|
58
|
+
mutableReceiver = cloneObject(receiver);
|
59
|
+
}
|
60
|
+
return mutableReceiver;
|
61
|
+
}
|
62
|
+
|
63
|
+
public IRubyObject[] getMutableArgs() {
|
64
|
+
return getMutableArgs(true);
|
65
|
+
}
|
66
|
+
|
67
|
+
public IRubyObject[] getMutableArgs(boolean create) {
|
68
|
+
if (mutableArgs == null && create) {
|
69
|
+
mutableArgs = new IRubyObject[args.length];
|
70
|
+
for (int i = 0; i < args.length; i++) {
|
71
|
+
mutableArgs[i] = cloneObject(args[i]);
|
72
|
+
}
|
73
|
+
}
|
74
|
+
return mutableArgs;
|
75
|
+
}
|
76
|
+
|
77
|
+
public IRubyObject getMutableArg(int i) {
|
78
|
+
return getMutableArg(i, true);
|
79
|
+
}
|
80
|
+
|
81
|
+
public IRubyObject getMutableArg(int i, boolean create) {
|
82
|
+
IRubyObject[] args = getMutableArgs(create);
|
83
|
+
return args != null ? args[i] : null;
|
84
|
+
}
|
85
|
+
|
86
|
+
public TemplateAttribute clone() {
|
87
|
+
IRubyObject[] newargs = new IRubyObject[args.length];
|
88
|
+
System.arraycopy(args, 0, newargs, 0, args.length);
|
89
|
+
TemplateAttribute clone = new TemplateAttribute(newargs);
|
90
|
+
clone.receiver = receiver;
|
91
|
+
clone.block = block;
|
92
|
+
return clone;
|
93
|
+
}
|
94
|
+
|
95
|
+
private IRubyObject cloneObject(IRubyObject object) {
|
96
|
+
if (object instanceof PolymorphicObject) {
|
97
|
+
return ((PolymorphicObject) object).clone();
|
98
|
+
} else {
|
99
|
+
// immutable
|
100
|
+
return object;
|
101
|
+
}
|
102
|
+
}
|
103
|
+
|
104
|
+
@Override
|
105
|
+
public int hashCode() {
|
106
|
+
if (hashCode != 0)
|
107
|
+
return hashCode;
|
108
|
+
|
109
|
+
if (receiver != null)
|
110
|
+
hashCode = (hashCode ^ receiver.hashCode()) * 13;
|
111
|
+
for (IRubyObject arg : args) {
|
112
|
+
if (arg != null)
|
113
|
+
hashCode = (hashCode ^ arg.hashCode()) * 13;
|
114
|
+
}
|
115
|
+
if (block != null)
|
116
|
+
hashCode ^= (hashCode ^ block.hashCode()) * 13;
|
117
|
+
return hashCode;
|
118
|
+
}
|
119
|
+
|
120
|
+
@Override
|
121
|
+
public boolean equals(Object other) {
|
122
|
+
if (other == this) {
|
123
|
+
return true;
|
124
|
+
}
|
125
|
+
|
126
|
+
if (!(other instanceof TemplateAttribute)) {
|
127
|
+
return false;
|
128
|
+
}
|
129
|
+
|
130
|
+
TemplateAttribute o = (TemplateAttribute) other;
|
131
|
+
|
132
|
+
if (hashCode() != other.hashCode()
|
133
|
+
|| ((receiver == null) ^ (o.receiver == null))
|
134
|
+
|| (receiver != null && !receiver.equals(o.receiver))
|
135
|
+
|| args.length != o.args.length
|
136
|
+
|| (block != null
|
137
|
+
? !block.equals(o.block)
|
138
|
+
: o.block != null
|
139
|
+
? !o.block.equals(block)
|
140
|
+
: false)) {
|
141
|
+
return false;
|
142
|
+
}
|
143
|
+
|
144
|
+
for (int i = 0; i < args.length; i++) {
|
145
|
+
if (((args[i] == null) ^ (o.args[i] == null))
|
146
|
+
|| (args[i] != null && !args[i].equals(o.args[i]))) {
|
147
|
+
return false;
|
148
|
+
}
|
149
|
+
}
|
150
|
+
|
151
|
+
return true;
|
152
|
+
}
|
153
|
+
|
154
|
+
@Override
|
155
|
+
public String toString() {
|
156
|
+
return "<TemplAttr " + receiver.toString() + " " + Arrays.asList(args).toString() + (block != null ? (" " + block.toString() + ">") : ">");
|
157
|
+
}
|
158
|
+
}
|
@@ -0,0 +1,48 @@
|
|
1
|
+
package org.cx4a.rsense.typing;
|
2
|
+
|
3
|
+
import java.util.Collection;
|
4
|
+
import java.util.HashSet;
|
5
|
+
|
6
|
+
import org.cx4a.rsense.ruby.IRubyObject;
|
7
|
+
|
8
|
+
public class TypeSet extends HashSet<IRubyObject> {
|
9
|
+
private static final long serialVersionUID = 0L;
|
10
|
+
|
11
|
+
public static final TypeSet EMPTY = new TypeSet() {
|
12
|
+
private static final long serialVersionUID = 0L;
|
13
|
+
@Override
|
14
|
+
public boolean add(IRubyObject type) {
|
15
|
+
throw new UnsupportedOperationException();
|
16
|
+
}
|
17
|
+
@Override
|
18
|
+
public boolean addAll(Collection<? extends IRubyObject> types) {
|
19
|
+
throw new UnsupportedOperationException();
|
20
|
+
}
|
21
|
+
};
|
22
|
+
|
23
|
+
public TypeSet() {
|
24
|
+
super();
|
25
|
+
}
|
26
|
+
|
27
|
+
public TypeSet(TypeSet other) {
|
28
|
+
super(other);
|
29
|
+
}
|
30
|
+
|
31
|
+
public TypeSet(int capacity) {
|
32
|
+
super(capacity);
|
33
|
+
}
|
34
|
+
|
35
|
+
@Override
|
36
|
+
public int hashCode() {
|
37
|
+
return hashCode(1);
|
38
|
+
}
|
39
|
+
|
40
|
+
public int hashCode(int depth) {
|
41
|
+
int code = 0;
|
42
|
+
for (IRubyObject type : this) {
|
43
|
+
code ^= type.hashCode(depth);
|
44
|
+
code *= 13;
|
45
|
+
}
|
46
|
+
return code;
|
47
|
+
}
|
48
|
+
}
|
@@ -0,0 +1,57 @@
|
|
1
|
+
package org.cx4a.rsense.typing.annotation;
|
2
|
+
|
3
|
+
import java.util.List;
|
4
|
+
|
5
|
+
public class ClassType implements TypeAnnotation {
|
6
|
+
private String name;
|
7
|
+
private List<TypeVariable> types;
|
8
|
+
private List<TypeConstraint> constraints;
|
9
|
+
private List<TypePragma> pragmas;
|
10
|
+
|
11
|
+
public ClassType(String name, List<TypeVariable> types, List<TypeConstraint> constraints, List<TypePragma> pragmas) {
|
12
|
+
this.name = name;
|
13
|
+
this.types = types;
|
14
|
+
this.constraints = constraints;
|
15
|
+
this.pragmas = pragmas;
|
16
|
+
}
|
17
|
+
|
18
|
+
public String getName() {
|
19
|
+
return name;
|
20
|
+
}
|
21
|
+
|
22
|
+
public List<TypeVariable> getTypes() {
|
23
|
+
return types;
|
24
|
+
}
|
25
|
+
|
26
|
+
public List<TypeConstraint> getConstraints() {
|
27
|
+
return constraints;
|
28
|
+
}
|
29
|
+
|
30
|
+
public List<TypePragma> getPragmas() {
|
31
|
+
return pragmas;
|
32
|
+
}
|
33
|
+
|
34
|
+
public boolean containsType(TypeVariable type) {
|
35
|
+
return types != null && types.indexOf(type) != -1;
|
36
|
+
}
|
37
|
+
|
38
|
+
public boolean isNoBody() {
|
39
|
+
if (pragmas != null) {
|
40
|
+
for (TypePragma pragma : pragmas) {
|
41
|
+
if (pragma.getType() == TypeExpression.Type.NOBODY_PRAGMA) {
|
42
|
+
return true;
|
43
|
+
}
|
44
|
+
}
|
45
|
+
}
|
46
|
+
return false;
|
47
|
+
}
|
48
|
+
|
49
|
+
public boolean isPolymorphic() {
|
50
|
+
return types != null;
|
51
|
+
}
|
52
|
+
|
53
|
+
@Override
|
54
|
+
public String toString() {
|
55
|
+
return "<ClassType " + name + " " + types + " " + constraints + " " + pragmas + ">";
|
56
|
+
}
|
57
|
+
}
|
@@ -0,0 +1,79 @@
|
|
1
|
+
package org.cx4a.rsense.typing.annotation;
|
2
|
+
|
3
|
+
import java.util.List;
|
4
|
+
|
5
|
+
public class MethodType implements TypeAnnotation {
|
6
|
+
private String name;
|
7
|
+
private List<TypeVariable> types;
|
8
|
+
private List<TypeConstraint> consList;
|
9
|
+
private Signature sig;
|
10
|
+
|
11
|
+
public MethodType(String name, List<TypeVariable> types, List<TypeConstraint> consList, Signature sig) {
|
12
|
+
this.name = name;
|
13
|
+
this.types = types;
|
14
|
+
this.consList = consList;
|
15
|
+
this.sig = sig;
|
16
|
+
}
|
17
|
+
|
18
|
+
public String getName() {
|
19
|
+
return name;
|
20
|
+
}
|
21
|
+
|
22
|
+
public List<TypeVariable> getTypes() {
|
23
|
+
return types;
|
24
|
+
}
|
25
|
+
|
26
|
+
public List<TypeConstraint> getConstraints() {
|
27
|
+
return consList;
|
28
|
+
}
|
29
|
+
|
30
|
+
public Signature getSignature() {
|
31
|
+
return sig;
|
32
|
+
}
|
33
|
+
|
34
|
+
public static class Block {
|
35
|
+
private Signature sig;
|
36
|
+
|
37
|
+
public Block(Signature sig) {
|
38
|
+
this.sig = sig;
|
39
|
+
}
|
40
|
+
|
41
|
+
public Signature getSignature() {
|
42
|
+
return sig;
|
43
|
+
}
|
44
|
+
}
|
45
|
+
|
46
|
+
public static class Signature {
|
47
|
+
private TypeExpression argType;
|
48
|
+
private Block block;
|
49
|
+
private TypeExpression returnType;
|
50
|
+
|
51
|
+
public Signature(TypeExpression argType, Block block, TypeExpression returnType) {
|
52
|
+
this.argType = argType;
|
53
|
+
this.block = block;
|
54
|
+
this.returnType = returnType;
|
55
|
+
}
|
56
|
+
|
57
|
+
public TypeExpression getArgType() {
|
58
|
+
return argType;
|
59
|
+
}
|
60
|
+
|
61
|
+
public Block getBlock() {
|
62
|
+
return block;
|
63
|
+
}
|
64
|
+
|
65
|
+
public TypeExpression getReturnType() {
|
66
|
+
return returnType;
|
67
|
+
}
|
68
|
+
|
69
|
+
@Override
|
70
|
+
public String toString() {
|
71
|
+
return "<Signature " + argType + " " + block + " " + returnType + ">";
|
72
|
+
}
|
73
|
+
}
|
74
|
+
|
75
|
+
@Override
|
76
|
+
public String toString() {
|
77
|
+
return "<MethodType " + name + " " + sig + ">";
|
78
|
+
}
|
79
|
+
}
|