Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShankha Banerjee2014-05-20 10:51:34 +0000
committerManoj Palat2014-05-20 10:51:34 +0000
commit0a0c65dd1c0bd06d4f10a0a8165667bb0b6d1700 (patch)
treecdf749dbf55214fc79c206e4bde8084a7620b662
parent35479e92cf76ddb81a077e36ac9bcdd2a30c6978 (diff)
downloadeclipse.jdt.core-0a0c65dd1c0bd06d4f10a0a8165667bb0b6d1700.tar.gz
eclipse.jdt.core-0a0c65dd1c0bd06d4f10a0a8165667bb0b6d1700.tar.xz
eclipse.jdt.core-0a0c65dd1c0bd06d4f10a0a8165667bb0b6d1700.zip
Fix for Bug 406805 [1.8] Parameter names for enum constructor not
available Signed-off-by: Shankha Banerjee <shankhba@in.ibm.com>
-rw-r--r--org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter18Test.java257
-rw-r--r--org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/BinaryMethod.java2
-rw-r--r--org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ClassFileInfo.java23
3 files changed, 277 insertions, 5 deletions
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter18Test.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter18Test.java
index 6ed22dc8ad..b3523546e8 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter18Test.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter18Test.java
@@ -12,17 +12,22 @@
*******************************************************************************/
package org.eclipse.jdt.core.tests.dom;
+import java.io.IOException;
import java.util.List;
import junit.framework.Test;
+import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.dom.*;
import org.eclipse.jdt.core.BindingKey;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.core.ResolvedBinaryMethod;
public class ASTConverter18Test extends ConverterTestSetup {
@@ -4387,4 +4392,256 @@ public void testBug426977() throws JavaModelException {
fail(e.getMessage());
}
}
+
+//Bug 406805 - [1.8] Parameter names for enum constructor not available
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=406805
+public void test406805() throws CoreException, IOException {
+ String contents1 =
+ "package test406805;\n" +
+ "public class X {\n" +
+ "}";
+ createFolder("/Converter18/src/test406805");
+ createFile("/Converter18/src/test406805/X.java", contents1);
+ this.workingCopy = getWorkingCopy(
+ "/Converter18/src/test406805/X.java",
+ contents1,
+ true
+ );
+
+ String jarName = "getParameters.jar";
+ String srcName = "getParameters_src.zip";
+ final IJavaProject javaProject = this.workingCopy.getJavaProject();
+ try {
+ String[] contents = new String[] {
+ "TestEnum.java",
+ "package test406805;\n" +
+ "public enum TestEnum {\n" +
+ " FirstValue(\"Zonk\") {\n" +
+ " @Override\n" +
+ " public String toString() {\n" +
+ " return super.toString();\n" +
+ " }\n" +
+ " },\n" +
+ " SecondValue(\"Bla\");\n" +
+ " String string;\n" +
+ " TestEnum(String string) {\n" +
+ " this.string = string;\n" +
+ " }\n" +
+ "}"
+ };
+ addLibrary(javaProject, jarName, srcName, contents, JavaCore.VERSION_1_8);
+
+ ASTParser parser = ASTParser.newParser(AST.JLS8);
+ parser.setIgnoreMethodBodies(true);
+ parser.setProject(javaProject);
+ IType type = javaProject.findType("test406805.TestEnum");
+ IBinding[] bindings = parser.createBindings(new IJavaElement[] { type }, null);
+ ITypeBinding typeBinding = (ITypeBinding) bindings[0];
+ IMethodBinding[] methods = typeBinding.getDeclaredMethods();
+
+ for (int i = 0, length = methods.length; i < length; i++) {
+ IMethodBinding method = methods[i];
+ if (method.isConstructor()) {
+ ResolvedBinaryMethod bm = (ResolvedBinaryMethod) method.getJavaElement();
+ assertTrue(bm.getParameterNames().length == 1);
+ assertEquals(bm.getParameterNames()[0], "string");
+ assertEquals(bm.getParameterTypes()[0], "Ljava.lang.String;");
+ }
+ }
+ } finally {
+ removeLibrary(javaProject, jarName, srcName);
+ }
+}
+
+//Bug 406805 - [1.8] Parameter names for enum constructor not available
+//https://bugs.eclipse.org/bugs/show_bug.cgi?id=406805
+//Nested Enum Constructor
+public void test406805a() throws CoreException, IOException {
+ String contents1 =
+ "package test406805;\n" +
+ "public class X {\n" +
+ "}";
+ createFolder("/Converter18/src/test406805a");
+ createFile("/Converter18/src/test406805a/X.java", contents1);
+ this.workingCopy = getWorkingCopy(
+ "/Converter18/src/test406805a/X.java",
+ contents1,
+ true
+ );
+
+ String jarName = "getParameters.jar";
+ String srcName = "getParameters_src.zip";
+ final IJavaProject javaProject = this.workingCopy.getJavaProject();
+ try {
+ String[] contents = new String[] {
+ "NestedTestEnum.java",
+ "package test406805a;\n" +
+ "public class NestedTestEnum {\n" +
+ " public enum TestEnum {\n" +
+ " FirstValue(\"Zonk\") {\n" +
+ " @Override\n" +
+ " public String toString() {\n" +
+ " return super.toString();\n" +
+ " }\n" +
+ " },\n" +
+ " SecondValue(\"Bla\");\n" +
+ " String string;\n" +
+ " TestEnum(String string) {\n" +
+ " this.string = string;\n" +
+ " }\n" +
+ "}\n" +
+ "}"
+ };
+ addLibrary(javaProject, jarName, srcName, contents, JavaCore.VERSION_1_8, null);
+
+ ASTParser parser = ASTParser.newParser(AST.JLS8);
+ parser.setIgnoreMethodBodies(true);
+ parser.setProject(javaProject);
+ IType type = javaProject.findType("test406805a.NestedTestEnum");
+ IBinding[] bindings = parser.createBindings(new IJavaElement[] { type }, null);
+ ITypeBinding typeBinding = (ITypeBinding) bindings[0];
+
+ typeBinding = typeBinding.getDeclaredTypes()[0];
+ IMethodBinding[] methods = typeBinding.getDeclaredMethods();
+
+ for (int i = 0, length = methods.length; i < length; i++) {
+ IMethodBinding method = methods[i];
+ if (method.isConstructor()) {
+ ResolvedBinaryMethod bm = (ResolvedBinaryMethod) method.getJavaElement();
+ assertTrue(bm.getParameterNames().length == 1);
+ }
+ }
+ } finally {
+ removeLibrary(javaProject, jarName, srcName);
+ }
+}
+
+//Bug 406805 - [1.8] Parameter names for enum constructor not available
+//https://bugs.eclipse.org/bugs/show_bug.cgi?id=406805
+//Parameterized enum constructor.
+public void test406805b() throws CoreException, IOException {
+ String contents1 =
+ "package test406805b;\n" +
+ "public class X {\n" +
+ "}";
+ createFolder("/Converter18/src/test406805b");
+ createFile("/Converter18/src/test406805b/X.java", contents1);
+ this.workingCopy = getWorkingCopy(
+ "/Converter18/src/test406805b/X.java",
+ contents1,
+ true
+ );
+
+ String jarName = "getParameters.jar";
+ String srcName = "getParameters_src.zip";
+ final IJavaProject javaProject = this.workingCopy.getJavaProject();
+ try {
+ String[] contents = new String[] {
+ "TestEnum.java",
+ "package test406805b;\n" +
+ "interface A<T> {}\n" +
+ "\n" +
+ "class Y {\n" +
+ " static A<String> A1;\n" +
+ "}\n" +
+ "public enum TestEnum implements A<String> {\n" +
+ " FirstValue(Y.A1);\n" +
+ " A<String> xyzabcdef;\n" +
+ " TestEnum(A<String> abcdefghi) {\n" +
+ " this.xyzabcdef = abcdefghi;\n" +
+ " }\n" +
+ " int SecondValue() { return 0;}\n" +
+ "}\n"
+ };
+ addLibrary(javaProject, jarName, srcName, contents, JavaCore.VERSION_1_8);
+
+ ASTParser parser = ASTParser.newParser(AST.JLS8);
+ parser.setIgnoreMethodBodies(true);
+ parser.setProject(javaProject);
+ IType type = javaProject.findType("test406805b.TestEnum");
+ IBinding[] bindings = parser.createBindings(new IJavaElement[] { type }, null);
+ ITypeBinding typeBinding = (ITypeBinding) bindings[0];
+ IMethodBinding[] methods = typeBinding.getDeclaredMethods();
+
+ for (int i = 0, length = methods.length; i < length; i++) {
+ IMethodBinding method = methods[i];
+ if (method.isConstructor()) {
+ ResolvedBinaryMethod bm = (ResolvedBinaryMethod) method.getJavaElement();
+ assertTrue(bm.getParameterNames().length == 1);
+ }
+ }
+ } finally {
+ removeLibrary(javaProject, jarName, srcName);
+ }
+}
+//Bug 406805 - [1.8] Parameter names for enum constructor not available
+//https://bugs.eclipse.org/bugs/show_bug.cgi?id=406805
+//Testing types and names of parameters.
+public void test406805d() throws CoreException, IOException {
+ String contents1 =
+ "package test406805;\n" +
+ "public class X {\n" +
+ "}";
+ createFolder("/Converter18/src/test406805d");
+ createFile("/Converter18/src/test406805d/X.java", contents1);
+ this.workingCopy = getWorkingCopy(
+ "/Converter18/src/test406805d/X.java",
+ contents1,
+ true
+ );
+
+ String jarName = "getParameters.jar";
+ String srcName = "getParameters_src.zip";
+ final IJavaProject javaProject = this.workingCopy.getJavaProject();
+ try {
+ String[] contents = new String[] {
+ "NestedTestEnum.java",
+ "package test406805d;\n" +
+ "public class NestedTestEnum {\n" +
+ " public enum TestEnum {\n" +
+ " FirstValue(\"Zonk\", 1) {\n" +
+ " @Override\n" +
+ " public String toString() {\n" +
+ " return super.toString();\n" +
+ " }\n" +
+ " },\n" +
+ " SecondValue(\"Bla\", 2);\n" +
+ " String string;\n" +
+ " int xyz;\n" +
+ " TestEnum(String string, int xyz) {\n" +
+ " this.string = string;\n" +
+ " this.xyz = xyz;\n" +
+ " }\n" +
+ "}\n" +
+ "}"
+ };
+ addLibrary(javaProject, jarName, srcName, contents, JavaCore.VERSION_1_8, null);
+
+ ASTParser parser = ASTParser.newParser(AST.JLS8);
+ parser.setIgnoreMethodBodies(true);
+ parser.setProject(javaProject);
+ IType type = javaProject.findType("test406805d.NestedTestEnum");
+ IBinding[] bindings = parser.createBindings(new IJavaElement[] { type }, null);
+ ITypeBinding typeBinding = (ITypeBinding) bindings[0];
+
+ typeBinding = typeBinding.getDeclaredTypes()[0];
+ IMethodBinding[] methods = typeBinding.getDeclaredMethods();
+
+ for (int i = 0, length = methods.length; i < length; i++) {
+ IMethodBinding method = methods[i];
+ if (method.isConstructor()) {
+ ResolvedBinaryMethod bm = (ResolvedBinaryMethod) method.getJavaElement();
+ String[] parameterNames = bm.getParameterNames();
+ assertTrue(parameterNames.length == 2);
+ assertEquals(parameterNames[0], "string");
+ assertEquals(parameterNames[1], "xyz");
+ String[] parameterTypes = bm.getParameterTypes();
+ assertEquals(parameterTypes[0], "Ljava.lang.String;");
+ assertEquals(parameterTypes[1], "I");
+ }
+ }
+ } finally {
+ removeLibrary(javaProject, jarName, srcName);
+ }
+}
}
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/BinaryMethod.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/BinaryMethod.java
index 53c3883cb0..1ced5928f2 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/BinaryMethod.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/BinaryMethod.java
@@ -277,6 +277,8 @@ public String[] getParameterNames() throws JavaModelException {
if (declaringType.isMember()
&& !Flags.isStatic(declaringType.getFlags())) {
paramCount--; // remove synthetic argument from constructor param count
+ } else if (declaringType.isEnum()) {
+ paramCount -= 2;
}
}
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ClassFileInfo.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ClassFileInfo.java
index 65f2240a0a..44b3e4a307 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ClassFileInfo.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ClassFileInfo.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 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
@@ -251,23 +251,36 @@ private void generateMethodInfos(IType type, IBinaryType typeInfo, HashMap newEl
}
for (int i = 0, methodCount = methods.length; i < methodCount; i++) {
IBinaryMethod methodInfo = methods[i];
+ final boolean isConstructor = methodInfo.isConstructor();
+ boolean isEnum = false;
+ try {
+ isEnum = type.isEnum();
+ } catch (JavaModelException e) {
+ // ignore
+ }
// TODO (jerome) filter out synthetic members
// indexer should not index them as well
// if ((methodInfo.getModifiers() & IConstants.AccSynthetic) != 0) continue; // skip synthetic
boolean useGenericSignature = true;
char[] signature = methodInfo.getGenericSignature();
+ String[] pNames = null;
if (signature == null) {
useGenericSignature = false;
signature = methodInfo.getMethodDescriptor();
+ if (isEnum && isConstructor) {
+ pNames = Signature.getParameterTypes(new String(signature));
+ int length = pNames.length - 2;
+ System.arraycopy(pNames, 2, pNames = new String[length], 0, length);
+ }
}
String selector = new String(methodInfo.getSelector());
- final boolean isConstructor = methodInfo.isConstructor();
if (isConstructor) {
selector = type.getElementName();
}
- String[] pNames = null;
try {
- pNames = Signature.getParameterTypes(new String(signature));
+ if (!(isEnum && isConstructor && !useGenericSignature)) {
+ pNames = Signature.getParameterTypes(new String(signature));
+ }
if (isConstructor
&& useGenericSignature
&& type.isMember()
@@ -318,7 +331,7 @@ private void generateMethodInfos(IType type, IBinaryType typeInfo, HashMap newEl
int startIndex = 0;
try {
if (isConstructor) {
- if (type.isEnum()) {
+ if (isEnum) {
startIndex = 2;
} else if (type.isMember()
&& !Flags.isStatic(type.getFlags())) {

Back to the top