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,84 @@
|
|
|
1
|
+
package org.cx4a.rsense.typing.runtime;
|
|
2
|
+
|
|
3
|
+
import org.cx4a.rsense.ruby.Ruby;
|
|
4
|
+
import org.cx4a.rsense.ruby.RubyClass;
|
|
5
|
+
import org.cx4a.rsense.typing.vertex.Vertex;
|
|
6
|
+
import org.cx4a.rsense.typing.annotation.TypeVariable;
|
|
7
|
+
|
|
8
|
+
public class Array extends PolymorphicObject {
|
|
9
|
+
protected Vertex[] elements;
|
|
10
|
+
|
|
11
|
+
public Array(Ruby runtime, Vertex[] elements) {
|
|
12
|
+
this(runtime, runtime.getArray(), elements);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
public Array(Ruby runtime, RubyClass metaClass, Vertex[] elements) {
|
|
16
|
+
super(runtime, metaClass);
|
|
17
|
+
this.elements = elements;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public Array(Ruby runtime, RubyClass metaClass, Vertex[] elements, TypeVarMap tvmap) {
|
|
21
|
+
super(runtime, metaClass, tvmap);
|
|
22
|
+
this.elements = elements;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public Vertex getTypeVarVertex() {
|
|
26
|
+
return getTypeVarMap().get(TypeVariable.valueOf("t"));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public void setTypeVarVertex(Vertex vertex) {
|
|
30
|
+
getTypeVarMap().put(TypeVariable.valueOf("t"), vertex);
|
|
31
|
+
if (elements != null) {
|
|
32
|
+
for (Vertex e : elements) {
|
|
33
|
+
vertex.update(e);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public Vertex getElement(int i) {
|
|
39
|
+
if (elements == null) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
if (i < 0) {
|
|
43
|
+
i += elements.length;
|
|
44
|
+
}
|
|
45
|
+
if (0 <= i && i < elements.length) {
|
|
46
|
+
return elements[i];
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
public Vertex[] getElements() {
|
|
52
|
+
return elements;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
public int length() {
|
|
56
|
+
return elements != null ? elements.length : 0;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
@Override
|
|
60
|
+
public PolymorphicObject clone() {
|
|
61
|
+
return new Array(runtime, metaClass, elements, getTypeVarMap().clone());
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
@Override
|
|
65
|
+
public String toString() {
|
|
66
|
+
if (isModified()) {
|
|
67
|
+
// no longer static array
|
|
68
|
+
return super.toString();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
StringBuffer sb = new StringBuffer();
|
|
72
|
+
String delim = "";
|
|
73
|
+
sb.append('(');
|
|
74
|
+
if (elements != null) {
|
|
75
|
+
for (Vertex e : elements) {
|
|
76
|
+
sb.append(delim);
|
|
77
|
+
sb.append(e.toString());
|
|
78
|
+
delim = ", ";
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
sb.append(')');
|
|
82
|
+
return sb.toString();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
package org.cx4a.rsense.typing.runtime;
|
|
2
|
+
|
|
3
|
+
import org.jrubyparser.ast.Node;
|
|
4
|
+
|
|
5
|
+
import org.cx4a.rsense.typing.annotation.ClassType;
|
|
6
|
+
|
|
7
|
+
public class ClassTag {
|
|
8
|
+
private Node bodyNode;
|
|
9
|
+
private ClassType type;
|
|
10
|
+
|
|
11
|
+
public ClassTag(Node node) {
|
|
12
|
+
this(node, null);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
public ClassTag(Node bodyNode, ClassType type) {
|
|
16
|
+
this.bodyNode = bodyNode;
|
|
17
|
+
this.type = type;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public Node getBodyNode() {
|
|
21
|
+
return bodyNode;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public ClassType getType() {
|
|
25
|
+
return type;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
package org.cx4a.rsense.typing.runtime;
|
|
2
|
+
|
|
3
|
+
import java.lang.ref.SoftReference;
|
|
4
|
+
|
|
5
|
+
import java.util.List;
|
|
6
|
+
import java.util.Map;
|
|
7
|
+
import java.util.HashMap;
|
|
8
|
+
|
|
9
|
+
import org.jrubyparser.ast.Node;
|
|
10
|
+
import org.jrubyparser.ast.ArgsNode;
|
|
11
|
+
|
|
12
|
+
import org.cx4a.rsense.ruby.IRubyObject;
|
|
13
|
+
import org.cx4a.rsense.ruby.RubyModule;
|
|
14
|
+
import org.cx4a.rsense.ruby.Visibility;
|
|
15
|
+
import org.cx4a.rsense.ruby.Block;
|
|
16
|
+
import org.cx4a.rsense.typing.Graph;
|
|
17
|
+
import org.cx4a.rsense.typing.Template;
|
|
18
|
+
import org.cx4a.rsense.typing.TemplateAttribute;
|
|
19
|
+
import org.cx4a.rsense.typing.vertex.Vertex;
|
|
20
|
+
import org.cx4a.rsense.typing.annotation.MethodType;
|
|
21
|
+
import org.cx4a.rsense.util.SourceLocation;
|
|
22
|
+
|
|
23
|
+
public class DefaultMethod implements Method {
|
|
24
|
+
private RubyModule cbase;
|
|
25
|
+
private String name;
|
|
26
|
+
private Node bodyNode, argsNode;
|
|
27
|
+
private Visibility visibility;
|
|
28
|
+
private SourceLocation location;
|
|
29
|
+
private boolean templatesShared;
|
|
30
|
+
private Map<TemplateAttribute, SoftReference<Template>> templates;
|
|
31
|
+
private List<MethodType> annotations;
|
|
32
|
+
|
|
33
|
+
public DefaultMethod(RubyModule cbase, String name, Node bodyNode, Node argsNode, Visibility visibility, SourceLocation location) {
|
|
34
|
+
this.cbase = cbase;
|
|
35
|
+
this.name = name;
|
|
36
|
+
this.bodyNode = bodyNode;
|
|
37
|
+
this.argsNode = argsNode;
|
|
38
|
+
this.visibility = visibility;
|
|
39
|
+
this.location = location;
|
|
40
|
+
this.templates = new HashMap<TemplateAttribute, SoftReference<Template>>();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
public String getName() {
|
|
44
|
+
return name;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public Node getBodyNode() {
|
|
48
|
+
return bodyNode;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
public Node getArgsNode() {
|
|
52
|
+
return argsNode;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
public RubyModule getModule() {
|
|
56
|
+
return cbase;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
public Visibility getVisibility() {
|
|
60
|
+
return visibility;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
public void setVisibility(Visibility visibility) {
|
|
64
|
+
this.visibility = visibility;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
public SourceLocation getLocation() {
|
|
68
|
+
return location;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
public void shareTemplates(Method with) {
|
|
72
|
+
this.templates = with.getTemplates();
|
|
73
|
+
this.templatesShared = true;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
public Map<TemplateAttribute, SoftReference<Template>> getTemplates() {
|
|
77
|
+
return templates;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
public Template getTemplate(TemplateAttribute key) {
|
|
81
|
+
SoftReference<Template> ref = templates.get(key);
|
|
82
|
+
return ref != null ? ref.get() : null;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
public void addTemplate(TemplateAttribute key, Template template) {
|
|
86
|
+
templates.put(key, new SoftReference<Template>(template));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
public boolean isTemplatesShared() {
|
|
90
|
+
return templatesShared;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
public List<MethodType> getAnnotations() {
|
|
94
|
+
return annotations;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
public void setAnnotations(List<MethodType> annotations) {
|
|
98
|
+
this.annotations = annotations;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
public Vertex call(Graph graph, Template template, IRubyObject receiver, IRubyObject[] args, Vertex[] argVertices, Block block) {
|
|
102
|
+
// FIXME more efficient way
|
|
103
|
+
RuntimeHelper.argsAssign(graph, (ArgsNode) argsNode, argVertices, block);
|
|
104
|
+
if (bodyNode != null) {
|
|
105
|
+
return graph.createVertex(bodyNode);
|
|
106
|
+
} else {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
@Override
|
|
112
|
+
public String toString() {
|
|
113
|
+
return getModule().getMethodPath(getName());
|
|
114
|
+
}
|
|
115
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
package org.cx4a.rsense.typing.runtime;
|
|
2
|
+
|
|
3
|
+
import org.cx4a.rsense.ruby.Ruby;
|
|
4
|
+
import org.cx4a.rsense.ruby.RubyClass;
|
|
5
|
+
import org.cx4a.rsense.typing.TypeSet;
|
|
6
|
+
import org.cx4a.rsense.typing.vertex.Vertex;
|
|
7
|
+
import org.cx4a.rsense.typing.annotation.TypeVariable;
|
|
8
|
+
|
|
9
|
+
import org.jrubyparser.ast.Node;
|
|
10
|
+
import org.jrubyparser.ast.StrNode;
|
|
11
|
+
import org.jrubyparser.ast.FixnumNode;
|
|
12
|
+
import org.jrubyparser.ast.SymbolNode;
|
|
13
|
+
|
|
14
|
+
public class Hash extends Array {
|
|
15
|
+
public static class Key {
|
|
16
|
+
private Object realKey;
|
|
17
|
+
private TypeSet typeSet;
|
|
18
|
+
|
|
19
|
+
public Key(Object realKey, TypeSet typeSet) {
|
|
20
|
+
this.realKey = realKey;
|
|
21
|
+
this.typeSet = typeSet;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public Object getRealKey() {
|
|
25
|
+
return realKey;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public TypeSet getTypeSet() {
|
|
29
|
+
return typeSet;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
protected Key[] keys;
|
|
34
|
+
|
|
35
|
+
public Hash(Ruby runtime, Vertex[] elements) {
|
|
36
|
+
this(runtime, runtime.getHash(), elements);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
public Hash(Ruby runtime, RubyClass metaClass, Vertex[] elements) {
|
|
40
|
+
this(runtime, runtime.getHash(), elements, new TypeVarMap());
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
public Hash(Ruby runtime, RubyClass metaClass, Vertex[] elements, TypeVarMap tvmap) {
|
|
44
|
+
super(runtime, metaClass, elements, tvmap);
|
|
45
|
+
if (elements != null) {
|
|
46
|
+
keys = new Key[elements.length / 2];
|
|
47
|
+
for (int i = 0, j = 0; i < elements.length; i += 2, j++) {
|
|
48
|
+
keys[j] = createVertexKey(elements[i]);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
public Vertex get(Object key) {
|
|
54
|
+
if (elements != null) {
|
|
55
|
+
for (int i = 1, j = 0; i < elements.length; i += 2, j++) {
|
|
56
|
+
if (key != null && key.equals(keys[j].getRealKey())) {
|
|
57
|
+
return elements[i];
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
public Vertex getKeyTypeVarVertex() {
|
|
65
|
+
return getTypeVarMap().get(TypeVariable.valueOf("k"));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
public void setKeyTypeVarVertex(Vertex vertex) {
|
|
69
|
+
getTypeVarMap().put(TypeVariable.valueOf("k"), vertex);
|
|
70
|
+
for (Key key : keys) {
|
|
71
|
+
vertex.addTypes(key.getTypeSet());
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
public Vertex getValueTypeVarVertex() {
|
|
76
|
+
return getTypeVarMap().get(TypeVariable.valueOf("v"));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
public void setValueTypeVarVertex(Vertex vertex) {
|
|
80
|
+
getTypeVarMap().put(TypeVariable.valueOf("v"), vertex);
|
|
81
|
+
if (elements != null) {
|
|
82
|
+
for (int i = 1; i < elements.length; i += 2) {
|
|
83
|
+
vertex.update(elements[i]);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
@Override
|
|
89
|
+
public PolymorphicObject clone() {
|
|
90
|
+
return new Hash(runtime, metaClass, elements, getTypeVarMap().clone());
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
@Override
|
|
94
|
+
public String toString() {
|
|
95
|
+
if (isModified()) {
|
|
96
|
+
// no longer static hash
|
|
97
|
+
return super.toString();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
StringBuffer sb = new StringBuffer();
|
|
101
|
+
String delim = "";
|
|
102
|
+
sb.append('{');
|
|
103
|
+
if (elements != null) {
|
|
104
|
+
for (int i = 0; i < elements.length; i++) {
|
|
105
|
+
sb.append(delim);
|
|
106
|
+
sb.append(keys[i].getRealKey());
|
|
107
|
+
sb.append(" => ");
|
|
108
|
+
sb.append(elements[i]);
|
|
109
|
+
delim = ", ";
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
sb.append('}');
|
|
113
|
+
return sb.toString();
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
public static Object getRealKey(Node node) {
|
|
117
|
+
Object realKey = null;
|
|
118
|
+
if (node instanceof StrNode) {
|
|
119
|
+
realKey = ((StrNode) node).getValue();
|
|
120
|
+
} else if (node instanceof FixnumNode) {
|
|
121
|
+
realKey = ((FixnumNode) node).getValue();
|
|
122
|
+
} else if (node instanceof SymbolNode) {
|
|
123
|
+
realKey = ":" + ((SymbolNode) node).getName();
|
|
124
|
+
}
|
|
125
|
+
return realKey;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
public static Key createVertexKey(Vertex vertex) {
|
|
129
|
+
return new Key(getRealKey(vertex.getNode()), vertex.getTypeSet());
|
|
130
|
+
}
|
|
131
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
package org.cx4a.rsense.typing.runtime;
|
|
2
|
+
|
|
3
|
+
import org.cx4a.rsense.typing.vertex.Vertex;
|
|
4
|
+
|
|
5
|
+
public class LoopTag {
|
|
6
|
+
private Vertex returnVertex;
|
|
7
|
+
private Vertex yieldVertex;
|
|
8
|
+
|
|
9
|
+
public LoopTag(Vertex returnVertex, Vertex yieldVertex) {
|
|
10
|
+
this.returnVertex = returnVertex;
|
|
11
|
+
this.yieldVertex = yieldVertex;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
public Vertex getReturnVertex() {
|
|
15
|
+
return returnVertex;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public Vertex getYieldVertex() {
|
|
19
|
+
return yieldVertex;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
package org.cx4a.rsense.typing.runtime;
|
|
2
|
+
|
|
3
|
+
import java.lang.ref.SoftReference;
|
|
4
|
+
|
|
5
|
+
import java.util.Collection;
|
|
6
|
+
import java.util.List;
|
|
7
|
+
import java.util.Map;
|
|
8
|
+
|
|
9
|
+
import org.jrubyparser.ast.Node;
|
|
10
|
+
|
|
11
|
+
import org.cx4a.rsense.ruby.IRubyObject;
|
|
12
|
+
import org.cx4a.rsense.ruby.DynamicMethod;
|
|
13
|
+
import org.cx4a.rsense.ruby.Block;
|
|
14
|
+
import org.cx4a.rsense.typing.Graph;
|
|
15
|
+
import org.cx4a.rsense.typing.Template;
|
|
16
|
+
import org.cx4a.rsense.typing.TemplateAttribute;
|
|
17
|
+
import org.cx4a.rsense.typing.vertex.Vertex;
|
|
18
|
+
import org.cx4a.rsense.typing.annotation.MethodType;
|
|
19
|
+
|
|
20
|
+
public interface Method extends DynamicMethod {
|
|
21
|
+
public String getName();
|
|
22
|
+
public Node getBodyNode();
|
|
23
|
+
public Node getArgsNode();
|
|
24
|
+
public void shareTemplates(Method with);
|
|
25
|
+
public Map<TemplateAttribute, SoftReference<Template>> getTemplates();
|
|
26
|
+
public Template getTemplate(TemplateAttribute key);
|
|
27
|
+
public void addTemplate(TemplateAttribute key, Template template);
|
|
28
|
+
public boolean isTemplatesShared();
|
|
29
|
+
public List<MethodType> getAnnotations();
|
|
30
|
+
public void setAnnotations(List<MethodType> annotations);
|
|
31
|
+
public Vertex call(Graph graph, Template template, IRubyObject receiver, IRubyObject[] args, Vertex[] argVertices, Block block);
|
|
32
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
package org.cx4a.rsense.typing.runtime;
|
|
2
|
+
|
|
3
|
+
import java.util.Map;
|
|
4
|
+
|
|
5
|
+
import org.cx4a.rsense.ruby.IRubyObject;
|
|
6
|
+
import org.cx4a.rsense.typing.vertex.Vertex;
|
|
7
|
+
import org.cx4a.rsense.typing.annotation.TypeVariable;
|
|
8
|
+
|
|
9
|
+
public class MonomorphicObject extends PolymorphicObject {
|
|
10
|
+
private PolymorphicObject entity;
|
|
11
|
+
|
|
12
|
+
// keep initial state of monomorphic
|
|
13
|
+
private TypeVarMap fixedTypeVarMap;
|
|
14
|
+
private int hashCode = 0;
|
|
15
|
+
|
|
16
|
+
public MonomorphicObject(PolymorphicObject entity, TypeVarMap tvmap) {
|
|
17
|
+
super(entity.getRuntime(), entity.getMetaClass(), tvmap);
|
|
18
|
+
this.entity = entity;
|
|
19
|
+
|
|
20
|
+
fixedTypeVarMap = new TypeVarMap();
|
|
21
|
+
TypeVarMap etvmap = entity.getTypeVarMap();
|
|
22
|
+
for (Map.Entry<TypeVariable, Vertex> entry : tvmap.entrySet()) {
|
|
23
|
+
entry.getValue().addEdge(etvmap.get(entry.getKey()));
|
|
24
|
+
|
|
25
|
+
IRubyObject value = entry.getValue().singleType();
|
|
26
|
+
if (value != null) {
|
|
27
|
+
Vertex v = new Vertex();
|
|
28
|
+
v.addType(value);
|
|
29
|
+
fixedTypeVarMap.put(entry.getKey(), v);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
@Override
|
|
35
|
+
public PolymorphicObject clone() {
|
|
36
|
+
return new MonomorphicObject(entity, getTypeVarMap().clone());
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
@Override
|
|
40
|
+
public int hashCode() {
|
|
41
|
+
if (hashCode != 0)
|
|
42
|
+
return hashCode;
|
|
43
|
+
|
|
44
|
+
for (Vertex v : fixedTypeVarMap.values())
|
|
45
|
+
hashCode = (hashCode ^ v.singleType().getMetaClass().hashCode()) * 13;
|
|
46
|
+
return hashCode;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
@Override
|
|
50
|
+
public boolean equals(Object other) {
|
|
51
|
+
if (this == other) {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (!(other instanceof MonomorphicObject)) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
MonomorphicObject o = (MonomorphicObject) other;
|
|
60
|
+
for (TypeVariable var : fixedTypeVarMap.keySet()) {
|
|
61
|
+
IRubyObject a = fixedTypeVarMap.get(var).singleType();
|
|
62
|
+
IRubyObject b = o.fixedTypeVarMap.get(var) != null ? o.fixedTypeVarMap.get(var).singleType() : null;
|
|
63
|
+
if (a == null
|
|
64
|
+
|| b == null
|
|
65
|
+
|| !a.getMetaClass().equals(b.getMetaClass())) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
@Override
|
|
74
|
+
public String toString() {
|
|
75
|
+
return "<mobj:" + getMetaClass().toString() + getTypeVarMap() + ">";
|
|
76
|
+
}
|
|
77
|
+
}
|