153 //=>
154 //(let T' N$temp = E; N$temp instanceof T && (N = (T) N$temp == (T) N$temp))
155 JCBindingPattern patt = (JCBindingPattern)tree.pattern;
156 VarSymbol pattSym = patt.symbol;
157 Type tempType = tree.expr.type.hasTag(BOT) ?
158 syms.objectType
159 : tree.expr.type;
160 VarSymbol temp = new VarSymbol(pattSym.flags() | Flags.SYNTHETIC,
161 names.fromString(pattSym.name.toString() + target.syntheticNameChar() + "temp"),
162 tempType,
163 patt.symbol.owner);
164 JCExpression translatedExpr = translate(tree.expr);
165 Type castTargetType = types.boxedTypeOrType(pattSym.erasure(types));
166
167 result = makeTypeTest(make.Ident(temp), make.Type(castTargetType));
168
169 VarSymbol bindingVar = bindingContext.bindingDeclared(patt.symbol);
170 if (bindingVar != null) { //TODO: cannot be null here?
171 JCAssign fakeInit = (JCAssign)make.at(tree.pos).Assign(
172 make.Ident(bindingVar), convert(make.Ident(temp), castTargetType)).setType(bindingVar.erasure(types));
173 result = makeBinary(Tag.AND, (JCExpression)result,
174 makeBinary(Tag.EQ, fakeInit, convert(make.Ident(temp), castTargetType)));
175 }
176 result = make.at(tree.pos).LetExpr(make.VarDef(temp, translatedExpr), (JCExpression)result).setType(syms.booleanType);
177 ((LetExpr) result).needsCond = true;
178 } else {
179 super.visitTypeTest(tree);
180 }
181 }
182
183 @Override
184 public void visitBinary(JCBinary tree) {
185 bindingContext = new BasicBindingContext();
186 try {
187 super.visitBinary(tree);
188 result = bindingContext.decorateExpression(tree);
189 } finally {
190 bindingContext.pop();
191 }
192 }
193
194 @Override
|
153 //=>
154 //(let T' N$temp = E; N$temp instanceof T && (N = (T) N$temp == (T) N$temp))
155 JCBindingPattern patt = (JCBindingPattern)tree.pattern;
156 VarSymbol pattSym = patt.symbol;
157 Type tempType = tree.expr.type.hasTag(BOT) ?
158 syms.objectType
159 : tree.expr.type;
160 VarSymbol temp = new VarSymbol(pattSym.flags() | Flags.SYNTHETIC,
161 names.fromString(pattSym.name.toString() + target.syntheticNameChar() + "temp"),
162 tempType,
163 patt.symbol.owner);
164 JCExpression translatedExpr = translate(tree.expr);
165 Type castTargetType = types.boxedTypeOrType(pattSym.erasure(types));
166
167 result = makeTypeTest(make.Ident(temp), make.Type(castTargetType));
168
169 VarSymbol bindingVar = bindingContext.bindingDeclared(patt.symbol);
170 if (bindingVar != null) { //TODO: cannot be null here?
171 JCAssign fakeInit = (JCAssign)make.at(tree.pos).Assign(
172 make.Ident(bindingVar), convert(make.Ident(temp), castTargetType)).setType(bindingVar.erasure(types));
173 LetExpr nestedLE = make.LetExpr(List.of(make.Exec(fakeInit)),
174 make.Literal(true));
175 nestedLE.needsCond = true;
176 nestedLE.setType(syms.booleanType);
177 result = makeBinary(Tag.AND, (JCExpression)result, nestedLE);
178 }
179 result = make.at(tree.pos).LetExpr(make.VarDef(temp, translatedExpr), (JCExpression)result).setType(syms.booleanType);
180 ((LetExpr) result).needsCond = true;
181 } else {
182 super.visitTypeTest(tree);
183 }
184 }
185
186 @Override
187 public void visitBinary(JCBinary tree) {
188 bindingContext = new BasicBindingContext();
189 try {
190 super.visitBinary(tree);
191 result = bindingContext.decorateExpression(tree);
192 } finally {
193 bindingContext.pop();
194 }
195 }
196
197 @Override
|