1 16 19 20 package com.sun.org.apache.xalan.internal.xsltc.compiler; 21 22 import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type; 23 import com.sun.org.apache.xalan.internal.xsltc.compiler.util.TypeCheckError; 24 25 29 class VariableRefBase extends Expression { 30 31 34 protected VariableBase _variable; 35 36 40 protected Closure _closure = null; 41 42 public VariableRefBase(VariableBase variable) { 43 _variable = variable; 44 variable.addReference(this); 45 } 46 47 public VariableRefBase() { 48 _variable = null; 49 } 50 51 54 public VariableBase getVariable() { 55 return _variable; 56 } 57 58 69 public void addParentDependency() { 70 SyntaxTreeNode node = this; 71 while (node != null && node instanceof TopLevelElement == false) { 72 node = node.getParent(); 73 } 74 TopLevelElement parent = (TopLevelElement) node; 75 if (parent != null) { 76 VariableBase var = _variable; 77 if (_variable._ignore) { 78 if (_variable instanceof Variable) { 79 var = parent.getSymbolTable() 80 .lookupVariable(_variable._name); 81 } else if (_variable instanceof Param) { 82 var = parent.getSymbolTable().lookupParam(_variable._name); 83 } 84 } 85 parent.addDependency(var); 86 } 87 } 88 89 93 public boolean equals(Object obj) { 94 try { 95 return (_variable == ((VariableRefBase) obj)._variable); 96 } 97 catch (ClassCastException e) { 98 return false; 99 } 100 } 101 102 107 public String toString() { 108 return "variable-ref("+_variable.getName()+'/'+_variable.getType()+')'; 109 } 110 111 public Type typeCheck(SymbolTable stable) 112 throws TypeCheckError 113 { 114 if (_type != null) return _type; 116 117 if (_variable.isLocal()) { 119 SyntaxTreeNode node = getParent(); 120 do { 121 if (node instanceof Closure) { 122 _closure = (Closure) node; 123 break; 124 } 125 if (node instanceof TopLevelElement) { 126 break; } 128 node = node.getParent(); 129 } while (node != null); 130 131 if (_closure != null) { 132 _closure.addVariable(this); 133 } 134 } 135 136 _type = _variable.getType(); 138 139 if (_type == null) { 142 _variable.typeCheck(stable); 143 _type = _variable.getType(); 144 } 145 146 addParentDependency(); 148 149 return _type; 151 } 152 153 } 154 | Popular Tags |