src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/resources/jjs.js
author sundar
Mon, 06 Nov 2017 22:05:53 +0530
changeset 47704 38aa08d2ec6c
permissions -rw-r--r--
8190795: jjs should show javadoc for java methods on shift-tab Reviewed-by: hannesw, jlaskey
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
47704
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
     1
/*
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
     2
 * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
     4
 *
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    10
 *
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    15
 * accompanied this code).
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    16
 *
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    20
 *
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    23
 * questions.
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    24
 */
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    25
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    26
(function () {
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    27
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    28
// Check if java.desktop module is available and we're running in non-headless mode.
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    29
// We access AWT via script to avoid direct dependency on java.desktop module.
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    30
function isHeadless() {
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    31
    var GraphicsEnvironment = java.awt.GraphicsEnvironment;
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    32
    return Java.isType(GraphicsEnvironment)? GraphicsEnvironment.isHeadless() : true;
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    33
}
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    34
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    35
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    36
// Function that shows a JFileChooser dialog and returns the file name chosen (if chosen).
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    37
// We access swing from script to avoid direct dependency on java.desktop module.
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    38
function chooseFile() {
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    39
    var JFileChooser = javax.swing.JFileChooser;
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    40
    if (!Java.isType(JFileChooser)) {
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    41
        return null;
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    42
    }
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    43
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    44
    var ExtensionFilter = javax.swing.filechooser.FileNameExtensionFilter;
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    45
    function run() {
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    46
        var chooser = new JFileChooser();
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    47
        chooser.fileFilter = new ExtensionFilter('JavaScript Files', 'js');
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    48
        var retVal = chooser.showOpenDialog(null);
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    49
        return retVal == JFileChooser.APPROVE_OPTION ?
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    50
            chooser.selectedFile.absolutePath : null;
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    51
    }
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    52
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    53
    var FutureTask = java.util.concurrent.FutureTask;
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    54
    var fileChooserTask = new FutureTask(run);
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    55
    javax.swing.SwingUtilities.invokeLater(fileChooserTask);
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    56
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    57
    return fileChooserTask.get();
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    58
}
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    59
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    60
// Function that opens up the desktop browser application with the given URI.
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    61
// We access AWT from script to avoid direct dependency on java.desktop module.
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    62
function browse(uri) {
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    63
    var Desktop = java.awt.Desktop;
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    64
    if (Java.isType(Desktop)) {
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    65
        Desktop.desktop.browse(uri);
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    66
    }
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    67
}
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    68
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    69
function printDoc(list) {
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    70
    list.forEach(function(doc) {
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    71
        print();
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    72
        print(doc.signature());
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    73
        print();
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    74
        print(doc.javadoc());
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    75
    });
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    76
}
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    77
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    78
var JShell = null;
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    79
var jshell = null;
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    80
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    81
function javadoc(obj) {
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    82
    var str = String(obj);
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    83
    if (!JShell) {
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    84
        // first time - resolve JShell class
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    85
        JShell = Packages.jdk.jshell.JShell;
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    86
        // if JShell class is available, create an instance
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    87
        jshell = Java.isType(JShell)? JShell.create() : null;
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    88
    }
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    89
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    90
    if (!jshell) {
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    91
        // we don't have jshell. Just print the default!
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    92
        return print(str);
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    93
    }
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    94
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    95
    /*
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    96
     * A java method object's String representation looks something like this:
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    97
     *
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    98
     * For an overloaded method:
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
    99
     *
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   100
     *   [jdk.dynalink.beans.OverloadedDynamicMethod
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   101
     *      String java.lang.System.getProperty(String,String)
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   102
     *      String java.lang.System.getProperty(String)
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   103
     *    ]
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   104
     *
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   105
     * For a non-overloaded method:
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   106
     *
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   107
     *  [jdk.dynalink.beans.SimpleDynamicMethod void java.lang.System.exit(int)]
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   108
     *
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   109
     * jshell expects "java.lang.System.getProperty(" or "java.lang.System.exit("
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   110
     * to retrieve the javadoc comment(s) for the method.
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   111
     */
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   112
    var javaCode = str.split(" ")[2]; // stuff after second whitespace char
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   113
    javaCode = javaCode.substring(0, javaCode.indexOf('(') + 1); // strip argument types
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   114
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   115
    try {
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   116
        var analysis = jshell.sourceCodeAnalysis();
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   117
        var docList = analysis.documentation(javaCode, javaCode.length, true);
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   118
        if (!docList.isEmpty()) {
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   119
            return printDoc(docList);
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   120
        }
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   121
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   122
        /*
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   123
         * May be the method is a Java instance method. In such a case, jshell expects
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   124
         * a valid starting portion of an instance method call expression. We cast null
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   125
         * to Java object and call method on it. i.e., We pass something like this:
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   126
         *
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   127
         *  "((java.io.PrintStream)null).println("
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   128
         */
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   129
        var javaType = javaCode.substring(0, javaCode.lastIndexOf('.'));
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   130
        javaCode = "((" + javaType + ")null)" + javaCode.substring(javaCode.lastIndexOf('.'));
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   131
        docList = analysis.documentation(javaCode, javaCode.length, true);
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   132
        if (!docList.isEmpty()) {
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   133
            return printDoc(docList);
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   134
        }
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   135
    } catch (e) {
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   136
    }
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   137
    print(str);
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   138
}
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   139
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   140
return {
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   141
    isHeadless: isHeadless,
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   142
    chooseFile: chooseFile,
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   143
    browse: browse,
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   144
    javadoc: javadoc
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   145
};
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   146
38aa08d2ec6c 8190795: jjs should show javadoc for java methods on shift-tab
sundar
parents:
diff changeset
   147
})();