summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-06-17 22:05:14 +0000
committerRich Hickey <richhickey@gmail.com>2008-06-17 22:05:14 +0000
commitee08483128f4df1a26fe4e18926938306ef8d419 (patch)
tree99795454b0d9e58a217f6ad99e1efc82f8e52f28 /src
parentcc69bc7471f67b036798a65c13352c542aa1bb7a (diff)
experimental static member access classname/member, work for fields with no parens Math/PI, or static method invocations (Math/sqrt 42)
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/Compiler.java31
1 files changed, 29 insertions, 2 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java
index 3cdb65ea..0cc9a324 100644
--- a/src/jvm/clojure/lang/Compiler.java
+++ b/src/jvm/clojure/lang/Compiler.java
@@ -3707,6 +3707,19 @@ public static Object macroexpand1(Object x) throws Exception{
Symbol meth = Symbol.intern(sname.substring(1));
return RT.listStar(DOT, RT.second(form), meth, form.rest().rest());
}
+ else if (sym.ns != null)
+ {
+ Symbol target = Symbol.intern(sym.ns);
+ if(Namespace.find(target) == null)
+ {
+ Class c = HostExpr.maybeClass(target,false);
+ if(c != null)
+ {
+ Symbol meth = Symbol.intern(sym.name);
+ return RT.listStar(DOT, target, meth, form.rest());
+ }
+ }
+ }
else
{
//(s.substring 2 5) => (. s substring 2 5)
@@ -3819,6 +3832,18 @@ private static Expr analyzeSymbol(Symbol sym) throws Exception{
if(b != null)
return new LocalBindingExpr(b, tag);
}
+ else
+ {
+ Symbol nsSym = Symbol.create(sym.ns);
+ if(Namespace.find(nsSym) == null)
+ {
+ Class c = HostExpr.maybeClass(nsSym,false);
+ if(c != null)
+ {
+ return new StaticFieldExpr((Integer)LINE.get(),c,sym.name);
+ }
+ }
+ }
//Var v = lookupVar(sym, false);
// Var v = lookupVar(sym, false);
// if(v != null)
@@ -3897,9 +3922,11 @@ static Var lookupVar(Symbol sym, boolean internNew) throws Exception{
//note - ns-qualified vars in other namespaces must already exist
if(sym.ns != null)
{
- Namespace ns = Namespace.find(Symbol.create(sym.ns));
+ Symbol nsSym = Symbol.create(sym.ns);
+ Namespace ns = Namespace.find(nsSym);
if(ns == null)
- throw new Exception("No such namespace: " + sym.ns);
+ return null;
+ //throw new Exception("No such namespace: " + sym.ns);
Symbol name = Symbol.create(sym.name);
if(internNew && ns == currentNS())
var = currentNS().intern(name);