Skip to content

Commit a40dbce

Browse files
Korovliach
authored andcommitted
8374293: Jshell throws an error and crashes when using keyword Public
Reviewed-by: jlahoda
1 parent a3b1aa9 commit a40dbce

File tree

2 files changed

+13
-13
lines changed

2 files changed

+13
-13
lines changed

src/jdk.jshell/share/classes/jdk/jshell/SourceCodeAnalysisImpl.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2014, 2025, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2014, 2026, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -43,7 +43,6 @@
4343
import com.sun.source.tree.Scope;
4444
import com.sun.source.tree.Tree;
4545
import com.sun.source.tree.Tree.Kind;
46-
import static com.sun.source.tree.Tree.Kind.METHOD;
4746
import com.sun.source.tree.TypeParameterTree;
4847
import com.sun.source.tree.VariableTree;
4948
import com.sun.source.tree.YieldTree;
@@ -81,6 +80,7 @@
8180
import java.util.List;
8281
import java.util.Objects;
8382
import java.util.function.Predicate;
83+
import java.util.TreeSet;
8484

8585
import javax.lang.model.element.Element;
8686
import javax.lang.model.element.ElementKind;
@@ -114,7 +114,6 @@
114114
import java.util.NoSuchElementException;
115115
import java.util.Optional;
116116
import java.util.Set;
117-
import java.util.concurrent.Callable;
118117
import java.util.concurrent.ExecutorService;
119118
import java.util.concurrent.Executors;
120119
import java.util.function.BiConsumer;
@@ -149,14 +148,10 @@
149148
import javax.tools.StandardLocation;
150149

151150
import jdk.jshell.ExpressionToTypeInfo.ExpressionInfo;
152-
import static jdk.jshell.Util.REPL_DOESNOTMATTER_CLASS_NAME;
153151
import static jdk.jshell.SourceCodeAnalysis.Completeness.DEFINITELY_INCOMPLETE;
154152
import static jdk.jshell.TreeDissector.printType;
155153

156154
import static java.util.stream.Collectors.joining;
157-
import static javax.lang.model.element.ElementKind.CONSTRUCTOR;
158-
import static javax.lang.model.element.ElementKind.MODULE;
159-
import static javax.lang.model.element.ElementKind.PACKAGE;
160155

161156
import javax.lang.model.type.IntersectionType;
162157
import javax.lang.model.util.Elements;
@@ -815,7 +810,7 @@ public List<Highlight> highlights(String snippet) {
815810
};
816811
String wrappedCode = codeWrap.wrapped();
817812
return this.proc.taskFactory.analyze(codeWrap, task -> {
818-
List<Highlight> result = new ArrayList<>();
813+
TreeSet<Highlight> result = new TreeSet<>(Comparator.comparing(Highlight::start).thenComparing(Highlight::end));
819814
CompilationUnitTree cut = task.cuTrees().iterator().next();
820815
Trees trees = task.trees();
821816
SourcePositions sp = trees.getSourcePositions();
@@ -1050,8 +1045,7 @@ private Token findTokensBefore(long pos, TokenKind... expectedKinds) {
10501045
}
10511046
}.scan(cut, null);
10521047
result.removeIf(h -> h.start() == h.end());
1053-
Collections.sort(result, (h1, h2) -> h1.start() - h2.start());
1054-
return result;
1048+
return new ArrayList<>(result);
10551049
});
10561050
}
10571051

test/langtools/jdk/jshell/SnippetHighlightTest.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2022, 2026, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
2323

2424
/*
2525
* @test
26-
* @bug 8274148 8301580 8359497
26+
* @bug 8274148 8301580 8359497 8374293
2727
* @summary Check snippet highlighting
2828
* @library /tools/lib
2929
* @modules jdk.compiler/com.sun.tools.javac.api
@@ -122,6 +122,13 @@ public void testNoCrashOnLexicalErrors() { //JDK-8359497
122122
""");
123123
}
124124

125+
@Test // 8374293: The returned Highlights should not overlap
126+
public void testHighlightsOverlap() {
127+
assertHighlights("public void E test()", "Highlight[start=0, end=6, attributes=[KEYWORD]]",
128+
"Highlight[start=7, end=11, attributes=[KEYWORD]]",
129+
"Highlight[start=14, end=18, attributes=[DECLARATION]]");
130+
}
131+
125132
private void assertHighlights(String code, String... expected) {
126133
List<String> completions = computeHighlights(code);
127134
assertEquals(Arrays.asList(expected), completions, "Input: " + code + ", " + completions.toString());
@@ -134,7 +141,6 @@ private List<String> computeHighlights(String code) {
134141
getAnalysis().highlights(code);
135142
return highlights.stream()
136143
.map(h -> h.toString())
137-
.distinct()
138144
.collect(Collectors.toList());
139145
}
140146
}

0 commit comments

Comments
 (0)