mirror of
https://github.com/openjdk/jdk.git
synced 2026-05-06 03:35:10 +00:00
Merge
This commit is contained in:
commit
0a327e7dac
@ -119,10 +119,6 @@ public class ClassFinder {
|
||||
*/
|
||||
final Name completionFailureName;
|
||||
|
||||
/** Module specified with -Xmodule:
|
||||
*/
|
||||
final Name moduleOverride;
|
||||
|
||||
/** Access to files
|
||||
*/
|
||||
private final JavaFileManager fileManager;
|
||||
@ -210,9 +206,6 @@ public class ClassFinder {
|
||||
? names.fromString(options.get("failcomplete"))
|
||||
: null;
|
||||
|
||||
moduleOverride = options.isSet(Option.XMODULE) ? names.fromString(options.get(Option.XMODULE))
|
||||
: null;
|
||||
|
||||
// Temporary, until more info is available from the module system.
|
||||
boolean useCtProps;
|
||||
JavaFileManager fm = context.get(JavaFileManager.class);
|
||||
@ -527,16 +520,15 @@ public class ClassFinder {
|
||||
if (msym == syms.noModule) {
|
||||
preferCurrent = false;
|
||||
if (userPathsFirst) {
|
||||
scanUserPaths(p);
|
||||
scanUserPaths(p, true);
|
||||
preferCurrent = true;
|
||||
scanPlatformPath(p);
|
||||
} else {
|
||||
scanPlatformPath(p);
|
||||
scanUserPaths(p);
|
||||
scanUserPaths(p, true);
|
||||
}
|
||||
} else if (msym.classLocation == StandardLocation.CLASS_PATH) {
|
||||
// assert p.modle.sourceLocation == StandardLocation.SOURCE_PATH);
|
||||
scanUserPaths(p);
|
||||
scanUserPaths(p, msym.sourceLocation == StandardLocation.SOURCE_PATH);
|
||||
} else {
|
||||
scanModulePaths(p, msym);
|
||||
}
|
||||
@ -561,23 +553,6 @@ public class ClassFinder {
|
||||
|
||||
String packageName = p.fullname.toString();
|
||||
|
||||
if (msym.name == moduleOverride) {
|
||||
if (wantClassFiles) {
|
||||
fillIn(p, CLASS_PATH,
|
||||
fileManager.list(CLASS_PATH,
|
||||
packageName,
|
||||
classKinds,
|
||||
false));
|
||||
}
|
||||
if (wantSourceFiles && fileManager.hasLocation(SOURCE_PATH)) {
|
||||
fillIn(p, SOURCE_PATH,
|
||||
fileManager.list(SOURCE_PATH,
|
||||
packageName,
|
||||
sourceKinds,
|
||||
false));
|
||||
}
|
||||
}
|
||||
|
||||
Location classLocn = msym.classLocation;
|
||||
Location sourceLocn = msym.sourceLocation;
|
||||
|
||||
@ -600,7 +575,7 @@ public class ClassFinder {
|
||||
/**
|
||||
* Scans class path and source path for files in given package.
|
||||
*/
|
||||
private void scanUserPaths(PackageSymbol p) throws IOException {
|
||||
private void scanUserPaths(PackageSymbol p, boolean includeSourcePath) throws IOException {
|
||||
Set<JavaFileObject.Kind> kinds = getPackageFileKinds();
|
||||
|
||||
Set<JavaFileObject.Kind> classKinds = EnumSet.copyOf(kinds);
|
||||
@ -611,7 +586,7 @@ public class ClassFinder {
|
||||
sourceKinds.remove(JavaFileObject.Kind.CLASS);
|
||||
boolean wantSourceFiles = !sourceKinds.isEmpty();
|
||||
|
||||
boolean haveSourcePath = fileManager.hasLocation(SOURCE_PATH);
|
||||
boolean haveSourcePath = includeSourcePath && fileManager.hasLocation(SOURCE_PATH);
|
||||
|
||||
if (verbose && verbosePath) {
|
||||
if (fileManager instanceof StandardJavaFileManager) {
|
||||
|
||||
@ -359,6 +359,19 @@ public abstract class Symbol extends AnnoConstruct implements Element {
|
||||
return (flags_field & DEPRECATED) != 0;
|
||||
}
|
||||
|
||||
public boolean isDeprecatableViaAnnotation() {
|
||||
switch (getKind()) {
|
||||
case LOCAL_VARIABLE:
|
||||
case PACKAGE:
|
||||
case PARAMETER:
|
||||
case RESOURCE_VARIABLE:
|
||||
case EXCEPTION_PARAMETER:
|
||||
return false;
|
||||
default:
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isStatic() {
|
||||
return
|
||||
(flags() & STATIC) != 0 ||
|
||||
|
||||
@ -3192,7 +3192,7 @@ public class Check {
|
||||
}
|
||||
|
||||
void checkDeprecatedAnnotation(DiagnosticPosition pos, Symbol s) {
|
||||
if (lint.isEnabled(LintCategory.DEP_ANN) &&
|
||||
if (lint.isEnabled(LintCategory.DEP_ANN) && s.isDeprecatableViaAnnotation() &&
|
||||
(s.flags() & DEPRECATED) != 0 &&
|
||||
!syms.deprecatedType.isErroneous() &&
|
||||
s.attribute(syms.deprecatedType.tsym) == null) {
|
||||
@ -3200,18 +3200,10 @@ public class Check {
|
||||
pos, "missing.deprecated.annotation");
|
||||
}
|
||||
// Note: @Deprecated has no effect on local variables, parameters and package decls.
|
||||
if (lint.isEnabled(LintCategory.DEPRECATION)) {
|
||||
if (lint.isEnabled(LintCategory.DEPRECATION) && !s.isDeprecatableViaAnnotation()) {
|
||||
if (!syms.deprecatedType.isErroneous() && s.attribute(syms.deprecatedType.tsym) != null) {
|
||||
switch (s.getKind()) {
|
||||
case LOCAL_VARIABLE:
|
||||
case PACKAGE:
|
||||
case PARAMETER:
|
||||
case RESOURCE_VARIABLE:
|
||||
case EXCEPTION_PARAMETER:
|
||||
log.warning(LintCategory.DEPRECATION, pos,
|
||||
"deprecated.annotation.has.no.effect", Kinds.kindName(s));
|
||||
break;
|
||||
}
|
||||
log.warning(LintCategory.DEPRECATION, pos,
|
||||
"deprecated.annotation.has.no.effect", Kinds.kindName(s));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -392,6 +392,7 @@ public class Modules extends JCTree.Visitor {
|
||||
if (moduleOverride != null) {
|
||||
checkNoAllModulePath();
|
||||
defaultModule = moduleFinder.findModule(names.fromString(moduleOverride));
|
||||
defaultModule.sourceLocation = StandardLocation.SOURCE_PATH;
|
||||
} else {
|
||||
// Question: why not do findAllModules and initVisiblePackages here?
|
||||
// i.e. body of unnamedModuleCompleter
|
||||
@ -432,7 +433,9 @@ public class Modules extends JCTree.Visitor {
|
||||
|
||||
if (defaultModule != syms.unnamedModule) {
|
||||
syms.unnamedModule.completer = getUnnamedModuleCompleter();
|
||||
syms.unnamedModule.sourceLocation = StandardLocation.SOURCE_PATH;
|
||||
if (moduleOverride == null) {
|
||||
syms.unnamedModule.sourceLocation = StandardLocation.SOURCE_PATH;
|
||||
}
|
||||
syms.unnamedModule.classLocation = StandardLocation.CLASS_PATH;
|
||||
}
|
||||
|
||||
@ -1090,7 +1093,7 @@ public class Modules extends JCTree.Visitor {
|
||||
Set<ModuleSymbol> requiresPublic = requiresPublicCache.get(msym);
|
||||
|
||||
if (requiresPublic == null) {
|
||||
//the module graph may contain cycles involving automatic modules or -XaddReads edges
|
||||
//the module graph may contain cycles involving automatic modules or --add-reads edges
|
||||
requiresPublic = new HashSet<>();
|
||||
|
||||
Set<ModuleSymbol> seen = new HashSet<>();
|
||||
@ -1192,7 +1195,7 @@ public class Modules extends JCTree.Visitor {
|
||||
}
|
||||
|
||||
// Terminology comes from
|
||||
// -XaddExports:module/package=target,...
|
||||
// --add-exports module/package=target,...
|
||||
// Compare to
|
||||
// module module { exports package to target, ... }
|
||||
String moduleName = em.group(1);
|
||||
@ -1245,7 +1248,7 @@ public class Modules extends JCTree.Visitor {
|
||||
}
|
||||
|
||||
// Terminology comes from
|
||||
// -XaddReads:target-module=source-module,...
|
||||
// --add-reads target-module=source-module,...
|
||||
// Compare to
|
||||
// module target-module { requires source-module; ... }
|
||||
String targetName = rm.group(1);
|
||||
|
||||
@ -810,7 +810,7 @@ public class Locations {
|
||||
* SYSTEM_MODULES and MODULE_PATH.
|
||||
*
|
||||
* The Location can be specified to accept overriding classes from the
|
||||
* {@code -Xpatch:<module>=<path> } parameter.
|
||||
* {@code --patch-module <module>=<path> } parameter.
|
||||
*/
|
||||
private class ModuleLocationHandler extends LocationHandler implements Location {
|
||||
protected final String name;
|
||||
|
||||
@ -183,15 +183,15 @@ public enum Option {
|
||||
|
||||
SOURCE_PATH("--source-path -sourcepath", "opt.arg.path", "opt.sourcepath", STANDARD, FILEMANAGER),
|
||||
|
||||
MODULE_SOURCE_PATH("--module-source-path -modulesourcepath", "opt.arg.mspath", "opt.modulesourcepath", STANDARD, FILEMANAGER),
|
||||
MODULE_SOURCE_PATH("--module-source-path", "opt.arg.mspath", "opt.modulesourcepath", STANDARD, FILEMANAGER),
|
||||
|
||||
MODULE_PATH("--module-path -p -modulepath -mp", "opt.arg.path", "opt.modulepath", STANDARD, FILEMANAGER),
|
||||
MODULE_PATH("--module-path -p", "opt.arg.path", "opt.modulepath", STANDARD, FILEMANAGER),
|
||||
|
||||
UPGRADE_MODULE_PATH("--upgrade-module-path -upgrademodulepath", "opt.arg.path", "opt.upgrademodulepath", STANDARD, FILEMANAGER),
|
||||
UPGRADE_MODULE_PATH("--upgrade-module-path", "opt.arg.path", "opt.upgrademodulepath", STANDARD, FILEMANAGER),
|
||||
|
||||
SYSTEM("--system -system", "opt.arg.jdk", "opt.system", STANDARD, FILEMANAGER),
|
||||
SYSTEM("--system", "opt.arg.jdk", "opt.system", STANDARD, FILEMANAGER),
|
||||
|
||||
PATCH_MODULE("--patch-module -Xpatch:", "opt.arg.patch", "opt.patch", EXTENDED, FILEMANAGER) {
|
||||
PATCH_MODULE("--patch-module", "opt.arg.patch", "opt.patch", EXTENDED, FILEMANAGER) {
|
||||
// The deferred filemanager diagnostics mechanism assumes a single value per option,
|
||||
// but --patch-module can be used multiple times, once per module. Therefore we compose
|
||||
// a value for the option containing the last value specified for each module, and separate
|
||||
@ -273,7 +273,7 @@ public enum Option {
|
||||
|
||||
PROCESSOR_PATH("--processor-path -processorpath", "opt.arg.path", "opt.processorpath", STANDARD, FILEMANAGER),
|
||||
|
||||
PROCESSOR_MODULE_PATH("--processor-module-path -processormodulepath", "opt.arg.path", "opt.processormodulepath", STANDARD, FILEMANAGER),
|
||||
PROCESSOR_MODULE_PATH("--processor-module-path", "opt.arg.path", "opt.processormodulepath", STANDARD, FILEMANAGER),
|
||||
|
||||
PARAMETERS("-parameters","opt.parameters", STANDARD, BASIC),
|
||||
|
||||
@ -311,7 +311,7 @@ public enum Option {
|
||||
}
|
||||
},
|
||||
|
||||
RELEASE("--release -release", "opt.arg.release", "opt.release", STANDARD, BASIC) {
|
||||
RELEASE("--release", "opt.arg.release", "opt.release", STANDARD, BASIC) {
|
||||
@Override
|
||||
protected void help(Log log) {
|
||||
Iterable<PlatformProvider> providers =
|
||||
@ -566,7 +566,7 @@ public enum Option {
|
||||
}
|
||||
},
|
||||
|
||||
ADD_EXPORTS("--add-exports -XaddExports:", "opt.arg.addExports", "opt.addExports", EXTENDED, BASIC) {
|
||||
ADD_EXPORTS("--add-exports", "opt.arg.addExports", "opt.addExports", EXTENDED, BASIC) {
|
||||
@Override
|
||||
public boolean process(OptionHelper helper, String option, String arg) {
|
||||
String prev = helper.get(ADD_EXPORTS);
|
||||
@ -575,7 +575,7 @@ public enum Option {
|
||||
}
|
||||
},
|
||||
|
||||
ADD_READS("--add-reads -XaddReads:", "opt.arg.addReads", "opt.addReads", EXTENDED, BASIC) {
|
||||
ADD_READS("--add-reads", "opt.arg.addReads", "opt.addReads", EXTENDED, BASIC) {
|
||||
@Override
|
||||
public boolean process(OptionHelper helper, String option, String arg) {
|
||||
String prev = helper.get(ADD_READS);
|
||||
@ -598,9 +598,9 @@ public enum Option {
|
||||
|
||||
MODULE("--module -m", "opt.arg.m", "opt.m", STANDARD, BASIC),
|
||||
|
||||
ADD_MODULES("--add-modules -addmods", "opt.arg.addmods", "opt.addmods", STANDARD, BASIC),
|
||||
ADD_MODULES("--add-modules", "opt.arg.addmods", "opt.addmods", STANDARD, BASIC),
|
||||
|
||||
LIMIT_MODULES("--limit-modules -limitmods", "opt.arg.limitmods", "opt.limitmods", STANDARD, BASIC),
|
||||
LIMIT_MODULES("--limit-modules", "opt.arg.limitmods", "opt.limitmods", STANDARD, BASIC),
|
||||
|
||||
// This option exists only for the purpose of documenting itself.
|
||||
// It's actually implemented by the CommandLine class.
|
||||
@ -645,7 +645,7 @@ public enum Option {
|
||||
}
|
||||
},
|
||||
|
||||
MULTIRELEASE("--multi-release -multi-release", "opt.arg.multi-release", "opt.multi-release", HIDDEN, FILEMANAGER),
|
||||
MULTIRELEASE("--multi-release", "opt.arg.multi-release", "opt.multi-release", HIDDEN, FILEMANAGER),
|
||||
|
||||
INHERIT_RUNTIME_ENVIRONMENT("--inherit-runtime-environment", "opt.inherit_runtime_environment",
|
||||
EXTENDED, BASIC) {
|
||||
|
||||
@ -36,7 +36,7 @@ import javax.annotation.processing.Processor;
|
||||
|
||||
import com.sun.source.util.Plugin;
|
||||
|
||||
/**A description of settings needed for a particular {@code -release name} option.
|
||||
/**A description of settings needed for a particular {@code --release name} option.
|
||||
*
|
||||
* <p><b>This is NOT part of any supported API.
|
||||
* If you write code that depends on this, you do so at your own risk.
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
|
||||
package com.sun.tools.javac.platform;
|
||||
|
||||
/** A collection of platform descriptions that can be selected using {@code -release name}
|
||||
/** A collection of platform descriptions that can be selected using {@code --release name}
|
||||
* command line option.
|
||||
* Register in {@code META-INF/services/com.sun.tools.javac.platform.PlatformProvider}.
|
||||
*
|
||||
@ -36,7 +36,7 @@ package com.sun.tools.javac.platform;
|
||||
*/
|
||||
public interface PlatformProvider {
|
||||
|
||||
/**Names of platforms supported by this provider. Each returned name can be used as the key for -release.
|
||||
/**Names of platforms supported by this provider. Each returned name can be used as the key for --release.
|
||||
*
|
||||
* @return the platform keys
|
||||
*/
|
||||
|
||||
@ -24,7 +24,7 @@
|
||||
*/
|
||||
|
||||
/**
|
||||
* An internal API for plugging in -release implementations.
|
||||
* An internal API for plugging in --release implementations.
|
||||
*
|
||||
* <p><b>This is NOT part of any supported API.
|
||||
* If you write code that depends on this, you do so at your own risk.
|
||||
|
||||
@ -2780,10 +2780,10 @@ compiler.err.module-info.with.xmodule.classpath=\
|
||||
illegal combination of -Xmodule and module-info on classpath
|
||||
|
||||
compiler.err.xmodule.no.module.sourcepath=\
|
||||
illegal combination of -Xmodule and -modulesourcepath
|
||||
illegal combination of -Xmodule and --module-source-path
|
||||
|
||||
compiler.err.processorpath.no.processormodulepath=\
|
||||
illegal combination of -processorpath and -processormodulepath
|
||||
illegal combination of -processorpath and --processor-module-path
|
||||
|
||||
# 0: symbol
|
||||
compiler.err.package.in.other.module=\
|
||||
@ -2817,22 +2817,22 @@ compiler.err.duplicate.module.on.path=\
|
||||
|
||||
# 0: string
|
||||
compiler.err.xaddexports.malformed.entry=\
|
||||
bad value for -XaddExports: {0}
|
||||
bad value for --add-exports {0}
|
||||
|
||||
# 0: string
|
||||
compiler.err.xaddexports.too.many=\
|
||||
multiple -XaddExports options for {0}
|
||||
multiple --add-exports options for {0}
|
||||
|
||||
# 0: string
|
||||
compiler.err.xaddreads.malformed.entry=\
|
||||
bad value for -XaddReads: {0}
|
||||
bad value for --add-reads {0}
|
||||
|
||||
# 0: string
|
||||
compiler.err.xaddreads.too.many=\
|
||||
multiple -XaddReads options for {0}
|
||||
multiple --add-reads options for {0}
|
||||
|
||||
compiler.err.addmods.all.module.path.invalid=\
|
||||
-addmods ALL-MODULE-PATH can only be used when compiling the unnamed module
|
||||
--add-modules ALL-MODULE-PATH can only be used when compiling the unnamed module
|
||||
|
||||
compiler.misc.locn.module_source_path=\
|
||||
module source path
|
||||
|
||||
@ -390,10 +390,10 @@ javac.version={0} {1}
|
||||
javac.fullVersion={0} full version "{1}"
|
||||
|
||||
javac.err.release.bootclasspath.conflict=\
|
||||
option {0} cannot be used together with -release
|
||||
option {0} cannot be used together with --release
|
||||
|
||||
javac.err.unsupported.release.version=\
|
||||
release version {0} not supported
|
||||
|
||||
javac.err.release.not.standard.file.manager=\
|
||||
-release option specified, but the provided JavaFileManager is not a StandardJavaFileManager.
|
||||
--release option specified, but the provided JavaFileManager is not a StandardJavaFileManager.
|
||||
|
||||
@ -26,6 +26,8 @@
|
||||
package com.sun.tools.javac.util;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import com.sun.tools.javac.code.Source;
|
||||
import com.sun.tools.javac.main.Option;
|
||||
import static com.sun.tools.javac.main.Option.*;
|
||||
|
||||
@ -176,7 +178,17 @@ public class Options {
|
||||
// disabled
|
||||
return
|
||||
isSet(XLINT_CUSTOM, s) ||
|
||||
(isSet(XLINT) || isSet(XLINT_CUSTOM, "all")) &&
|
||||
(isSet(XLINT) || isSet(XLINT_CUSTOM, "all") || (s.equals("dep-ann") && depAnnOnByDefault())) &&
|
||||
isUnset(XLINT_CUSTOM, "-" + s);
|
||||
}
|
||||
// where
|
||||
private boolean depAnnOnByDefault() {
|
||||
String sourceName = get(Option.SOURCE);
|
||||
Source source = null;
|
||||
if (sourceName != null)
|
||||
source = Source.lookup(sourceName);
|
||||
if (source == null)
|
||||
source = Source.DEFAULT;
|
||||
return source.compareTo(Source.JDK1_9) >= 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -85,13 +85,7 @@ public enum Option {
|
||||
helper.modulepath(paths);
|
||||
}
|
||||
},
|
||||
MODULEPATH("-modulepath", "An alias for -modulepath") {
|
||||
@Override
|
||||
protected void processMatching(ArgumentIterator iter, OptionHelper helper) {
|
||||
MODULE_PATH.processMatching(iter, helper);
|
||||
}
|
||||
},
|
||||
P("-p", "An alias for -modulepath") {
|
||||
P("-p", "An alias for --module-path") {
|
||||
@Override
|
||||
protected void processMatching(ArgumentIterator iter, OptionHelper helper) {
|
||||
MODULE_PATH.processMatching(iter, helper);
|
||||
|
||||
@ -104,13 +104,6 @@ public enum ToolOption {
|
||||
}
|
||||
},
|
||||
|
||||
MODULESOURCEPATH("-modulesourcepath", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
helper.setFileManagerOpt(Option.MODULE_SOURCE_PATH, arg);
|
||||
}
|
||||
},
|
||||
|
||||
MODULE_SOURCE_PATH("--module-source-path", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
@ -118,13 +111,6 @@ public enum ToolOption {
|
||||
}
|
||||
},
|
||||
|
||||
UPGRADEMODULEPATH("-upgrademodulepath", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
helper.setFileManagerOpt(Option.UPGRADE_MODULE_PATH, arg);
|
||||
}
|
||||
},
|
||||
|
||||
UPGRADE_MODULE_PATH("--upgrade-module-path", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
@ -132,13 +118,6 @@ public enum ToolOption {
|
||||
}
|
||||
},
|
||||
|
||||
SYSTEM("-system", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
helper.setFileManagerOpt(Option.SYSTEM, arg);
|
||||
}
|
||||
},
|
||||
|
||||
SYSTEM_("--system", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
@ -146,13 +125,6 @@ public enum ToolOption {
|
||||
}
|
||||
},
|
||||
|
||||
MODULEPATH("-modulepath", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
helper.setFileManagerOpt(Option.MODULE_PATH, arg);
|
||||
}
|
||||
},
|
||||
|
||||
MODULE_PATH("--module-path", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
@ -167,13 +139,6 @@ public enum ToolOption {
|
||||
}
|
||||
},
|
||||
|
||||
ADDMODS("-addmods", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
helper.setCompilerOpt(opt, arg);
|
||||
}
|
||||
},
|
||||
|
||||
ADD_MODULES("--add-modules", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
@ -181,13 +146,6 @@ public enum ToolOption {
|
||||
}
|
||||
},
|
||||
|
||||
LIMITMODS("-limitmods", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
helper.setCompilerOpt(opt, arg);
|
||||
}
|
||||
},
|
||||
|
||||
LIMIT_MODULES("--limit-modules", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
@ -210,13 +168,6 @@ public enum ToolOption {
|
||||
}
|
||||
},
|
||||
|
||||
RELEASE_OLD("-release", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
helper.setCompilerOpt("--release", arg);
|
||||
}
|
||||
},
|
||||
|
||||
SOURCE("-source", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
@ -238,13 +189,6 @@ public enum ToolOption {
|
||||
}
|
||||
},
|
||||
|
||||
XADDREADS("-XaddReads:", false) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
Option.ADD_READS.process(helper.getOptionHelper(), arg);
|
||||
}
|
||||
},
|
||||
|
||||
ADD_READS("--add-reads", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
@ -252,13 +196,6 @@ public enum ToolOption {
|
||||
}
|
||||
},
|
||||
|
||||
ADDEXPORTS("-XaddExports:", false) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
Option.ADD_EXPORTS.process(helper.getOptionHelper(), arg);
|
||||
}
|
||||
},
|
||||
|
||||
ADD_EXPORTS("--add-exports", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
@ -273,13 +210,6 @@ public enum ToolOption {
|
||||
}
|
||||
},
|
||||
|
||||
XPATCH("-Xpatch:", false) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
Option.XMODULE.process(helper.getOptionHelper(), arg);
|
||||
}
|
||||
},
|
||||
|
||||
PATCH_MODULE("--patch-module", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
|
||||
@ -106,13 +106,6 @@ public enum ToolOption {
|
||||
}
|
||||
},
|
||||
|
||||
MODULESOURCEPATH("-modulesourcepath", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
helper.setFileManagerOpt(Option.MODULE_SOURCE_PATH, arg);
|
||||
}
|
||||
},
|
||||
|
||||
MODULE_SOURCE_PATH("--module-source-path", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
@ -120,13 +113,6 @@ public enum ToolOption {
|
||||
}
|
||||
},
|
||||
|
||||
UPGRADEMODULEPATH("-upgrademodulepath", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
helper.setFileManagerOpt(Option.UPGRADE_MODULE_PATH, arg);
|
||||
}
|
||||
},
|
||||
|
||||
UPGRADE_MODULE_PATH("--upgrade-module-path", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
@ -134,27 +120,13 @@ public enum ToolOption {
|
||||
}
|
||||
},
|
||||
|
||||
SYSTEM("-system", true) {
|
||||
SYSTEM("--system", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
helper.setFileManagerOpt(Option.SYSTEM, arg);
|
||||
}
|
||||
},
|
||||
|
||||
SYSTEM_("--system", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
helper.setFileManagerOpt(Option.SYSTEM, arg);
|
||||
}
|
||||
},
|
||||
|
||||
MODULEPATH("-modulepath", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
helper.setFileManagerOpt(Option.MODULE_PATH, arg);
|
||||
}
|
||||
},
|
||||
|
||||
MODULE_PATH("--module-path", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
@ -169,13 +141,6 @@ public enum ToolOption {
|
||||
}
|
||||
},
|
||||
|
||||
ADDMODS("-addmods", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
Option.ADD_MODULES.process(helper.getOptionHelper(), opt, arg);
|
||||
}
|
||||
},
|
||||
|
||||
ADD_MODULES("--add-modules", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
@ -183,13 +148,6 @@ public enum ToolOption {
|
||||
}
|
||||
},
|
||||
|
||||
LIMITMODS("-limitmods", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
Option.LIMIT_MODULES.process(helper.getOptionHelper(), opt, arg);
|
||||
}
|
||||
},
|
||||
|
||||
LIMIT_MODULES("--limit-modules", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
@ -218,13 +176,6 @@ public enum ToolOption {
|
||||
}
|
||||
},
|
||||
|
||||
RELEASE_OLD("-release", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
Option.RELEASE.process(helper.getOptionHelper(), opt, arg);
|
||||
}
|
||||
},
|
||||
|
||||
SOURCE("-source", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
@ -246,13 +197,6 @@ public enum ToolOption {
|
||||
}
|
||||
},
|
||||
|
||||
XADDREADS("-XaddReads:", false) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
Option.ADD_READS.process(helper.getOptionHelper(), arg);
|
||||
}
|
||||
},
|
||||
|
||||
ADD_READS("--add-reads", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
@ -260,13 +204,6 @@ public enum ToolOption {
|
||||
}
|
||||
},
|
||||
|
||||
ADDEXPORTS("-XaddExports:", false) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
Option.ADD_EXPORTS.process(helper.getOptionHelper(), arg);
|
||||
}
|
||||
},
|
||||
|
||||
ADD_EXPORTS("--add-exports", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
@ -281,13 +218,6 @@ public enum ToolOption {
|
||||
}
|
||||
},
|
||||
|
||||
XPATCH("-Xpatch:", false) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
Option.XMODULE.process(helper.getOptionHelper(), arg);
|
||||
}
|
||||
},
|
||||
|
||||
PATCH_MODULE("--patch-module", true) {
|
||||
@Override
|
||||
public void process(Helper helper, String arg) {
|
||||
|
||||
@ -81,7 +81,7 @@ import javax.lang.model.element.TypeElement;
|
||||
* - more rigorous GNU style option parsing; use joptsimple?
|
||||
*
|
||||
* FUTURES:
|
||||
* - add module support: -addmods, -modulepath, module arg
|
||||
* - add module support: --add-modules, --module-path, module arg
|
||||
* - load deprecation declarations from a designated class library instead
|
||||
* of the JDK
|
||||
* - load deprecation declarations from a module
|
||||
@ -181,7 +181,7 @@ public class Main implements DiagnosticListener<JavaFileObject> {
|
||||
.filter(name -> !name.endsWith("package-info.class"))
|
||||
.filter(name -> !name.endsWith("module-info.class"))
|
||||
.map(s -> s.replaceAll("\\.class$", ""))
|
||||
.map(s -> s.replace('/', '.'))
|
||||
.map(s -> s.replace(File.separatorChar, '.'))
|
||||
.collect(toList()));
|
||||
}
|
||||
|
||||
@ -331,7 +331,7 @@ public class Main implements DiagnosticListener<JavaFileObject> {
|
||||
* @throws IOException if an I/O error occurs
|
||||
*/
|
||||
boolean processSelf(Collection<String> classes) throws IOException {
|
||||
options.add("-addmods");
|
||||
options.add("--add-modules");
|
||||
options.add("java.se.ee,jdk.xml.bind"); // TODO why jdk.xml.bind?
|
||||
|
||||
if (classes.isEmpty()) {
|
||||
@ -360,7 +360,7 @@ public class Main implements DiagnosticListener<JavaFileObject> {
|
||||
* @return success value
|
||||
*/
|
||||
boolean processRelease(String release, Collection<String> classes) throws IOException {
|
||||
options.addAll(List.of("-release", release));
|
||||
options.addAll(List.of("--release", release));
|
||||
|
||||
if (release.equals("9")) {
|
||||
List<String> rootMods = List.of("java.se", "java.se.ee");
|
||||
@ -368,7 +368,7 @@ public class Main implements DiagnosticListener<JavaFileObject> {
|
||||
JavaCompiler.CompilationTask task =
|
||||
compiler.getTask(null, fm, this,
|
||||
// options
|
||||
List.of("-addmods", String.join(",", rootMods)),
|
||||
List.of("--add-modules", String.join(",", rootMods)),
|
||||
// classes
|
||||
List.of("java.lang.Object"),
|
||||
null);
|
||||
@ -377,7 +377,7 @@ public class Main implements DiagnosticListener<JavaFileObject> {
|
||||
return false;
|
||||
}
|
||||
Map<PackageElement, List<TypeElement>> types = proc.getPublicTypes();
|
||||
options.add("-addmods");
|
||||
options.add("--add-modules");
|
||||
options.add(String.join(",", rootMods));
|
||||
return doClassNames(
|
||||
types.values().stream()
|
||||
|
||||
@ -56,7 +56,7 @@ import static java.util.stream.Collectors.*;
|
||||
* 1. archives specified in the command line arguments
|
||||
* 2. observable modules matching the source filter
|
||||
* 3. classpath archives matching the source filter or target filter
|
||||
* 4. -addmods and -m root modules
|
||||
* 4. --add-modules and -m root modules
|
||||
*/
|
||||
public class DepsAnalyzer {
|
||||
final JdepsConfiguration configuration;
|
||||
|
||||
@ -127,7 +127,7 @@ public class JdepsConfiguration implements AutoCloseable {
|
||||
}
|
||||
}
|
||||
|
||||
// all roots specified in -addmods or -m are included
|
||||
// all roots specified in --add-modules or -m are included
|
||||
// as the initial set for analysis.
|
||||
roots.stream()
|
||||
.map(nameToModule::get)
|
||||
@ -342,7 +342,7 @@ public class JdepsConfiguration implements AutoCloseable {
|
||||
|
||||
SystemModuleFinder(String javaHome) throws IOException {
|
||||
if (javaHome == null) {
|
||||
// -system none
|
||||
// --system none
|
||||
this.fileSystem = null;
|
||||
this.root = null;
|
||||
this.systemModules = Collections.emptyMap();
|
||||
|
||||
@ -313,7 +313,7 @@ class JdepsTask {
|
||||
}
|
||||
},
|
||||
|
||||
// Another alternative to list modules in -addmods option
|
||||
// Another alternative to list modules in --add-modules option
|
||||
new HiddenOption(true, "--include-system-modules") {
|
||||
void process(JdepsTask task, String opt, String arg) throws BadArgs {
|
||||
task.options.includeSystemModulePattern = Pattern.compile(arg);
|
||||
|
||||
@ -57,6 +57,8 @@ import jdk.internal.jline.console.ConsoleReader;
|
||||
import jdk.internal.jline.console.KeyMap;
|
||||
import jdk.internal.jline.console.UserInterruptException;
|
||||
import jdk.internal.jline.console.completer.Completer;
|
||||
import jdk.internal.jline.console.history.History;
|
||||
import jdk.internal.jline.console.history.MemoryHistory;
|
||||
import jdk.internal.jline.extra.EditingHistory;
|
||||
import jdk.internal.jshell.tool.StopDetectingInputStream.State;
|
||||
|
||||
@ -68,6 +70,7 @@ class ConsoleIOContext extends IOContext {
|
||||
final StopDetectingInputStream input;
|
||||
final ConsoleReader in;
|
||||
final EditingHistory history;
|
||||
final MemoryHistory userInputHistory = new MemoryHistory();
|
||||
|
||||
String prefix = "";
|
||||
|
||||
@ -299,6 +302,9 @@ class ConsoleIOContext extends IOContext {
|
||||
}
|
||||
|
||||
public void beforeUserCode() {
|
||||
synchronized (this) {
|
||||
inputBytes = null;
|
||||
}
|
||||
input.setState(State.BUFFER);
|
||||
}
|
||||
|
||||
@ -380,6 +386,36 @@ class ConsoleIOContext extends IOContext {
|
||||
}
|
||||
}
|
||||
|
||||
private byte[] inputBytes;
|
||||
private int inputBytesPointer;
|
||||
|
||||
@Override
|
||||
public synchronized int readUserInput() {
|
||||
while (inputBytes == null || inputBytes.length <= inputBytesPointer) {
|
||||
boolean prevHandleUserInterrupt = in.getHandleUserInterrupt();
|
||||
History prevHistory = in.getHistory();
|
||||
|
||||
try {
|
||||
input.setState(State.WAIT);
|
||||
in.setHandleUserInterrupt(true);
|
||||
in.setHistory(userInputHistory);
|
||||
inputBytes = (in.readLine("") + System.getProperty("line.separator")).getBytes();
|
||||
inputBytesPointer = 0;
|
||||
} catch (IOException ex) {
|
||||
ex.printStackTrace();
|
||||
return -1;
|
||||
} catch (UserInterruptException ex) {
|
||||
repl.state.stop();
|
||||
return -1;
|
||||
} finally {
|
||||
in.setHistory(prevHistory);
|
||||
in.setHandleUserInterrupt(prevHandleUserInterrupt);
|
||||
input.setState(State.BUFFER);
|
||||
}
|
||||
}
|
||||
return inputBytes[inputBytesPointer++];
|
||||
}
|
||||
|
||||
/**
|
||||
* A possible action which the user can choose to perform.
|
||||
*/
|
||||
|
||||
@ -0,0 +1,97 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package jdk.internal.jshell.tool;
|
||||
|
||||
import java.util.List;
|
||||
import static java.util.Comparator.comparing;
|
||||
import java.util.Map;
|
||||
import java.util.function.BiPredicate;
|
||||
import java.util.function.Supplier;
|
||||
import static java.util.stream.Collectors.toList;
|
||||
import java.util.stream.Stream;
|
||||
import jdk.internal.jshell.tool.JShellTool.CompletionProvider;
|
||||
import jdk.jshell.SourceCodeAnalysis;
|
||||
import jdk.jshell.SourceCodeAnalysis.Suggestion;
|
||||
|
||||
class ContinuousCompletionProvider implements CompletionProvider {
|
||||
|
||||
static final BiPredicate<String, String> STARTSWITH_MATCHER =
|
||||
(word, input) -> word.startsWith(input);
|
||||
static final BiPredicate<String, String> PERFECT_MATCHER =
|
||||
(word, input) -> word.equals(input);
|
||||
|
||||
private final Supplier<Map<String, CompletionProvider>> wordCompletionProviderSupplier;
|
||||
private final BiPredicate<String, String> matcher;
|
||||
|
||||
ContinuousCompletionProvider(
|
||||
Map<String, CompletionProvider> wordCompletionProvider,
|
||||
BiPredicate<String, String> matcher) {
|
||||
this(() -> wordCompletionProvider, matcher);
|
||||
}
|
||||
|
||||
ContinuousCompletionProvider(
|
||||
Supplier<Map<String, CompletionProvider>> wordCompletionProviderSupplier,
|
||||
BiPredicate<String, String> matcher) {
|
||||
this.wordCompletionProviderSupplier = wordCompletionProviderSupplier;
|
||||
this.matcher = matcher;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Suggestion> completionSuggestions(String input, int cursor, int[] anchor) {
|
||||
String prefix = input.substring(0, cursor);
|
||||
int space = prefix.indexOf(' ');
|
||||
|
||||
Stream<SourceCodeAnalysis.Suggestion> result;
|
||||
|
||||
Map<String, CompletionProvider> wordCompletionProvider = wordCompletionProviderSupplier.get();
|
||||
|
||||
if (space == (-1)) {
|
||||
result = wordCompletionProvider.keySet().stream()
|
||||
.distinct()
|
||||
.filter(key -> key.startsWith(prefix))
|
||||
.map(key -> new JShellTool.ArgSuggestion(key + " "));
|
||||
anchor[0] = 0;
|
||||
} else {
|
||||
String rest = prefix.substring(space + 1);
|
||||
String word = prefix.substring(0, space);
|
||||
|
||||
List<CompletionProvider> candidates = wordCompletionProvider.entrySet().stream()
|
||||
.filter(e -> matcher.test(e.getKey(), word))
|
||||
.map(Map.Entry::getValue)
|
||||
.collect(toList());
|
||||
if (candidates.size() == 1) {
|
||||
result = candidates.get(0).completionSuggestions(rest, cursor - space - 1, anchor).stream();
|
||||
} else {
|
||||
result = Stream.empty();
|
||||
}
|
||||
anchor[0] += space + 1;
|
||||
}
|
||||
|
||||
return result.sorted(comparing(Suggestion::continuation))
|
||||
.collect(toList());
|
||||
}
|
||||
|
||||
}
|
||||
@ -35,9 +35,14 @@ import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.function.Function;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import static java.util.stream.Collectors.joining;
|
||||
import static java.util.stream.Collectors.toMap;
|
||||
import static jdk.internal.jshell.tool.ContinuousCompletionProvider.PERFECT_MATCHER;
|
||||
import jdk.internal.jshell.tool.JShellTool.CompletionProvider;
|
||||
import static jdk.internal.jshell.tool.JShellTool.EMPTY_COMPLETION_PROVIDER;
|
||||
|
||||
/**
|
||||
* Feedback customization support
|
||||
@ -146,6 +151,17 @@ class Feedback {
|
||||
.forEach(m -> m.readOnly = true);
|
||||
}
|
||||
|
||||
JShellTool.CompletionProvider modeCompletions() {
|
||||
return modeCompletions(EMPTY_COMPLETION_PROVIDER);
|
||||
}
|
||||
|
||||
JShellTool.CompletionProvider modeCompletions(CompletionProvider successor) {
|
||||
return new ContinuousCompletionProvider(
|
||||
() -> modeMap.keySet().stream()
|
||||
.collect(toMap(Function.identity(), m -> successor)),
|
||||
PERFECT_MATCHER);
|
||||
}
|
||||
|
||||
{
|
||||
for (FormatCase e : FormatCase.all)
|
||||
selectorMap.put(e.name().toLowerCase(Locale.US), e);
|
||||
|
||||
@ -54,6 +54,8 @@ abstract class IOContext implements AutoCloseable {
|
||||
|
||||
public abstract void replaceLastHistoryEntry(String source);
|
||||
|
||||
public abstract int readUserInput();
|
||||
|
||||
class InputInterruptedException extends Exception {
|
||||
private static final long serialVersionUID = 1L;
|
||||
}
|
||||
|
||||
@ -26,7 +26,6 @@
|
||||
package jdk.internal.jshell.tool;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileReader;
|
||||
@ -112,6 +111,7 @@ import static jdk.internal.jshell.debug.InternalDebugControl.DBG_DEP;
|
||||
import static jdk.internal.jshell.debug.InternalDebugControl.DBG_EVNT;
|
||||
import static jdk.internal.jshell.debug.InternalDebugControl.DBG_FMGR;
|
||||
import static jdk.internal.jshell.debug.InternalDebugControl.DBG_GEN;
|
||||
import static jdk.internal.jshell.tool.ContinuousCompletionProvider.STARTSWITH_MATCHER;
|
||||
|
||||
/**
|
||||
* Command line REPL tool for Java using the JShell API.
|
||||
@ -138,6 +138,25 @@ public class JShellTool implements MessageHandler {
|
||||
|
||||
final Feedback feedback = new Feedback();
|
||||
|
||||
/**
|
||||
* The constructor for the tool (used by tool launch via main and by test
|
||||
* harnesses to capture ins and outs.
|
||||
* @param in command line input -- snippets, commands and user input
|
||||
* @param cmdout command line output, feedback including errors
|
||||
* @param cmderr start-up errors and debugging info
|
||||
* @param console console control interaction
|
||||
* @param userout code execution output -- System.out.printf("hi")
|
||||
* @param usererr code execution error stream -- System.err.printf("Oops")
|
||||
* @param prefs preferences to use
|
||||
* @param locale locale to use
|
||||
*/
|
||||
public JShellTool(InputStream in, PrintStream cmdout, PrintStream cmderr,
|
||||
PrintStream console,
|
||||
PrintStream userout, PrintStream usererr,
|
||||
Preferences prefs, Locale locale) {
|
||||
this(in, cmdout, cmderr, console, null, userout, usererr, prefs, locale);
|
||||
}
|
||||
|
||||
/**
|
||||
* The constructor for the tool (used by tool launch via main and by test
|
||||
* harnesses to capture ins and outs.
|
||||
@ -145,7 +164,7 @@ public class JShellTool implements MessageHandler {
|
||||
* @param cmdout command line output, feedback including errors
|
||||
* @param cmderr start-up errors and debugging info
|
||||
* @param console console control interaction
|
||||
* @param userin code execution input (not yet functional)
|
||||
* @param userin code execution input, or null to use IOContext
|
||||
* @param userout code execution output -- System.out.printf("hi")
|
||||
* @param usererr code execution error stream -- System.err.printf("Oops")
|
||||
* @param prefs preferences to use
|
||||
@ -159,7 +178,12 @@ public class JShellTool implements MessageHandler {
|
||||
this.cmdout = cmdout;
|
||||
this.cmderr = cmderr;
|
||||
this.console = console;
|
||||
this.userin = userin;
|
||||
this.userin = userin != null ? userin : new InputStream() {
|
||||
@Override
|
||||
public int read() throws IOException {
|
||||
return input.readUserInput();
|
||||
}
|
||||
};
|
||||
this.userout = userout;
|
||||
this.usererr = usererr;
|
||||
this.prefs = prefs;
|
||||
@ -451,7 +475,7 @@ public class JShellTool implements MessageHandler {
|
||||
*/
|
||||
public static void main(String[] args) throws Exception {
|
||||
new JShellTool(System.in, System.out, System.err, System.out,
|
||||
new ByteArrayInputStream(new byte[0]), System.out, System.err,
|
||||
System.out, System.err,
|
||||
Preferences.userRoot().node("tool/JShell"),
|
||||
Locale.getDefault())
|
||||
.start(args);
|
||||
@ -909,6 +933,7 @@ public class JShellTool implements MessageHandler {
|
||||
|
||||
interface CompletionProvider {
|
||||
List<Suggestion> completionSuggestions(String input, int cursor, int[] anchor);
|
||||
|
||||
}
|
||||
|
||||
enum CommandKind {
|
||||
@ -953,14 +978,31 @@ public class JShellTool implements MessageHandler {
|
||||
|
||||
}
|
||||
|
||||
private static final CompletionProvider EMPTY_COMPLETION_PROVIDER = new FixedCompletionProvider();
|
||||
static final CompletionProvider EMPTY_COMPLETION_PROVIDER = new FixedCompletionProvider();
|
||||
private static final CompletionProvider KEYWORD_COMPLETION_PROVIDER = new FixedCompletionProvider("-all ", "-start ", "-history ");
|
||||
private static final CompletionProvider RELOAD_OPTIONS_COMPLETION_PROVIDER = new FixedCompletionProvider("-restore", "-quiet");
|
||||
private static final CompletionProvider SET_MODE_OPTIONS_COMPLETION_PROVIDER = new FixedCompletionProvider("-command", "-quiet", "-delete");
|
||||
private static final CompletionProvider FILE_COMPLETION_PROVIDER = fileCompletions(p -> true);
|
||||
private final Map<String, Command> commands = new LinkedHashMap<>();
|
||||
private void registerCommand(Command cmd) {
|
||||
commands.put(cmd.command, cmd);
|
||||
}
|
||||
|
||||
private static CompletionProvider skipWordThenCompletion(CompletionProvider completionProvider) {
|
||||
return (input, cursor, anchor) -> {
|
||||
List<Suggestion> result = Collections.emptyList();
|
||||
|
||||
int space = input.indexOf(' ');
|
||||
if (space != -1) {
|
||||
String rest = input.substring(space + 1);
|
||||
result = completionProvider.completionSuggestions(rest, cursor - space - 1, anchor);
|
||||
anchor[0] += space + 1;
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
}
|
||||
|
||||
private static CompletionProvider fileCompletions(Predicate<Path> accept) {
|
||||
return (code, cursor, anchor) -> {
|
||||
int lastSlash = code.lastIndexOf('/');
|
||||
@ -1037,6 +1079,31 @@ public class JShellTool implements MessageHandler {
|
||||
};
|
||||
}
|
||||
|
||||
private static CompletionProvider orMostSpecificCompletion(
|
||||
CompletionProvider left, CompletionProvider right) {
|
||||
return (code, cursor, anchor) -> {
|
||||
int[] leftAnchor = {-1};
|
||||
int[] rightAnchor = {-1};
|
||||
|
||||
List<Suggestion> leftSuggestions = left.completionSuggestions(code, cursor, leftAnchor);
|
||||
List<Suggestion> rightSuggestions = right.completionSuggestions(code, cursor, rightAnchor);
|
||||
|
||||
List<Suggestion> suggestions = new ArrayList<>();
|
||||
|
||||
if (leftAnchor[0] >= rightAnchor[0]) {
|
||||
anchor[0] = leftAnchor[0];
|
||||
suggestions.addAll(leftSuggestions);
|
||||
}
|
||||
|
||||
if (leftAnchor[0] <= rightAnchor[0]) {
|
||||
anchor[0] = rightAnchor[0];
|
||||
suggestions.addAll(rightSuggestions);
|
||||
}
|
||||
|
||||
return suggestions;
|
||||
};
|
||||
}
|
||||
|
||||
// Snippet lists
|
||||
|
||||
Stream<Snippet> allSnippets() {
|
||||
@ -1123,10 +1190,26 @@ public class JShellTool implements MessageHandler {
|
||||
EMPTY_COMPLETION_PROVIDER));
|
||||
registerCommand(new Command("/set",
|
||||
arg -> cmdSet(arg),
|
||||
new FixedCompletionProvider(SET_SUBCOMMANDS)));
|
||||
new ContinuousCompletionProvider(Map.of(
|
||||
// need more completion for format for usability
|
||||
"format", feedback.modeCompletions(),
|
||||
"truncation", feedback.modeCompletions(),
|
||||
"feedback", feedback.modeCompletions(),
|
||||
"mode", skipWordThenCompletion(orMostSpecificCompletion(
|
||||
feedback.modeCompletions(SET_MODE_OPTIONS_COMPLETION_PROVIDER),
|
||||
SET_MODE_OPTIONS_COMPLETION_PROVIDER)),
|
||||
"prompt", feedback.modeCompletions(),
|
||||
"editor", fileCompletions(Files::isExecutable),
|
||||
"start", FILE_COMPLETION_PROVIDER),
|
||||
STARTSWITH_MATCHER)));
|
||||
registerCommand(new Command("/retain",
|
||||
arg -> cmdRetain(arg),
|
||||
new FixedCompletionProvider(RETAIN_SUBCOMMANDS)));
|
||||
new ContinuousCompletionProvider(Map.of(
|
||||
"feedback", feedback.modeCompletions(),
|
||||
"mode", feedback.modeCompletions(),
|
||||
"editor", fileCompletions(Files::isExecutable),
|
||||
"start", FILE_COMPLETION_PROVIDER),
|
||||
STARTSWITH_MATCHER)));
|
||||
registerCommand(new Command("/?",
|
||||
"help.quest",
|
||||
arg -> cmdHelp(arg),
|
||||
@ -1151,36 +1234,18 @@ public class JShellTool implements MessageHandler {
|
||||
registerCommand(new Command("shortcuts",
|
||||
"help.shortcuts",
|
||||
CommandKind.HELP_SUBJECT));
|
||||
|
||||
commandCompletions = new ContinuousCompletionProvider(
|
||||
commands.values().stream()
|
||||
.filter(c -> c.kind.shouldSuggestCompletions)
|
||||
.collect(toMap(c -> c.command, c -> c.completions)),
|
||||
STARTSWITH_MATCHER);
|
||||
}
|
||||
|
||||
private ContinuousCompletionProvider commandCompletions;
|
||||
|
||||
public List<Suggestion> commandCompletionSuggestions(String code, int cursor, int[] anchor) {
|
||||
String prefix = code.substring(0, cursor);
|
||||
int space = prefix.indexOf(' ');
|
||||
Stream<Suggestion> result;
|
||||
|
||||
if (space == (-1)) {
|
||||
result = commands.values()
|
||||
.stream()
|
||||
.distinct()
|
||||
.filter(cmd -> cmd.kind.shouldSuggestCompletions)
|
||||
.map(cmd -> cmd.command)
|
||||
.filter(key -> key.startsWith(prefix))
|
||||
.map(key -> new ArgSuggestion(key + " "));
|
||||
anchor[0] = 0;
|
||||
} else {
|
||||
String arg = prefix.substring(space + 1);
|
||||
String cmd = prefix.substring(0, space);
|
||||
Command[] candidates = findCommand(cmd, c -> true);
|
||||
if (candidates.length == 1) {
|
||||
result = candidates[0].completions.completionSuggestions(arg, cursor - space, anchor).stream();
|
||||
anchor[0] += space + 1;
|
||||
} else {
|
||||
result = Stream.empty();
|
||||
}
|
||||
}
|
||||
|
||||
return result.sorted((s1, s2) -> s1.continuation().compareTo(s2.continuation()))
|
||||
.collect(Collectors.toList());
|
||||
return commandCompletions.completionSuggestions(code, cursor, anchor);
|
||||
}
|
||||
|
||||
public String commandDocumentation(String code, int cursor) {
|
||||
@ -2484,7 +2549,7 @@ public class JShellTool implements MessageHandler {
|
||||
}
|
||||
}
|
||||
|
||||
private static class ArgSuggestion implements Suggestion {
|
||||
static class ArgSuggestion implements Suggestion {
|
||||
|
||||
private final String continuation;
|
||||
|
||||
@ -2579,6 +2644,11 @@ class ScannerIOContext extends NonInteractiveIOContext {
|
||||
public void close() {
|
||||
scannerIn.close();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int readUserInput() {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
class FileScannerIOContext extends ScannerIOContext {
|
||||
@ -2617,4 +2687,9 @@ class ReloadIOContext extends NonInteractiveIOContext {
|
||||
@Override
|
||||
public void close() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public int readUserInput() {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -46,6 +46,8 @@ import com.sun.source.tree.Tree;
|
||||
import static jdk.jshell.CompletenessAnalyzer.TK.*;
|
||||
import jdk.jshell.TaskFactory.ParseTask;
|
||||
import java.util.List;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
/**
|
||||
* Low level scanner to determine completeness of input.
|
||||
@ -81,13 +83,13 @@ class CompletenessAnalyzer {
|
||||
|
||||
CaInfo scan(String s) {
|
||||
try {
|
||||
Scanner scanner = scannerFactory.newScanner(s, false);
|
||||
Matched in = new Matched(scanner);
|
||||
Parser parser = new Parser(in, proc, s);
|
||||
Parser parser = new Parser(
|
||||
() -> new Matched(scannerFactory.newScanner(s, false)),
|
||||
() -> proc.taskFactory.new ParseTask(s));
|
||||
Completeness stat = parser.parseUnit();
|
||||
int endPos = stat == Completeness.UNKNOWN
|
||||
? s.length()
|
||||
: in.prevCT.endPos;
|
||||
: parser.endPos();
|
||||
return new CaInfo(stat, endPos);
|
||||
} catch (SyntaxException ex) {
|
||||
return new CaInfo(error(), s.length());
|
||||
@ -188,7 +190,7 @@ class CompletenessAnalyzer {
|
||||
ERROR(TokenKind.ERROR, XERRO), //
|
||||
IDENTIFIER(TokenKind.IDENTIFIER, XEXPR1|XDECL1|XTERM), //
|
||||
UNDERSCORE(TokenKind.UNDERSCORE, XERRO), // _
|
||||
CLASS(TokenKind.CLASS, XEXPR|XDECL1|XTERM), // class decl and .class
|
||||
CLASS(TokenKind.CLASS, XEXPR|XDECL1), // class decl (MAPPED: DOTCLASS)
|
||||
MONKEYS_AT(TokenKind.MONKEYS_AT, XEXPR|XDECL1), // @
|
||||
IMPORT(TokenKind.IMPORT, XDECL1|XSTART), // import -- consider declaration
|
||||
SEMI(TokenKind.SEMI, XSTMT1|XTERM|XSTART), // ;
|
||||
@ -206,15 +208,15 @@ class CompletenessAnalyzer {
|
||||
THROWS(TokenKind.THROWS, XDECL), // throws
|
||||
|
||||
// Primarive type names
|
||||
BOOLEAN(TokenKind.BOOLEAN, XEXPR|XDECL1), // boolean
|
||||
BYTE(TokenKind.BYTE, XEXPR|XDECL1), // byte
|
||||
CHAR(TokenKind.CHAR, XEXPR|XDECL1), // char
|
||||
DOUBLE(TokenKind.DOUBLE, XEXPR|XDECL1), // double
|
||||
FLOAT(TokenKind.FLOAT, XEXPR|XDECL1), // float
|
||||
INT(TokenKind.INT, XEXPR|XDECL1), // int
|
||||
LONG(TokenKind.LONG, XEXPR|XDECL1), // long
|
||||
SHORT(TokenKind.SHORT, XEXPR|XDECL1), // short
|
||||
VOID(TokenKind.VOID, XEXPR|XDECL1), // void
|
||||
BOOLEAN(TokenKind.BOOLEAN, XEXPR1|XDECL1), // boolean
|
||||
BYTE(TokenKind.BYTE, XEXPR1|XDECL1), // byte
|
||||
CHAR(TokenKind.CHAR, XEXPR1|XDECL1), // char
|
||||
DOUBLE(TokenKind.DOUBLE, XEXPR1|XDECL1), // double
|
||||
FLOAT(TokenKind.FLOAT, XEXPR1|XDECL1), // float
|
||||
INT(TokenKind.INT, XEXPR1|XDECL1), // int
|
||||
LONG(TokenKind.LONG, XEXPR1|XDECL1), // long
|
||||
SHORT(TokenKind.SHORT, XEXPR1|XDECL1), // short
|
||||
VOID(TokenKind.VOID, XEXPR1|XDECL1), // void
|
||||
|
||||
// Modifiers keywords
|
||||
ABSTRACT(TokenKind.ABSTRACT, XDECL1), // abstract
|
||||
@ -230,7 +232,7 @@ class CompletenessAnalyzer {
|
||||
|
||||
// Declarations and type parameters (thus expressions)
|
||||
EXTENDS(TokenKind.EXTENDS, XEXPR|XDECL), // extends
|
||||
COMMA(TokenKind.COMMA, XEXPR|XDECL), // ,
|
||||
COMMA(TokenKind.COMMA, XEXPR|XDECL|XTERM), // ,
|
||||
AMP(TokenKind.AMP, XEXPR|XDECL), // &
|
||||
GT(TokenKind.GT, XEXPR|XDECL), // >
|
||||
LT(TokenKind.LT, XEXPR|XDECL1), // <
|
||||
@ -239,7 +241,7 @@ class CompletenessAnalyzer {
|
||||
GTGTGT(TokenKind.GTGTGT, XEXPR|XDECL), // >>>
|
||||
QUES(TokenKind.QUES, XEXPR|XDECL), // ?
|
||||
DOT(TokenKind.DOT, XEXPR|XDECL), // .
|
||||
STAR(TokenKind.STAR, XEXPR|XDECL|XTERM), // * -- import foo.* //TODO handle these case separately, XTERM
|
||||
STAR(TokenKind.STAR, XEXPR), // * (MAPPED: DOTSTAR)
|
||||
|
||||
// Statement keywords
|
||||
ASSERT(TokenKind.ASSERT, XSTMT1|XSTART), // assert
|
||||
@ -280,7 +282,7 @@ class CompletenessAnalyzer {
|
||||
|
||||
// Expressions cannot terminate
|
||||
INSTANCEOF(TokenKind.INSTANCEOF, XEXPR), // instanceof
|
||||
NEW(TokenKind.NEW, XEXPR1), // new
|
||||
NEW(TokenKind.NEW, XEXPR1), // new (MAPPED: COLCOLNEW)
|
||||
SUPER(TokenKind.SUPER, XEXPR1|XDECL), // super -- shouldn't see as rec. But in type parameters
|
||||
ARROW(TokenKind.ARROW, XEXPR), // ->
|
||||
COLCOL(TokenKind.COLCOL, XEXPR), // ::
|
||||
@ -323,24 +325,29 @@ class CompletenessAnalyzer {
|
||||
UNMATCHED(XERRO),
|
||||
PARENS(XEXPR1|XDECL|XSTMT|XTERM),
|
||||
BRACKETS(XEXPR|XDECL|XTERM),
|
||||
BRACES(XSTMT1|XEXPR|XTERM);
|
||||
BRACES(XSTMT1|XEXPR|XTERM),
|
||||
DOTSTAR(XDECL|XTERM), // import foo.*
|
||||
COLCOLNEW(XEXPR|XTERM), // :: new
|
||||
DOTCLASS(XEXPR|XTERM), // class decl and .class
|
||||
;
|
||||
|
||||
static final EnumMap<TokenKind,TK> tokenKindToTKMap = new EnumMap<>(TokenKind.class);
|
||||
|
||||
final TokenKind tokenKind;
|
||||
final int belongs;
|
||||
Function<TK,TK> mapping;
|
||||
|
||||
TK(int b) {
|
||||
this.tokenKind = null;
|
||||
this.belongs = b;
|
||||
this(null, b);
|
||||
}
|
||||
|
||||
TK(TokenKind tokenKind, int b) {
|
||||
this.tokenKind = tokenKind;
|
||||
this.belongs = b;
|
||||
this.mapping = null;
|
||||
}
|
||||
|
||||
private static TK tokenKindToTK(TokenKind kind) {
|
||||
private static TK tokenKindToTK(TK prev, TokenKind kind) {
|
||||
TK tk = tokenKindToTKMap.get(kind);
|
||||
if (tk == null) {
|
||||
System.err.printf("No corresponding %s for %s: %s\n",
|
||||
@ -349,7 +356,9 @@ class CompletenessAnalyzer {
|
||||
kind);
|
||||
throw new InternalError("No corresponding TK for TokenKind: " + kind);
|
||||
}
|
||||
return tk;
|
||||
return tk.mapping != null
|
||||
? tk.mapping.apply(prev)
|
||||
: tk;
|
||||
}
|
||||
|
||||
boolean isOkToTerminate() {
|
||||
@ -383,8 +392,12 @@ class CompletenessAnalyzer {
|
||||
}
|
||||
}
|
||||
for (TokenKind kind : TokenKind.values()) {
|
||||
tokenKindToTK(kind); // assure they can be retrieved without error
|
||||
tokenKindToTK(null, kind); // assure they can be retrieved without error
|
||||
}
|
||||
// Mappings of disambiguated contexts
|
||||
STAR.mapping = prev -> prev == DOT ? DOTSTAR : STAR;
|
||||
NEW.mapping = prev -> prev == COLCOL ? COLCOLNEW : NEW;
|
||||
CLASS.mapping = prev -> prev == DOT ? DOTCLASS : CLASS;
|
||||
}
|
||||
}
|
||||
|
||||
@ -520,7 +533,7 @@ class CompletenessAnalyzer {
|
||||
ct = match(BRACKETS, TokenKind.LBRACKET);
|
||||
break;
|
||||
default:
|
||||
ct = new CT(TK.tokenKindToTK(current.kind), advance());
|
||||
ct = new CT(TK.tokenKindToTK(prevTK, current.kind), advance());
|
||||
break;
|
||||
}
|
||||
if (ct.kind.isStart() && !prevTK.isOkToTerminate()) {
|
||||
@ -539,21 +552,21 @@ class CompletenessAnalyzer {
|
||||
*/
|
||||
private static class Parser {
|
||||
|
||||
final Matched in;
|
||||
CT token;
|
||||
Completeness checkResult;
|
||||
private final Supplier<Matched> matchedFactory;
|
||||
private final Supplier<ParseTask> parseFactory;
|
||||
private Matched in;
|
||||
private CT token;
|
||||
private Completeness checkResult;
|
||||
|
||||
final JShell proc;
|
||||
final String scannedInput;
|
||||
Parser(Supplier<Matched> matchedFactory, Supplier<ParseTask> parseFactory) {
|
||||
this.matchedFactory = matchedFactory;
|
||||
this.parseFactory = parseFactory;
|
||||
resetInput();
|
||||
}
|
||||
|
||||
|
||||
|
||||
Parser(Matched in, JShell proc, String scannedInput) {
|
||||
this.in = in;
|
||||
final void resetInput() {
|
||||
this.in = matchedFactory.get();
|
||||
nextToken();
|
||||
|
||||
this.proc = proc;
|
||||
this.scannedInput = scannedInput;
|
||||
}
|
||||
|
||||
final void nextToken() {
|
||||
@ -598,6 +611,10 @@ class CompletenessAnalyzer {
|
||||
return flags != Completeness.COMPLETE;
|
||||
}
|
||||
|
||||
public int endPos() {
|
||||
return in.prevCT.endPos;
|
||||
}
|
||||
|
||||
public Completeness parseUnit() {
|
||||
//System.err.printf("%s: belongs %o XANY1 %o\n", token.kind, token.kind.belongs, token.kind.belongs & XANY1);
|
||||
switch (token.kind.belongs & XANY1) {
|
||||
@ -651,11 +668,11 @@ class CompletenessAnalyzer {
|
||||
case IDENTIFIER:
|
||||
case BRACKETS:
|
||||
return Completeness.COMPLETE_WITH_SEMI;
|
||||
case STAR:
|
||||
case DOTSTAR:
|
||||
if (isImport) {
|
||||
return Completeness.COMPLETE_WITH_SEMI;
|
||||
} else {
|
||||
return Completeness.DEFINITELY_INCOMPLETE;
|
||||
return Completeness.UNKNOWN;
|
||||
}
|
||||
default:
|
||||
return Completeness.DEFINITELY_INCOMPLETE;
|
||||
@ -667,7 +684,7 @@ class CompletenessAnalyzer {
|
||||
|
||||
public Completeness disambiguateDeclarationVsExpression() {
|
||||
// String folding messes up position information.
|
||||
ParseTask pt = proc.taskFactory.new ParseTask(scannedInput);
|
||||
ParseTask pt = parseFactory.get();
|
||||
List<? extends Tree> units = pt.units();
|
||||
if (units.isEmpty()) {
|
||||
return error();
|
||||
@ -679,7 +696,7 @@ class CompletenessAnalyzer {
|
||||
case LABELED_STATEMENT:
|
||||
if (shouldAbort(IDENTIFIER)) return checkResult;
|
||||
if (shouldAbort(COLON)) return checkResult;
|
||||
return parseStatement();
|
||||
return parseStatement();
|
||||
case VARIABLE:
|
||||
case IMPORT:
|
||||
case CLASS:
|
||||
@ -693,51 +710,6 @@ class CompletenessAnalyzer {
|
||||
}
|
||||
}
|
||||
|
||||
// public Status parseExpressionOrDeclaration() {
|
||||
// if (token.kind == IDENTIFIER) {
|
||||
// nextToken();
|
||||
// switch (token.kind) {
|
||||
// case IDENTIFIER:
|
||||
// return parseDeclaration();
|
||||
// }
|
||||
// }
|
||||
// while (token.kind.isExpressionOrDeclaration()) {
|
||||
// if (!token.kind.isExpression()) {
|
||||
// return parseDeclaration();
|
||||
// }
|
||||
// if (!token.kind.isDeclaration()) {
|
||||
// // Expression not declaration
|
||||
// if (token.kind == EQ) {
|
||||
// // Check for array initializer
|
||||
// nextToken();
|
||||
// if (token.kind == BRACES) {
|
||||
// nextToken();
|
||||
// return lastly(SEMI);
|
||||
// }
|
||||
// }
|
||||
// return parseExpressionStatement();
|
||||
// }
|
||||
// nextToken();
|
||||
// }
|
||||
// switch (token.kind) {
|
||||
// case BRACES:
|
||||
// case SEMI:
|
||||
// nextToken();
|
||||
// return Status.COMPLETE;
|
||||
// case UNMATCHED:
|
||||
// nextToken();
|
||||
// return Status.DEFINITELY_INCOMPLETE;
|
||||
// case EOF:
|
||||
// if (in.prevCT.kind.isOkToTerminate()) {
|
||||
// return Status.COMPLETE_WITH_SEMI;
|
||||
// } else {
|
||||
// return Status.DEFINITELY_INCOMPLETE;
|
||||
// }
|
||||
// default:
|
||||
// return error();
|
||||
// }
|
||||
// }
|
||||
|
||||
public Completeness parseExpressionStatement() {
|
||||
if (shouldAbort(parseExpression())) return checkResult;
|
||||
return lastly(SEMI);
|
||||
|
||||
@ -555,9 +555,11 @@ class Eval {
|
||||
: "";
|
||||
} catch (ResolutionException ex) {
|
||||
DeclarationSnippet sn = (DeclarationSnippet) state.maps.getSnippetDeadOrAlive(ex.id());
|
||||
exception = new UnresolvedReferenceException(sn, ex.getStackTrace());
|
||||
exception = new UnresolvedReferenceException(sn, translateExceptionStack(ex));
|
||||
} catch (UserException ex) {
|
||||
exception = translateExecutionException(ex);
|
||||
exception = new EvalException(translateExceptionMessage(ex),
|
||||
ex.causeExceptionClass(),
|
||||
translateExceptionStack(ex));
|
||||
} catch (RunException ex) {
|
||||
// StopException - no-op
|
||||
} catch (InternalException ex) {
|
||||
@ -732,7 +734,7 @@ class Eval {
|
||||
}
|
||||
}
|
||||
|
||||
private EvalException translateExecutionException(UserException ex) {
|
||||
private StackTraceElement[] translateExceptionStack(Exception ex) {
|
||||
StackTraceElement[] raw = ex.getStackTrace();
|
||||
int last = raw.length;
|
||||
do {
|
||||
@ -759,11 +761,14 @@ class Eval {
|
||||
elems[i] = r;
|
||||
}
|
||||
}
|
||||
return elems;
|
||||
}
|
||||
|
||||
private String translateExceptionMessage(Exception ex) {
|
||||
String msg = ex.getMessage();
|
||||
if (msg.equals("<none>")) {
|
||||
msg = null;
|
||||
}
|
||||
return new EvalException(msg, ex.causeExceptionClass(), elems);
|
||||
return msg.equals("<none>")
|
||||
? null
|
||||
: msg;
|
||||
}
|
||||
|
||||
private boolean isWrap(StackTraceElement ste) {
|
||||
|
||||
@ -51,8 +51,6 @@ import jdk.jshell.spi.ExecutionControl.EngineTerminationException;
|
||||
import jdk.jshell.spi.ExecutionControl.ExecutionControlException;
|
||||
import jdk.jshell.spi.ExecutionEnv;
|
||||
import static jdk.jshell.execution.Util.failOverExecutionControlGenerator;
|
||||
import static java.util.stream.Collectors.collectingAndThen;
|
||||
import static java.util.stream.Collectors.toList;
|
||||
import static jdk.jshell.Util.expunge;
|
||||
|
||||
/**
|
||||
@ -120,7 +118,8 @@ public class JShell implements AutoCloseable {
|
||||
this.executionControlGenerator = b.executionControlGenerator==null
|
||||
? failOverExecutionControlGenerator(
|
||||
JDIDefaultExecutionControl.launch(),
|
||||
JDIDefaultExecutionControl.listen())
|
||||
JDIDefaultExecutionControl.listen("localhost"),
|
||||
JDIDefaultExecutionControl.listen(null))
|
||||
: b.executionControlGenerator;
|
||||
|
||||
this.maps = new SnippetMaps(this);
|
||||
|
||||
@ -40,15 +40,14 @@ import java.util.Map;
|
||||
class DemultiplexInput extends Thread {
|
||||
|
||||
private final DataInputStream delegate;
|
||||
private final PipeInputStream command;
|
||||
private final Map<String, OutputStream> io;
|
||||
private final Iterable<OutputStream> closeList;
|
||||
|
||||
DemultiplexInput(InputStream input, PipeInputStream command,
|
||||
Map<String, OutputStream> io) {
|
||||
DemultiplexInput(InputStream input, Map<String, OutputStream> io, Iterable<OutputStream> closeList) {
|
||||
super("output reader");
|
||||
this.delegate = new DataInputStream(input);
|
||||
this.command = command;
|
||||
this.io = io;
|
||||
this.closeList = closeList;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -65,23 +64,23 @@ class DemultiplexInput extends Thread {
|
||||
byte[] data = new byte[dataLen];
|
||||
DemultiplexInput.this.delegate.readFully(data);
|
||||
String chan = new String(name, "UTF-8");
|
||||
if (chan.equals("command")) {
|
||||
for (byte b : data) {
|
||||
command.write(Byte.toUnsignedInt(b));
|
||||
}
|
||||
OutputStream out = io.get(chan);
|
||||
if (out == null) {
|
||||
debug("Unexpected channel name: %s", chan);
|
||||
} else {
|
||||
OutputStream out = io.get(chan);
|
||||
if (out == null) {
|
||||
debug("Unexpected channel name: %s", chan);
|
||||
} else {
|
||||
out.write(data);
|
||||
}
|
||||
out.write(data);
|
||||
}
|
||||
}
|
||||
} catch (IOException ex) {
|
||||
debug(ex, "Failed reading output");
|
||||
} finally {
|
||||
command.close();
|
||||
for (OutputStream out : closeList) {
|
||||
try {
|
||||
out.close();
|
||||
} catch (IOException ex) {
|
||||
debug(ex, "Failed reading output");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -25,9 +25,9 @@
|
||||
package jdk.jshell.execution;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.ObjectInput;
|
||||
import java.io.ObjectOutput;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.ServerSocket;
|
||||
import java.net.Socket;
|
||||
@ -48,7 +48,7 @@ import com.sun.jdi.VMDisconnectedException;
|
||||
import com.sun.jdi.VirtualMachine;
|
||||
import jdk.jshell.spi.ExecutionControl;
|
||||
import jdk.jshell.spi.ExecutionEnv;
|
||||
import static jdk.jshell.execution.Util.remoteInput;
|
||||
import static jdk.jshell.execution.Util.remoteInputOutput;
|
||||
|
||||
/**
|
||||
* The implementation of {@link jdk.jshell.spi.ExecutionControl} that the
|
||||
@ -77,17 +77,19 @@ public class JDIDefaultExecutionControl extends JDIExecutionControl {
|
||||
* @return the generator
|
||||
*/
|
||||
public static ExecutionControl.Generator launch() {
|
||||
return env -> create(env, true);
|
||||
return env -> create(env, true, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an ExecutionControl instance based on a JDI
|
||||
* {@code ListeningConnector}.
|
||||
*
|
||||
* @param host explicit hostname to use, if null use discovered
|
||||
* hostname, applies to listening only (!isLaunch)
|
||||
* @return the generator
|
||||
*/
|
||||
public static ExecutionControl.Generator listen() {
|
||||
return env -> create(env, false);
|
||||
public static ExecutionControl.Generator listen(String host) {
|
||||
return env -> create(env, false, host);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -100,10 +102,15 @@ public class JDIDefaultExecutionControl extends JDIExecutionControl {
|
||||
*
|
||||
* @param env the context passed by
|
||||
* {@link jdk.jshell.spi.ExecutionControl#start(jdk.jshell.spi.ExecutionEnv) }
|
||||
* @param isLaunch does JDI do the launch? That is, LaunchingConnector,
|
||||
* otherwise we start explicitly and use ListeningConnector
|
||||
* @param host explicit hostname to use, if null use discovered
|
||||
* hostname, applies to listening only (!isLaunch)
|
||||
* @return the channel
|
||||
* @throws IOException if there are errors in set-up
|
||||
*/
|
||||
private static JDIDefaultExecutionControl create(ExecutionEnv env, boolean isLaunch) throws IOException {
|
||||
private static ExecutionControl create(ExecutionEnv env,
|
||||
boolean isLaunch, String host) throws IOException {
|
||||
try (final ServerSocket listener = new ServerSocket(0)) {
|
||||
// timeout after 60 seconds
|
||||
listener.setSoTimeout(60000);
|
||||
@ -111,14 +118,10 @@ public class JDIDefaultExecutionControl extends JDIExecutionControl {
|
||||
|
||||
// Set-up the JDI connection
|
||||
JDIInitiator jdii = new JDIInitiator(port,
|
||||
env.extraRemoteVMOptions(), REMOTE_AGENT, isLaunch);
|
||||
env.extraRemoteVMOptions(), REMOTE_AGENT, isLaunch, host);
|
||||
VirtualMachine vm = jdii.vm();
|
||||
Process process = jdii.process();
|
||||
|
||||
// Forward input to the remote agent
|
||||
Util.forwardInputToRemote(env.userIn(), process.getOutputStream(),
|
||||
ex -> debug(ex, "input forwarding failure"));
|
||||
|
||||
List<Consumer<String>> deathListeners = new ArrayList<>();
|
||||
deathListeners.add(s -> env.closeDown());
|
||||
Util.detectJDIExitEvent(vm, s -> {
|
||||
@ -131,12 +134,13 @@ public class JDIDefaultExecutionControl extends JDIExecutionControl {
|
||||
// output.
|
||||
Socket socket = listener.accept();
|
||||
// out before in -- match remote creation so we don't hang
|
||||
ObjectOutput cmdout = new ObjectOutputStream(socket.getOutputStream());
|
||||
Map<String, OutputStream> io = new HashMap<>();
|
||||
io.put("out", env.userOut());
|
||||
io.put("err", env.userErr());
|
||||
ObjectInput cmdin = remoteInput(socket.getInputStream(), io);
|
||||
return new JDIDefaultExecutionControl(cmdout, cmdin, vm, process, deathListeners);
|
||||
OutputStream out = socket.getOutputStream();
|
||||
Map<String, OutputStream> outputs = new HashMap<>();
|
||||
outputs.put("out", env.userOut());
|
||||
outputs.put("err", env.userErr());
|
||||
Map<String, InputStream> input = new HashMap<>();
|
||||
input.put("in", env.userIn());
|
||||
return remoteInputOutput(socket.getInputStream(), out, outputs, input, (objIn, objOut) -> new JDIDefaultExecutionControl(objOut, objIn, vm, process, deathListeners));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -56,9 +56,11 @@ public class JDIInitiator {
|
||||
* @param remoteAgent full class name of remote agent to launch
|
||||
* @param isLaunch does JDI do the launch? That is, LaunchingConnector,
|
||||
* otherwise we start explicitly and use ListeningConnector
|
||||
* @param host explicit hostname to use, if null use discovered
|
||||
* hostname, applies to listening only (!isLaunch)
|
||||
*/
|
||||
public JDIInitiator(int port, List<String> remoteVMOptions,
|
||||
String remoteAgent, boolean isLaunch) {
|
||||
public JDIInitiator(int port, List<String> remoteVMOptions, String remoteAgent,
|
||||
boolean isLaunch, String host) {
|
||||
this.remoteAgent = remoteAgent;
|
||||
String connectorName
|
||||
= isLaunch
|
||||
@ -72,6 +74,9 @@ public class JDIInitiator {
|
||||
= isLaunch
|
||||
? launchArgs(port, String.join(" ", remoteVMOptions))
|
||||
: new HashMap<>();
|
||||
if (host != null && !isLaunch) {
|
||||
argumentName2Value.put("localAddress", host);
|
||||
}
|
||||
this.connectorArgs = mergeConnectorArgs(connector, argumentName2Value);
|
||||
this.vm = isLaunch
|
||||
? launchTarget()
|
||||
|
||||
@ -50,13 +50,7 @@ class MultiplexingOutputStream extends OutputStream {
|
||||
|
||||
@Override
|
||||
public void write(int b) throws IOException {
|
||||
synchronized (delegate) {
|
||||
delegate.write(name.length); //assuming the len is small enough to fit into byte
|
||||
delegate.write(name);
|
||||
delegate.write(1);
|
||||
delegate.write(b);
|
||||
delegate.flush();
|
||||
}
|
||||
write(new byte[] {(byte) b});
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -65,10 +59,12 @@ class MultiplexingOutputStream extends OutputStream {
|
||||
int i = 0;
|
||||
while (len > 0) {
|
||||
int size = Math.min(PACKET_SIZE, len);
|
||||
delegate.write(name.length); //assuming the len is small enough to fit into byte
|
||||
delegate.write(name);
|
||||
delegate.write(size);
|
||||
delegate.write(b, off + i, size);
|
||||
byte[] data = new byte[name.length + 1 + size + 1];
|
||||
data[0] = (byte) name.length; //assuming the len is small enough to fit into byte
|
||||
System.arraycopy(name, 0, data, 1, name.length);
|
||||
data[name.length + 1] = (byte) size;
|
||||
System.arraycopy(b, off + i, data, name.length + 2, size);
|
||||
delegate.write(data);
|
||||
i += size;
|
||||
len -= size;
|
||||
}
|
||||
|
||||
@ -24,7 +24,9 @@
|
||||
*/
|
||||
package jdk.jshell.execution;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
|
||||
/**
|
||||
*
|
||||
@ -39,7 +41,10 @@ class PipeInputStream extends InputStream {
|
||||
private boolean closed;
|
||||
|
||||
@Override
|
||||
public synchronized int read() {
|
||||
public synchronized int read() throws IOException {
|
||||
if (start == end) {
|
||||
inputNeeded();
|
||||
}
|
||||
while (start == end) {
|
||||
if (closed) {
|
||||
return -1;
|
||||
@ -57,7 +62,9 @@ class PipeInputStream extends InputStream {
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void write(int b) {
|
||||
protected void inputNeeded() throws IOException {}
|
||||
|
||||
private synchronized void write(int b) {
|
||||
if (closed) {
|
||||
throw new IllegalStateException("Already closed.");
|
||||
}
|
||||
@ -85,4 +92,22 @@ class PipeInputStream extends InputStream {
|
||||
notifyAll();
|
||||
}
|
||||
|
||||
public OutputStream createOutput() {
|
||||
return new OutputStream() {
|
||||
@Override public void write(int b) throws IOException {
|
||||
PipeInputStream.this.write(b);
|
||||
}
|
||||
@Override
|
||||
public void write(byte[] b, int off, int len) throws IOException {
|
||||
for (int i = 0 ; i < len ; i++) {
|
||||
write(Byte.toUnsignedInt(b[off + i]));
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void close() throws IOException {
|
||||
PipeInputStream.this.close();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -61,10 +61,12 @@ public class RemoteExecutionControl extends DirectExecutionControl implements Ex
|
||||
Socket socket = new Socket(loopBack, Integer.parseInt(args[0]));
|
||||
InputStream inStream = socket.getInputStream();
|
||||
OutputStream outStream = socket.getOutputStream();
|
||||
Map<String, Consumer<OutputStream>> chans = new HashMap<>();
|
||||
chans.put("out", st -> System.setOut(new PrintStream(st, true)));
|
||||
chans.put("err", st -> System.setErr(new PrintStream(st, true)));
|
||||
forwardExecutionControlAndIO(new RemoteExecutionControl(), inStream, outStream, chans);
|
||||
Map<String, Consumer<OutputStream>> outputs = new HashMap<>();
|
||||
outputs.put("out", st -> System.setOut(new PrintStream(st, true)));
|
||||
outputs.put("err", st -> System.setErr(new PrintStream(st, true)));
|
||||
Map<String, Consumer<InputStream>> input = new HashMap<>();
|
||||
input.put("in", st -> System.setIn(st));
|
||||
forwardExecutionControlAndIO(new RemoteExecutionControl(), inStream, outStream, outputs, input);
|
||||
}
|
||||
|
||||
// These three variables are used by the main JShell process in interrupting
|
||||
|
||||
@ -25,6 +25,7 @@
|
||||
package jdk.jshell.execution;
|
||||
|
||||
import jdk.jshell.spi.ExecutionEnv;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.ObjectInput;
|
||||
@ -32,9 +33,13 @@ import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutput;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.function.BiFunction;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import com.sun.jdi.VirtualMachine;
|
||||
import jdk.jshell.spi.ExecutionControl;
|
||||
|
||||
@ -99,21 +104,40 @@ public class Util {
|
||||
* instance, then responses back on the output.
|
||||
* @param ec the direct instance of {@link ExecutionControl} to process commands
|
||||
* @param inStream the stream from which to create the command input
|
||||
* @param outStream the stream that will carry {@code System.out},
|
||||
* {@code System.err}, any specified auxiliary channels, and the
|
||||
* command response output.
|
||||
* @param streamMap a map between names of additional streams to carry and setters
|
||||
* for the stream
|
||||
* @param outStream the stream that will carry any specified auxiliary channels (like
|
||||
* {@code System.out} and {@code System.err}), and the command response output.
|
||||
* @param outputStreamMap a map between names of additional streams to carry and setters
|
||||
* for the stream. Names starting with '$' are reserved for internal use.
|
||||
* @param inputStreamMap a map between names of additional streams to carry and setters
|
||||
* for the stream. Names starting with '$' are reserved for internal use.
|
||||
* @throws IOException if there are errors using the passed streams
|
||||
*/
|
||||
public static void forwardExecutionControlAndIO(ExecutionControl ec,
|
||||
InputStream inStream, OutputStream outStream,
|
||||
Map<String, Consumer<OutputStream>> streamMap) throws IOException {
|
||||
ObjectInputStream cmdIn = new ObjectInputStream(inStream);
|
||||
for (Entry<String, Consumer<OutputStream>> e : streamMap.entrySet()) {
|
||||
Map<String, Consumer<OutputStream>> outputStreamMap,
|
||||
Map<String, Consumer<InputStream>> inputStreamMap) throws IOException {
|
||||
for (Entry<String, Consumer<OutputStream>> e : outputStreamMap.entrySet()) {
|
||||
e.getValue().accept(multiplexingOutputStream(e.getKey(), outStream));
|
||||
}
|
||||
ObjectOutputStream cmdOut = new ObjectOutputStream(multiplexingOutputStream("command", outStream));
|
||||
|
||||
ObjectOutputStream cmdOut = new ObjectOutputStream(multiplexingOutputStream("$command", outStream));
|
||||
PipeInputStream cmdInPipe = new PipeInputStream();
|
||||
Map<String, OutputStream> inputs = new HashMap<>();
|
||||
inputs.put("$command", cmdInPipe.createOutput());
|
||||
for (Entry<String, Consumer<InputStream>> e : inputStreamMap.entrySet()) {
|
||||
OutputStream inputSignal = multiplexingOutputStream("$" + e.getKey() + "-input-requested", outStream);
|
||||
PipeInputStream inputPipe = new PipeInputStream() {
|
||||
@Override protected void inputNeeded() throws IOException {
|
||||
inputSignal.write('1');
|
||||
inputSignal.flush();
|
||||
}
|
||||
};
|
||||
inputs.put(e.getKey(), inputPipe.createOutput());
|
||||
e.getValue().accept(inputPipe);
|
||||
}
|
||||
new DemultiplexInput(inStream, inputs, inputs.values()).start();
|
||||
ObjectInputStream cmdIn = new ObjectInputStream(cmdInPipe);
|
||||
|
||||
forwardExecutionControl(ec, cmdIn, cmdOut);
|
||||
}
|
||||
|
||||
@ -122,18 +146,41 @@ public class Util {
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads from an InputStream which has been packetized and write its contents
|
||||
* to the out and err OutputStreams; Copies the command stream.
|
||||
* Creates an ExecutionControl for given packetized input and output. The given InputStream
|
||||
* is de-packetized, and content forwarded to ObjectInput and given OutputStreams. The ObjectOutput
|
||||
* and values read from the given InputStream are packetized and sent to the given OutputStream.
|
||||
*
|
||||
* @param input the packetized input stream
|
||||
* @param streamMap a map between stream names and the output streams to forward
|
||||
* @return the command stream
|
||||
* @param output the packetized output stream
|
||||
* @param outputStreamMap a map between stream names and the output streams to forward.
|
||||
* Names starting with '$' are reserved for internal use.
|
||||
* @param inputStreamMap a map between stream names and the input streams to forward.
|
||||
* Names starting with '$' are reserved for internal use.
|
||||
* @param factory to create the ExecutionControl from ObjectInput and ObjectOutput.
|
||||
* @return the created ExecutionControl
|
||||
* @throws IOException if setting up the streams raised an exception
|
||||
*/
|
||||
public static ObjectInput remoteInput(InputStream input,
|
||||
Map<String, OutputStream> streamMap) throws IOException {
|
||||
public static ExecutionControl remoteInputOutput(InputStream input, OutputStream output,
|
||||
Map<String, OutputStream> outputStreamMap, Map<String, InputStream> inputStreamMap,
|
||||
BiFunction<ObjectInput, ObjectOutput, ExecutionControl> factory) throws IOException {
|
||||
Map<String, OutputStream> augmentedStreamMap = new HashMap<>(outputStreamMap);
|
||||
ObjectOutput commandOut = new ObjectOutputStream(Util.multiplexingOutputStream("$command", output));
|
||||
for (Entry<String, InputStream> e : inputStreamMap.entrySet()) {
|
||||
InputStream in = e.getValue();
|
||||
OutputStream inTarget = Util.multiplexingOutputStream(e.getKey(), output);
|
||||
augmentedStreamMap.put("$" + e.getKey() + "-input-requested", new OutputStream() {
|
||||
@Override
|
||||
public void write(int b) throws IOException {
|
||||
//value ignored, just a trigger to read from the input
|
||||
inTarget.write(in.read());
|
||||
}
|
||||
});
|
||||
}
|
||||
PipeInputStream commandIn = new PipeInputStream();
|
||||
new DemultiplexInput(input, commandIn, streamMap).start();
|
||||
return new ObjectInputStream(commandIn);
|
||||
OutputStream commandInTarget = commandIn.createOutput();
|
||||
augmentedStreamMap.put("$command", commandInTarget);
|
||||
new DemultiplexInput(input, augmentedStreamMap, Arrays.asList(commandInTarget)).start();
|
||||
return factory.apply(new ObjectInputStream(commandIn), commandOut);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -151,32 +198,4 @@ public class Util {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a Thread that will ship all input to the remote agent.
|
||||
*
|
||||
* @param inputStream the user input
|
||||
* @param outStream the input to the remote agent
|
||||
* @param handler a failure handler
|
||||
*/
|
||||
public static void forwardInputToRemote(final InputStream inputStream,
|
||||
final OutputStream outStream, final Consumer<Exception> handler) {
|
||||
Thread thr = new Thread("input reader") {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
byte[] buf = new byte[256];
|
||||
int cnt;
|
||||
while ((cnt = inputStream.read(buf)) != -1) {
|
||||
outStream.write(buf, 0, cnt);
|
||||
outStream.flush();
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
handler.accept(ex);
|
||||
}
|
||||
}
|
||||
};
|
||||
thr.setPriority(Thread.MAX_PRIORITY - 1);
|
||||
thr.start();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -77,10 +77,3 @@ tools/sjavac/ClasspathDependencies.java 8158002 generic-all Requires i
|
||||
###########################################################################
|
||||
#
|
||||
# jdeps
|
||||
|
||||
###########################################################################
|
||||
#
|
||||
# jdeprscan
|
||||
|
||||
tools/jdeprscan/tests/jdk/jdeprscan/TestLoad.java 8164837 windows-all probably line breaks or encoding
|
||||
tools/jdeprscan/tests/jdk/jdeprscan/TestScan.java 8164837 windows-all probably line breaks or encoding
|
||||
|
||||
@ -33,7 +33,7 @@ import jdk.javadoc.internal.tool.Main;
|
||||
/**
|
||||
* @test
|
||||
* @bug 8086737
|
||||
* @summary Test -release option in javadoc
|
||||
* @summary Test --release option in javadoc
|
||||
* @run main ReleaseOption
|
||||
* @modules jdk.javadoc/jdk.javadoc.internal.tool
|
||||
*/
|
||||
@ -43,10 +43,10 @@ public class ReleaseOption {
|
||||
}
|
||||
|
||||
void run() {
|
||||
doRunTest(0, out -> out.contains("compiler.err.doesnt.exist: java.util.stream"), "-release", "7");
|
||||
doRunTest(0, out -> !out.contains("compiler.err.doesnt.exist: java.util.stream"), "-release", "8");
|
||||
doRunTest(1, out -> true, "-release", "7", "-source", "7");
|
||||
doRunTest(1, out -> true, "-release", "7", "-bootclasspath", "any");
|
||||
doRunTest(0, out -> out.contains("compiler.err.doesnt.exist: java.util.stream"), "--release", "7");
|
||||
doRunTest(0, out -> !out.contains("compiler.err.doesnt.exist: java.util.stream"), "--release", "8");
|
||||
doRunTest(1, out -> true, "--release", "7", "-source", "7");
|
||||
doRunTest(1, out -> true, "--release", "7", "-bootclasspath", "any");
|
||||
}
|
||||
|
||||
void doRunTest(int expectedResult, Predicate<String> validate, String... args) {
|
||||
|
||||
@ -23,7 +23,7 @@
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8144095
|
||||
* @bug 8144095 8164825
|
||||
* @summary Test Command Completion
|
||||
* @modules jdk.compiler/com.sun.tools.javac.api
|
||||
* jdk.compiler/com.sun.tools.javac.main
|
||||
@ -40,6 +40,7 @@ import java.nio.file.FileSystems;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.function.Predicate;
|
||||
@ -148,6 +149,80 @@ public class CommandCompletionTest extends ReplToolTesting {
|
||||
assertCompletion("/classpath ~/|", false, completions.toArray(new String[completions.size()]));
|
||||
}
|
||||
|
||||
public void testSet() throws IOException {
|
||||
List<String> p1 = listFiles(Paths.get(""));
|
||||
FileSystems.getDefault().getRootDirectories().forEach(s -> p1.add(s.toString()));
|
||||
Collections.sort(p1);
|
||||
|
||||
String[] modes = {"concise ", "normal ", "silent ", "verbose "};
|
||||
String[] options = {"-command", "-delete", "-quiet"};
|
||||
String[] modesWithOptions = Stream.concat(Arrays.stream(options), Arrays.stream(modes)).sorted().toArray(String[]::new);
|
||||
test(false, new String[] {"--no-startup"},
|
||||
a -> assertCompletion(a, "/se|", false, "/set "),
|
||||
a -> assertCompletion(a, "/set |", false, "editor ", "feedback ", "format ", "mode ", "prompt ", "start ", "truncation "),
|
||||
|
||||
// /set editor
|
||||
a -> assertCompletion(a, "/set e|", false, "editor "),
|
||||
a -> assertCompletion(a, "/set editor |", false, p1.toArray(new String[p1.size()])),
|
||||
|
||||
// /set feedback
|
||||
a -> assertCompletion(a, "/set fe|", false, "feedback "),
|
||||
a -> assertCompletion(a, "/set fe |", false, modes),
|
||||
|
||||
// /set format
|
||||
a -> assertCompletion(a, "/set fo|", false, "format "),
|
||||
a -> assertCompletion(a, "/set fo |", false, modes),
|
||||
|
||||
// /set mode
|
||||
a -> assertCompletion(a, "/set mo|", false, "mode "),
|
||||
a -> assertCompletion(a, "/set mo |", false),
|
||||
a -> assertCompletion(a, "/set mo newmode |", false, modesWithOptions),
|
||||
a -> assertCompletion(a, "/set mo newmode -|", false, options),
|
||||
a -> assertCompletion(a, "/set mo newmode -command |", false),
|
||||
a -> assertCompletion(a, "/set mo newmode normal |", false, options),
|
||||
|
||||
// /set prompt
|
||||
a -> assertCompletion(a, "/set pro|", false, "prompt "),
|
||||
a -> assertCompletion(a, "/set pro |", false, modes),
|
||||
|
||||
// /set start
|
||||
a -> assertCompletion(a, "/set st|", false, "start "),
|
||||
a -> assertCompletion(a, "/set st |", false, p1.toArray(new String[p1.size()])),
|
||||
|
||||
// /set truncation
|
||||
a -> assertCompletion(a, "/set tr|", false, "truncation "),
|
||||
a -> assertCompletion(a, "/set tr |", false, modes)
|
||||
);
|
||||
}
|
||||
|
||||
public void testRetain() throws IOException {
|
||||
List<String> p1 = listFiles(Paths.get(""));
|
||||
FileSystems.getDefault().getRootDirectories().forEach(s -> p1.add(s.toString()));
|
||||
Collections.sort(p1);
|
||||
|
||||
String[] modes = {"concise ", "normal ", "silent ", "verbose "};
|
||||
test(false, new String[] {"--no-startup"},
|
||||
a -> assertCompletion(a, "/ret|", false, "/retain "),
|
||||
a -> assertCompletion(a, "/retain |", false, "editor ", "feedback ", "mode ", "start "),
|
||||
|
||||
// /retain editor
|
||||
a -> assertCompletion(a, "/retain e|", false, "editor "),
|
||||
a -> assertCompletion(a, "/retain editor |", false, p1.toArray(new String[p1.size()])),
|
||||
|
||||
// /retain feedback
|
||||
a -> assertCompletion(a, "/retain fe|", false, "feedback "),
|
||||
a -> assertCompletion(a, "/retain fe |", false, modes),
|
||||
|
||||
// /retain mode
|
||||
a -> assertCompletion(a, "/retain mo|", false, "mode "),
|
||||
a -> assertCompletion(a, "/retain mo |", false, modes),
|
||||
|
||||
// /retain start
|
||||
a -> assertCompletion(a, "/retain st|", false, "start "),
|
||||
a -> assertCompletion(a, "/retain st |", false, p1.toArray(new String[p1.size()]))
|
||||
);
|
||||
}
|
||||
|
||||
private void createIfNeeded(Path file) throws IOException {
|
||||
if (!Files.exists(file))
|
||||
Files.createFile(file);
|
||||
|
||||
@ -23,7 +23,7 @@
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8149524 8131024
|
||||
* @bug 8149524 8131024 8165211 8080071 8130454
|
||||
* @summary Test SourceCodeAnalysis
|
||||
* @build KullaTesting TestingInputStream
|
||||
* @run testng CompletenessTest
|
||||
@ -63,6 +63,7 @@ public class CompletenessTest extends KullaTesting {
|
||||
"foo: while (true) { printf(\"Innn\"); break foo; }",
|
||||
"class Case<E1 extends Enum<E1>, E2 extends Enum<E2>, E3 extends Enum<E3>> {}",
|
||||
";",
|
||||
"enum Tt { FOO, BAR, BAZ,; }"
|
||||
};
|
||||
|
||||
static final String[] expression = new String[] {
|
||||
@ -77,6 +78,8 @@ public class CompletenessTest extends KullaTesting {
|
||||
"new int[] {1, 2,3}",
|
||||
"new Foo() {}",
|
||||
"i >= 0 && Character.isWhitespace(s.charAt(i))",
|
||||
"int.class",
|
||||
"String.class",
|
||||
};
|
||||
|
||||
static final String[] complete_with_semi = new String[] {
|
||||
@ -113,6 +116,7 @@ public class CompletenessTest extends KullaTesting {
|
||||
"BufferedReader br = new BufferedReader(new FileReader(path))",
|
||||
"bar: g()",
|
||||
"baz: while (true) if (t()) printf('-'); else break baz",
|
||||
"java.util.function.IntFunction<int[]> ggg = int[]::new",
|
||||
};
|
||||
|
||||
static final String[] considered_incomplete = new String[] {
|
||||
@ -141,6 +145,8 @@ public class CompletenessTest extends KullaTesting {
|
||||
"if (match.kind == BRACES && (prevCT.kind == ARROW || prevCT.kind == NEW_MIDDLE)) {",
|
||||
"if (match.kind == BRACES && (prevCT.kind == ARROW || prevCT.kind == NEW_MIDDLE)) { new CT(UNMATCHED, current, \"Unmatched \" + unmatched);",
|
||||
"x +",
|
||||
"x *",
|
||||
"3 *",
|
||||
"int",
|
||||
"for (int i = 0; i < lines.length(); ++i) {",
|
||||
"new",
|
||||
@ -156,6 +162,7 @@ public class CompletenessTest extends KullaTesting {
|
||||
"enum TK { EOF(TokenKind.EOF, 0),",
|
||||
"enum TK { EOF(TokenKind.EOF, 0), NEW_MIDDLE(XEXPR1|XTERM)",
|
||||
"enum TK { EOF(TokenKind.EOF, 0), NEW_MIDDLE(XEXPR1|XTERM); ",
|
||||
"enum Tt { FOO, BAR, BAZ,;"
|
||||
};
|
||||
|
||||
static final String[] unknown = new String[] {
|
||||
|
||||
@ -419,9 +419,9 @@ public class CompletionSuggestionTest extends KullaTesting {
|
||||
public void testUncompletedDeclaration() {
|
||||
assertCompletion("class Clazz { Claz|", "Clazz");
|
||||
assertCompletion("class Clazz { class A extends Claz|", "Clazz");
|
||||
assertCompletion("class Clazz { Clazz clazz; Object o = cla|", "clazz");
|
||||
assertCompletion("class Clazz { static Clazz clazz; Object o = cla|", "clazz");
|
||||
assertCompletion("class Clazz { Clazz clazz; static Object o = cla|", true);
|
||||
assertCompletion("class Clazz { Clazz clazz; Object o = claz|", "clazz");
|
||||
assertCompletion("class Clazz { static Clazz clazz; Object o = claz|", "clazz");
|
||||
assertCompletion("class Clazz { Clazz clazz; static Object o = claz|", true);
|
||||
assertCompletion("class Clazz { void method(Claz|", "Clazz");
|
||||
assertCompletion("class A { int method() { return 0; } int a = meth|", "method()");
|
||||
assertCompletion("class A { int field = 0; int method() { return fiel|", "field");
|
||||
|
||||
@ -99,19 +99,18 @@ public class IdGeneratorTest {
|
||||
}
|
||||
}
|
||||
|
||||
@Test(enabled = false) // TODO 8133507
|
||||
public void testIdInException() {
|
||||
JShell.Builder builder = getBuilder().idGenerator(((snippet, id) -> "custom" + id));
|
||||
try (JShell jShell = builder.build()) {
|
||||
EvalException evalException = (EvalException) jShell.eval("throw new Error();").get(0).exception();
|
||||
for (StackTraceElement ste : evalException.getStackTrace()) {
|
||||
assertTrue(ste.getFileName().startsWith("custom"), "Not started with \"custom\": "
|
||||
assertTrue(ste.getFileName().startsWith("#custom"), "Not started with \"#custom\": "
|
||||
+ ste.getFileName());
|
||||
}
|
||||
jShell.eval("void f() { g(); }");
|
||||
UnresolvedReferenceException unresolvedException = (UnresolvedReferenceException) jShell.eval("f();").get(0).exception();
|
||||
for (StackTraceElement ste : unresolvedException.getStackTrace()) {
|
||||
assertTrue(ste.getFileName().startsWith("custom"), "Not started with \"custom\": "
|
||||
assertTrue(ste.getFileName().startsWith("#custom"), "Not started with \"#custom\": "
|
||||
+ ste.getFileName());
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,46 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8164518
|
||||
* @summary Tests for standard JDI connector (without failover) -- launching
|
||||
* @modules jdk.jshell/jdk.jshell.execution
|
||||
* @build KullaTesting ExecutionControlTestBase
|
||||
* @run testng JDILaunchingExecutionControlTest
|
||||
*/
|
||||
|
||||
|
||||
import org.testng.annotations.Test;
|
||||
import org.testng.annotations.BeforeMethod;
|
||||
import jdk.jshell.execution.JDIDefaultExecutionControl;
|
||||
|
||||
@Test
|
||||
public class JDILaunchingExecutionControlTest extends ExecutionControlTestBase {
|
||||
|
||||
@BeforeMethod
|
||||
@Override
|
||||
public void setUp() {
|
||||
setUp(builder -> builder.executionEngine(JDIDefaultExecutionControl.launch()));
|
||||
}
|
||||
}
|
||||
@ -23,7 +23,7 @@
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8131029 8159935 8160127
|
||||
* @bug 8131029 8159935 8160127 8164518
|
||||
* @summary Tests for alternate JDI connector -- listening
|
||||
* @modules jdk.jshell/jdk.jshell.execution
|
||||
* @build KullaTesting ExecutionControlTestBase
|
||||
@ -41,6 +41,6 @@ public class JDIListeningExecutionControlTest extends ExecutionControlTestBase {
|
||||
@BeforeMethod
|
||||
@Override
|
||||
public void setUp() {
|
||||
setUp(builder -> builder.executionEngine(JDIDefaultExecutionControl.listen()));
|
||||
setUp(builder -> builder.executionEngine(JDIDefaultExecutionControl.listen(null)));
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,46 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8164518
|
||||
* @summary Tests for alternate JDI connector -- listening to "localhost"
|
||||
* @modules jdk.jshell/jdk.jshell.execution
|
||||
* @build KullaTesting ExecutionControlTestBase
|
||||
* @run testng JDIListeningLocalhostExecutionControlTest
|
||||
*/
|
||||
|
||||
|
||||
import org.testng.annotations.Test;
|
||||
import org.testng.annotations.BeforeMethod;
|
||||
import jdk.jshell.execution.JDIDefaultExecutionControl;
|
||||
|
||||
@Test
|
||||
public class JDIListeningLocalhostExecutionControlTest extends ExecutionControlTestBase {
|
||||
|
||||
@BeforeMethod
|
||||
@Override
|
||||
public void setUp() {
|
||||
setUp(builder -> builder.executionEngine(JDIDefaultExecutionControl.listen("localhost")));
|
||||
}
|
||||
}
|
||||
@ -247,7 +247,6 @@ public class ReplToolTesting {
|
||||
new PrintStream(cmdout),
|
||||
new PrintStream(cmderr),
|
||||
new PrintStream(console),
|
||||
userin,
|
||||
new PrintStream(userout),
|
||||
new PrintStream(usererr),
|
||||
prefs,
|
||||
@ -463,7 +462,7 @@ public class ReplToolTesting {
|
||||
|
||||
private List<String> computeCompletions(String code, boolean isSmart) {
|
||||
JShellTool js = this.repl != null ? this.repl
|
||||
: new JShellTool(null, null, null, null, null, null, null, prefs, Locale.ROOT);
|
||||
: new JShellTool(null, null, null, null, null, null, prefs, Locale.ROOT);
|
||||
int cursor = code.indexOf('|');
|
||||
code = code.replace("|", "");
|
||||
assertTrue(cursor > -1, "'|' not found: " + code);
|
||||
|
||||
@ -63,7 +63,6 @@ public class StartOptionTest {
|
||||
new PrintStream(cmdout),
|
||||
new PrintStream(cmderr),
|
||||
new PrintStream(console),
|
||||
new TestingInputStream(),
|
||||
new PrintStream(userout),
|
||||
new PrintStream(usererr),
|
||||
new ReplToolTesting.MemoryPreferences(),
|
||||
|
||||
44
langtools/test/jdk/jshell/UserInputTest.java
Normal file
44
langtools/test/jdk/jshell/UserInputTest.java
Normal file
@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8131023
|
||||
* @summary Verify that the user's code can read System.in
|
||||
* @build KullaTesting TestingInputStream
|
||||
* @run testng UserInputTest
|
||||
*/
|
||||
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
@Test
|
||||
public class UserInputTest extends KullaTesting {
|
||||
|
||||
public void testReadInput() {
|
||||
setInput("AB\n");
|
||||
assertEval("System.in.read()", "65");
|
||||
setInput("BC\n");
|
||||
assertEval("System.in.read()", "66");
|
||||
}
|
||||
|
||||
}
|
||||
@ -37,7 +37,6 @@ import static jdk.jshell.Snippet.Status.VALID;
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectInput;
|
||||
import java.io.ObjectOutput;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.net.ServerSocket;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@ -62,7 +61,7 @@ import jdk.jshell.spi.ExecutionEnv;
|
||||
import static org.testng.Assert.assertEquals;
|
||||
import static org.testng.Assert.fail;
|
||||
import static jdk.jshell.execution.Util.forwardExecutionControlAndIO;
|
||||
import static jdk.jshell.execution.Util.remoteInput;
|
||||
import static jdk.jshell.execution.Util.remoteInputOutput;
|
||||
|
||||
@Test
|
||||
public class UserJDIUserRemoteTest extends ExecutionControlTestBase {
|
||||
@ -146,7 +145,7 @@ class MyExecutionControl extends JDIExecutionControl {
|
||||
* @return the channel
|
||||
* @throws IOException if there are errors in set-up
|
||||
*/
|
||||
static MyExecutionControl make(ExecutionEnv env, UserJDIUserRemoteTest test) throws IOException {
|
||||
static ExecutionControl make(ExecutionEnv env, UserJDIUserRemoteTest test) throws IOException {
|
||||
try (final ServerSocket listener = new ServerSocket(0)) {
|
||||
// timeout after 60 seconds
|
||||
listener.setSoTimeout(60000);
|
||||
@ -159,7 +158,7 @@ class MyExecutionControl extends JDIExecutionControl {
|
||||
+ System.getProperty("path.separator")
|
||||
+ System.getProperty("user.dir"));
|
||||
JDIInitiator jdii = new JDIInitiator(port,
|
||||
opts, REMOTE_AGENT, true);
|
||||
opts, REMOTE_AGENT, true, null);
|
||||
VirtualMachine vm = jdii.vm();
|
||||
Process process = jdii.process();
|
||||
|
||||
@ -175,13 +174,14 @@ class MyExecutionControl extends JDIExecutionControl {
|
||||
// output.
|
||||
Socket socket = listener.accept();
|
||||
// out before in -- match remote creation so we don't hang
|
||||
ObjectOutput cmdout = new ObjectOutputStream(socket.getOutputStream());
|
||||
Map<String, OutputStream> io = new HashMap<>();
|
||||
io.put("out", env.userOut());
|
||||
io.put("err", env.userErr());
|
||||
io.put("aux", test.auxStream);
|
||||
ObjectInput cmdin = remoteInput(socket.getInputStream(), io);
|
||||
MyExecutionControl myec = new MyExecutionControl(cmdout, cmdin, vm, process, deathListeners);
|
||||
OutputStream out = socket.getOutputStream();
|
||||
Map<String, OutputStream> outputs = new HashMap<>();
|
||||
outputs.put("out", env.userOut());
|
||||
outputs.put("err", env.userErr());
|
||||
outputs.put("aux", test.auxStream);
|
||||
Map<String, InputStream> input = new HashMap<>();
|
||||
input.put("in", env.userIn());
|
||||
ExecutionControl myec = remoteInputOutput(socket.getInputStream(), out, outputs, input, (objIn, objOut) -> new MyExecutionControl(objOut, objIn, vm, process, deathListeners));
|
||||
test.currentEC = myec;
|
||||
return myec;
|
||||
}
|
||||
@ -255,11 +255,13 @@ class MyRemoteExecutionControl extends DirectExecutionControl implements Executi
|
||||
Socket socket = new Socket(loopBack, Integer.parseInt(args[0]));
|
||||
InputStream inStream = socket.getInputStream();
|
||||
OutputStream outStream = socket.getOutputStream();
|
||||
Map<String, Consumer<OutputStream>> chans = new HashMap<>();
|
||||
chans.put("out", st -> System.setOut(new PrintStream(st, true)));
|
||||
chans.put("err", st -> System.setErr(new PrintStream(st, true)));
|
||||
chans.put("aux", st -> { auxPrint = new PrintStream(st, true); });
|
||||
forwardExecutionControlAndIO(new MyRemoteExecutionControl(), inStream, outStream, chans);
|
||||
Map<String, Consumer<OutputStream>> outputs = new HashMap<>();
|
||||
outputs.put("out", st -> System.setOut(new PrintStream(st, true)));
|
||||
outputs.put("err", st -> System.setErr(new PrintStream(st, true)));
|
||||
outputs.put("aux", st -> { auxPrint = new PrintStream(st, true); });
|
||||
Map<String, Consumer<InputStream>> input = new HashMap<>();
|
||||
input.put("in", st -> System.setIn(st));
|
||||
forwardExecutionControlAndIO(new MyRemoteExecutionControl(), inStream, outStream, outputs, input);
|
||||
} catch (Throwable ex) {
|
||||
throw ex;
|
||||
}
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
DeprecatedYES.java:18:10: compiler.warn.has.been.deprecated: foo(), A
|
||||
DeprecatedYES.java:12:10: compiler.warn.missing.deprecated.annotation
|
||||
- compiler.err.warnings.and.werror
|
||||
DeprecatedYES.java:18:10: compiler.warn.has.been.deprecated: foo(), A
|
||||
1 error
|
||||
1 warning
|
||||
2 warnings
|
||||
|
||||
@ -24,8 +24,8 @@
|
||||
/*
|
||||
* @test
|
||||
* bug 8139474
|
||||
* @summary -release 7 -verbose causes Javac exception
|
||||
* @compile -release 7 -verbose DashRelease7DashVerboseTest.java
|
||||
* @summary --release 7 -verbose causes Javac exception
|
||||
* @compile --release 7 -verbose DashRelease7DashVerboseTest.java
|
||||
*/
|
||||
|
||||
public class DashRelease7DashVerboseTest {}
|
||||
|
||||
@ -1,2 +1,4 @@
|
||||
DepX.java:38:1: compiler.warn.missing.deprecated.annotation
|
||||
- compiler.note.deprecated.filename: RefX.java
|
||||
- compiler.note.deprecated.recompile
|
||||
1 warning
|
||||
|
||||
@ -0,0 +1,34 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8164073
|
||||
* @summary Verify that -Xlint:-dep-ann suppresses warnings.
|
||||
* @compile -Xlint:-dep-ann -Werror SuppressDepAnnWithSwitchTest.java
|
||||
*/
|
||||
|
||||
public class SuppressDepAnnWithSwitchTest {
|
||||
/** @deprecated */
|
||||
int f;
|
||||
}
|
||||
@ -1,10 +1,11 @@
|
||||
/**
|
||||
* @test /nodynamiccopyright/
|
||||
* @bug 4216683 4346296 4656556 4785453
|
||||
* @bug 4216683 4346296 4656556 4785453 8164073
|
||||
* @summary New rules for when deprecation messages are suppressed
|
||||
* @author gafter
|
||||
*
|
||||
* @compile/ref=SuppressDeprecation.out -Xlint:deprecation -XDrawDiagnostics SuppressDeprecation.java
|
||||
* @compile/ref=SuppressDeprecation8.out -source 8 -Xlint:deprecation -XDrawDiagnostics SuppressDeprecation.java
|
||||
*/
|
||||
|
||||
/* Test for the contexts in which deprecations warnings should
|
||||
|
||||
@ -1,8 +1,20 @@
|
||||
SuppressDeprecation.java:82:10: compiler.warn.has.been.deprecated: g(), T
|
||||
SuppressDeprecation.java:83:14: compiler.warn.has.been.deprecated: g(), T
|
||||
SuppressDeprecation.java:84:9: compiler.warn.has.been.deprecated: var, T
|
||||
SuppressDeprecation.java:87:9: compiler.warn.has.been.deprecated: T(), T
|
||||
SuppressDeprecation.java:90:9: compiler.warn.has.been.deprecated: T(int), T
|
||||
SuppressDeprecation.java:98:1: compiler.warn.has.been.deprecated: T(), T
|
||||
SuppressDeprecation.java:130:17: compiler.warn.has.been.deprecated: X, compiler.misc.unnamed.package
|
||||
7 warnings
|
||||
SuppressDeprecation.java:29:9: compiler.warn.missing.deprecated.annotation
|
||||
SuppressDeprecation.java:33:10: compiler.warn.missing.deprecated.annotation
|
||||
SuppressDeprecation.java:38:10: compiler.warn.missing.deprecated.annotation
|
||||
SuppressDeprecation.java:48:5: compiler.warn.missing.deprecated.annotation
|
||||
SuppressDeprecation.java:53:5: compiler.warn.missing.deprecated.annotation
|
||||
SuppressDeprecation.java:67:10: compiler.warn.missing.deprecated.annotation
|
||||
SuppressDeprecation.java:74:9: compiler.warn.missing.deprecated.annotation
|
||||
SuppressDeprecation.java:80:10: compiler.warn.missing.deprecated.annotation
|
||||
SuppressDeprecation.java:83:10: compiler.warn.has.been.deprecated: g(), T
|
||||
SuppressDeprecation.java:84:14: compiler.warn.has.been.deprecated: g(), T
|
||||
SuppressDeprecation.java:85:9: compiler.warn.has.been.deprecated: var, T
|
||||
SuppressDeprecation.java:88:9: compiler.warn.has.been.deprecated: T(), T
|
||||
SuppressDeprecation.java:91:9: compiler.warn.has.been.deprecated: T(int), T
|
||||
SuppressDeprecation.java:99:1: compiler.warn.has.been.deprecated: T(), T
|
||||
SuppressDeprecation.java:124:9: compiler.warn.missing.deprecated.annotation
|
||||
SuppressDeprecation.java:103:1: compiler.warn.missing.deprecated.annotation
|
||||
SuppressDeprecation.java:129:1: compiler.warn.missing.deprecated.annotation
|
||||
SuppressDeprecation.java:131:17: compiler.warn.has.been.deprecated: X, compiler.misc.unnamed.package
|
||||
SuppressDeprecation.java:135:1: compiler.warn.missing.deprecated.annotation
|
||||
19 warnings
|
||||
|
||||
@ -0,0 +1,9 @@
|
||||
- compiler.warn.source.no.bootclasspath: 1.8
|
||||
SuppressDeprecation.java:83:10: compiler.warn.has.been.deprecated: g(), T
|
||||
SuppressDeprecation.java:84:14: compiler.warn.has.been.deprecated: g(), T
|
||||
SuppressDeprecation.java:85:9: compiler.warn.has.been.deprecated: var, T
|
||||
SuppressDeprecation.java:88:9: compiler.warn.has.been.deprecated: T(), T
|
||||
SuppressDeprecation.java:91:9: compiler.warn.has.been.deprecated: T(int), T
|
||||
SuppressDeprecation.java:99:1: compiler.warn.has.been.deprecated: T(), T
|
||||
SuppressDeprecation.java:131:17: compiler.warn.has.been.deprecated: X, compiler.misc.unnamed.package
|
||||
8 warnings
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -26,11 +26,11 @@
|
||||
* @bug 5086088
|
||||
* @summary check warnings generated when overriding deprecated methods
|
||||
*
|
||||
* @compile/ref=empty -XDrawDiagnostics -Xlint:deprecation I.java
|
||||
* @compile/ref=Test1I.out -XDrawDiagnostics -Xlint:deprecation I.java
|
||||
* @compile/ref=Test1A.out -XDrawDiagnostics -Xlint:deprecation A.java
|
||||
* @compile/ref=Test1B.out -XDrawDiagnostics -Xlint:deprecation B.java
|
||||
* @compile/ref=Test1B2.out -XDrawDiagnostics -Xlint:deprecation B2.java
|
||||
* @compile/ref=empty -XDrawDiagnostics -Xlint:deprecation B3.java
|
||||
* @compile/ref=Test1B3.out -XDrawDiagnostics -Xlint:deprecation B3.java
|
||||
* @compile/ref=empty -XDrawDiagnostics -Xlint:deprecation Test1.java
|
||||
*/
|
||||
|
||||
|
||||
@ -1,4 +1,10 @@
|
||||
A.java:13:36: compiler.warn.has.been.deprecated: iDep_aUnd_bInh(), I
|
||||
A.java:12:36: compiler.warn.has.been.deprecated: iDep_aUnd_bUnd(), I
|
||||
A.java:11:36: compiler.warn.has.been.deprecated: iDep_aUnd_bDep(), I
|
||||
3 warnings
|
||||
A.java:8:36: compiler.warn.missing.deprecated.annotation
|
||||
A.java:9:36: compiler.warn.missing.deprecated.annotation
|
||||
A.java:10:36: compiler.warn.missing.deprecated.annotation
|
||||
A.java:17:36: compiler.warn.missing.deprecated.annotation
|
||||
A.java:18:36: compiler.warn.missing.deprecated.annotation
|
||||
A.java:19:36: compiler.warn.missing.deprecated.annotation
|
||||
9 warnings
|
||||
|
||||
@ -1,4 +1,10 @@
|
||||
B.java:15:36: compiler.warn.has.been.deprecated: iDep_aInh_bUnd(), I
|
||||
B.java:8:36: compiler.warn.missing.deprecated.annotation
|
||||
B.java:9:36: compiler.warn.has.been.deprecated: iDep_aDep_bUnd(), A
|
||||
B.java:11:36: compiler.warn.missing.deprecated.annotation
|
||||
B.java:14:36: compiler.warn.missing.deprecated.annotation
|
||||
B.java:17:36: compiler.warn.missing.deprecated.annotation
|
||||
B.java:18:36: compiler.warn.has.been.deprecated: iUnd_aDep_bUnd(), A
|
||||
3 warnings
|
||||
B.java:20:36: compiler.warn.missing.deprecated.annotation
|
||||
B.java:23:36: compiler.warn.missing.deprecated.annotation
|
||||
9 warnings
|
||||
|
||||
@ -2,6 +2,12 @@ B2.java:15:36: compiler.warn.has.been.deprecated: iDep_aInh_bUnd(), I
|
||||
B2.java:7:10: compiler.warn.has.been.deprecated: iDep_aUnd_bInh(), I
|
||||
B2.java:12:36: compiler.warn.has.been.deprecated: iDep_aUnd_bUnd(), I
|
||||
B2.java:9:36: compiler.warn.has.been.deprecated: iDep_aDep_bUnd(), I
|
||||
B2.java:8:36: compiler.warn.missing.deprecated.annotation
|
||||
B2.java:9:36: compiler.warn.has.been.deprecated: iDep_aDep_bUnd(), A
|
||||
B2.java:11:36: compiler.warn.missing.deprecated.annotation
|
||||
B2.java:14:36: compiler.warn.missing.deprecated.annotation
|
||||
B2.java:17:36: compiler.warn.missing.deprecated.annotation
|
||||
B2.java:18:36: compiler.warn.has.been.deprecated: iUnd_aDep_bUnd(), A
|
||||
6 warnings
|
||||
B2.java:20:36: compiler.warn.missing.deprecated.annotation
|
||||
B2.java:23:36: compiler.warn.missing.deprecated.annotation
|
||||
12 warnings
|
||||
|
||||
@ -0,0 +1,8 @@
|
||||
B3.java:32:36: compiler.warn.missing.deprecated.annotation
|
||||
B3.java:35:36: compiler.warn.missing.deprecated.annotation
|
||||
B3.java:38:36: compiler.warn.missing.deprecated.annotation
|
||||
B3.java:41:36: compiler.warn.missing.deprecated.annotation
|
||||
B3.java:44:36: compiler.warn.missing.deprecated.annotation
|
||||
B3.java:47:36: compiler.warn.missing.deprecated.annotation
|
||||
B3.java:31:10: compiler.warn.missing.deprecated.annotation
|
||||
7 warnings
|
||||
@ -0,0 +1,9 @@
|
||||
I.java:30:36: compiler.warn.missing.deprecated.annotation
|
||||
I.java:31:36: compiler.warn.missing.deprecated.annotation
|
||||
I.java:32:36: compiler.warn.missing.deprecated.annotation
|
||||
I.java:33:36: compiler.warn.missing.deprecated.annotation
|
||||
I.java:34:36: compiler.warn.missing.deprecated.annotation
|
||||
I.java:35:36: compiler.warn.missing.deprecated.annotation
|
||||
I.java:36:36: compiler.warn.missing.deprecated.annotation
|
||||
I.java:37:36: compiler.warn.missing.deprecated.annotation
|
||||
8 warnings
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -26,7 +26,7 @@
|
||||
* @bug 5086088
|
||||
* @summary check warnings generated when overriding deprecated methods
|
||||
*
|
||||
* @compile/ref=empty -XDrawDiagnostics -Xlint:deprecation P.java
|
||||
* @compile/ref=Test2P.out -XDrawDiagnostics -Xlint:deprecation P.java
|
||||
* @compile/ref=Test2Q.out -XDrawDiagnostics -Xlint:deprecation Q.java
|
||||
* @compile/ref=Test2R.out -XDrawDiagnostics -Xlint:deprecation R.java
|
||||
* @compile/ref=empty -XDrawDiagnostics -Xlint:deprecation Test2.java
|
||||
|
||||
@ -0,0 +1,10 @@
|
||||
P.java:30:36: compiler.warn.missing.deprecated.annotation
|
||||
P.java:31:36: compiler.warn.missing.deprecated.annotation
|
||||
P.java:32:36: compiler.warn.missing.deprecated.annotation
|
||||
P.java:33:36: compiler.warn.missing.deprecated.annotation
|
||||
P.java:34:36: compiler.warn.missing.deprecated.annotation
|
||||
P.java:35:36: compiler.warn.missing.deprecated.annotation
|
||||
P.java:36:36: compiler.warn.missing.deprecated.annotation
|
||||
P.java:37:36: compiler.warn.missing.deprecated.annotation
|
||||
P.java:38:36: compiler.warn.missing.deprecated.annotation
|
||||
9 warnings
|
||||
@ -1,4 +1,10 @@
|
||||
Q.java:8:36: compiler.warn.missing.deprecated.annotation
|
||||
Q.java:9:36: compiler.warn.missing.deprecated.annotation
|
||||
Q.java:10:36: compiler.warn.missing.deprecated.annotation
|
||||
Q.java:11:36: compiler.warn.has.been.deprecated: pDep_qUnd_rDep(), P
|
||||
Q.java:12:36: compiler.warn.has.been.deprecated: pDep_qUnd_rUnd(), P
|
||||
Q.java:13:36: compiler.warn.has.been.deprecated: pDep_qUnd_rInh(), P
|
||||
3 warnings
|
||||
Q.java:17:36: compiler.warn.missing.deprecated.annotation
|
||||
Q.java:18:36: compiler.warn.missing.deprecated.annotation
|
||||
Q.java:19:36: compiler.warn.missing.deprecated.annotation
|
||||
9 warnings
|
||||
|
||||
@ -1,4 +1,10 @@
|
||||
R.java:8:36: compiler.warn.missing.deprecated.annotation
|
||||
R.java:9:36: compiler.warn.has.been.deprecated: pDep_qDep_rUnd(), Q
|
||||
R.java:11:36: compiler.warn.missing.deprecated.annotation
|
||||
R.java:14:36: compiler.warn.missing.deprecated.annotation
|
||||
R.java:15:36: compiler.warn.has.been.deprecated: pDep_qInh_rUnd(), P
|
||||
R.java:17:36: compiler.warn.missing.deprecated.annotation
|
||||
R.java:18:36: compiler.warn.has.been.deprecated: pUnd_qDep_rUnd(), Q
|
||||
3 warnings
|
||||
R.java:20:36: compiler.warn.missing.deprecated.annotation
|
||||
R.java:23:36: compiler.warn.missing.deprecated.annotation
|
||||
9 warnings
|
||||
|
||||
@ -1,2 +1,3 @@
|
||||
Test3.java:11:14: compiler.warn.missing.deprecated.annotation
|
||||
Test3.java:18:1: compiler.warn.has.been.deprecated: m(), LibInterface
|
||||
1 warning
|
||||
2 warnings
|
||||
|
||||
@ -22,6 +22,6 @@
|
||||
*/
|
||||
|
||||
// key: compiler.err.processorpath.no.processormodulepath
|
||||
// options: -processormodulepath mods -processorpath mods
|
||||
// options: --processor-module-path mods -processorpath mods
|
||||
|
||||
class ProcessorPathNoProcessorModulePath {}
|
||||
|
||||
@ -174,7 +174,7 @@ public class MultiReleaseJarAwareSJFM {
|
||||
jfm.setLocation(jloc, List.of(new File("multi-release.jar")));
|
||||
|
||||
if (version.length() > 0) {
|
||||
jfm.handleOption("-multi-release", List.of(version).iterator());
|
||||
jfm.handleOption("--multi-release", List.of(version).iterator());
|
||||
}
|
||||
|
||||
CustomClassLoader cldr = new CustomClassLoader(jfm);
|
||||
|
||||
@ -135,12 +135,12 @@ public class MultiReleaseJarTest {
|
||||
}
|
||||
|
||||
@Test(dataProvider="modes")
|
||||
// javac -d classes -release 8 -cp multi-release.jar Main.java -> succeeds
|
||||
// javac -d classes --release 8 -cp multi-release.jar Main.java -> succeeds
|
||||
public void main1Release8(Task.Mode mode) throws Exception {
|
||||
tb.writeFile("Main.java", main1);
|
||||
Task.Result result = new JavacTask(tb, mode)
|
||||
.outdir("classes")
|
||||
.options("-release", "8")
|
||||
.options("--release", "8")
|
||||
.classpath("multi-release.jar")
|
||||
.files("Main.java")
|
||||
.run();
|
||||
@ -149,12 +149,12 @@ public class MultiReleaseJarTest {
|
||||
}
|
||||
|
||||
@Test(dataProvider="modes")
|
||||
// javac -d classes -release 9 -cp multi-release.jar Main.java -> fails
|
||||
// javac -d classes --release 9 -cp multi-release.jar Main.java -> fails
|
||||
public void main1Release9(Task.Mode mode) throws Exception {
|
||||
tb.writeFile("Main.java", main1);
|
||||
Task.Result result = new JavacTask(tb, mode)
|
||||
.outdir("classes")
|
||||
.options("-release", "9")
|
||||
.options("--release", "9")
|
||||
.classpath("multi-release.jar")
|
||||
.files("Main.java")
|
||||
.run(Task.Expect.FAIL, 1);
|
||||
@ -177,12 +177,12 @@ public class MultiReleaseJarTest {
|
||||
}
|
||||
|
||||
@Test(dataProvider="modes")
|
||||
// javac -d classes -release 8 -cp multi-release.jar Main.java -> fails
|
||||
// javac -d classes --release 8 -cp multi-release.jar Main.java -> fails
|
||||
public void main2Release8(Task.Mode mode) throws Exception {
|
||||
tb.writeFile("Main.java", main2);
|
||||
Task.Result result = new JavacTask(tb, mode)
|
||||
.outdir("classes")
|
||||
.options("-release", "8")
|
||||
.options("--release", "8")
|
||||
.classpath("multi-release.jar")
|
||||
.files("Main.java")
|
||||
.run(Task.Expect.FAIL, 1);
|
||||
@ -191,12 +191,12 @@ public class MultiReleaseJarTest {
|
||||
}
|
||||
|
||||
@Test(dataProvider="modes")
|
||||
// javac -d classes -release 9 -cp multi-release.jar Main.java -> succeeds
|
||||
// javac -d classes --release 9 -cp multi-release.jar Main.java -> succeeds
|
||||
public void main2Release9(Task.Mode mode) throws Exception {
|
||||
tb.writeFile("Main.java", main2);
|
||||
Task.Result result = new JavacTask(tb, mode)
|
||||
.outdir("classes")
|
||||
.options("-release", "9")
|
||||
.options("--release", "9")
|
||||
.classpath("multi-release.jar")
|
||||
.files("Main.java")
|
||||
.run();
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
Deprecation.java:14:17: compiler.warn.has.been.deprecated: A, compiler.misc.unnamed.package
|
||||
Deprecation.java:11:1: compiler.warn.missing.deprecated.annotation
|
||||
- compiler.err.warnings.and.werror
|
||||
Deprecation.java:14:17: compiler.warn.has.been.deprecated: A, compiler.misc.unnamed.package
|
||||
1 error
|
||||
1 warning
|
||||
2 warnings
|
||||
|
||||
@ -78,7 +78,7 @@ public class AnachronisticModuleInfoTest extends TestRunner {
|
||||
|
||||
String log = new JavacTask(tb, Task.Mode.CMDLINE)
|
||||
.options("-XDrawDiagnostics",
|
||||
"-upgrademodulepath", modulePath)
|
||||
"--upgrade-module-path", modulePath)
|
||||
.files(findJavaFiles(src))
|
||||
.run(Task.Expect.FAIL)
|
||||
.writeAll()
|
||||
|
||||
@ -23,7 +23,7 @@
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @summary tests for -upgrademodulepath
|
||||
* @summary tests for --upgrade-module-path
|
||||
* @library /tools/lib
|
||||
* @modules
|
||||
* jdk.compiler/com.sun.tools.javac.api
|
||||
|
||||
@ -27,7 +27,9 @@
|
||||
* @library /tools/lib
|
||||
* @modules
|
||||
* jdk.compiler/com.sun.tools.javac.api
|
||||
* jdk.compiler/com.sun.tools.javac.code
|
||||
* jdk.compiler/com.sun.tools.javac.main
|
||||
* jdk.compiler/com.sun.tools.javac.processing
|
||||
* @build toolbox.ToolBox toolbox.JavacTask toolbox.ModuleBuilder ModuleTestBase
|
||||
* @run main XModuleTest
|
||||
*/
|
||||
@ -35,12 +37,22 @@
|
||||
import java.nio.file.Path;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.annotation.processing.AbstractProcessor;
|
||||
import javax.annotation.processing.RoundEnvironment;
|
||||
import javax.annotation.processing.SupportedAnnotationTypes;
|
||||
import javax.lang.model.SourceVersion;
|
||||
import javax.lang.model.element.ModuleElement;
|
||||
import javax.lang.model.element.TypeElement;
|
||||
import javax.lang.model.util.Elements;
|
||||
|
||||
import com.sun.tools.javac.code.Symtab;
|
||||
import com.sun.tools.javac.processing.JavacProcessingEnvironment;
|
||||
import toolbox.JavacTask;
|
||||
import toolbox.ModuleBuilder;
|
||||
import toolbox.Task;
|
||||
import toolbox.TestRunner;
|
||||
import toolbox.ToolBox;
|
||||
import toolbox.Task.Expect;
|
||||
|
||||
public class XModuleTest extends ModuleTestBase {
|
||||
|
||||
@ -111,15 +123,22 @@ public class XModuleTest extends ModuleTestBase {
|
||||
Path classes = base.resolve("classes");
|
||||
tb.createDirectories(classes);
|
||||
|
||||
String log = new JavacTask(tb)
|
||||
.options("-Xmodule:java.compiler", "--class-path", cpClasses.toString())
|
||||
List<String> log = new JavacTask(tb)
|
||||
.options("-Xmodule:java.compiler",
|
||||
"--class-path", cpClasses.toString(),
|
||||
"-XDrawDiagnostics")
|
||||
.outdir(classes)
|
||||
.files(src.resolve("javax/lang/model/element/Extra.java"))
|
||||
.run()
|
||||
.run(Expect.FAIL)
|
||||
.writeAll()
|
||||
.getOutput(Task.OutputKind.DIRECT);
|
||||
.getOutputLines(Task.OutputKind.DIRECT);
|
||||
|
||||
if (!log.isEmpty())
|
||||
List<String> expectedOut = Arrays.asList(
|
||||
"Extra.java:1:76: compiler.err.doesnt.exist: p",
|
||||
"1 error"
|
||||
);
|
||||
|
||||
if (!expectedOut.equals(log))
|
||||
throw new Exception("expected output not found: " + log);
|
||||
}
|
||||
|
||||
@ -302,4 +321,103 @@ public class XModuleTest extends ModuleTestBase {
|
||||
.run()
|
||||
.writeAll();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUnnamedIsolation(Path base) throws Exception {
|
||||
//note: avoiding use of java.base, as that gets special handling on some places:
|
||||
Path sourcePath = base.resolve("source-path");
|
||||
tb.writeJavaFiles(sourcePath, "package src; public class Src {}");
|
||||
|
||||
Path classPathSrc = base.resolve("class-path-src");
|
||||
tb.writeJavaFiles(classPathSrc, "package cp; public class CP { }");
|
||||
Path classPath = base.resolve("classPath");
|
||||
tb.createDirectories(classPath);
|
||||
|
||||
String cpLog = new JavacTask(tb)
|
||||
.outdir(classPath)
|
||||
.files(findJavaFiles(classPathSrc))
|
||||
.run()
|
||||
.writeAll()
|
||||
.getOutput(Task.OutputKind.DIRECT);
|
||||
|
||||
if (!cpLog.isEmpty())
|
||||
throw new Exception("expected output not found: " + cpLog);
|
||||
|
||||
Path modulePathSrc = base.resolve("module-path-src");
|
||||
tb.writeJavaFiles(modulePathSrc,
|
||||
"module m {}",
|
||||
"package m; public class M {}");
|
||||
Path modulePath = base.resolve("modulePath");
|
||||
tb.createDirectories(modulePath.resolve("m"));
|
||||
|
||||
String modLog = new JavacTask(tb)
|
||||
.outdir(modulePath.resolve("m"))
|
||||
.files(findJavaFiles(modulePathSrc))
|
||||
.run()
|
||||
.writeAll()
|
||||
.getOutput(Task.OutputKind.DIRECT);
|
||||
|
||||
if (!modLog.isEmpty())
|
||||
throw new Exception("expected output not found: " + modLog);
|
||||
|
||||
Path src = base.resolve("src");
|
||||
tb.writeJavaFiles(src, "package m; public class Extra { }");
|
||||
Path classes = base.resolve("classes");
|
||||
tb.createDirectories(classes);
|
||||
|
||||
String log = new JavacTask(tb)
|
||||
.options("-Xmodule:m",
|
||||
"--class-path", classPath.toString(),
|
||||
"--source-path", sourcePath.toString(),
|
||||
"--module-path", modulePath.toString(),
|
||||
"--processor-path", System.getProperty("test.classes"),
|
||||
"-XDaccessInternalAPI=true",
|
||||
"-processor", CheckModuleContentProcessing.class.getName())
|
||||
.outdir(classes)
|
||||
.files(findJavaFiles(sourcePath))
|
||||
.run()
|
||||
.writeAll()
|
||||
.getOutput(Task.OutputKind.DIRECT);
|
||||
|
||||
if (!log.isEmpty())
|
||||
throw new Exception("expected output not found: " + log);
|
||||
}
|
||||
|
||||
@SupportedAnnotationTypes("*")
|
||||
public static final class CheckModuleContentProcessing extends AbstractProcessor {
|
||||
|
||||
@Override
|
||||
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
|
||||
Symtab syms = Symtab.instance(((JavacProcessingEnvironment) processingEnv).getContext());
|
||||
Elements elements = processingEnv.getElementUtils();
|
||||
ModuleElement unnamedModule = syms.unnamedModule;
|
||||
ModuleElement mModule = elements.getModuleElement("m");
|
||||
|
||||
assertNonNull("mModule found", mModule);
|
||||
assertNonNull("src.Src from m", elements.getTypeElement(mModule, "src.Src"));
|
||||
assertNull("cp.CP not from m", elements.getTypeElement(mModule, "cp.CP"));
|
||||
assertNull("src.Src not from unnamed", elements.getTypeElement(unnamedModule, "src.Src"));
|
||||
assertNonNull("cp.CP from unnamed", elements.getTypeElement(unnamedModule, "cp.CP"));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SourceVersion getSupportedSourceVersion() {
|
||||
return SourceVersion.latest();
|
||||
}
|
||||
|
||||
private static void assertNonNull(String msg, Object val) {
|
||||
if (val == null) {
|
||||
throw new AssertionError(msg);
|
||||
}
|
||||
}
|
||||
|
||||
private static void assertNull(String msg, Object val) {
|
||||
if (val != null) {
|
||||
throw new AssertionError(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
/**
|
||||
* @test /nodynamiccopyright/
|
||||
* @bug 8072480
|
||||
* @summary Verify that javac rejects Java 8 program with -release 7
|
||||
* @summary Verify that javac rejects Java 8 program with --release 7
|
||||
* @compile ReleaseOption.java
|
||||
* @compile/fail/ref=ReleaseOption-release7.out -XDrawDiagnostics -release 7 ReleaseOption.java
|
||||
* @compile/fail/ref=ReleaseOption-release7.out -XDrawDiagnostics --release 7 ReleaseOption.java
|
||||
*/
|
||||
|
||||
interface ReleaseOption extends java.util.stream.Stream {
|
||||
|
||||
@ -24,7 +24,7 @@
|
||||
/**
|
||||
* @test
|
||||
* @bug 8072480
|
||||
* @summary Verify option clash between -release and -source is reported correctly.
|
||||
* @summary Verify option clash between --release and -source is reported correctly.
|
||||
* @modules jdk.compiler/com.sun.tools.javac.util
|
||||
*/
|
||||
|
||||
@ -62,7 +62,7 @@ public class ReleaseOptionClashes {
|
||||
useRawMessages.setBoolean(null, true);
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
List<String> options = new ArrayList<>();
|
||||
options.addAll(Arrays.asList("-release", "7"));
|
||||
options.addAll(Arrays.asList("--release", "7"));
|
||||
options.addAll(Arrays.asList(args));
|
||||
options.add(System.getProperty("test.src") + File.separator + "ReleaseOptionClashes.java");
|
||||
compiler.run(null, null, out, options.toArray(new String[0]));
|
||||
|
||||
@ -24,7 +24,7 @@
|
||||
/**
|
||||
* @test
|
||||
* @bug 8072480
|
||||
* @summary Verify that javac can handle -release when invoked using the Compiler API
|
||||
* @summary Verify that javac can handle --release when invoked using the Compiler API
|
||||
*/
|
||||
|
||||
import java.io.IOException;
|
||||
@ -50,7 +50,7 @@ public class ReleaseOptionThroughAPI {
|
||||
PrintWriter outWriter = new PrintWriter(out)) {
|
||||
Iterable<? extends JavaFileObject> input =
|
||||
fm.getJavaFileObjects(System.getProperty("test.src") + "/ReleaseOption.java");
|
||||
List<String> options = Arrays.asList("-release", "7", "-XDrawDiagnostics");
|
||||
List<String> options = Arrays.asList("--release", "7", "-XDrawDiagnostics");
|
||||
|
||||
compiler.getTask(outWriter, fm, null, options, null, input).call();
|
||||
String expected =
|
||||
|
||||
@ -101,7 +101,7 @@ public class PlatformProviderTest implements PlatformProvider {
|
||||
"-J--add-exports=jdk.compiler/com.sun.tools.javac.platform=ALL-UNNAMED",
|
||||
"-J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED",
|
||||
"-XDrawDiagnostics",
|
||||
"-release",
|
||||
"--release",
|
||||
platformSpec,
|
||||
System.getProperty("test.src") + "/PlatformProviderTestSource.java")
|
||||
.run();
|
||||
@ -135,7 +135,7 @@ public class PlatformProviderTest implements PlatformProvider {
|
||||
.options("-J--class-path=" + System.getProperty("test.classes"),
|
||||
"-J--add-exports=jdk.compiler/com.sun.tools.javac.platform=ALL-UNNAMED",
|
||||
"-J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED",
|
||||
"-release",
|
||||
"--release",
|
||||
"fail",
|
||||
System.getProperty("test.src") + "/PlatformProviderTestSource.java")
|
||||
.run(Task.Expect.FAIL);
|
||||
|
||||
@ -255,7 +255,7 @@ public class ElementStructureTest {
|
||||
}
|
||||
|
||||
void run(Writer output, String version) throws Exception {
|
||||
List<String> options = Arrays.asList("-release", version, "-classpath", "");
|
||||
List<String> options = Arrays.asList("--release", version, "-classpath", "");
|
||||
List<ToolBox.JavaSource> files = Arrays.asList(new ToolBox.JavaSource("Test", ""));
|
||||
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
|
||||
JavacTaskImpl task = (JavacTaskImpl) compiler.getTask(null, null, null, options, null, files);
|
||||
|
||||
@ -99,7 +99,7 @@ public class Main
|
||||
if (stdBootClassPath) {
|
||||
args.add("-Xmodule:java.base");
|
||||
} else {
|
||||
args.add("-system");
|
||||
args.add("--system");
|
||||
args.add("none");
|
||||
files.add("module-info.java");
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -41,7 +41,7 @@
|
||||
* jdk.compiler/com.sun.tools.javac.tree
|
||||
* jdk.compiler/com.sun.tools.javac.util
|
||||
* @build AbstractTreeScannerTest JavacTreeScannerTest
|
||||
* @run main JavacTreeScannerTest -q -r .
|
||||
* @run main/othervm JavacTreeScannerTest -q -r .
|
||||
*/
|
||||
|
||||
import java.io.*;
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -41,7 +41,7 @@
|
||||
* jdk.compiler/com.sun.tools.javac.tree
|
||||
* jdk.compiler/com.sun.tools.javac.util
|
||||
* @build AbstractTreeScannerTest SourceTreeScannerTest
|
||||
* @run main SourceTreeScannerTest -q -r .
|
||||
* @run main/othervm SourceTreeScannerTest -q -r .
|
||||
*/
|
||||
|
||||
import java.io.*;
|
||||
|
||||
@ -34,7 +34,7 @@ import com.sun.tools.javadoc.Main;
|
||||
/**
|
||||
* @test
|
||||
* @bug 8086737
|
||||
* @summary Test -release option in javadoc
|
||||
* @summary Test --release option in javadoc
|
||||
* @run main ReleaseOption
|
||||
*/
|
||||
public class ReleaseOption {
|
||||
@ -43,10 +43,10 @@ public class ReleaseOption {
|
||||
}
|
||||
|
||||
void run() {
|
||||
doRunTest(0, out -> out.contains("compiler.err.doesnt.exist: java.util.stream"), "-release", "7");
|
||||
doRunTest(0, out -> !out.contains("compiler.err.doesnt.exist: java.util.stream"), "-release", "8");
|
||||
doRunTest(1, out -> true, "-release", "7", "-source", "7");
|
||||
doRunTest(1, out -> true, "-release", "7", "-bootclasspath", "any");
|
||||
doRunTest(0, out -> out.contains("compiler.err.doesnt.exist: java.util.stream"), "--release", "7");
|
||||
doRunTest(0, out -> !out.contains("compiler.err.doesnt.exist: java.util.stream"), "--release", "8");
|
||||
doRunTest(1, out -> true, "--release", "7", "-source", "7");
|
||||
doRunTest(1, out -> true, "--release", "7", "-bootclasspath", "any");
|
||||
}
|
||||
|
||||
void doRunTest(int expectedResult, Predicate<String> validate, String... args) {
|
||||
|
||||
@ -205,7 +205,7 @@ public class ModuleBuilder {
|
||||
.collect(Collectors.joining(File.pathSeparator));
|
||||
new JavacTask(tb)
|
||||
.outdir(Files.createDirectories(modules.resolve(name)))
|
||||
.options("-mp", mp)
|
||||
.options("--module-path", mp)
|
||||
.files(tb.findJavaFiles(moduleSrc))
|
||||
.run()
|
||||
.writeAll();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user