Bug 573618 - [16] Adding a line/method breakpoint creates a class
breakpoint for record

Change-Id: I850f48970095a74aab36fc4b817a2ff254839256
Reviewed-on: https://git.eclipse.org/r/c/jdt/eclipse.jdt.debug/+/181096
Tested-by: JDT Bot <jdt-bot@eclipse.org>
Reviewed-by: Sarika Sinha <sarika.sinha@in.ibm.com>
diff --git a/org.eclipse.jdt.debug.tests/java16_/a/b/c/RecordTests.java b/org.eclipse.jdt.debug.tests/java16_/a/b/c/RecordTests.java
index c9a1186..2253759 100644
--- a/org.eclipse.jdt.debug.tests/java16_/a/b/c/RecordTests.java
+++ b/org.eclipse.jdt.debug.tests/java16_/a/b/c/RecordTests.java
@@ -12,7 +12,11 @@
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package a.b.c;
-record R(int i, String s) {}
+record R(int i, String s) {
+	R( int i){
+		this(i, "hello");
+	}
+}
 
 public class RecordTests {
 
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/RecordBreakpointTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/RecordBreakpointTests.java
index 4e651bd..c94095d 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/RecordBreakpointTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/RecordBreakpointTests.java
@@ -15,6 +15,7 @@
 
 import org.eclipse.jdt.core.IJavaProject;
 import org.eclipse.jdt.debug.core.IJavaClassPrepareBreakpoint;
+import org.eclipse.jdt.debug.core.IJavaLineBreakpoint;
 import org.eclipse.jdt.debug.tests.AbstractDebugTest;
 
 public class RecordBreakpointTests extends AbstractDebugTest {
@@ -30,6 +31,7 @@
 	protected IJavaProject getProjectContext() {
 		return get16_Project();
 	}
+
 	public void testRecordClassBreakpoint() throws Exception {
 
 		try {
@@ -43,4 +45,17 @@
 		}
 	}
 
+	public void testRecordLineBreakpoint() throws Exception {
+
+		try {
+			// create a classLoad breakpoint to test
+			IJavaLineBreakpoint lineBreakpoint = createLineBreakpoint(17, "a.b.c.RecordTests");
+			assertEquals("wrong type name", "a.b.c.RecordTests", lineBreakpoint.getTypeName());
+		} catch (Exception e) {
+			throw e;
+		} finally {
+			removeAllBreakpoints();
+		}
+	}
+
 }
diff --git a/org.eclipse.jdt.debug.ui/.settings/.api_filters b/org.eclipse.jdt.debug.ui/.settings/.api_filters
index 0d462e6..2a6baac 100644
--- a/org.eclipse.jdt.debug.ui/.settings/.api_filters
+++ b/org.eclipse.jdt.debug.ui/.settings/.api_filters
@@ -8,15 +8,6 @@
             </message_arguments>
         </filter>
     </resource>
-    <resource path="ui/org/eclipse/jdt/internal/debug/ui/actions/ToggleBreakpointAdapter.java" type="org.eclipse.jdt.internal.debug.ui.actions.ToggleBreakpointAdapter">
-        <filter comment="For Java 15" id="640712815">
-            <message_arguments>
-                <message_argument value="IType"/>
-                <message_argument value="ToggleBreakpointAdapter"/>
-                <message_argument value="isRecord()"/>
-            </message_arguments>
-        </filter>
-    </resource>
     <resource path="ui/org/eclipse/jdt/internal/debug/ui/classpath/ClasspathEntry.java" type="org.eclipse.jdt.internal.debug.ui.classpath.ClasspathEntry">
         <filter comment="Known illegal implementation" id="574619656">
             <message_arguments>
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ToggleBreakpointAdapter.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ToggleBreakpointAdapter.java
index afed9b4..8b131a6 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ToggleBreakpointAdapter.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ToggleBreakpointAdapter.java
@@ -1283,8 +1283,14 @@
 			if (e instanceof IMember) {
 				m = (IMember) e;
 			}
+			// Class breakpoint should be created if the offset was at the record component in the record definition
 			if (m != null && m.getParent() instanceof IType && ((IType) m.getParent()).isRecord()) {
-				m = (IMember) m.getParent();
+				if (m instanceof IField) {
+					IField field = (IField)m;
+					if (field.isRecordComponent()) {
+						m = (IMember) field.getParent();
+					}
+				}
 			}
 		}
 		if (m != null) {