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.
- 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
|
+
}
|