[jboss-cvs] javassist/src/main/javassist/compiler ...

Shigeru Chiba chiba at is.titech.ac.jp
Fri May 11 09:37:19 EDT 2007


  User: chiba   
  Date: 07/05/11 09:37:19

  Modified:    src/main/javassist/compiler  TypeChecker.java
  Log:
  fixed JIRA JASSIST-33
  
  Revision  Changes    Path
  1.16      +45 -13    javassist/src/main/javassist/compiler/TypeChecker.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: TypeChecker.java
  ===================================================================
  RCS file: /cvsroot/jboss/javassist/src/main/javassist/compiler/TypeChecker.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -b -r1.15 -r1.16
  --- TypeChecker.java	13 Jun 2006 02:33:13 -0000	1.15
  +++ TypeChecker.java	11 May 2007 13:37:19 -0000	1.16
  @@ -822,12 +822,9 @@
                   mem.setField(f);
                   return f;
               }
  -            else if (op == '.')
  +            else if (op == '.') {
                   try {
                       e.oprand1().accept(this);
  -                    if (exprType == CLASS && arrayDim == 0)
  -                        return resolver.lookupFieldByJvmName(className,
  -                                                    (Symbol)e.oprand2());
                   }
                   catch (NoFieldException nfe) {
                       if (nfe.getExpr() != e.oprand1())
  @@ -837,21 +834,56 @@
                        * If EXPR might be part of a qualified class name,
                        * lookupFieldByJvmName2() throws NoFieldException.
                        */
  -                    Member fname = (Member)e.oprand2();
  -                    String jvmClassName = nfe.getField();
  -                    CtField f = resolver.lookupFieldByJvmName2(jvmClassName,
  -                                                               fname, expr);
  -                    e.setOperator(MEMBER);
  -                    e.setOprand1(new Symbol(MemberResolver.jvmToJavaName(
  -                                                            jvmClassName)));
  -                    fname.setField(f);
  -                    return f;
  +                    return fieldAccess2(e, nfe.getField());
  +                }
  +
  +                CompileError err = null;
  +                try {
  +                    if (exprType == CLASS && arrayDim == 0)
  +                        return resolver.lookupFieldByJvmName(className,
  +                                                    (Symbol)e.oprand2());
  +                }
  +                catch (CompileError ce) {
  +                    err = ce;
  +                }
  +
  +                /* If a filed name is the same name as a package's,
  +                 * a static member of a class in that package is not
  +                 * visible.  For example,
  +                 *
  +                 * class Foo {
  +                 *   int javassist;
  +                 * }
  +                 *
  +                 * It is impossible to add the following method:
  +                 *
  +                 * String m() { return javassist.CtClass.intType.toString(); }
  +                 *
  +                 * because javassist is a field name.  However, this is
  +                 * often inconvenient, this compiler allows it.  The following
  +                 * code is for that.
  +                 */
  +                ASTree oprnd1 = e.oprand1(); 
  +                if (oprnd1 instanceof Symbol)
  +                    return fieldAccess2(e, ((Symbol)oprnd1).get());
  +
  +                if (err != null)
  +                    throw err;
                   }
           }
   
           throw new CompileError("bad filed access");
       }
   
  +    private CtField fieldAccess2(Expr e, String jvmClassName) throws CompileError {
  +        Member fname = (Member)e.oprand2();
  +        CtField f = resolver.lookupFieldByJvmName2(jvmClassName, fname, e);
  +        e.setOperator(MEMBER);
  +        e.setOprand1(new Symbol(MemberResolver.jvmToJavaName(jvmClassName)));
  +        fname.setField(f);
  +        return f;
  +    }
  +
       public void atClassObject(Expr expr) throws CompileError {
           exprType = CLASS;
           arrayDim = 0;
  
  
  



More information about the jboss-cvs-commits mailing list