Merge remote-tracking branch 'origin/master' into BETA_JAVA16

Change-Id: Ic42cbd3cb4ca7a222114d04dce31564cbe7ac2e1
diff --git a/org.eclipse.jdt.debug.ui/plugin.xml b/org.eclipse.jdt.debug.ui/plugin.xml
index 877e24c..86091ad 100644
--- a/org.eclipse.jdt.debug.ui/plugin.xml
+++ b/org.eclipse.jdt.debug.ui/plugin.xml
@@ -1258,10 +1258,7 @@
             id="org.eclipse.jdt.debug.ui.MethodBreakpointActions">
          <visibility>
             <and>
-	            	   <not>
-	                  <objectState name="MemberActionFilter" value="isAbstract"/>
-	               </not>
-	               <not>
+	            <not>
    	               <objectState name="MemberActionFilter" value="isInterface"/>
    	            </not>
                 <not>
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDebugOptionsManager.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDebugOptionsManager.java
index d1fe3b7..75e5e4d 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDebugOptionsManager.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDebugOptionsManager.java
@@ -485,14 +485,7 @@
 		if (list == null) {
 			return ""; //$NON-NLS-1$
 		}
-		StringBuilder buffer = new StringBuilder();
-		for (int i = 0; i < list.length; i++) {
-			if (i > 0) {
-				buffer.append(',');
-			}
-			buffer.append(list[i]);
-		}
-		return buffer.toString();
+		return String.join(String.valueOf(','), list);
 	}
 
 	/**
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/MemberActionFilter.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/MemberActionFilter.java
index 7bfd30c..8e63317 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/MemberActionFilter.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/MemberActionFilter.java
@@ -41,12 +41,6 @@
 		if (name.equals("MemberActionFilter")) { //$NON-NLS-1$
 			if (target instanceof IMember) {
 				IMember member = (IMember) target;
-				if (value.equals("isAbstract")) { //$NON-NLS-1$
-					try {
-						return Flags.isAbstract(member.getFlags());
-					} catch (JavaModelException e) {
-					}
-				}
 				if (value.equals("isRemote")) { //$NON-NLS-1$
 					IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
 					if(window != null) {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RulerToggleTracepointActionDelegate.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RulerToggleTracepointActionDelegate.java
index 6edd6a7..fbc6c44 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RulerToggleTracepointActionDelegate.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/RulerToggleTracepointActionDelegate.java
@@ -13,28 +13,25 @@
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.ui.actions;
 
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.NotEnabledException;
-import org.eclipse.core.commands.NotHandledException;
-import org.eclipse.core.commands.common.NotDefinedException;
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.debug.internal.ui.DebugUIPlugin;
 import org.eclipse.jface.action.Action;
 import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.TextSelection;
 import org.eclipse.jface.text.source.IVerticalRulerInfo;
 import org.eclipse.swt.widgets.Event;
 import org.eclipse.ui.IActionDelegate2;
 import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.handlers.IHandlerService;
 import org.eclipse.ui.texteditor.AbstractRulerActionDelegate;
+import org.eclipse.ui.texteditor.IDocumentProvider;
 import org.eclipse.ui.texteditor.ITextEditor;
 
 public class RulerToggleTracepointActionDelegate extends AbstractRulerActionDelegate implements IActionDelegate2 {
 
-	private static final String TOGGLE_TRACEPOINT_COMMAND = "org.eclipse.jdt.debug.ui.commands.ToggleTracepoint"; //$NON-NLS-1$
 	private IEditorPart currentEditor;
 	private IAction dummyAction;
 
@@ -64,19 +61,47 @@
 
 	@Override
 	public void runWithEvent(IAction action, Event event) {
-		if (currentEditor == null) {
+		if (!(currentEditor instanceof ITextEditor)) {
 			return;
 		}
-		IWorkbenchPartSite partSite = currentEditor.getSite();
-		IHandlerService hservice = partSite.getService(IHandlerService.class);
-		ICommandService cservice = partSite.getService(ICommandService.class);
+		IVerticalRulerInfo rulerInfo = currentEditor.getAdapter(IVerticalRulerInfo.class);
+		if (rulerInfo == null) {
+			return;
+		}
+		int lineOfLastMouseButtonActivity = rulerInfo.getLineOfLastMouseButtonActivity();
+		if (lineOfLastMouseButtonActivity < 0) {
+			return;
+		}
+		IDocument document = getDocument((ITextEditor) currentEditor);
+		if (document == null) {
+			return;
+		}
+		ToggleBreakpointAdapter toggle = new ToggleBreakpointAdapter();
 		try {
-			Command command = cservice.getCommand(TOGGLE_TRACEPOINT_COMMAND);
-			ExecutionEvent exevent = hservice.createExecutionEvent(command, event);
-			command.executeWithChecks(exevent);
-		} catch (ExecutionException | NotDefinedException | NotEnabledException | NotHandledException e) {
+			ITextSelection selection = getTextSelection(document, lineOfLastMouseButtonActivity);
+			if (toggle.canToggleLineBreakpoints(currentEditor, selection)) {
+				BreakpointToggleUtils.setUnsetTracepoints(true);
+				toggle.toggleBreakpoints(currentEditor, selection);
+			}
+		} catch (BadLocationException | CoreException e) {
 			DebugUIPlugin.log(e);
 		}
 	}
 
+	private static IDocument getDocument(ITextEditor editor) {
+		IDocumentProvider provider = editor.getDocumentProvider();
+		if (provider != null) {
+			return provider.getDocument(editor.getEditorInput());
+		}
+		IDocument doc = editor.getAdapter(IDocument.class);
+		if (doc != null) {
+			return doc;
+		}
+		return null;
+	}
+
+	private static ITextSelection getTextSelection(IDocument document, int line) throws BadLocationException {
+		IRegion region = document.getLineInformation(line);
+		return new TextSelection(document, region.getOffset(), 0);
+	}
 }
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 1487edb..6802a03 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
@@ -1615,10 +1615,8 @@
 		IDocument document = documentProvider.getDocument(editor.getEditorInput());
 		try {
 			IRegion line = document.getLineInformation(textSelection.getStartLine() + 1);
-			Point selectedRange = viewer.getSelectedRange();
-			viewer.setSelectedRange(selectedRange.x, 0);
+			Point selectedRange = new Point(textSelection.getOffset(), textSelection.getLength());
 			statementEngine.complete(viewer, selectedRange, line.getOffset(), cunit);
-			viewer.setSelectedRange(selectedRange.x, selectedRange.y);
 			TemplateProposal[] templateProposals = statementEngine.getResults();
 			for (TemplateProposal templateProposal : templateProposals) {
 				Template template = templateProposal.getTemplate();
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/VMDetailsDialog.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/VMDetailsDialog.java
index cbde802..3b5d3d8 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/VMDetailsDialog.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/jres/VMDetailsDialog.java
@@ -86,14 +86,7 @@
 		} else {
 			String[] args = fVM.getVMArguments();
 			if (args != null) {
-				StringBuilder buf = new StringBuilder();
-				for (int i = 0; i < args.length; i++) {
-					buf.append(args[i]);
-					if (i < (args.length - 1)) {
-						buf.append(" "); //$NON-NLS-1$
-					}
-				}
-				text = buf.toString();
+				text = String.join(" ", args); //$NON-NLS-1$
 			}
 		}
 		if (text == null) {
diff --git a/org.eclipse.jdt.debug/META-INF/MANIFEST.MF b/org.eclipse.jdt.debug/META-INF/MANIFEST.MF
index f4eb3af..f91b54d 100644
--- a/org.eclipse.jdt.debug/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.debug/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.jdt.debug; singleton:=true
-Bundle-Version: 3.17.0.qualifier
+Bundle-Version: 3.17.100.qualifier
 Bundle-ClassPath: jdimodel.jar,
  tools.jar
 Bundle-Activator: org.eclipse.jdt.internal.debug.core.JDIDebugPlugin
diff --git a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/RemoteEvaluatorBuilder.java b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/RemoteEvaluatorBuilder.java
index e6a77df..9c81676 100644
--- a/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/RemoteEvaluatorBuilder.java
+++ b/org.eclipse.jdt.debug/eval/org/eclipse/jdt/internal/debug/eval/RemoteEvaluatorBuilder.java
@@ -157,14 +157,7 @@
 	}
 
 	private static String makeClassName(String[] names) {
-		StringBuilder sb = new StringBuilder();
-		for (int j = 0; j < names.length; j++) {
-			if (j > 0) {
-				sb.append('/');
-			}
-			sb.append(names[j]);
-		}
-		return sb.toString();
+		return String.join(String.valueOf('/'), names);
 	}
 
 	public List<String> getVariableTypeNames() {
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpCommandPacket.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpCommandPacket.java
index 68e99ae..4d4194a 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpCommandPacket.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/jdwp/JdwpCommandPacket.java
@@ -234,7 +234,7 @@
 	@Override
 	protected int readSpecificHeaderFields(byte[] bytes, int index) {
 		byte commandSet = bytes[index];
-		fCommand = bytes[index + 1] + (commandSet << 8);
+		fCommand = (bytes[index + 1] & 0xff) + (commandSet << 8);
 		return 2;
 	}
 
@@ -264,8 +264,9 @@
 		for (Field field : fields) {
 			if ((field.getModifiers() & Modifier.PUBLIC) == 0
 					|| (field.getModifiers() & Modifier.STATIC) == 0
-					|| (field.getModifiers() & Modifier.FINAL) == 0)
+					|| (field.getModifiers() & Modifier.FINAL) == 0) {
 				continue;
+			}
 
 			try {
 				String name = field.getName();
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/spy/JdwpCommandPacket.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/spy/JdwpCommandPacket.java
index 7abda70..f6bad5a 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/spy/JdwpCommandPacket.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/spy/JdwpCommandPacket.java
@@ -227,7 +227,7 @@
 	protected void readSpecificHeaderFields(DataInputStream dataInStream)
 			throws IOException {
 		byte commandSet = dataInStream.readByte();
-		fCommand = dataInStream.readByte() + (commandSet << 8);
+		fCommand = (dataInStream.readByte() & 0xff) + (commandSet << 8);
 	}
 
 	/**
@@ -255,8 +255,9 @@
 		for (Field field : fields) {
 			if ((field.getModifiers() & Modifier.PUBLIC) == 0
 					|| (field.getModifiers() & Modifier.STATIC) == 0
-					|| (field.getModifiers() & Modifier.FINAL) == 0)
+					|| (field.getModifiers() & Modifier.FINAL) == 0) {
 				continue;
+			}
 
 			try {
 				String name = field.getName();
diff --git a/org.eclipse.jdt.debug/pom.xml b/org.eclipse.jdt.debug/pom.xml
index e6b4d82..14f9e6a 100644
--- a/org.eclipse.jdt.debug/pom.xml
+++ b/org.eclipse.jdt.debug/pom.xml
@@ -18,6 +18,6 @@
   </parent>
   <groupId>org.eclipse.jdt</groupId>
   <artifactId>org.eclipse.jdt.debug</artifactId>
-  <version>3.17.0-SNAPSHOT</version>
+  <version>3.17.100-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVMRunner.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVMRunner.java
index fea720b..0f89647 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVMRunner.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/StandardVMRunner.java
@@ -535,14 +535,7 @@
 		if (cmdDetails.getEnvp() != null) {
 			String[] envp = cmdDetails.getEnvp();
 			Arrays.sort(envp);
-			StringBuilder buff = new StringBuilder();
-			for (int i = 0; i < envp.length; i++) {
-				buff.append(envp[i]);
-				if(i < envp.length-1) {
-					buff.append('\n');
-				}
-			}
-			process.setAttribute(DebugPlugin.ATTR_ENVIRONMENT, buff.toString());
+			process.setAttribute(DebugPlugin.ATTR_ENVIRONMENT, String.join(String.valueOf('\n'), envp));
 		}
 		if (!cmdDetails.getClasspathShortener().getProcessTempFiles().isEmpty()
 				|| !cmdDetails.getCommandLineShortener().getProcessTempFiles().isEmpty()) {
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/JavaRuntime.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/JavaRuntime.java
index a9d632d..904806f 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/JavaRuntime.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/launching/JavaRuntime.java
@@ -3127,14 +3127,7 @@
 	 * @since 3.1
 	 */
 	public static IClasspathAttribute newLibraryPathsAttribute(String[] paths) {
-		StringBuilder value = new StringBuilder();
-		for (int i = 0; i < paths.length; i++) {
-			value.append(paths[i]);
-			if (i < (paths.length - 1)) {
-				value.append("|"); //$NON-NLS-1$
-			}
-		}
-		return JavaCore.newClasspathAttribute(CLASSPATH_ATTR_LIBRARY_PATH_ENTRY, value.toString());
+		return JavaCore.newClasspathAttribute(CLASSPATH_ATTR_LIBRARY_PATH_ENTRY, String.join("|", paths)); //$NON-NLS-1$
 	}
 
 	/**