langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/Feedback.java
author rfield
Tue, 08 Mar 2016 11:53:35 -0800
changeset 36494 4175f47b2a50
child 36718 bf40906bf49d
permissions -rw-r--r--
8148316: jshell tool: Configurable output format 8148317: jshell tool: unify commands into /set 8149524: JShell: CompletenessAnalysis fails on class Case<E1 extends Enum<E1>, E2 extends Enum<E2>, E3 extends Enum<E3>> {} Reviewed-by: jlahoda
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36494
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
     1
/*
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
     2
 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
     4
 *
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    10
 *
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    15
 * accompanied this code).
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    16
 *
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    20
 *
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    23
 * questions.
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    24
 */
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    25
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    26
package jdk.internal.jshell.tool;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    27
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    28
import java.util.ArrayList;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    29
import java.util.Arrays;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    30
import java.util.Collection;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    31
import java.util.EnumMap;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    32
import java.util.EnumSet;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    33
import java.util.HashMap;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    34
import java.util.List;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    35
import java.util.Locale;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    36
import java.util.Map;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    37
import java.util.Set;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    38
import java.util.function.Function;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    39
import java.util.regex.Matcher;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    40
import java.util.regex.Pattern;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    41
import java.util.stream.Collectors;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    42
import java.util.stream.Stream;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    43
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    44
/**
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    45
 * Feedback customization support
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    46
 *
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    47
 * @author Robert Field
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    48
 */
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    49
class Feedback {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    50
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    51
    // Patern for substituted fields within a customized format string
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    52
    private static final Pattern FIELD_PATTERN = Pattern.compile("\\{(.*?)\\}");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    53
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    54
    // Current mode
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    55
    private Mode mode = new Mode("", false); // initial value placeholder during start-up
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    56
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    57
    // Mapping of mode names to mode modes
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    58
    private final Map<String, Mode> modeMap = new HashMap<>();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    59
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    60
    public boolean shouldDisplayCommandFluff() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    61
        return mode.commandFluff;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    62
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    63
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    64
    public String getPre() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    65
        return mode.pre;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    66
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    67
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    68
    public String getPost() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    69
        return mode.post;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    70
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    71
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    72
    public String getErrorPre() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    73
        return mode.errorPre;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    74
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    75
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    76
    public String getErrorPost() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    77
        return mode.errorPost;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    78
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    79
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    80
    public String getFormat(FormatCase fc, FormatWhen fw, FormatAction fa, FormatResolve fr,
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    81
            boolean hasName, boolean hasType, boolean hasResult) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    82
        return mode.getFormat(fc, fw, fa, fr, hasName, hasType, hasResult);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    83
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    84
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    85
    public String getPrompt(String nextId) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    86
        return mode.getPrompt(nextId);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    87
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    88
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    89
    public String getContinuationPrompt(String nextId) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    90
        return mode.getContinuationPrompt(nextId);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    91
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    92
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    93
    public boolean setFeedback(JShellTool tool, ArgTokenizer at) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    94
        return new FormatSetter(tool, at).setFeedback();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    95
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    96
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    97
    public boolean setField(JShellTool tool, ArgTokenizer at) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    98
        return new FormatSetter(tool, at).setField();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    99
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   100
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   101
    public boolean setFormat(JShellTool tool, ArgTokenizer at) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   102
        return new FormatSetter(tool, at).setFormat();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   103
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   104
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   105
    public boolean setNewMode(JShellTool tool, ArgTokenizer at) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   106
        return new FormatSetter(tool, at).setNewMode();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   107
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   108
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   109
    public boolean setPrompt(JShellTool tool, ArgTokenizer at) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   110
        return new FormatSetter(tool, at).setPrompt();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   111
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   112
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   113
    public void printFeedbackHelp(JShellTool tool) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   114
        new FormatSetter(tool, null).printFeedbackHelp();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   115
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   116
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   117
    public void printFieldHelp(JShellTool tool) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   118
        new FormatSetter(tool, null).printFieldHelp();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   119
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   120
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   121
    public void printFormatHelp(JShellTool tool) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   122
        new FormatSetter(tool, null).printFormatHelp();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   123
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   124
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   125
    public void printNewModeHelp(JShellTool tool) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   126
        new FormatSetter(tool, null).printNewModeHelp();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   127
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   128
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   129
    public void printPromptHelp(JShellTool tool) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   130
        new FormatSetter(tool, null).printPromptHelp();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   131
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   132
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   133
    /**
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   134
     * Holds all the context of a mode mode
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   135
     */
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   136
    private class Mode {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   137
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   138
        // Use name of mode mode
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   139
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   140
        final String name;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   141
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   142
        // Display command verification/information
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   143
        final boolean commandFluff;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   144
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   145
        // event cases: class, method
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   146
        final EnumMap<FormatCase, EnumMap<FormatAction, EnumMap<FormatWhen, String>>> cases;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   147
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   148
        // action names: add. modified, replaced, ...
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   149
        final EnumMap<FormatAction, EnumMap<FormatWhen, String>> actions;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   150
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   151
        // resolution status description format with %s for unresolved
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   152
        final EnumMap<FormatResolve, EnumMap<FormatWhen, String>> resolves;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   153
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   154
        // primary snippet vs update
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   155
        final EnumMap<FormatWhen, String> whens;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   156
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   157
        // fixed map of how to get format string for a field, given a specific formatting contet
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   158
        final EnumMap<FormatField, Function<Context, String>> fields;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   159
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   160
        // format wrappers for name, type, and result
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   161
        String fname = "%s";
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   162
        String ftype = "%s";
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   163
        String fresult = "%s";
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   164
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   165
        // start and end, also used by hard-coded output
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   166
        String pre = "|  ";
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   167
        String post = "\n";
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   168
        String errorPre = "|  Error: ";
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   169
        String errorPost = "\n";
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   170
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   171
        String prompt = "\n-> ";
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   172
        String continuationPrompt = ">> ";
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   173
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   174
        /**
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   175
         * The context of a specific mode to potentially display.
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   176
         */
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   177
        class Context {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   178
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   179
            final FormatCase fc;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   180
            final FormatAction fa;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   181
            final FormatResolve fr;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   182
            final FormatWhen fw;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   183
            final boolean hasName;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   184
            final boolean hasType;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   185
            final boolean hasResult;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   186
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   187
            Context(FormatCase fc, FormatWhen fw, FormatAction fa, FormatResolve fr,
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   188
                    boolean hasName, boolean hasType, boolean hasResult) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   189
                this.fc = fc;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   190
                this.fa = fa;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   191
                this.fr = fr;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   192
                this.fw = fw;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   193
                this.hasName = hasName;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   194
                this.hasType = hasType;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   195
                this.hasResult = hasResult;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   196
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   197
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   198
            String when() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   199
                return whens.get(fw);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   200
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   201
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   202
            String action() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   203
                return actions.get(fa).get(fw);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   204
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   205
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   206
            String resolve() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   207
                return String.format(resolves.get(fr).get(fw), FormatField.RESOLVE.form);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   208
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   209
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   210
            String name() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   211
                return hasName
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   212
                        ? String.format(fname, FormatField.NAME.form)
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   213
                        : "";
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   214
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   215
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   216
            String type() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   217
                return hasType
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   218
                        ? String.format(ftype, FormatField.TYPE.form)
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   219
                        : "";
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   220
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   221
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   222
            String result() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   223
                return hasResult
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   224
                        ? String.format(fresult, FormatField.RESULT.form)
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   225
                        : "";
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   226
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   227
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   228
            /**
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   229
             * Lookup format based on case, action, and whether it update.
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   230
             * Replace fields with context specific formats.
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   231
             *
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   232
             * @return format string
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   233
             */
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   234
            String format() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   235
                String format = cases.get(fc).get(fa).get(fw);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   236
                if (format == null) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   237
                    return "";
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   238
                }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   239
                Matcher m = FIELD_PATTERN.matcher(format);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   240
                StringBuffer sb = new StringBuffer(format.length());
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   241
                while (m.find()) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   242
                    String fieldName = m.group(1).toUpperCase(Locale.US);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   243
                    String sub = null;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   244
                    for (FormatField f : FormatField.values()) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   245
                        if (f.name().startsWith(fieldName)) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   246
                            sub = fields.get(f).apply(this);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   247
                            break;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   248
                        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   249
                    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   250
                    if (sub != null) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   251
                        m.appendReplacement(sb, Matcher.quoteReplacement(sub));
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   252
                    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   253
                }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   254
                m.appendTail(sb);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   255
                return sb.toString();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   256
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   257
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   258
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   259
        {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   260
            // set fixed mappings of fields
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   261
            fields = new EnumMap<>(FormatField.class);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   262
            fields.put(FormatField.WHEN, c -> c.when());
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   263
            fields.put(FormatField.ACTION, c -> c.action());
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   264
            fields.put(FormatField.RESOLVE, c -> c.resolve());
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   265
            fields.put(FormatField.NAME, c -> c.name());
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   266
            fields.put(FormatField.TYPE, c -> c.type());
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   267
            fields.put(FormatField.RESULT, c -> c.result());
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   268
            fields.put(FormatField.PRE, c -> pre);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   269
            fields.put(FormatField.POST, c -> post);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   270
            fields.put(FormatField.ERRORPRE, c -> errorPre);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   271
            fields.put(FormatField.ERRORPOST, c -> errorPost);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   272
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   273
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   274
        /**
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   275
         * Set up an empty mode.
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   276
         *
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   277
         * @param name
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   278
         * @param commandFluff True if should display command fluff messages
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   279
         */
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   280
        Mode(String name, boolean commandFluff) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   281
            this.name = name;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   282
            this.commandFluff = commandFluff;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   283
            cases = new EnumMap<>(FormatCase.class);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   284
            for (FormatCase fc : FormatCase.values()) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   285
                EnumMap<FormatAction, EnumMap<FormatWhen, String>> ac = new EnumMap<>(FormatAction.class);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   286
                cases.put(fc, ac);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   287
                for (FormatAction fa : FormatAction.values()) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   288
                    EnumMap<FormatWhen, String> aw = new EnumMap<>(FormatWhen.class);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   289
                    ac.put(fa, aw);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   290
                    for (FormatWhen fw : FormatWhen.values()) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   291
                        aw.put(fw, "");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   292
                    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   293
                }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   294
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   295
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   296
            actions = new EnumMap<>(FormatAction.class);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   297
            for (FormatAction fa : FormatAction.values()) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   298
                EnumMap<FormatWhen, String> afw = new EnumMap<>(FormatWhen.class);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   299
                actions.put(fa, afw);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   300
                for (FormatWhen fw : FormatWhen.values()) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   301
                    afw.put(fw, fa.name() + "-" + fw.name());
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   302
                }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   303
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   304
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   305
            resolves = new EnumMap<>(FormatResolve.class);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   306
            for (FormatResolve fr : FormatResolve.values()) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   307
                EnumMap<FormatWhen, String> arw = new EnumMap<>(FormatWhen.class);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   308
                resolves.put(fr, arw);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   309
                for (FormatWhen fw : FormatWhen.values()) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   310
                    arw.put(fw, fr.name() + "-" + fw.name() + ": %s");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   311
                }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   312
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   313
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   314
            whens = new EnumMap<>(FormatWhen.class);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   315
            for (FormatWhen fw : FormatWhen.values()) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   316
                whens.put(fw, fw.name());
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   317
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   318
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   319
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   320
        /**
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   321
         * Set up a copied mode.
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   322
         *
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   323
         * @param name
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   324
         * @param commandFluff True if should display command fluff messages
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   325
         * @param m Mode to copy
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   326
         */
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   327
        Mode(String name, boolean commandFluff, Mode m) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   328
            this.name = name;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   329
            this.commandFluff = commandFluff;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   330
            cases = new EnumMap<>(FormatCase.class);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   331
            for (FormatCase fc : FormatCase.values()) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   332
                EnumMap<FormatAction, EnumMap<FormatWhen, String>> ac = new EnumMap<>(FormatAction.class);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   333
                EnumMap<FormatAction, EnumMap<FormatWhen, String>> mc = m.cases.get(fc);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   334
                cases.put(fc, ac);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   335
                for (FormatAction fa : FormatAction.values()) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   336
                    EnumMap<FormatWhen, String> aw = new EnumMap<>(mc.get(fa));
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   337
                    ac.put(fa, aw);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   338
                }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   339
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   340
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   341
            actions = new EnumMap<>(FormatAction.class);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   342
            for (FormatAction fa : FormatAction.values()) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   343
                EnumMap<FormatWhen, String> afw = new EnumMap<>(m.actions.get(fa));
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   344
                actions.put(fa, afw);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   345
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   346
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   347
            resolves = new EnumMap<>(FormatResolve.class);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   348
            for (FormatResolve fr : FormatResolve.values()) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   349
                EnumMap<FormatWhen, String> arw = new EnumMap<>(m.resolves.get(fr));
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   350
                resolves.put(fr, arw);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   351
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   352
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   353
            whens = new EnumMap<>(m.whens);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   354
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   355
            this.fname = m.fname;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   356
            this.ftype = m.ftype;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   357
            this.fresult = m.fresult;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   358
            this.pre = m.pre;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   359
            this.post = m.post;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   360
            this.errorPre = m.errorPre;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   361
            this.errorPost = m.errorPost;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   362
            this.prompt = m.prompt;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   363
            this.continuationPrompt = m.continuationPrompt;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   364
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   365
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   366
        String getFormat(FormatCase fc, FormatWhen fw, FormatAction fa, FormatResolve fr,
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   367
                boolean hasName, boolean hasType, boolean hasResult) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   368
            Context context = new Context(fc, fw, fa, fr,
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   369
                    hasName, hasType, hasResult);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   370
            return context.format();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   371
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   372
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   373
        void setCases(String format, Collection<FormatCase> cc, Collection<FormatAction> ca, Collection<FormatWhen> cw) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   374
            for (FormatCase fc : cc) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   375
                EnumMap<FormatAction, EnumMap<FormatWhen, String>> ma = cases.get(fc);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   376
                for (FormatAction fa : ca) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   377
                    EnumMap<FormatWhen, String> mw = ma.get(fa);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   378
                    for (FormatWhen fw : cw) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   379
                        mw.put(fw, format);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   380
                    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   381
                }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   382
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   383
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   384
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   385
        void setActions(String format, Collection<FormatAction> ca, Collection<FormatWhen> cw) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   386
            for (FormatAction fa : ca) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   387
                EnumMap<FormatWhen, String> mw = actions.get(fa);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   388
                for (FormatWhen fw : cw) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   389
                    mw.put(fw, format);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   390
                }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   391
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   392
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   393
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   394
        void setResolves(String format, Collection<FormatResolve> cr, Collection<FormatWhen> cw) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   395
            for (FormatResolve fr : cr) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   396
                EnumMap<FormatWhen, String> mw = resolves.get(fr);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   397
                for (FormatWhen fw : cw) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   398
                    mw.put(fw, format);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   399
                }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   400
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   401
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   402
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   403
        void setWhens(String format, Collection<FormatWhen> cw) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   404
            for (FormatWhen fw : cw) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   405
                whens.put(fw, format);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   406
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   407
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   408
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   409
        void setName(String s) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   410
            fname = s;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   411
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   412
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   413
        void setType(String s) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   414
            ftype = s;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   415
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   416
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   417
        void setResult(String s) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   418
            fresult = s;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   419
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   420
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   421
        void setPre(String s) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   422
            pre = s;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   423
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   424
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   425
        void setPost(String s) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   426
            post = s;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   427
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   428
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   429
        void setErrorPre(String s) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   430
            errorPre = s;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   431
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   432
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   433
        void setErrorPost(String s) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   434
            errorPost = s;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   435
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   436
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   437
        String getPre() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   438
            return pre;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   439
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   440
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   441
        String getPost() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   442
            return post;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   443
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   444
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   445
        String getErrorPre() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   446
            return errorPre;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   447
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   448
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   449
        String getErrorPost() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   450
            return errorPost;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   451
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   452
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   453
        void setPrompts(String prompt, String continuationPrompt) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   454
            this.prompt = prompt;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   455
            this.continuationPrompt = continuationPrompt;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   456
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   457
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   458
        String getPrompt(String nextId) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   459
            return String.format(prompt, nextId);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   460
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   461
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   462
        String getContinuationPrompt(String nextId) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   463
            return String.format(continuationPrompt, nextId);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   464
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   465
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   466
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   467
    /**
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   468
     * The brace delimited substitutions
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   469
     */
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   470
    public enum FormatField {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   471
        WHEN,
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   472
        ACTION,
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   473
        RESOLVE("%1$s"),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   474
        NAME("%2$s"),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   475
        TYPE("%3$s"),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   476
        RESULT("%4$s"),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   477
        PRE,
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   478
        POST,
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   479
        ERRORPRE,
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   480
        ERRORPOST;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   481
        String form;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   482
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   483
        FormatField(String s) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   484
            this.form = s;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   485
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   486
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   487
        FormatField() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   488
            this.form = null;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   489
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   490
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   491
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   492
    /**
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   493
     * The event cases
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   494
     */
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   495
    public enum FormatCase {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   496
        IMPORT("import declaration: {action} {name}"),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   497
        CLASS("class, interface, enum, or annotation declaration: {action} {name} {resolve}"),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   498
        INTERFACE("class, interface, enum, or annotation declaration: {action} {name} {resolve}"),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   499
        ENUM("class, interface, enum, or annotation declaration: {action} {name} {resolve}"),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   500
        ANNOTATION("annotation interface declaration: {action} {name} {resolve}"),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   501
        METHOD("method declaration: {action} {name} {type}==parameter-types {resolve}"),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   502
        VARDECL("variable declaration: {action} {name} {type} {resolve}"),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   503
        VARDECLRECOVERABLE("recoverably failed variable declaration: {action} {name} {resolve}"),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   504
        VARINIT("variable declaration with init: {action} {name} {type} {resolve} {result}"),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   505
        VARRESET("variable reset on update: {action} {name}"),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   506
        EXPRESSION("expression: {action}=='Saved to scratch variable' {name} {type} {result}"),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   507
        VARVALUE("variable value expression: {action} {name} {type} {result}"),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   508
        ASSIGNMENT("assign variable: {action} {name} {type} {result}"),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   509
        STATEMENT("statement: {action}");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   510
        String doc;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   511
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   512
        private FormatCase(String doc) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   513
            this.doc = doc;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   514
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   515
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   516
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   517
    /**
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   518
     * The event actions
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   519
     */
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   520
    public enum FormatAction {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   521
        ADDED("snippet has been added"),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   522
        MODIFIED("an existing snippet has been modified"),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   523
        REPLACED("an existing snippet has been replaced with a new snippet"),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   524
        OVERWROTE("an existing snippet has been overwritten"),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   525
        DROPPED("snippet has been dropped"),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   526
        REJECTED("snippet has failed and been rejected");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   527
        String doc;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   528
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   529
        private FormatAction(String doc) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   530
            this.doc = doc;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   531
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   532
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   533
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   534
    /**
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   535
     * When the event occurs: primary or update
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   536
     */
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   537
    public enum FormatWhen {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   538
        PRIMARY("the entered snippet"),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   539
        UPDATE("an update to a dependent snippet");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   540
        String doc;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   541
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   542
        private FormatWhen(String doc) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   543
            this.doc = doc;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   544
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   545
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   546
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   547
    /**
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   548
     * Resolution problems with event
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   549
     */
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   550
    public enum FormatResolve {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   551
        OK("resolved correctly"),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   552
        DEFINED("defined despite recoverably unresolved references"),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   553
        NOTDEFINED("not defined because of recoverably unresolved references");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   554
        String doc;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   555
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   556
        private FormatResolve(String doc) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   557
            this.doc = doc;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   558
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   559
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   560
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   561
    // Class used to set custom eval output formats
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   562
    // For both /set format  and /set field -- Parse arguments, setting custom format, or printing error
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   563
    private class FormatSetter {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   564
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   565
        private final ArgTokenizer at;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   566
        private final JShellTool tool;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   567
        boolean valid = true;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   568
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   569
        class Case<E1 extends Enum<E1>, E2 extends Enum<E2>, E3 extends Enum<E3>> {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   570
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   571
            Set<E1> e1;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   572
            Set<E2> e2;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   573
            Set<E3> e3;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   574
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   575
            Case(Set<E1> e1, Set<E2> e2, Set<E3> e3) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   576
                this.e1 = e1;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   577
                this.e2 = e2;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   578
                this.e3 = e3;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   579
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   580
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   581
            Case(Set<E1> e1, Set<E2> e2) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   582
                this.e1 = e1;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   583
                this.e2 = e2;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   584
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   585
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   586
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   587
        FormatSetter(JShellTool tool, ArgTokenizer at) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   588
            this.tool = tool;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   589
            this.at = at;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   590
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   591
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   592
        void hard(String format, Object... args) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   593
            tool.hard(format, args);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   594
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   595
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   596
        <E extends Enum<E>> void hardEnums(EnumSet<E> es, Function<E, String> e2s) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   597
            hardPairs(es.stream(), ev -> ev.name().toLowerCase(Locale.US), e2s);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   598
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   599
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   600
        <T> void hardPairs(Stream<T> stream, Function<T, String> a, Function<T, String> b) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   601
            tool.hardPairs(stream, a, b);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   602
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   603
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   604
        void fluff(String format, Object... args) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   605
            tool.fluff(format, args);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   606
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   607
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   608
        void error(String format, Object... args) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   609
            tool.error(format, args);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   610
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   611
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   612
        void errorat(String format, Object... args) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   613
            Object[] a2 = Arrays.copyOf(args, args.length + 1);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   614
            a2[args.length] = at.whole();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   615
            tool.error(format + " -- /set %s", a2);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   616
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   617
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   618
        void fluffRaw(String format, Object... args) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   619
            tool.fluffRaw(format, args);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   620
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   621
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   622
        // For /set prompt <mode> "<prompt>" "<continuation-prompt>"
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   623
        boolean setPrompt() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   624
            Mode m = nextMode();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   625
            String prompt = nextFormat();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   626
            String continuationPrompt = nextFormat();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   627
            if (valid) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   628
                m.setPrompts(prompt, continuationPrompt);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   629
            } else {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   630
                fluff("See '/help /set prompt' for help");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   631
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   632
            return valid;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   633
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   634
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   635
        // For /set newmode <new-mode> [command|quiet [<old-mode>]]
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   636
        boolean setNewMode() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   637
            String umode = at.next();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   638
            if (umode == null) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   639
                errorat("Expected new feedback mode");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   640
                valid = false;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   641
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   642
            if (modeMap.containsKey(umode)) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   643
                errorat("Expected a new feedback mode name. %s is a known feedback mode", umode);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   644
                valid = false;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   645
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   646
            String[] fluffOpt = at.next("command", "quiet");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   647
            boolean fluff = fluffOpt == null || fluffOpt.length != 1 || "command".equals(fluffOpt[0]);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   648
            if (fluffOpt != null && fluffOpt.length != 1) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   649
                errorat("Specify either 'command' or 'quiet'");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   650
                valid = false;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   651
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   652
            Mode om = null;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   653
            String omode = at.next();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   654
            if (omode != null) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   655
                om = toMode(omode);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   656
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   657
            if (valid) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   658
                Mode nm = (om != null)
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   659
                        ? new Mode(umode, fluff, om)
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   660
                        : new Mode(umode, fluff);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   661
                modeMap.put(umode, nm);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   662
                fluff("Created new feedback mode: %s", nm.name);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   663
            } else {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   664
                fluff("See '/help /set newmode' for help");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   665
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   666
            return valid;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   667
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   668
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   669
        // For /set feedback <mode>
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   670
        boolean setFeedback() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   671
            Mode m = nextMode();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   672
            if (valid && m != null) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   673
                mode = m;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   674
                fluff("Feedback mode: %s", mode.name);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   675
            } else {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   676
                fluff("See '/help /set feedback' for help");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   677
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   678
            return valid;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   679
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   680
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   681
        // For /set format <mode> "<format>" <selector>...
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   682
        boolean setFormat() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   683
            Mode m = nextMode();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   684
            String format = nextFormat();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   685
            if (valid) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   686
                List<Case<FormatCase, FormatAction, FormatWhen>> specs = new ArrayList<>();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   687
                String s;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   688
                while ((s = at.next()) != null) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   689
                    String[] d = s.split("-");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   690
                    specs.add(new Case<>(
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   691
                            parseFormatCase(d, 0),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   692
                            parseFormatAction(d, 1),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   693
                            parseFormatWhen(d, 2)
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   694
                    ));
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   695
                }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   696
                if (valid && specs.isEmpty()) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   697
                    errorat("At least one selector required");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   698
                    valid = false;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   699
                }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   700
                if (valid) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   701
                    // set the format in the specified cases
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   702
                    specs.stream()
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   703
                            .forEach(c -> m.setCases(format, c.e1, c.e2, c.e3));
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   704
                }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   705
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   706
            if (!valid) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   707
                fluff("See '/help /set format' for help");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   708
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   709
            return valid;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   710
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   711
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   712
        // For /set field mode <field> "<format>" <selector>...
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   713
        boolean setField() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   714
            Mode m = nextMode();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   715
            String fieldName = at.next();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   716
            FormatField field = parseFormatSelector(fieldName, EnumSet.allOf(FormatField.class), "field");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   717
            String format = nextFormat();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   718
            if (valid) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   719
                switch (field) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   720
                    case ACTION: {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   721
                        List<Case<FormatAction, FormatWhen, FormatWhen>> specs = new ArrayList<>();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   722
                        String s;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   723
                        while ((s = at.next()) != null) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   724
                            String[] d = s.split("-");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   725
                            specs.add(new Case<>(
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   726
                                    parseFormatAction(d, 0),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   727
                                    parseFormatWhen(d, 1)
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   728
                            ));
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   729
                        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   730
                        if (valid && specs.isEmpty()) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   731
                            errorat("At least one selector required");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   732
                            valid = false;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   733
                        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   734
                        if (valid) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   735
                            // set the format of the specified actions
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   736
                            specs.stream()
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   737
                                    .forEach(c -> m.setActions(format, c.e1, c.e2));
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   738
                        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   739
                        break;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   740
                    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   741
                    case RESOLVE: {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   742
                        List<Case<FormatResolve, FormatWhen, FormatWhen>> specs = new ArrayList<>();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   743
                        String s;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   744
                        while ((s = at.next()) != null) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   745
                            String[] d = s.split("-");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   746
                            specs.add(new Case<>(
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   747
                                    parseFormatResolve(d, 0),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   748
                                    parseFormatWhen(d, 1)
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   749
                            ));
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   750
                        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   751
                        if (valid && specs.isEmpty()) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   752
                            errorat("At least one selector required");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   753
                            valid = false;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   754
                        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   755
                        if (valid) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   756
                            // set the format of the specified resolves
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   757
                            specs.stream()
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   758
                                    .forEach(c -> m.setResolves(format, c.e1, c.e2));
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   759
                        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   760
                        break;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   761
                    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   762
                    case WHEN: {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   763
                        List<Case<FormatWhen, FormatWhen, FormatWhen>> specs = new ArrayList<>();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   764
                        String s;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   765
                        while ((s = at.next()) != null) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   766
                            String[] d = s.split("-");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   767
                            specs.add(new Case<>(
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   768
                                    parseFormatWhen(d, 1),
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   769
                                    null
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   770
                            ));
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   771
                        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   772
                        if (valid && specs.isEmpty()) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   773
                            errorat("At least one selector required");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   774
                            valid = false;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   775
                        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   776
                        if (valid) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   777
                            // set the format of the specified whens
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   778
                            specs.stream()
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   779
                                    .forEach(c -> m.setWhens(format, c.e1));
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   780
                        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   781
                        break;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   782
                    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   783
                    case NAME: {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   784
                        m.setName(format);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   785
                        break;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   786
                    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   787
                    case TYPE: {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   788
                        m.setType(format);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   789
                        break;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   790
                    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   791
                    case RESULT: {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   792
                        m.setResult(format);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   793
                        break;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   794
                    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   795
                    case PRE: {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   796
                        m.setPre(format);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   797
                        break;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   798
                    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   799
                    case POST: {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   800
                        m.setPost(format);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   801
                        break;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   802
                    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   803
                    case ERRORPRE: {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   804
                        m.setErrorPre(format);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   805
                        break;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   806
                    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   807
                    case ERRORPOST: {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   808
                        m.setErrorPost(format);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   809
                        break;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   810
                    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   811
                }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   812
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   813
            if (!valid) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   814
                fluff("See '/help /set field' for help");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   815
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   816
            return valid;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   817
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   818
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   819
        Mode nextMode() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   820
            String umode = at.next();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   821
            return toMode(umode);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   822
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   823
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   824
        Mode toMode(String umode) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   825
            if (umode == null) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   826
                errorat("Expected a feedback mode");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   827
                valid = false;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   828
                return null;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   829
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   830
            Mode m = modeMap.get(umode);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   831
            if (m != null) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   832
                return m;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   833
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   834
            // Failing an exact match, go searching
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   835
            Mode[] matches = modeMap.entrySet().stream()
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   836
                    .filter(e -> e.getKey().startsWith(umode))
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   837
                    .map(e -> e.getValue())
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   838
                    .toArray(size -> new Mode[size]);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   839
            if (matches.length == 1) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   840
                return matches[0];
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   841
            } else {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   842
                valid = false;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   843
                if (matches.length == 0) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   844
                    errorat("Does not match any current feedback mode: %s", umode);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   845
                } else {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   846
                    errorat("Matchs more then one current feedback mode: %s", umode);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   847
                }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   848
                fluff("The feedback mode should be one of the following:");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   849
                modeMap.keySet().stream()
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   850
                        .forEach(mk -> fluff("   %s", mk));
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   851
                fluff("You may also use just enough letters to make it unique.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   852
                return null;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   853
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   854
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   855
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   856
        // Test if the format string is correctly
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   857
        final String nextFormat() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   858
            String format = at.next();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   859
            if (format == null) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   860
                errorat("Expected format missing");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   861
                valid = false;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   862
                return null;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   863
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   864
            if (!at.isQuoted()) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   865
                errorat("Format '%s' must be quoted", format);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   866
                valid = false;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   867
                return null;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   868
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   869
            return format;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   870
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   871
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   872
        final Set<FormatCase> parseFormatCase(String[] s, int i) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   873
            return parseFormatSelectorStar(s, i, FormatCase.class, EnumSet.allOf(FormatCase.class), "case");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   874
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   875
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   876
        final Set<FormatAction> parseFormatAction(String[] s, int i) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   877
            return parseFormatSelectorStar(s, i, FormatAction.class,
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   878
                    EnumSet.of(FormatAction.ADDED, FormatAction.MODIFIED, FormatAction.REPLACED), "action");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   879
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   880
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   881
        final Set<FormatResolve> parseFormatResolve(String[] s, int i) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   882
            return parseFormatSelectorStar(s, i, FormatResolve.class,
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   883
                    EnumSet.of(FormatResolve.DEFINED, FormatResolve.NOTDEFINED), "resolve");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   884
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   885
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   886
        final Set<FormatWhen> parseFormatWhen(String[] s, int i) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   887
            return parseFormatSelectorStar(s, i, FormatWhen.class, EnumSet.of(FormatWhen.PRIMARY), "when");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   888
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   889
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   890
        /**
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   891
         * In a selector x-y-z , parse x, y, or z -- whether they are missing,
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   892
         * or a comma separated list of identifiers and stars.
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   893
         *
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   894
         * @param <E> The enum this selector should belong to
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   895
         * @param sa The array of selector strings
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   896
         * @param i The index of which selector string to use
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   897
         * @param klass The class of the enum that should be used
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   898
         * @param defaults The set of enum values to use if the selector is
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   899
         * missing
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   900
         * @return The set of enum values specified by this selector
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   901
         */
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   902
        final <E extends Enum<E>> Set<E> parseFormatSelectorStar(String[] sa, int i, Class<E> klass, EnumSet<E> defaults, String label) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   903
            String s = sa.length > i
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   904
                    ? sa[i]
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   905
                    : null;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   906
            if (s == null || s.isEmpty()) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   907
                return defaults;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   908
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   909
            Set<E> set = EnumSet.noneOf(klass);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   910
            EnumSet<E> values = EnumSet.allOf(klass);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   911
            for (String as : s.split(",")) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   912
                if (as.equals("*")) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   913
                    set.addAll(values);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   914
                } else if (!as.isEmpty()) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   915
                    set.add(parseFormatSelector(as, values, label));
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   916
                }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   917
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   918
            return set;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   919
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   920
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   921
        /**
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   922
         * In a x-y-a,b selector, parse an x, y, a, or b -- that is an
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   923
         * identifier
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   924
         *
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   925
         * @param <E> The enum this selector should belong to
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   926
         * @param s The string to parse: x, y, or z
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   927
         * @param values The allowed of this enum
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   928
         * @return The enum value
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   929
         */
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   930
        final <E extends Enum<E>> E parseFormatSelector(String s, EnumSet<E> values, String label) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   931
            if (s == null) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   932
                valid = false;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   933
                return null;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   934
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   935
            String u = s.toUpperCase(Locale.US);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   936
            for (E c : values) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   937
                if (c.name().startsWith(u)) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   938
                    return c;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   939
                }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   940
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   941
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   942
            errorat("Not a valid %s: %s, must be one of: %s", label, s,
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   943
                    values.stream().map(v -> v.name().toLowerCase(Locale.US)).collect(Collectors.joining(" ")));
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   944
            valid = false;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   945
            return values.iterator().next();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   946
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   947
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   948
        final void printFormatHelp() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   949
            hard("Set the format for reporting a snippet event.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   950
            hard("");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   951
            hard("/set format <mode> \"<format>\" <selector>...");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   952
            hard("");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   953
            hard("Where <mode> is the name of a previously defined feedback mode -- see '/help /set newmode'.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   954
            hard("Where <format> is a quoted string which will have these field substitutions:");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   955
            hard("   {action}    == The action, e.g.: Added, Modified, Assigned, ...");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   956
            hard("   {name}      == The name, e.g.: the variable name, ...");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   957
            hard("   {type}      == The type name");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   958
            hard("   {resolve}   == Unresolved info, e.g.: ', however, it cannot be invoked until'");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   959
            hard("   {result}    == The result value");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   960
            hard("   {when}      == The entered snippet or a resultant update");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   961
            hard("   {pre}       == The feedback prefix");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   962
            hard("   {post}      == The feedback postfix");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   963
            hard("   {errorpre}  == The error prefix");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   964
            hard("   {errorpost} == The error postfix");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   965
            hard("Use '/set field' to set the format of these substitutions.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   966
            hard("Where <selector> is the context in which the format is applied.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   967
            hard("The structure of selector is: <case>[-<action>[-<when>]]");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   968
            hard("Where each field component may be missing (indicating defaults),");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   969
            hard("star (indicating all), or a comma separated list of field values.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   970
            hard("For case, the field values are:");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   971
            hardEnums(EnumSet.allOf(FormatCase.class), ev -> ev.doc);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   972
            hard("For action, the field values are:");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   973
            hardEnums(EnumSet.allOf(FormatAction.class), ev -> ev.doc);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   974
            hard("For when, the field values are:");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   975
            hardEnums(EnumSet.allOf(FormatWhen.class), ev -> ev.doc);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   976
            hard("");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   977
            hard("Example:");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   978
            hard("   /set format example '{pre}{action} variable {name}, reset to null{post}' varreset-*-update");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   979
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   980
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   981
        final void printFieldHelp() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   982
            hard("Set the format of a field substitution as used in '/set format'.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   983
            hard("");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   984
            hard("/set field <mode> <field> \"<format>\" <selector>...");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   985
            hard("");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   986
            hard("Where <mode> is the name of a previously defined feedback mode -- see '/set newmode'.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   987
            hard("Where <field> is context-specific format to set, each with its own selector structure:");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   988
            hard("   action    == The action. The selector: <action>-<when>.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   989
            hard("   name      == The name.  '%%s' is the name.  No selectors.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   990
            hard("   type      == The type name.  '%%s' is the type. No selectors.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   991
            hard("   resolve   == Unresolved info.  '%%s' is the unresolved list. The selector: <resolve>-<when>.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   992
            hard("   result    == The result value.  '%%s' is the result value. No selectors.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   993
            hard("   when      == The entered snippet or a resultant update. The selector: <when>");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   994
            hard("   pre       == The feedback prefix. No selectors.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   995
            hard("   post      == The feedback postfix. No selectors.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   996
            hard("   errorpre  == The error prefix. No selectors.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   997
            hard("   errorpost == The error postfix. No selectors.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   998
            hard("Where <format> is a quoted string -- see the description specific to the field (above).");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   999
            hard("Where <selector> is the context in which the format is applied (see above).");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1000
            hard("For action, the field values are:");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1001
            hardEnums(EnumSet.allOf(FormatAction.class), ev -> ev.doc);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1002
            hard("For when, the field values are:");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1003
            hardEnums(EnumSet.allOf(FormatWhen.class), ev -> ev.doc);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1004
            hard("For resolve, the field values are:");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1005
            hardEnums(EnumSet.allOf(FormatResolve.class), ev -> ev.doc);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1006
            hard("");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1007
            hard("Example:");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1008
            hard("   /set field example resolve ' which cannot be invoked until%%s is declared' defined-update");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1009
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1010
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1011
        final void printFeedbackHelp() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1012
            hard("Set the feedback mode describing displayed feedback for entered snippets and commands.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1013
            hard("");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1014
            hard("/set feedback <mode>");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1015
            hard("");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1016
            hard("Where <mode> is the name of a previously defined feedback mode.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1017
            hard("Currently defined feedback modes:");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1018
            modeMap.keySet().stream()
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1019
                    .forEach(m -> hard("   %s", m));
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1020
            hard("User-defined modes can be added, see '/help /set newmode'");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1021
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1022
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1023
        final void printNewModeHelp() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1024
            hard("Create a user-defined feedback mode, optionally copying from an existing mode.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1025
            hard("");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1026
            hard("/set newmode <new-mode> [command|quiet [<old-mode>]]");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1027
            hard("");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1028
            hard("Where <new-mode> is the name of a mode you wish to create.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1029
            hard("Where <old-mode> is the name of a previously defined feedback mode.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1030
            hard("If <old-mode> is present, its settings are copied to the new mode.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1031
            hard("'command' vs 'quiet' determines if informative/verifying command feedback is displayed.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1032
            hard("");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1033
            hard("Once the new mode is created, use '/set format', '/set field', and '/set prompt' to configure it.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1034
            hard("Use '/set feedback' to use the new mode.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1035
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1036
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1037
        final void printPromptHelp() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1038
            hard("Set the prompts.  Both the normal prompt and the continuation-prompt must be set.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1039
            hard("");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1040
            hard("/set prompt <mode> \"<prompt>\" \"<continuation-propmt>\"");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1041
            hard("");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1042
            hard("Where <mode> is the name of a previously defined feedback mode.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1043
            hard("Where <prompt> and <continuation-propmt> are quoted strings printed as input promptds;");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1044
            hard("Both may optionally contain '%%s' which will be substituted with the next snippet id --");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1045
            hard("note that what is entered may not be assigned that id, for example it may be an error or command.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1046
            hard("The continuation-prompt is used on the second and subsequent lines of a multi-line snippet.");
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1047
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1048
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
  1049
}