2424 */
2525package jdk .jshell ;
2626
27- import java .util .ArrayList ;
28- import java .util .Collection ;
29- import java .util .Collections ;
30- import java .util .List ;
31- import java .util .Locale ;
27+ import java .util .*;
3228import java .util .regex .Matcher ;
3329import java .util .regex .Pattern ;
3430import java .util .stream .Collectors ;
3531import javax .lang .model .element .Modifier ;
32+ import javax .lang .model .element .Name ;
33+
3634import com .sun .source .tree .ArrayTypeTree ;
3735import com .sun .source .tree .AssignmentTree ;
3836import com .sun .source .tree .ClassTree ;
4947import java .io .IOException ;
5048import java .io .StringWriter ;
5149import java .io .Writer ;
52- import java .util .Arrays ;
53- import java .util .LinkedHashSet ;
54- import java .util .Set ;
50+
5551import jdk .jshell .ExpressionToTypeInfo .ExpressionInfo ;
5652import jdk .jshell .ExpressionToTypeInfo .ExpressionInfo .AnonymousDescription ;
5753import jdk .jshell .ExpressionToTypeInfo .ExpressionInfo .AnonymousDescription .VariableDesc ;
@@ -304,6 +300,7 @@ private List<Snippet> processVariables(String userSource, List<? extends Tree> u
304300 for (Tree unitTree : units ) {
305301 VariableTree vt = (VariableTree ) unitTree ;
306302 String name = vt .getName ().toString ();
303+ // String name = userReadableName(vt.getName(), compileSource);
307304 String typeName ;
308305 String fullTypeName ;
309306 String displayType ;
@@ -400,13 +397,18 @@ private List<Snippet> processVariables(String userSource, List<? extends Tree> u
400397 winit = Wrap .simpleWrap (sinit );
401398 subkind = SubKind .VAR_DECLARATION_SUBKIND ;
402399 }
400+ Wrap wname ;
403401 int nameStart = compileSource .lastIndexOf (name , nameMax );
404402 if (nameStart < 0 ) {
405- throw new AssertionError ("Name '" + name + "' not found" );
403+ // the name has been transformed (e.g. unicode).
404+ // Use it directly
405+ wname = Wrap .identityWrap (name );
406+ } else {
407+ int nameEnd = nameStart + name .length ();
408+ Range rname = new Range (nameStart , nameEnd );
409+ wname = new Wrap .RangeWrap (compileSource , rname );
406410 }
407- int nameEnd = nameStart + name .length ();
408- Range rname = new Range (nameStart , nameEnd );
409- Wrap guts = Wrap .varWrap (compileSource , typeWrap , sbBrackets .toString (), rname ,
411+ Wrap guts = Wrap .varWrap (compileSource , typeWrap , sbBrackets .toString (), wname ,
410412 winit , enhancedDesugaring , anonDeclareWrap );
411413 DiagList modDiag = modifierDiagnostics (vt .getModifiers (), dis , true );
412414 Snippet snip = new VarSnippet (state .keyMap .keyForVariable (name ), userSource , guts ,
@@ -417,6 +419,26 @@ private List<Snippet> processVariables(String userSource, List<? extends Tree> u
417419 return snippets ;
418420 }
419421
422+ private String userReadableName (Name nn , String compileSource ) {
423+ String s = nn .toString ();
424+ if (s .length () > 0 && Character .isJavaIdentifierStart (s .charAt (0 )) && compileSource .contains (s )) {
425+ return s ;
426+ }
427+ String l = nameInUnicode (nn , false );
428+ if (compileSource .contains (l )) {
429+ return l ;
430+ }
431+ return nameInUnicode (nn , true );
432+ }
433+
434+ private String nameInUnicode (Name nn , boolean upper ) {
435+ return nn .codePoints ()
436+ .mapToObj (cp -> (cp > 0x7F )
437+ ? String .format (upper ? "\\ u%04X" : "\\ u%04x" , cp )
438+ : "" + (char ) cp )
439+ .collect (Collectors .joining ());
440+ }
441+
420442 /**Convert anonymous classes in "init" to member classes, based
421443 * on the additional information from ExpressionInfo.anonymousClasses.
422444 *
@@ -680,6 +702,7 @@ private List<Snippet> processClass(String userSource, Tree unitTree, String comp
680702 TreeDissector dis = TreeDissector .createByFirstClass (pt );
681703
682704 ClassTree klassTree = (ClassTree ) unitTree ;
705+ // String name = userReadableName(klassTree.getSimpleName(), compileSource);
683706 String name = klassTree .getSimpleName ().toString ();
684707 DiagList modDiag = modifierDiagnostics (klassTree .getModifiers (), dis , false );
685708 TypeDeclKey key = state .keyMap .keyForClass (name );
@@ -730,6 +753,7 @@ private List<Snippet> processMethod(String userSource, Tree unitTree, String com
730753 final TreeDissector dis = TreeDissector .createByFirstClass (pt );
731754
732755 final MethodTree mt = (MethodTree ) unitTree ;
756+ //String name = userReadableName(mt.getName(), compileSource);
733757 final String name = mt .getName ().toString ();
734758 if (objectMethods .contains (name )) {
735759 // The name matches a method on Object, short of an overhaul, this
0 commit comments