Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_langtools
提交
8a4a34f1
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看板
提交
8a4a34f1
编写于
6月 11, 2015
作者:
M
mfang
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
69be14d8
7da87c0d
变更
15
隐藏空白更改
内联
并排
Showing
15 changed file
with
601 addition
and
52 deletion
+601
-52
src/share/classes/com/sun/tools/javac/code/Scope.java
src/share/classes/com/sun/tools/javac/code/Scope.java
+9
-5
src/share/classes/com/sun/tools/javac/code/Types.java
src/share/classes/com/sun/tools/javac/code/Types.java
+57
-33
src/share/classes/com/sun/tools/javac/comp/Attr.java
src/share/classes/com/sun/tools/javac/comp/Attr.java
+11
-2
src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java
src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java
+21
-11
src/share/classes/com/sun/tools/javac/comp/Resolve.java
src/share/classes/com/sun/tools/javac/comp/Resolve.java
+1
-1
src/share/classes/com/sun/tools/javac/tree/TreeInfo.java
src/share/classes/com/sun/tools/javac/tree/TreeInfo.java
+13
-0
test/tools/javac/annotations/neg/AnonSubclass.java
test/tools/javac/annotations/neg/AnonSubclass.java
+13
-0
test/tools/javac/annotations/neg/AnonSubclass.out
test/tools/javac/annotations/neg/AnonSubclass.out
+2
-0
test/tools/javac/annotations/neg/pkg/AnonSubclassOnPkg.java
test/tools/javac/annotations/neg/pkg/AnonSubclassOnPkg.java
+28
-0
test/tools/javac/annotations/neg/pkg/package-info.java
test/tools/javac/annotations/neg/pkg/package-info.java
+12
-0
test/tools/javac/annotations/neg/pkg/package-info.out
test/tools/javac/annotations/neg/pkg/package-info.out
+2
-0
test/tools/javac/expression/DeeplyChainedNonPolyExpressionTest.java
.../javac/expression/DeeplyChainedNonPolyExpressionTest.java
+178
-0
test/tools/javac/scope/RemoveSymbolTest.java
test/tools/javac/scope/RemoveSymbolTest.java
+77
-0
test/tools/javac/scope/RemoveSymbolUnitTest.java
test/tools/javac/scope/RemoveSymbolUnitTest.java
+95
-0
test/tools/javac/types/ScopeListenerTest.java
test/tools/javac/types/ScopeListenerTest.java
+82
-0
未找到文件。
src/share/classes/com/sun/tools/javac/code/Scope.java
浏览文件 @
8a4a34f1
/*
* Copyright (c) 1999, 201
3
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1999, 201
5
, 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
...
...
@@ -241,12 +241,16 @@ public class Scope {
listeners
=
listeners
.
prepend
(
sl
);
}
/** Remove symbol from this scope. Used when an inner class
* attribute tells us that the class isn't a package member.
/** Remove symbol from this scope.
*/
public
void
remove
(
Symbol
sym
)
{
public
void
remove
(
final
Symbol
sym
)
{
Assert
.
check
(
shared
==
0
);
Entry
e
=
lookup
(
sym
.
name
);
Entry
e
=
lookup
(
sym
.
name
,
new
Filter
<
Symbol
>()
{
@Override
public
boolean
accepts
(
Symbol
candidate
)
{
return
candidate
==
sym
;
}
});
if
(
e
.
scope
==
null
)
return
;
// remove e from table and shadowed list;
...
...
src/share/classes/com/sun/tools/javac/code/Types.java
浏览文件 @
8a4a34f1
...
...
@@ -2694,74 +2694,98 @@ public class Types {
// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="compute transitive closure of all members in given site">
class
MembersClosureCache
extends
SimpleVisitor
<
CompoundScope
,
Boolean
>
{
class
MembersClosureCache
extends
SimpleVisitor
<
Scope
.
CompoundScope
,
Void
>
{
private
WeakHashMap
<
TypeSymbol
,
Entry
>
_map
=
new
WeakHashMap
<
TypeSymbol
,
Entry
>();
private
Map
<
TypeSymbol
,
CompoundScope
>
_map
=
new
HashMap
<>();
class
Entry
{
final
boolean
skipInterfaces
;
final
CompoundScope
compoundScope
;
Set
<
TypeSymbol
>
seenTypes
=
new
HashSet
<>();
class
MembersScope
extends
CompoundScope
{
CompoundScope
scope
;
public
MembersScope
(
CompoundScope
scope
)
{
super
(
scope
.
owner
);
this
.
scope
=
scope
;
}
Filter
<
Symbol
>
combine
(
final
Filter
<
Symbol
>
sf
)
{
return
new
Filter
<
Symbol
>()
{
@Override
public
boolean
accepts
(
Symbol
s
)
{
return
!
s
.
owner
.
isInterface
()
&&
(
sf
==
null
||
sf
.
accepts
(
s
));
}
};
}
public
Entry
(
boolean
skipInterfaces
,
CompoundScope
compoundScope
)
{
this
.
skipInterfaces
=
skipInterfaces
;
this
.
compoundScope
=
compoundScope
;
@Override
public
Iterable
<
Symbol
>
getElements
(
Filter
<
Symbol
>
sf
)
{
return
scope
.
getElements
(
combine
(
sf
));
}
@Override
public
Iterable
<
Symbol
>
getElementsByName
(
Name
name
,
Filter
<
Symbol
>
sf
)
{
return
scope
.
getElementsByName
(
name
,
combine
(
sf
));
}
boolean
matches
(
boolean
skipInterfaces
)
{
return
this
.
skipInterfaces
==
skipInterfaces
;
@Override
public
int
getMark
()
{
return
scope
.
getMark
();
}
}
List
<
TypeSymbol
>
seenTypes
=
List
.
nil
()
;
CompoundScope
nilScope
;
/** members closure visitor methods **/
public
CompoundScope
visitType
(
Type
t
,
Boolean
skipInterface
)
{
return
null
;
public
CompoundScope
visitType
(
Type
t
,
Void
_unused
)
{
if
(
nilScope
==
null
)
{
nilScope
=
new
CompoundScope
(
syms
.
noSymbol
);
}
return
nilScope
;
}
@Override
public
CompoundScope
visitClassType
(
ClassType
t
,
Boolean
skipInterface
)
{
if
(
seenTypes
.
contains
(
t
.
tsym
))
{
public
CompoundScope
visitClassType
(
ClassType
t
,
Void
_unused
)
{
if
(
!
seenTypes
.
add
(
t
.
tsym
))
{
//this is possible when an interface is implemented in multiple
//superclasses, or when a class
s
hierarchy is circular - in such
//superclasses, or when a class hierarchy is circular - in such
//cases we don't need to recurse (empty scope is returned)
return
new
CompoundScope
(
t
.
tsym
);
}
try
{
seenTypes
=
seenTypes
.
prepen
d
(
t
.
tsym
);
seenTypes
.
ad
d
(
t
.
tsym
);
ClassSymbol
csym
=
(
ClassSymbol
)
t
.
tsym
;
Entry
e
=
_map
.
get
(
csym
);
if
(
e
==
null
||
!
e
.
matches
(
skipInterface
))
{
CompoundScope
membersClosure
=
new
CompoundScope
(
csym
);
if
(!
skipInterface
)
{
for
(
Type
i
:
interfaces
(
t
))
{
membersClosure
.
addSubScope
(
visit
(
i
,
skipInterface
));
}
CompoundScope
membersClosure
=
_map
.
get
(
csym
);
if
(
membersClosure
==
null
)
{
membersClosure
=
new
CompoundScope
(
csym
);
for
(
Type
i
:
interfaces
(
t
))
{
membersClosure
.
addSubScope
(
visit
(
i
,
null
));
}
membersClosure
.
addSubScope
(
visit
(
supertype
(
t
),
skipInterface
));
membersClosure
.
addSubScope
(
visit
(
supertype
(
t
),
null
));
membersClosure
.
addSubScope
(
csym
.
members
());
e
=
new
Entry
(
skipInterface
,
membersClosure
);
_map
.
put
(
csym
,
e
);
_map
.
put
(
csym
,
membersClosure
);
}
return
e
.
compoundScop
e
;
return
membersClosur
e
;
}
finally
{
seenTypes
=
seenTypes
.
tail
;
seenTypes
.
remove
(
t
.
tsym
)
;
}
}
@Override
public
CompoundScope
visitTypeVar
(
TypeVar
t
,
Boolean
skipInterface
)
{
return
visit
(
t
.
getUpperBound
(),
skipInterface
);
public
CompoundScope
visitTypeVar
(
TypeVar
t
,
Void
_unused
)
{
return
visit
(
t
.
getUpperBound
(),
null
);
}
}
private
MembersClosureCache
membersCache
=
new
MembersClosureCache
();
public
CompoundScope
membersClosure
(
Type
site
,
boolean
skipInterface
)
{
return
membersCache
.
visit
(
site
,
skipInterface
);
CompoundScope
cs
=
membersCache
.
visit
(
site
,
null
);
if
(
cs
==
null
)
Assert
.
error
(
"type "
+
site
);
return
skipInterface
?
membersCache
.
new
MembersScope
(
cs
)
:
cs
;
}
// </editor-fold>
...
...
src/share/classes/com/sun/tools/javac/comp/Attr.java
浏览文件 @
8a4a34f1
...
...
@@ -825,9 +825,18 @@ public class Attr extends JCTree.Visitor {
}
public
void
visitClassDef
(
JCClassDecl
tree
)
{
// Local classes have not been entered yet, so we need to do it now:
if
((
env
.
info
.
scope
.
owner
.
kind
&
(
VAR
|
MTH
))
!=
0
)
// Local and anonymous classes have not been entered yet, so we need to
// do it now.
if
((
env
.
info
.
scope
.
owner
.
kind
&
(
VAR
|
MTH
))
!=
0
)
{
enter
.
classEnter
(
tree
,
env
);
}
else
{
// If this class declaration is part of a class level annotation,
// as in @MyAnno(new Object() {}) class MyClass {}, enter it in
// order to simplify later steps and allow for sensible error
// messages.
if
(
env
.
tree
.
hasTag
(
NEWCLASS
)
&&
TreeInfo
.
isInAnnotation
(
env
,
tree
))
enter
.
classEnter
(
tree
,
env
);
}
ClassSymbol
c
=
tree
.
sym
;
if
(
c
==
null
)
{
...
...
src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java
浏览文件 @
8a4a34f1
...
...
@@ -1256,6 +1256,9 @@ public class DeferredAttr extends JCTree.Visitor {
return
isSimpleReceiver
(((
JCAnnotatedType
)
rec
).
underlyingType
);
case
APPLY:
return
true
;
case
NEWCLASS:
JCNewClass
nc
=
(
JCNewClass
)
rec
;
return
nc
.
encl
==
null
&&
nc
.
def
==
null
&&
!
TreeInfo
.
isDiamond
(
nc
);
default
:
return
false
;
}
...
...
@@ -1310,17 +1313,24 @@ public class DeferredAttr extends JCTree.Visitor {
Type
site
;
if
(
rec
!=
null
)
{
if
(
rec
.
hasTag
(
APPLY
))
{
Symbol
recSym
=
quicklyResolveMethod
(
env
,
(
JCMethodInvocation
)
rec
);
if
(
recSym
==
null
)
return
null
;
Symbol
resolvedReturnType
=
analyzeCandidateMethods
(
recSym
,
syms
.
errSymbol
,
returnSymbolAnalyzer
);
if
(
resolvedReturnType
==
null
)
return
null
;
site
=
resolvedReturnType
.
type
;
}
else
{
site
=
attribSpeculative
(
rec
,
env
,
attr
.
unknownTypeExprInfo
).
type
;
switch
(
rec
.
getTag
())
{
case
APPLY:
Symbol
recSym
=
quicklyResolveMethod
(
env
,
(
JCMethodInvocation
)
rec
);
if
(
recSym
==
null
)
return
null
;
Symbol
resolvedReturnType
=
analyzeCandidateMethods
(
recSym
,
syms
.
errSymbol
,
returnSymbolAnalyzer
);
if
(
resolvedReturnType
==
null
)
return
null
;
site
=
resolvedReturnType
.
type
;
break
;
case
NEWCLASS:
JCNewClass
nc
=
(
JCNewClass
)
rec
;
site
=
attribSpeculative
(
nc
.
clazz
,
env
,
attr
.
unknownTypeExprInfo
).
type
;
break
;
default
:
site
=
attribSpeculative
(
rec
,
env
,
attr
.
unknownTypeExprInfo
).
type
;
break
;
}
}
else
{
site
=
env
.
enclClass
.
sym
.
type
;
...
...
src/share/classes/com/sun/tools/javac/comp/Resolve.java
浏览文件 @
8a4a34f1
...
...
@@ -271,7 +271,7 @@ public class Resolve {
* the one of its outer environment
*/
protected
static
boolean
isStatic
(
Env
<
AttrContext
>
env
)
{
return
env
.
info
.
staticLevel
>
env
.
outer
.
info
.
staticLevel
;
return
env
.
outer
!=
null
&&
env
.
info
.
staticLevel
>
env
.
outer
.
info
.
staticLevel
;
}
/** An environment is an "initializer" if it is a constructor or
...
...
src/share/classes/com/sun/tools/javac/tree/TreeInfo.java
浏览文件 @
8a4a34f1
...
...
@@ -28,6 +28,7 @@ package com.sun.tools.javac.tree;
import
com.sun.source.tree.Tree
;
import
com.sun.source.util.TreePath
;
import
com.sun.tools.javac.code.*
;
import
com.sun.tools.javac.comp.AttrContext
;
import
com.sun.tools.javac.comp.Env
;
...
...
@@ -351,6 +352,18 @@ public class TreeInfo {
return
(
lit
.
typetag
==
BOT
);
}
/** Return true iff this tree is a child of some annotation. */
public
static
boolean
isInAnnotation
(
Env
<?>
env
,
JCTree
tree
)
{
TreePath
tp
=
TreePath
.
getPath
(
env
.
toplevel
,
tree
);
if
(
tp
!=
null
)
{
for
(
Tree
t
:
tp
)
{
if
(
t
.
getKind
()
==
Tree
.
Kind
.
ANNOTATION
)
return
true
;
}
}
return
false
;
}
public
static
String
getCommentText
(
Env
<?>
env
,
JCTree
tree
)
{
DocCommentTable
docComments
=
(
tree
.
hasTag
(
JCTree
.
Tag
.
TOPLEVEL
))
?
((
JCCompilationUnit
)
tree
).
docComments
...
...
test/tools/javac/annotations/neg/AnonSubclass.java
0 → 100644
浏览文件 @
8a4a34f1
/*
* @test /nodynamiccopyright/
* @bug 8028389
* @summary javac should output a proper error message when given something
* like new Object(){} as annotation argument.
*
* @compile/fail/ref=AnonSubclass.out -XDrawDiagnostics AnonSubclass.java
*/
@AnonSubclass
(
new
Object
(){})
@interface
AnonSubclass
{
String
value
();
}
test/tools/javac/annotations/neg/AnonSubclass.out
0 → 100644
浏览文件 @
8a4a34f1
AnonSubclass.java:10:15: compiler.err.prob.found.req: (compiler.misc.inconvertible.types: compiler.misc.anonymous.class: java.lang.Object, java.lang.String)
1 error
test/tools/javac/annotations/neg/pkg/AnonSubclassOnPkg.java
0 → 100644
浏览文件 @
8a4a34f1
/*
* Copyright (c) 2014, 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.
*/
package
pkg
;
@interface
AnonSubclassOnPkg
{
String
value
();
}
test/tools/javac/annotations/neg/pkg/package-info.java
0 → 100644
浏览文件 @
8a4a34f1
/*
* @test /nodynamiccopyright/
* @bug 8028389
* @summary javac should output a proper error message when given something
* like new Object(){} as annotation argument.
*
* @compile AnonSubclassOnPkg.java
* @compile/fail/ref=package-info.out -XDrawDiagnostics package-info.java
*/
@AnonSubclassOnPkg
(
new
Object
(){})
package
pkg
;
test/tools/javac/annotations/neg/pkg/package-info.out
0 → 100644
浏览文件 @
8a4a34f1
package-info.java:11:20: compiler.err.prob.found.req: (compiler.misc.inconvertible.types: compiler.misc.anonymous.class: java.lang.Object, java.lang.String)
1 error
test/tools/javac/expression/DeeplyChainedNonPolyExpressionTest.java
0 → 100644
浏览文件 @
8a4a34f1
/*
* Copyright (c) 2015, 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 8079613
* @summary Ensure that compiler ascertains a class of patently non-poly expressions as such
* @run main/timeout=10 DeeplyChainedNonPolyExpressionTest
*/
public
class
DeeplyChainedNonPolyExpressionTest
{
static
class
JSO
{
JSO
put
(
String
s
,
Object
y
)
{
return
null
;
}
JSO
put
(
java
.
lang
.
String
x
,
java
.
util
.
Collection
<
String
>
y
)
{
return
null
;
}
JSO
put
(
java
.
lang
.
String
x
,
int
y
)
{
return
null
;
}
JSO
put
(
java
.
lang
.
String
x
,
long
y
)
{
return
null
;
}
JSO
put
(
java
.
lang
.
String
x
,
double
y
)
{
return
null
;
}
JSO
put
(
java
.
lang
.
String
x
,
java
.
util
.
Map
<
String
,
String
>
y
)
{
return
null
;
}
JSO
put
(
java
.
lang
.
String
x
,
boolean
y
)
{
return
null
;
}
}
static
class
JSA
{
JSA
put
(
Object
o
)
{
return
null
;
}
JSA
put
(
int
i
,
Object
x
)
{
return
null
;
}
JSA
put
(
boolean
x
)
{
return
null
;
}
JSA
put
(
int
x
)
{
return
null
;
}
JSA
put
(
int
i
,
int
x
)
{
return
null
;
}
JSA
put
(
int
x
,
boolean
y
)
{
return
null
;
}
JSA
put
(
int
i
,
long
x
)
{
return
null
;
}
JSA
put
(
long
x
)
{
return
null
;
}
JSA
put
(
java
.
util
.
Collection
<
String
>
x
)
{
return
null
;
}
JSA
put
(
int
i
,
java
.
util
.
Collection
<
String
>
x
)
{
return
null
;
}
JSA
put
(
int
i
,
java
.
util
.
Map
<
String
,
String
>
x
)
{
return
null
;
}
JSA
put
(
java
.
util
.
Map
<
String
,
String
>
x
)
{
return
null
;
}
JSA
put
(
int
i
,
double
x
)
{
return
null
;
}
JSA
put
(
double
x
)
{
return
null
;
}
}
public
static
void
main
(
String
[]
args
)
{
}
public
static
void
foo
()
{
new
JSO
()
.
put
(
"s"
,
new
JSA
())
.
put
(
"s"
,
new
JSA
())
.
put
(
"s"
,
new
JSO
()
.
put
(
"s"
,
new
JSO
()
.
put
(
"s"
,
new
JSA
().
put
(
"s"
))
.
put
(
"s"
,
new
JSA
())
.
put
(
"s"
,
new
JSO
()
.
put
(
"s"
,
new
JSO
()
.
put
(
"s"
,
new
JSA
().
put
(
"s"
).
put
(
"s"
))
.
put
(
"s"
,
new
JSA
())
.
put
(
"s"
,
new
JSO
()
.
put
(
"s"
,
new
JSO
()
.
put
(
"s"
,
new
JSA
().
put
(
"s"
).
put
(
"s"
).
put
(
"s"
)
.
put
(
"s"
).
put
(
"s"
).
put
(
"s"
)
.
put
(
"s"
).
put
(
"s"
))
.
put
(
"s"
,
new
JSA
())
.
put
(
"s"
,
new
JSO
()
.
put
(
"s"
,
new
JSO
()
.
put
(
"s"
,
new
JSA
().
put
(
"s"
))
.
put
(
"s"
,
new
JSA
())
)
)
)
)
)
.
put
(
"s"
,
new
JSO
()
.
put
(
"s"
,
new
JSA
().
put
(
"s"
))
.
put
(
"s"
,
new
JSA
())
.
put
(
"s"
,
new
JSO
()
.
put
(
"s"
,
new
JSO
()
.
put
(
"s"
,
new
JSA
().
put
(
"s"
).
put
(
"s"
))
.
put
(
"s"
,
new
JSA
())
.
put
(
"s"
,
new
JSO
()
.
put
(
"s"
,
new
JSO
()
.
put
(
"s"
,
new
JSA
().
put
(
"s"
).
put
(
"s"
).
put
(
"s"
)
.
put
(
"s"
).
put
(
"s"
).
put
(
"s"
)
.
put
(
"s"
).
put
(
"s"
))
.
put
(
"s"
,
new
JSA
())
.
put
(
"s"
,
new
JSO
()
.
put
(
"s"
,
new
JSO
()
.
put
(
"s"
,
new
JSA
().
put
(
"s"
))
.
put
(
"s"
,
new
JSA
()))
)
)
)
)
)
)
)
)
);
}
}
test/tools/javac/scope/RemoveSymbolTest.java
0 → 100644
浏览文件 @
8a4a34f1
/*
* Copyright (c) 2015, 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 8080842
* @summary Ensure Scope impl can cope with remove() when a field and method share the name.
* @run main RemoveSymbolTest
*/
import
java.util.Iterator
;
import
java.util.LinkedList
;
public
class
RemoveSymbolTest
<
W
>
implements
Iterable
<
W
>
{
static
class
Widget
{
private
String
name
;
Widget
(
String
s
)
{
name
=
s
;
}
@Override
public
String
toString
()
{
return
name
;
}
}
private
LinkedList
<
W
>
data
;
// Instantiate an Iterable instance using a Lambda expression.
// Causes ClassFormatError if a local variable of type Widget is named after one of the methods.
private
final
Iterable
<
W
>
myIterator1
=
()
->
new
Iterator
<
W
>()
{
private
W
hasNext
=
null
;
private
int
index
=
0
;
@Override
public
boolean
hasNext
()
{
return
index
<
data
.
size
();
}
@Override
public
W
next
()
{
return
data
.
get
(
index
++);
}
};
// Instantiate an Iterable instance using an anonymous class.
// Always works fine regardless of the name of the local variable.
private
final
Iterable
<
W
>
myIterator2
=
new
Iterable
<
W
>()
{
@Override
public
Iterator
<
W
>
iterator
()
{
return
new
Iterator
<
W
>()
{
private
W
hasNext
=
null
;
private
int
index
=
0
;
@Override
public
boolean
hasNext
()
{
return
index
<
data
.
size
();
}
@Override
public
W
next
()
{
return
data
.
get
(
index
++);
}
};
}
};
public
RemoveSymbolTest
()
{
data
=
new
LinkedList
<>();
}
public
void
add
(
W
e
)
{
data
.
add
(
e
);
}
@Override
public
String
toString
()
{
return
data
.
toString
();
}
@Override
public
Iterator
<
W
>
iterator
()
{
return
myIterator1
.
iterator
();
}
public
static
void
main
(
String
[]
args
)
{
RemoveSymbolTest
<
Widget
>
widgets
=
new
RemoveSymbolTest
<>();
widgets
.
add
(
new
Widget
(
"W1"
));
widgets
.
add
(
new
Widget
(
"W2"
));
widgets
.
add
(
new
Widget
(
"W3"
));
System
.
out
.
println
(
".foreach() call: "
);
widgets
.
forEach
(
w
->
System
.
out
.
println
(
w
+
" "
));
}
}
test/tools/javac/scope/RemoveSymbolUnitTest.java
0 → 100644
浏览文件 @
8a4a34f1
/*
* Copyright (c) 2015 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 8080842
* @summary Ensure Scope impl can cope with remove() when a field and method share the name.
*/
import
com.sun.tools.javac.util.*
;
import
com.sun.tools.javac.code.*
;
import
com.sun.tools.javac.code.Scope.*
;
import
com.sun.tools.javac.code.Symbol.*
;
import
com.sun.tools.javac.file.JavacFileManager
;
public
class
RemoveSymbolUnitTest
{
Context
context
;
Names
names
;
Symtab
symtab
;
public
static
void
main
(
String
...
args
)
throws
Exception
{
new
RemoveSymbolUnitTest
().
run
();
}
public
void
run
()
{
context
=
new
Context
();
JavacFileManager
.
preRegister
(
context
);
// required by ClassReader which is required by Symtab
names
=
Names
.
instance
(
context
);
symtab
=
Symtab
.
instance
(
context
);
Name
hasNext
=
names
.
fromString
(
"hasNext"
);
ClassSymbol
clazz
=
new
ClassSymbol
(
0
,
names
.
fromString
(
"X"
),
Type
.
noType
,
symtab
.
unnamedPackage
);
VarSymbol
v
=
new
VarSymbol
(
0
,
hasNext
,
Type
.
noType
,
clazz
);
MethodSymbol
m
=
new
MethodSymbol
(
0
,
hasNext
,
Type
.
noType
,
clazz
);
// Try enter and remove in different shuffled combinations.
// working with fresh scope each time.
Scope
cs
=
new
Scope
(
clazz
);
cs
.
enter
(
v
);
cs
.
enter
(
m
);
cs
.
remove
(
v
);
Symbol
s
=
cs
.
lookup
(
hasNext
).
sym
;
if
(
s
!=
m
)
throw
new
AssertionError
(
"Wrong symbol"
);
cs
=
new
Scope
(
clazz
);
cs
.
enter
(
m
);
cs
.
enter
(
v
);
cs
.
remove
(
v
);
s
=
cs
.
lookup
(
hasNext
).
sym
;
if
(
s
!=
m
)
throw
new
AssertionError
(
"Wrong symbol"
);
cs
=
new
Scope
(
clazz
);
cs
.
enter
(
v
);
cs
.
enter
(
m
);
cs
.
remove
(
m
);
s
=
cs
.
lookup
(
hasNext
).
sym
;
if
(
s
!=
v
)
throw
new
AssertionError
(
"Wrong symbol"
);
cs
=
new
Scope
(
clazz
);
cs
.
enter
(
m
);
cs
.
enter
(
v
);
cs
.
remove
(
m
);
s
=
cs
.
lookup
(
hasNext
).
sym
;
if
(
s
!=
v
)
throw
new
AssertionError
(
"Wrong symbol"
);
}
}
test/tools/javac/types/ScopeListenerTest.java
0 → 100644
浏览文件 @
8a4a34f1
/*
* Copyright (c) 2015, 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 8039262
* @summary Ensure that using Types.membersClosure does not increase the number of listeners on the
* class's members Scope.
*/
import
com.sun.tools.javac.code.Scope
;
import
com.sun.tools.javac.code.Symbol
;
import
com.sun.tools.javac.code.Symtab
;
import
com.sun.tools.javac.code.Types
;
import
com.sun.tools.javac.file.JavacFileManager
;
import
com.sun.tools.javac.util.Context
;
import
com.sun.tools.javac.util.Names
;
import
java.lang.reflect.Field
;
import
java.util.Collection
;
public
class
ScopeListenerTest
{
public
static
void
main
(
String
[]
args
)
throws
Exception
{
new
ScopeListenerTest
().
run
();
}
void
run
()
throws
Exception
{
Context
context
=
new
Context
();
JavacFileManager
.
preRegister
(
context
);
Types
types
=
Types
.
instance
(
context
);
Symtab
syms
=
Symtab
.
instance
(
context
);
Names
names
=
Names
.
instance
(
context
);
types
.
membersClosure
(
syms
.
stringType
,
true
);
types
.
membersClosure
(
syms
.
stringType
,
false
);
Field
listenersField
=
Scope
.
class
.
getDeclaredField
(
"listeners"
);
listenersField
.
setAccessible
(
true
);
int
listenerCount
=
((
Collection
)
listenersField
.
get
(
syms
.
stringType
.
tsym
.
members
())).
size
();
for
(
int
i
=
0
;
i
<
100
;
i
++)
{
types
.
membersClosure
(
syms
.
stringType
,
true
);
types
.
membersClosure
(
syms
.
stringType
,
false
);
}
int
newListenerCount
=
((
Collection
)
listenersField
.
get
(
syms
.
stringType
.
tsym
.
members
())).
size
();
if
(
listenerCount
!=
newListenerCount
)
{
throw
new
AssertionError
(
"Orig listener count: "
+
listenerCount
+
"; new listener count: "
+
newListenerCount
);
}
for
(
Symbol
s
:
types
.
membersClosure
(
syms
.
stringType
,
true
).
getElements
())
;
for
(
Symbol
s
:
types
.
membersClosure
(
syms
.
stringType
,
false
).
getElementsByName
(
names
.
fromString
(
"substring"
)))
;
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录