提交 a6055937 编写于 作者: A asaha

Merge

......@@ -438,3 +438,4 @@ ecb7e46b820f293bb644f92bc1af3ede53bceced jdk8u60-b16
87dcdc1fd75bf827c8a4596b183de7ea73cb75e1 jdk8u60-b17
e7e42c79861ea1ab7495de5f238c01f98035a8a8 jdk8u60-b18
0366d7f1faa12ed35694571c151524e0847f05ff jdk8u60-b19
976523f1d5626bdb6dd47883e2734614b64a5e61 jdk8u60-b20
/*
* Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1999, 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
......@@ -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;
......
......@@ -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 classs 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.prepend(t.tsym);
seenTypes.add(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.compoundScope;
return membersClosure;
}
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>
......
......@@ -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) {
......
......@@ -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;
......
......@@ -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
......
......@@ -514,6 +514,10 @@ public class Gen extends JCTree.Visitor {
clinitTAs.addAll(getAndRemoveNonFieldTAs(sym));
} else {
checkStringConstant(vdef.init.pos(), sym.getConstValue());
/* if the init contains a reference to an external class, add it to the
* constant's pool
*/
vdef.init.accept(classReferenceVisitor);
}
}
break;
......@@ -2431,9 +2435,12 @@ public class Gen extends JCTree.Visitor {
&& !allowGenerics // no Miranda methods available with generics
)
implementInterfaceMethods(c);
cdef.defs = normalizeDefs(cdef.defs, c);
c.pool = pool;
pool.reset();
/* method normalizeDefs() can add references to external classes into the constant pool
* so it should be called after pool.reset()
*/
cdef.defs = normalizeDefs(cdef.defs, c);
generateReferencesToPrunedTree(c, pool);
Env<GenContext> localEnv =
new Env<GenContext>(cdef, new GenContext());
......
#
# Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 1999, 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
......@@ -133,7 +133,7 @@ javac.msg.usage=\u4F7F\u7528\u65B9\u6CD5: {0} <options> <source files>\n\u4F7F\u
javac.msg.usage.nonstandard.footer=\u3053\u308C\u3089\u306F\u975E\u6A19\u6E96\u30AA\u30D7\u30B7\u30E7\u30F3\u3067\u3042\u308A\u4E88\u544A\u306A\u3057\u306B\u5909\u66F4\u3055\u308C\u308B\u3053\u3068\u304C\u3042\u308A\u307E\u3059\u3002
javac.msg.bug=\u30B3\u30F3\u30D1\u30A4\u30E9\u3067\u4F8B\u5916\u304C\u767A\u751F\u3057\u307E\u3057\u305F({0})\u3002Bug Parade\u3067\u91CD\u8907\u304C\u306A\u3044\u304B\u3092\u3054\u78BA\u8A8D\u306E\u3046\u3048\u3001Java Developer Connection (http://java.sun.com/webapps/bugreport)\u3067bug\u306E\u767B\u9332\u3092\u304A\u9858\u3044\u3044\u305F\u3057\u307E\u3059\u3002\u30EC\u30DD\u30FC\u30C8\u306B\u306F\u3001\u305D\u306E\u30D7\u30ED\u30B0\u30E9\u30E0\u3068\u4E0B\u8A18\u306E\u8A3A\u65AD\u5185\u5BB9\u3092\u542B\u3081\u3066\u304F\u3060\u3055\u3044\u3002\u3054\u5354\u529B\u3042\u308A\u304C\u3068\u3046\u3054\u3056\u3044\u307E\u3059\u3002
javac.msg.bug=\u30B3\u30F3\u30D1\u30A4\u30E9\u3067\u4F8B\u5916\u304C\u767A\u751F\u3057\u307E\u3057\u305F({0})\u3002\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3067\u91CD\u8907\u304C\u306A\u3044\u304B\u3092\u3054\u78BA\u8A8D\u306E\u3046\u3048\u3001Java Bug Database (http://bugreport.java.com/bugreport/)\u3067bug\u306E\u767B\u9332\u3092\u304A\u9858\u3044\u3044\u305F\u3057\u307E\u3059\u3002\u30EC\u30DD\u30FC\u30C8\u306B\u306F\u3001\u305D\u306E\u30D7\u30ED\u30B0\u30E9\u30E0\u3068\u4E0B\u8A18\u306E\u8A3A\u65AD\u5185\u5BB9\u3092\u542B\u3081\u3066\u304F\u3060\u3055\u3044\u3002\u3054\u5354\u529B\u3042\u308A\u304C\u3068\u3046\u3054\u3056\u3044\u307E\u3059\u3002
javac.msg.io=\n\n\u5165\u51FA\u529B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\n\u8A73\u7D30\u306F\u6B21\u306E\u30B9\u30BF\u30C3\u30AF\u30FB\u30C8\u30EC\u30FC\u30B9\u3067\u8ABF\u67FB\u3057\u3066\u304F\u3060\u3055\u3044\u3002\n
......
#
# Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 1999, 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
......@@ -133,7 +133,7 @@ javac.msg.usage=\u7528\u6CD5: {0} <options> <source files>\n-help \u7528\u4E8E\u
javac.msg.usage.nonstandard.footer=\u8FD9\u4E9B\u9009\u9879\u90FD\u662F\u975E\u6807\u51C6\u9009\u9879, \u5982\u6709\u66F4\u6539, \u6055\u4E0D\u53E6\u884C\u901A\u77E5\u3002
javac.msg.bug=\u7F16\u8BD1\u5668 ({0}) \u4E2D\u51FA\u73B0\u5F02\u5E38\u9519\u8BEF\u3002 \u5982\u679C\u5728 Bug Parade \u4E2D\u6CA1\u6709\u627E\u5230\u8BE5\u9519\u8BEF, \u8BF7\u5728 Java Developer Connection (http://java.sun.com/webapps/bugreport) \u4E2D\u5EFA\u7ACB Bug\u3002\u8BF7\u5728\u62A5\u544A\u4E2D\u9644\u4E0A\u60A8\u7684\u7A0B\u5E8F\u548C\u4EE5\u4E0B\u8BCA\u65AD\u4FE1\u606F\u3002\u8C22\u8C22\u3002
javac.msg.bug=\u7F16\u8BD1\u5668 ({0}) \u4E2D\u51FA\u73B0\u5F02\u5E38\u9519\u8BEF\u3002\u5982\u679C\u5728 Java Bug Database (http://bugreport.java.com/bugreport/) \u4E2D\u6CA1\u6709\u627E\u5230\u8BE5\u9519\u8BEF, \u8BF7\u5728\u8BE5\u6570\u636E\u5E93\u4E2D\u5EFA\u7ACB Bug\u3002\u8BF7\u5728\u62A5\u544A\u4E2D\u9644\u4E0A\u60A8\u7684\u7A0B\u5E8F\u548C\u4EE5\u4E0B\u8BCA\u65AD\u4FE1\u606F\u3002\u8C22\u8C22\u3002
javac.msg.io=\n\n\u53D1\u751F\u8F93\u5165/\u8F93\u51FA\u9519\u8BEF\u3002\n\u6709\u5173\u8BE6\u7EC6\u4FE1\u606F, \u8BF7\u53C2\u9605\u4EE5\u4E0B\u5806\u6808\u8DDF\u8E2A\u3002\n
......
......@@ -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
......
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 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
......@@ -25,9 +25,9 @@
/*
* @test
* @bug 7153958
* @bug 7153958 8073372
* @summary add constant pool reference to class containing inlined constants
* @compile pkg/ClassToBeStaticallyImported.java CPoolRefClassContainingInlinedCts.java
* @compile pkg/ClassToBeStaticallyImportedA.java pkg/ClassToBeStaticallyImportedB.java CPoolRefClassContainingInlinedCts.java
* @run main CPoolRefClassContainingInlinedCts
*/
......@@ -38,7 +38,8 @@ import com.sun.tools.classfile.ConstantPoolException;
import java.io.File;
import java.io.IOException;
import static pkg.ClassToBeStaticallyImported.staticField;
import static pkg.ClassToBeStaticallyImportedA.staticFieldA;
import static pkg.ClassToBeStaticallyImportedB.staticFieldB;
public class CPoolRefClassContainingInlinedCts {
......@@ -54,10 +55,14 @@ public class CPoolRefClassContainingInlinedCts {
void checkClassName(String className) {
switch (className) {
case "SimpleAssignClass" : case "BinaryExpClass":
case "UnaryExpClass" : case "CastClass":
case "ParensClass" : case "CondClass":
case "IfClass" : case "pkg/ClassToBeStaticallyImported":
case "SimpleAssignClassA" : case "BinaryExpClassA":
case "UnaryExpClassA" : case "CastClassA":
case "ParensClassA" : case "CondClassA":
case "IfClassA" : case "pkg/ClassToBeStaticallyImportedA":
case "SimpleAssignClassB" : case "BinaryExpClassB":
case "UnaryExpClassB" : case "CastClassB":
case "ParensClassB" : case "CondClassB":
case "IfClassB" : case "pkg/ClassToBeStaticallyImportedB":
numberOfReferencedClassesToBeChecked++;
}
}
......@@ -76,59 +81,111 @@ public class CPoolRefClassContainingInlinedCts {
}
i += cpInfo.size();
}
if (numberOfReferencedClassesToBeChecked != 8) {
if (numberOfReferencedClassesToBeChecked != 16) {
throw new AssertionError("Class reference missing in the constant pool");
}
}
private int assign = SimpleAssignClass.x;
private int binary = BinaryExpClass.x + 1;
private int unary = -UnaryExpClass.x;
private int cast = (int)CastClass.x;
private int parens = (ParensClass.x);
private int cond = (CondClass.x == 1) ? 1 : 2;
private static int ifConstant;
private static int importStatic;
private int assignA = SimpleAssignClassA.x;
private int binaryA = BinaryExpClassA.x + 1;
private int unaryA = -UnaryExpClassA.x;
private int castA = (int)CastClassA.x;
private int parensA = (ParensClassA.x);
private int condA = (CondClassA.x == 1) ? 1 : 2;
private static int ifConstantA;
private static int importStaticA;
static {
if (IfClass.x == 1) {
ifConstant = 1;
if (IfClassA.x == 1) {
ifConstantA = 1;
} else {
ifConstant = 2;
ifConstantA = 2;
}
}
static {
if (staticField == 1) {
importStatic = 1;
if (staticFieldA == 1) {
importStaticA = 1;
} else {
importStatic = 2;
importStaticA = 2;
}
}
// now as final constants
private static final int assignB = SimpleAssignClassB.x;
private static final int binaryB = BinaryExpClassB.x + 1;
private static final int unaryB = -UnaryExpClassB.x;
private static final int castB = (int)CastClassB.x;
private static final int parensB = (ParensClassB.x);
private static final int condB = (CondClassB.x == 1) ? 1 : 2;
private static final int ifConstantB;
private static final int importStaticB;
static {
if (IfClassB.x == 1) {
ifConstantB = 1;
} else {
ifConstantB = 2;
}
}
static {
if (staticFieldB == 1) {
importStaticB = 1;
} else {
importStaticB = 2;
}
}
}
class SimpleAssignClassA {
public static final int x = 1;
}
class SimpleAssignClassB {
public static final int x = 1;
}
class BinaryExpClassA {
public static final int x = 1;
}
class BinaryExpClassB {
public static final int x = 1;
}
class UnaryExpClassA {
public static final int x = 1;
}
class UnaryExpClassB {
public static final int x = 1;
}
class CastClassA {
public static final int x = 1;
}
class SimpleAssignClass {
class CastClassB {
public static final int x = 1;
}
class BinaryExpClass {
class ParensClassA {
public static final int x = 1;
}
class UnaryExpClass {
class ParensClassB {
public static final int x = 1;
}
class CastClass {
class CondClassA {
public static final int x = 1;
}
class ParensClass {
class CondClassB {
public static final int x = 1;
}
class CondClass {
class IfClassA {
public static final int x = 1;
}
class IfClass {
class IfClassB {
public static final int x = 1;
}
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 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
......@@ -24,6 +24,6 @@
*/
package pkg;
public class ClassToBeStaticallyImported {
public static final int staticField = 1;
public class ClassToBeStaticallyImportedA {
public static final int staticFieldA = 1;
}
/*
* Copyright (c) 2012, 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. 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 pkg;
public class ClassToBeStaticallyImportedB {
public static final int staticFieldB = 1;
}
/*
* @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();
}
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
/*
* 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 /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;
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
/*
* 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()))
)
)
)
)
)
)
)
)
);
}
}
/*
* 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 + " "));
}
}
/*
* 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");
}
}
/*
* 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.
先完成此消息的编辑!
想要评论请 注册