### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core Index: model/org/eclipse/jdt/core/IMethod.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IMethod.java,v retrieving revision 1.33 diff -u -r1.33 IMethod.java --- model/org/eclipse/jdt/core/IMethod.java 23 Apr 2010 13:11:05 -0000 1.33 +++ model/org/eclipse/jdt/core/IMethod.java 14 Feb 2011 12:17:21 -0000 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2010 IBM Corporation and others. + * Copyright (c) 2000, 2011 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -100,6 +100,17 @@ * @return the number of parameters of this method */ int getNumberOfParameters(); + +/** + * Returns a two-dimensional array of annotations for this method's parameters. If the + * number of parameters is zero, null is returned. + * + * @return the array of annotations for the specified parameter + * @throws JavaModelException + * @since 3.7 + */ +IAnnotation[][] getParameterAnnotations() throws JavaModelException; + /** * Returns the binding key for this method only if the given method is {@link #isResolved() resolved}. * A binding key is a key that uniquely identifies this method. It allows access Index: model/org/eclipse/jdt/internal/core/BinaryMethod.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/BinaryMethod.java,v retrieving revision 1.111 diff -u -r1.111 BinaryMethod.java --- model/org/eclipse/jdt/internal/core/BinaryMethod.java 20 Jan 2011 02:28:43 -0000 1.111 +++ model/org/eclipse/jdt/internal/core/BinaryMethod.java 14 Feb 2011 12:17:21 -0000 @@ -11,7 +11,15 @@ package org.eclipse.jdt.internal.core; import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.jdt.core.*; +import org.eclipse.jdt.core.Flags; +import org.eclipse.jdt.core.IAnnotation; +import org.eclipse.jdt.core.IMemberValuePair; +import org.eclipse.jdt.core.IMethod; +import org.eclipse.jdt.core.IType; +import org.eclipse.jdt.core.ITypeParameter; +import org.eclipse.jdt.core.JavaCore; +import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.core.Signature; import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.env.IBinaryAnnotation; @@ -61,6 +69,19 @@ IBinaryAnnotation[] binaryAnnotations = info.getAnnotations(); return getAnnotations(binaryAnnotations, info.getTagBits()); } +/** + * @see IMethod#getParameterAnnotations() + */ +public IAnnotation[][] getParameterAnnotations() throws JavaModelException { + IBinaryMethod info = (IBinaryMethod) getElementInfo(); + if (this.parameterTypes.length == 0) return null; + IAnnotation[][] annotations = new IAnnotation[this.parameterTypes.length][]; + for (int i=0; i < this.parameterTypes.length; i++) { + annotations[i] = getAnnotations(info.getParameterAnnotations(i), info.getTagBits()); + } + return annotations; +} + public IMemberValuePair getDefaultValue() throws JavaModelException { IBinaryMethod info = (IBinaryMethod) getElementInfo(); Object defaultValue = info.getDefaultValue(); Index: model/org/eclipse/jdt/internal/core/CompilationUnitStructureRequestor.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CompilationUnitStructureRequestor.java,v retrieving revision 1.87 diff -u -r1.87 CompilationUnitStructureRequestor.java --- model/org/eclipse/jdt/internal/core/CompilationUnitStructureRequestor.java 28 Jul 2010 16:17:01 -0000 1.87 +++ model/org/eclipse/jdt/internal/core/CompilationUnitStructureRequestor.java 14 Feb 2011 12:17:21 -0000 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2010 IBM Corporation and others. + * Copyright (c) 2000, 2011 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -22,6 +22,7 @@ import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.core.compiler.IProblem; import org.eclipse.jdt.internal.compiler.ISourceElementRequestor; +import org.eclipse.jdt.internal.compiler.ast.Argument; import org.eclipse.jdt.internal.compiler.ast.ArrayInitializer; import org.eclipse.jdt.internal.compiler.ast.ClassLiteralAccess; import org.eclipse.jdt.internal.compiler.ast.Expression; @@ -427,8 +428,55 @@ acceptAnnotation(annotation, info, handle); } } + // https://bugs.eclipse.org/bugs/show_bug.cgi?id=334783 + // Process the parameter annotations from the arguments + if (methodInfo.node != null && methodInfo.node.arguments != null) { + info.arguments = acceptMethodParameters(methodInfo.node.arguments, handle, methodInfo); + } return info; } +private LocalVariable[] acceptMethodParameters(Argument[] arguments, JavaElement methodHandle, MethodInfo methodInfo) { + if (arguments == null) return null; + LocalVariable[] result = new LocalVariable[arguments.length]; + Annotation[][] paramAnnotations = new Annotation[arguments.length][]; + for(int i = 0; i < arguments.length; i++) { + Argument argument = arguments[i]; + LocalVariableInfo argumentInfo = new LocalVariableInfo(); + LocalVariableInfo localVarInfo = new LocalVariableInfo(); + localVarInfo.sourceRangeStart = argument.declarationSourceStart; + localVarInfo.sourceRangeEnd = argument.declarationSourceStart; + localVarInfo.nameStart = argument.sourceStart; + localVarInfo.nameEnd = argument.sourceEnd; + localVarInfo.isParameter = true; + + String paramTypeSig = JavaModelManager.getJavaModelManager().intern(Signature.createTypeSignature(methodInfo.parameterTypes[i], false)); + result[i] = new LocalVariable( + methodHandle, + new String(argument.name), + argument.declarationSourceStart, + argument. declarationSourceEnd, + argument.sourceStart, + argument.sourceEnd, + paramTypeSig, + argument.annotations, + argument.modifiers, + true); + this.newElements.put(result[i], argumentInfo); + this.infoStack.push(argumentInfo); + this.handleStack.push(result[i]); + if (argument.annotations != null) { + paramAnnotations[i] = new Annotation[argument.annotations.length]; + for (int j = 0; j < argument.annotations.length; j++ ) { + org.eclipse.jdt.internal.compiler.ast.Annotation annotation = argument.annotations[j]; + acceptAnnotation(annotation, localVarInfo, result[i]); + } + } + this.infoStack.pop(); + this.handleStack.pop(); + } + return result; +} + /** * @see ISourceElementRequestor */ Index: model/org/eclipse/jdt/internal/core/LocalVariableInfo.java =================================================================== RCS file: model/org/eclipse/jdt/internal/core/LocalVariableInfo.java diff -N model/org/eclipse/jdt/internal/core/LocalVariableInfo.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ model/org/eclipse/jdt/internal/core/LocalVariableInfo.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,9 @@ +package org.eclipse.jdt.internal.core; + +public class LocalVariableInfo extends AnnotatableInfo { + + /* + * Mentions whether or not this local variable is a method parameter. + */ + public boolean isParameter; +} Index: model/org/eclipse/jdt/internal/core/SourceMethod.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SourceMethod.java,v retrieving revision 1.68 diff -u -r1.68 SourceMethod.java --- model/org/eclipse/jdt/internal/core/SourceMethod.java 27 Jun 2008 16:03:51 -0000 1.68 +++ model/org/eclipse/jdt/internal/core/SourceMethod.java 14 Feb 2011 12:17:25 -0000 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2008 IBM Corporation and others. + * Copyright (c) 2000, 2011 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -135,6 +135,20 @@ return info.typeParameters; } +public IAnnotation[][] getParameterAnnotations() throws JavaModelException { + ILocalVariable[] arguments = ((SourceMethodElementInfo) getElementInfo()).arguments; + if (arguments == null) return null; + IAnnotation[][] annotations = new IAnnotation[arguments.length][]; + for (int i=0; i {\n" + + " X field;\n" + + " @Inject " + + " public void Test(@Default String processor) {}" + + "}" + + "@interface Inject{\n" + + "}" + + "@interface Default{\n" + + "}"; + createFolder("/P/src/p"); + createFile( + "/P/src/p/X.java", + source + ); + waitForAutoBuild(); + + ICompilationUnit unit = getCompilationUnit("/P/src/p/X.java"); + IJavaElement[] variable = ((ICodeAssist) unit).codeSelect(source.indexOf("processor"), "processor".length()); + + assertEquals(1, variable.length); + String annotationString = "@Default [in processor [in Test(String) [in X [in X.java [in p [in src [in P]]]]]]]"; + assertEquals(annotationString, ((LocalVariable)variable[0]).getAnnotations()[0].toString()); + IType type = unit.getType("X"); + + IMethod method = type.getMethods()[0]; + assertEquals(annotationString, method.getParameterAnnotations()[0][0].toString()); + } finally { + deleteProject("P"); + } +} +/** + * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=334783" + */ +public void testParamAnnotations2() throws CoreException, IOException { + try { + IJavaProject project = createJavaProject("P", new String[] {"src"}, new String[] {"JCL15_LIB"}, "bin", "1.5"); + String[] pathAndContents = new String[]{"p/X.java", + "package p;" + + "public class X {\n" + + " X field;\n" + + " @Inject " + + " public void Test(@Default String processor) {}" + + "}" + + "@interface Inject{\n" + + "}" + + "@interface Default{\n" + + "}"}; + addLibrary(project, "lib334783.jar", "libsrc.zip", pathAndContents, JavaCore.VERSION_1_5); + + waitForAutoBuild(); + IPackageFragmentRoot root = project.getPackageFragmentRoot(getFile("/P/lib334783.jar")); + IType type = root.getPackageFragment("p").getClassFile("X.class").getType(); + String annotationString = "@p.Default (not open) [in Test(java.lang.String) [in X [in X.class [in p [in lib334783.jar [in P]]]]]]"; + + IMethod method = type.getMethods()[1]; + assertEquals(annotationString, method.getParameterAnnotations()[0][0].toString()); + } finally { + deleteProject("P"); + } +} } #P org.eclipse.jdt.jeview Index: src/org/eclipse/jdt/jeview/views/JavaElement.java =================================================================== RCS file: /cvsroot/eclipse/jdt-ui-home/plugins/org.eclipse.jdt.jeview/src/org/eclipse/jdt/jeview/views/JavaElement.java,v retrieving revision 1.16 diff -u -r1.16 JavaElement.java --- src/org/eclipse/jdt/jeview/views/JavaElement.java 8 Mar 2010 16:28:55 -0000 1.16 +++ src/org/eclipse/jdt/jeview/views/JavaElement.java 14 Feb 2011 12:17:30 -0000 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2005, 2010 IBM Corporation and others. + * Copyright (c) 2005, 2011 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -486,7 +486,23 @@ result.add(new JavaElementChildrenProperty(this, "PARAMETER NAMES") { @Override protected JEAttribute[] computeChildren() throws JavaModelException { - return createStrings(this, method.getParameterNames()); + String[] strings = method.getParameterNames(); + JEAttribute[] children= new JEAttribute[strings.length]; + for (int i= 0; i < strings.length; i++) { + final int index= i; + final IAnnotation[][] annotations = method.getParameterAnnotations(); + children[i]= new JavaElementProperty(this, null, strings[i]) { + @Override + public JEAttribute[] getChildren() { + try { + return createJavaElements(this, annotations[index]); + } catch (Exception e) { + return new JEAttribute[] {new Error(this, "", e)}; + } + } + }; + } + return children; } }); result.add(new JavaElementChildrenProperty(this, "PARAMETER TYPES") {