提交 70acf964 编写于 作者: K katleman

Merge

......@@ -137,4 +137,5 @@ f2d6ed25857dfa7f269ac66e13666d648cb988c6 jdk8-b12
ae25163501bc7477cd907e26a006a6f1b05fdb6d jdk8-b13
58f1325d72b2bacc901f5189ee5e4e81e81ea657 jdk8-b14
07599bd780cab1f40da7915e1dc6774629b0cf8c jdk8-b15
1cbe86c11ba69521875c0b0357d7540781eb334d jdk8-b17
ec2c0973cc31e143cffc05ceb63d98fae76f97d4 jdk8-b16
/*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.source.tree;
import java.util.List;
/**
* A tree node for a lambda expression.
*
* For example:
* <pre>
* ()->{}
* (List<String> ls)->ls.size()
* (x,y)-> { return x + y; }
* </pre>
*/
public interface LambdaExpressionTree extends ExpressionTree {
/**
* Lambda expressions come in two forms: (i) expression lambdas, whose body
* is an expression, and (ii) statement lambdas, whose body is a block
*/
public enum BodyKind {
/** enum constant for expression lambdas */
EXPRESSION,
/** enum constant for statement lambdas */
STATEMENT;
}
List<? extends VariableTree> getParameters();
Tree getBody();
BodyKind getBodyKind();
}
/*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.source.tree;
import java.util.List;
import javax.lang.model.element.Name;
/**
* A tree node for a member reference expression.
*
* For example:
* <pre>
* <em>expression</em> # <em>[ identifier | new ]</em>
* </pre>
*
* @see JSR 292
*/
public interface MemberReferenceTree extends ExpressionTree {
/**
* There are two kinds of member references: (i) method references and
* (ii) constructor references
*/
public enum ReferenceMode {
/** enum constant for method references */
INVOKE,
/** enum constant for constructor references */
NEW
}
ReferenceMode getMode();
ExpressionTree getQualifierExpression();
Name getName();
List<? extends ExpressionTree> getTypeArguments();
}
......@@ -131,6 +131,11 @@ public interface Tree {
*/
MEMBER_SELECT(MemberSelectTree.class),
/**
* Used for instances of {@link MemberReferenceTree}.
*/
MEMBER_REFERENCE(MemberReferenceTree.class),
/**
* Used for instances of {@link ForLoopTree}.
*/
......@@ -186,6 +191,11 @@ public interface Tree {
*/
NEW_CLASS(NewClassTree.class),
/**
* Used for instances of {@link LambdaExpressionTree}.
*/
LAMBDA_EXPRESSION(LambdaExpressionTree.class),
/**
* Used for instances of {@link ParenthesizedTree}.
*/
......
......@@ -85,9 +85,11 @@ public interface TreeVisitor<R,P> {
R visitModifiers(ModifiersTree node, P p);
R visitNewArray(NewArrayTree node, P p);
R visitNewClass(NewClassTree node, P p);
R visitLambdaExpression(LambdaExpressionTree node, P p);
R visitParenthesized(ParenthesizedTree node, P p);
R visitReturn(ReturnTree node, P p);
R visitMemberSelect(MemberSelectTree node, P p);
R visitMemberReference(MemberReferenceTree node, P p);
R visitEmptyStatement(EmptyStatementTree node, P p);
R visitSwitch(SwitchTree node, P p);
R visitSynchronized(SynchronizedTree node, P p);
......
......@@ -172,6 +172,10 @@ public class SimpleTreeVisitor <R,P> implements TreeVisitor<R,P> {
return defaultAction(node, p);
}
public R visitLambdaExpression(LambdaExpressionTree node, P p) {
return defaultAction(node, p);
}
public R visitParenthesized(ParenthesizedTree node, P p) {
return defaultAction(node, p);
}
......@@ -208,6 +212,10 @@ public class SimpleTreeVisitor <R,P> implements TreeVisitor<R,P> {
return defaultAction(node, p);
}
public R visitMemberReference(MemberReferenceTree node, P p) {
return defaultAction(node, p);
}
public R visitIdentifier(IdentifierTree node, P p) {
return defaultAction(node, p);
}
......
......@@ -285,6 +285,12 @@ public class TreeScanner<R,P> implements TreeVisitor<R,P> {
return r;
}
public R visitLambdaExpression(LambdaExpressionTree node, P p) {
R r = scan(node.getParameters(), p);
r = scanAndReduce(node.getBody(), p, r);
return r;
}
public R visitParenthesized(ParenthesizedTree node, P p) {
return scan(node.getExpression(), p);
}
......@@ -333,6 +339,12 @@ public class TreeScanner<R,P> implements TreeVisitor<R,P> {
return scan(node.getExpression(), p);
}
public R visitMemberReference(MemberReferenceTree node, P p) {
R r = scan(node.getQualifierExpression(), p);
r = scanAndReduce(node.getTypeArguments(), p, r);
return r;
}
public R visitIdentifier(IdentifierTree node, P p) {
return null;
}
......
......@@ -194,6 +194,12 @@ public enum Source {
public boolean allowObjectToPrimitiveCast() {
return compareTo(JDK1_7) >= 0;
}
public boolean allowLambda() {
return compareTo(JDK1_8) >= 0;
}
public boolean allowMethodReferences() {
return compareTo(JDK1_8) >= 0;
}
public static SourceVersion toSourceVersion(Source source) {
switch(source) {
case JDK1_2:
......
......@@ -1975,6 +1975,16 @@ public class Attr extends JCTree.Visitor {
result = check(tree, owntype, VAL, pkind, pt);
}
@Override
public void visitLambda(JCLambda that) {
throw new UnsupportedOperationException("Lambda expression not supported yet");
}
@Override
public void visitReference(JCMemberReference that) {
throw new UnsupportedOperationException("Member references not supported yet");
}
public void visitParens(JCParens tree) {
Type owntype = attribTree(tree.expr, env, pkind, pt);
result = check(tree, owntype, pkind, pkind, pt);
......
......@@ -637,6 +637,10 @@ public class JavaTokenizer {
lexError(pos, "unclosed.str.lit");
}
break loop;
case '#':
reader.scanChar();
tk = TokenKind.HASH;
break loop;
default:
if (isSpecial(reader.ch)) {
scanOperator();
......
......@@ -49,6 +49,11 @@ public interface Lexer {
*/
Token token();
/**
* Return token with given lookahead.
*/
Token token(int lookahead);
/**
* Return the last character position of the previous token.
*/
......
......@@ -26,8 +26,9 @@
package com.sun.tools.javac.parser;
import java.nio.*;
import java.util.List;
import java.util.ArrayList;
import com.sun.tools.javac.util.*;
import com.sun.tools.javac.util.Position.LineMap;
import com.sun.tools.javac.parser.JavaTokenizer.*;
......@@ -53,6 +54,10 @@ public class Scanner implements Lexer {
*/
private Token prevToken;
/** Buffer of saved tokens (used during lookahead)
*/
private List<Token> savedTokens = new ArrayList<Token>();
private JavaTokenizer tokenizer;
/**
* Create a scanner from the input array. This method might
......@@ -80,8 +85,23 @@ public class Scanner implements Lexer {
}
public Token token() {
return token;
return token(0);
}
public Token token(int lookahead) {
if (lookahead == 0) {
return token;
} else {
ensureLookahead(lookahead);
return savedTokens.get(lookahead - 1);
}
}
//where
private void ensureLookahead(int lookahead) {
for (int i = savedTokens.size() ; i < lookahead ; i ++) {
savedTokens.add(tokenizer.readToken());
}
}
public Token prevToken() {
return prevToken;
......@@ -89,7 +109,11 @@ public class Scanner implements Lexer {
public void nextToken() {
prevToken = token;
token = tokenizer.readToken();
if (!savedTokens.isEmpty()) {
token = savedTokens.remove(0);
} else {
token = tokenizer.readToken();
}
}
public Token split() {
......
......@@ -176,6 +176,8 @@ public class Tokens {
TRUE("true", Tag.NAMED),
FALSE("false", Tag.NAMED),
NULL("null", Tag.NAMED),
ARROW("->"),
HASH("#"),
LPAREN("("),
RPAREN(")"),
LBRACE("{"),
......
......@@ -1945,6 +1945,16 @@ compiler.err.string.switch.not.supported.in.source=\
strings in switch are not supported in -source {0}\n\
(use -source 7 or higher to enable strings in switch)
# 0: string
compiler.err.lambda.not.supported.in.source=\
lambda expressions are not supported in -source {0}\n\
(use -source 8 or higher to enable lambda expressions)
# 0: string
compiler.err.method.references.not.supported.in.source=\
method references are not supported in -source {0}\n\
(use -source 8 or higher to enable method references)
########################################
# Diagnostics for verbose resolution
# used by Resolve (debug only)
......
......@@ -41,6 +41,8 @@ import com.sun.tools.javac.code.Scope.*;
import com.sun.tools.javac.code.Symbol.*;
import com.sun.tools.javac.parser.EndPosTable;
import com.sun.source.tree.*;
import com.sun.source.tree.LambdaExpressionTree.BodyKind;
import com.sun.source.tree.MemberReferenceTree.ReferenceMode;
import static com.sun.tools.javac.code.BoundKind.*;
import static com.sun.tools.javac.tree.JCTree.Tag.*;
......@@ -198,6 +200,10 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
*/
NEWARRAY,
/** Lambda expression, of type Lambda.
*/
LAMBDA,
/** Parenthesized subexpressions, of type Parens.
*/
PARENS,
......@@ -222,6 +228,10 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
*/
SELECT,
/** Member references, of type Reference.
*/
REFERENCE,
/** Simple identifiers, of type Ident.
*/
IDENT,
......@@ -1486,6 +1496,56 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
}
}
/**
* A lambda expression.
*/
public static class JCLambda extends JCExpression implements LambdaExpressionTree {
public List<JCVariableDecl> params;
public JCTree body;
public Type targetType;
public boolean canCompleteNormally = true;
public List<Type> inferredThrownTypes;
public JCLambda(List<JCVariableDecl> params,
JCTree body) {
this.params = params;
this.body = body;
}
@Override
public Tag getTag() {
return LAMBDA;
}
@Override
public void accept(Visitor v) {
v.visitLambda(this);
}
@Override
public <R, D> R accept(TreeVisitor<R, D> v, D d) {
return v.visitLambdaExpression(this, d);
}
public Kind getKind() {
return Kind.LAMBDA_EXPRESSION;
}
public JCTree getBody() {
return body;
}
public java.util.List<? extends VariableTree> getParameters() {
return params;
}
@Override
public JCLambda setType(Type type) {
super.setType(type);
return this;
}
@Override
public BodyKind getBodyKind() {
return body.hasTag(BLOCK) ?
BodyKind.STATEMENT :
BodyKind.EXPRESSION;
}
}
/**
* A parenthesized subexpression ( ... )
*/
......@@ -1746,6 +1806,46 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
}
}
/**
* Selects a member expression.
*/
public static class JCMemberReference extends JCExpression implements MemberReferenceTree {
public ReferenceMode mode;
public Name name;
public JCExpression expr;
public List<JCExpression> typeargs;
public Type targetType;
public Symbol sym;
protected JCMemberReference(ReferenceMode mode, Name name, JCExpression expr, List<JCExpression> typeargs) {
this.mode = mode;
this.name = name;
this.expr = expr;
this.typeargs = typeargs;
}
@Override
public void accept(Visitor v) { v.visitReference(this); }
public Kind getKind() { return Kind.MEMBER_REFERENCE; }
@Override
public ReferenceMode getMode() { return mode; }
@Override
public JCExpression getQualifierExpression() { return expr; }
@Override
public Name getName() { return name; }
@Override
public List<JCExpression> getTypeArguments() { return typeargs; }
@Override
public <R,D> R accept(TreeVisitor<R,D> v, D d) {
return v.visitMemberReference(this, d);
}
@Override
public Tag getTag() {
return REFERENCE;
}
}
/**
* An identifier
* @param idname the name
......@@ -2271,6 +2371,7 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
public void visitApply(JCMethodInvocation that) { visitTree(that); }
public void visitNewClass(JCNewClass that) { visitTree(that); }
public void visitNewArray(JCNewArray that) { visitTree(that); }
public void visitLambda(JCLambda that) { visitTree(that); }
public void visitParens(JCParens that) { visitTree(that); }
public void visitAssign(JCAssign that) { visitTree(that); }
public void visitAssignop(JCAssignOp that) { visitTree(that); }
......@@ -2280,6 +2381,7 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
public void visitTypeTest(JCInstanceOf that) { visitTree(that); }
public void visitIndexed(JCArrayAccess that) { visitTree(that); }
public void visitSelect(JCFieldAccess that) { visitTree(that); }
public void visitReference(JCMemberReference that) { visitTree(that); }
public void visitIdent(JCIdent that) { visitTree(that); }
public void visitLiteral(JCLiteral that) { visitTree(that); }
public void visitTypeIdent(JCPrimitiveTypeTree that) { visitTree(that); }
......
......@@ -28,6 +28,8 @@ package com.sun.tools.javac.tree;
import java.io.*;
import java.util.*;
import com.sun.source.tree.MemberReferenceTree.ReferenceMode;
import com.sun.tools.javac.util.*;
import com.sun.tools.javac.util.List;
import com.sun.tools.javac.code.*;
......@@ -907,6 +909,17 @@ public class Pretty extends JCTree.Visitor {
}
}
public void visitLambda(JCLambda tree) {
try {
print("(");
printExprs(tree.params);
print(")->");
printExpr(tree.body);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
public void visitParens(JCParens tree) {
try {
print("(");
......@@ -1052,6 +1065,21 @@ public class Pretty extends JCTree.Visitor {
}
}
public void visitReference(JCMemberReference tree) {
try {
printExpr(tree.expr);
print("#");
if (tree.typeargs != null) {
print("<");
printExprs(tree.typeargs);
print(">");
}
print(tree.getMode() == ReferenceMode.INVOKE ? tree.name : "new");
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
public void visitIdent(JCIdent tree) {
try {
print(tree.name);
......
......@@ -271,6 +271,13 @@ public class TreeCopier<P> implements TreeVisitor<JCTree,P> {
return M.at(t.pos).NewClass(encl, typeargs, clazz, args, def);
}
public JCTree visitLambdaExpression(LambdaExpressionTree node, P p) {
JCLambda t = (JCLambda) node;
List<JCVariableDecl> params = copy(t.params, p);
JCTree body = copy(t.body, p);
return M.at(t.pos).Lambda(params, body);
}
public JCTree visitParenthesized(ParenthesizedTree node, P p) {
JCParens t = (JCParens) node;
JCExpression expr = copy(t.expr, p);
......@@ -289,6 +296,13 @@ public class TreeCopier<P> implements TreeVisitor<JCTree,P> {
return M.at(t.pos).Select(selected, t.name);
}
public JCTree visitMemberReference(MemberReferenceTree node, P p) {
JCMemberReference t = (JCMemberReference) node;
JCExpression expr = copy(t.expr, p);
List<JCExpression> typeargs = copy(t.typeargs, p);
return M.at(t.pos).Reference(t.mode, t.name, expr, typeargs);
}
public JCTree visitEmptyStatement(EmptyStatementTree node, P p) {
JCSkip t = (JCSkip) node;
return M.at(t.pos).Skip();
......
......@@ -227,6 +227,34 @@ public class TreeInfo {
}
}
/**
* Return true if the AST corresponds to a static select of the kind A.B
*/
public static boolean isStaticSelector(JCTree base, Names names) {
if (base == null)
return false;
switch (base.getTag()) {
case IDENT:
JCIdent id = (JCIdent)base;
return id.name != names._this &&
id.name != names._super &&
isStaticSym(base);
case SELECT:
return isStaticSym(base) &&
isStaticSelector(((JCFieldAccess)base).selected, names);
case TYPEAPPLY:
return true;
default:
return false;
}
}
//where
private static boolean isStaticSym(JCTree tree) {
Symbol sym = symbol(tree);
return (sym.kind == Kinds.TYP ||
sym.kind == Kinds.PCK);
}
/** Return true if a tree represents the null literal. */
public static boolean isNull(JCTree tree) {
if (!tree.hasTag(LITERAL))
......
......@@ -351,6 +351,14 @@ public class TreeMaker implements JCTree.Factory {
return tree;
}
public JCLambda Lambda(List<JCVariableDecl> params,
JCTree body)
{
JCLambda tree = new JCLambda(params, body);
tree.pos = pos;
return tree;
}
public JCParens Parens(JCExpression expr) {
JCParens tree = new JCParens(expr);
tree.pos = pos;
......@@ -405,6 +413,13 @@ public class TreeMaker implements JCTree.Factory {
return tree;
}
public JCMemberReference Reference(JCMemberReference.ReferenceMode mode, Name name,
JCExpression expr, List<JCExpression> typeargs) {
JCMemberReference tree = new JCMemberReference(mode, name, expr, typeargs);
tree.pos = pos;
return tree;
}
public JCIdent Ident(Name name) {
JCIdent tree = new JCIdent(name, null);
tree.pos = pos;
......
......@@ -212,6 +212,11 @@ public class TreeScanner extends Visitor {
scan(tree.elems);
}
public void visitLambda(JCLambda tree) {
scan(tree.body);
scan(tree.params);
}
public void visitParens(JCParens tree) {
scan(tree.expr);
}
......@@ -254,6 +259,11 @@ public class TreeScanner extends Visitor {
scan(tree.selected);
}
public void visitReference(JCMemberReference tree) {
scan(tree.expr);
scan(tree.typeargs);
}
public void visitIdent(JCIdent tree) {
}
......
......@@ -282,6 +282,12 @@ public class TreeTranslator extends JCTree.Visitor {
result = tree;
}
public void visitLambda(JCLambda tree) {
tree.params = translate(tree.params);
tree.body = translate(tree.body);
result = tree;
}
public void visitNewArray(JCNewArray tree) {
tree.elemtype = translate(tree.elemtype);
tree.dims = translate(tree.dims);
......@@ -340,6 +346,11 @@ public class TreeTranslator extends JCTree.Visitor {
result = tree;
}
public void visitReference(JCMemberReference tree) {
tree.expr = translate(tree.expr);
result = tree;
}
public void visitIdent(JCIdent tree) {
result = tree;
}
......
/*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 7120266
* @summary javac fails to compile hotspot code
* @compile T7120266.java
*/
class T7120266 {
void test(int i, int len) { that(i < len, "oopmap"); }
void that(boolean b, String s) { };
}
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -23,7 +23,6 @@
// key: compiler.err.catch.without.try
// key: compiler.err.expected
// key: compiler.err.not.stmt
class CatchWithoutTry {
void m() {
......
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -24,5 +24,5 @@
// key: compiler.err.illegal.char
class IllegalChar {
int i = #;
int i = `;
}
/*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
// key: compiler.err.lambda.not.supported.in.source
// options: -source 7 -Xlint:-options
class LambdaNotSupported {
S s = ()->{};
}
/*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
// key: compiler.err.method.references.not.supported.in.source
// options: -source 7 -Xlint:-options
class MethodReferencesNotSupported {
S s = A#foo;
}
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
// key: compiler.err.not.stmt
class NotAStatement {
void m() {
x + 1;
}
}
T6665356.java:17:37: compiler.err.improperly.formed.type.param.missing
T6665356.java:18:40: compiler.err.improperly.formed.type.inner.raw.param
T6665356.java:26:23: compiler.err.improperly.formed.type.param.missing
T6665356.java:26:22: compiler.err.improperly.formed.type.param.missing
T6665356.java:27:25: compiler.err.improperly.formed.type.inner.raw.param
4 errors
/*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 7115050
* @summary Add parser support for lambda expressions
*/
import com.sun.source.util.JavacTask;
import java.net.URI;
import java.util.Arrays;
import javax.tools.Diagnostic;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
public class LambdaParserTest {
static int checkCount = 0;
enum LambdaKind {
NILARY_EXPR("()->x"),
NILARY_STMT("()->{ return x; }"),
ONEARY_SHORT_EXPR("x->x"),
ONEARY_SHORT_STMT("x->{ return x; }"),
ONEARY_EXPR("(#M1 #T1 x)->x"),
ONEARY_STMT("(#M1 #T1 x)->{ return x; }"),
TWOARY_EXPR("(#M1 #T1 x, #M2 #T2 y)->x"),
TWOARY_STMT("(#M1 #T1 x, #M2 #T2 y)->{ return x; }");
String lambdaTemplate;
LambdaKind(String lambdaTemplate) {
this.lambdaTemplate = lambdaTemplate;
}
String getLambdaString(LambdaParameterKind pk1, LambdaParameterKind pk2,
ModifierKind mk1, ModifierKind mk2) {
return lambdaTemplate.replaceAll("#M1", mk1.modifier)
.replaceAll("#M2", mk2.modifier)
.replaceAll("#T1", pk1.parameterType)
.replaceAll("#T2", pk2.parameterType);
}
int arity() {
switch (this) {
case NILARY_EXPR:
case NILARY_STMT: return 0;
case ONEARY_SHORT_EXPR:
case ONEARY_SHORT_STMT:
case ONEARY_EXPR:
case ONEARY_STMT: return 1;
case TWOARY_EXPR:
case TWOARY_STMT: return 2;
default: throw new AssertionError("Invalid lambda kind " + this);
}
}
boolean isShort() {
return this == ONEARY_SHORT_EXPR ||
this == ONEARY_SHORT_STMT;
}
}
enum LambdaParameterKind {
IMPLICIT(""),
EXPLIICT_SIMPLE("A"),
EXPLICIT_VARARGS("A..."),
EXPLICIT_GENERIC1("A<X>"),
EXPLICIT_GENERIC3("A<? extends X, ? super Y>");
String parameterType;
LambdaParameterKind(String parameterType) {
this.parameterType = parameterType;
}
boolean explicit() {
return this != IMPLICIT;
}
}
enum ModifierKind {
NONE(""),
FINAL("final"),
PUBLIC("public");
String modifier;
ModifierKind(String modifier) {
this.modifier = modifier;
}
boolean compatibleWith(LambdaParameterKind pk) {
switch (this) {
case PUBLIC: return false;
case FINAL: return pk != LambdaParameterKind.IMPLICIT;
case NONE: return true;
default: throw new AssertionError("Invalid modifier kind " + this);
}
}
}
enum ExprKind {
NONE("#L#S"),
SINGLE_PAREN1("(#L#S)"),
SINGLE_PAREN2("(#L)#S"),
DOUBLE_PAREN1("((#L#S))"),
DOUBLE_PAREN2("((#L)#S)"),
DOUBLE_PAREN3("((#L))#S");
String expressionTemplate;
ExprKind(String expressionTemplate) {
this.expressionTemplate = expressionTemplate;
}
String expressionString(LambdaParameterKind pk1, LambdaParameterKind pk2,
ModifierKind mk1, ModifierKind mk2, LambdaKind lk, SubExprKind sk) {
return expressionTemplate.replaceAll("#L", lk.getLambdaString(pk1, pk2, mk1, mk2))
.replaceAll("#S", sk.subExpression);
}
}
enum SubExprKind {
NONE(""),
SELECT_FIELD(".f"),
SELECT_METHOD(".f()"),
SELECT_NEW(".new Foo()"),
POSTINC("++"),
POSTDEC("--");
String subExpression;
SubExprKind(String subExpression) {
this.subExpression = subExpression;
}
}
public static void main(String... args) throws Exception {
//create default shared JavaCompiler - reused across multiple compilations
JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null);
for (LambdaKind lk : LambdaKind.values()) {
for (LambdaParameterKind pk1 : LambdaParameterKind.values()) {
if (lk.arity() < 1 && pk1 != LambdaParameterKind.IMPLICIT) continue;
for (LambdaParameterKind pk2 : LambdaParameterKind.values()) {
if (lk.arity() < 2 && pk2 != LambdaParameterKind.IMPLICIT) continue;
for (ModifierKind mk1 : ModifierKind.values()) {
if (mk1 != ModifierKind.NONE && lk.isShort()) continue;
if (lk.arity() < 1 && mk1 != ModifierKind.NONE) continue;
for (ModifierKind mk2 : ModifierKind.values()) {
if (lk.arity() < 2 && mk2 != ModifierKind.NONE) continue;
for (SubExprKind sk : SubExprKind.values()) {
for (ExprKind ek : ExprKind.values()) {
new LambdaParserTest(pk1, pk2, mk1, mk2, lk, sk, ek)
.run(comp, fm);
}
}
}
}
}
}
}
System.out.println("Total check executed: " + checkCount);
}
LambdaParameterKind pk1;
LambdaParameterKind pk2;
ModifierKind mk1;
ModifierKind mk2;
LambdaKind lk;
SubExprKind sk;
ExprKind ek;
JavaSource source;
DiagnosticChecker diagChecker;
LambdaParserTest(LambdaParameterKind pk1, LambdaParameterKind pk2, ModifierKind mk1,
ModifierKind mk2, LambdaKind lk, SubExprKind sk, ExprKind ek) {
this.pk1 = pk1;
this.pk2 = pk2;
this.mk1 = mk1;
this.mk2 = mk2;
this.lk = lk;
this.sk = sk;
this.ek = ek;
this.source = new JavaSource();
this.diagChecker = new DiagnosticChecker();
}
class JavaSource extends SimpleJavaFileObject {
String template = "class Test {\n" +
" SAM s = #E;\n" +
"}";
String source;
public JavaSource() {
super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE);
source = template.replaceAll("#E", ek.expressionString(pk1, pk2, mk1, mk2, lk, sk));
}
@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
return source;
}
}
void run(JavaCompiler tool, StandardJavaFileManager fm) throws Exception {
JavacTask ct = (JavacTask)tool.getTask(null, fm, diagChecker,
Arrays.asList("-XDallowLambda"), null, Arrays.asList(source));
try {
ct.parse();
} catch (Throwable ex) {
throw new AssertionError("Error thron when parsing the following source:\n" + source.getCharContent(true));
}
check();
}
void check() {
checkCount++;
boolean errorExpected = (lk.arity() > 0 && !mk1.compatibleWith(pk1)) ||
(lk.arity() > 1 && !mk2.compatibleWith(pk2));
if (lk.arity() == 2 &&
(pk1.explicit() != pk2.explicit() ||
pk1 == LambdaParameterKind.EXPLICIT_VARARGS)) {
errorExpected = true;
}
if (errorExpected != diagChecker.errorFound) {
throw new Error("invalid diagnostics for source:\n" +
source.getCharContent(true) +
"\nFound error: " + diagChecker.errorFound +
"\nExpected error: " + errorExpected);
}
}
static class DiagnosticChecker implements javax.tools.DiagnosticListener<JavaFileObject> {
boolean errorFound;
public void report(Diagnostic<? extends JavaFileObject> diagnostic) {
if (diagnostic.getKind() == Diagnostic.Kind.ERROR) {
errorFound = true;
}
}
}
}
/*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 7115052
* @ignore 7120266
* @summary Add parser support for method references
*/
import com.sun.source.util.JavacTask;
import java.net.URI;
import java.util.Arrays;
import javax.tools.Diagnostic;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
public class MethodReferenceParserTest {
static int checkCount = 0;
enum ReferenceKind {
METHOD_REF("#Q##Gm"),
CONSTRUCTOR_REF("#Q##Gnew"),
ERR_SUPER("#Q##Gsuper"),
ERR_METH0("#Q##Gm()"),
ERR_METH1("#Q##Gm(X)"),
ERR_CONSTR0("#Q##Gnew()"),
ERR_CONSTR1("#Q##Gnew(X)");
String referenceTemplate;
ReferenceKind(String referenceTemplate) {
this.referenceTemplate = referenceTemplate;
}
String getReferenceString(QualifierKind qk, GenericKind gk) {
return referenceTemplate
.replaceAll("#Q", qk.qualifier)
.replaceAll("#G", gk.typeParameters);
}
boolean erroneous() {
switch (this) {
case ERR_SUPER:
case ERR_METH0:
case ERR_METH1:
case ERR_CONSTR0:
case ERR_CONSTR1:
return true;
default: return false;
}
}
}
enum GenericKind {
NONE(""),
ONE("<X>"),
TWO("<X,Y>");
String typeParameters;
GenericKind(String typeParameters) {
this.typeParameters = typeParameters;
}
}
enum QualifierKind {
THIS("this"),
SUPER("super"),
NEW("new Foo()"),
METHOD("m()"),
FIELD("a.f"),
UBOUND_SIMPLE("A"),
UNBOUND_GENERIC1("A<X>"),
UNBOUND_GENERIC2("A<X, Y>"),
UNBOUND_GENERIC3("A<? extends X, ? super Y>");
String qualifier;
QualifierKind(String qualifier) {
this.qualifier = qualifier;
}
}
enum ExprKind {
NONE("#R#S"),
SINGLE_PAREN1("(#R#S)"),
SINGLE_PAREN2("(#R)#S"),
DOUBLE_PAREN1("((#R#S))"),
DOUBLE_PAREN2("((#R)#S)"),
DOUBLE_PAREN3("((#R))#S");
String expressionTemplate;
ExprKind(String expressionTemplate) {
this.expressionTemplate = expressionTemplate;
}
String expressionString(ReferenceKind rk, QualifierKind qk, GenericKind gk, SubExprKind sk) {
return expressionTemplate
.replaceAll("#R", rk.getReferenceString(qk, gk))
.replaceAll("#S", sk.subExpression);
}
}
enum SubExprKind {
NONE(""),
SELECT_FIELD(".f"),
SELECT_METHOD(".f()"),
SELECT_NEW(".new Foo()"),
POSTINC("++"),
POSTDEC("--");
String subExpression;
SubExprKind(String subExpression) {
this.subExpression = subExpression;
}
}
public static void main(String... args) throws Exception {
//create default shared JavaCompiler - reused across multiple compilations
JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null);
for (ReferenceKind rk : ReferenceKind.values()) {
for (QualifierKind qk : QualifierKind.values()) {
for (GenericKind gk : GenericKind.values()) {
for (SubExprKind sk : SubExprKind.values()) {
for (ExprKind ek : ExprKind.values()) {
new MethodReferenceParserTest(rk, qk, gk, sk, ek).run(comp, fm);
}
}
}
}
}
System.out.println("Total check executed: " + checkCount);
}
ReferenceKind rk;
QualifierKind qk;
GenericKind gk;
SubExprKind sk;
ExprKind ek;
JavaSource source;
DiagnosticChecker diagChecker;
MethodReferenceParserTest(ReferenceKind rk, QualifierKind qk, GenericKind gk, SubExprKind sk, ExprKind ek) {
this.rk = rk;
this.qk = qk;
this.gk = gk;
this.sk = sk;
this.ek = ek;
this.source = new JavaSource();
this.diagChecker = new DiagnosticChecker();
}
class JavaSource extends SimpleJavaFileObject {
String template = "class Test {\n" +
" SAM s = #E;\n" +
"}";
String source;
public JavaSource() {
super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE);
source = template.replaceAll("#E", ek.expressionString(rk, qk, gk, sk));
}
@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
return source;
}
}
void run(JavaCompiler tool, StandardJavaFileManager fm) throws Exception {
JavacTask ct = (JavacTask)tool.getTask(null, fm, diagChecker,
Arrays.asList("-XDallowMethodReferences"), null, Arrays.asList(source));
try {
ct.parse();
} catch (Throwable ex) {
throw new AssertionError("Error thrown when parsing the following source:\n" + source.getCharContent(true));
}
check();
}
void check() {
checkCount++;
if (diagChecker.errorFound != rk.erroneous()) {
throw new Error("invalid diagnostics for source:\n" +
source.getCharContent(true) +
"\nFound error: " + diagChecker.errorFound +
"\nExpected error: " + rk.erroneous());
}
}
static class DiagnosticChecker implements javax.tools.DiagnosticListener<JavaFileObject> {
boolean errorFound;
public void report(Diagnostic<? extends JavaFileObject> diagnostic) {
if (diagnostic.getKind() == Diagnostic.Kind.ERROR) {
errorFound = true;
}
}
}
}
......@@ -25,13 +25,14 @@
* @test
* @bug 7073631
* @summary tests error and diagnostics positions
* @author jan.lahoda@oracle.com
* @author Jan Lahoda
*/
import com.sun.source.tree.BinaryTree;
import com.sun.source.tree.BlockTree;
import com.sun.source.tree.ClassTree;
import com.sun.source.tree.CompilationUnitTree;
import com.sun.source.tree.ErroneousTree;
import com.sun.source.tree.ExpressionStatementTree;
import com.sun.source.tree.ExpressionTree;
import com.sun.source.tree.MethodInvocationTree;
......@@ -49,6 +50,7 @@ import com.sun.tools.javac.api.JavacTaskImpl;
import com.sun.tools.javac.tree.JCTree;
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
......@@ -81,6 +83,34 @@ public class JavacParserTest extends TestCase {
return text;
}
}
/*
* converts Windows to Unix style LFs for comparing strings
*/
private String normalize(String in) {
return in.replace(System.getProperty("line.separator"), "\n");
}
public CompilationUnitTree getCompilationUnitTree(String code) throws IOException {
JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null, null,
null, Arrays.asList(new MyFileObject(code)));
CompilationUnitTree cut = ct.parse().iterator().next();
return cut;
}
public List<String> getErroneousTreeValues(ErroneousTree node) {
List<String> values = new ArrayList<>();
if (node.getErrorTrees() != null) {
for (Tree t : node.getErrorTrees()) {
values.add(t.toString());
}
} else {
throw new RuntimeException("ERROR: No Erroneous tree "
+ "has been created.");
}
return values;
}
public void testPositionForSuperConstructorCalls() throws IOException {
assert tool != null;
......@@ -97,22 +127,28 @@ public class JavacParserTest extends TestCase {
ExpressionStatementTree es =
(ExpressionStatementTree) method.getBody().getStatements().get(0);
final int esStartPos = code.indexOf(es.toString());
final int esEndPos = esStartPos + es.toString().length();
assertEquals("testPositionForSuperConstructorCalls",
72 - 24, pos.getStartPosition(cut, es));
esStartPos, pos.getStartPosition(cut, es));
assertEquals("testPositionForSuperConstructorCalls",
80 - 24, pos.getEndPosition(cut, es));
esEndPos, pos.getEndPosition(cut, es));
MethodInvocationTree mit = (MethodInvocationTree) es.getExpression();
final int mitStartPos = code.indexOf(mit.toString());
final int mitEndPos = mitStartPos + mit.toString().length();
assertEquals("testPositionForSuperConstructorCalls",
72 - 24, pos.getStartPosition(cut, mit));
mitStartPos, pos.getStartPosition(cut, mit));
assertEquals("testPositionForSuperConstructorCalls",
79 - 24, pos.getEndPosition(cut, mit));
mitEndPos, pos.getEndPosition(cut, mit));
final int methodStartPos = mitStartPos;
final int methodEndPos = methodStartPos + mit.getMethodSelect().toString().length();
assertEquals("testPositionForSuperConstructorCalls",
72 - 24, pos.getStartPosition(cut, mit.getMethodSelect()));
methodStartPos, pos.getStartPosition(cut, mit.getMethodSelect()));
assertEquals("testPositionForSuperConstructorCalls",
77 - 24, pos.getEndPosition(cut, mit.getMethodSelect()));
methodEndPos, pos.getEndPosition(cut, mit.getMethodSelect()));
}
......@@ -158,24 +194,21 @@ public class JavacParserTest extends TestCase {
public void testPreferredPositionForBinaryOp() throws IOException {
String code = "package test; public class Test {" +
"private void test() {" +
"Object o = null; boolean b = o != null && o instanceof String;" +
"} private Test() {}}";
JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null, null,
null, Arrays.asList(new MyFileObject(code)));
CompilationUnitTree cut = ct.parse().iterator().next();
String code = "package test; public class Test {"
+ "private void test() {"
+ "Object o = null; boolean b = o != null && o instanceof String;"
+ "} private Test() {}}";
CompilationUnitTree cut = getCompilationUnitTree(code);
ClassTree clazz = (ClassTree) cut.getTypeDecls().get(0);
MethodTree method = (MethodTree) clazz.getMembers().get(0);
VariableTree condSt = (VariableTree) method.getBody().getStatements().get(1);
BinaryTree cond = (BinaryTree) condSt.getInitializer();
JCTree condJC = (JCTree) cond;
assertEquals("testNewClassWithEnclosing",
117 - 24, condJC.pos);
int condStartPos = code.indexOf("&&");
assertEquals("testPreferredPositionForBinaryOp",
condStartPos, condJC.pos);
}
public void testPositionBrokenSource126732a() throws IOException {
......@@ -599,9 +632,7 @@ public class JavacParserTest extends TestCase {
final String code = "package t; class Test { " +
"{ try (java.io.InputStream in = null) { } } }";
JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null, null,
null, Arrays.asList(new MyFileObject(code)));
CompilationUnitTree cut = ct.parse().iterator().next();
CompilationUnitTree cut = getCompilationUnitTree(code);
new TreeScanner<Void, Void>() {
@Override
......@@ -622,9 +653,7 @@ public class JavacParserTest extends TestCase {
final String code = "package t; class Test { " +
"{ java.io.InputStream in = null; } }";
JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null, null,
null, Arrays.asList(new MyFileObject(code)));
CompilationUnitTree cut = ct.parse().iterator().next();
CompilationUnitTree cut = getCompilationUnitTree(code);
new TreeScanner<Void, Void>() {
......@@ -640,6 +669,138 @@ public class JavacParserTest extends TestCase {
}.scan(cut, null);
}
// expected erroneous tree: int x = y;(ERROR);
public void testOperatorMissingError() throws IOException {
String code = "package test; public class ErrorTest { "
+ "void method() { int x = y z } }";
CompilationUnitTree cut = getCompilationUnitTree(code);
final List<String> values = new ArrayList<>();
final List<String> expectedValues =
new ArrayList<>(Arrays.asList("[z]"));
new TreeScanner<Void, Void>() {
@Override
public Void visitErroneous(ErroneousTree node, Void p) {
values.add(getErroneousTreeValues(node).toString());
return null;
}
}.scan(cut, null);
assertEquals("testSwitchError: The Erroneous tree "
+ "error values: " + values
+ " do not match expected error values: "
+ expectedValues, values, expectedValues);
}
//expected erroneous tree: String s = (ERROR);
public void testMissingParenthesisError() throws IOException {
String code = "package test; public class ErrorTest { "
+ "void f() {String s = new String; } }";
CompilationUnitTree cut = getCompilationUnitTree(code);
final List<String> values = new ArrayList<>();
final List<String> expectedValues =
new ArrayList<>(Arrays.asList("[new String()]"));
new TreeScanner<Void, Void>() {
@Override
public Void visitErroneous(ErroneousTree node, Void p) {
values.add(getErroneousTreeValues(node).toString());
return null;
}
}.scan(cut, null);
assertEquals("testSwitchError: The Erroneous tree "
+ "error values: " + values
+ " do not match expected error values: "
+ expectedValues, values, expectedValues);
}
//expected erroneous tree: package test; (ERROR)(ERROR)
public void testMissingClassError() throws IOException {
String code = "package Test; clas ErrorTest { "
+ "void f() {String s = new String(); } }";
CompilationUnitTree cut = getCompilationUnitTree(code);
final List<String> values = new ArrayList<>();
final List<String> expectedValues =
new ArrayList<>(Arrays.asList("[, clas]", "[]"));
new TreeScanner<Void, Void>() {
@Override
public Void visitErroneous(ErroneousTree node, Void p) {
values.add(getErroneousTreeValues(node).toString());
return null;
}
}.scan(cut, null);
assertEquals("testSwitchError: The Erroneous tree "
+ "error values: " + values
+ " do not match expected error values: "
+ expectedValues, values, expectedValues);
}
//expected erroneous tree: void m1(int i) {(ERROR);{(ERROR);}
public void testSwitchError() throws IOException {
String code = "package test; public class ErrorTest { "
+ "int numDays; void m1(int i) { switchh {i} { case 1: "
+ "numDays = 31; break; } } }";
CompilationUnitTree cut = getCompilationUnitTree(code);
final List<String> values = new ArrayList<>();
final List<String> expectedValues =
new ArrayList<>(Arrays.asList("[switchh]", "[i]"));
new TreeScanner<Void, Void>() {
@Override
public Void visitErroneous(ErroneousTree node, Void p) {
values.add(getErroneousTreeValues(node).toString());
return null;
}
}.scan(cut, null);
assertEquals("testSwitchError: The Erroneous tree "
+ "error values: " + values
+ " do not match expected error values: "
+ expectedValues, values, expectedValues);
}
//expected erroneous tree: class ErrorTest {(ERROR)
public void testMethodError() throws IOException {
String code = "package Test; class ErrorTest { "
+ "static final void f) {String s = new String(); } }";
CompilationUnitTree cut = getCompilationUnitTree(code);
final List<String> values = new ArrayList<>();
final List<String> expectedValues =
new ArrayList<>(Arrays.asList("[\nstatic final void f();]"));
new TreeScanner<Void, Void>() {
@Override
public Void visitErroneous(ErroneousTree node, Void p) {
values.add(normalize(getErroneousTreeValues(node).toString()));
return null;
}
}.scan(cut, null);
assertEquals("testMethodError: The Erroneous tree "
+ "error value: " + values
+ " does not match expected error values: "
+ expectedValues, values, expectedValues);
}
void testsNotWorking() throws IOException {
// Fails with nb-javac, needs further investigation
......@@ -661,7 +822,13 @@ public class JavacParserTest extends TestCase {
testStartPositionForMethodWithoutModifiers();
testVarPos();
testVariableInIfThen3();
testMissingExponent();
testTryResourcePos();
testOperatorMissingError();
testMissingParenthesisError();
testMissingClassError();
testSwitchError();
testMethodError();
}
public static void main(String... args) throws IOException {
......
T6999438.java:8:9: compiler.err.illegal.char: 35
T6999438.java:8:8: compiler.err.expected: token.identifier
T6999438.java:8:10: compiler.err.illegal.start.of.type
T6999438.java:8:25: compiler.err.expected: token.identifier
T6999438.java:8:26: compiler.err.expected: ';'
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册