# HG changeset patch # User sundar # Date 1440420922 -19800 # Node ID 9379e33273fe6faddfc7eb9f7fc8955bcec38482 # Parent 105d0051d37b3749724cb3dac4da03338105d6d8 8134309: load call argument completion could be done with file chooser Reviewed-by: attila, hannesw diff -r 105d0051d37b -r 9379e33273fe src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/NashornCompleter.java --- a/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/NashornCompleter.java Mon Aug 24 16:25:40 2015 +0530 +++ b/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/NashornCompleter.java Mon Aug 24 18:25:22 2015 +0530 @@ -25,10 +25,13 @@ package jdk.nashorn.tools.jjs; +import java.io.File; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; +import javax.swing.JFileChooser; +import javax.swing.filechooser.FileNameExtensionFilter; import jdk.internal.jline.console.completer.Completer; import jdk.internal.jline.console.UserInterruptException; import jdk.nashorn.api.tree.AssignmentTree; @@ -67,6 +70,7 @@ private final PartialParser partialParser; private final PropertiesHelper propsHelper; private final Parser parser; + private static final boolean BACKSLASH_FILE_SEPARATOR = File.separatorChar == '\\'; NashornCompleter(final Context context, final Global global, final PartialParser partialParser, final PropertiesHelper propsHelper) { @@ -182,6 +186,9 @@ // but property name missing pattern. private static final Pattern SELECT_PROP_MISSING = Pattern.compile(".*\\.\\s*"); + // Pattern to match load call + private static final Pattern LOAD_CALL = Pattern.compile("\\s*load\\s*\\(\\s*"); + @Override public int complete(final String test, final int cursor, final List result) { // check that cursor is at the end of test string. Do not complete in the middle! @@ -210,6 +217,23 @@ final ExpressionTree topExpr = getTopLevelExpression(parser, completeExpr); if (topExpr == null) { + // special case for load call that looks like "load(" with optional whitespaces + if (LOAD_CALL.matcher(test).matches()) { + // throw a file dialog box + final JFileChooser chooser = new JFileChooser(); + chooser.setFileFilter(new FileNameExtensionFilter("JavaScript Files", "js")); + int retVal = chooser.showOpenDialog(null); + if (retVal == JFileChooser.APPROVE_OPTION) { + String name = chooser.getSelectedFile().getAbsolutePath(); + // handle '\' file separator + if (BACKSLASH_FILE_SEPARATOR) { + name = name.replace("\\", "\\\\"); + } + result.add("\"" + name + "\")"); + return cursor + name.length() + 3; + } + } + // did not parse to be a top level expression, no suggestions! return cursor; }