diff --git a/org.eclipse.jdt.core.javac/src/org/eclipse/jdt/core/dom/JavacConverter.java b/org.eclipse.jdt.core.javac/src/org/eclipse/jdt/core/dom/JavacConverter.java index bf1e08ba460..0011bb044d1 100644 --- a/org.eclipse.jdt.core.javac/src/org/eclipse/jdt/core/dom/JavacConverter.java +++ b/org.eclipse.jdt.core.javac/src/org/eclipse/jdt/core/dom/JavacConverter.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2023, Red Hat, Inc. and others. + * Copyright (c) 2023, 2024 Red Hat, Inc. and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -129,6 +129,10 @@ CompilationUnit convertCompilationUnit() { return convertCompilationUnit(this.javacCompilationUnit); } + CompilationUnit convertCompilationUnit() { + return convertCompilationUnit(this.javacCompilationUnit); + } + CompilationUnit convertCompilationUnit(JCCompilationUnit javacCompilationUnit) { CompilationUnit res = this.ast.newCompilationUnit(); populateCompilationUnit(res, javacCompilationUnit); @@ -432,6 +436,35 @@ private ASTNode convertMethodInAnnotationTypeDecl(JCMethodDecl javac, ASTNode pa } return res; } + + private String getNodeName(ASTNode node) { + if( node instanceof AbstractTypeDeclaration atd) { + return atd.getName().toString(); + } + if( node instanceof EnumDeclaration ed) { + return ed.getName().toString(); + } + return null; + } + + private String getMethodDeclName(JCMethodDecl javac, ASTNode parent) { + String name = javac.getName().toString(); + boolean javacIsConstructor = Objects.equals(javac.getName(), Names.instance(this.context).init); + if( javacIsConstructor) { + // sometimes javac mistakes a method with no return type as a constructor + String parentName = getNodeName(parent); + String tmpString1 = this.rawText.substring(javac.pos); + int openParen = tmpString1.indexOf("("); + if( openParen != -1 ) { + String methodName = tmpString1.substring(0, openParen).trim(); + if( !methodName.equals(parentName)) { + return methodName; + } + } + return parentName; + } + return name; + } private String getNodeName(ASTNode node) { if( node instanceof AbstractTypeDeclaration atd) { diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterBugsTestSetup.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterBugsTestSetup.java new file mode 100644 index 00000000000..5d251cffe4b --- /dev/null +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterBugsTestSetup.java @@ -0,0 +1,124 @@ +/******************************************************************************* + * Copyright (c) 2024 IBM Corporation and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.jdt.core.tests.dom; + +import java.util.Map; + +import org.eclipse.jdt.core.IClassFile; +import org.eclipse.jdt.core.ICompilationUnit; +import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.WorkingCopyOwner; +import org.eclipse.jdt.core.dom.ASTNode; +import org.eclipse.jdt.core.dom.ASTParser; +import org.eclipse.jdt.core.dom.ASTRequestor; +import org.eclipse.jdt.core.dom.IAnnotationBinding; +import org.eclipse.jdt.core.dom.IMethodBinding; +import org.eclipse.jdt.core.dom.ITypeBinding; + +import junit.framework.Test; + +@SuppressWarnings("rawtypes") +public class ASTConverterBugsTestSetup extends ConverterTestSetup { + +@Override +public void setUpSuite() throws Exception { +// PROJECT_SETUP = true; // do not copy Converter* directories + super.setUpSuite(); +// setUpJCLClasspathVariables("1.5"); + waitUntilIndexesReady(); +} + +public ASTConverterBugsTestSetup(String name) { + super(name); +} + +public static Test suite() { + return buildModelTestSuite(ASTConverterBugsTestSetup.class); +} + +protected void checkParameterAnnotations(String message, String expected, IMethodBinding methodBinding) { + ITypeBinding[] parameterTypes = methodBinding.getParameterTypes(); + int size = parameterTypes == null ? 0 : parameterTypes.length; + StringBuilder buffer = new StringBuilder(); + for (int i=0; i options, boolean resolveBindings) { + return runConversion(this.testLevel, source, unitName, project, options, resolveBindings); +} +@Override +public ASTNode runConversion(char[] source, String unitName, IJavaProject project, Map options) { + return runConversion(this.testLevel, source, unitName, project, options); +} + +public ASTNode runConversion( + ICompilationUnit unit, + boolean resolveBindings, + boolean statementsRecovery, + boolean bindingsRecovery) { + ASTParser parser = createASTParser(); + parser.setSource(unit); + parser.setResolveBindings(resolveBindings); + parser.setStatementsRecovery(statementsRecovery); + parser.setBindingsRecovery(bindingsRecovery); + parser.setWorkingCopyOwner(this.wcOwner); + return parser.createAST(null); +} + +@Override +protected void resolveASTs(ICompilationUnit[] cus, String[] bindingKeys, ASTRequestor requestor, IJavaProject project, WorkingCopyOwner owner) { + ASTParser parser = createASTParser(); + parser.setResolveBindings(true); + parser.setProject(project); + parser.setWorkingCopyOwner(owner); + parser.createASTs(cus, bindingKeys, requestor, null); +} +} diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/JavacASTConverterBugsTestJLS.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/JavacASTConverterBugsTestJLS.java new file mode 100644 index 00000000000..680526c4320 --- /dev/null +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/JavacASTConverterBugsTestJLS.java @@ -0,0 +1,101 @@ +/******************************************************************************* + * Copyright (c) 2024 IBM Corporation and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.jdt.core.tests.dom; + +import java.io.IOException; +import java.util.List; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.jdt.core.ICompilationUnit; +import org.eclipse.jdt.core.dom.AST; + +import junit.framework.Test; +import junit.framework.TestSuite; + +/** + * Test suite to verify that DOM/AST bugs are fixed. + * + * Note that only specific JLS8 tests are defined in this test suite, but when + * running it, all superclass {@link ASTConverterBugsTest} tests will be run + * as well. + */ +@SuppressWarnings("rawtypes") +public class JavacASTConverterBugsTestJLS extends ASTConverterBugsTestSetup { + public JavacASTConverterBugsTestJLS(String name) { + super(name); + this.testLevel = AST.getJLSLatest(); + } + + public static Test suite() { + TestSuite suite = new Suite(JavacASTConverterBugsTestJLS.class.getName()); + List tests = buildTestsList(JavacASTConverterBugsTestJLS.class, 1, 0/* do not sort*/); + for (int index=0, size=tests.size(); index