src/JavaLookup.st
branchjk_new_structure
changeset 1425 820078605f73
parent 1394 dc7d95a99161
child 1449 797c2aa3bbce
--- a/src/JavaLookup.st	Sat Mar 17 07:44:54 2012 +0000
+++ b/src/JavaLookup.st	Sat Mar 17 19:48:57 2012 +0000
@@ -277,6 +277,7 @@
         ]
     ].
 
+    "Search class for method candidates"
     cls := initialSearchClass theNonMetaclass.
     static ifTrue:[
         finder value: cls
@@ -296,6 +297,25 @@
 
         ^m.
     ].
+
+    "Hmm, hmm, maybe a public field?"
+    (argArrayOrNil size < 2) ifTrue:[
+        | field |
+
+        field := initialSearchClass theNonMetaclass
+                    lookupFieldFor: name
+                    static: initialSearchClass isMetaclass
+                    onlyPublic: true.
+        field notNil ifTrue:[
+            m := self compileProxyWithSelector: selector in: receiver class accessing: field.
+            ilc notNil ifTrue:[ilc bindTo: m forClass: receiver class].
+
+            "Install the proxy"
+            self addSelector: selector withMethod: m toClass: receiver class.
+
+            ^m.
+        ]
+    ].
     ^nil
 
     "Created: / 21-02-2011 / 13:38:55 / kursjan <kursjan@fit.cvut.cz>"
@@ -305,7 +325,7 @@
     "Created: / 19-11-2011 / 13:03:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 01-01-2012 / 19:58:59 / kursjan <kursjan@fit.cvut.cz>"
     "Modified (comment): / 02-01-2012 / 10:35:25 / kursjan <kursjan@fit.cvut.cz>"
-    "Modified: / 27-02-2012 / 19:43:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 17-03-2012 / 17:22:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !JavaLookup::Smalltalk2Java methodsFor:'lookup (old)'!
@@ -463,6 +483,36 @@
     "Created: / 01-01-2012 / 17:41:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+compileProxyWithSelector:selector in:class accessing: field
+    "For given field, create a proxy getter/setter"
+
+    
+    |compiler proxy body isSetter |
+
+    class theNonMetaclass classInit.
+    isSetter := selector last == $:.
+    compiler := ProxyMethodCompiler new.
+    isSetter ifTrue:[
+        body := compiler newJavaFieldSetter: field.
+        proxy := compiler 
+                compile:body
+                arguments: 1
+                selector:selector.
+    ] ifFalse:[
+        body := compiler newJavaFieldGetter: field.
+        proxy := compiler 
+                compile:body
+                arguments: 0
+                selector:selector.
+
+    ].
+
+    ^ proxy
+
+    "Modified: / 30-12-2011 / 14:44:11 / kursjan <kursjan@fit.cvut.cz>"
+    "Created: / 17-03-2012 / 16:54:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 compileProxyWithSelector:selector in:class calling:methods 
     "For given set of methods, create a dispatching proxy with given selector.
      This method performs typechecks on arguments and dispatch to proper method"