001    /*
002     * The JastAdd Extensible Java Compiler (http://jastadd.org) is covered
003     * by the modified BSD License. You should have received a copy of the
004     * modified BSD license with this compiler.
005     * 
006     * Copyright (c) 2005-2008, Torbjorn Ekman
007     * All rights reserved.
008     */
009    
010    import java.util.*;
011    
012    aspect DeclareBeforeUse {
013      public int ASTNode.varChildIndex(Block b) {
014        ASTNode node = this;
015        while(node.getParent().getParent() != b) {
016          node = node.getParent();
017        }
018        return b.getStmtListNoTransform().getIndexOfChild(node);
019      }
020    
021      public boolean Block.declaredBeforeUse(Variable decl, ASTNode use) {
022        int indexDecl = ((ASTNode)decl).varChildIndex(this);
023        int indexUse = use.varChildIndex(this);
024        return indexDecl <= indexUse;
025      }
026      public boolean Block.declaredBeforeUse(Variable decl, int indexUse) {
027        int indexDecl = ((ASTNode)decl).varChildIndex(this);
028        return indexDecl <= indexUse;
029      }
030    
031      public int ASTNode.varChildIndex(TypeDecl t) {
032        ASTNode node = this;
033        while(node != null && node.getParent() != null && node.getParent().getParent() != t) {
034          node = node.getParent();
035        }
036        if(node == null)
037          return -1;
038        return t.getBodyDeclListNoTransform().getIndexOfChild(node);
039      }
040    
041      public boolean TypeDecl.declaredBeforeUse(Variable decl, ASTNode use) {
042        int indexDecl = ((ASTNode)decl).varChildIndex(this);
043        int indexUse = use.varChildIndex(this);
044        return indexDecl < indexUse;
045      }
046      public boolean TypeDecl.declaredBeforeUse(Variable decl, int indexUse) {
047        int indexDecl = ((ASTNode)decl).varChildIndex(this);
048        return indexDecl < indexUse;
049      }
050    }