Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_langtools
提交
a1d918e7
D
dragonwell8_langtools
项目概览
openanolis
/
dragonwell8_langtools
通知
0
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_langtools
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
a1d918e7
编写于
12月 06, 2011
作者:
L
lana
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
94fb5a2a
8c3bcb45
变更
30
展开全部
隐藏空白更改
内联
并排
Showing
30 changed file
with
1369 addition
and
111 deletion
+1369
-111
src/share/classes/com/sun/source/tree/LambdaExpressionTree.java
...are/classes/com/sun/source/tree/LambdaExpressionTree.java
+56
-0
src/share/classes/com/sun/source/tree/MemberReferenceTree.java
...hare/classes/com/sun/source/tree/MemberReferenceTree.java
+58
-0
src/share/classes/com/sun/source/tree/Tree.java
src/share/classes/com/sun/source/tree/Tree.java
+10
-0
src/share/classes/com/sun/source/tree/TreeVisitor.java
src/share/classes/com/sun/source/tree/TreeVisitor.java
+2
-0
src/share/classes/com/sun/source/util/SimpleTreeVisitor.java
src/share/classes/com/sun/source/util/SimpleTreeVisitor.java
+8
-0
src/share/classes/com/sun/source/util/TreeScanner.java
src/share/classes/com/sun/source/util/TreeScanner.java
+12
-0
src/share/classes/com/sun/tools/javac/code/Source.java
src/share/classes/com/sun/tools/javac/code/Source.java
+6
-0
src/share/classes/com/sun/tools/javac/comp/Attr.java
src/share/classes/com/sun/tools/javac/comp/Attr.java
+10
-0
src/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java
...are/classes/com/sun/tools/javac/parser/JavaTokenizer.java
+4
-0
src/share/classes/com/sun/tools/javac/parser/JavacParser.java
...share/classes/com/sun/tools/javac/parser/JavacParser.java
+349
-102
src/share/classes/com/sun/tools/javac/parser/Lexer.java
src/share/classes/com/sun/tools/javac/parser/Lexer.java
+5
-0
src/share/classes/com/sun/tools/javac/parser/Scanner.java
src/share/classes/com/sun/tools/javac/parser/Scanner.java
+27
-3
src/share/classes/com/sun/tools/javac/parser/Tokens.java
src/share/classes/com/sun/tools/javac/parser/Tokens.java
+2
-0
src/share/classes/com/sun/tools/javac/resources/compiler.properties
...classes/com/sun/tools/javac/resources/compiler.properties
+10
-0
src/share/classes/com/sun/tools/javac/tree/JCTree.java
src/share/classes/com/sun/tools/javac/tree/JCTree.java
+102
-0
src/share/classes/com/sun/tools/javac/tree/Pretty.java
src/share/classes/com/sun/tools/javac/tree/Pretty.java
+28
-0
src/share/classes/com/sun/tools/javac/tree/TreeCopier.java
src/share/classes/com/sun/tools/javac/tree/TreeCopier.java
+14
-0
src/share/classes/com/sun/tools/javac/tree/TreeInfo.java
src/share/classes/com/sun/tools/javac/tree/TreeInfo.java
+28
-0
src/share/classes/com/sun/tools/javac/tree/TreeMaker.java
src/share/classes/com/sun/tools/javac/tree/TreeMaker.java
+15
-0
src/share/classes/com/sun/tools/javac/tree/TreeScanner.java
src/share/classes/com/sun/tools/javac/tree/TreeScanner.java
+10
-0
src/share/classes/com/sun/tools/javac/tree/TreeTranslator.java
...hare/classes/com/sun/tools/javac/tree/TreeTranslator.java
+11
-0
test/tools/javac/diags/examples/CatchWithoutTry.java
test/tools/javac/diags/examples/CatchWithoutTry.java
+1
-2
test/tools/javac/diags/examples/IllegalChar.java
test/tools/javac/diags/examples/IllegalChar.java
+2
-2
test/tools/javac/diags/examples/LambdaNotSupported.java
test/tools/javac/diags/examples/LambdaNotSupported.java
+29
-0
test/tools/javac/diags/examples/MethodReferencesNotSupported.java
...ls/javac/diags/examples/MethodReferencesNotSupported.java
+29
-0
test/tools/javac/diags/examples/NotAStatement.java
test/tools/javac/diags/examples/NotAStatement.java
+30
-0
test/tools/javac/generics/rare/6665356/T6665356.out
test/tools/javac/generics/rare/6665356/T6665356.out
+1
-1
test/tools/javac/lambda/LambdaParserTest.java
test/tools/javac/lambda/LambdaParserTest.java
+276
-0
test/tools/javac/lambda/MethodReferenceParserTest.java
test/tools/javac/lambda/MethodReferenceParserTest.java
+233
-0
test/tools/javac/quid/T6999438.out
test/tools/javac/quid/T6999438.out
+1
-1
未找到文件。
src/share/classes/com/sun/source/tree/LambdaExpressionTree.java
0 → 100644
浏览文件 @
a1d918e7
/*
* 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
();
}
src/share/classes/com/sun/source/tree/MemberReferenceTree.java
0 → 100644
浏览文件 @
a1d918e7
/*
* 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
();
}
src/share/classes/com/sun/source/tree/Tree.java
浏览文件 @
a1d918e7
...
...
@@ -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}.
*/
...
...
src/share/classes/com/sun/source/tree/TreeVisitor.java
浏览文件 @
a1d918e7
...
...
@@ -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
);
...
...
src/share/classes/com/sun/source/util/SimpleTreeVisitor.java
浏览文件 @
a1d918e7
...
...
@@ -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
);
}
...
...
src/share/classes/com/sun/source/util/TreeScanner.java
浏览文件 @
a1d918e7
...
...
@@ -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
;
}
...
...
src/share/classes/com/sun/tools/javac/code/Source.java
浏览文件 @
a1d918e7
...
...
@@ -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:
...
...
src/share/classes/com/sun/tools/javac/comp/Attr.java
浏览文件 @
a1d918e7
...
...
@@ -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
);
...
...
src/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java
浏览文件 @
a1d918e7
...
...
@@ -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
();
...
...
src/share/classes/com/sun/tools/javac/parser/JavacParser.java
浏览文件 @
a1d918e7
此差异已折叠。
点击以展开。
src/share/classes/com/sun/tools/javac/parser/Lexer.java
浏览文件 @
a1d918e7
...
...
@@ -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.
*/
...
...
src/share/classes/com/sun/tools/javac/parser/Scanner.java
浏览文件 @
a1d918e7
...
...
@@ -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
()
{
...
...
src/share/classes/com/sun/tools/javac/parser/Tokens.java
浏览文件 @
a1d918e7
...
...
@@ -176,6 +176,8 @@ public class Tokens {
TRUE
(
"true"
,
Tag
.
NAMED
),
FALSE
(
"false"
,
Tag
.
NAMED
),
NULL
(
"null"
,
Tag
.
NAMED
),
ARROW
(
"->"
),
HASH
(
"#"
),
LPAREN
(
"("
),
RPAREN
(
")"
),
LBRACE
(
"{"
),
...
...
src/share/classes/com/sun/tools/javac/resources/compiler.properties
浏览文件 @
a1d918e7
...
...
@@ -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)
...
...
src/share/classes/com/sun/tools/javac/tree/JCTree.java
浏览文件 @
a1d918e7
...
...
@@ -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
);
}
...
...
src/share/classes/com/sun/tools/javac/tree/Pretty.java
浏览文件 @
a1d918e7
...
...
@@ -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
);
...
...
src/share/classes/com/sun/tools/javac/tree/TreeCopier.java
浏览文件 @
a1d918e7
...
...
@@ -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
();
...
...
src/share/classes/com/sun/tools/javac/tree/TreeInfo.java
浏览文件 @
a1d918e7
...
...
@@ -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
))
...
...
src/share/classes/com/sun/tools/javac/tree/TreeMaker.java
浏览文件 @
a1d918e7
...
...
@@ -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
;
...
...
src/share/classes/com/sun/tools/javac/tree/TreeScanner.java
浏览文件 @
a1d918e7
...
...
@@ -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
)
{
}
...
...
src/share/classes/com/sun/tools/javac/tree/TreeTranslator.java
浏览文件 @
a1d918e7
...
...
@@ -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
;
}
...
...
test/tools/javac/diags/examples/CatchWithoutTry.java
浏览文件 @
a1d918e7
/*
* 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
()
{
...
...
test/tools/javac/diags/examples/IllegalChar.java
浏览文件 @
a1d918e7
/*
* 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
=
`
;
}
test/tools/javac/diags/examples/LambdaNotSupported.java
0 → 100644
浏览文件 @
a1d918e7
/*
* 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
=
()->{};
}
test/tools/javac/diags/examples/MethodReferencesNotSupported.java
0 → 100644
浏览文件 @
a1d918e7
/*
* 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
;
}
test/tools/javac/diags/examples/NotAStatement.java
0 → 100644
浏览文件 @
a1d918e7
/*
* 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
;
}
}
test/tools/javac/generics/rare/6665356/T6665356.out
浏览文件 @
a1d918e7
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:2
3
: compiler.err.improperly.formed.type.param.missing
T6665356.java:26:2
2
: compiler.err.improperly.formed.type.param.missing
T6665356.java:27:25: compiler.err.improperly.formed.type.inner.raw.param
4 errors
test/tools/javac/lambda/LambdaParserTest.java
0 → 100644
浏览文件 @
a1d918e7
/*
* 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
;
}
}
}
}
test/tools/javac/lambda/MethodReferenceParserTest.java
0 → 100644
浏览文件 @
a1d918e7
/*
* 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
* @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
;
}
}
}
}
test/tools/javac/quid/T6999438.out
浏览文件 @
a1d918e7
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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录