diff options
author | Shankha Banerjee | 2014-05-20 10:51:34 +0000 |
---|---|---|
committer | Manoj Palat | 2014-05-20 10:51:34 +0000 |
commit | 0a0c65dd1c0bd06d4f10a0a8165667bb0b6d1700 (patch) | |
tree | cdf749dbf55214fc79c206e4bde8084a7620b662 | |
parent | 35479e92cf76ddb81a077e36ac9bcdd2a30c6978 (diff) | |
download | eclipse.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>
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())) { |