OpenJDK / jdk / hs
changeset 7522:bcbc85ba18af
Merge
author | lana |
---|---|
date | Sun, 05 Dec 2010 15:26:16 -0800 |
parents | 05eaa49f406b eee14bcc6563 |
children | 182457b16bfb |
files | langtools/test/tools/javac/TryWithResources/ArmLint.java langtools/test/tools/javac/TryWithResources/ArmLint.out langtools/test/tools/javac/diags/examples/MulticatchMustBeFinal.java |
diffstat | 116 files changed, 2339 insertions(+), 483 deletions(-) [+] |
line wrap: on
line diff
--- a/.hgtags Thu Dec 02 23:44:01 2010 -0800 +++ b/.hgtags Sun Dec 05 15:26:16 2010 -0800 @@ -93,3 +93,4 @@ a4e6aa1f45ad23a6f083ed98d970b5006ea4d292 jdk7-b116 228e73f288c543a8c34e2a54227103ae5649e6af jdk7-b117 2e876e59938a853934aa738c811b26c452bd9fe8 jdk7-b118 +4951967a61b4dbbf514828879f57bd1a0d4b420b jdk7-b119
--- a/.hgtags-top-repo Thu Dec 02 23:44:01 2010 -0800 +++ b/.hgtags-top-repo Sun Dec 05 15:26:16 2010 -0800 @@ -93,3 +93,4 @@ 94e9a1bfba8b8d1fe0bfd43b88629b1f27b02a76 jdk7-b116 7220e60b097fa027e922f1aeecdd330f3e37409f jdk7-b117 a12a9e78df8a9d534da0b4a244ed68f0de0bd58e jdk7-b118 +661360bef6ccad6c119f067f5829b207de80c936 jdk7-b119
--- a/corba/src/share/classes/com/sun/corba/se/impl/interceptors/ClientRequestInfoImpl.java Thu Dec 02 23:44:01 2010 -0800 +++ b/corba/src/share/classes/com/sun/corba/se/impl/interceptors/ClientRequestInfoImpl.java Sun Dec 05 15:26:16 2010 -0800 @@ -74,6 +74,7 @@ import com.sun.corba.se.spi.ior.iiop.GIOPVersion; import com.sun.corba.se.spi.orb.ORB; import com.sun.corba.se.spi.protocol.CorbaMessageMediator; +import com.sun.corba.se.spi.protocol.RetryType; import com.sun.corba.se.spi.transport.CorbaContactInfo; import com.sun.corba.se.spi.transport.CorbaContactInfoList; import com.sun.corba.se.spi.transport.CorbaContactInfoListIterator; @@ -110,7 +111,7 @@ // The current retry request status. True if this request is being // retried and this info object is to be reused, or false otherwise. - private boolean retryRequest; + private RetryType retryRequest; // The number of times this info object has been (re)used. This is // incremented every time a request is retried, and decremented every @@ -163,7 +164,8 @@ // Please keep these in the same order that they're declared above. - retryRequest = false; + // 6763340 + retryRequest = RetryType.NONE; // Do not reset entryCount because we need to know when to pop this // from the stack. @@ -824,14 +826,15 @@ /** * Set or reset the retry request flag. */ - void setRetryRequest( boolean retryRequest ) { + void setRetryRequest( RetryType retryRequest ) { this.retryRequest = retryRequest; } /** * Retrieve the current retry request status. */ - boolean getRetryRequest() { + RetryType getRetryRequest() { + // 6763340 return this.retryRequest; }
--- a/corba/src/share/classes/com/sun/corba/se/impl/interceptors/PIHandlerImpl.java Thu Dec 02 23:44:01 2010 -0800 +++ b/corba/src/share/classes/com/sun/corba/se/impl/interceptors/PIHandlerImpl.java Sun Dec 05 15:26:16 2010 -0800 @@ -70,6 +70,7 @@ import com.sun.corba.se.spi.protocol.CorbaMessageMediator; import com.sun.corba.se.spi.protocol.ForwardException; import com.sun.corba.se.spi.protocol.PIHandler; +import com.sun.corba.se.spi.protocol.RetryType; import com.sun.corba.se.spi.logging.CORBALogDomains; import com.sun.corba.se.impl.logging.InterceptorsSystemException; @@ -372,9 +373,24 @@ } } - public Exception invokeClientPIEndingPoint( - int replyStatus, Exception exception ) - { + // Needed when an error forces a retry AFTER initiateClientPIRequest + // but BEFORE invokeClientPIStartingPoint. + public Exception makeCompletedClientRequest( int replyStatus, + Exception exception ) { + + // 6763340 + return handleClientPIEndingPoint( replyStatus, exception, false ) ; + } + + public Exception invokeClientPIEndingPoint( int replyStatus, + Exception exception ) { + + // 6763340 + return handleClientPIEndingPoint( replyStatus, exception, true ) ; + } + + public Exception handleClientPIEndingPoint( + int replyStatus, Exception exception, boolean invokeEndingPoint ) { if( !hasClientInterceptors ) return exception; if( !isClientPIEnabledForThisThread() ) return exception; @@ -388,24 +404,31 @@ ClientRequestInfoImpl info = peekClientRequestInfoImplStack(); info.setReplyStatus( piReplyStatus ); info.setException( exception ); - interceptorInvoker.invokeClientInterceptorEndingPoint( info ); - piReplyStatus = info.getReplyStatus(); + + if (invokeEndingPoint) { + // 6763340 + interceptorInvoker.invokeClientInterceptorEndingPoint( info ); + piReplyStatus = info.getReplyStatus(); + } // Check reply status: if( (piReplyStatus == LOCATION_FORWARD.value) || - (piReplyStatus == TRANSPORT_RETRY.value) ) - { + (piReplyStatus == TRANSPORT_RETRY.value) ) { // If this is a forward or a retry, reset and reuse // info object: info.reset(); - info.setRetryRequest( true ); + + // fix for 6763340: + if (invokeEndingPoint) { + info.setRetryRequest( RetryType.AFTER_RESPONSE ) ; + } else { + info.setRetryRequest( RetryType.BEFORE_RESPONSE ) ; + } // ... and return a RemarshalException so the orb internals know exception = new RemarshalException(); - } - else if( (piReplyStatus == SYSTEM_EXCEPTION.value) || - (piReplyStatus == USER_EXCEPTION.value) ) - { + } else if( (piReplyStatus == SYSTEM_EXCEPTION.value) || + (piReplyStatus == USER_EXCEPTION.value) ) { exception = info.getException(); } @@ -421,18 +444,21 @@ RequestInfoStack infoStack = (RequestInfoStack)threadLocalClientRequestInfoStack.get(); ClientRequestInfoImpl info = null; - if( !infoStack.empty() ) info = - (ClientRequestInfoImpl)infoStack.peek(); - if( !diiRequest && (info != null) && info.isDIIInitiate() ) { + if (!infoStack.empty() ) { + info = (ClientRequestInfoImpl)infoStack.peek(); + } + + if (!diiRequest && (info != null) && info.isDIIInitiate() ) { // In RequestImpl.doInvocation we already called // initiateClientPIRequest( true ), so ignore this initiate. info.setDIIInitiate( false ); - } - else { + } else { // If there is no info object or if we are not retrying a request, // push a new ClientRequestInfoImpl on the stack: - if( (info == null) || !info.getRetryRequest() ) { + + // 6763340: don't push unless this is not a retry + if( (info == null) || !info.getRetryRequest().isRetry() ) { info = new ClientRequestInfoImpl( orb ); infoStack.push( info ); printPush(); @@ -442,9 +468,15 @@ // Reset the retry request flag so that recursive calls will // push a new info object, and bump up entry count so we know // when to pop this info object: - info.setRetryRequest( false ); + info.setRetryRequest( RetryType.NONE ); info.incrementEntryCount(); + // KMC 6763340: I don't know why this wasn't set earlier, + // but we do not want a retry to pick up the previous + // reply status, so clear it here. Most likely a new + // info was pushed before, so that this was not a problem. + info.setReplyStatus( RequestInfoImpl.UNINITIALIZED ) ; + // If this is a DII request, make sure we ignore the next initiate. if( diiRequest ) { info.setDIIInitiate( true ); @@ -457,25 +489,34 @@ if( !isClientPIEnabledForThisThread() ) return; ClientRequestInfoImpl info = peekClientRequestInfoImplStack(); + RetryType rt = info.getRetryRequest() ; - // If the replyStatus has not yet been set, this is an indication - // that the ORB threw an exception before we had a chance to - // invoke the client interceptor ending points. - // - // _REVISIT_ We cannot handle any exceptions or ForwardRequests - // flagged by the ending points here because there is no way - // to gracefully handle this in any of the calling code. - // This is a rare corner case, so we will ignore this for now. - short replyStatus = info.getReplyStatus(); - if( replyStatus == info.UNINITIALIZED ) { - invokeClientPIEndingPoint( ReplyMessage.SYSTEM_EXCEPTION, - wrapper.unknownRequestInvoke( - CompletionStatus.COMPLETED_MAYBE ) ) ; + // fix for 6763340 + if (!rt.equals( RetryType.BEFORE_RESPONSE )) { + + // If the replyStatus has not yet been set, this is an indication + // that the ORB threw an exception before we had a chance to + // invoke the client interceptor ending points. + // + // _REVISIT_ We cannot handle any exceptions or ForwardRequests + // flagged by the ending points here because there is no way + // to gracefully handle this in any of the calling code. + // This is a rare corner case, so we will ignore this for now. + short replyStatus = info.getReplyStatus(); + if (replyStatus == info.UNINITIALIZED ) { + invokeClientPIEndingPoint( ReplyMessage.SYSTEM_EXCEPTION, + wrapper.unknownRequestInvoke( + CompletionStatus.COMPLETED_MAYBE ) ) ; + } } // Decrement entry count, and if it is zero, pop it from the stack. info.decrementEntryCount(); - if( info.getEntryCount() == 0 ) { + + // fix for 6763340, and probably other cases (non-recursive retry) + if (info.getEntryCount() == 0 && !info.getRetryRequest().isRetry()) { + // RequestInfoStack<ClientRequestInfoImpl> infoStack = + // threadLocalClientRequestInfoStack.get(); RequestInfoStack infoStack = (RequestInfoStack)threadLocalClientRequestInfoStack.get(); infoStack.pop();
--- a/corba/src/share/classes/com/sun/corba/se/impl/interceptors/PINoOpHandlerImpl.java Thu Dec 02 23:44:01 2010 -0800 +++ b/corba/src/share/classes/com/sun/corba/se/impl/interceptors/PINoOpHandlerImpl.java Sun Dec 05 15:26:16 2010 -0800 @@ -107,6 +107,11 @@ return null; } + public Exception makeCompletedClientRequest( + int replyStatus, Exception exception ) { + return null; + } + public void initiateClientPIRequest( boolean diiRequest ) { }
--- a/corba/src/share/classes/com/sun/corba/se/impl/interceptors/RequestInfoImpl.java Thu Dec 02 23:44:01 2010 -0800 +++ b/corba/src/share/classes/com/sun/corba/se/impl/interceptors/RequestInfoImpl.java Sun Dec 05 15:26:16 2010 -0800 @@ -187,7 +187,8 @@ startingPointCall = 0; intermediatePointCall = 0; endingPointCall = 0; - replyStatus = UNINITIALIZED; + // 6763340 + setReplyStatus( UNINITIALIZED ) ; currentExecutionPoint = EXECUTION_POINT_STARTING; alreadyExecuted = false; connection = null;
--- a/corba/src/share/classes/com/sun/corba/se/impl/io/IIOPInputStream.java Thu Dec 02 23:44:01 2010 -0800 +++ b/corba/src/share/classes/com/sun/corba/se/impl/io/IIOPInputStream.java Sun Dec 05 15:26:16 2010 -0800 @@ -1012,7 +1012,11 @@ * else, * Handle it as a serializable class. */ - if (currentClassDesc.isExternalizable()) { + if (Enum.class.isAssignableFrom( clz )) { + int ordinal = orbStream.read_long() ; + String value = (String)orbStream.read_value( String.class ) ; + return Enum.valueOf( clz, value ) ; + } else if (currentClassDesc.isExternalizable()) { try { currentObject = (currentClass == null) ? null : currentClassDesc.newInstance();
--- a/corba/src/share/classes/com/sun/corba/se/impl/orb/ORBImpl.java Thu Dec 02 23:44:01 2010 -0800 +++ b/corba/src/share/classes/com/sun/corba/se/impl/orb/ORBImpl.java Sun Dec 05 15:26:16 2010 -0800 @@ -1672,6 +1672,7 @@ { StackImpl invocationInfoStack = (StackImpl)clientInvocationInfoStack.get(); + int entryCount = -1; ClientInvocationInfo clientInvocationInfo = null; if (!invocationInfoStack.empty()) { clientInvocationInfo = @@ -1680,8 +1681,12 @@ throw wrapper.invocationInfoStackEmpty() ; } clientInvocationInfo.decrementEntryCount(); + entryCount = clientInvocationInfo.getEntryCount(); if (clientInvocationInfo.getEntryCount() == 0) { - invocationInfoStack.pop(); + // 6763340: don't pop if this is a retry! + if (!clientInvocationInfo.isRetryInvocation()) { + invocationInfoStack.pop(); + } finishedDispatch(); } }
--- a/corba/src/share/classes/com/sun/corba/se/impl/protocol/CorbaClientRequestDispatcherImpl.java Thu Dec 02 23:44:01 2010 -0800 +++ b/corba/src/share/classes/com/sun/corba/se/impl/protocol/CorbaClientRequestDispatcherImpl.java Sun Dec 05 15:26:16 2010 -0800 @@ -185,6 +185,7 @@ if(getContactInfoListIterator(orb).hasNext()) { contactInfo = (ContactInfo) getContactInfoListIterator(orb).next(); + unregisterWaiter(orb); return beginRequest(self, opName, isOneWay, contactInfo); } else { @@ -292,10 +293,22 @@ // ContactInfoList outside of subcontract. // Want to move that update to here. if (getContactInfoListIterator(orb).hasNext()) { - contactInfo = (ContactInfo) - getContactInfoListIterator(orb).next(); + contactInfo = (ContactInfo)getContactInfoListIterator(orb).next(); + if (orb.subcontractDebugFlag) { + dprint( "RemarshalException: hasNext true\ncontact info " + contactInfo ); + } + + // Fix for 6763340: Complete the first attempt before starting another. + orb.getPIHandler().makeCompletedClientRequest( + ReplyMessage.LOCATION_FORWARD, null ) ; + unregisterWaiter(orb); + orb.getPIHandler().cleanupClientPIRequest() ; + return beginRequest(self, opName, isOneWay, contactInfo); } else { + if (orb.subcontractDebugFlag) { + dprint( "RemarshalException: hasNext false" ); + } ORBUtilSystemException wrapper = ORBUtilSystemException.get(orb, CORBALogDomains.RPC_PROTOCOL);
--- a/corba/src/share/classes/com/sun/corba/se/spi/protocol/PIHandler.java Thu Dec 02 23:44:01 2010 -0800 +++ b/corba/src/share/classes/com/sun/corba/se/spi/protocol/PIHandler.java Sun Dec 05 15:26:16 2010 -0800 @@ -142,6 +142,27 @@ int replyStatus, Exception exception ) ; /** + * Called when a retry is needed after initiateClientPIRequest but + * before invokeClientPIRequest. In this case, we need to properly + * balance initiateClientPIRequest/cleanupClientPIRequest calls, + * but WITHOUT extraneous calls to invokeClientPIEndingPoint + * (see bug 6763340). + * + * @param replyStatus One of the constants in iiop.messages.ReplyMessage + * indicating which reply status to set. + * @param exception The exception before ending interception points have + * been invoked, or null if no exception at the moment. + * @return The exception to be thrown, after having gone through + * all ending points, or null if there is no exception to be + * thrown. Note that this exception can be either the same or + * different from the exception set using setClientPIException. + * There are four possible return types: null (no exception), + * SystemException, UserException, or RemarshalException. + */ + Exception makeCompletedClientRequest( + int replyStatus, Exception exception ) ; + + /** * Invoked when a request is about to be created. Must be called before * any of the setClientPI* methods so that a new info object can be * prepared for information collection.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/corba/src/share/classes/com/sun/corba/se/spi/protocol/RetryType.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,52 @@ +/* + * 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. 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.corba.se.spi.protocol ; + +// Introduce more information about WHY we are re-trying a request +// so we can properly handle the two cases: +// - BEFORE_RESPONSE means that the retry is caused by +// something that happened BEFORE the message was sent: either +// an exception from the SocketFactory, or one from the +// Client side send_request interceptor point. +// - AFTER_RESPONSE means that the retry is a result either of the +// request sent to the server (from the response), or from the +// Client side receive_xxx interceptor point. +public enum RetryType { + NONE( false ), + BEFORE_RESPONSE( true ), + AFTER_RESPONSE( true ) ; + + private final boolean isRetry ; + + RetryType( boolean isRetry ) { + this.isRetry = isRetry ; + } + + public boolean isRetry() { + return this.isRetry ; + } +} ; +
--- a/jaxp/.hgtags Thu Dec 02 23:44:01 2010 -0800 +++ b/jaxp/.hgtags Sun Dec 05 15:26:16 2010 -0800 @@ -93,3 +93,4 @@ f8d4e6c6cfce1cda23fcbd144628a9791a9e1a63 jdk7-b116 9ee4d96e893436a48607924227dadd2d93b9b00d jdk7-b117 b2f6d9c4f12ffd307a5de40455b2b61b31a5cb79 jdk7-b118 +9ee900f01c5872551c06f33ae909662ffd8463ac jdk7-b119
--- a/jaxws/.hgtags Thu Dec 02 23:44:01 2010 -0800 +++ b/jaxws/.hgtags Sun Dec 05 15:26:16 2010 -0800 @@ -93,3 +93,4 @@ 376ac153078dd3b5f6d4a0981feee092c1492c96 jdk7-b116 1320fb3bb588298c79716bd2d10b5b4afacb9370 jdk7-b117 19a2fab3f91a275f90791c15d1c21a24e820ff2d jdk7-b118 +41fa02b3663795ddf529690df7aa6714210093ec jdk7-b119
--- a/jdk/.hgtags Thu Dec 02 23:44:01 2010 -0800 +++ b/jdk/.hgtags Sun Dec 05 15:26:16 2010 -0800 @@ -93,3 +93,5 @@ 1657ed4e1d86c8aa2028ab5a41f9da1ac4a369f8 jdk7-b116 3e6726bbf80a4254ecd01051c8ed77ee19325e46 jdk7-b117 b357910aa04aead2a16b6d6ff395a8df4b51d1dd jdk7-b118 +ecab7eefb8f2326fd90fb632f47f1b6f81e928f8 jdk7-b119 +37d74e29687cf07c2bf9411af58c7e42440855c3 jdk7-b120
--- a/jdk/make/sun/xawt/mapfile-vers Thu Dec 02 23:44:01 2010 -0800 +++ b/jdk/make/sun/xawt/mapfile-vers Sun Dec 05 15:26:16 2010 -0800 @@ -429,6 +429,7 @@ Java_com_sun_java_swing_plaf_gtk_GTKStyle_nativeGetClassValue; Java_com_sun_java_swing_plaf_gtk_GTKStyle_nativeGetPangoFontName; + Java_sun_awt_X11_GtkFileDialogPeer_initIDs; Java_sun_awt_X11_GtkFileDialogPeer_run; Java_sun_awt_X11_GtkFileDialogPeer_quit;
--- a/jdk/src/share/classes/java/awt/Component.java Thu Dec 02 23:44:01 2010 -0800 +++ b/jdk/src/share/classes/java/awt/Component.java Sun Dec 05 15:26:16 2010 -0800 @@ -2154,6 +2154,7 @@ * * @param d the dimension specifying the new size * of this component + * @throws NullPointerException if {@code d} is {@code null} * @see #setSize * @see #setBounds * @see #invalidate @@ -2351,6 +2352,7 @@ * invalidates the component hierarchy. * * @param r the new bounding rectangle for this component + * @throws NullPointerException if {@code r} is {@code null} * @see #getBounds * @see #setLocation(int, int) * @see #setLocation(Point) @@ -4545,6 +4547,7 @@ * where the point's <i>x</i> and <i>y</i> coordinates are defined * to be relative to the coordinate system of this component. * @param p the point + * @throws NullPointerException if {@code p} is {@code null} * @see #getComponentAt(Point) * @since JDK1.1 */ @@ -5879,7 +5882,7 @@ * @exception ClassCastException if <code>listenerType</code> * doesn't specify a class or interface that implements * <code>java.util.EventListener</code> - * + * @throws NullPointerException if {@code listenerType} is {@code null} * @see #getComponentListeners * @see #getFocusListeners * @see #getHierarchyListeners @@ -8038,6 +8041,7 @@ * Prints a listing of this component to the specified output * stream. * @param out a print stream + * @throws NullPointerException if {@code out} is {@code null} * @since JDK1.0 */ public void list(PrintStream out) { @@ -8050,6 +8054,7 @@ * @param out a print stream * @param indent number of spaces to indent * @see java.io.PrintStream#println(java.lang.Object) + * @throws NullPointerException if {@code out} is {@code null} * @since JDK1.0 */ public void list(PrintStream out, int indent) { @@ -8062,6 +8067,7 @@ /** * Prints a listing to the specified print writer. * @param out the print writer to print to + * @throws NullPointerException if {@code out} is {@code null} * @since JDK1.1 */ public void list(PrintWriter out) { @@ -8073,6 +8079,7 @@ * the specified print writer. * @param out the print writer to print to * @param indent the number of spaces to indent + * @throws NullPointerException if {@code out} is {@code null} * @see java.io.PrintStream#println(java.lang.Object) * @since JDK1.1 */
--- a/jdk/src/share/classes/java/awt/Container.java Thu Dec 02 23:44:01 2010 -0800 +++ b/jdk/src/share/classes/java/awt/Container.java Sun Dec 05 15:26:16 2010 -0800 @@ -1231,6 +1231,7 @@ * reflect the changes. * * @param comp the component to be removed + * @throws NullPointerException if {@code comp} is {@code null} * @see #add * @see #invalidate * @see #validate @@ -2154,6 +2155,7 @@ * @exception ClassCastException if <code>listenerType</code> * doesn't specify a class or interface that implements * <code>java.util.EventListener</code> + * @exception NullPointerException if {@code listenerType} is {@code null} * * @see #getContainerListeners * @@ -2705,6 +2707,7 @@ * If there is no child component at the requested point and the * point is within the bounds of the container the container itself * is returned. + * @throws NullPointerException if {@code p} is {@code null} * @see Component#contains * @see #getComponentAt * @since 1.2 @@ -2969,6 +2972,7 @@ * * @param out a print stream * @param indent the number of spaces to indent + * @throws NullPointerException if {@code out} is {@code null} * @see Component#list(java.io.PrintStream, int) * @since JDK1.0 */ @@ -2995,6 +2999,7 @@ * * @param out a print writer * @param indent the number of spaces to indent + * @throws NullPointerException if {@code out} is {@code null} * @see Component#list(java.io.PrintWriter, int) * @since JDK1.1 */
--- a/jdk/src/share/classes/java/awt/ScrollPane.java Thu Dec 02 23:44:01 2010 -0800 +++ b/jdk/src/share/classes/java/awt/ScrollPane.java Sun Dec 05 15:26:16 2010 -0800 @@ -377,6 +377,7 @@ * This is a convenience method which interfaces with the Adjustable * objects which represent the state of the scrollbars. * @param p the Point representing the position to scroll to + * @throws NullPointerException if {@code p} is {@code null} */ public void setScrollPosition(Point p) { setScrollPosition(p.x, p.y);
--- a/jdk/src/share/classes/java/awt/Window.java Thu Dec 02 23:44:01 2010 -0800 +++ b/jdk/src/share/classes/java/awt/Window.java Sun Dec 05 15:26:16 2010 -0800 @@ -1888,6 +1888,7 @@ * @exception ClassCastException if <code>listenerType</code> * doesn't specify a class or interface that implements * <code>java.util.EventListener</code> + * @exception NullPointerException if {@code listenerType} is {@code null} * * @see #getWindowListeners * @since 1.3
--- a/jdk/src/share/classes/javax/swing/GroupLayout.java Thu Dec 02 23:44:01 2010 -0800 +++ b/jdk/src/share/classes/javax/swing/GroupLayout.java Sun Dec 05 15:26:16 2010 -0800 @@ -653,6 +653,10 @@ */ public ParallelGroup createParallelGroup(Alignment alignment, boolean resizable){ + if (alignment == null) { + throw new IllegalArgumentException("alignment must be non null"); + } + if (alignment == Alignment.BASELINE) { return new BaselineGroup(resizable); }
--- a/jdk/src/share/classes/javax/swing/JComponent.java Thu Dec 02 23:44:01 2010 -0800 +++ b/jdk/src/share/classes/javax/swing/JComponent.java Sun Dec 05 15:26:16 2010 -0800 @@ -4734,6 +4734,8 @@ * Notifies this component that it now has a parent component. * When this method is invoked, the chain of parent components is * set up with <code>KeyboardAction</code> event listeners. + * This method is called by the toolkit internally and should + * not be called directly by programs. * * @see #registerKeyboardAction */ @@ -4750,6 +4752,8 @@ * Notifies this component that it no longer has a parent component. * When this method is invoked, any <code>KeyboardAction</code>s * set up in the the chain of parent components are removed. + * This method is called by the toolkit internally and should + * not be called directly by programs. * * @see #registerKeyboardAction */
--- a/jdk/src/share/classes/javax/swing/Popup.java Thu Dec 02 23:44:01 2010 -0800 +++ b/jdk/src/share/classes/javax/swing/Popup.java Sun Dec 05 15:26:16 2010 -0800 @@ -156,7 +156,8 @@ component.setLocation(ownerX, ownerY); component.getContentPane().add(contents, BorderLayout.CENTER); - contents.invalidate(); + component.invalidate(); + component.validate(); if(component.isVisible()) { // Do not call pack() if window is not visible to // avoid early native peer creation
--- a/jdk/src/share/classes/javax/swing/text/DefaultHighlighter.java Thu Dec 02 23:44:01 2010 -0800 +++ b/jdk/src/share/classes/javax/swing/text/DefaultHighlighter.java Sun Dec 05 15:26:16 2010 -0800 @@ -113,6 +113,14 @@ * @exception BadLocationException if the specified location is invalid */ public Object addHighlight(int p0, int p1, Highlighter.HighlightPainter p) throws BadLocationException { + if (p0 < 0) { + throw new BadLocationException("Invalid start offset", p0); + } + + if (p1 < p0) { + throw new BadLocationException("Invalid end offset", p1); + } + Document doc = component.getDocument(); HighlightInfo i = (getDrawsLayeredHighlights() && (p instanceof LayeredHighlighter.LayerPainter)) ? @@ -217,6 +225,14 @@ * @exception BadLocationException if the specified location is invalid */ public void changeHighlight(Object tag, int p0, int p1) throws BadLocationException { + if (p0 < 0) { + throw new BadLocationException("Invalid beginning of the range", p0); + } + + if (p1 < p0) { + throw new BadLocationException("Invalid end of the range", p1); + } + Document doc = component.getDocument(); if (tag instanceof LayeredHighlightInfo) { LayeredHighlightInfo lhi = (LayeredHighlightInfo)tag;
--- a/jdk/src/share/classes/sun/awt/UngrabEvent.java Thu Dec 02 23:44:01 2010 -0800 +++ b/jdk/src/share/classes/sun/awt/UngrabEvent.java Sun Dec 05 15:26:16 2010 -0800 @@ -40,8 +40,10 @@ * <p>To listen for this event, install AWTEventListener with {@value sun.awt.SunToolkit#GRAB_EVENT_MASK} */ public class UngrabEvent extends AWTEvent { + private final static int UNGRAB_EVENT_ID = 1998; + public UngrabEvent(Component source) { - super(source, 0xffff); + super(source, UNGRAB_EVENT_ID); } public String toString() {
--- a/jdk/src/solaris/classes/sun/awt/X11/GtkFileDialogPeer.java Thu Dec 02 23:44:01 2010 -0800 +++ b/jdk/src/solaris/classes/sun/awt/X11/GtkFileDialogPeer.java Sun Dec 05 15:26:16 2010 -0800 @@ -42,11 +42,19 @@ private FileDialog fd; + // A pointer to the native GTK FileChooser widget + private volatile long widget = 0L; + public GtkFileDialogPeer(FileDialog fd) { super((Dialog) fd); this.fd = fd; } + private static native void initIDs(); + static { + initIDs(); + } + private native void run(String title, int mode, String dir, String file, FilenameFilter filter, boolean isMultipleMode);
--- a/jdk/src/solaris/native/sun/awt/awt_MToolkit.c Thu Dec 02 23:44:01 2010 -0800 +++ b/jdk/src/solaris/native/sun/awt/awt_MToolkit.c Sun Dec 05 15:26:16 2010 -0800 @@ -2773,11 +2773,6 @@ } } - /* - scrollBugWorkAround = - (strcmp(XServerVendor(awt_display), "Sun Microsystems, Inc.") == 0 - && XVendorRelease(awt_display) == 3400); - */ scrollBugWorkAround = TRUE; /*
--- a/jdk/src/solaris/native/sun/awt/fontpath.c Thu Dec 02 23:44:01 2010 -0800 +++ b/jdk/src/solaris/native/sun/awt/fontpath.c Sun Dec 05 15:26:16 2010 -0800 @@ -557,7 +557,8 @@ #ifndef HEADLESS static int isSunXServer() { #ifdef __solaris__ - return (strcmp("Sun Microsystems, Inc.", ServerVendor(awt_display)) == 0 && + return ((strncmp(ServerVendor(awt_display), "Sun Microsystems, Inc.", 22) == 0) || + (strncmp(ServerVendor(awt_display), "Oracle Corporation", 18) == 0) && VendorRelease(awt_display) >= 6410); #else return 0;
--- a/jdk/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.c Thu Dec 02 23:44:01 2010 -0800 +++ b/jdk/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.c Sun Dec 05 15:26:16 2010 -0800 @@ -4,13 +4,29 @@ #include <string.h> #include "gtk2_interface.h" #include "sun_awt_X11_GtkFileDialogPeer.h" +#include "debug_assert.h" static JavaVM *jvm; -static GtkWidget *dialog = NULL; /* To cache some method IDs */ static jmethodID filenameFilterCallbackMethodID = NULL; static jmethodID setFileInternalMethodID = NULL; +static jfieldID widgetFieldID = NULL; + +JNIEXPORT void JNICALL Java_sun_awt_X11_GtkFileDialogPeer_initIDs +(JNIEnv *env, jclass cx) +{ + filenameFilterCallbackMethodID = (*env)->GetMethodID(env, cx, + "filenameFilterCallback", "(Ljava/lang/String;)Z"); + DASSERT(filenameFilterCallbackMethodID != NULL); + + setFileInternalMethodID = (*env)->GetMethodID(env, cx, + "setFileInternal", "(Ljava/lang/String;[Ljava/lang/String;)V"); + DASSERT(setFileInternalMethodID != NULL); + + widgetFieldID = (*env)->GetFieldID(env, cx, "widget", "J"); + DASSERT(widgetFieldID != NULL); +} static gboolean filenameFilterCallback(const GtkFileFilterInfo * filter_info, gpointer obj) { @@ -20,30 +36,17 @@ env = (JNIEnv *) JNU_GetEnv(jvm, JNI_VERSION_1_2); - if (filenameFilterCallbackMethodID == NULL) { - cx = (*env)->GetObjectClass(env, (jobject) obj); - if (cx == NULL) { - JNU_ThrowInternalError(env, "Could not get file filter class"); - return 0; - } - - filenameFilterCallbackMethodID = (*env)->GetMethodID(env, cx, - "filenameFilterCallback", "(Ljava/lang/String;)Z"); - if (filenameFilterCallbackMethodID == NULL) { - JNU_ThrowInternalError(env, - "Could not get filenameFilterCallback method id"); - return 0; - } - } - filename = (*env)->NewStringUTF(env, filter_info->filename); return (*env)->CallBooleanMethod(env, obj, filenameFilterCallbackMethodID, filename); } -static void quit(gboolean isSignalHandler) +static void quit(JNIEnv * env, jobject jpeer, gboolean isSignalHandler) { + GtkWidget * dialog = (GtkWidget*)jlong_to_ptr( + (*env)->GetLongField(env, jpeer, widgetFieldID)); + if (dialog != NULL) { // Callbacks from GTK signals are made within the GTK lock @@ -57,7 +60,8 @@ fp_gtk_widget_destroy (dialog); fp_gtk_main_quit (); - dialog = NULL; + + (*env)->SetLongField(env, jpeer, widgetFieldID, 0); if (!isSignalHandler) { fp_gdk_threads_leave(); @@ -73,7 +77,7 @@ JNIEXPORT void JNICALL Java_sun_awt_X11_GtkFileDialogPeer_quit (JNIEnv * env, jobject jpeer) { - quit(FALSE); + quit(env, jpeer, FALSE); } /** @@ -132,24 +136,8 @@ if (responseId == GTK_RESPONSE_ACCEPT) { current_folder = fp_gtk_file_chooser_get_current_folder( - GTK_FILE_CHOOSER(dialog)); - filenames = fp_gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog)); - } - - if (setFileInternalMethodID == NULL) { - cx = (*env)->GetObjectClass(env, (jobject) obj); - if (cx == NULL) { - JNU_ThrowInternalError(env, "Could not get GTK peer class"); - return; - } - - setFileInternalMethodID = (*env)->GetMethodID(env, cx, - "setFileInternal", "(Ljava/lang/String;[Ljava/lang/String;)V"); - if (setFileInternalMethodID == NULL) { - JNU_ThrowInternalError(env, - "Could not get setFileInternalMethodID method id"); - return; - } + GTK_FILE_CHOOSER(aDialog)); + filenames = fp_gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(aDialog)); } jcurrent_folder = (*env)->NewStringUTF(env, current_folder); @@ -159,7 +147,7 @@ jfilenames); fp_g_free(current_folder); - quit(TRUE); + quit(env, (jobject)obj, TRUE); } /* @@ -172,6 +160,7 @@ jstring jtitle, jint mode, jstring jdir, jstring jfile, jobject jfilter, jboolean multiple) { + GtkWidget *dialog = NULL; GtkFileFilter *filter; if (jvm == NULL) { @@ -233,8 +222,12 @@ fp_g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK( handle_response), jpeer); + + (*env)->SetLongField(env, jpeer, widgetFieldID, ptr_to_jlong(dialog)); + fp_gtk_widget_show(dialog); fp_gtk_main(); fp_gdk_threads_leave(); } +
--- a/jdk/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.h Thu Dec 02 23:44:01 2010 -0800 +++ b/jdk/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.h Sun Dec 05 15:26:16 2010 -0800 @@ -11,6 +11,14 @@ /* * Class: sun_awt_X11_GtkFileDialogPeer + * Method: initIDs + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_sun_awt_X11_GtkFileDialogPeer_initIDs +(JNIEnv *, jclass); + +/* + * Class: sun_awt_X11_GtkFileDialogPeer * Method: run * Signature: (Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/io/FilenameFilter;Z;)V */
--- a/jdk/src/solaris/native/sun/xawt/XWindow.c Thu Dec 02 23:44:01 2010 -0800 +++ b/jdk/src/solaris/native/sun/xawt/XWindow.c Sun Dec 05 15:26:16 2010 -0800 @@ -766,7 +766,9 @@ static Boolean isXsunServer(XEvent *event) { if( awt_ServerDetected ) return awt_IsXsun; - if( strncmp( ServerVendor( event->xkey.display ), "Sun Microsystems, Inc.", 32) ) { + if( (strncmp( ServerVendor( event->xkey.display ), "Sun Microsystems, Inc.", 22) != 0) && + (strncmp( ServerVendor( event->xkey.display ), "Oracle Corporation", 18) != 0) ) + { awt_ServerDetected = True; awt_IsXsun = False; return False;
--- a/jdk/src/windows/native/sun/windows/awt_Component.cpp Thu Dec 02 23:44:01 2010 -0800 +++ b/jdk/src/windows/native/sun/windows/awt_Component.cpp Sun Dec 05 15:26:16 2010 -0800 @@ -6084,63 +6084,67 @@ void AwtComponent::_SetRectangularShape(void *param) { - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - - SetRectangularShapeStruct *data = (SetRectangularShapeStruct *)param; - jobject self = data->component; - jint x1 = data->x1; - jint x2 = data->x2; - jint y1 = data->y1; - jint y2 = data->y2; - jobject region = data->region; - - AwtComponent *c = NULL; - - PDATA pData; - JNI_CHECK_PEER_GOTO(self, ret); - - c = (AwtComponent *)pData; - if (::IsWindow(c->GetHWnd())) { - HRGN hRgn = NULL; - if (region || x1 || x2 || y1 || y2) { - // If all the params are zeros, the shape must be simply reset. - // Otherwise, convert it into a region. - RGNDATA *pRgnData = NULL; - RGNDATAHEADER *pRgnHdr; - - /* reserving memory for the worst case */ - size_t worstBufferSize = size_t(((x2 - x1) / 2 + 1) * (y2 - y1)); - pRgnData = (RGNDATA *) safe_Malloc(sizeof(RGNDATAHEADER) + - sizeof(RECT_T) * worstBufferSize); - pRgnHdr = (RGNDATAHEADER *) pRgnData; - - pRgnHdr->dwSize = sizeof(RGNDATAHEADER); - pRgnHdr->iType = RDH_RECTANGLES; - pRgnHdr->nRgnSize = 0; - pRgnHdr->rcBound.top = 0; - pRgnHdr->rcBound.left = 0; - pRgnHdr->rcBound.bottom = LONG(y2 - y1); - pRgnHdr->rcBound.right = LONG(x2 - x1); - - RECT_T * pRect = (RECT_T *) (((BYTE *) pRgnData) + sizeof(RGNDATAHEADER)); - pRgnHdr->nCount = RegionToYXBandedRectangles(env, x1, y1, x2, y2, region, &pRect, worstBufferSize); - - hRgn = ::ExtCreateRegion(NULL, - sizeof(RGNDATAHEADER) + sizeof(RECT_T) * pRgnHdr->nCount, pRgnData); - - free(pRgnData); + if (!AwtToolkit::IsMainThread()) { + AwtToolkit::GetInstance().InvokeFunction(AwtComponent::_SetRectangularShape, param); + } else { + JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + + SetRectangularShapeStruct *data = (SetRectangularShapeStruct *)param; + jobject self = data->component; + jint x1 = data->x1; + jint x2 = data->x2; + jint y1 = data->y1; + jint y2 = data->y2; + jobject region = data->region; + + AwtComponent *c = NULL; + + PDATA pData; + JNI_CHECK_PEER_GOTO(self, ret); + + c = (AwtComponent *)pData; + if (::IsWindow(c->GetHWnd())) { + HRGN hRgn = NULL; + if (region || x1 || x2 || y1 || y2) { + // If all the params are zeros, the shape must be simply reset. + // Otherwise, convert it into a region. + RGNDATA *pRgnData = NULL; + RGNDATAHEADER *pRgnHdr; + + /* reserving memory for the worst case */ + size_t worstBufferSize = size_t(((x2 - x1) / 2 + 1) * (y2 - y1)); + pRgnData = (RGNDATA *) safe_Malloc(sizeof(RGNDATAHEADER) + + sizeof(RECT_T) * worstBufferSize); + pRgnHdr = (RGNDATAHEADER *) pRgnData; + + pRgnHdr->dwSize = sizeof(RGNDATAHEADER); + pRgnHdr->iType = RDH_RECTANGLES; + pRgnHdr->nRgnSize = 0; + pRgnHdr->rcBound.top = 0; + pRgnHdr->rcBound.left = 0; + pRgnHdr->rcBound.bottom = LONG(y2 - y1); + pRgnHdr->rcBound.right = LONG(x2 - x1); + + RECT_T * pRect = (RECT_T *) (((BYTE *) pRgnData) + sizeof(RGNDATAHEADER)); + pRgnHdr->nCount = RegionToYXBandedRectangles(env, x1, y1, x2, y2, region, &pRect, worstBufferSize); + + hRgn = ::ExtCreateRegion(NULL, + sizeof(RGNDATAHEADER) + sizeof(RECT_T) * pRgnHdr->nCount, pRgnData); + + free(pRgnData); + } + + ::SetWindowRgn(c->GetHWnd(), hRgn, TRUE); } - ::SetWindowRgn(c->GetHWnd(), hRgn, TRUE); - } - ret: - env->DeleteGlobalRef(self); - if (region) { - env->DeleteGlobalRef(region); - } - - delete data; + env->DeleteGlobalRef(self); + if (region) { + env->DeleteGlobalRef(region); + } + + delete data; + } } void AwtComponent::_SetZOrder(void *param) {
--- a/jdk/src/windows/native/sun/windows/awt_Robot.cpp Thu Dec 02 23:44:01 2010 -0800 +++ b/jdk/src/windows/native/sun/windows/awt_Robot.cpp Sun Dec 05 15:26:16 2010 -0800 @@ -194,9 +194,9 @@ jint AwtRobot::GetRGBPixel( jint x, jint y) { - HDC hdc = GetDC(NULL); + HDC hdc = ::CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL); COLORREF ref = ::GetPixel( hdc, x, y ); - ReleaseDC(NULL,hdc); + ::DeleteDC(hdc); jint value = WinToJavaPixel(GetRValue(ref), GetGValue(ref), GetBValue(ref)); return value; }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/Frame/ShapeNotSetSometimes/ShapeNotSetSometimes.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,177 @@ +/* + * 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 6988428 + @summary Tests whether shape is always set + @author anthony.petrov@oracle.com: area=awt.toplevel + @run main ShapeNotSetSometimes +*/ + + +import java.awt.*; +import java.awt.event.InputEvent; +import java.awt.geom.*; + + +public class ShapeNotSetSometimes { + + private Frame backgroundFrame; + private Frame window; + private static final Color BACKGROUND_COLOR = Color.BLUE; + private Shape shape; + private int[][] pointsToCheck; + + private static Robot robot; + + public ShapeNotSetSometimes() throws Exception { + EventQueue.invokeAndWait(new Runnable() { + public void run() { + initializeGUI(); + } + }); + } + + private void initializeGUI() { + backgroundFrame = new BackgroundFrame(); + backgroundFrame.setUndecorated(true); + backgroundFrame.setSize(300, 300); + backgroundFrame.setLocation(20, 400); + backgroundFrame.setVisible(true); + + shape = null; + String shape_name = null; + Area a; + GeneralPath gp; + shape_name = "Rounded-corners"; + a = new Area(); + a.add(new Area(new Rectangle2D.Float(50, 0, 100, 150))); + a.add(new Area(new Rectangle2D.Float(0, 50, 200, 50))); + a.add(new Area(new Ellipse2D.Float(0, 0, 100, 100))); + a.add(new Area(new Ellipse2D.Float(0, 50, 100, 100))); + a.add(new Area(new Ellipse2D.Float(100, 0, 100, 100))); + a.add(new Area(new Ellipse2D.Float(100, 50, 100, 100))); + shape = a; + pointsToCheck = new int[][] { + // inside shape + {106, 86}, {96, 38}, {76, 107}, {180, 25}, {24, 105}, + {196, 77}, {165, 50}, {14, 113}, {89, 132}, {167, 117}, + // outside shape + {165, 196}, {191, 163}, {146, 185}, {61, 170}, {148, 171}, + {82, 172}, {186, 11}, {199, 141}, {13, 173}, {187, 3} + }; + + window = new TestFrame(); + window.setUndecorated(true); + window.setSize(200, 200); + window.setLocation(70, 450); + window.setShape(shape); + window.setVisible(true); + + System.out.println("Checking " + window.getClass().getSuperclass().getName() + " with " + shape_name + " shape (" + window.getShape() + ")..."); + } + + class BackgroundFrame extends Frame { + + @Override + public void paint(Graphics g) { + + g.setColor(BACKGROUND_COLOR); + g.fillRect(0, 0, 300, 300); + + super.paint(g); + } + } + + class TestFrame extends Frame { + + @Override + public void paint(Graphics g) { + + g.setColor(Color.WHITE); + g.fillRect(0, 0, 200, 200); + + super.paint(g); + } + } + + public static void main(String[] args) throws Exception { + robot = new Robot(); + + for(int i = 0; i < 100; i++) { + System.out.println("Attempt " + i); + new ShapeNotSetSometimes().doTest(); + } + } + + private void doTest() throws Exception { + Point wls = backgroundFrame.getLocationOnScreen(); + + robot.mouseMove(wls.x + 5, wls.y + 5); + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + robot.delay(10); + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + robot.delay(500); + + EventQueue.invokeAndWait(new Runnable() { + public void run() { + window.requestFocus(); + } + }); + + robot.waitForIdle(); + try { + Thread.sleep(300); + } catch (InterruptedException e) { + // ignore this one + } + + // check transparency + final int COUNT_TARGET = 10; + + // checking outside points only + for(int i = COUNT_TARGET; i < COUNT_TARGET * 2; i++) { + int x = pointsToCheck[i][0]; + int y = pointsToCheck[i][1]; + boolean inside = i < COUNT_TARGET; + Color c = robot.getPixelColor(window.getX() + x, window.getY() + y); + System.out.println("checking " + x + ", " + y + ", color = " + c); + if (inside && BACKGROUND_COLOR.equals(c) || !inside && !BACKGROUND_COLOR.equals(c)) { + System.out.println("window.getX() = " + window.getX() + ", window.getY() = " + window.getY()); + System.err.println("Checking for transparency failed: point: " + + (window.getX() + x) + ", " + (window.getY() + y) + + ", color = " + c + (inside ? " is of un" : " is not of ") + + "expected background color " + BACKGROUND_COLOR); + throw new RuntimeException("Test failed. The shape has not been applied."); + } + } + + EventQueue.invokeAndWait(new Runnable() { + public void run() { + backgroundFrame.dispose(); + window.dispose(); + } + }); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/event/OtherEvents/UngrabID/UngrabID.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,48 @@ +/* + * 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. 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. + */ + +/* + @test + @bug 6960516 + @summary check if the ungrab event has the ID < AWTEvent.RESERVED_ID_MAX + @author Andrei Dmitriev : area=awt.event + @run main UngrabID +*/ + +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; + +public class UngrabID { + public static void main(String[] args){ + Frame f = new Frame("Dummy"); + sun.awt.UngrabEvent event = new sun.awt.UngrabEvent(f); + if (event.getID() > AWTEvent.RESERVED_ID_MAX) { + System.out.println( " Event ID : "+event.getID() + " " + event.toString()); + throw new RuntimeException(" Ungrab Event ID should be less than AWTEvent.RESERVED_ID_MAX ("+AWTEvent.RESERVED_ID_MAX+"). Actual value : "+event.getID() + " Event:" + event.toString()); + } + System.out.println("Test passed. "); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/GroupLayout/6613904/bug6613904.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,65 @@ +/* + * 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 6613904 + * @summary javax.swing.GroupLayout.createParallelGroup(..) doesn't throw IllegalArgumentException for null arg + * @author Pavel Porvatov + */ + +import javax.swing.*; + +public class bug6613904 { + public static void main(String[] args) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + GroupLayout groupLayout = new GroupLayout(new JPanel()); + + try { + groupLayout.createParallelGroup(null); + + throw new RuntimeException("groupLayout.createParallelGroup(null) doesn't throw IAE"); + } catch (IllegalArgumentException e) { + // Ok + } + + try { + groupLayout.createParallelGroup(null, true); + + throw new RuntimeException("groupLayout.createParallelGroup(null, true) doesn't throw IAE"); + } catch (IllegalArgumentException e) { + // Ok + } + + try { + groupLayout.createParallelGroup(null, false); + + throw new RuntimeException("groupLayout.createParallelGroup(null, false) doesn't throw IAE"); + } catch (IllegalArgumentException e) { + // Ok + } + } + }); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JPopupMenu/6987844/bug6987844.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,94 @@ +/* + * 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 6987844 + * @summary Incorrect width of JComboBox drop down + * @author Alexander Potochkin + * @run main bug6987844 + */ + +import sun.awt.SunToolkit; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.InputEvent; + +public class bug6987844 { + static JMenu menu1; + static JMenu menu2; + + public static void main(String... args) throws Exception { + SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); + Robot robot = new Robot(); + robot.setAutoDelay(200); + + SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + JFrame frame = new JFrame(); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JMenuBar bar = new JMenuBar(); + menu1 = new JMenu("Menu1"); + menu1.add(new JMenuItem("item")); + bar.add(menu1); + menu2 = new JMenu("Menu2"); + menu2.add(new JMenuItem("item")); + menu2.add(new JMenuItem("item")); + bar.add(menu2); + + frame.setJMenuBar(bar); + frame.pack(); + + frame.setVisible(true); + } + }); + toolkit.realSync(); + Point point1 = menu1.getLocationOnScreen(); + Point point2 = menu2.getLocationOnScreen(); + + robot.mouseMove(point1.x + 1, point1.y + 1); + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + + robot.mouseMove(point2.x + 1, point2.y + 1); + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + + robot.mouseMove(point1.x + 1, point1.y + 1); + toolkit.realSync(); + + SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + Dimension popupSize1 = menu1.getPopupMenu().getSize(); + Dimension popupSize2 = menu2.getPopupMenu().getSize(); + if (popupSize1.equals(popupSize2)) { + throw new RuntimeException("First popup unexpedetly changed its size"); + } + } + }); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/text/DefaultHighlighter/6771184/bug6771184.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,86 @@ +/* + * 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 6771184 + * @summary Some methods in text package don't throw BadLocationException when expected + * @author Pavel Porvatov + */ + +import javax.swing.*; +import javax.swing.text.BadLocationException; +import javax.swing.text.Highlighter; +import javax.swing.text.JTextComponent; +import java.awt.*; + +public class bug6771184 { + public static void main(String[] args) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + JTextArea textArea = new JTextArea("Tested string"); + + Highlighter highlighter = textArea.getHighlighter(); + Highlighter.HighlightPainter myPainter = new Highlighter.HighlightPainter() { + public void paint(Graphics g, int p0, int p1, Shape bounds, JTextComponent c) { + } + }; + + int negativeTestedData[][] = {{50, 0}, + {-1, 1}, + {-5, -4}, + {Integer.MAX_VALUE, Integer.MIN_VALUE}, + {Integer.MIN_VALUE, Integer.MAX_VALUE}, + {Integer.MIN_VALUE, Integer.MIN_VALUE}}; + + for (int[] data : negativeTestedData) { + try { + highlighter.addHighlight(data[0], data[1], myPainter); + + throw new RuntimeException("Method addHighlight() does not throw BadLocationException for (" + + data[0] + ", " + data[1] + ") "); + } catch (BadLocationException e) { + // Ok + } + + Object objRef; + + try { + objRef = highlighter.addHighlight(0, 1, myPainter); + } catch (BadLocationException e) { + throw new RuntimeException("highlighter.addHighlight(0, 1, myPainter) throws exception", e); + } + + try { + highlighter.changeHighlight(objRef, data[0], data[1]); + + throw new RuntimeException("Method changeHighlight() does not throw BadLocationException for (" + + data[0] + ", " + data[1] + ") "); + } catch (BadLocationException e) { + // Ok + } + } + } + }); + } +}
--- a/jdk/test/sun/java2d/GdiRendering/InsetClipping.java Thu Dec 02 23:44:01 2010 -0800 +++ b/jdk/test/sun/java2d/GdiRendering/InsetClipping.java Sun Dec 05 15:26:16 2010 -0800 @@ -85,6 +85,9 @@ } catch (Exception e) {} } try { + Thread.sleep(2000); + } catch (InterruptedException ex) {} + try { Robot robot = new Robot(); Point clientLoc = clipTest.getLocationOnScreen(); Insets insets = clipTest.getInsets();
--- a/jdk/test/sun/java2d/SunGraphics2D/DrawImageBilinear.java Thu Dec 02 23:44:01 2010 -0800 +++ b/jdk/test/sun/java2d/SunGraphics2D/DrawImageBilinear.java Sun Dec 05 15:26:16 2010 -0800 @@ -56,6 +56,9 @@ private VolatileImage vimg; private static volatile BufferedImage capture; private static void doCapture(Component test) { + try { + Thread.sleep(2000); + } catch (InterruptedException ex) {} // Grab the screen region try { Robot robot = new Robot();
--- a/jdk/test/sun/java2d/SunGraphics2D/SourceClippingBlitTest/SourceClippingBlitTest.java Thu Dec 02 23:44:01 2010 -0800 +++ b/jdk/test/sun/java2d/SunGraphics2D/SourceClippingBlitTest/SourceClippingBlitTest.java Sun Dec 05 15:26:16 2010 -0800 @@ -204,6 +204,9 @@ int w = getWidth(); int h = getHeight(); Toolkit.getDefaultToolkit().sync(); + try { + Thread.sleep(2000); + } catch (InterruptedException ex) {} Point p = getLocationOnScreen(); grabbedBI = robot.createScreenCapture(new Rectangle(p.x, p.y, w, h));
--- a/jdk/test/sun/java2d/X11SurfaceData/SharedMemoryPixmapsTest/SharedMemoryPixmapsTest.java Thu Dec 02 23:44:01 2010 -0800 +++ b/jdk/test/sun/java2d/X11SurfaceData/SharedMemoryPixmapsTest/SharedMemoryPixmapsTest.java Sun Dec 05 15:26:16 2010 -0800 @@ -120,6 +120,9 @@ } private boolean testRendering() throws RuntimeException { + try { + Thread.sleep(2000); + } catch (InterruptedException ex) {} Robot r = null; try { r = new Robot();
--- a/langtools/src/share/classes/com/sun/tools/javac/api/JavacTrees.java Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/api/JavacTrees.java Sun Dec 05 15:26:16 2010 -0800 @@ -49,6 +49,7 @@ import com.sun.tools.javac.code.Symbol.ClassSymbol; import com.sun.tools.javac.code.Symbol.TypeSymbol; import com.sun.tools.javac.code.Symbol; +import com.sun.tools.javac.code.Type; import com.sun.tools.javac.comp.Attr; import com.sun.tools.javac.comp.AttrContext; import com.sun.tools.javac.comp.Enter; @@ -230,7 +231,7 @@ public boolean isAccessible(Scope scope, TypeElement type) { if (scope instanceof JavacScope && type instanceof ClassSymbol) { Env<AttrContext> env = ((JavacScope) scope).env; - return resolve.isAccessible(env, (ClassSymbol)type); + return resolve.isAccessible(env, (ClassSymbol)type, true); } else return false; } @@ -240,7 +241,7 @@ && member instanceof Symbol && type instanceof com.sun.tools.javac.code.Type) { Env<AttrContext> env = ((JavacScope) scope).env; - return resolve.isAccessible(env, (com.sun.tools.javac.code.Type)type, (Symbol)member); + return resolve.isAccessible(env, (com.sun.tools.javac.code.Type)type, (Symbol)member, true); } else return false; }
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java Sun Dec 05 15:26:16 2010 -0800 @@ -247,6 +247,11 @@ */ public static final long OVERRIDE_BRIDGE = 1L<<41; + /** + * Flag that marks an 'effectively final' local variable + */ + public static final long EFFECTIVELY_FINAL = 1L<<42; + /** Modifier masks. */ public static final int
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Lint.java Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Lint.java Sun Dec 05 15:26:16 2010 -0800 @@ -212,9 +212,9 @@ VARARGS("varargs"), /** - * Warn about arm resources + * Warn about issues relating to use of try blocks (i.e. try-with-resources) */ - ARM("arm"); + TRY("try"); LintCategory(String option) { this(option, false);
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Scope.java Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Scope.java Sun Dec 05 15:26:16 2010 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 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 @@ -31,7 +31,8 @@ /** A scope represents an area of visibility in a Java program. The * Scope class is a container for symbols which provides * efficient access to symbols given their names. Scopes are implemented - * as hash tables. Scopes can be nested; the next field of a scope points + * as hash tables with "open addressing" and "double hashing". + * Scopes can be nested; the next field of a scope points * to its next outer scope. Nested scopes can share their hash tables. * * <p><b>This is NOT part of any supported API. @@ -55,7 +56,7 @@ /** A hash table for the scope's entries. */ - public Entry[] table; + Entry[] table; /** Mask for hash codes, always equal to (table.length - 1). */ @@ -67,8 +68,9 @@ public Entry elems; /** The number of elements in this scope. + * This includes deleted elements, whose value is the sentinel. */ - public int nelems = 0; + int nelems = 0; /** A timestamp - useful to quickly check whether a scope has changed or not */ @@ -109,7 +111,8 @@ } } - /** Every hash bucket is a list of Entry's which ends in sentinel. + /** Use as a "not-found" result for lookup. + * Also used to mark deleted entries in the table. */ private static final Entry sentinel = new Entry(null, null, null, null); @@ -130,12 +133,15 @@ this.owner = owner; this.table = table; this.hashMask = table.length - 1; - this.elems = null; - this.nelems = 0; - this.shared = 0; this.scopeCounter = scopeCounter; } + /** Convenience constructor used for dup and dupUnshared. */ + private Scope(Scope next, Symbol owner, Entry[] table) { + this(next, owner, table, next.scopeCounter); + this.nelems = next.nelems; + } + /** Construct a new scope, within scope next, with given owner, * using a fresh table of length INITIAL_SIZE. */ @@ -145,7 +151,6 @@ protected Scope(Symbol owner, ScopeCounter scopeCounter) { this(null, owner, new Entry[INITIAL_SIZE], scopeCounter); - for (int i = 0; i < INITIAL_SIZE; i++) table[i] = sentinel; } /** Construct a fresh scope within this scope, with same owner, @@ -154,11 +159,7 @@ * of fresh tables. */ public Scope dup() { - Scope result = new Scope(this, this.owner, this.table, scopeCounter); - shared++; - // System.out.println("====> duping scope " + this.hashCode() + " owned by " + this.owner + " to " + result.hashCode()); - // new Error().printStackTrace(System.out); - return result; + return dup(this.owner); } /** Construct a fresh scope within this scope, with new owner, @@ -167,7 +168,7 @@ * of fresh tables. */ public Scope dup(Symbol newOwner) { - Scope result = new Scope(this, newOwner, this.table, scopeCounter); + Scope result = new Scope(this, newOwner, this.table); shared++; // System.out.println("====> duping scope " + this.hashCode() + " owned by " + newOwner + " to " + result.hashCode()); // new Error().printStackTrace(System.out); @@ -179,7 +180,7 @@ * the table of its outer scope. */ public Scope dupUnshared() { - return new Scope(this, this.owner, this.table.clone(), scopeCounter); + return new Scope(this, this.owner, this.table.clone()); } /** Remove all entries of this scope from its table, if shared @@ -189,7 +190,7 @@ assert shared == 0; if (table != next.table) return next; while (elems != null) { - int hash = elems.sym.name.hashCode() & hashMask; + int hash = getIndex(elems.sym.name); Entry e = table[hash]; assert e == elems : elems.sym; table[hash] = elems.shadowed; @@ -197,6 +198,7 @@ } assert next.shared > 0; next.shared--; + next.nelems = nelems; // System.out.println("====> leaving scope " + this.hashCode() + " owned by " + this.owner + " to " + next.hashCode()); // new Error().printStackTrace(System.out); return next; @@ -215,19 +217,17 @@ s.hashMask = newtable.length - 1; } } - for (int i = 0; i < newtable.length; i++) newtable[i] = sentinel; - for (int i = 0; i < oldtable.length; i++) copy(oldtable[i]); - } - - /** Copy the given entry and all entries shadowed by it to table - */ - private void copy(Entry e) { - if (e.sym != null) { - copy(e.shadowed); - int hash = e.sym.name.hashCode() & hashMask; - e.shadowed = table[hash]; - table[hash] = e; + int n = 0; + for (int i = oldtable.length; --i >= 0; ) { + Entry e = oldtable[i]; + if (e != null && e != sentinel && ! e.isBogus()) { + table[getIndex(e.sym.name)] = e; + n++; + } } + // We don't need to update nelems for shared inherited scopes, + // since that gets handled by leave(). + nelems = n; } /** Enter symbol sym in this scope. @@ -248,13 +248,17 @@ */ public void enter(Symbol sym, Scope s, Scope origin) { assert shared == 0; - // Temporarily disabled (bug 6460352): - // if (nelems * 3 >= hashMask * 2) dble(); - int hash = sym.name.hashCode() & hashMask; - Entry e = makeEntry(sym, table[hash], elems, s, origin); + if (nelems * 3 >= hashMask * 2) + dble(); + int hash = getIndex(sym.name); + Entry old = table[hash]; + if (old == null) { + old = sentinel; + nelems++; + } + Entry e = makeEntry(sym, old, elems, s, origin); table[hash] = e; elems = e; - nelems++; scopeCounter.inc(); } @@ -268,15 +272,15 @@ public void remove(Symbol sym) { assert shared == 0; Entry e = lookup(sym.name); - while (e.scope == this && e.sym != sym) e = e.next(); if (e.scope == null) return; scopeCounter.inc(); // remove e from table and shadowed list; - Entry te = table[sym.name.hashCode() & hashMask]; + int i = getIndex(sym.name); + Entry te = table[i]; if (te == e) - table[sym.name.hashCode() & hashMask] = e.shadowed; + table[i] = e.shadowed; else while (true) { if (te.shadowed == e) { te.shadowed = e.shadowed; @@ -335,12 +339,50 @@ return lookup(name, noFilter); } public Entry lookup(Name name, Filter<Symbol> sf) { - Entry e = table[name.hashCode() & hashMask]; + Entry e = table[getIndex(name)]; + if (e == null || e == sentinel) + return sentinel; while (e.scope != null && (e.sym.name != name || !sf.accepts(e.sym))) e = e.shadowed; return e; } + /*void dump (java.io.PrintStream out) { + out.println(this); + for (int l=0; l < table.length; l++) { + Entry le = table[l]; + out.print("#"+l+": "); + if (le==sentinel) out.println("sentinel"); + else if(le == null) out.println("null"); + else out.println(""+le+" s:"+le.sym); + } + }*/ + + /** Look for slot in the table. + * We use open addressing with double hashing. + */ + int getIndex (Name name) { + int h = name.hashCode(); + int i = h & hashMask; + // The expression below is always odd, so it is guaranteed + // be be mutually prime with table.length, a power of 2. + int x = hashMask - ((h + (h >> 16)) << 1); + int d = -1; // Index of a deleted item. + for (;;) { + Entry e = table[i]; + if (e == null) + return d >= 0 ? d : i; + if (e == sentinel) { + // We have to keep searching even if we see a deleted item. + // However, remember the index in case we fail to find the name. + if (d < 0) + d = i; + } else if (e.sym.name == name) + return i; + i = (i + x) & hashMask; + } + } + public Iterable<Symbol> getElements() { return getElements(noFilter); } @@ -441,10 +483,7 @@ * outwards if not found in this scope. */ public Entry next() { - Entry e = shadowed; - while (e.scope != null && e.sym.name != sym.name) - e = e.shadowed; - return e; + return shadowed; } public Scope getOrigin() { @@ -456,6 +495,8 @@ // in many cases. return scope; } + + protected boolean isBogus () { return false; } } public static class ImportScope extends Scope { @@ -470,22 +511,10 @@ } public Entry lookup(Name name) { - Entry e = table[name.hashCode() & hashMask]; - while (e.scope != null && - (e.sym.name != name || - /* Since an inner class will show up in package and - * import scopes until its inner class attribute has - * been processed, we have to weed it out here. This - * is done by comparing the owners of the entry's - * scope and symbol fields. The scope field's owner - * points to where the class originally was imported - * from. The symbol field's owner points to where the - * class is situated now. This can change when an - * inner class is read (see ClassReader.enterClass). - * By comparing the two fields we make sure that we do - * not accidentally import an inner class that started - * life as a flat class in a package. */ - e.sym.owner != e.scope.owner)) + Entry e = table[getIndex(name)]; + if (e == null) + return sentinel; + while (e.isBogus()) e = e.shadowed; return e; } @@ -499,15 +528,33 @@ } public Entry next() { Entry e = super.shadowed; - while (e.scope != null && - (e.sym.name != sym.name || - e.sym.owner != e.scope.owner)) // see lookup() + while (isBogus()) e = e.shadowed; return e; } @Override public Scope getOrigin() { return origin; } + + /** + * Is this a bogus inner-class import? + * An inner class {@code Outer$Inner.class} read from a class file + * starts out in a package scope under the name {@code Outer$Inner}, + * which (if star-imported) gets copied to the import scope. + * When the InnerClasses attribute is processed, the ClassSymbol + * is renamed in place (to {@code Inner}), and the owner changed + * to the {@code Outer} class. The ImportScope still has the old + * Entry that was created and hashed as {@code "Outer$Inner"}, + * but whose name was changed to {@code "Inner"}. This violates + * the invariants for the Scope hash table, and so is pretty bogus. + * When the symbol was renamed, it should have been removed from + * the import scope (and not just the package scope); however, + * doing so is difficult. A better fix would be to change + * import scopes to indirectly reference package symbols, rather + * than copy from them. + * Until then, we detect and skip the bogus entries using this test. + */ + protected boolean isBogus () { return sym.owner != scope.owner; } } }
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java Sun Dec 05 15:26:16 2010 -0800 @@ -3151,7 +3151,7 @@ return to.isParameterized() && (!(isUnbounded(to) || isSubtype(from, to) || - ((subFrom != null) && isSameType(subFrom, to)))); + ((subFrom != null) && containsType(to.allparams(), subFrom.allparams())))); } private List<Type> superClosure(Type t, Type s) {
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Sun Dec 05 15:26:16 2010 -0800 @@ -252,10 +252,12 @@ (base.getTag() == JCTree.IDENT && TreeInfo.name(base) == names._this)) && isAssignableAsBlankFinal(v, env)))) { if (v.isResourceVariable()) { //TWR resource - log.error(pos, "twr.resource.may.not.be.assigned", v); + log.error(pos, "try.resource.may.not.be.assigned", v); } else { log.error(pos, "cant.assign.val.to.final.var", v); } + } else if ((v.flags() & EFFECTIVELY_FINAL) != 0) { + v.flags_field &= ~EFFECTIVELY_FINAL; } } @@ -799,6 +801,7 @@ memberEnter.memberEnter(tree, env); annotate.flush(); } + tree.sym.flags_field |= EFFECTIVELY_FINAL; } VarSymbol v = tree.sym; @@ -1042,11 +1045,11 @@ for (JCTree resource : tree.resources) { if (resource.getTag() == JCTree.VARDEF) { attribStat(resource, tryEnv); - chk.checkType(resource, resource.type, syms.autoCloseableType, "twr.not.applicable.to.type"); + chk.checkType(resource, resource.type, syms.autoCloseableType, "try.not.applicable.to.type"); VarSymbol var = (VarSymbol)TreeInfo.symbolFor(resource); var.setData(ElementKind.RESOURCE_VARIABLE); } else { - attribExpr(resource, tryEnv, syms.autoCloseableType, "twr.not.applicable.to.type"); + attribExpr(resource, tryEnv, syms.autoCloseableType, "try.not.applicable.to.type"); } } // Attribute body @@ -1061,11 +1064,8 @@ localEnv.dup(c, localEnv.info.dup(localEnv.info.scope.dup())); Type ctype = attribStat(c.param, catchEnv); if (TreeInfo.isMultiCatch(c)) { - //check that multi-catch parameter is marked as final - if ((c.param.sym.flags() & FINAL) == 0) { - log.error(c.param.pos(), "multicatch.param.must.be.final", c.param.sym); - } - c.param.sym.flags_field = c.param.sym.flags() | DISJUNCTION; + //multi-catch parameter is implicitly marked as final + c.param.sym.flags_field |= FINAL | DISJUNCTION; } if (c.param.sym.kind == Kinds.VAR) { c.param.sym.setData(ElementKind.EXCEPTION_PARAMETER); @@ -1552,7 +1552,7 @@ // Attribute clazz expression and store // symbol + type back into the attributed tree. Type clazztype = attribType(clazz, env); - Pair<Scope,Scope> mapping = getSyntheticScopeMapping(clazztype); + Pair<Scope,Scope> mapping = getSyntheticScopeMapping(clazztype, cdef != null); if (!TreeInfo.isDiamond(tree)) { clazztype = chk.checkClassType( tree.clazz.pos(), clazztype, true); @@ -1849,7 +1849,7 @@ * inference. The inferred return type of the synthetic constructor IS * the inferred type for the diamond operator. */ - private Pair<Scope, Scope> getSyntheticScopeMapping(Type ctype) { + private Pair<Scope, Scope> getSyntheticScopeMapping(Type ctype, boolean overrideProtectedAccess) { if (ctype.tag != CLASS) { return erroneousMapping; } @@ -1860,6 +1860,12 @@ e.scope != null; e = e.next()) { MethodSymbol newConstr = (MethodSymbol) e.sym.clone(ctype.tsym); + if (overrideProtectedAccess && (newConstr.flags() & PROTECTED) != 0) { + //make protected constructor public (this is required for + //anonymous inner class creation expressions using diamond) + newConstr.flags_field |= PUBLIC; + newConstr.flags_field &= ~PROTECTED; + } newConstr.name = names.init; List<Type> oldTypeargs = List.nil(); if (newConstr.type.tag == FORALL) { @@ -2252,8 +2258,8 @@ ((VarSymbol)sitesym).isResourceVariable() && sym.kind == MTH && sym.overrides(syms.autoCloseableClose, sitesym.type.tsym, types, true) && - env.info.lint.isEnabled(Lint.LintCategory.ARM)) { - log.warning(tree, "twr.explicit.close.call"); + env.info.lint.isEnabled(Lint.LintCategory.TRY)) { + log.warning(Lint.LintCategory.TRY, tree, "try.explicit.close.call"); } // Disallow selecting a type from an expression
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java Sun Dec 05 15:26:16 2010 -0800 @@ -1510,14 +1510,7 @@ Type t1, Type t2, Type site) { - Symbol sym = firstIncompatibility(t1, t2, site); - if (sym != null) { - log.error(pos, "types.incompatible.diff.ret", - t1, t2, sym.name + - "(" + types.memberType(t2, sym).getParameterTypes() + ")"); - return false; - } - return true; + return firstIncompatibility(pos, t1, t2, site) == null; } /** Return the first method which is defined with same args @@ -1528,7 +1521,7 @@ * @param site The most derived type. * @returns symbol from t2 that conflicts with one in t1. */ - private Symbol firstIncompatibility(Type t1, Type t2, Type site) { + private Symbol firstIncompatibility(DiagnosticPosition pos, Type t1, Type t2, Type site) { Map<TypeSymbol,Type> interfaces1 = new HashMap<TypeSymbol,Type>(); closure(t1, interfaces1); Map<TypeSymbol,Type> interfaces2; @@ -1539,7 +1532,7 @@ for (Type t3 : interfaces1.values()) { for (Type t4 : interfaces2.values()) { - Symbol s = firstDirectIncompatibility(t3, t4, site); + Symbol s = firstDirectIncompatibility(pos, t3, t4, site); if (s != null) return s; } } @@ -1568,7 +1561,7 @@ } /** Return the first method in t2 that conflicts with a method from t1. */ - private Symbol firstDirectIncompatibility(Type t1, Type t2, Type site) { + private Symbol firstDirectIncompatibility(DiagnosticPosition pos, Type t1, Type t2, Type site) { for (Scope.Entry e1 = t1.tsym.members().elems; e1 != null; e1 = e1.sibling) { Symbol s1 = e1.sym; Type st1 = null; @@ -1592,7 +1585,18 @@ (types.covariantReturnType(rt1, rt2, Warner.noWarnings) || types.covariantReturnType(rt2, rt1, Warner.noWarnings)) || checkCommonOverriderIn(s1,s2,site); - if (!compat) return s2; + if (!compat) { + log.error(pos, "types.incompatible.diff.ret", + t1, t2, s2.name + + "(" + types.memberType(t2, s2).getParameterTypes() + ")"); + return s2; + } + } else if (!checkNameClash((ClassSymbol)site.tsym, s1, s2)) { + log.error(pos, + "name.clash.same.erasure.no.override", + s1, s1.location(), + s2, s2.location()); + return s2; } } } @@ -1644,32 +1648,52 @@ log.error(tree.pos(), "enum.no.finalize"); return; } - for (Type t = types.supertype(origin.type); t.tag == CLASS; + for (Type t = origin.type; t.tag == CLASS; t = types.supertype(t)) { - TypeSymbol c = t.tsym; - Scope.Entry e = c.members().lookup(m.name); - while (e.scope != null) { - if (m.overrides(e.sym, origin, types, false)) - checkOverride(tree, m, (MethodSymbol)e.sym, origin); - else if (e.sym.kind == MTH && - e.sym.isInheritedIn(origin, types) && - (e.sym.flags() & SYNTHETIC) == 0 && - !m.isConstructor()) { - Type er1 = m.erasure(types); - Type er2 = e.sym.erasure(types); - if (types.isSameTypes(er1.getParameterTypes(), - er2.getParameterTypes())) { - log.error(TreeInfo.diagnosticPositionFor(m, tree), - "name.clash.same.erasure.no.override", - m, m.location(), - e.sym, e.sym.location()); - } - } - e = e.next(); + if (t != origin.type) { + checkOverride(tree, t, origin, m); + } + for (Type t2 : types.interfaces(t)) { + checkOverride(tree, t2, origin, m); } } } + void checkOverride(JCTree tree, Type site, ClassSymbol origin, MethodSymbol m) { + TypeSymbol c = site.tsym; + Scope.Entry e = c.members().lookup(m.name); + while (e.scope != null) { + if (m.overrides(e.sym, origin, types, false)) { + if ((e.sym.flags() & ABSTRACT) == 0) { + checkOverride(tree, m, (MethodSymbol)e.sym, origin); + } + } + else if (!checkNameClash(origin, e.sym, m)) { + log.error(tree, + "name.clash.same.erasure.no.override", + m, m.location(), + e.sym, e.sym.location()); + } + e = e.next(); + } + } + + private boolean checkNameClash(ClassSymbol origin, Symbol s1, Symbol s2) { + if (s1.kind == MTH && + s1.isInheritedIn(origin, types) && + (s1.flags() & SYNTHETIC) == 0 && + !s2.isConstructor()) { + Type er1 = s2.erasure(types); + Type er2 = s1.erasure(types); + if (types.isSameTypes(er1.getParameterTypes(), + er2.getParameterTypes())) { + return false; + } + } + return true; + } + + /** Check that all abstract members of given class have definitions. * @param pos Position to be used for error reporting. * @param c The class.
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java Sun Dec 05 15:26:16 2010 -0800 @@ -226,7 +226,7 @@ */ Bits uninits; - HashMap<Symbol, List<Type>> multicatchTypes; + HashMap<Symbol, List<Type>> preciseRethrowTypes; /** The set of variables that are definitely unassigned everywhere * in current try block. This variable is maintained lazily; it is @@ -332,7 +332,7 @@ if (!chk.isUnchecked(tree.pos(), exc)) { if (!chk.isHandled(exc, caught)) pendingExits.append(new PendingExit(tree, exc)); - thrown = chk.incl(exc, thrown); + thrown = chk.incl(exc, thrown); } } @@ -1037,10 +1037,10 @@ int nextadrCatch = nextadr; if (!unrefdResources.isEmpty() && - lint.isEnabled(Lint.LintCategory.ARM)) { + lint.isEnabled(Lint.LintCategory.TRY)) { for (Map.Entry<VarSymbol, JCVariableDecl> e : unrefdResources.entrySet()) { - log.warning(e.getValue().pos(), - "automatic.resource.not.referenced", e.getKey()); + log.warning(Lint.LintCategory.TRY, e.getValue().pos(), + "try.resource.not.referenced", e.getKey()); } } @@ -1077,12 +1077,12 @@ scan(param); inits.incl(param.sym.adr); uninits.excl(param.sym.adr); - multicatchTypes.put(param.sym, chk.intersect(ctypes, rethrownTypes)); + preciseRethrowTypes.put(param.sym, chk.intersect(ctypes, rethrownTypes)); scanStat(l.head.body); initsEnd.andSet(inits); uninitsEnd.andSet(uninits); nextadr = nextadrCatch; - multicatchTypes.remove(param.sym); + preciseRethrowTypes.remove(param.sym); aliveEnd |= alive; } if (tree.finalizer != null) { @@ -1215,10 +1215,10 @@ Symbol sym = TreeInfo.symbol(tree.expr); if (sym != null && sym.kind == VAR && - (sym.flags() & FINAL) != 0 && - multicatchTypes.get(sym) != null && + (sym.flags() & (FINAL | EFFECTIVELY_FINAL)) != 0 && + preciseRethrowTypes.get(sym) != null && allowRethrowAnalysis) { - for (Type t : multicatchTypes.get(sym)) { + for (Type t : preciseRethrowTypes.get(sym)) { markThrown(tree, t); } } @@ -1371,11 +1371,24 @@ if (!tree.type.isErroneous() && lint.isEnabled(Lint.LintCategory.CAST) && types.isSameType(tree.expr.type, tree.clazz.type) - && !(ignoreAnnotatedCasts && containsTypeAnnotation(tree.clazz))) { + && !(ignoreAnnotatedCasts && containsTypeAnnotation(tree.clazz)) + && !is292targetTypeCast(tree)) { log.warning(Lint.LintCategory.CAST, tree.pos(), "redundant.cast", tree.expr.type); } } + //where + private boolean is292targetTypeCast(JCTypeCast tree) { + boolean is292targetTypeCast = false; + if (tree.expr.getTag() == JCTree.APPLY) { + JCMethodInvocation apply = (JCMethodInvocation)tree.expr; + Symbol sym = TreeInfo.symbol(apply.meth); + is292targetTypeCast = sym != null && + sym.kind == MTH && + (sym.flags() & POLYMORPHIC_SIGNATURE) != 0; + } + return is292targetTypeCast; + } public void visitTopLevel(JCCompilationUnit tree) { // Do nothing for TopLevel since each class is visited individually @@ -1422,7 +1435,7 @@ firstadr = 0; nextadr = 0; pendingExits = new ListBuffer<PendingExit>(); - multicatchTypes = new HashMap<Symbol, List<Type>>(); + preciseRethrowTypes = new HashMap<Symbol, List<Type>>(); alive = true; this.thrown = this.caught = null; this.classDef = null;
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java Sun Dec 05 15:26:16 2010 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 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 @@ -1509,17 +1509,17 @@ } private JCBlock makeArmFinallyClause(Symbol primaryException, JCExpression resource) { - // primaryException.addSuppressedException(catchException); + // primaryException.addSuppressed(catchException); VarSymbol catchException = new VarSymbol(0, make.paramName(2), syms.throwableType, currentMethodSym); JCStatement addSuppressionStatement = make.Exec(makeCall(make.Ident(primaryException), - names.fromString("addSuppressedException"), + names.addSuppressed, List.<JCExpression>of(make.Ident(catchException)))); - // try { resource.close(); } catch (e) { primaryException.addSuppressedException(e); } + // try { resource.close(); } catch (e) { primaryException.addSuppressed(e); } JCBlock tryBlock = make.Block(0L, List.<JCStatement>of(makeResourceCloseInvocation(resource))); JCVariableDecl catchExceptionDecl = make.VarDef(catchException, null);
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java Sun Dec 05 15:26:16 2010 -0800 @@ -159,33 +159,45 @@ * @param c The class whose accessibility is checked. */ public boolean isAccessible(Env<AttrContext> env, TypeSymbol c) { + return isAccessible(env, c, false); + } + + public boolean isAccessible(Env<AttrContext> env, TypeSymbol c, boolean checkInner) { + boolean isAccessible = false; switch ((short)(c.flags() & AccessFlags)) { - case PRIVATE: - return - env.enclClass.sym.outermostClass() == - c.owner.outermostClass(); - case 0: - return - env.toplevel.packge == c.owner // fast special case - || - env.toplevel.packge == c.packge() - || - // Hack: this case is added since synthesized default constructors - // of anonymous classes should be allowed to access - // classes which would be inaccessible otherwise. - env.enclMethod != null && - (env.enclMethod.mods.flags & ANONCONSTR) != 0; - default: // error recovery - case PUBLIC: - return true; - case PROTECTED: - return - env.toplevel.packge == c.owner // fast special case - || - env.toplevel.packge == c.packge() - || - isInnerSubClass(env.enclClass.sym, c.owner); + case PRIVATE: + isAccessible = + env.enclClass.sym.outermostClass() == + c.owner.outermostClass(); + break; + case 0: + isAccessible = + env.toplevel.packge == c.owner // fast special case + || + env.toplevel.packge == c.packge() + || + // Hack: this case is added since synthesized default constructors + // of anonymous classes should be allowed to access + // classes which would be inaccessible otherwise. + env.enclMethod != null && + (env.enclMethod.mods.flags & ANONCONSTR) != 0; + break; + default: // error recovery + case PUBLIC: + isAccessible = true; + break; + case PROTECTED: + isAccessible = + env.toplevel.packge == c.owner // fast special case + || + env.toplevel.packge == c.packge() + || + isInnerSubClass(env.enclClass.sym, c.owner); + break; } + return (checkInner == false || c.type.getEnclosingType() == Type.noType) ? + isAccessible : + isAccessible & isAccessible(env, c.type.getEnclosingType(), checkInner); } //where /** Is given class a subclass of given base class, or an inner class @@ -202,9 +214,13 @@ } boolean isAccessible(Env<AttrContext> env, Type t) { + return isAccessible(env, t, false); + } + + boolean isAccessible(Env<AttrContext> env, Type t, boolean checkInner) { return (t.tag == ARRAY) ? isAccessible(env, types.elemtype(t)) - : isAccessible(env, t.tsym); + : isAccessible(env, t.tsym, checkInner); } /** Is symbol accessible as a member of given type in given evironment? @@ -214,6 +230,9 @@ * @param sym The symbol. */ public boolean isAccessible(Env<AttrContext> env, Type site, Symbol sym) { + return isAccessible(env, site, sym, false); + } + public boolean isAccessible(Env<AttrContext> env, Type site, Symbol sym, boolean checkInner) { if (sym.name == names.init && sym.owner != site.tsym) return false; ClassSymbol sub; switch ((short)(sym.flags() & AccessFlags)) { @@ -231,7 +250,7 @@ || env.toplevel.packge == sym.packge()) && - isAccessible(env, site) + isAccessible(env, site, checkInner) && sym.isInheritedIn(site.tsym, types) && @@ -248,11 +267,11 @@ // (but type names should be disallowed elsewhere!) env.info.selectSuper && (sym.flags() & STATIC) == 0 && sym.kind != TYP) && - isAccessible(env, site) + isAccessible(env, site, checkInner) && notOverriddenIn(site, sym); default: // this case includes erroneous combinations as well - return isAccessible(env, site) && notOverriddenIn(site, sym); + return isAccessible(env, site, checkInner) && notOverriddenIn(site, sym); } } //where
--- a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java Sun Dec 05 15:26:16 2010 -0800 @@ -993,7 +993,9 @@ /** Enter an inner class into the `innerClasses' set/queue. */ void enterInner(ClassSymbol c) { - assert !c.type.isCompound(); + if (c.type.isCompound()) { + throw new AssertionError("Unexpected intersection type: " + c.type); + } try { c.complete(); } catch (CompletionFailure ex) {
--- a/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java Sun Dec 05 15:26:16 2010 -0800 @@ -1304,7 +1304,7 @@ stackCount = 0; for (int i=0; i<state.stacksize; i++) { if (state.stack[i] != null) { - frame.stack[stackCount++] = state.stack[i]; + frame.stack[stackCount++] = types.erasure(state.stack[i]); } }
--- a/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java Sun Dec 05 15:26:16 2010 -0800 @@ -1712,7 +1712,7 @@ S.nextToken(); List<JCTree> resources = List.<JCTree>nil(); if (S.token() == LPAREN) { - checkAutomaticResourceManagement(); + checkTryWithResources(); S.nextToken(); resources = resources(); accept(RPAREN); @@ -2970,9 +2970,9 @@ allowMulticatch = true; } } - void checkAutomaticResourceManagement() { + void checkTryWithResources() { if (!allowTWR) { - error(S.pos(), "automatic.resource.management.not.supported.in.source", source.name); + error(S.pos(), "try.with.resources.not.supported.in.source", source.name); allowTWR = true; } }
--- a/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties Sun Dec 05 15:26:16 2010 -0800 @@ -63,8 +63,6 @@ anonymous class implements interface; cannot have type arguments compiler.err.anon.class.impl.intf.no.qual.for.new=\ anonymous class implements interface; cannot have qualifier for new -compiler.misc.twr.not.applicable.to.type=\ - automatic resource management not applicable to variable type compiler.err.array.and.varargs=\ cannot declare both {0} and {1} in {2} compiler.err.array.dimension.missing=\ @@ -183,12 +181,10 @@ compiler.err.final.parameter.may.not.be.assigned=\ final parameter {0} may not be assigned -compiler.err.twr.resource.may.not.be.assigned=\ - automatic resource {0} may not be assigned +compiler.err.try.resource.may.not.be.assigned=\ + auto-closeable resource {0} may not be assigned compiler.err.multicatch.parameter.may.not.be.assigned=\ multi-catch parameter {0} may not be assigned -compiler.err.multicatch.param.must.be.final=\ - multi-catch parameter {0} must be final compiler.err.finally.without.try=\ ''finally'' without ''try'' compiler.err.foreach.not.applicable.to.type=\ @@ -825,10 +821,10 @@ compiler.warn.proc.unmatched.processor.options=\ The following options were not recognized by any processor: ''{0}'' -compiler.warn.twr.explicit.close.call=\ - [arm] explicit call to close() on an automatic resource -compiler.warn.automatic.resource.not.referenced=\ - [arm] automatic resource {0} is never referenced in body of corresponding try statement +compiler.warn.try.explicit.close.call=\ + explicit call to close() on an auto-closeable resource +compiler.warn.try.resource.not.referenced=\ + auto-closeable resource {0} is never referenced in body of corresponding try statement compiler.warn.unchecked.assign=\ unchecked assignment: {0} to {1} compiler.warn.unchecked.assign.to.var=\ @@ -1052,6 +1048,9 @@ # compiler.err.no.elem.type=\ # \[\*\] cannot have a type +compiler.misc.try.not.applicable.to.type=\ + try-with-resources not applicable to variable type + ##### compiler.err.type.found.req=\ @@ -1274,9 +1273,9 @@ exotic identifiers #"___" are not supported in -source {0}\n\ (use -source 7 or higher to enable exotic identifiers) -compiler.err.automatic.resource.management.not.supported.in.source=\ - automatic resource management is not supported in -source {0}\n\ -(use -source 7 or higher to enable automatic resource management) +compiler.err.try.with.resources.not.supported.in.source=\ + try-with-resources is not supported in -source {0}\n\ +(use -source 7 or higher to enable try-with-resources) compiler.warn.enum.as.identifier=\ as of release 5, ''enum'' is a keyword, and may not be used as an identifier\n\
--- a/langtools/src/share/classes/com/sun/tools/javac/util/Names.java Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/util/Names.java Sun Dec 05 15:26:16 2010 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 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 @@ -150,6 +150,7 @@ public final Name finalize; public final Name java_lang_AutoCloseable; public final Name close; + public final Name addSuppressed; public final Name.Table table; @@ -268,6 +269,7 @@ java_lang_AutoCloseable = fromString("java.lang.AutoCloseable"); close = fromString("close"); + addSuppressed = fromString("addSuppressed"); } protected Name.Table createTable(Options options) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/6996626/Main.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,45 @@ +/* + * 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 6996626 + * @summary Scope fix issues for ImportScope + * @compile pack1/Symbol.java + * @compile Main.java + */ + +import pack1.*; +import pack1.Symbol.*; + +// The following imports are just to trigger re-hashing (in +// com.sun.tools.javac.code.Scope.dble()) of the star-import scope. +import java.io.*; +import java.net.*; +import java.util.*; + +public class Main { + public void main (String[] args) { + throw new CompletionFailure(); + } +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/6996626/pack1/Symbol.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,31 @@ +/* + * 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. + */ + +package pack1; + +public class Symbol { + public static class CompletionFailure extends RuntimeException { } +} + + +
--- a/langtools/test/tools/javac/TryWithResources/ArmLint.java Thu Dec 02 23:44:01 2010 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -/* - * @test /nodynamiccopyright/ - * @bug 6911256 6964740 6965277 6967065 - * @author Joseph D. Darcy - * @summary Check that -Xlint:arm warnings are generated as expected - * @compile/ref=ArmLint.out -Xlint:arm,deprecation -XDrawDiagnostics ArmLint.java - */ - -class ArmLint implements AutoCloseable { - private static void test1() { - try(ArmLint r1 = new ArmLint(); - ArmLint r2 = new ArmLint(); - ArmLint r3 = new ArmLint()) { - r1.close(); // The resource's close - r2.close(42); // *Not* the resource's close - // r3 not referenced - } - - } - - @SuppressWarnings("arm") - private static void test2() { - try(@SuppressWarnings("deprecation") AutoCloseable r4 = - new DeprecatedAutoCloseable()) { - // r4 not referenced - } catch(Exception e) { - ; - } - } - - /** - * The AutoCloseable method of a resource. - */ - @Override - public void close () { - return; - } - - /** - * <em>Not</em> the AutoCloseable method of a resource. - */ - public void close (int arg) { - return; - } -} - -@Deprecated -class DeprecatedAutoCloseable implements AutoCloseable { - public DeprecatedAutoCloseable(){super();} - - @Override - public void close () { - return; - } -}
--- a/langtools/test/tools/javac/TryWithResources/ArmLint.out Thu Dec 02 23:44:01 2010 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -ArmLint.java:14:15: compiler.warn.twr.explicit.close.call -ArmLint.java:13:13: compiler.warn.automatic.resource.not.referenced: r3 -2 warnings
--- a/langtools/test/tools/javac/TryWithResources/ImplicitFinal.out Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/test/tools/javac/TryWithResources/ImplicitFinal.out Sun Dec 05 15:26:16 2010 -0800 @@ -1,2 +1,2 @@ -ImplicitFinal.java:14:13: compiler.err.twr.resource.may.not.be.assigned: r +ImplicitFinal.java:14:13: compiler.err.try.resource.may.not.be.assigned: r 1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/TryWithResources/TwrLint.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,55 @@ +/* + * @test /nodynamiccopyright/ + * @bug 6911256 6964740 6965277 6967065 + * @author Joseph D. Darcy + * @summary Check that -Xlint:twr warnings are generated as expected + * @compile/ref=TwrLint.out -Xlint:try,deprecation -XDrawDiagnostics TwrLint.java + */ + +class TwrLint implements AutoCloseable { + private static void test1() { + try(TwrLint r1 = new TwrLint(); + TwrLint r2 = new TwrLint(); + TwrLint r3 = new TwrLint()) { + r1.close(); // The resource's close + r2.close(42); // *Not* the resource's close + // r3 not referenced + } + + } + + @SuppressWarnings("try") + private static void test2() { + try(@SuppressWarnings("deprecation") AutoCloseable r4 = + new DeprecatedAutoCloseable()) { + // r4 not referenced - but no warning is generated because of @SuppressWarnings + } catch(Exception e) { + ; + } + } + + /** + * The AutoCloseable method of a resource. + */ + @Override + public void close () { + return; + } + + /** + * <em>Not</em> the AutoCloseable method of a resource. + */ + public void close (int arg) { + return; + } +} + +@Deprecated +class DeprecatedAutoCloseable implements AutoCloseable { + public DeprecatedAutoCloseable(){super();} + + @Override + public void close () { + return; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/TryWithResources/TwrLint.out Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,3 @@ +TwrLint.java:14:15: compiler.warn.try.explicit.close.call +TwrLint.java:13:13: compiler.warn.try.resource.not.referenced: r3 +2 warnings
--- a/langtools/test/tools/javac/TryWithResources/TwrOnNonResource.out Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/test/tools/javac/TryWithResources/TwrOnNonResource.out Sun Dec 05 15:26:16 2010 -0800 @@ -1,7 +1,7 @@ -TwrOnNonResource.java:12:13: compiler.err.prob.found.req: (compiler.misc.twr.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable -TwrOnNonResource.java:15:13: compiler.err.prob.found.req: (compiler.misc.twr.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable -TwrOnNonResource.java:18:13: compiler.err.prob.found.req: (compiler.misc.twr.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable -TwrOnNonResource.java:24:13: compiler.err.prob.found.req: (compiler.misc.twr.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable -TwrOnNonResource.java:27:13: compiler.err.prob.found.req: (compiler.misc.twr.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable -TwrOnNonResource.java:30:13: compiler.err.prob.found.req: (compiler.misc.twr.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable +TwrOnNonResource.java:12:13: compiler.err.prob.found.req: (compiler.misc.try.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable +TwrOnNonResource.java:15:13: compiler.err.prob.found.req: (compiler.misc.try.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable +TwrOnNonResource.java:18:13: compiler.err.prob.found.req: (compiler.misc.try.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable +TwrOnNonResource.java:24:13: compiler.err.prob.found.req: (compiler.misc.try.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable +TwrOnNonResource.java:27:13: compiler.err.prob.found.req: (compiler.misc.try.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable +TwrOnNonResource.java:30:13: compiler.err.prob.found.req: (compiler.misc.try.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable 6 errors
--- a/langtools/test/tools/javac/TryWithResources/TwrSuppression.java Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/test/tools/javac/TryWithResources/TwrSuppression.java Sun Dec 05 15:26:16 2010 -0800 @@ -36,7 +36,7 @@ throw new RuntimeException(); } } catch(RuntimeException e) { - Throwable[] suppressedExceptions = e.getSuppressedExceptions(); + Throwable[] suppressedExceptions = e.getSuppressed(); int length = suppressedExceptions.length; if (length != 2) throw new RuntimeException("Unexpected length " + length);
--- a/langtools/test/tools/javac/TryWithResources/TwrTests.java Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/test/tools/javac/TryWithResources/TwrTests.java Sun Dec 05 15:26:16 2010 -0800 @@ -90,7 +90,7 @@ } catch (Resource.CreateFailException e) { creationFailuresDetected++; checkCreateFailureId(e.resourceId(), createFailureId); - checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap); + checkSuppressedExceptions(e.getSuppressed(), bitMap); } catch (Resource.CloseFailException e) { throw new AssertionError("Secondary exception suppression failed"); } @@ -112,7 +112,7 @@ } catch (Resource.CreateFailException e) { creationFailuresDetected++; checkCreateFailureId(e.resourceId(), createFailureId); - checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap); + checkSuppressedExceptions(e.getSuppressed(), bitMap); } catch (Resource.CloseFailException e) { throw new AssertionError("Secondary exception suppression failed"); } @@ -134,7 +134,7 @@ } catch (Resource.CreateFailException e) { creationFailuresDetected++; checkCreateFailureId(e.resourceId(), createFailureId); - checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap); + checkSuppressedExceptions(e.getSuppressed(), bitMap); } catch (Resource.CloseFailException e) { throw new AssertionError("Secondary exception suppression failed:" + e); } @@ -158,7 +158,7 @@ } catch (Resource.CreateFailException e) { creationFailuresDetected++; checkCreateFailureId(e.resourceId(), createFailureId); - checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap); + checkSuppressedExceptions(e.getSuppressed(), bitMap); } catch (Resource.CloseFailException e) { throw new AssertionError("Secondary exception suppression failed:" + e); } @@ -181,7 +181,7 @@ } catch (Resource.CreateFailException e) { creationFailuresDetected++; checkCreateFailureId(e.resourceId(), createFailureId); - checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap); + checkSuppressedExceptions(e.getSuppressed(), bitMap); } catch (Resource.CloseFailException e) { throw new AssertionError("Secondary exception suppression failed:" + e); } @@ -207,7 +207,7 @@ } catch (Resource.CreateFailException e) { creationFailuresDetected++; checkCreateFailureId(e.resourceId(), createFailureId); - checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap); + checkSuppressedExceptions(e.getSuppressed(), bitMap); } catch (Resource.CloseFailException e) { throw new AssertionError("Secondary exception suppression failed:" + e); } @@ -231,7 +231,7 @@ } catch (Resource.CreateFailException e) { creationFailuresDetected++; checkCreateFailureId(e.resourceId(), createFailureId); - checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap); + checkSuppressedExceptions(e.getSuppressed(), bitMap); } catch (Resource.CloseFailException e) { throw new AssertionError("Secondary exception suppression failed:" + e); } @@ -259,7 +259,7 @@ } catch (Resource.CreateFailException e) { creationFailuresDetected++; checkCreateFailureId(e.resourceId(), createFailureId); - checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap); + checkSuppressedExceptions(e.getSuppressed(), bitMap); } catch (Resource.CloseFailException e) { throw new AssertionError("Secondary exception suppression failed:" + e); } @@ -310,7 +310,7 @@ * Check for proper suppressed exceptions in proper order. * * @param suppressedExceptions the suppressed exceptions array returned by - * getSuppressedExceptions() + * getSuppressed() * @bitmap a bitmap indicating which suppressed exceptions are expected. * Bit i is set iff id should throw a CloseFailException. */ @@ -376,7 +376,7 @@ } catch (MyKindOfException e) { if (failure == 0) throw new AssertionError("Unexpected MyKindOfException"); - checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap); + checkSuppressedExceptions(e.getSuppressed(), bitMap); } catch (Resource.CloseFailException e) { if (failure == 1) throw new AssertionError("Secondary exception suppression failed"); @@ -388,7 +388,7 @@ throw new AssertionError("CloseFailException: got id " + id + ", expected lg(" + highestCloseFailBit +")"); } - checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap & ~highestCloseFailBit); + checkSuppressedExceptions(e.getSuppressed(), bitMap & ~highestCloseFailBit); } checkClosedList(closedList, 1); } @@ -409,7 +409,7 @@ } catch (MyKindOfException e) { if (failure == 0) throw new AssertionError("Unexpected MyKindOfException"); - checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap); + checkSuppressedExceptions(e.getSuppressed(), bitMap); } catch (Resource.CloseFailException e) { if (failure == 1) throw new AssertionError("Secondary exception suppression failed"); @@ -421,7 +421,7 @@ throw new AssertionError("CloseFailException: got id " + id + ", expected lg(" + highestCloseFailBit +")"); } - checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap & ~highestCloseFailBit); + checkSuppressedExceptions(e.getSuppressed(), bitMap & ~highestCloseFailBit); } checkClosedList(closedList, 2); } @@ -443,7 +443,7 @@ } catch (MyKindOfException e) { if (failure == 0) throw new AssertionError("Unexpected MyKindOfException"); - checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap); + checkSuppressedExceptions(e.getSuppressed(), bitMap); } catch (Resource.CloseFailException e) { if (failure == 1) throw new AssertionError("Secondary exception suppression failed"); @@ -455,7 +455,7 @@ throw new AssertionError("CloseFailException: got id " + id + ", expected lg(" + highestCloseFailBit +")"); } - checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap & ~highestCloseFailBit); + checkSuppressedExceptions(e.getSuppressed(), bitMap & ~highestCloseFailBit); } checkClosedList(closedList, 2); } @@ -477,7 +477,7 @@ } catch (MyKindOfException e) { if (failure == 0) throw new AssertionError("Unexpected MyKindOfException"); - checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap); + checkSuppressedExceptions(e.getSuppressed(), bitMap); } catch (Resource.CloseFailException e) { if (failure == 1) throw new AssertionError("Secondary exception suppression failed"); @@ -489,7 +489,7 @@ throw new AssertionError("CloseFailException: got id " + id + ", expected lg(" + highestCloseFailBit +")"); } - checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap & ~highestCloseFailBit); + checkSuppressedExceptions(e.getSuppressed(), bitMap & ~highestCloseFailBit); } checkClosedList(closedList, 3); } @@ -513,7 +513,7 @@ } catch (MyKindOfException e) { if (failure == 0) throw new AssertionError("Unexpected MyKindOfException"); - checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap); + checkSuppressedExceptions(e.getSuppressed(), bitMap); } catch (Resource.CloseFailException e) { if (failure == 1) throw new AssertionError("Secondary exception suppression failed"); @@ -525,7 +525,7 @@ throw new AssertionError("CloseFailException: got id " + id + ", expected lg(" + highestCloseFailBit +")"); } - checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap & ~highestCloseFailBit); + checkSuppressedExceptions(e.getSuppressed(), bitMap & ~highestCloseFailBit); } checkClosedList(closedList, 3); } @@ -548,7 +548,7 @@ } catch (MyKindOfException e) { if (failure == 0) throw new AssertionError("Unexpected MyKindOfException"); - checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap); + checkSuppressedExceptions(e.getSuppressed(), bitMap); } catch (Resource.CloseFailException e) { if (failure == 1) throw new AssertionError("Secondary exception suppression failed"); @@ -560,7 +560,7 @@ throw new AssertionError("CloseFailException: got id " + id + ", expected lg(" + highestCloseFailBit +")"); } - checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap & ~highestCloseFailBit); + checkSuppressedExceptions(e.getSuppressed(), bitMap & ~highestCloseFailBit); } checkClosedList(closedList, 4); } @@ -586,7 +586,7 @@ } catch (MyKindOfException e) { if (failure == 0) throw new AssertionError("Unexpected MyKindOfException"); - checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap); + checkSuppressedExceptions(e.getSuppressed(), bitMap); } catch (Resource.CloseFailException e) { if (failure == 1) throw new AssertionError("Secondary exception suppression failed"); @@ -598,7 +598,7 @@ throw new AssertionError("CloseFailException: got id " + id + ", expected lg(" + highestCloseFailBit +")"); } - checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap & ~highestCloseFailBit); + checkSuppressedExceptions(e.getSuppressed(), bitMap & ~highestCloseFailBit); } checkClosedList(closedList, 4); } @@ -621,7 +621,7 @@ } catch (MyKindOfException e) { if (failure == 0) throw new AssertionError("Unexpected MyKindOfException"); - checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap); + checkSuppressedExceptions(e.getSuppressed(), bitMap); } catch (Resource.CloseFailException e) { if (failure == 1) throw new AssertionError("Secondary exception suppression failed"); @@ -633,7 +633,7 @@ throw new AssertionError("CloseFailException: got id " + id + ", expected lg(" + highestCloseFailBit +")"); } - checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap & ~highestCloseFailBit); + checkSuppressedExceptions(e.getSuppressed(), bitMap & ~highestCloseFailBit); } checkClosedList(closedList, 5); } @@ -660,7 +660,7 @@ } catch (MyKindOfException e) { if (failure == 0) throw new AssertionError("Unexpected MyKindOfException"); - checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap); + checkSuppressedExceptions(e.getSuppressed(), bitMap); } catch (Resource.CloseFailException e) { if (failure == 1) throw new AssertionError("Secondary exception suppression failed"); @@ -672,7 +672,7 @@ throw new AssertionError("CloseFailException: got id " + id + ", expected lg(" + highestCloseFailBit +")"); } - checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap & ~highestCloseFailBit); + checkSuppressedExceptions(e.getSuppressed(), bitMap & ~highestCloseFailBit); } checkClosedList(closedList, 5); }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/api/6598108/T6598108.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,71 @@ +/* + * 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 6598108 + * @summary com.sun.source.util.Trees.isAccessible incorrect + * @author Jan Lahoda + */ + +import com.sun.source.tree.CompilationUnitTree; +import com.sun.source.tree.Scope; +import com.sun.source.util.JavacTask; +import com.sun.source.util.TreePath; +import com.sun.source.util.Trees; +import java.net.URI; +import java.util.Arrays; +import javax.lang.model.element.TypeElement; +import javax.tools.JavaCompiler; +import javax.tools.JavaFileObject; +import javax.tools.SimpleJavaFileObject; +import javax.tools.ToolProvider; + +public class T6598108 { + public static void main(String[] args) throws Exception { + final String bootPath = System.getProperty("sun.boot.class.path"); //NOI18N + final JavaCompiler tool = ToolProvider.getSystemJavaCompiler(); + assert tool != null; + final JavacTask ct = (JavacTask)tool.getTask(null, null, null, Arrays.asList("-bootclasspath", bootPath), null, Arrays.asList(new MyFileObject())); + + CompilationUnitTree cut = ct.parse().iterator().next(); + TreePath tp = new TreePath(new TreePath(cut), cut.getTypeDecls().get(0)); + Scope s = Trees.instance(ct).getScope(tp); + TypeElement type = ct.getElements().getTypeElement("com.sun.java.util.jar.pack.Package.File"); + + if (Trees.instance(ct).isAccessible(s, type)) { + //com.sun.java.util.jar.pack.Package.File is a public innerclass inside a non-accessible class, so + //"false" would be expected here. + throw new IllegalStateException(""); + } + } + + static class MyFileObject extends SimpleJavaFileObject { + public MyFileObject() { + super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE); + } + public CharSequence getCharContent(boolean ignoreEncodingErrors) { + return "public class Test<TTT> { public void test() {TTT ttt;}}"; + } + } +}
--- a/langtools/test/tools/javac/api/T6412669.java Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/test/tools/javac/api/T6412669.java Sun Dec 05 15:26:16 2010 -0800 @@ -23,11 +23,12 @@ /* * @test - * @bug 6412669 + * @bug 6412669 6997958 * @summary Should be able to get SourcePositions from 269 world */ import java.io.*; +import java.net.*; import java.util.*; import javax.annotation.*; import javax.annotation.processing.*; @@ -39,28 +40,59 @@ @SupportedAnnotationTypes("*") public class T6412669 extends AbstractProcessor { - public static void main(String... args) throws IOException { - String testSrc = System.getProperty("test.src", "."); - String testClasses = System.getProperty("test.classes", "."); + public static void main(String... args) throws Exception { + File testSrc = new File(System.getProperty("test.src", ".")); + File testClasses = new File(System.getProperty("test.classes", ".")); + + // Determine location of necessary tools classes. Assume all in one place. + // Likely candidates are typically tools.jar (when testing JDK build) + // or build/classes or dist/javac.jar (when testing langtools, using -Xbootclasspath/p:) + File toolsClasses; + URL u = T6412669.class.getClassLoader().getResource("com/sun/source/util/JavacTask.class"); + switch (u.getProtocol()) { + case "file": + toolsClasses = new File(u.toURI()); + break; + case "jar": + String s = u.getFile(); // will be file:path!/entry + int sep = s.indexOf("!"); + toolsClasses = new File(new URI(s.substring(0, sep))); + break; + default: + throw new AssertionError("Cannot locate tools classes"); + } + //System.err.println("toolsClasses: " + toolsClasses); JavacTool tool = JavacTool.create(); StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null); - fm.setLocation(StandardLocation.CLASS_PATH, Arrays.asList(new File(testClasses))); + fm.setLocation(StandardLocation.CLASS_PATH, Arrays.asList(testClasses, toolsClasses)); Iterable<? extends JavaFileObject> files = fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, T6412669.class.getName()+".java"))); - String[] opts = { "-proc:only", "-processor", T6412669.class.getName(), - "-classpath", new File(testClasses).getPath() }; - JavacTask task = tool.getTask(null, fm, null, Arrays.asList(opts), null, files); - if (!task.call()) - throw new AssertionError("test failed"); + String[] opts = { "-proc:only", "-processor", T6412669.class.getName()}; + StringWriter sw = new StringWriter(); + JavacTask task = tool.getTask(sw, fm, null, Arrays.asList(opts), null, files); + boolean ok = task.call(); + String out = sw.toString(); + if (!out.isEmpty()) + System.err.println(out); + if (!ok) + throw new AssertionError("compilation of test program failed"); + // verify we found an annotated element to exercise the SourcePositions API + if (!out.contains("processing element")) + throw new AssertionError("expected text not found in compilation output"); } public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { Trees trees = Trees.instance(processingEnv); SourcePositions sp = trees.getSourcePositions(); Messager m = processingEnv.getMessager(); + m.printMessage(Diagnostic.Kind.NOTE, "processing annotations"); + int count = 0; for (TypeElement anno: annotations) { + count++; + m.printMessage(Diagnostic.Kind.NOTE, " processing annotation " + anno); for (Element e: roundEnv.getElementsAnnotatedWith(anno)) { + m.printMessage(Diagnostic.Kind.NOTE, " processing element " + e); TreePath p = trees.getPath(e); long start = sp.getStartPosition(p.getCompilationUnit(), p.getLeaf()); long end = sp.getEndPosition(p.getCompilationUnit(), p.getLeaf()); @@ -69,6 +101,8 @@ m.printMessage(k, "test [" + start + "," + end + "]", e); } } + if (count == 0) + m.printMessage(Diagnostic.Kind.NOTE, "no annotations found"); return true; }
--- a/langtools/test/tools/javac/cast/6467183/T6467183a.out Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/test/tools/javac/cast/6467183/T6467183a.out Sun Dec 05 15:26:16 2010 -0800 @@ -1,6 +1,4 @@ T6467183a.java:16:26: compiler.warn.prob.found.req: (compiler.misc.unchecked.cast.to.type), T6467183a<T>.B, T6467183a<T>.A<T> -T6467183a.java:24:41: compiler.warn.prob.found.req: (compiler.misc.unchecked.cast.to.type), T6467183a<T>.A<java.lang.Integer>, T6467183a<T>.C<? extends java.lang.Number> -T6467183a.java:28:42: compiler.warn.prob.found.req: (compiler.misc.unchecked.cast.to.type), T6467183a<T>.A<java.lang.Integer>, T6467183a<T>.C<? extends java.lang.Integer> - compiler.err.warnings.and.werror 1 error -3 warnings +1 warning
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/cast/6714835/T6714835.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,21 @@ +/* + * @test /nodynamiccopyright/ + * @author mcimadamore + * @bug 6714835 + * @summary Safe cast is rejected (with warning) by javac + * @compile/fail/ref=T6714835.out -Xlint:unchecked -Werror -XDrawDiagnostics T6714835.java + */ + +import java.util.*; + +class T6714835 { + void cast1(Iterable<? extends Integer> x) { + Collection<? extends Number> x1 = (Collection<? extends Number>)x; //ok + Collection<? super Integer> x2 = (Collection<? super Integer>)x; //warn + } + + void cast2(Iterable<? super Number> x) { + Collection<? super Integer> x1 = (Collection<? super Integer>)x; //ok + Collection<? extends Number> x2 = (Collection<? extends Number>)x; //warn + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/cast/6714835/T6714835.out Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,5 @@ +T6714835.java:14:71: compiler.warn.prob.found.req: (compiler.misc.unchecked.cast.to.type), java.lang.Iterable<compiler.misc.type.captureof: 1, ? extends java.lang.Integer>, java.util.Collection<? super java.lang.Integer> +T6714835.java:19:73: compiler.warn.prob.found.req: (compiler.misc.unchecked.cast.to.type), java.lang.Iterable<compiler.misc.type.captureof: 1, ? super java.lang.Number>, java.util.Collection<? extends java.lang.Number> +- compiler.err.warnings.and.werror +1 error +2 warnings
--- a/langtools/test/tools/javac/diags/examples/MulticatchMustBeFinal.java Thu Dec 02 23:44:01 2010 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -/* - * 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.multicatch.param.must.be.final - -class MulticatchMustBeFinal { - void e1() throws NullPointerException { } - void e2() throws IllegalArgumentException { } - - void m() { - try { - e1(); - e2(); - } catch (NullPointerException | IllegalArgumentException e) { - e.printStackTrace(); - } - } -}
--- a/langtools/test/tools/javac/diags/examples/ResourceClosed.java Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/test/tools/javac/diags/examples/ResourceClosed.java Sun Dec 05 15:26:16 2010 -0800 @@ -21,8 +21,8 @@ * questions. */ -// key: compiler.warn.twr.explicit.close.call -// options: -Xlint:arm +// key: compiler.warn.try.explicit.close.call +// options: -Xlint:try import java.io.*;
--- a/langtools/test/tools/javac/diags/examples/ResourceMayNotBeAssigned.java Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/test/tools/javac/diags/examples/ResourceMayNotBeAssigned.java Sun Dec 05 15:26:16 2010 -0800 @@ -21,7 +21,7 @@ * questions. */ -// key: compiler.err.twr.resource.may.not.be.assigned +// key: compiler.err.try.resource.may.not.be.assigned import java.io.*;
--- a/langtools/test/tools/javac/diags/examples/ResourceNotApplicableToType.java Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/test/tools/javac/diags/examples/ResourceNotApplicableToType.java Sun Dec 05 15:26:16 2010 -0800 @@ -21,7 +21,7 @@ * questions. */ -// key: compiler.misc.twr.not.applicable.to.type +// key: compiler.misc.try.not.applicable.to.type // key: compiler.err.prob.found.req class ResourceNotApplicableToType {
--- a/langtools/test/tools/javac/diags/examples/ResourceNotReferenced.java Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/test/tools/javac/diags/examples/ResourceNotReferenced.java Sun Dec 05 15:26:16 2010 -0800 @@ -21,8 +21,8 @@ * questions. */ -// key: compiler.warn.automatic.resource.not.referenced -// options: -Xlint:arm +// key: compiler.warn.try.resource.not.referenced +// options: -Xlint:try import java.io.*;
--- a/langtools/test/tools/javac/diags/examples/TryResourceNotSupported.java Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/test/tools/javac/diags/examples/TryResourceNotSupported.java Sun Dec 05 15:26:16 2010 -0800 @@ -21,7 +21,7 @@ * questions. */ -// key: compiler.err.automatic.resource.management.not.supported.in.source +// key: compiler.err.try.with.resources.not.supported.in.source // options: -source 1.6 import java.io.*;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/6985719/T6985719a.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,15 @@ +/* + * @test /nodynamiccopyright/ + * @bug 6985719 + * @summary Alike methods in interfaces (Inheritance and Overriding) + * @author mcimadamore + * @compile/fail/ref=T6985719a.out -XDrawDiagnostics T6985719a.java + */ + +import java.util.List; + +class T6985719a { + interface A { void f(List<String> ls); } + interface B { void f(List<Integer> ls); } + interface C extends A,B {} +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/6985719/T6985719a.out Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,2 @@ +T6985719a.java:14:5: compiler.err.name.clash.same.erasure.no.override: f(java.util.List<java.lang.Integer>), T6985719a.B, f(java.util.List<java.lang.String>), T6985719a.A +1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/6985719/T6985719b.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,15 @@ +/* + * @test /nodynamiccopyright/ + * @bug 6985719 + * @summary Alike methods in interfaces (Inheritance and Overriding) + * @author mcimadamore + * @compile/fail/ref=T6985719b.out -XDrawDiagnostics T6985719b.java + */ + +import java.util.List; + +class T6985719b { + abstract class A { abstract void f(List<String> ls); } + interface B { void f(List<Integer> ls); } + abstract class C extends A implements B {} +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/6985719/T6985719b.out Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,2 @@ +T6985719b.java:14:14: compiler.err.name.clash.same.erasure.no.override: f(java.util.List<java.lang.Integer>), T6985719b.B, f(java.util.List<java.lang.String>), T6985719b.A +1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/6985719/T6985719c.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,15 @@ +/* + * @test /nodynamiccopyright/ + * @bug 6985719 + * @summary Alike methods in interfaces (Inheritance and Overriding) + * @author mcimadamore + * @compile/fail/ref=T6985719c.out -XDrawDiagnostics T6985719c.java + */ + +import java.util.List; + +class T6985719c { + interface A { void f(List<String> ls); } + interface B<X> { void f(List<X> ls); } + interface C extends A,B<Integer> {} +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/6985719/T6985719c.out Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,2 @@ +T6985719c.java:14:5: compiler.err.name.clash.same.erasure.no.override: f(java.util.List<X>), T6985719c.B, f(java.util.List<java.lang.String>), T6985719c.A +1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/6985719/T6985719d.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,15 @@ +/* + * @test /nodynamiccopyright/ + * @bug 6985719 + * @summary Alike methods in interfaces (Inheritance and Overriding) + * @author mcimadamore + * @compile/fail/ref=T6985719d.out -XDrawDiagnostics T6985719d.java + */ + +import java.util.List; + +class T6985719d { + abstract class A { abstract void f(List<String> ls); } + interface B<X> { void f(List<X> ls); } + abstract class C extends A implements B<Integer> {} +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/6985719/T6985719d.out Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,2 @@ +T6985719d.java:14:14: compiler.err.name.clash.same.erasure.no.override: f(java.util.List<X>), T6985719d.B, f(java.util.List<java.lang.String>), T6985719d.A +1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/6985719/T6985719e.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,14 @@ +/* + * @test /nodynamiccopyright/ + * @bug 6985719 + * @summary Alike methods in interfaces (Inheritance and Overriding) + * @author mcimadamore + * @compile/fail/ref=T6985719e.out -XDrawDiagnostics T6985719e.java + */ + +import java.util.List; + +class T6985719e { + interface A { void f(List<String> ls); } + interface B extends A { void f(List<Integer> ls); } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/6985719/T6985719e.out Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,2 @@ +T6985719e.java:13:34: compiler.err.name.clash.same.erasure.no.override: f(java.util.List<java.lang.Integer>), T6985719e.B, f(java.util.List<java.lang.String>), T6985719e.A +1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/6985719/T6985719f.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,14 @@ +/* + * @test /nodynamiccopyright/ + * @bug 6985719 + * @summary Alike methods in interfaces (Inheritance and Overriding) + * @author mcimadamore + * @compile/fail/ref=T6985719f.out -XDrawDiagnostics T6985719f.java + */ + +import java.util.List; + +class T6985719f { + abstract class A { abstract void f(List<String> ls); } + abstract class B extends A { void f(List<Integer> ls); } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/6985719/T6985719f.out Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,2 @@ +T6985719f.java:13:39: compiler.err.name.clash.same.erasure.no.override: f(java.util.List<java.lang.Integer>), T6985719f.B, f(java.util.List<java.lang.String>), T6985719f.A +1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/6985719/T6985719g.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,14 @@ +/* + * @test /nodynamiccopyright/ + * @bug 6985719 + * @summary Alike methods in interfaces (Inheritance and Overriding) + * @author mcimadamore + * @compile/fail/ref=T6985719g.out -XDrawDiagnostics T6985719g.java + */ + +import java.util.List; + +class T6985719g { + interface A<X> { void f(List<X> ls); } + interface B extends A<String> { void f(List<Integer> ls); } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/6985719/T6985719g.out Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,2 @@ +T6985719g.java:13:42: compiler.err.name.clash.same.erasure.no.override: f(java.util.List<java.lang.Integer>), T6985719g.B, f(java.util.List<X>), T6985719g.A +1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/6985719/T6985719h.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,14 @@ +/* + * @test /nodynamiccopyright/ + * @bug 6985719 + * @summary Alike methods in interfaces (Inheritance and Overriding) + * @author mcimadamore + * @compile/fail/ref=T6985719h.out -XDrawDiagnostics T6985719h.java + */ + +import java.util.List; + +class T6985719h { + abstract class A<X> { abstract void f(List<X> ls); } + abstract class B extends A<String> { abstract void f(List<Integer> ls); } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/6985719/T6985719h.out Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,2 @@ +T6985719h.java:13:56: compiler.err.name.clash.same.erasure.no.override: f(java.util.List<java.lang.Integer>), T6985719h.B, f(java.util.List<X>), T6985719h.A +1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/diamond/6996914/T6996914a.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,171 @@ +/* + * 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 6996914 + * @summary Diamond inference: problem when accessing protected constructor + * @run main T6996914a + */ + +import com.sun.source.util.JavacTask; +import java.net.URI; +import java.util.Arrays; +import javax.tools.Diagnostic; +import javax.tools.DiagnosticListener; +import javax.tools.JavaCompiler; +import javax.tools.JavaFileObject; +import javax.tools.SimpleJavaFileObject; +import javax.tools.ToolProvider; + +public class T6996914a { + + enum PackageKind { + DEFAULT("", ""), + A("package a;", "import a.*;"); + + String pkgDecl; + String importDecl; + + PackageKind(String pkgDecl, String importDecl) { + this.pkgDecl = pkgDecl; + this.importDecl = importDecl; + } + } + + enum DiamondKind { + STANDARD("new Foo<>();"), + ANON("new Foo<>() {};"); + + String expr; + + DiamondKind(String expr) { + this.expr = expr; + } + } + + enum ConstructorKind { + PACKAGE(""), + PROTECTED("protected"), + PRIVATE("private"), + PUBLIC("public"); + + String mod; + + ConstructorKind(String mod) { + this.mod = mod; + } + } + + static class FooClass extends SimpleJavaFileObject { + + final static String sourceStub = + "#P\n" + + "public class Foo<X> {\n" + + " #M Foo() {}\n" + + "}\n"; + + String source; + + public FooClass(PackageKind pk, ConstructorKind ck) { + super(URI.create("myfo:/" + (pk != PackageKind.DEFAULT ? "a/Foo.java" : "Foo.java")), + JavaFileObject.Kind.SOURCE); + source = sourceStub.replace("#P", pk.pkgDecl).replace("#M", ck.mod); + } + + @Override + public CharSequence getCharContent(boolean ignoreEncodingErrors) { + return source; + } + } + + static class ClientClass extends SimpleJavaFileObject { + + final static String sourceStub = + "#I\n" + + "class Test {\n" + + " Foo<String> fs = #D\n" + + "}\n"; + + String source; + + public ClientClass(PackageKind pk, DiamondKind dk) { + super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE); + source = sourceStub.replace("#I", pk.importDecl).replace("#D", dk.expr); + } + + @Override + public CharSequence getCharContent(boolean ignoreEncodingErrors) { + return source; + } + } + + public static void main(String... args) throws Exception { + for (PackageKind pk : PackageKind.values()) { + for (ConstructorKind ck : ConstructorKind.values()) { + for (DiamondKind dk : DiamondKind.values()) { + compileAndCheck(pk, ck, dk); + } + } + } + } + + static void compileAndCheck(PackageKind pk, ConstructorKind ck, DiamondKind dk) throws Exception { + FooClass foo = new FooClass(pk, ck); + ClientClass client = new ClientClass(pk, dk); + final JavaCompiler tool = ToolProvider.getSystemJavaCompiler(); + ErrorListener el = new ErrorListener(); + JavacTask ct = (JavacTask)tool.getTask(null, null, el, + null, null, Arrays.asList(foo, client)); + ct.analyze(); + if (el.errors > 0 == check(pk, ck, dk)) { + String msg = el.errors > 0 ? + "Error compiling files" : + "No error when compiling files"; + throw new AssertionError(msg + ": \n" + foo.source + "\n" + client.source); + } + } + + static boolean check(PackageKind pk, ConstructorKind ck, DiamondKind dk) { + switch (pk) { + case A: return ck == ConstructorKind.PUBLIC || + (ck == ConstructorKind.PROTECTED && dk == DiamondKind.ANON); + case DEFAULT: return ck != ConstructorKind.PRIVATE; + default: throw new AssertionError("Unknown package kind"); + } + } + + /** + * DiagnosticListener to count any errors that occur + */ + private static class ErrorListener implements DiagnosticListener<JavaFileObject> { + + public void report(Diagnostic<? extends JavaFileObject> diagnostic) { + switch (diagnostic.getKind()) { + case ERROR: + errors++; + } + } + int errors; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/diamond/6996914/T6996914b.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,39 @@ +/* + * 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 6996914 + * @summary Diamond inference: problem when accessing protected constructor + * @compile T6996914b.java + */ + +class Super<X,Y> { + private Super(Integer i, Y y, X x) {} + public Super(Number n, X x, Y y) {} +} + +class Test { + Super<String,Integer> ssi1 = new Super<>(1, "", 2); + Super<String,Integer> ssi2 = new Super<>(1, "", 2) {}; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/meth/XlintWarn.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2008, 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 6999067 + * @summary cast for invokeExact call gets redundant cast to <type> warnings + * @author mcimadamore + * + * @compile -Werror -Xlint:cast XlintWarn.java + */ + +import java.dyn.*; + +class XlintWarn { + void test(MethodHandle mh) throws Throwable { + int i1 = (int)mh.invoke(); + int i2 = (int)mh.invokeExact(); + int i3 = (int)mh.invokeVarargs(); + int i4 = (int)InvokeDynamic.test(); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/multicatch/Neg01eff_final.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,28 @@ +/* + * @test /nodynamiccopyright/ + * @bug 6943289 + * + * @summary Project Coin: Improved Exception Handling for Java (aka 'multicatch') + * @author darcy + * @compile/fail/ref=Neg01eff_final.out -XDrawDiagnostics Neg01eff_final.java + * @compile -source 6 -XDrawDiagnostics Neg01eff_final.java + * + */ + +class Neg01eff_final { + static class A extends Exception {} + static class B1 extends A {} + static class B2 extends A {} + + class Test { + void m() throws A { + try { + throw new B1(); + } catch (A ex1) { + try { + throw ex1; // used to throw A, now throws B1! + } catch (B2 ex2) { }//unreachable + } + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/multicatch/Neg01eff_final.out Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,2 @@ +Neg01eff_final.java:24:19: compiler.err.except.never.thrown.in.try: Neg01eff_final.B2 +1 error
--- a/langtools/test/tools/javac/multicatch/Neg02.java Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/test/tools/javac/multicatch/Neg02.java Sun Dec 05 15:26:16 2010 -0800 @@ -20,6 +20,8 @@ else { throw new B(); } - } catch (A | B ex) { } + } catch (final A | B ex) { + ex = new B(); + } } }
--- a/langtools/test/tools/javac/multicatch/Neg02.out Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/test/tools/javac/multicatch/Neg02.out Sun Dec 05 15:26:16 2010 -0800 @@ -1,2 +1,2 @@ -Neg02.java:23:24: compiler.err.multicatch.param.must.be.final: ex +Neg02.java:24:13: compiler.err.multicatch.parameter.may.not.be.assigned: ex 1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/multicatch/Neg02eff_final.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,27 @@ +/* + * @test /nodynamiccopyright/ + * @bug 6943289 6993963 + * + * @summary Project Coin: Improved Exception Handling for Java (aka 'multicatch') + * @author mcimadamore + * @compile/fail/ref=Neg02eff_final.out -XDrawDiagnostics Neg02eff_final.java + * + */ + +class Neg02eff_final { + static class A extends Exception {} + static class B extends Exception {} + + void m() { + try { + if (true) { + throw new A(); + } + else { + throw new B(); + } + } catch (A | B ex) { + ex = new B(); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/multicatch/Neg02eff_final.out Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,2 @@ +Neg02eff_final.java:24:13: compiler.err.multicatch.parameter.may.not.be.assigned: ex +1 error
--- a/langtools/test/tools/javac/multicatch/Neg03.java Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/test/tools/javac/multicatch/Neg03.java Sun Dec 05 15:26:16 2010 -0800 @@ -9,19 +9,22 @@ */ class Neg03 { - static class A extends Exception {} - static class B extends Exception {} - void m() { + static class A extends Exception { public void m() {}; public Object f;} + static class B1 extends A {} + static class B2 extends A {} + + void m() throws B1, B2 { try { if (true) { - throw new A(); + throw new B1(); } else { - throw new B(); + throw new B2(); } - } catch (final A | B ex) { - ex = new B(); + } catch (Exception ex) { + ex = new B2(); //effectively final analysis disabled! + throw ex; } } }
--- a/langtools/test/tools/javac/multicatch/Neg03.out Thu Dec 02 23:44:01 2010 -0800 +++ b/langtools/test/tools/javac/multicatch/Neg03.out Sun Dec 05 15:26:16 2010 -0800 @@ -1,2 +1,2 @@ -Neg03.java:24:13: compiler.err.multicatch.parameter.may.not.be.assigned: ex +Neg03.java:27:13: compiler.err.unreported.exception.need.to.catch.or.throw: java.lang.Exception 1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/multicatch/Neg04eff_final.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,31 @@ +/* + * @test /nodynamiccopyright/ + * @bug 6943289 + * + * @summary Project Coin: Improved Exception Handling for Java (aka 'multicatch') + * @author mcimadamore + * @compile/fail/ref=Neg04eff_final.out -XDrawDiagnostics Neg04eff_final.java + * + */ + +class Neg04eff_final { + static class A extends Exception {} + static class B extends Exception {} + + void test() throws B { + try { + if (true) { + throw new A(); + } else if (false) { + throw new B(); + } else { + throw (Throwable)new Exception(); + } + } + catch (A e) {} + catch (Exception e) { + throw e; + } + catch (Throwable t) {} + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/multicatch/Neg04eff_final.out Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,2 @@ +Neg04eff_final.java:27:13: compiler.err.unreported.exception.need.to.catch.or.throw: java.lang.Exception +1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/multicatch/Neg05.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,33 @@ +/* + * @test /nodynamiccopyright/ + * @bug 6943289 + * + * @summary Project Coin: Improved Exception Handling for Java (aka 'multicatch') + * @author mcimadamore + * @compile/fail/ref=Neg05.out -XDrawDiagnostics Neg05.java + * + */ + +class Neg02 { + + static class Foo<X> { + Foo(X x) {} + } + + static interface Base<X> {} + static class A extends Exception implements Base<String> {} + static class B extends Exception implements Base<Integer> {} + + void m() { + try { + if (true) { + throw new A(); + } + else { + throw new B(); + } + } catch (A | B ex) { + Foo<?> f = new Foo<>(ex); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/multicatch/Neg05.out Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,2 @@ +Neg05.java:30:31: compiler.err.cant.apply.diamond.1: (compiler.misc.diamond: Neg02.Foo), (compiler.misc.diamond.invalid.arg: java.lang.Exception&Neg02.Base<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>>, (compiler.misc.diamond: Neg02.Foo)) +1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/multicatch/Pos06.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,27 @@ +/* + * @test /nodynamiccopyright/ + * @bug 6993963 + * + * @summary Project Coin: Use precise exception analysis for effectively final catch parameters + * @author mcimadamore + * @compile Pos06.java + * + */ + +class Pos06 { + static class A extends Exception {} + static class B extends Exception {} + + void m() { + try { + if (true) { + throw new A(); + } + else { + throw new B(); + } + } catch (A | B ex) { + System.out.println(ex); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/multicatch/Pos07.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,49 @@ +/* + * 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 6993963 + * @summary Project Coin: Use precise exception analysis for effectively final catch parameters + * @compile Pos07.java + */ + +class Pos07 { + + static class A extends Exception { public void m() {}; public Object f;} + static class B1 extends A {} + static class B2 extends A {} + + void m() throws B1, B2 { + try { + if (true) { + throw new B1(); + } + else { + throw new B2(); + } + } catch (Exception ex) { //effectively final analysis + throw ex; + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/multicatch/Pos08.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,46 @@ +/* + * 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 6993963 + * @summary Multicatch: crash while compiling simple code with a multicatch parameter + * @compile Pos08.java + */ + +class Pos08 { + + interface Foo {} + static class X1 extends Exception implements Foo {} + static class X2 extends Exception implements Foo {} + + void m(boolean cond) { + try { + if (cond) + throw new X1(); + else + throw new X2(); + } + catch (final X1 | X2 ex) {} + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/multicatch/Pos08eff_final.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,46 @@ +/* + * 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 6993963 + * @summary Multicatch: crash while compiling simple code with a multicatch parameter + * @compile Pos08eff_final.java + */ + +class Pos08eff_final { + + interface Foo {} + static class X1 extends Exception implements Foo {} + static class X2 extends Exception implements Foo {} + + void m(boolean cond) { + try { + if (cond) + throw new X1(); + else + throw new X2(); + } + catch (X1 | X2 ex) {} + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/multicatch/model/Check.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,27 @@ +/* + * 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. + */ + +/** + * Annotation used by ModelChecker to mark the class whose model is to be checked + */ +@interface Check {}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/multicatch/model/Member.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,31 @@ +/* + * 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. + */ + +import javax.lang.model.element.ElementKind; + +/** + * Annotation used by ModelChecker to mark a member that is to be checked + */ +@interface Member { + ElementKind value(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/multicatch/model/Model01.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,48 @@ +/* + * 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. + */ + +import javax.lang.model.element.ElementKind; + +@Check +class Test { + + class A extends Exception { + @Member(ElementKind.METHOD) + public void m() {}; + @Member(ElementKind.FIELD) + public Object f; + } + + class B1 extends A {} + class B2 extends A {} + + void test(){ + try { + if (true) + throw new B1(); + else + throw new B2(); + } + catch(B1 | B2 ex) { } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/multicatch/model/ModelChecker.java Sun Dec 05 15:26:16 2010 -0800 @@ -0,0 +1,95 @@ +/* + * 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 6993963 + * @summary Project Coin: Use precise exception analysis for effectively final catch parameters + * @library ../../lib + * @build JavacTestingAbstractProcessor ModelChecker + * @compile -processor ModelChecker Model01.java + */ + +import com.sun.source.tree.VariableTree; +import com.sun.source.util.TreePathScanner; +import com.sun.source.util.Trees; +import com.sun.source.util.TreePath; + +import java.util.Set; +import javax.annotation.processing.RoundEnvironment; +import javax.annotation.processing.SupportedAnnotationTypes; +import javax.lang.model.element.Element; +import javax.lang.model.element.ElementKind; +import javax.lang.model.element.TypeElement; + +@SupportedAnnotationTypes("Check") +public class ModelChecker extends JavacTestingAbstractProcessor { + + @Override + public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { + if (roundEnv.processingOver()) + return true; + + Trees trees = Trees.instance(processingEnv); + + TypeElement testAnno = elements.getTypeElement("Check"); + for (Element elem: roundEnv.getElementsAnnotatedWith(testAnno)) { + TreePath p = trees.getPath(elem); + new MulticatchParamTester(trees).scan(p, null); + } + return true; + } + + class MulticatchParamTester extends TreePathScanner<Void, Void> { + Trees trees; + + public MulticatchParamTester(Trees trees) { + super(); + this.trees = trees; + } + + @Override + public Void visitVariable(VariableTree node, Void p) { + Element ex = trees.getElement(getCurrentPath()); + if (ex.getSimpleName().contentEquals("ex")) { + assertTrue(ex.getKind() == ElementKind.EXCEPTION_PARAMETER, "Expected EXCEPTION_PARAMETER - found " + ex.getKind()); + for (Element e : types.asElement(ex.asType()).getEnclosedElements()) { + Member m = e.getAnnotation(Member.class); + if (m != null) { + assertTrue(e.getKind() == m.value(), "Expected " + m.value() + " - found " + e.getKind()); + } + } + assertTrue(assertionCount == 3, "Expected 3 assertions - found " + assertionCount); + } + return super.visitVariable(node, p); + } + } + + private static void assertTrue(boolean cond, String msg) { + assertionCount++; + if (!cond) + throw new AssertionError(msg); + } + + static int assertionCount = 0; +}