35 import com.sun.tools.javac.util.*; |
35 import com.sun.tools.javac.util.*; |
36 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticFlag; |
36 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticFlag; |
37 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; |
37 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; |
38 import com.sun.tools.javac.util.List; |
38 import com.sun.tools.javac.util.List; |
39 |
39 |
|
40 import static com.sun.tools.javac.parser.Tokens.TokenKind.*; |
|
41 import static com.sun.tools.javac.parser.Tokens.TokenKind.ASSERT; |
|
42 import static com.sun.tools.javac.parser.Tokens.TokenKind.CASE; |
|
43 import static com.sun.tools.javac.parser.Tokens.TokenKind.CATCH; |
|
44 import static com.sun.tools.javac.parser.Tokens.TokenKind.EQ; |
|
45 import static com.sun.tools.javac.parser.Tokens.TokenKind.GT; |
|
46 import static com.sun.tools.javac.parser.Tokens.TokenKind.IMPORT; |
|
47 import static com.sun.tools.javac.parser.Tokens.TokenKind.LT; |
40 import static com.sun.tools.javac.util.ListBuffer.lb; |
48 import static com.sun.tools.javac.util.ListBuffer.lb; |
41 import static com.sun.tools.javac.parser.Tokens.TokenKind.*; |
49 import static com.sun.tools.javac.tree.JCTree.Tag.*; |
42 |
50 |
43 /** The parser maps a token sequence into an abstract syntax |
51 /** The parser maps a token sequence into an abstract syntax |
44 * tree. It operates by recursive descent, with code derived |
52 * tree. It operates by recursive descent, with code derived |
45 * systematically from an LL(1) grammar. For efficiency reasons, an |
53 * systematically from an LL(1) grammar. For efficiency reasons, an |
46 * operator precedence scheme is used for parsing binary operation |
54 * operator precedence scheme is used for parsing binary operation |
789 protected StringBuffer foldStrings(JCTree tree) { |
797 protected StringBuffer foldStrings(JCTree tree) { |
790 if (!allowStringFolding) |
798 if (!allowStringFolding) |
791 return null; |
799 return null; |
792 List<String> buf = List.nil(); |
800 List<String> buf = List.nil(); |
793 while (true) { |
801 while (true) { |
794 if (tree.getTag() == JCTree.LITERAL) { |
802 if (tree.hasTag(LITERAL)) { |
795 JCLiteral lit = (JCLiteral) tree; |
803 JCLiteral lit = (JCLiteral) tree; |
796 if (lit.typetag == TypeTags.CLASS) { |
804 if (lit.typetag == TypeTags.CLASS) { |
797 StringBuffer sbuf = |
805 StringBuffer sbuf = |
798 new StringBuffer((String)lit.value); |
806 new StringBuffer((String)lit.value); |
799 while (buf.nonEmpty()) { |
807 while (buf.nonEmpty()) { |
800 sbuf.append(buf.head); |
808 sbuf.append(buf.head); |
801 buf = buf.tail; |
809 buf = buf.tail; |
802 } |
810 } |
803 return sbuf; |
811 return sbuf; |
804 } |
812 } |
805 } else if (tree.getTag() == JCTree.PLUS) { |
813 } else if (tree.hasTag(JCTree.Tag.PLUS)) { |
806 JCBinary op = (JCBinary)tree; |
814 JCBinary op = (JCBinary)tree; |
807 if (op.rhs.getTag() == JCTree.LITERAL) { |
815 if (op.rhs.hasTag(LITERAL)) { |
808 JCLiteral lit = (JCLiteral) op.rhs; |
816 JCLiteral lit = (JCLiteral) op.rhs; |
809 if (lit.typetag == TypeTags.CLASS) { |
817 if (lit.typetag == TypeTags.CLASS) { |
810 buf = buf.prepend((String) lit.value); |
818 buf = buf.prepend((String) lit.value); |
811 tree = op.lhs; |
819 tree = op.lhs; |
812 continue; |
820 continue; |
898 nextToken(); |
906 nextToken(); |
899 mode = EXPR | TYPE | NOPARAMS; |
907 mode = EXPR | TYPE | NOPARAMS; |
900 t = term3(); |
908 t = term3(); |
901 if ((mode & TYPE) != 0 && token.kind == LT) { |
909 if ((mode & TYPE) != 0 && token.kind == LT) { |
902 // Could be a cast to a parameterized type |
910 // Could be a cast to a parameterized type |
903 int op = JCTree.LT; |
911 JCTree.Tag op = JCTree.Tag.LT; |
904 int pos1 = token.pos; |
912 int pos1 = token.pos; |
905 nextToken(); |
913 nextToken(); |
906 mode &= (EXPR | TYPE); |
914 mode &= (EXPR | TYPE); |
907 mode |= TYPEARG; |
915 mode |= TYPEARG; |
908 JCExpression t1 = term3(); |
916 JCExpression t1 = term3(); |
1625 } |
1633 } |
1626 /* fall through to default */ |
1634 /* fall through to default */ |
1627 default: |
1635 default: |
1628 Token prevToken = token; |
1636 Token prevToken = token; |
1629 JCExpression t = term(EXPR | TYPE); |
1637 JCExpression t = term(EXPR | TYPE); |
1630 if (token.kind == COLON && t.getTag() == JCTree.IDENT) { |
1638 if (token.kind == COLON && t.hasTag(IDENT)) { |
1631 nextToken(); |
1639 nextToken(); |
1632 JCStatement stat = parseStatement(); |
1640 JCStatement stat = parseStatement(); |
1633 stats.append(F.at(pos).Labelled(prevToken.name(), stat)); |
1641 stats.append(F.at(pos).Labelled(prevToken.name(), stat)); |
1634 } else if ((lastmode & TYPE) != 0 && |
1642 } else if ((lastmode & TYPE) != 0 && |
1635 (token.kind == IDENTIFIER || |
1643 (token.kind == IDENTIFIER || |
1700 case FOR: { |
1708 case FOR: { |
1701 nextToken(); |
1709 nextToken(); |
1702 accept(LPAREN); |
1710 accept(LPAREN); |
1703 List<JCStatement> inits = token.kind == SEMI ? List.<JCStatement>nil() : forInit(); |
1711 List<JCStatement> inits = token.kind == SEMI ? List.<JCStatement>nil() : forInit(); |
1704 if (inits.length() == 1 && |
1712 if (inits.length() == 1 && |
1705 inits.head.getTag() == JCTree.VARDEF && |
1713 inits.head.hasTag(VARDEF) && |
1706 ((JCVariableDecl) inits.head).init == null && |
1714 ((JCVariableDecl) inits.head).init == null && |
1707 token.kind == COLON) { |
1715 token.kind == COLON) { |
1708 checkForeach(); |
1716 checkForeach(); |
1709 JCVariableDecl var = (JCVariableDecl)inits.head; |
1717 JCVariableDecl var = (JCVariableDecl)inits.head; |
1710 accept(COLON); |
1718 accept(COLON); |
1833 } |
1841 } |
1834 case ENUM: |
1842 case ENUM: |
1835 default: |
1843 default: |
1836 Token prevToken = token; |
1844 Token prevToken = token; |
1837 JCExpression expr = parseExpression(); |
1845 JCExpression expr = parseExpression(); |
1838 if (token.kind == COLON && expr.getTag() == JCTree.IDENT) { |
1846 if (token.kind == COLON && expr.hasTag(IDENT)) { |
1839 nextToken(); |
1847 nextToken(); |
1840 JCStatement stat = parseStatement(); |
1848 JCStatement stat = parseStatement(); |
1841 return F.at(pos).Labelled(prevToken.name(), stat); |
1849 return F.at(pos).Labelled(prevToken.name(), stat); |
1842 } else { |
1850 } else { |
1843 // This Exec is an "ExpressionStatement"; it subsumes the terminating semicolon |
1851 // This Exec is an "ExpressionStatement"; it subsumes the terminating semicolon |
2086 */ |
2094 */ |
2087 JCExpression annotationFieldValue() { |
2095 JCExpression annotationFieldValue() { |
2088 if (token.kind == IDENTIFIER) { |
2096 if (token.kind == IDENTIFIER) { |
2089 mode = EXPR; |
2097 mode = EXPR; |
2090 JCExpression t1 = term1(); |
2098 JCExpression t1 = term1(); |
2091 if (t1.getTag() == JCTree.IDENT && token.kind == EQ) { |
2099 if (t1.hasTag(IDENT) && token.kind == EQ) { |
2092 int pos = token.pos; |
2100 int pos = token.pos; |
2093 accept(EQ); |
2101 accept(EQ); |
2094 JCExpression v = annotationValue(); |
2102 JCExpression v = annotationValue(); |
2095 return toP(F.at(pos).Assign(t1, v)); |
2103 return toP(F.at(pos).Assign(t1, v)); |
2096 } else { |
2104 } else { |
2616 type = to(F.at(pos).TypeIdent(TypeTags.VOID)); |
2624 type = to(F.at(pos).TypeIdent(TypeTags.VOID)); |
2617 nextToken(); |
2625 nextToken(); |
2618 } else { |
2626 } else { |
2619 type = parseType(); |
2627 type = parseType(); |
2620 } |
2628 } |
2621 if (token.kind == LPAREN && !isInterface && type.getTag() == JCTree.IDENT) { |
2629 if (token.kind == LPAREN && !isInterface && type.hasTag(IDENT)) { |
2622 if (isInterface || tk.name() != className) |
2630 if (isInterface || tk.name() != className) |
2623 error(pos, "invalid.meth.decl.ret.type.req"); |
2631 error(pos, "invalid.meth.decl.ret.type.req"); |
2624 return List.of(methodDeclaratorRest( |
2632 return List.of(methodDeclaratorRest( |
2625 pos, mods, null, names.init, typarams, |
2633 pos, mods, null, names.init, typarams, |
2626 isInterface, true, dc)); |
2634 isInterface, true, dc)); |
2813 |
2821 |
2814 /** Check that given tree is a legal expression statement. |
2822 /** Check that given tree is a legal expression statement. |
2815 */ |
2823 */ |
2816 protected JCExpression checkExprStat(JCExpression t) { |
2824 protected JCExpression checkExprStat(JCExpression t) { |
2817 switch(t.getTag()) { |
2825 switch(t.getTag()) { |
2818 case JCTree.PREINC: case JCTree.PREDEC: |
2826 case PREINC: case PREDEC: |
2819 case JCTree.POSTINC: case JCTree.POSTDEC: |
2827 case POSTINC: case POSTDEC: |
2820 case JCTree.ASSIGN: |
2828 case ASSIGN: |
2821 case JCTree.BITOR_ASG: case JCTree.BITXOR_ASG: case JCTree.BITAND_ASG: |
2829 case BITOR_ASG: case BITXOR_ASG: case BITAND_ASG: |
2822 case JCTree.SL_ASG: case JCTree.SR_ASG: case JCTree.USR_ASG: |
2830 case SL_ASG: case SR_ASG: case USR_ASG: |
2823 case JCTree.PLUS_ASG: case JCTree.MINUS_ASG: |
2831 case PLUS_ASG: case MINUS_ASG: |
2824 case JCTree.MUL_ASG: case JCTree.DIV_ASG: case JCTree.MOD_ASG: |
2832 case MUL_ASG: case DIV_ASG: case MOD_ASG: |
2825 case JCTree.APPLY: case JCTree.NEWCLASS: |
2833 case APPLY: case NEWCLASS: |
2826 case JCTree.ERRONEOUS: |
2834 case ERRONEOUS: |
2827 return t; |
2835 return t; |
2828 default: |
2836 default: |
2829 JCExpression ret = F.at(t.pos).Erroneous(List.<JCTree>of(t)); |
2837 JCExpression ret = F.at(t.pos).Erroneous(List.<JCTree>of(t)); |
2830 error(ret, "not.stmt"); |
2838 error(ret, "not.stmt"); |
2831 return ret; |
2839 return ret; |
2834 |
2842 |
2835 /** Return precedence of operator represented by token, |
2843 /** Return precedence of operator represented by token, |
2836 * -1 if token is not a binary operator. @see TreeInfo.opPrec |
2844 * -1 if token is not a binary operator. @see TreeInfo.opPrec |
2837 */ |
2845 */ |
2838 static int prec(TokenKind token) { |
2846 static int prec(TokenKind token) { |
2839 int oc = optag(token); |
2847 JCTree.Tag oc = optag(token); |
2840 return (oc >= 0) ? TreeInfo.opPrec(oc) : -1; |
2848 return (oc != NO_TAG) ? TreeInfo.opPrec(oc) : -1; |
2841 } |
2849 } |
2842 |
2850 |
2843 /** |
2851 /** |
2844 * Return the lesser of two positions, making allowance for either one |
2852 * Return the lesser of two positions, making allowance for either one |
2845 * being unset. |
2853 * being unset. |
2851 return pos1; |
2859 return pos1; |
2852 return (pos1 < pos2 ? pos1 : pos2); |
2860 return (pos1 < pos2 ? pos1 : pos2); |
2853 } |
2861 } |
2854 |
2862 |
2855 /** Return operation tag of binary operator represented by token, |
2863 /** Return operation tag of binary operator represented by token, |
2856 * -1 if token is not a binary operator. |
2864 * No_TAG if token is not a binary operator. |
2857 */ |
2865 */ |
2858 static int optag(TokenKind token) { |
2866 static JCTree.Tag optag(TokenKind token) { |
2859 switch (token) { |
2867 switch (token) { |
2860 case BARBAR: |
2868 case BARBAR: |
2861 return JCTree.OR; |
2869 return OR; |
2862 case AMPAMP: |
2870 case AMPAMP: |
2863 return JCTree.AND; |
2871 return AND; |
2864 case BAR: |
2872 case BAR: |
2865 return JCTree.BITOR; |
2873 return BITOR; |
2866 case BAREQ: |
2874 case BAREQ: |
2867 return JCTree.BITOR_ASG; |
2875 return BITOR_ASG; |
2868 case CARET: |
2876 case CARET: |
2869 return JCTree.BITXOR; |
2877 return BITXOR; |
2870 case CARETEQ: |
2878 case CARETEQ: |
2871 return JCTree.BITXOR_ASG; |
2879 return BITXOR_ASG; |
2872 case AMP: |
2880 case AMP: |
2873 return JCTree.BITAND; |
2881 return BITAND; |
2874 case AMPEQ: |
2882 case AMPEQ: |
2875 return JCTree.BITAND_ASG; |
2883 return BITAND_ASG; |
2876 case EQEQ: |
2884 case EQEQ: |
2877 return JCTree.EQ; |
2885 return JCTree.Tag.EQ; |
2878 case BANGEQ: |
2886 case BANGEQ: |
2879 return JCTree.NE; |
2887 return NE; |
2880 case LT: |
2888 case LT: |
2881 return JCTree.LT; |
2889 return JCTree.Tag.LT; |
2882 case GT: |
2890 case GT: |
2883 return JCTree.GT; |
2891 return JCTree.Tag.GT; |
2884 case LTEQ: |
2892 case LTEQ: |
2885 return JCTree.LE; |
2893 return LE; |
2886 case GTEQ: |
2894 case GTEQ: |
2887 return JCTree.GE; |
2895 return GE; |
2888 case LTLT: |
2896 case LTLT: |
2889 return JCTree.SL; |
2897 return SL; |
2890 case LTLTEQ: |
2898 case LTLTEQ: |
2891 return JCTree.SL_ASG; |
2899 return SL_ASG; |
2892 case GTGT: |
2900 case GTGT: |
2893 return JCTree.SR; |
2901 return SR; |
2894 case GTGTEQ: |
2902 case GTGTEQ: |
2895 return JCTree.SR_ASG; |
2903 return SR_ASG; |
2896 case GTGTGT: |
2904 case GTGTGT: |
2897 return JCTree.USR; |
2905 return USR; |
2898 case GTGTGTEQ: |
2906 case GTGTGTEQ: |
2899 return JCTree.USR_ASG; |
2907 return USR_ASG; |
2900 case PLUS: |
2908 case PLUS: |
2901 return JCTree.PLUS; |
2909 return JCTree.Tag.PLUS; |
2902 case PLUSEQ: |
2910 case PLUSEQ: |
2903 return JCTree.PLUS_ASG; |
2911 return PLUS_ASG; |
2904 case SUB: |
2912 case SUB: |
2905 return JCTree.MINUS; |
2913 return MINUS; |
2906 case SUBEQ: |
2914 case SUBEQ: |
2907 return JCTree.MINUS_ASG; |
2915 return MINUS_ASG; |
2908 case STAR: |
2916 case STAR: |
2909 return JCTree.MUL; |
2917 return MUL; |
2910 case STAREQ: |
2918 case STAREQ: |
2911 return JCTree.MUL_ASG; |
2919 return MUL_ASG; |
2912 case SLASH: |
2920 case SLASH: |
2913 return JCTree.DIV; |
2921 return DIV; |
2914 case SLASHEQ: |
2922 case SLASHEQ: |
2915 return JCTree.DIV_ASG; |
2923 return DIV_ASG; |
2916 case PERCENT: |
2924 case PERCENT: |
2917 return JCTree.MOD; |
2925 return MOD; |
2918 case PERCENTEQ: |
2926 case PERCENTEQ: |
2919 return JCTree.MOD_ASG; |
2927 return MOD_ASG; |
2920 case INSTANCEOF: |
2928 case INSTANCEOF: |
2921 return JCTree.TYPETEST; |
2929 return TYPETEST; |
2922 default: |
2930 default: |
2923 return -1; |
2931 return NO_TAG; |
2924 } |
2932 } |
2925 } |
2933 } |
2926 |
2934 |
2927 /** Return operation tag of unary operator represented by token, |
2935 /** Return operation tag of unary operator represented by token, |
2928 * -1 if token is not a binary operator. |
2936 * No_TAG if token is not a binary operator. |
2929 */ |
2937 */ |
2930 static int unoptag(TokenKind token) { |
2938 static JCTree.Tag unoptag(TokenKind token) { |
2931 switch (token) { |
2939 switch (token) { |
2932 case PLUS: |
2940 case PLUS: |
2933 return JCTree.POS; |
2941 return POS; |
2934 case SUB: |
2942 case SUB: |
2935 return JCTree.NEG; |
2943 return NEG; |
2936 case BANG: |
2944 case BANG: |
2937 return JCTree.NOT; |
2945 return NOT; |
2938 case TILDE: |
2946 case TILDE: |
2939 return JCTree.COMPL; |
2947 return COMPL; |
2940 case PLUSPLUS: |
2948 case PLUSPLUS: |
2941 return JCTree.PREINC; |
2949 return PREINC; |
2942 case SUBSUB: |
2950 case SUBSUB: |
2943 return JCTree.PREDEC; |
2951 return PREDEC; |
2944 default: |
2952 default: |
2945 return -1; |
2953 return NO_TAG; |
2946 } |
2954 } |
2947 } |
2955 } |
2948 |
2956 |
2949 /** Return type tag of basic type represented by token, |
2957 /** Return type tag of basic type represented by token, |
2950 * -1 if token is not a basic type identifier. |
2958 * -1 if token is not a basic type identifier. |