001: // This file is part of KeY - Integrated Deductive Software Design
002: // Copyright (C) 2001-2007 Universitaet Karlsruhe, Germany
003: // Universitaet Koblenz-Landau, Germany
004: // Chalmers University of Technology, Sweden
005: //
006: // The KeY system is protected by the GNU General Public License.
007: // See LICENSE.TXT for details.
008: //
009: //
010:
011: // This file is taken from the RECODER library, which is protected by the LGPL,
012: // and modified.
013: /** This class is part of the AST RECODER builds when it parses and resolves Java
014: * programs with meta constructs and schema variables. It is transformed by Recoder2KeY
015: * to a subclass of ...rule.metaconstruct.ProgramMetaConstruct.
016: */package de.uka.ilkd.key.java.recoderext;
017:
018: import recoder.java.ProgramElement;
019: import recoder.java.SourceVisitor;
020: import recoder.java.Statement;
021: import recoder.java.StatementContainer;
022: import recoder.java.statement.JavaStatement;
023:
024: public class RMethodCallStatement extends JavaStatement implements
025: StatementContainer, KeYRecoderExtension {
026:
027: /** schemavariable needed by meta construct */
028: private ProgramVariableSVWrapper resultVar;
029:
030: /** schemavariable needed by method call */
031: private ExecutionContext ecsvw;
032:
033: /**
034: * Body.
035: */
036: protected Statement body;
037:
038: /**
039: * Labeled statement.
040: * @param resultVar the ProgramVariable the return value is assigned to
041: * @param ecsvw the ExecutionContext
042: * @param body a Statement containing the method body of
043: * the called method
044: */
045:
046: public RMethodCallStatement(ProgramVariableSVWrapper resultVar,
047: ExecutionContext ecsvw, Statement body) {
048: this .resultVar = resultVar;
049: this .ecsvw = ecsvw;
050: this .body = body;
051: }
052:
053: /**
054: Make parent role valid.
055: */
056: public void makeParentRoleValid() {
057: super .makeParentRoleValid();
058: if (body != null) {
059: body.setStatementContainer(this );
060: }
061: }
062:
063: public int getChildCount() {
064: int result = 0;
065: if (resultVar != null)
066: result++;
067: if (ecsvw != null)
068: result++;
069: if (body != null)
070: result++;
071: return result;
072: }
073:
074: /**
075: * Returns the child at the specified index in this node's "virtual"
076: * child array
077: * @param index an index into this node's "virtual" child array
078: * @return the program element at the given position
079: * @exception ArrayIndexOutOfBoundsException if <tt>index</tt> is out
080: * of bounds
081: */
082:
083: public ProgramElement getChildAt(int index) {
084: if (resultVar != null) {
085: if (index == 0)
086: return resultVar;
087: index--;
088: }
089: if (ecsvw != null) {
090: if (index == 0)
091: return ecsvw;
092: index--;
093: }
094: if (body != null) {
095: if (index == 0)
096: return body;
097: index--;
098: }
099: throw new ArrayIndexOutOfBoundsException();
100: }
101:
102: public int getChildPositionCode(ProgramElement child) {
103: // role 0: resultVar
104: // role 1: execution context
105: // role 2: body
106: if (resultVar == child) {
107: return 0;
108: }
109: if (ecsvw == child) {
110: return 1;
111: }
112: if (body == child) {
113: return 2;
114: }
115: return -1;
116: }
117:
118: /**
119: * Get the number of statements in this container.
120: * @return the number of statements.
121: */
122:
123: public int getStatementCount() {
124: return (body != null) ? 1 : 0;
125: }
126:
127: /**
128: * Replace a single child in the current node.
129: * The child to replace is matched by identity and hence must be known
130: * exactly. The replacement element can be null - in that case, the child
131: * is effectively removed.
132: * The parent role of the new child is validated, while the
133: * parent link of the replaced child is left untouched.
134: * @param p the old child.
135: * @param q the new child.
136: * @return true if a replacement has occured, false otherwise.
137: * @exception ClassCastException if the new child cannot take over
138: * the role of the old one.
139: */
140:
141: public boolean replaceChild(ProgramElement p, ProgramElement q) {
142: if (body == p) {
143: Statement r = (Statement) q;
144: body = r;
145: if (r != null) {
146: r.setStatementContainer(this );
147: }
148: return true;
149: }
150: return false;
151: }
152:
153: /**
154: Get child.
155: @return the statement.
156: */
157:
158: public Statement getChild() {
159: return body;
160: }
161:
162: /**
163: Get body.
164: @return the statement.
165: */
166:
167: public Statement getBody() {
168: return body;
169: }
170:
171: // /**
172: // Set child.
173: // @param statement a statement.
174: // */
175:
176: // public void setChild(Statement statement) {
177: // child = statement;
178: // }
179:
180: /**
181: * schemavariable needed by the metaconstruct (needed by method-call)
182: */
183: public void setVariableSV(ProgramVariableSVWrapper sv) {
184: this .resultVar = sv;
185: }
186:
187: public ProgramVariableSVWrapper getVariableSV() {
188: return resultVar;
189: }
190:
191: public ExecutionContext getExecutionContext() {
192: return ecsvw;
193: }
194:
195: /*
196: Return the statement at the specified index in this node's
197: "virtual" statement array.
198: @param index an index for a statement.
199: @return the statement with the given index.
200: @exception ArrayIndexOutOfBoundsException if <tt>index</tt> is out
201: of bounds.
202: */
203:
204: public Statement getStatementAt(int index) {
205: if (body != null && index == 0) {
206: return body;
207: }
208: throw new ArrayIndexOutOfBoundsException();
209: }
210:
211: //don't think we need it
212: public void accept(SourceVisitor v) {
213: }
214:
215: //???
216: public Object deepClone() {
217: return null;
218: }
219:
220: }
|