==== Patch <classnames> level 1
Source: [No source]
Target: eb4544d6-894b-0410-9319-a9612837a279:/trunk/janino:332
        (http://svn.codehaus.org/janino)
Log:
fix and test fully access the class being compiled with a fully qualified classname

=== tests/src/EvaluatorTests.java
==================================================================
--- tests/src/EvaluatorTests.java	(revision 332)
+++ tests/src/EvaluatorTests.java	(patch classnames level 1)
@@ -52,6 +52,7 @@
         s.addTest(new EvaluatorTests("testManyEEs"));
         s.addTest(new EvaluatorTests("testGuessParameterNames"));
         s.addTest(new EvaluatorTests("testAssertNotCooked"));
+        s.addTest(new EvaluatorTests("testAccessingCompilingClass"));
         return s;
     }
 
@@ -191,4 +192,61 @@
         }
         fail();
     }
+    
+    public void testAccessingCompilingClass() throws Exception {
+        SimpleCompiler sc = new SimpleCompiler();
+        sc.cook("package test.simple;\n" +
+                "public class L0 {\n" +
+                "    public static class L1 {\n" +
+                "        public static class L2 { }\n" +
+                "    } \n" +
+                "    public Class getL0_1() {\n" +
+                "        return L0.class;\n" +
+                "    }\n" +
+                "    public Class getL0_2() {\n" +
+                "        return test.simple.L0.class;\n" +
+                "    }\n" +
+                "    public Class getL1_1() {\n" +
+                "        return L1.class;\n" +
+                "    }\n" +
+                "    public Class getL1_2() {\n" +
+                "        return L0.L1.class;\n" +
+                "    }\n" +
+                "    public Class getL1_3() {\n" +
+                "        return test.simple.L0.L1.class;\n" +
+                "    }\n" +
+                "    public Class getL2_1() {\n" +
+                "        return L1.L2.class;\n" +
+                "    }\n" +
+                "    public Class getL2_2() {\n" +
+                "        return L0.L1.L2.class;\n" +
+                "    }\n" +
+                "    public Class getL2_3() {\n" +
+                "        return test.simple.L0.L1.L2.class;\n" +
+                "    }\n" +
+                "}"
+        );
+        Class[] exp = new Class[] {
+                sc.getClassLoader().loadClass("test.simple.L0"),
+                sc.getClassLoader().loadClass("test.simple.L0$L1"),
+                sc.getClassLoader().loadClass("test.simple.L0$L1$L2"),
+        };
+        
+        
+        Method[] m = exp[0].getMethods();
+        Object inst = exp[0].newInstance();
+        int numTests = 0;
+        for(int i = 0; i < m.length; ++i) {
+            for(int j = 0; j < exp.length; ++j) {
+                if(m[i].getName().startsWith("getL"+j)) {
+                    Class res = (Class)m[i].invoke(inst, null);
+                    assertEquals(exp[j], res);
+                    ++numTests;
+                }
+            }
+        }
+        //we count tests just to make sure things didn't go horrifically wrong and
+        //the above loops become empty
+        assertEquals(8, numTests);
+    }
 }
=== src/org/codehaus/janino/UnitCompiler.java
==================================================================
--- src/org/codehaus/janino/UnitCompiler.java	(revision 332)
+++ src/org/codehaus/janino/UnitCompiler.java	(patch classnames level 1)
@@ -34,15 +34,38 @@
 
 package org.codehaus.janino;
 
-import java.io.*;
-import java.util.*;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.TreeMap;
 
