1 /*******************************************************************************
2 * Copyright (c) 2000, 2004 IBM Corporation and others.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Common Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/cpl-v10.html
9 * IBM Corporation - initial API and implementation
10 *******************************************************************************/
11 package org.eclipse.jdt.internal.compiler.flow;
13 import org.eclipse.jdt.internal.compiler.lookup.FieldBinding;
14 import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding;
17 * Record conditional initialization status during definite assignment analysis
20 public class ConditionalFlowInfo extends FlowInfo {
22 public FlowInfo initsWhenTrue;
23 public FlowInfo initsWhenFalse;
25 ConditionalFlowInfo(FlowInfo initsWhenTrue, FlowInfo initsWhenFalse){
27 this.initsWhenTrue = initsWhenTrue;
28 this.initsWhenFalse = initsWhenFalse;
31 public FlowInfo addInitializationsFrom(FlowInfo otherInits) {
33 this.initsWhenTrue.addInitializationsFrom(otherInits);
34 this.initsWhenFalse.addInitializationsFrom(otherInits);
38 public FlowInfo addPotentialInitializationsFrom(FlowInfo otherInits) {
40 this.initsWhenTrue.addPotentialInitializationsFrom(otherInits);
41 this.initsWhenFalse.addPotentialInitializationsFrom(otherInits);
45 public FlowInfo asNegatedCondition() {
47 FlowInfo extra = initsWhenTrue;
48 initsWhenTrue = initsWhenFalse;
49 initsWhenFalse = extra;
53 public FlowInfo copy() {
55 return new ConditionalFlowInfo(initsWhenTrue.copy(), initsWhenFalse.copy());
58 public FlowInfo initsWhenFalse() {
60 return initsWhenFalse;
63 public FlowInfo initsWhenTrue() {
69 * Check status of definite assignment for a field.
71 public boolean isDefinitelyAssigned(FieldBinding field) {
73 return initsWhenTrue.isDefinitelyAssigned(field)
74 && initsWhenFalse.isDefinitelyAssigned(field);
78 * Check status of definite assignment for a local variable.
80 public boolean isDefinitelyAssigned(LocalVariableBinding local) {
82 return initsWhenTrue.isDefinitelyAssigned(local)
83 && initsWhenFalse.isDefinitelyAssigned(local);
87 * Check status of definite non-null assignment for a field.
89 public boolean isDefinitelyNonNull(FieldBinding field) {
91 return initsWhenTrue.isDefinitelyNonNull(field)
92 && initsWhenFalse.isDefinitelyNonNull(field);
96 * Check status of definite non-null assignment for a local variable.
98 public boolean isDefinitelyNonNull(LocalVariableBinding local) {
100 return initsWhenTrue.isDefinitelyNonNull(local)
101 && initsWhenFalse.isDefinitelyNonNull(local);
105 * Check status of definite null assignment for a field.
107 public boolean isDefinitelyNull(FieldBinding field) {
109 return initsWhenTrue.isDefinitelyNull(field)
110 && initsWhenFalse.isDefinitelyNull(field);
114 * Check status of definite null assignment for a local variable.
116 public boolean isDefinitelyNull(LocalVariableBinding local) {
118 return initsWhenTrue.isDefinitelyNull(local)
119 && initsWhenFalse.isDefinitelyNull(local);
122 public int reachMode(){
123 return unconditionalInits().reachMode();
126 public boolean isReachable(){
128 return unconditionalInits().isReachable();
129 //should maybe directly be: false
133 * Check status of potential assignment for a field.
135 public boolean isPotentiallyAssigned(FieldBinding field) {
137 return initsWhenTrue.isPotentiallyAssigned(field)
138 || initsWhenFalse.isPotentiallyAssigned(field);
142 * Check status of potential assignment for a local variable.
144 public boolean isPotentiallyAssigned(LocalVariableBinding local) {
146 return initsWhenTrue.isPotentiallyAssigned(local)
147 || initsWhenFalse.isPotentiallyAssigned(local);
151 * Record a field got definitely assigned.
153 public void markAsDefinitelyAssigned(FieldBinding field) {
155 initsWhenTrue.markAsDefinitelyAssigned(field);
156 initsWhenFalse.markAsDefinitelyAssigned(field);
160 * Record a field got definitely assigned.
162 public void markAsDefinitelyAssigned(LocalVariableBinding local) {
164 initsWhenTrue.markAsDefinitelyAssigned(local);
165 initsWhenFalse.markAsDefinitelyAssigned(local);
169 * Record a field got definitely assigned to non-null value.
171 public void markAsDefinitelyNonNull(FieldBinding field) {
173 initsWhenTrue.markAsDefinitelyNonNull(field);
174 initsWhenFalse.markAsDefinitelyNonNull(field);
178 * Record a field got definitely assigned to non-null value
180 public void markAsDefinitelyNonNull(LocalVariableBinding local) {
182 initsWhenTrue.markAsDefinitelyNonNull(local);
183 initsWhenFalse.markAsDefinitelyNonNull(local);
187 * Record a field got definitely assigned to null.
189 public void markAsDefinitelyNull(FieldBinding field) {
191 initsWhenTrue.markAsDefinitelyNull(field);
192 initsWhenFalse.markAsDefinitelyNull(field);
196 * Record a field got definitely assigned to null.
198 public void markAsDefinitelyNull(LocalVariableBinding local) {
200 initsWhenTrue.markAsDefinitelyNull(local);
201 initsWhenFalse.markAsDefinitelyNull(local);
205 * Clear the initialization info for a field
207 public void markAsDefinitelyNotAssigned(FieldBinding field) {
209 initsWhenTrue.markAsDefinitelyNotAssigned(field);
210 initsWhenFalse.markAsDefinitelyNotAssigned(field);
214 * Clear the initialization info for a local variable
216 public void markAsDefinitelyNotAssigned(LocalVariableBinding local) {
218 initsWhenTrue.markAsDefinitelyNotAssigned(local);
219 initsWhenFalse.markAsDefinitelyNotAssigned(local);
222 public FlowInfo setReachMode(int reachMode) {
224 initsWhenTrue.setReachMode(reachMode);
225 initsWhenFalse.setReachMode(reachMode);
230 * Converts conditional receiver into inconditional one, updated in the following way: <ul>
231 * <li> intersection of definitely assigned variables,
232 * <li> union of potentially assigned variables.
235 public UnconditionalFlowInfo mergedWith(UnconditionalFlowInfo otherInits) {
237 return unconditionalInits().mergedWith(otherInits);
240 public String toString() {
242 return "FlowInfo<true: " + initsWhenTrue.toString() + ", false: " + initsWhenFalse.toString() + ">"; //$NON-NLS-1$ //$NON-NLS-3$ //$NON-NLS-2$
245 public UnconditionalFlowInfo unconditionalInits() {
247 return initsWhenTrue.unconditionalInits().copy()
248 .mergedWith(initsWhenFalse.unconditionalInits());