diff --git a/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/LaunchRequestHandler.java b/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/LaunchRequestHandler.java index 506bce6be..5830e7691 100644 --- a/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/LaunchRequestHandler.java +++ b/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/LaunchRequestHandler.java @@ -258,7 +258,7 @@ protected CompletableFuture launch(LaunchArguments launchArguments, Re return resultFuture; } - private static final Pattern STACKTRACE_PATTERN = Pattern.compile("\\s+at\\s+([\\w$\\.]+\\/)?(([\\w$]+\\.)*[\\w$]+)\\(([\\w-$]+\\.java:\\d+)\\)"); + private static final Pattern STACKTRACE_PATTERN = Pattern.compile("\\s+at\\s+([\\w$\\.]+\\/)?(([\\w$]+\\.)+[<\\w$>]+)\\(([\\w-$]+\\.java:\\d+)\\)"); private static OutputEvent convertToOutputEvent(String message, Category category, IDebugAdapterContext context) { Matcher matcher = STACKTRACE_PATTERN.matcher(message); diff --git a/com.microsoft.java.debug.plugin/plugin.xml b/com.microsoft.java.debug.plugin/plugin.xml index cd999ab09..361cdcbda 100644 --- a/com.microsoft.java.debug.plugin/plugin.xml +++ b/com.microsoft.java.debug.plugin/plugin.xml @@ -19,6 +19,7 @@ + diff --git a/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/JavaDebugDelegateCommandHandler.java b/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/JavaDebugDelegateCommandHandler.java index d3d2bf835..032d0420c 100644 --- a/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/JavaDebugDelegateCommandHandler.java +++ b/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/JavaDebugDelegateCommandHandler.java @@ -46,6 +46,7 @@ public class JavaDebugDelegateCommandHandler implements IDelegateCommandHandler public static final String RESOLVE_JAVA_EXECUTABLE = "vscode.java.resolveJavaExecutable"; public static final String FETCH_PLATFORM_SETTINGS = "vscode.java.fetchPlatformSettings"; public static final String RESOLVE_CLASSFILTERS = "vscode.java.resolveClassFilters"; + public static final String RESOLVE_SOURCEURI = "vscode.java.resolveSourceUri"; @Override public Object executeCommand(String commandId, List arguments, IProgressMonitor progress) throws Exception { @@ -87,6 +88,8 @@ public Object executeCommand(String commandId, List arguments, IProgress return PlatformSettings.getPlatformSettings(); case RESOLVE_CLASSFILTERS: return JavaClassFilter.resolveClassFilters(arguments); + case RESOLVE_SOURCEURI: + return ResolveSourceMappingHandler.resolveSourceUri(arguments); default: break; } diff --git a/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/JdtSourceLookUpProvider.java b/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/JdtSourceLookUpProvider.java index 4fbe32b17..65ba6074a 100644 --- a/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/JdtSourceLookUpProvider.java +++ b/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/JdtSourceLookUpProvider.java @@ -178,14 +178,7 @@ public String getSourceFileURI(String fullyQualifiedName, String sourcePath) { if (sourceElement instanceof IResource) { return getFileURI((IResource) sourceElement); } else if (sourceElement instanceof IClassFile) { - try { - IClassFile file = (IClassFile) sourceElement; - if (file.getBuffer() != null) { - return getFileURI(file); - } - } catch (JavaModelException e) { - // do nothing. - } + return getFileURI((IClassFile) sourceElement); } return null; } diff --git a/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/ResolveSourceMappingHandler.java b/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/ResolveSourceMappingHandler.java new file mode 100644 index 000000000..456474141 --- /dev/null +++ b/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/ResolveSourceMappingHandler.java @@ -0,0 +1,53 @@ +/******************************************************************************* + * Copyright (c) 2020 Microsoft 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Microsoft Corporation - initial API and implementation +*******************************************************************************/ + +package com.microsoft.java.debug.plugin.internal; + +import java.io.File; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.lang3.StringUtils; + +public class ResolveSourceMappingHandler { + private static final Pattern SOURCE_PATTERN = Pattern.compile("([\\w$\\.]+\\/)?(([\\w$]+\\.)+[<\\w$>]+)\\(([\\w-$]+\\.java:\\d+)\\)"); + private static final JdtSourceLookUpProvider sourceProvider = new JdtSourceLookUpProvider(); + + public static String resolveSourceUri(List arguments) { + if (arguments == null || arguments.isEmpty()) { + return null; + } + + return resolveSourceUri((String) arguments.get(0)); + } + + public static String resolveSourceUri(String lineText) { + if (lineText == null) { + return null; + } + + Matcher matcher = SOURCE_PATTERN.matcher(lineText); + if (matcher.find()) { + String methodField = matcher.group(2); + String locationField = matcher.group(matcher.groupCount()); + String fullyQualifiedName = methodField.substring(0, methodField.lastIndexOf(".")); + String packageName = fullyQualifiedName.lastIndexOf(".") > -1 ? fullyQualifiedName.substring(0, fullyQualifiedName.lastIndexOf(".")) : ""; + String[] locations = locationField.split(":"); + String sourceName = locations[0]; + String sourcePath = StringUtils.isBlank(packageName) ? sourceName + : packageName.replace('.', File.separatorChar) + File.separatorChar + sourceName; + return sourceProvider.getSourceFileURI(fullyQualifiedName, sourcePath); + } + + return null; + } +}