diff options
| author | Roel Spilker <r.spilker@gmail.com> | 2014-08-21 22:23:17 +0200 | 
|---|---|---|
| committer | Roel Spilker <r.spilker@gmail.com> | 2014-08-21 22:23:17 +0200 | 
| commit | eba2a515fa3f4c773f3b38ef3510c70f941210cc (patch) | |
| tree | f746ae2e496a1a27b7499ebb765f04b11c8c428c /src/core/lombok/javac | |
| parent | 836c6e865e1a41ee98e271b6ed24a62a16a4f682 (diff) | |
| download | lombok-eba2a515fa3f4c773f3b38ef3510c70f941210cc.tar.gz lombok-eba2a515fa3f4c773f3b38ef3510c70f941210cc.tar.bz2 lombok-eba2a515fa3f4c773f3b38ef3510c70f941210cc.zip | |
[i731] javac resolution broken by 1.8.0_20; fixed with some reflection voodoo. -R&R
Diffstat (limited to 'src/core/lombok/javac')
| -rw-r--r-- | src/core/lombok/javac/JavacResolution.java | 35 | 
1 files changed, 33 insertions, 2 deletions
| diff --git a/src/core/lombok/javac/JavacResolution.java b/src/core/lombok/javac/JavacResolution.java index ec455b18..23d7d482 100644 --- a/src/core/lombok/javac/JavacResolution.java +++ b/src/core/lombok/javac/JavacResolution.java @@ -24,11 +24,15 @@ package lombok.javac;  import static lombok.javac.Javac.*;  import static lombok.javac.JavacTreeMaker.TypeTag.typeTag; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method;  import java.util.ArrayDeque;  import java.util.Map;  import javax.lang.model.type.TypeKind; +import lombok.Lombok; +  import com.sun.tools.javac.code.BoundKind;  import com.sun.tools.javac.code.Symbol.TypeSymbol;  import com.sun.tools.javac.code.Symtab; @@ -179,10 +183,37 @@ public class JavacResolution {  		}  	} +	private static class ReflectiveAccess { +		private static Method UPPER_BOUND; +		 +		static { +			Method upperBound = null; +			try { +				upperBound = Types.class.getMethod("upperBound", Type.class); +			} catch (Throwable ignore) {} +			if (upperBound == null) try { +				upperBound = Types.class.getMethod("wildUpperBound", Type.class); +			} catch (Throwable ignore) {} +			 +			UPPER_BOUND = upperBound; +		} +		 +		public static Type Types_upperBound(Types types, Type type) { +			try { +				return (Type) UPPER_BOUND.invoke(types, type); +			} catch (InvocationTargetException e) { +				throw Lombok.sneakyThrow(e.getCause()); +			} catch (Exception e) { +				throw Lombok.sneakyThrow(e); +			} +		} +	} +	  	public static Type ifTypeIsIterableToComponent(Type type, JavacAST ast) {  		Types types = Types.instance(ast.getContext());  		Symtab syms = Symtab.instance(ast.getContext()); -		Type boundType = types.upperBound(type); +		Type boundType = ReflectiveAccess.Types_upperBound(types, type); +//		Type boundType = types.upperBound(type);  		Type elemTypeIfArray = types.elemtype(boundType);  		if (elemTypeIfArray != null) return elemTypeIfArray; @@ -190,7 +221,7 @@ public class JavacResolution {  		if (base == null) return syms.objectType;  		List<Type> iterableParams = base.allparams(); -		return iterableParams.isEmpty() ? syms.objectType : types.upperBound(iterableParams.head); +		return iterableParams.isEmpty() ? syms.objectType : ReflectiveAccess.Types_upperBound(types, iterableParams.head);  	}  	public static JCExpression typeToJCTree(Type type, JavacAST ast, boolean allowVoid) throws TypeNotConvertibleException { | 