-import org.codehaus.janino.IClass.*;
-import org.codehaus.janino.Java.*;
-import org.codehaus.janino.Java.CompilationUnit.*;
-import org.codehaus.janino.Visitor.*;
-import org.codehaus.janino.util.*;
-import org.codehaus.janino.util.enumerator.*;
+import org.codehaus.janino.IClass.IField;
+import org.codehaus.janino.IClass.IInvocable;
+import org.codehaus.janino.IClass.IMethod;
+import org.codehaus.janino.Java.FieldAccess;
+import org.codehaus.janino.Java.Invocation;
+import org.codehaus.janino.Java.Locatable;
+import org.codehaus.janino.Java.Rvalue;
+import org.codehaus.janino.Java.SimpleType;
+import org.codehaus.janino.Java.SuperclassFieldAccessExpression;
+import org.codehaus.janino.Java.CompilationUnit.ImportDeclaration;
+import org.codehaus.janino.Java.CompilationUnit.SingleStaticImportDeclaration;
+import org.codehaus.janino.Java.CompilationUnit.SingleTypeImportDeclaration;
+import org.codehaus.janino.Java.CompilationUnit.StaticImportOnDemandDeclaration;
+import org.codehaus.janino.Java.CompilationUnit.TypeImportOnDemandDeclaration;
+import org.codehaus.janino.Visitor.ImportVisitor;
+import org.codehaus.janino.util.ClassFile;
+import org.codehaus.janino.util.enumerator.EnumeratorSet;
 
 /**
  * This class actually implements the Java<sup>TM</sup> compiler. It is
@@ -346,36 +369,16 @@
                 if (tbd.isStatic()) b.addButDontEncloseStatement((Java.BlockStatement) tbd);
             }
 
-            // Create class initialization method iff there is any initialization code.
-            Java.MethodDeclarator classInitializationMethod = new Java.MethodDeclarator(
-                cd.getLocation(),                               // location
-                null,                                           // optionalDocComment
-                (short) (                                       // modifiers
-                    Mod.STATIC |
-                    Mod.PUBLIC
-                ),
-                new Java.BasicType(                             // type
-                    cd.getLocation(),
-                    Java.BasicType.VOID
-                ),
-                "<clinit>",                                     // name
-                new Java.FunctionDeclarator.FormalParameter[0], // formalParameters
-                new Java.ReferenceType[0],                      // thrownExceptions
-                b                                               // optionalBody
-            );
-            if (this.generatesCode(b)) {
-                classInitializationMethod.setDeclaringType(cd);
-                this.compile(classInitializationMethod, cf);
-            }
+            maybeCreateInitMethod(cd, cf, b);
         }
 
-        // Compile declared methods.
-        // (As a side effects, this fills the "syntheticFields" map.)
-        for (int i = 0; i < cd.declaredMethods.size(); ++i) {
-            this.compile(((Java.MethodDeclarator) cd.declaredMethods.get(i)), cf);
-        }
+        compileDeclaredMethods(cd, cf);
 
+        
         // Compile declared constructors.
+        // As a side effect of compiling methods and constructors, synthetic "class-dollar"
+        // methods (which implement class literals) are generated on-the fly. 
+        // We need to note how many we have here so we can compile the extras.
         int declaredMethodCount = cd.declaredMethods.size();
         {
             int syntheticFieldCount = cd.syntheticFields.size();
@@ -386,11 +389,8 @@
             }
         }
 
-        // As a side effect of compiling methods and constructors, synthetic "class-dollar"
-        // methods (which implement class literals) are generated on-the fly. Compile these.
-        for (int i = declaredMethodCount; i < cd.declaredMethods.size(); ++i) {
-            this.compile(((Java.MethodDeclarator) cd.declaredMethods.get(i)), cf);
-        }
+        //compile the aforementioned extras
+        compileDeclaredMethods(cd, cf, declaredMethodCount);
 
         // Class and instance variables.
         for (Iterator it = cd.variableDeclaratorsAndInitializers.iterator(); it.hasNext();) {
@@ -410,23 +410,8 @@
             );
         }
 
-        // Member types.
-        for (Iterator it = cd.getMemberTypeDeclarations().iterator(); it.hasNext();) {
-            Java.AbstractTypeDeclaration atd = ((Java.AbstractTypeDeclaration) it.next());
-            this.compile(atd);
+        compileDeclaredMemberTypes(cd, cf);
 
-            // Add InnerClasses attribute entry for member type declaration.
-            short innerClassInfoIndex = cf.addConstantClassInfo(this.resolve(atd).getDescriptor());
-            short outerClassInfoIndex = cf.addConstantClassInfo(iClass.getDescriptor());
-            short innerNameIndex      = cf.addConstantUtf8Info(((Java.MemberTypeDeclaration) atd).getName());
-            cf.addInnerClassesAttributeEntry(new ClassFile.InnerClassesAttribute.Entry(
-                innerClassInfoIndex, // innerClassInfoIndex
-                outerClassInfoIndex, // outerClassInfoIndex
-                innerNameIndex,      // innerNameIndex
-                atd.modifiers        // innerClassAccessFlags
-            ));
-        }
-
         // Add the generated class file to a thread-local store.
         this.generatedClassFiles.add(cf);
     }
@@ -510,7 +495,8 @@
     }
 
     public void compile2(Java.InterfaceDeclaration id) throws CompileException {
-
+        IClass iClass = this.resolve(id);
+        
         // Determine extended interfaces.
         id.interfaces = new IClass[id.extendedTypes.length];
         String[] interfaceDescriptors = new String[id.interfaces.length];
@@ -518,7 +504,7 @@
             id.interfaces[i] = this.getType(id.extendedTypes[i]);
             interfaceDescriptors[i] = id.interfaces[i].getDescriptor();
         }
-
+        
         // Create "ClassFile" object.
         ClassFile cf = new ClassFile(
             (short) (                         // accessFlags
@@ -527,7 +513,7 @@
                 Mod.INTERFACE |
                 Mod.ABSTRACT
             ),
-            this.resolve(id).getDescriptor(), // thisClassFD
+            iClass.getDescriptor(),           // thisClassFD
             Descriptor.OBJECT,                // superClassFD
             interfaceDescriptors              // interfaceFDs
         );
@@ -554,33 +540,10 @@
             Java.Block b = new Java.Block(id.getLocation());
             b.addButDontEncloseStatements(id.constantDeclarations);
 
-            // Create interface initialization method iff there is any initialization code.
-            if (this.generatesCode(b)) {
-                Java.MethodDeclarator md = new Java.MethodDeclarator(
-                    id.getLocation(),                               // location
-                    null,                                           // optionalDocComment
-                    (short) (Mod.STATIC | Mod.PUBLIC),              // modifiers
-                    new Java.BasicType(                             // type
-                        id.getLocation(),
-                        Java.BasicType.VOID
-                    ),
-                    "<clinit>",                                     // name
-                    new Java.FunctionDeclarator.FormalParameter[0], // formalParameters
-                    new Java.ReferenceType[0],                      // thrownExcaptions
-                    b                                               // optionalBody
-                );
-                md.setDeclaringType(id);
-                this.compile(md, cf);
-            }
+            maybeCreateInitMethod(id, cf, b);
         }
 
-        // Methods.
-        // Notice that as a side effect of compiling methods, synthetic "class-dollar"
-        // methods (which implement class literals) are generated on-the fly. Hence, we
-        // must not use an Iterator here.
-        for (int i = 0; i < id.declaredMethods.size(); ++i) {
-            this.compile(((Java.MethodDeclarator) id.declaredMethods.get(i)), cf);
-        }
+        compileDeclaredMethods(id, cf);
 
         // Class variables.
         for (int i = 0; i < id.constantDeclarations.size(); ++i) {
@@ -589,25 +552,91 @@
             this.addFields((Java.FieldDeclaration) bs, cf);
         }
 
-        // Member types.
-        for (Iterator it = id.getMemberTypeDeclarations().iterator(); it.hasNext();) {
+        compileDeclaredMemberTypes(id, cf);
+
+        // Add the generated class file to a thread-local store.
+        this.generatedClassFiles.add(cf);
+    }
+
+    /**
+     * Create class initialization method iff there is any initialization code.
+     * @param decl  The type declaration
+     * @param cf    The class file into which to put the method
+     * @param b     The block for the method (possibly empty)
+     * @throws CompileException
+     */
+    private void maybeCreateInitMethod(Java.AbstractTypeDeclaration decl,
+            ClassFile cf, Java.Block b) throws CompileException {
+        // Create interface initialization method iff there is any initialization code.
+        if (this.generatesCode(b)) {
+            Java.MethodDeclarator md = new Java.MethodDeclarator(
+                decl.getLocation(),                               // location
+                null,                                           // optionalDocComment
+                (short) (Mod.STATIC | Mod.PUBLIC),              // modifiers
+                new Java.BasicType(                             // type
+                    decl.getLocation(),
+                    Java.BasicType.VOID
+                ),
+                "<clinit>",                                     // name
+                new Java.FunctionDeclarator.FormalParameter[0], // formalParameters
+                new Java.ReferenceType[0],                      // thrownExcaptions
+                b                                               // optionalBody
+            );
+            md.setDeclaringType(decl);
+            this.compile(md, cf);
+        }
+    }
+
+    /**
+     * Compile all of the types for this declaration
+     * <p>
+     * NB: as a side effect this will fill in the sythetic field map
+     * @throws CompileException
+     */
+    private void compileDeclaredMemberTypes(Java.AbstractTypeDeclaration decl,
+            ClassFile cf) throws CompileException {
+        for (Iterator it = decl.getMemberTypeDeclarations().iterator(); it.hasNext();) {
             Java.AbstractTypeDeclaration atd = ((Java.AbstractTypeDeclaration) it.next());
             this.compile(atd);
 
             // Add InnerClasses attribute entry for member type declaration.
             short innerClassInfoIndex = cf.addConstantClassInfo(this.resolve(atd).getDescriptor());
-            short outerClassInfoIndex = cf.addConstantClassInfo(this.resolve(id).getDescriptor());
+            short outerClassInfoIndex = cf.addConstantClassInfo(this.resolve(decl).getDescriptor());
             short innerNameIndex      = cf.addConstantUtf8Info(((Java.MemberTypeDeclaration) atd).getName());
             cf.addInnerClassesAttributeEntry(new ClassFile.InnerClassesAttribute.Entry(
                 innerClassInfoIndex, // innerClassInfoIndex
                 outerClassInfoIndex, // outerClassInfoIndex
                 innerNameIndex,      // innerNameIndex
-                id.modifiers         // innerClassAccessFlags
+                decl.modifiers         // innerClassAccessFlags
             ));
         }
+    }
+    
+    /**
+     * Compile all of the methods for this declaration
+     * <p>
+     * NB: as a side effect this will fill in the sythetic field map
+     * @throws CompileException
+     */
+    private void compileDeclaredMethods(Java.AbstractTypeDeclaration decl,
+            ClassFile cf) throws CompileException {
+        compileDeclaredMethods(decl, cf, 0);
+    }
 
