Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_langtools
提交
37b06cc7
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看板
提交
37b06cc7
编写于
9月 06, 2010
作者:
J
jjg
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
6930507: Symbols for anonymous and local classes made too late for use by java tree API
Reviewed-by: mcimadamore
上级
dfd80415
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
268 addition
and
9 deletion
+268
-9
src/share/classes/com/sun/tools/javac/api/JavacTrees.java
src/share/classes/com/sun/tools/javac/api/JavacTrees.java
+19
-2
src/share/classes/com/sun/tools/javac/tree/TreeInfo.java
src/share/classes/com/sun/tools/javac/tree/TreeInfo.java
+12
-0
test/tools/javac/api/TestGetElement.java
test/tools/javac/api/TestGetElement.java
+235
-0
test/tools/javac/processing/model/element/TestAnonClassNames.java
...ls/javac/processing/model/element/TestAnonClassNames.java
+1
-6
test/tools/javac/processing/model/element/TestAnonSourceNames.java
...s/javac/processing/model/element/TestAnonSourceNames.java
+1
-1
未找到文件。
src/share/classes/com/sun/tools/javac/api/JavacTrees.java
浏览文件 @
37b06cc7
...
...
@@ -45,6 +45,7 @@ import com.sun.source.tree.Tree;
import
com.sun.source.util.SourcePositions
;
import
com.sun.source.util.TreePath
;
import
com.sun.source.util.Trees
;
import
com.sun.tools.javac.code.Flags
;
import
com.sun.tools.javac.code.Symbol.ClassSymbol
;
import
com.sun.tools.javac.code.Symbol.TypeSymbol
;
import
com.sun.tools.javac.code.Symbol
;
...
...
@@ -189,8 +190,24 @@ public class JavacTrees extends Trees {
}
public
Element
getElement
(
TreePath
path
)
{
Tree
t
=
path
.
getLeaf
();
return
TreeInfo
.
symbolFor
((
JCTree
)
t
);
JCTree
tree
=
(
JCTree
)
path
.
getLeaf
();
Symbol
sym
=
TreeInfo
.
symbolFor
(
tree
);
if
(
sym
==
null
&&
TreeInfo
.
isDeclaration
(
tree
))
{
for
(
TreePath
p
=
path
;
p
!=
null
;
p
=
p
.
getParentPath
())
{
JCTree
t
=
(
JCTree
)
p
.
getLeaf
();
if
(
t
.
getTag
()
==
JCTree
.
CLASSDEF
)
{
JCClassDecl
ct
=
(
JCClassDecl
)
t
;
if
(
ct
.
sym
!=
null
)
{
if
((
ct
.
sym
.
flags_field
&
Flags
.
UNATTRIBUTED
)
!=
0
)
{
attr
.
attribClass
(
ct
.
pos
(),
ct
.
sym
);
sym
=
TreeInfo
.
symbolFor
(
tree
);
}
break
;
}
}
}
}
return
sym
;
}
public
TypeMirror
getTypeMirror
(
TreePath
path
)
{
...
...
src/share/classes/com/sun/tools/javac/tree/TreeInfo.java
浏览文件 @
37b06cc7
...
...
@@ -637,6 +637,18 @@ public class TreeInfo {
}
}
public
static
boolean
isDeclaration
(
JCTree
node
)
{
node
=
skipParens
(
node
);
switch
(
node
.
getTag
())
{
case
JCTree
.
CLASSDEF
:
case
JCTree
.
METHODDEF
:
case
JCTree
.
VARDEF
:
return
true
;
default
:
return
false
;
}
}
/** If this tree is an identifier or a field, return its symbol,
* otherwise return null.
*/
...
...
test/tools/javac/api/TestGetElement.java
0 → 100644
浏览文件 @
37b06cc7
/*
* 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.
*/
/*
* @test
* @bug 6930507
* @summary Symbols for anonymous and local classes made too late for use by java tree API
*/
import
java.io.*
;
import
java.util.*
;
import
javax.annotation.processing.*
;
import
javax.lang.model.SourceVersion
;
import
javax.lang.model.element.*
;
import
javax.tools.Diagnostic
;
import
static
javax
.
lang
.
model
.
util
.
ElementFilter
.*;
import
com.sun.source.tree.*
;
import
com.sun.source.util.*
;
@SupportedOptions
({
"test"
,
"last"
})
@SupportedAnnotationTypes
(
"*"
)
public
class
TestGetElement
extends
AbstractProcessor
{
public
static
void
main
(
String
...
args
)
throws
Exception
{
new
TestGetElement
().
run
();
}
public
TestGetElement
()
{
}
public
void
run
()
throws
Exception
{
final
String
testSrc
=
System
.
getProperty
(
"test.src"
);
final
String
testClasses
=
System
.
getProperty
(
"test.classes"
);
final
String
myClassName
=
getClass
().
getName
();
final
String
mySrc
=
new
File
(
testSrc
,
myClassName
+
".java"
).
getPath
();
final
int
NUM_TESTS
=
90
;
// #decls in this source file
for
(
int
i
=
1
;
i
<=
NUM_TESTS
;
i
++)
{
System
.
err
.
println
(
"test "
+
i
);
File
testDir
=
new
File
(
"test"
+
i
);
File
classesDir
=
new
File
(
testDir
,
"classes"
);
classesDir
.
mkdirs
();
String
[]
args
=
{
"-d"
,
classesDir
.
getPath
(),
"-processorpath"
,
testClasses
,
"-processor"
,
myClassName
,
"-proc:only"
,
"-Atest="
+
i
,
"-Alast="
+
(
i
==
NUM_TESTS
),
mySrc
};
// System.err.println("compile: " + Arrays.asList(args));
StringWriter
sw
=
new
StringWriter
();
PrintWriter
pw
=
new
PrintWriter
(
sw
);
int
rc
=
com
.
sun
.
tools
.
javac
.
Main
.
compile
(
args
,
pw
);
pw
.
close
();
String
out
=
sw
.
toString
();
if
(
out
!=
null
)
System
.
err
.
println
(
out
);
if
(
rc
!=
0
)
{
System
.
err
.
println
(
"compilation failed: rc="
+
rc
);
errors
++;
}
}
if
(
errors
>
0
)
throw
new
Exception
(
errors
+
" errors occurred"
);
}
int
errors
;
public
boolean
process
(
Set
<?
extends
TypeElement
>
annotations
,
RoundEnvironment
roundEnvironment
)
{
if
(
roundEnvironment
.
processingOver
())
return
true
;
Map
<
String
,
String
>
options
=
processingEnv
.
getOptions
();
int
test
=
Integer
.
parseInt
(
options
.
get
(
"test"
));
boolean
_last
=
Boolean
.
parseBoolean
(
options
.
get
(
"last"
));
Trees
trees
=
Trees
.
instance
(
processingEnv
);
Scanner
scanner
=
new
Scanner
(
trees
,
_last
);
int
nelems
=
0
;
for
(
TypeElement
e
:
typesIn
(
roundEnvironment
.
getRootElements
()))
{
nelems
+=
scanner
.
scan
(
trees
.
getPath
(
e
),
test
);
}
Messager
m
=
processingEnv
.
getMessager
();
int
EXPECT
=
1
;
if
(
nelems
!=
EXPECT
)
{
m
.
printMessage
(
Diagnostic
.
Kind
.
ERROR
,
"Unexpected number of elements found: "
+
nelems
+
" expected: "
+
EXPECT
);
}
return
true
;
}
@Override
public
SourceVersion
getSupportedSourceVersion
()
{
return
SourceVersion
.
latest
();
}
class
Scanner
extends
TreePathScanner
<
Integer
,
Integer
>
{
final
Trees
trees
;
final
boolean
last
;
int
count
;
Scanner
(
Trees
trees
,
boolean
last
)
{
this
.
trees
=
trees
;
this
.
last
=
last
;
}
@Override
public
Integer
visitClass
(
ClassTree
tree
,
Integer
test
)
{
return
reduce
(
check
(
test
),
super
.
visitClass
(
tree
,
test
));
}
@Override
public
Integer
visitMethod
(
MethodTree
tree
,
Integer
test
)
{
return
reduce
(
check
(
test
),
super
.
visitMethod
(
tree
,
test
));
}
@Override
public
Integer
visitVariable
(
VariableTree
tree
,
Integer
test
)
{
return
reduce
(
check
(
test
),
super
.
visitVariable
(
tree
,
test
));
}
@Override
public
Integer
reduce
(
Integer
i1
,
Integer
i2
)
{
if
(
i1
==
null
||
i1
.
intValue
()
==
0
)
return
i2
;
if
(
i2
==
null
||
i2
.
intValue
()
==
0
)
return
i1
;
return
(
i1
+
i2
);
}
int
check
(
int
test
)
{
count
++;
if
(
count
!=
test
)
return
0
;
TreePath
p
=
getCurrentPath
();
Element
e
=
trees
.
getElement
(
p
);
String
text
=
p
.
getLeaf
().
toString
().
replaceAll
(
"\\s+"
,
" "
).
trim
();
int
MAXLEN
=
40
;
if
(
text
.
length
()
>
MAXLEN
)
text
=
text
.
substring
(
0
,
MAXLEN
-
3
)
+
"..."
;
System
.
err
.
println
(
String
.
format
(
"%3d: %-"
+
MAXLEN
+
"s -- %s"
,
count
,
text
,
(
e
==
null
?
"null"
:
e
.
getKind
()
+
" "
+
e
)));
Messager
m
=
processingEnv
.
getMessager
();
if
(
e
==
null
)
{
m
.
printMessage
(
Diagnostic
.
Kind
.
ERROR
,
"Null element found for "
+
text
);
return
0
;
}
if
(
last
&&
!
e
.
getSimpleName
().
contentEquals
(
"last"
))
{
m
.
printMessage
(
Diagnostic
.
Kind
.
ERROR
,
"Unexpected name in last test: "
+
e
.
getSimpleName
()
+
", expected: last"
);
}
return
1
;
}
}
// following are all fodder for the test
class
MemberClass
{
class
NestedMemberClass
{
}
}
{
class
InnerClassInInit
{
}
Object
o
=
new
Object
()
{
};
}
TestGetElement
(
TestGetElement
unused
)
{
class
InnerClassInConstr
{
}
Object
o
=
new
Object
()
{
};
}
void
m
()
{
class
InnerClassInMethod
{
}
Object
o
=
new
Object
()
{
};
class
C
{
class
MemberClass
{
class
NestedMemberClass
{
}
}
{
class
InnerClassInInit
{
}
Object
o
=
new
Object
()
{
};
}
C
(
Object
unused
)
{
class
InnerClassInConstr
{
}
Object
o
=
new
Object
()
{
};
}
void
m
()
{
class
InnerClassInMethod
{
}
Object
o
=
new
Object
()
{
};
}
}
}
int
last
;
// this name is verified by the test to make sure that all decls are checked
}
test/tools/javac/processing/model/element/TestAnonClassNames.java
浏览文件 @
37b06cc7
...
...
@@ -27,8 +27,7 @@
* @summary Test that reported names of anonymous classes are non-null.
* @author Joseph D. Darcy
* @build TestAnonSourceNames
* @compile/fail -processor TestAnonSourceNames TestAnonClassNames.java
* @build TestAnonClassNames
* @compile -processor TestAnonSourceNames TestAnonClassNames.java
* @run main TestAnonClassNames
*/
...
...
@@ -40,10 +39,6 @@
*
* Source files will be tested by the @compile line which runs
* TestAnonSourceNames as an annotation processor over this file.
* This compile line is expected to fail until 6930507 is fixed. Once
* bug 6930507 is fixed, the "@compile/fail -processor ..." and
* following "@build..." steps can be replaced with a single "@compile
* -processor ..." directive.
*
* Class files are tested by the @run command on this type. This
* class gets the names of classes with different nesting kinds,
...
...
test/tools/javac/processing/model/element/TestAnonSourceNames.java
浏览文件 @
37b06cc7
...
...
@@ -67,7 +67,7 @@ public class TestAnonSourceNames extends AbstractProcessor {
Element
element
=
trees
.
getElement
(
trees
.
getPath
(
cu
,
node
));
if
(
element
==
null
)
{
processingEnv
.
getMessager
().
printMessage
(
ERROR
,
"No element retr
ei
ved for node named ''"
+
"No element retr
ie
ved for node named ''"
+
node
.
getSimpleName
()
+
"''."
);
}
else
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录