1141 } |
1141 } |
1142 } |
1142 } |
1143 // typeArgs saved for next loop iteration. |
1143 // typeArgs saved for next loop iteration. |
1144 t = toP(F.at(pos).Select(t, ident())); |
1144 t = toP(F.at(pos).Select(t, ident())); |
1145 break; |
1145 break; |
1146 case LT: |
1146 // case LT: |
1147 if ((mode & (TYPE | NOPARAMS)) == 0) { |
1147 // if ((mode & (TYPE | NOPARAMS)) == 0) { |
1148 //could be an unbound method reference whose qualifier |
1148 // //could be an unbound method reference whose qualifier |
1149 //is a generic type i.e. A<S>#m |
1149 // //is a generic type i.e. A<S>#m |
1150 mode = EXPR | TYPE; |
1150 // mode = EXPR | TYPE; |
1151 JCTree.Tag op = JCTree.Tag.LT; |
1151 // JCTree.Tag op = JCTree.Tag.LT; |
1152 int pos1 = token.pos; |
1152 // int pos1 = token.pos; |
1153 nextToken(); |
1153 // nextToken(); |
1154 mode |= EXPR | TYPE | TYPEARG; |
1154 // mode |= EXPR | TYPE | TYPEARG; |
1155 JCExpression t1 = term3(); |
1155 // JCExpression t1 = term3(); |
1156 if ((mode & TYPE) != 0 && |
1156 // if ((mode & TYPE) != 0 && |
1157 (token.kind == COMMA || token.kind == GT)) { |
1157 // (token.kind == COMMA || token.kind == GT)) { |
1158 mode = TYPE; |
1158 // mode = TYPE; |
1159 ListBuffer<JCExpression> args = new ListBuffer<JCExpression>(); |
1159 // ListBuffer<JCExpression> args = new ListBuffer<JCExpression>(); |
1160 args.append(t1); |
1160 // args.append(t1); |
1161 while (token.kind == COMMA) { |
1161 // while (token.kind == COMMA) { |
1162 nextToken(); |
1162 // nextToken(); |
1163 args.append(typeArgument()); |
1163 // args.append(typeArgument()); |
1164 } |
1164 // } |
1165 accept(GT); |
1165 // accept(GT); |
1166 t = toP(F.at(pos1).TypeApply(t, args.toList())); |
1166 // t = toP(F.at(pos1).TypeApply(t, args.toList())); |
1167 checkGenerics(); |
1167 // checkGenerics(); |
1168 while (token.kind == DOT) { |
1168 // while (token.kind == DOT) { |
1169 nextToken(); |
1169 // nextToken(); |
1170 mode = TYPE; |
1170 // mode = TYPE; |
1171 t = toP(F.at(token.pos).Select(t, ident())); |
1171 // t = toP(F.at(token.pos).Select(t, ident())); |
1172 t = typeArgumentsOpt(t); |
1172 // t = typeArgumentsOpt(t); |
1173 } |
1173 // } |
1174 if (token.kind != HASH) { |
1174 // if (token.kind != HASH) { |
1175 //method reference expected here |
1175 // //method reference expected here |
1176 t = illegal(); |
1176 // t = illegal(); |
1177 } |
1177 // } |
1178 mode = EXPR; |
1178 // mode = EXPR; |
1179 break; |
1179 // break; |
1180 } else if ((mode & EXPR) != 0) { |
1180 // } else if ((mode & EXPR) != 0) { |
1181 //rollback - it was a binary expression |
1181 // //rollback - it was a binary expression |
1182 mode = EXPR; |
1182 // mode = EXPR; |
1183 JCExpression e = term2Rest(t1, TreeInfo.shiftPrec); |
1183 // JCExpression e = term2Rest(t1, TreeInfo.shiftPrec); |
1184 t = F.at(pos1).Binary(op, t, e); |
1184 // t = F.at(pos1).Binary(op, t, e); |
1185 t = termRest(term1Rest(term2Rest(t, TreeInfo.orPrec))); |
1185 // t = termRest(term1Rest(term2Rest(t, TreeInfo.orPrec))); |
1186 } |
1186 // } |
1187 } |
1187 // } |
1188 break loop; |
1188 // break loop; |
1189 default: |
1189 default: |
1190 break loop; |
1190 break loop; |
1191 } |
1191 } |
1192 } |
1192 } |
1193 } |
1193 } |