santiagopg    2002/06/26 14:25:35

  Modified:    java/src/org/apache/xalan/xsltc/compiler
                        ElementAvailableCall.java Expression.java
                        FunctionAvailableCall.java If.java LogicalExpr.java
                        When.java
  Log:
  Added support for function-available()/element-available() in logical
  expressions (note that these functions are resolved at compile time
  in XSLTC).
  
  Revision  Changes    Path
  1.6       +10 -1     
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/ElementAvailableCall.java
  
  Index: ElementAvailableCall.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/ElementAvailableCall.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- ElementAvailableCall.java 24 Apr 2002 17:03:15 -0000      1.5
  +++ ElementAvailableCall.java 26 Jun 2002 21:25:35 -0000      1.6
  @@ -88,6 +88,15 @@
       }
   
       /**
  +     * Returns an object representing the compile-time evaluation 
  +     * of an expression. We are only using this for function-available
  +     * and element-available at this time.
  +     */
  +    public Object evaluateAtCompileTime() {
  +     return getResult() ? Boolean.TRUE : Boolean.FALSE;
  +    }
  +
  +    /**
        * Returns the result that this function will return
        */
       public boolean getResult() {
  
  
  
  1.13      +10 -1     
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Expression.java
  
  Index: Expression.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Expression.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- Expression.java   24 Apr 2002 17:03:15 -0000      1.12
  +++ Expression.java   26 Jun 2002 21:25:35 -0000      1.13
  @@ -111,6 +111,15 @@
       }
                
       /**
  +     * Returns an object representing the compile-time evaluation 
  +     * of an expression. We are only using this for function-available
  +     * and element-available at this time.
  +     */
  +    public Object evaluateAtCompileTime() {
  +     return null;
  +    }
  +
  +    /**
        * Type check all the children of this node.
        */
       public Type typeCheck(SymbolTable stable) throws TypeCheckError {
  
  
  
  1.9       +10 -1     
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/FunctionAvailableCall.java
  
  Index: FunctionAvailableCall.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/FunctionAvailableCall.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- FunctionAvailableCall.java        25 Jun 2002 17:05:38 -0000      1.8
  +++ FunctionAvailableCall.java        26 Jun 2002 21:25:35 -0000      1.9
  @@ -120,6 +120,15 @@
       }
   
       /**
  +     * Returns an object representing the compile-time evaluation 
  +     * of an expression. We are only using this for function-available
  +     * and element-available at this time.
  +     */
  +    public Object evaluateAtCompileTime() {
  +     return getResult() ? Boolean.TRUE : Boolean.FALSE;
  +    }
  +
  +    /**
        * (For ext. java functions only)
        * Parses the argument to function-available to extract the package 
        * qualified class name, for example, given the argument 
  
  
  
  1.10      +6 -12     
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/If.java
  
  Index: If.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/If.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- If.java   1 Feb 2002 20:07:08 -0000       1.9
  +++ If.java   26 Jun 2002 21:25:35 -0000      1.10
  @@ -102,17 +102,11 @@
            return;
           }
   
  -     // We will ignore the contents of this <xsl:if> if we know that the
  -     // test will always return 'false'.
  -     if (_test instanceof ElementAvailableCall) {
  -         ElementAvailableCall call = (ElementAvailableCall)_test;
  -         _ignore = !call.getResult();
  -         return;
  -     }
  -     if (_test instanceof FunctionAvailableCall) {
  -         FunctionAvailableCall call = (FunctionAvailableCall)_test;
  -         _ignore = !call.getResult();
  -         return;
  +     // Ignore xsl:if when test is false (function-available() and
  +     // element-available())
  +     Object result = _test.evaluateAtCompileTime();
  +     if (result != null && result instanceof Boolean) {
  +         _ignore = !((Boolean) result).booleanValue();
        }
   
        parseChildren(parser);
  
  
  
  1.10      +26 -4     
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/LogicalExpr.java
  
  Index: LogicalExpr.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/LogicalExpr.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- LogicalExpr.java  1 Feb 2002 20:07:08 -0000       1.9
  +++ LogicalExpr.java  26 Jun 2002 21:25:35 -0000      1.10
  @@ -96,9 +96,31 @@
        * needed for context changes in node steps containing multiple 
predicates.
        */
       public boolean hasPositionCall() {
  -     if (_left.hasPositionCall()) return true;
  -     if (_right.hasPositionCall()) return true;
  -     return false;
  +     return (_left.hasPositionCall() || _right.hasPositionCall());
  +    }
  +
  +    /**
  +     * Returns an object representing the compile-time evaluation 
  +     * of an expression. We are only using this for function-available
  +     * and element-available at this time.
  +     */
  +    public Object evaluateAtCompileTime() {
  +     final Object leftb = _left.evaluateAtCompileTime();
  +     final Object rightb = _right.evaluateAtCompileTime();
  +
  +     // Return null if we can't evaluate at compile time
  +     if (leftb == null || rightb == null) {
  +         return null;
  +     }
  +
  +     if (_op == AND) {
  +         return (leftb == Boolean.TRUE && rightb == Boolean.TRUE) ?
  +             Boolean.TRUE : Boolean.FALSE;
  +     }
  +     else {
  +         return (leftb == Boolean.TRUE || rightb == Boolean.TRUE) ?
  +             Boolean.TRUE : Boolean.FALSE;
  +     }
       }
   
       /**
  
  
  
  1.10      +7 -8      
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/When.java
  
  Index: When.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/When.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- When.java 30 Oct 2001 08:42:55 -0000      1.9
  +++ When.java 26 Jun 2002 21:25:35 -0000      1.10
  @@ -90,13 +90,12 @@
   
       public void parseContents(Parser parser) {
        _test = parser.parseExpression(this, "test", null);
  -     if (_test instanceof ElementAvailableCall) {
  -         ElementAvailableCall call = (ElementAvailableCall)_test;
  -         _ignore = !call.getResult();
  -     }
  -     if (_test instanceof FunctionAvailableCall) {
  -         FunctionAvailableCall call = (FunctionAvailableCall)_test;
  -         _ignore = !call.getResult();
  +
  +     // Ignore xsl:if when test is false (function-available() and
  +     // element-available())
  +     Object result = _test.evaluateAtCompileTime();
  +     if (result != null && result instanceof Boolean) {
  +         _ignore = !((Boolean) result).booleanValue();
        }
   
        parseChildren(parser);
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to