-        // Add the generated class file to a thread-local store.
-        this.generatedClassFiles.add(cf);
+    /**
+     * Compile methods for this declaration starting at startPos
+     * @param startPos starting param to fill in
+     * @throws CompileException
+     */
+    private void compileDeclaredMethods(Java.AbstractTypeDeclaration decl,
+            ClassFile cf, int startPos) throws CompileException {
+        // Methods.
+        // Notice that as a side effect of compiling methods, synthetic "class-dollar"
+        // methods (which implement class literals) are generated on-the fly. Hence, we
+        // must not use an Iterator here.
+        for (int i = startPos; i < decl.declaredMethods.size(); ++i) {
+            this.compile(((Java.MethodDeclarator) decl.declaredMethods.get(i)), cf);
+        }
     }
 
     /**
@@ -3855,13 +3884,7 @@
                     scopeCompilationUnit.optionalPackageDeclaration.packageName
                 );
                 String className = pkg == null ? simpleTypeName : pkg + "." + simpleTypeName;
-                IClass result;
-                try {
-                    result = this.iClassLoader.loadIClass(Descriptor.fromClassName(className));
-                } catch (ClassNotFoundException ex) {
-                    if (ex.getException() instanceof CompileException) throw (CompileException) ex.getException();
-                    throw new CompileException(className, rt.getLocation(), ex);
-                }
+                IClass result = findClassByName(rt.getLocation(), className);
                 if (result != null) return result;
             }
 
@@ -3906,19 +3929,13 @@
             // 6.5.5.2.1 PACKAGE.CLASS
             if (q instanceof Java.Package) {
                 String className = Java.join(rt.identifiers, ".");
-            IClass result;
-            try {
-                result = this.iClassLoader.loadIClass(Descriptor.fromClassName(className));
-            } catch (ClassNotFoundException ex) {
-                if (ex.getException() instanceof CompileException) throw (CompileException) ex.getException();
-                throw new CompileException(className, rt.getLocation(), ex);
+                IClass result = findClassByName(rt.getLocation(), className);
+                if (result != null) return result;
+                
+                this.compileError("Class \"" + className + "\" not found", rt.getLocation());
+                return this.iClassLoader.OBJECT;
             }
-            if (result != null) return result;
 
-            this.compileError("Class \"" + className + "\" not found", rt.getLocation());
-            return this.iClassLoader.OBJECT;
-        }
-
             // 6.5.5.2.2 CLASS.CLASS (member type)
             String memberTypeName = rt.identifiers[rt.identifiers.length - 1];
             IClass[] types = this.getType(this.toTypeOrCE(q)).findMemberType(memberTypeName);
@@ -3928,10 +3945,11 @@
             } else
             {
                 this.compileError("\"" + q + "\" and its supertypes declare more than one member type \"" + memberTypeName + "\"", rt.getLocation());
-    }
+            }
             return this.iClassLoader.OBJECT;
         }
     }
+    
     private IClass getType2(Java.RvalueMemberType rvmt) throws CompileException {
         IClass rvt = this.getType(rvmt.rvalue);
         IClass memberType = this.findMemberType(rvt, rvmt.identifier, rvmt.getLocation());
@@ -5147,13 +5165,7 @@
         if (UnitCompiler.DEBUG) System.out.println("lhs = " + lhs);
         if (lhs instanceof Java.Package) {
             String className = ((Java.Package) lhs).name + '.' + rhs;
-            IClass result;
-            try {
-                result = this.iClassLoader.loadIClass(Descriptor.fromClassName(className));
-            } catch (ClassNotFoundException ex) {
-                if (ex.getException() instanceof CompileException) throw (CompileException) ex.getException();
-                throw new CompileException(className, location, ex);
-            }
+            IClass result = findClassByName(location, className);
             if (result != null) return new Java.SimpleType(location, result);
 
             return new Java.Package(location, className);
@@ -5210,6 +5222,17 @@
         };
     }
 
+    private IClass findClassByName(Location location, String className) throws CompileException {
+        IClass res = this.findClass(className);
+        if(res != null) return res;
+        try {
+            return this.iClassLoader.loadIClass(Descriptor.fromClassName(className));
+        } catch (ClassNotFoundException ex) {
+            if (ex.getException() instanceof CompileException) throw (CompileException) ex.getException();
+            throw new CompileException(className, location, ex);
+        }
+    }
+
     /**
      * JLS 6.5.2.1
      * @param location
@@ -5422,13 +5445,7 @@
                 identifier :
                 scopeCompilationUnit.optionalPackageDeclaration.packageName + '.' + identifier
             );
-            IClass result;
-            try {
-                result = this.iClassLoader.loadIClass(Descriptor.fromClassName(className));
-            } catch (ClassNotFoundException ex) {
-                if (ex.getException() instanceof CompileException) throw (CompileException) ex.getException();
-                throw new CompileException(className, location, ex);
-            }
+            IClass result = findClassByName(location, className);
             if (result != null) return new Java.SimpleType(location, result);
         }
 

==== BEGIN SVK PATCH BLOCK ====
Version: svk v2.0.2 (linux)

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
==== END SVK PATCH BLOCK ====

