8199194: Add javac support for preview features
Add support for preview features and related command line options. Reviewed-by: jjg
This commit is contained in:
parent
594fb594ce
commit
d9440e4e39
@ -287,7 +287,12 @@ public class Lint
|
|||||||
/**
|
/**
|
||||||
* Warn about potentially unsafe vararg methods
|
* Warn about potentially unsafe vararg methods
|
||||||
*/
|
*/
|
||||||
VARARGS("varargs");
|
VARARGS("varargs"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Warn about use of preview features.
|
||||||
|
*/
|
||||||
|
PREVIEW("preview");
|
||||||
|
|
||||||
LintCategory(String option) {
|
LintCategory(String option) {
|
||||||
this(option, false);
|
this(option, false);
|
||||||
|
@ -0,0 +1,204 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, 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 com.sun.tools.javac.code;
|
||||||
|
|
||||||
|
import com.sun.tools.javac.code.Lint.LintCategory;
|
||||||
|
import com.sun.tools.javac.code.Source.Feature;
|
||||||
|
import com.sun.tools.javac.comp.Infer;
|
||||||
|
import com.sun.tools.javac.jvm.Target;
|
||||||
|
import com.sun.tools.javac.resources.CompilerProperties.Errors;
|
||||||
|
import com.sun.tools.javac.resources.CompilerProperties.Warnings;
|
||||||
|
import com.sun.tools.javac.util.Assert;
|
||||||
|
import com.sun.tools.javac.util.Context;
|
||||||
|
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
|
||||||
|
import com.sun.tools.javac.util.JCDiagnostic.Error;
|
||||||
|
import com.sun.tools.javac.util.JCDiagnostic.SimpleDiagnosticPosition;
|
||||||
|
import com.sun.tools.javac.util.Log;
|
||||||
|
import com.sun.tools.javac.util.MandatoryWarningHandler;
|
||||||
|
import com.sun.tools.javac.util.Name;
|
||||||
|
import com.sun.tools.javac.util.Options;
|
||||||
|
|
||||||
|
import javax.tools.JavaFileObject;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import static com.sun.tools.javac.main.Option.PREVIEW;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper class to handle preview language features. This class maps certain language features
|
||||||
|
* (see {@link Feature} into 'preview' features; the mapping is completely ad-hoc, so as to allow
|
||||||
|
* for maximum flexibility, which allows to migrate preview feature into supported features with ease.
|
||||||
|
*
|
||||||
|
* This class acts as a centralized point against which usages of preview features are reported by
|
||||||
|
* clients (e.g. other javac classes). Internally, this class collects all such usages and generates
|
||||||
|
* diagnostics to inform the user of such usages. Such diagnostics can be enabled using the
|
||||||
|
* {@link LintCategory#PREVIEW} lint category, and are suppressible by usual means.
|
||||||
|
*/
|
||||||
|
public class Preview {
|
||||||
|
|
||||||
|
/** flag: are preview featutres enabled */
|
||||||
|
private final boolean enabled;
|
||||||
|
|
||||||
|
/** the diag handler to manage preview feature usage diagnostics */
|
||||||
|
private final MandatoryWarningHandler previewHandler;
|
||||||
|
|
||||||
|
/** test flag: should all features be considered as preview features? */
|
||||||
|
private final boolean forcePreview;
|
||||||
|
|
||||||
|
/** a mapping from classfile numbers to Java SE versions */
|
||||||
|
private final Map<Integer, Source> majorVersionToSource;
|
||||||
|
|
||||||
|
|
||||||
|
private final Lint lint;
|
||||||
|
private final Log log;
|
||||||
|
|
||||||
|
private static final Context.Key<Preview> previewKey = new Context.Key<>();
|
||||||
|
|
||||||
|
public static Preview instance(Context context) {
|
||||||
|
Preview instance = context.get(previewKey);
|
||||||
|
if (instance == null) {
|
||||||
|
instance = new Preview(context);
|
||||||
|
}
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
Preview(Context context) {
|
||||||
|
context.put(previewKey, this);
|
||||||
|
Options options = Options.instance(context);
|
||||||
|
enabled = options.isSet(PREVIEW);
|
||||||
|
log = Log.instance(context);
|
||||||
|
lint = Lint.instance(context);
|
||||||
|
this.previewHandler =
|
||||||
|
new MandatoryWarningHandler(log, lint.isEnabled(LintCategory.PREVIEW), true, "preview", LintCategory.PREVIEW);
|
||||||
|
forcePreview = options.isSet("forcePreview");
|
||||||
|
majorVersionToSource = initMajorVersionToSourceMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<Integer, Source> initMajorVersionToSourceMap() {
|
||||||
|
Map<Integer, Source> majorVersionToSource = new HashMap<>();
|
||||||
|
for (Target t : Target.values()) {
|
||||||
|
int major = t.majorVersion;
|
||||||
|
Source source = Source.lookup(t.name);
|
||||||
|
if (source != null) {
|
||||||
|
majorVersionToSource.put(major, source);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return majorVersionToSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Report usage of a preview feature. Usages reported through this method will affect the
|
||||||
|
* set of sourcefiles with dependencies on preview features.
|
||||||
|
* @param pos the position at which the preview feature was used.
|
||||||
|
* @param feature the preview feature used.
|
||||||
|
*/
|
||||||
|
public void warnPreview(int pos, Feature feature) {
|
||||||
|
warnPreview(new SimpleDiagnosticPosition(pos), feature);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Report usage of a preview feature. Usages reported through this method will affect the
|
||||||
|
* set of sourcefiles with dependencies on preview features.
|
||||||
|
* @param pos the position at which the preview feature was used.
|
||||||
|
* @param feature the preview feature used.
|
||||||
|
*/
|
||||||
|
public void warnPreview(DiagnosticPosition pos, Feature feature) {
|
||||||
|
Assert.check(isEnabled());
|
||||||
|
Assert.check(isPreview(feature));
|
||||||
|
if (!lint.isSuppressed(LintCategory.PREVIEW)) {
|
||||||
|
previewHandler.report(pos, feature.isPlural() ?
|
||||||
|
Warnings.PreviewFeatureUsePlural(feature.nameFragment()) :
|
||||||
|
Warnings.PreviewFeatureUse(feature.nameFragment()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Report usage of a preview feature in classfile.
|
||||||
|
* @param classfile the name of the classfile with preview features enabled
|
||||||
|
* @param majorVersion the major version found in the classfile.
|
||||||
|
*/
|
||||||
|
public void warnPreview(JavaFileObject classfile, int majorVersion) {
|
||||||
|
Assert.check(isEnabled());
|
||||||
|
if (!lint.isSuppressed(LintCategory.PREVIEW)) {
|
||||||
|
previewHandler.report(null,
|
||||||
|
Warnings.PreviewFeatureUseClassfile(classfile, majorVersionToSource.get(majorVersion).name));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Are preview features enabled?
|
||||||
|
* @return true, if preview features are enabled.
|
||||||
|
*/
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is given feature a preview feature?
|
||||||
|
* @param feature the feature to be tested.
|
||||||
|
* @return true, if given feature is a preview feature.
|
||||||
|
*/
|
||||||
|
public boolean isPreview(Feature feature) {
|
||||||
|
//Note: this is a backdoor which allows to optionally treat all features as 'preview' (for testing).
|
||||||
|
//When real preview features will be added, this method can be implemented to return 'true'
|
||||||
|
//for those selected features, and 'false' for all the others.
|
||||||
|
return forcePreview;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate an error key which captures the fact that a given preview feature could not be used
|
||||||
|
* due to the preview feature support being disabled.
|
||||||
|
* @param feature the feature for which the diagnostic has to be generated.
|
||||||
|
* @return the diagnostic.
|
||||||
|
*/
|
||||||
|
public Error disabledError(Feature feature) {
|
||||||
|
Assert.check(!isEnabled());
|
||||||
|
return feature.isPlural() ?
|
||||||
|
Errors.PreviewFeatureDisabledPlural(feature.nameFragment()) :
|
||||||
|
Errors.PreviewFeatureDisabled(feature.nameFragment());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate an error key which captures the fact that a preview classfile cannot be loaded
|
||||||
|
* due to the preview feature support being disabled.
|
||||||
|
* @param classfile the name of the classfile with preview features enabled
|
||||||
|
* @param majorVersion the major version found in the classfile.
|
||||||
|
*/
|
||||||
|
public Error disabledError(JavaFileObject classfile, int majorVersion) {
|
||||||
|
Assert.check(!isEnabled());
|
||||||
|
return Errors.PreviewFeatureDisabledClassfile(classfile, majorVersionToSource.get(majorVersion).name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Report any deferred diagnostics.
|
||||||
|
*/
|
||||||
|
public void reportDeferredDiagnostics() {
|
||||||
|
previewHandler.reportDeferredDiagnostic();
|
||||||
|
}
|
||||||
|
}
|
@ -217,6 +217,16 @@ public enum Source {
|
|||||||
source.compareTo(maxLevel) <= 0;
|
source.compareTo(maxLevel) <= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isPlural() {
|
||||||
|
Assert.checkNonNull(optKind);
|
||||||
|
return optKind == DiagKind.PLURAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Fragment nameFragment() {
|
||||||
|
Assert.checkNonNull(optFragment);
|
||||||
|
return optFragment;
|
||||||
|
}
|
||||||
|
|
||||||
public Fragment fragment(String sourceName) {
|
public Fragment fragment(String sourceName) {
|
||||||
Assert.checkNonNull(optFragment);
|
Assert.checkNonNull(optFragment);
|
||||||
return optKind == DiagKind.NORMAL ?
|
return optKind == DiagKind.NORMAL ?
|
||||||
|
@ -105,6 +105,8 @@ public class ClassFile {
|
|||||||
public final static int MAX_LOCALS = 0xffff;
|
public final static int MAX_LOCALS = 0xffff;
|
||||||
public final static int MAX_STACK = 0xffff;
|
public final static int MAX_STACK = 0xffff;
|
||||||
|
|
||||||
|
public final static int PREVIEW_MINOR_VERSION = 0xffff;
|
||||||
|
|
||||||
public enum Version {
|
public enum Version {
|
||||||
V45_3(45, 3), // base level for all attributes
|
V45_3(45, 3), // base level for all attributes
|
||||||
V49(49, 0), // JDK 1.5: enum, generics, annotations
|
V49(49, 0), // JDK 1.5: enum, generics, annotations
|
||||||
|
@ -148,6 +148,11 @@ public class ClassReader {
|
|||||||
|
|
||||||
DeferredCompletionFailureHandler dcfh;
|
DeferredCompletionFailureHandler dcfh;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Support for preview language features.
|
||||||
|
*/
|
||||||
|
Preview preview;
|
||||||
|
|
||||||
/** The current scope where type variables are entered.
|
/** The current scope where type variables are entered.
|
||||||
*/
|
*/
|
||||||
protected WriteableScope typevars;
|
protected WriteableScope typevars;
|
||||||
@ -270,6 +275,7 @@ public class ClassReader {
|
|||||||
verbose = options.isSet(Option.VERBOSE);
|
verbose = options.isSet(Option.VERBOSE);
|
||||||
|
|
||||||
Source source = Source.instance(context);
|
Source source = Source.instance(context);
|
||||||
|
preview = Preview.instance(context);
|
||||||
allowSimplifiedVarargs = Feature.SIMPLIFIED_VARARGS.allowedInSource(source);
|
allowSimplifiedVarargs = Feature.SIMPLIFIED_VARARGS.allowedInSource(source);
|
||||||
allowModules = Feature.MODULES.allowedInSource(source);
|
allowModules = Feature.MODULES.allowedInSource(source);
|
||||||
|
|
||||||
@ -2786,6 +2792,14 @@ public class ClassReader {
|
|||||||
Integer.toString(maxMinor));
|
Integer.toString(maxMinor));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (minorVersion == ClassFile.PREVIEW_MINOR_VERSION) {
|
||||||
|
if (!preview.isEnabled()) {
|
||||||
|
log.error(preview.disabledError(currentClassFile, majorVersion));
|
||||||
|
} else {
|
||||||
|
preview.warnPreview(c.classfile, majorVersion);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
indexPool();
|
indexPool();
|
||||||
if (signatureBuffer.length < bp) {
|
if (signatureBuffer.length < bp) {
|
||||||
int ns = Integer.highestOneBit(bp) << 1;
|
int ns = Integer.highestOneBit(bp) << 1;
|
||||||
|
@ -49,7 +49,6 @@ import com.sun.tools.javac.jvm.Pool.DynamicMethod;
|
|||||||
import com.sun.tools.javac.jvm.Pool.Method;
|
import com.sun.tools.javac.jvm.Pool.Method;
|
||||||
import com.sun.tools.javac.jvm.Pool.MethodHandle;
|
import com.sun.tools.javac.jvm.Pool.MethodHandle;
|
||||||
import com.sun.tools.javac.jvm.Pool.Variable;
|
import com.sun.tools.javac.jvm.Pool.Variable;
|
||||||
import com.sun.tools.javac.main.Option;
|
|
||||||
import com.sun.tools.javac.util.*;
|
import com.sun.tools.javac.util.*;
|
||||||
|
|
||||||
import static com.sun.tools.javac.code.Flags.*;
|
import static com.sun.tools.javac.code.Flags.*;
|
||||||
@ -89,6 +88,10 @@ public class ClassWriter extends ClassFile {
|
|||||||
*/
|
*/
|
||||||
private boolean debugstackmap;
|
private boolean debugstackmap;
|
||||||
|
|
||||||
|
/** Preview language level.
|
||||||
|
*/
|
||||||
|
private Preview preview;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Target class version.
|
* Target class version.
|
||||||
*/
|
*/
|
||||||
@ -178,6 +181,7 @@ public class ClassWriter extends ClassFile {
|
|||||||
log = Log.instance(context);
|
log = Log.instance(context);
|
||||||
names = Names.instance(context);
|
names = Names.instance(context);
|
||||||
options = Options.instance(context);
|
options = Options.instance(context);
|
||||||
|
preview = Preview.instance(context);
|
||||||
target = Target.instance(context);
|
target = Target.instance(context);
|
||||||
source = Source.instance(context);
|
source = Source.instance(context);
|
||||||
types = Types.instance(context);
|
types = Types.instance(context);
|
||||||
@ -1819,7 +1823,11 @@ public class ClassWriter extends ClassFile {
|
|||||||
acount += writeExtraClassAttributes(c);
|
acount += writeExtraClassAttributes(c);
|
||||||
|
|
||||||
poolbuf.appendInt(JAVA_MAGIC);
|
poolbuf.appendInt(JAVA_MAGIC);
|
||||||
poolbuf.appendChar(target.minorVersion);
|
if (preview.isEnabled()) {
|
||||||
|
poolbuf.appendChar(ClassFile.PREVIEW_MINOR_VERSION);
|
||||||
|
} else {
|
||||||
|
poolbuf.appendChar(target.minorVersion);
|
||||||
|
}
|
||||||
poolbuf.appendChar(target.majorVersion);
|
poolbuf.appendChar(target.majorVersion);
|
||||||
|
|
||||||
writePool(c.pool);
|
writePool(c.pool);
|
||||||
|
@ -536,6 +536,20 @@ public class Arguments {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (options.isSet(Option.PREVIEW)) {
|
||||||
|
if (sourceString == null) {
|
||||||
|
//enable-preview must be used with explicit -source or --release
|
||||||
|
error("err.preview.without.source.or.release");
|
||||||
|
return false;
|
||||||
|
} else if (source != Source.DEFAULT) {
|
||||||
|
//enable-preview must be used with latest source version
|
||||||
|
error("err.preview.not.latest",
|
||||||
|
sourceString,
|
||||||
|
Source.DEFAULT.name);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
String profileString = options.get(Option.PROFILE);
|
String profileString = options.get(Option.PROFILE);
|
||||||
if (profileString != null) {
|
if (profileString != null) {
|
||||||
Profile profile = Profile.lookup(profileString);
|
Profile profile = Profile.lookup(profileString);
|
||||||
|
@ -275,6 +275,10 @@ public class JavaCompiler {
|
|||||||
*/
|
*/
|
||||||
protected Source source;
|
protected Source source;
|
||||||
|
|
||||||
|
/** The preview language version.
|
||||||
|
*/
|
||||||
|
protected Preview preview;
|
||||||
|
|
||||||
/** The module for code generation.
|
/** The module for code generation.
|
||||||
*/
|
*/
|
||||||
protected Gen gen;
|
protected Gen gen;
|
||||||
@ -405,6 +409,7 @@ public class JavaCompiler {
|
|||||||
log.error(Errors.CantAccess(ex.sym, ex.getDetailValue()));
|
log.error(Errors.CantAccess(ex.sym, ex.getDetailValue()));
|
||||||
}
|
}
|
||||||
source = Source.instance(context);
|
source = Source.instance(context);
|
||||||
|
preview = Preview.instance(context);
|
||||||
attr = Attr.instance(context);
|
attr = Attr.instance(context);
|
||||||
analyzer = Analyzer.instance(context);
|
analyzer = Analyzer.instance(context);
|
||||||
chk = Check.instance(context);
|
chk = Check.instance(context);
|
||||||
@ -1725,6 +1730,7 @@ public class JavaCompiler {
|
|||||||
log.warning(Warnings.ProcUseProcOrImplicit);
|
log.warning(Warnings.ProcUseProcOrImplicit);
|
||||||
}
|
}
|
||||||
chk.reportDeferredDiagnostics();
|
chk.reportDeferredDiagnostics();
|
||||||
|
preview.reportDeferredDiagnostics();
|
||||||
if (log.compressedOutput) {
|
if (log.compressedOutput) {
|
||||||
log.mandatoryNote(null, Notes.CompressedDiags);
|
log.mandatoryNote(null, Notes.CompressedDiags);
|
||||||
}
|
}
|
||||||
|
@ -330,6 +330,8 @@ public enum Option {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
PREVIEW("--enable-preview", "opt.preview", STANDARD, BASIC),
|
||||||
|
|
||||||
PROFILE("-profile", "opt.arg.profile", "opt.profile", STANDARD, BASIC) {
|
PROFILE("-profile", "opt.arg.profile", "opt.profile", STANDARD, BASIC) {
|
||||||
@Override
|
@Override
|
||||||
public void process(OptionHelper helper, String option, String operand) throws InvalidValueException {
|
public void process(OptionHelper helper, String option, String operand) throws InvalidValueException {
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
package com.sun.tools.javac.parser;
|
package com.sun.tools.javac.parser;
|
||||||
|
|
||||||
|
import com.sun.tools.javac.code.Preview;
|
||||||
import com.sun.tools.javac.code.Source;
|
import com.sun.tools.javac.code.Source;
|
||||||
import com.sun.tools.javac.code.Source.Feature;
|
import com.sun.tools.javac.code.Source.Feature;
|
||||||
import com.sun.tools.javac.parser.Tokens.Comment.CommentStyle;
|
import com.sun.tools.javac.parser.Tokens.Comment.CommentStyle;
|
||||||
@ -53,6 +54,9 @@ public class JavaTokenizer {
|
|||||||
*/
|
*/
|
||||||
private Source source;
|
private Source source;
|
||||||
|
|
||||||
|
/** The preview language setting. */
|
||||||
|
private Preview preview;
|
||||||
|
|
||||||
/** The log to be used for error reporting.
|
/** The log to be used for error reporting.
|
||||||
*/
|
*/
|
||||||
private final Log log;
|
private final Log log;
|
||||||
@ -115,12 +119,20 @@ public class JavaTokenizer {
|
|||||||
this.log = fac.log;
|
this.log = fac.log;
|
||||||
this.tokens = fac.tokens;
|
this.tokens = fac.tokens;
|
||||||
this.source = fac.source;
|
this.source = fac.source;
|
||||||
|
this.preview = fac.preview;
|
||||||
this.reader = reader;
|
this.reader = reader;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkSourceLevel(int pos, Feature feature) {
|
protected void checkSourceLevel(int pos, Feature feature) {
|
||||||
if (!feature.allowedInSource(source)) {
|
if (preview.isPreview(feature) && !preview.isEnabled()) {
|
||||||
|
//preview feature without --preview flag, error
|
||||||
|
lexError(DiagnosticFlag.SOURCE_LEVEL, pos, preview.disabledError(feature));
|
||||||
|
} else if (!feature.allowedInSource(source)) {
|
||||||
|
//incompatible source level, error
|
||||||
lexError(DiagnosticFlag.SOURCE_LEVEL, pos, feature.error(source.name));
|
lexError(DiagnosticFlag.SOURCE_LEVEL, pos, feature.error(source.name));
|
||||||
|
} else if (preview.isPreview(feature)) {
|
||||||
|
//use of preview feature, warn
|
||||||
|
preview.warnPreview(pos, feature);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,6 +95,9 @@ public class JavacParser implements Parser {
|
|||||||
/** The Source language setting. */
|
/** The Source language setting. */
|
||||||
private Source source;
|
private Source source;
|
||||||
|
|
||||||
|
/** The Preview language setting. */
|
||||||
|
private Preview preview;
|
||||||
|
|
||||||
/** The name table. */
|
/** The name table. */
|
||||||
private Names names;
|
private Names names;
|
||||||
|
|
||||||
@ -169,6 +172,7 @@ public class JavacParser implements Parser {
|
|||||||
this.log = fac.log;
|
this.log = fac.log;
|
||||||
this.names = fac.names;
|
this.names = fac.names;
|
||||||
this.source = fac.source;
|
this.source = fac.source;
|
||||||
|
this.preview = fac.preview;
|
||||||
this.allowStringFolding = fac.options.getBoolean("allowStringFolding", true);
|
this.allowStringFolding = fac.options.getBoolean("allowStringFolding", true);
|
||||||
this.keepDocComments = keepDocComments;
|
this.keepDocComments = keepDocComments;
|
||||||
this.parseModuleInfo = parseModuleInfo;
|
this.parseModuleInfo = parseModuleInfo;
|
||||||
@ -4219,8 +4223,15 @@ public class JavacParser implements Parser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void checkSourceLevel(int pos, Feature feature) {
|
protected void checkSourceLevel(int pos, Feature feature) {
|
||||||
if (!feature.allowedInSource(source)) {
|
if (preview.isPreview(feature) && !preview.isEnabled()) {
|
||||||
|
//preview feature without --preview flag, error
|
||||||
|
log.error(DiagnosticFlag.SOURCE_LEVEL, pos, preview.disabledError(feature));
|
||||||
|
} else if (!feature.allowedInSource(source)) {
|
||||||
|
//incompatible source level, error
|
||||||
log.error(DiagnosticFlag.SOURCE_LEVEL, pos, feature.error(source.name));
|
log.error(DiagnosticFlag.SOURCE_LEVEL, pos, feature.error(source.name));
|
||||||
|
} else if (preview.isPreview(feature)) {
|
||||||
|
//use of preview feature, warn
|
||||||
|
preview.warnPreview(pos, feature);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,6 +27,7 @@ package com.sun.tools.javac.parser;
|
|||||||
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
|
import com.sun.tools.javac.code.Preview;
|
||||||
import com.sun.tools.javac.code.Source;
|
import com.sun.tools.javac.code.Source;
|
||||||
import com.sun.tools.javac.tree.DocTreeMaker;
|
import com.sun.tools.javac.tree.DocTreeMaker;
|
||||||
import com.sun.tools.javac.tree.TreeMaker;
|
import com.sun.tools.javac.tree.TreeMaker;
|
||||||
@ -62,6 +63,7 @@ public class ParserFactory {
|
|||||||
final Log log;
|
final Log log;
|
||||||
final Tokens tokens;
|
final Tokens tokens;
|
||||||
final Source source;
|
final Source source;
|
||||||
|
final Preview preview;
|
||||||
final Names names;
|
final Names names;
|
||||||
final Options options;
|
final Options options;
|
||||||
final ScannerFactory scannerFactory;
|
final ScannerFactory scannerFactory;
|
||||||
@ -76,6 +78,7 @@ public class ParserFactory {
|
|||||||
this.names = Names.instance(context);
|
this.names = Names.instance(context);
|
||||||
this.tokens = Tokens.instance(context);
|
this.tokens = Tokens.instance(context);
|
||||||
this.source = Source.instance(context);
|
this.source = Source.instance(context);
|
||||||
|
this.preview = Preview.instance(context);
|
||||||
this.options = Options.instance(context);
|
this.options = Options.instance(context);
|
||||||
this.scannerFactory = ScannerFactory.instance(context);
|
this.scannerFactory = ScannerFactory.instance(context);
|
||||||
this.locale = context.get(Locale.class);
|
this.locale = context.get(Locale.class);
|
||||||
|
@ -27,6 +27,7 @@ package com.sun.tools.javac.parser;
|
|||||||
|
|
||||||
import java.nio.CharBuffer;
|
import java.nio.CharBuffer;
|
||||||
|
|
||||||
|
import com.sun.tools.javac.code.Preview;
|
||||||
import com.sun.tools.javac.code.Source;
|
import com.sun.tools.javac.code.Source;
|
||||||
import com.sun.tools.javac.util.Context;
|
import com.sun.tools.javac.util.Context;
|
||||||
import com.sun.tools.javac.util.Log;
|
import com.sun.tools.javac.util.Log;
|
||||||
@ -56,6 +57,7 @@ public class ScannerFactory {
|
|||||||
final Log log;
|
final Log log;
|
||||||
final Names names;
|
final Names names;
|
||||||
final Source source;
|
final Source source;
|
||||||
|
final Preview preview;
|
||||||
final Tokens tokens;
|
final Tokens tokens;
|
||||||
|
|
||||||
/** Create a new scanner factory. */
|
/** Create a new scanner factory. */
|
||||||
@ -64,6 +66,7 @@ public class ScannerFactory {
|
|||||||
this.log = Log.instance(context);
|
this.log = Log.instance(context);
|
||||||
this.names = Names.instance(context);
|
this.names = Names.instance(context);
|
||||||
this.source = Source.instance(context);
|
this.source = Source.instance(context);
|
||||||
|
this.preview = Preview.instance(context);
|
||||||
this.tokens = Tokens.instance(context);
|
this.tokens = Tokens.instance(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1547,6 +1547,25 @@ compiler.note.unchecked.filename.additional=\
|
|||||||
compiler.note.unchecked.plural.additional=\
|
compiler.note.unchecked.plural.additional=\
|
||||||
Some input files additionally use unchecked or unsafe operations.
|
Some input files additionally use unchecked or unsafe operations.
|
||||||
|
|
||||||
|
# 0: file name
|
||||||
|
compiler.note.preview.filename=\
|
||||||
|
{0} uses preview language features.
|
||||||
|
|
||||||
|
compiler.note.preview.plural=\
|
||||||
|
Some input files use preview language features.
|
||||||
|
|
||||||
|
# The following string may appear after one of the above deprecation
|
||||||
|
# messages.
|
||||||
|
compiler.note.preview.recompile=\
|
||||||
|
Recompile with -Xlint:preview for details.
|
||||||
|
|
||||||
|
# 0: file name
|
||||||
|
compiler.note.preview.filename.additional=\
|
||||||
|
{0} has additional uses of preview language features.
|
||||||
|
|
||||||
|
compiler.note.preview.plural.additional=\
|
||||||
|
Some input files additionally use preview language features.
|
||||||
|
|
||||||
# Notes related to annotation processing
|
# Notes related to annotation processing
|
||||||
|
|
||||||
# Print a client-generated note; assumed to be localized, no translation required
|
# Print a client-generated note; assumed to be localized, no translation required
|
||||||
@ -2665,6 +2684,34 @@ compiler.misc.feature.not.supported.in.source.plural=\
|
|||||||
{0} are not supported in -source {1}\n\
|
{0} are not supported in -source {1}\n\
|
||||||
(use -source {2} or higher to enable {0})
|
(use -source {2} or higher to enable {0})
|
||||||
|
|
||||||
|
# 0: message segment (feature)
|
||||||
|
compiler.err.preview.feature.disabled=\
|
||||||
|
{0} is a preview feature and is disabled by default.\n\
|
||||||
|
(use --enable-preview to enable {0})
|
||||||
|
|
||||||
|
# 0: message segment (feature)
|
||||||
|
compiler.err.preview.feature.disabled.plural=\
|
||||||
|
{0} are a preview feature and are disabled by default.\n\
|
||||||
|
(use --enable-preview to enable {0})
|
||||||
|
|
||||||
|
# 0: file object (classfile), 1: string (expected version)
|
||||||
|
compiler.err.preview.feature.disabled.classfile=\
|
||||||
|
classfile for {0} uses preview features of Java SE {1}.\n\
|
||||||
|
(use --enable-preview to allow loading of classfiles which contain preview features)
|
||||||
|
|
||||||
|
# 0: message segment (feature)
|
||||||
|
compiler.warn.preview.feature.use=\
|
||||||
|
{0} is a preview feature and may be removed in a future release.
|
||||||
|
|
||||||
|
# 0: message segment (feature)
|
||||||
|
compiler.warn.preview.feature.use.plural=\
|
||||||
|
{0} are a preview feature and may be removed in a future release.
|
||||||
|
|
||||||
|
# 0: file object (classfile), 1: string (expected version)
|
||||||
|
compiler.warn.preview.feature.use.classfile=\
|
||||||
|
classfile for {0} uses preview features of Java SE {1}.
|
||||||
|
|
||||||
|
|
||||||
compiler.misc.feature.modules=\
|
compiler.misc.feature.modules=\
|
||||||
modules
|
modules
|
||||||
|
|
||||||
|
@ -252,6 +252,9 @@ javac.opt.Xlint.desc.unchecked=\
|
|||||||
javac.opt.Xlint.desc.varargs=\
|
javac.opt.Xlint.desc.varargs=\
|
||||||
Warn about potentially unsafe vararg methods
|
Warn about potentially unsafe vararg methods
|
||||||
|
|
||||||
|
javac.opt.Xlint.desc.preview=\
|
||||||
|
Warn about use of preview language features
|
||||||
|
|
||||||
javac.opt.Xdoclint=\
|
javac.opt.Xdoclint=\
|
||||||
Enable recommended checks for problems in javadoc comments
|
Enable recommended checks for problems in javadoc comments
|
||||||
# L10N: do not localize: all none
|
# L10N: do not localize: all none
|
||||||
@ -293,6 +296,8 @@ javac.opt.userpathsfirst=\
|
|||||||
Search classpath and sourcepath for classes before the bootclasspath instead of after
|
Search classpath and sourcepath for classes before the bootclasspath instead of after
|
||||||
javac.opt.prefer=\
|
javac.opt.prefer=\
|
||||||
Specify which file to read when both a source file and class file are found for an implicitly compiled class
|
Specify which file to read when both a source file and class file are found for an implicitly compiled class
|
||||||
|
javac.opt.preview=\
|
||||||
|
Enable preview language features. To be used in conjunction with either -source or --release.
|
||||||
javac.opt.AT=\
|
javac.opt.AT=\
|
||||||
Read options and filenames from file
|
Read options and filenames from file
|
||||||
javac.opt.diags=\
|
javac.opt.diags=\
|
||||||
@ -368,6 +373,11 @@ javac.warn.target.default.source.conflict=\
|
|||||||
target release {0} conflicts with default source release {1}
|
target release {0} conflicts with default source release {1}
|
||||||
javac.warn.profile.target.conflict=\
|
javac.warn.profile.target.conflict=\
|
||||||
profile {0} is not valid for target release {1}
|
profile {0} is not valid for target release {1}
|
||||||
|
javac.err.preview.not.latest=\
|
||||||
|
invalid source release {0} with --enable-preview\n\
|
||||||
|
(preview language features are only supported for release {1})
|
||||||
|
javac.err.preview.without.source.or.release=\
|
||||||
|
--enable-preview must be used with either -source or --release
|
||||||
javac.err.file.not.found=\
|
javac.err.file.not.found=\
|
||||||
file not found: {0}
|
file not found: {0}
|
||||||
javac.err.file.not.directory=\
|
javac.err.file.not.directory=\
|
||||||
|
@ -127,6 +127,8 @@ compiler.misc.bad.const.pool.entry # constant pool entry ha
|
|||||||
compiler.warn.access.to.member.from.serializable.lambda # in order to generate it we need to modify a restricted package
|
compiler.warn.access.to.member.from.serializable.lambda # in order to generate it we need to modify a restricted package
|
||||||
compiler.warn.invalid.path # this warning is generated only in Windows systems
|
compiler.warn.invalid.path # this warning is generated only in Windows systems
|
||||||
compiler.note.multiple.elements # needs user code
|
compiler.note.multiple.elements # needs user code
|
||||||
|
compiler.err.preview.feature.disabled.classfile # preview feature support: needs compilation against classfile
|
||||||
|
compiler.warn.preview.feature.use.classfile # preview feature support: needs compilation against classfile
|
||||||
|
|
||||||
# The following module-related messages will have to stay on the not-yet list for various reasons:
|
# The following module-related messages will have to stay on the not-yet list for various reasons:
|
||||||
compiler.warn.locn.unknown.file.on.module.path # Never issued ATM (short circuited with an if (false))
|
compiler.warn.locn.unknown.file.on.module.path # Never issued ATM (short circuited with an if (false))
|
||||||
|
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// key: compiler.err.preview.feature.disabled
|
||||||
|
// key: compiler.misc.feature.diamond
|
||||||
|
// options: -XDforcePreview
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
class PreviewFeatureDisabled {
|
||||||
|
void m() {
|
||||||
|
new ArrayList<>();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// key: compiler.err.preview.feature.disabled.plural
|
||||||
|
// key: compiler.misc.feature.lambda
|
||||||
|
// options: -XDforcePreview
|
||||||
|
|
||||||
|
class PreviewFeatureDisabledPlural {
|
||||||
|
void m() {
|
||||||
|
Runnable r = () -> {};
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
//key: compiler.warn.preview.feature.use
|
||||||
|
//key: compiler.warn.preview.feature.use.plural
|
||||||
|
//key: compiler.misc.feature.diamond
|
||||||
|
//key: compiler.misc.feature.lambda
|
||||||
|
//options: -Xlint:preview -XDforcePreview -source 11 --enable-preview
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
class PreviewFeatureUse {
|
||||||
|
void test() {
|
||||||
|
new ArrayList<>();
|
||||||
|
Runnable r = () -> {};
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// key: compiler.note.preview.filename
|
||||||
|
// key: compiler.note.preview.recompile
|
||||||
|
// options: -XDforcePreview -source 11 --enable-preview
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
class PreviewFilename {
|
||||||
|
List<String> ls = new ArrayList<>();
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// key: compiler.note.preview.filename.additional
|
||||||
|
// key: compiler.warn.preview.feature.use
|
||||||
|
// key: compiler.misc.feature.diamond
|
||||||
|
// options: -Xlint:preview -Xmaxwarns 1 -XDforcePreview -source 11 --enable-preview
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
class PreviewFilenameAdditional {
|
||||||
|
void test() {
|
||||||
|
new ArrayList<>();
|
||||||
|
new ArrayList<>();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Bar {
|
||||||
|
Runnable r = () -> {};
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// key: compiler.note.preview.plural
|
||||||
|
// key: compiler.note.preview.recompile
|
||||||
|
// options: -XDforcePreview -source 11 --enable-preview
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
class PreviewPlural {
|
||||||
|
void test() {
|
||||||
|
new Bar();
|
||||||
|
new ArrayList<>();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
class Bar {
|
||||||
|
Runnable r = () -> {};
|
||||||
|
void test() {
|
||||||
|
new ArrayList<>();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// key: compiler.note.preview.plural.additional
|
||||||
|
// key: compiler.warn.preview.feature.use.plural
|
||||||
|
// key: compiler.misc.feature.lambda
|
||||||
|
// options: -Xlint:preview -Xmaxwarns 1 -XDforcePreview -source 11 --enable-preview
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
class PreviewPlural {
|
||||||
|
void test() {
|
||||||
|
new Bar();
|
||||||
|
new ArrayList<>();
|
||||||
|
}
|
||||||
|
}
|
113
test/langtools/tools/javac/preview/PreviewOptionTest.java
Normal file
113
test/langtools/tools/javac/preview/PreviewOptionTest.java
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @test
|
||||||
|
* @bug 8199194
|
||||||
|
* @summary smoke test for enable-preview command line flag
|
||||||
|
* @modules jdk.compiler/com.sun.tools.javac.code
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import com.sun.tools.javac.code.Source;
|
||||||
|
|
||||||
|
public class PreviewOptionTest {
|
||||||
|
public static void main(String... args) throws Exception {
|
||||||
|
PreviewOptionTest t = new PreviewOptionTest();
|
||||||
|
t.run();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() throws Exception {
|
||||||
|
try (FileWriter out = new FileWriter("Test.java")) {
|
||||||
|
out.write("class Test { }");
|
||||||
|
}
|
||||||
|
|
||||||
|
testWithNoFlags();
|
||||||
|
|
||||||
|
List<Source> versionsToTest = Stream.of(Source.values())
|
||||||
|
.filter(s -> s.compareTo(Source.MIN) >= 0)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
versionsToTest.stream().forEach(this::testWithSourceFlag);
|
||||||
|
versionsToTest.stream().forEach(this::testWithReleaseFlag);
|
||||||
|
|
||||||
|
if (errors > 0)
|
||||||
|
throw new Exception(errors + " errors occurred");
|
||||||
|
}
|
||||||
|
|
||||||
|
void testWithNoFlags() {
|
||||||
|
testInternal(null, null, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void testWithSourceFlag(Source source) {
|
||||||
|
testInternal(source, null, source != Source.DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void testWithReleaseFlag(Source release) {
|
||||||
|
//Todo: the condition below should say "release != Source.DEFAULT", but we can't do that
|
||||||
|
//since --release 11 is not supported yet.
|
||||||
|
testInternal(null, release, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void testInternal(Source source, Source release, boolean shouldFail) {
|
||||||
|
System.err.println("Test: source:" + source + ", release:" + release + " " + shouldFail + " " + shouldFail);
|
||||||
|
List<String> args = new ArrayList<>();
|
||||||
|
args.add("--enable-preview");
|
||||||
|
if (source != null) {
|
||||||
|
args.add("-source");
|
||||||
|
args.add(source.name);
|
||||||
|
}
|
||||||
|
if (release != null) {
|
||||||
|
args.add("--release");
|
||||||
|
args.add(release.name);
|
||||||
|
}
|
||||||
|
args.add("Test.java");
|
||||||
|
|
||||||
|
StringWriter sw = new StringWriter();
|
||||||
|
PrintWriter pw = new PrintWriter(sw);
|
||||||
|
int rc = com.sun.tools.javac.Main.compile(args.toArray(new String[args.size()]), pw);
|
||||||
|
pw.close();
|
||||||
|
boolean hasErrors = rc != 0;
|
||||||
|
if (hasErrors != shouldFail) {
|
||||||
|
if (hasErrors) {
|
||||||
|
String out = sw.toString();
|
||||||
|
error("error not expected but found:\n" + out);
|
||||||
|
} else {
|
||||||
|
error("error expected but not found");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void error(String msg) {
|
||||||
|
System.err.println("error: " + msg);
|
||||||
|
errors++;
|
||||||
|
}
|
||||||
|
|
||||||
|
int errors;
|
||||||
|
}
|
28
test/langtools/tools/javac/preview/classReaderTest/Bar.java
Normal file
28
test/langtools/tools/javac/preview/classReaderTest/Bar.java
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class Bar {
|
||||||
|
Runnable r = () -> {};
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
/*
|
||||||
|
* @test /nodynamioccopyright/
|
||||||
|
* @bug 8199194
|
||||||
|
* @summary smoke test for --enabled-preview classreader support
|
||||||
|
* @compile -XDforcePreview --enable-preview -source 11 Bar.java
|
||||||
|
* @compile/fail/ref=Client.nopreview.out -Xlint:preview -XDrawDiagnostics Client.java
|
||||||
|
* @compile/fail/ref=Client.preview.out -Werror -Xlint:preview -XDrawDiagnostics --enable-preview -source 11 Client.java
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class Client {
|
||||||
|
void test() {
|
||||||
|
new Bar();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,2 @@
|
|||||||
|
- compiler.err.preview.feature.disabled.classfile: Bar.class, 11
|
||||||
|
1 error
|
@ -0,0 +1,4 @@
|
|||||||
|
- compiler.warn.preview.feature.use.classfile: Bar.class, 11
|
||||||
|
- compiler.err.warnings.and.werror
|
||||||
|
1 error
|
||||||
|
1 warning
|
Loading…
x
Reference in New Issue
Block a user