Skip to content

Commit 94284b0

Browse files
Dedup the changed classes before hot reload (#345)
* Dedup the changed classes before hot reload Signed-off-by: Jinbo Wang <[email protected]> * Make checkstyle happy
1 parent c454a6f commit 94284b0

File tree

2 files changed

+37
-7
lines changed

2 files changed

+37
-7
lines changed

com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/JavaHotCodeReplaceProvider.java

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,9 @@
2626
import java.util.Collections;
2727
import java.util.HashMap;
2828
import java.util.Iterator;
29-
import java.util.LinkedHashSet;
3029
import java.util.List;
3130
import java.util.Map;
32-
import java.util.Set;
31+
import java.util.Objects;
3332
import java.util.concurrent.CompletableFuture;
3433
import java.util.function.Consumer;
3534
import java.util.logging.Level;
@@ -101,9 +100,9 @@ public class JavaHotCodeReplaceProvider implements IHotCodeReplaceProvider, IRes
101100

102101
private PublishSubject<HotCodeReplaceEvent> eventSubject = PublishSubject.<HotCodeReplaceEvent>create();
103102

104-
private Set<IResource> deltaResources = new LinkedHashSet<>();
103+
private List<IResource> deltaResources = new ArrayList<>();
105104

106-
private Set<String> deltaClassNames = new LinkedHashSet<>();
105+
private List<String> deltaClassNames = new ArrayList<>();
107106

108107
/**
109108
* Visitor for resource deltas.
@@ -290,8 +289,23 @@ public void resourceChanged(IResourceChangeEvent event) {
290289
List<IResource> resources = visitor.getChangedClassFiles();
291290
List<String> classNames = visitor.getQualifiedNamesList();
292291
synchronized (this) {
293-
deltaResources.addAll(resources);
294-
deltaClassNames.addAll(classNames);
292+
for (int i = 0; i < classNames.size(); i++) {
293+
String className = classNames.get(i);
294+
IResource resource = resources.get(i);
295+
boolean duplicate = false;
296+
for (int j = 0; j < deltaClassNames.size(); j++) {
297+
if (Objects.equals(deltaClassNames.get(j), className)
298+
&& JdtUtils.isSameFile(deltaResources.get(j), resource)) {
299+
duplicate = true;
300+
break;
301+
}
302+
}
303+
304+
if (!duplicate) {
305+
deltaClassNames.add(className);
306+
deltaResources.add(resource);
307+
}
308+
}
295309
}
296310
publishEvent(HotCodeReplaceEvent.EventType.BUILD_COMPLETE, "Build completed.");
297311
}
@@ -311,7 +325,7 @@ public CompletableFuture<List<String>> redefineClasses() {
311325
String errorMessage = null;
312326
synchronized (this) {
313327
classNames.addAll(deltaClassNames);
314-
errorMessage = doHotCodeReplace(new ArrayList<>(deltaResources), new ArrayList<>(deltaClassNames));
328+
errorMessage = doHotCodeReplace(deltaResources, deltaClassNames);
315329
deltaResources.clear();
316330
deltaClassNames.clear();
317331
}

com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/JdtUtils.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.util.Arrays;
1616
import java.util.LinkedHashSet;
1717
import java.util.List;
18+
import java.util.Objects;
1819
import java.util.Set;
1920

2021
import org.apache.commons.lang3.StringUtils;
@@ -399,4 +400,19 @@ private static String getTypeName(String genericTypeSignature) {
399400
}
400401
return name.toString();
401402
}
403+
404+
/**
405+
* Check whether two resources point to the same physical file.
406+
*/
407+
public static boolean isSameFile(IResource resource1, IResource resource2) {
408+
if (resource1 == null || resource2 == null) {
409+
return false;
410+
}
411+
412+
if (Objects.equals(resource1, resource2)) {
413+
return true;
414+
}
415+
416+
return Objects.equals(resource1.getLocation(), resource2.getLocation());
417+
}
402418
}

0 commit comments

Comments
 (0)