--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/ArgumentAttr.java Thu Apr 06 17:01:05 2017 +0000
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/ArgumentAttr.java Thu Apr 06 18:00:34 2017 +0000
@@ -105,7 +105,7 @@
private Env<AttrContext> env;
/** Result of method attribution. */
- private Type result;
+ Type result;
/** Cache for argument types; behavior is influences by the currrently selected cache policy. */
Map<UniquePos, ArgumentType<?>> argumentTypeCache = new LinkedHashMap<>();
@@ -215,13 +215,8 @@
processArg(that, () -> {
T speculativeTree = (T)deferredAttr.attribSpeculative(that, env, attr.new MethodAttrInfo() {
@Override
- protected void attr(JCTree tree, Env<AttrContext> env) {
- //avoid speculative attribution loops
- if (!new UniquePos(tree).equals(pos)) {
- super.attr(tree, env);
- } else {
- visitTree(tree);
- }
+ protected boolean needsArgumentAttr(JCTree tree) {
+ return !new UniquePos(tree).equals(pos);
}
});
return argumentTypeFactory.apply(speculativeTree);
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Thu Apr 06 17:01:05 2017 +0000
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Thu Apr 06 18:00:34 2017 +0000
@@ -505,9 +505,12 @@
this.checkMode = checkMode;
}
- protected void attr(JCTree tree, Env<AttrContext> env) {
- tree.accept(Attr.this);
- }
+ /**
+ * Should {@link Attr#attribTree} use the {@ArgumentAttr} visitor instead of this one?
+ * @param tree The tree to be type-checked.
+ * @return true if {@ArgumentAttr} should be used.
+ */
+ protected boolean needsArgumentAttr(JCTree tree) { return false; }
protected Type check(final DiagnosticPosition pos, final Type found) {
return chk.checkType(pos, found, pt, checkContext);
@@ -553,8 +556,8 @@
}
@Override
- protected void attr(JCTree tree, Env<AttrContext> env) {
- result = argumentAttr.attribArg(tree, env);
+ protected boolean needsArgumentAttr(JCTree tree) {
+ return true;
}
protected ResultInfo dup(Type newPt) {
@@ -644,7 +647,11 @@
try {
this.env = env;
this.resultInfo = resultInfo;
- resultInfo.attr(tree, env);
+ if (resultInfo.needsArgumentAttr(tree)) {
+ result = argumentAttr.attribArg(tree, env);
+ } else {
+ tree.accept(this);
+ }
if (tree == breakTree &&
resultInfo.checkContext.deferredAttrContext().mode == AttrMode.CHECK) {
throw new BreakAttr(copyEnv(env));
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java Thu Apr 06 17:01:05 2017 +0000
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java Thu Apr 06 18:00:34 2017 +0000
@@ -2107,10 +2107,32 @@
Name moduleName = tree.sym.name;
Assert.checkNonNull(moduleName);
if (lint.isEnabled(LintCategory.MODULE)) {
- String moduleNameString = moduleName.toString();
- int nameLength = moduleNameString.length();
- if (nameLength > 0 && Character.isDigit(moduleNameString.charAt(nameLength - 1))) {
- log.warning(Lint.LintCategory.MODULE, tree.qualId.pos(), Warnings.PoorChoiceForModuleName(moduleName));
+ JCExpression qualId = tree.qualId;
+ while (qualId != null) {
+ Name componentName;
+ DiagnosticPosition pos;
+ switch (qualId.getTag()) {
+ case SELECT:
+ JCFieldAccess selectNode = ((JCFieldAccess) qualId);
+ componentName = selectNode.name;
+ pos = selectNode.pos();
+ qualId = selectNode.selected;
+ break;
+ case IDENT:
+ componentName = ((JCIdent) qualId).name;
+ pos = qualId.pos();
+ qualId = null;
+ break;
+ default:
+ throw new AssertionError("Unexpected qualified identifier: " + qualId.toString());
+ }
+ if (componentName != null) {
+ String moduleNameComponentString = componentName.toString();
+ int nameLength = moduleNameComponentString.length();
+ if (nameLength > 0 && Character.isDigit(moduleNameComponentString.charAt(nameLength - 1))) {
+ log.warning(Lint.LintCategory.MODULE, pos, Warnings.PoorChoiceForModuleName(componentName));
+ }
+ }
}
}
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/JavacFileManager.java Thu Apr 06 17:01:05 2017 +0000
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/JavacFileManager.java Thu Apr 06 18:00:34 2017 +0000
@@ -473,10 +473,14 @@
}
} else {
if (isValidFile(fname, fileKinds)) {
- RelativeFile file = new RelativeFile(subdirectory, fname);
- JavaFileObject fe = PathFileObject.forDirectoryPath(JavacFileManager.this,
- file.resolveAgainst(directory), userPath, file);
- resultList.append(fe);
+ try {
+ RelativeFile file = new RelativeFile(subdirectory, fname);
+ JavaFileObject fe = PathFileObject.forDirectoryPath(JavacFileManager.this,
+ file.resolveAgainst(directory), userPath, file);
+ resultList.append(fe);
+ } catch (InvalidPathException e) {
+ throw new IOException("error accessing directory " + directory + e);
+ }
}
}
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties Thu Apr 06 17:01:05 2017 +0000
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties Thu Apr 06 18:00:34 2017 +0000
@@ -1537,7 +1537,7 @@
# 0: name
compiler.warn.poor.choice.for.module.name=\
- module name {0} should avoid terminal digits
+ module name component {0} should avoid terminal digits
# 0: string
compiler.warn.incubating.modules=\
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriterImpl.java Thu Apr 06 17:01:05 2017 +0000
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriterImpl.java Thu Apr 06 18:00:34 2017 +0000
@@ -169,11 +169,7 @@
*/
@Override
public void setSummaryColumnStyleAndScope(HtmlTree thTree) {
- if (foundNonPubConstructor) {
- thTree.addStyle(HtmlStyle.colSecond);
- } else {
- thTree.addStyle(HtmlStyle.colFirst);
- }
+ thTree.addStyle(HtmlStyle.colConstructorName);
thTree.addAttr(HtmlAttr.SCOPE, "row");
}
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Contents.java Thu Apr 06 17:01:05 2017 +0000
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Contents.java Thu Apr 06 18:00:34 2017 +0000
@@ -130,6 +130,7 @@
public final Content nextPackageLabel;
public final Content noFramesLabel;
public final Content noScriptMessage;
+ public final Content openModuleLabel;
public final Content overridesLabel;
public final Content overviewLabel;
public final Content packageHierarchies;
@@ -244,6 +245,7 @@
nextPackageLabel = getNonBreakContent("doclet.Next_Package");
noFramesLabel = getNonBreakContent("doclet.No_Frames");
noScriptMessage = getContent("doclet.No_Script_Message");
+ openModuleLabel = getContent("doclet.Open_Module");
overridesLabel = getContent("doclet.Overrides");
overviewLabel = getContent("doclet.Overview");
packageHierarchies = getContent("doclet.Package_Hierarchies");
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java Thu Apr 06 17:01:05 2017 +0000
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java Thu Apr 06 18:00:34 2017 +0000
@@ -98,19 +98,19 @@
= new TreeMap<>(utils.makeModuleComparator());
/**
- * Map of additional modules and modifiers, transitive closure, required by this module.
+ * Map of indirect modules and modifiers, transitive closure, required by this module.
*/
- private final Map<ModuleElement, Content> additionalModules
+ private final Map<ModuleElement, Content> indirectModules
= new TreeMap<>(utils.makeModuleComparator());
/**
- * Map of packages exported by this module and the modules it's been exported to.
+ * Map of packages exported by this module and the modules it has been exported to.
*/
private final Map<PackageElement, SortedSet<ModuleElement>> exportedPackages
= new TreeMap<>(utils.makePackageComparator());
/**
- * Map of opened packages by this module and the modules it's been opened to.
+ * Map of opened packages by this module and the modules it has been opened to.
*/
private final Map<PackageElement, SortedSet<ModuleElement>> openedPackages
= new TreeMap<>(utils.makePackageComparator());
@@ -121,15 +121,15 @@
private final SortedSet<PackageElement> concealedPackages = new TreeSet<>(utils.makePackageComparator());
/**
- * Map of additional modules (transitive closure) and its exported packages.
+ * Map of indirect modules (transitive closure) and their exported packages.
*/
- private final Map<ModuleElement, SortedSet<PackageElement>> additionalPackages
+ private final Map<ModuleElement, SortedSet<PackageElement>> indirectPackages
= new TreeMap<>(utils.makeModuleComparator());
/**
- * Map of additional modules (transitive closure) and its open packages.
+ * Map of indirect modules (transitive closure) and their open packages.
*/
- private final Map<ModuleElement, SortedSet<PackageElement>> additionalOpenPackages
+ private final Map<ModuleElement, SortedSet<PackageElement>> indirectOpenPackages
= new TreeMap<>(utils.makeModuleComparator());
/**
@@ -212,8 +212,10 @@
Content annotationContent = new HtmlTree(HtmlTag.P);
addAnnotationInfo(mdle, annotationContent);
div.addContent(annotationContent);
+ Content label = mdle.isOpen() && (configuration.docEnv.getModuleMode() == ModuleMode.ALL)
+ ? contents.openModuleLabel : contents.moduleLabel;
Content tHeading = HtmlTree.HEADING(HtmlConstants.TITLE_HEADING, true,
- HtmlStyle.title, contents.moduleLabel);
+ HtmlStyle.title, label);
tHeading.addContent(Contents.SPACE);
Content moduleHead = new RawHtml(heading);
tHeading.addContent(moduleHead);
@@ -264,12 +266,12 @@
CommentHelper ch = utils.getCommentHelper(mdle);
// Get module dependencies using the module's transitive closure.
Map<ModuleElement, String> dependentModules = utils.getDependentModules(mdle);
- // Add all dependent modules to additional modules set. We will remove the modules,
- // listed using the requires directive, from this set to come up with the table of additional
+ // Add all dependent modules to indirect modules set. We will remove the modules,
+ // listed using the requires directive, from this set to come up with the table of indirect
// required modules.
dependentModules.forEach((module, mod) -> {
if (shouldDocument(module)) {
- additionalModules.put(module, new StringContent(mod));
+ indirectModules.put(module, new StringContent(mod));
}
});
(ElementFilter.requiresIn(mdle.getDirectives())).forEach((directive) -> {
@@ -278,11 +280,11 @@
if (moduleMode == ModuleMode.ALL || directive.isTransitive()) {
requires.put(m, new StringContent(utils.getModifiers(directive)));
} else {
- // For api mode, just keep the public requires in dependentModules for display of
- // additional packages in the "Packages" section.
+ // For api mode, just keep the public requires in dependentModules for display of
+ // indirect packages in the "Packages" section.
dependentModules.remove(m);
- }
- additionalModules.remove(m);
+ }
+ indirectModules.remove(m);
}
});
@@ -320,7 +322,7 @@
mdleList.addAll(targetMdles);
}
// Qualified opens should not be displayed in the api mode. So if mdleList is empty,
- // it's opened to all modules and hence can be added.
+ // it is opened to all modules and hence can be added.
if (moduleMode == ModuleMode.ALL || mdleList.isEmpty()) {
openedPackages.put(p, mdleList);
}
@@ -331,7 +333,7 @@
concealedPackages.removeAll(exportedPackages.keySet());
concealedPackages.removeAll(openedPackages.keySet());
// Get all the exported and opened packages, for the transitive closure of the module, to be displayed in
- // the additional packages tables.
+ // the indirect packages tables.
dependentModules.forEach((module, mod) -> {
SortedSet<PackageElement> pkgList = new TreeSet<>(utils.makePackageComparator());
(ElementFilter.exportsIn(module.getDirectives())).forEach((directive) -> {
@@ -343,7 +345,7 @@
// If none of the transitive modules have exported packages to be displayed, we should not be
// displaying the table and so it should not be added to the map.
if (!pkgList.isEmpty()) {
- additionalPackages.put(module, pkgList);
+ indirectPackages.put(module, pkgList);
}
SortedSet<PackageElement> openPkgList = new TreeSet<>(utils.makePackageComparator());
(ElementFilter.opensIn(module.getDirectives())).forEach((directive) -> {
@@ -355,7 +357,7 @@
// If none of the transitive modules have opened packages to be displayed, we should not be
// displaying the table and so it should not be added to the map.
if (!openPkgList.isEmpty()) {
- additionalOpenPackages.put(module, openPkgList);
+ indirectOpenPackages.put(module, openPkgList);
}
});
// Get all the services listed as uses directive.
@@ -471,31 +473,31 @@
* {@inheritDoc}
*/
public void addModulesSummary(Content summaryContentTree) {
- if (display(requires) || display(additionalModules)) {
+ if (display(requires) || display(indirectModules)) {
HtmlTree li = new HtmlTree(HtmlTag.LI);
li.addStyle(HtmlStyle.blockList);
addSummaryHeader(HtmlConstants.START_OF_MODULES_SUMMARY, SectionName.MODULES,
contents.navModules, li);
if (display(requires)) {
- String text = configuration.getText("doclet.Requires_Summary");
- String tableSummary = configuration.getText("doclet.Member_Table_Summary",
- configuration.getText("doclet.Requires_Summary"),
- configuration.getText("doclet.modules"));
+ String text = configuration.getText("doclet.Requires_Summary");
+ String tableSummary = configuration.getText("doclet.Member_Table_Summary",
+ configuration.getText("doclet.Requires_Summary"),
+ configuration.getText("doclet.modules"));
Content table = getTableHeader(text, tableSummary, HtmlStyle.requiresSummary, requiresTableHeader);
Content tbody = new HtmlTree(HtmlTag.TBODY);
addModulesList(requires, tbody);
table.addContent(tbody);
li.addContent(table);
}
- // Display additional modules table in both "api" and "all" mode.
- if (display(additionalModules)) {
- String amrText = configuration.getText("doclet.Additional_Modules_Required_Summary");
+ // Display indirect modules table in both "api" and "all" mode.
+ if (display(indirectModules)) {
+ String amrText = configuration.getText("doclet.Indirect_Requires_Summary");
String amrTableSummary = configuration.getText("doclet.Member_Table_Summary",
- configuration.getText("doclet.Additional_Modules_Required_Summary"),
+ configuration.getText("doclet.Indirect_Requires_Summary"),
configuration.getText("doclet.modules"));
Content amrTable = getTableHeader(amrText, amrTableSummary, HtmlStyle.requiresSummary, requiresTableHeader);
Content amrTbody = new HtmlTree(HtmlTag.TBODY);
- addModulesList(additionalModules, amrTbody);
+ addModulesList(indirectModules, amrTbody);
amrTable.addContent(amrTbody);
li.addContent(amrTable);
}
@@ -530,7 +532,7 @@
public void addPackagesSummary(Content summaryContentTree) {
if (display(exportedPackages) || display(openedPackages) || display(concealedPackages)
- || display(additionalPackages) || display(additionalOpenPackages)) {
+ || display(indirectPackages) || display(indirectOpenPackages)) {
HtmlTree li = new HtmlTree(HtmlTag.LI);
li.addStyle(HtmlStyle.blockList);
addSummaryHeader(HtmlConstants.START_OF_PACKAGES_SUMMARY, SectionName.PACKAGES,
@@ -541,29 +543,29 @@
if (display(exportedPackages) || display(openedPackages) || display(concealedPackages)) {
addPackageSummary(tableSummary, li);
}
- if (display(additionalPackages)) {
- String aepText = configuration.getText("doclet.Additional_Exported_Packages_Summary");
- String aepTableSummary = configuration.getText("doclet.Additional_Packages_Table_Summary",
- configuration.getText("doclet.Additional_Exported_Packages_Summary"),
+ if (display(indirectPackages)) {
+ String aepText = configuration.getText("doclet.Indirect_Exports_Summary");
+ String aepTableSummary = configuration.getText("doclet.Indirect_Packages_Table_Summary",
+ configuration.getText("doclet.Indirect_Exports_Summary"),
configuration.getText("doclet.modules"),
configuration.getText("doclet.packages"));
Content aepTable = getTableHeader(aepText, aepTableSummary, HtmlStyle.packagesSummary,
- additionalPackagesTableHeader);
+ indirectPackagesTableHeader);
Content aepTbody = new HtmlTree(HtmlTag.TBODY);
- addAdditionalPackages(aepTbody, additionalPackages);
+ addIndirectPackages(aepTbody, indirectPackages);
aepTable.addContent(aepTbody);
li.addContent(aepTable);
}
- if (display(additionalOpenPackages)) {
- String aopText = configuration.getText("doclet.Additional_Opened_Packages_Summary");
- String aopTableSummary = configuration.getText("doclet.Additional_Packages_Table_Summary",
- configuration.getText("doclet.Additional_Opened_Packages_Summary"),
+ if (display(indirectOpenPackages)) {
+ String aopText = configuration.getText("doclet.Indirect_Opens_Summary");
+ String aopTableSummary = configuration.getText("doclet.Indirect_Packages_Table_Summary",
+ configuration.getText("doclet.Indirect_Opens_Summary"),
configuration.getText("doclet.modules"),
configuration.getText("doclet.packages"));
Content aopTable = getTableHeader(aopText, aopTableSummary, HtmlStyle.packagesSummary,
- additionalPackagesTableHeader);
+ indirectPackagesTableHeader);
Content aopTbody = new HtmlTree(HtmlTag.TBODY);
- addAdditionalPackages(aopTbody, additionalOpenPackages);
+ addIndirectPackages(aopTbody, indirectOpenPackages);
aopTable.addContent(aopTbody);
li.addContent(aopTable);
}
@@ -734,14 +736,14 @@
}
/**
- * Add the additional packages for the module being documented.
+ * Add the indirect packages for the module being documented.
*
* @param tbody the content tree to which the table will be added
- * @param ap additional packages to be added
+ * @param ip indirect packages to be added
*/
- public void addAdditionalPackages(Content tbody, Map<ModuleElement, SortedSet<PackageElement>> ap) {
+ public void addIndirectPackages(Content tbody, Map<ModuleElement, SortedSet<PackageElement>> ip) {
boolean altColor = true;
- for (Map.Entry<ModuleElement, SortedSet<PackageElement>> entry : ap.entrySet()) {
+ for (Map.Entry<ModuleElement, SortedSet<PackageElement>> entry : ip.entrySet()) {
ModuleElement m = entry.getKey();
SortedSet<PackageElement> pkgList = entry.getValue();
Content moduleLinkContent = getModuleLink(m, new StringContent(m.getQualifiedName()));
@@ -773,6 +775,19 @@
contents.navServices, li);
String text;
String tableSummary;
+ if (display(provides)) {
+ text = configuration.getText("doclet.Provides_Summary");
+ tableSummary = configuration.getText("doclet.Member_Table_Summary",
+ configuration.getText("doclet.Provides_Summary"),
+ configuration.getText("doclet.types"));
+ Content table = getTableHeader(text, tableSummary, HtmlStyle.providesSummary, providesTableHeader);
+ Content tbody = new HtmlTree(HtmlTag.TBODY);
+ addProvidesList(tbody);
+ if (!tbody.isEmpty()) {
+ table.addContent(tbody);
+ li.addContent(table);
+ }
+ }
if (display(uses)) {
text = configuration.getText("doclet.Uses_Summary");
tableSummary = configuration.getText("doclet.Member_Table_Summary",
@@ -784,19 +799,6 @@
if (!tbody.isEmpty()) {
table.addContent(tbody);
li.addContent(table);
- }
- }
- if (display(provides)) {
- text = configuration.getText("doclet.Provides_Summary");
- tableSummary = configuration.getText("doclet.Member_Table_Summary",
- configuration.getText("doclet.Provides_Summary"),
- configuration.getText("doclet.types"));
- Content table = getTableHeader(text, tableSummary, HtmlStyle.providesSummary, providesTableHeader);
- Content tbody = new HtmlTree(HtmlTag.TBODY);
- addProvidesList(tbody);
- if (!tbody.isEmpty()) {
- table.addContent(tbody);
- li.addContent(table);
}
}
HtmlTree ul = HtmlTree.UL(HtmlStyle.blockList, li);
@@ -975,12 +977,12 @@
? getHyperLink(SectionName.MODULE_DESCRIPTION, contents.navModuleDescription)
: contents.navModuleDescription);
addNavGap(liNav);
- liNav.addContent((display(requires) || display(additionalModules))
+ liNav.addContent((display(requires) || display(indirectModules))
? getHyperLink(SectionName.MODULES, contents.navModules)
: contents.navModules);
addNavGap(liNav);
liNav.addContent((display(exportedPackages) || display(openedPackages) || display(concealedPackages)
- || display(additionalPackages) || display(additionalOpenPackages))
+ || display(indirectPackages) || display(indirectOpenPackages))
? getHyperLink(SectionName.PACKAGES, contents.navPackages)
: contents.navPackages);
addNavGap(liNav);
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/TagletWriterImpl.java Thu Apr 06 17:01:05 2017 +0000
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/TagletWriterImpl.java Thu Apr 06 18:00:34 2017 +0000
@@ -106,7 +106,7 @@
String desc = ch.getText(itt.getDescription());
String anchorName = htmlWriter.getName(tagText);
- Content result = HtmlTree.A_ID(anchorName, new StringContent(tagText));
+ Content result = HtmlTree.A_ID(HtmlStyle.searchTagResult, anchorName, new StringContent(tagText));
if (configuration.createindex && !tagText.isEmpty()) {
SearchIndexItem si = new SearchIndexItem();
si.setLabel(tagText);
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java Thu Apr 06 17:01:05 2017 +0000
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java Thu Apr 06 18:00:34 2017 +0000
@@ -46,6 +46,7 @@
bottomNav,
circle,
classUseContainer,
+ colConstructorName,
colFirst,
colLast,
colSecond,
@@ -98,6 +99,7 @@
rightIframe,
rowColor,
searchTagLink,
+ searchTagResult,
seeLabel,
serializedFormContainer,
simpleTagLabel,
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlTree.java Thu Apr 06 17:01:05 2017 +0000
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlTree.java Thu Apr 06 18:00:34 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2017, 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
@@ -265,6 +265,21 @@
}
/**
+ * Generates an HTML anchor tag with a style class, id attribute and a body.
+ *
+ * @param styleClass stylesheet class for the tag
+ * @param id id for the anchor tag
+ * @param body body for the anchor tag
+ * @return an HtmlTree object
+ */
+ public static HtmlTree A_ID(HtmlStyle styleClass, String id, Content body) {
+ HtmlTree htmltree = A_ID(id, body);
+ if (styleClass != null)
+ htmltree.addStyle(styleClass);
+ return htmltree;
+ }
+
+ /**
* Generates a CAPTION tag with some content.
*
* @param body content for the tag
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlWriter.java Thu Apr 06 17:01:05 2017 +0000
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlWriter.java Thu Apr 06 18:00:34 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, 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
@@ -36,7 +36,6 @@
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
import jdk.javadoc.internal.doclets.toolkit.util.DocletConstants;
-import jdk.javadoc.internal.doclets.toolkit.util.ModulePackageTypes;
import jdk.javadoc.internal.doclets.toolkit.util.TableTabTypes;
@@ -88,7 +87,7 @@
/**
* Header for tables displaying modules and exported packages.
*/
- protected final List<String> additionalPackagesTableHeader;
+ protected final List<String> indirectPackagesTableHeader;
/**
* Header for tables displaying types and description.
@@ -136,18 +135,18 @@
packageTableHeader.add(resources.getText("doclet.Package"));
packageTableHeader.add(resources.getText("doclet.Description"));
requiresTableHeader = new ArrayList<>();
- requiresTableHeader.add(resources.getText("doclet.Modifier"));
+ requiresTableHeader.add(resources.getText("doclet.Modifier"));
requiresTableHeader.add(resources.getText("doclet.Module"));
requiresTableHeader.add(resources.getText("doclet.Description"));
exportedPackagesTableHeader = new ArrayList<>();
exportedPackagesTableHeader.add(resources.getText("doclet.Package"));
if (configuration.docEnv.getModuleMode() == ModuleMode.ALL) {
- exportedPackagesTableHeader.add(resources.getText("doclet.Module"));
+ exportedPackagesTableHeader.add(resources.getText("doclet.Module"));
}
exportedPackagesTableHeader.add(resources.getText("doclet.Description"));
- additionalPackagesTableHeader = new ArrayList<>();
- additionalPackagesTableHeader.add(resources.getText("doclet.Module"));
- additionalPackagesTableHeader.add(resources.getText("doclet.Packages"));
+ indirectPackagesTableHeader = new ArrayList<>();
+ indirectPackagesTableHeader.add(resources.getText("doclet.From"));
+ indirectPackagesTableHeader.add(resources.getText("doclet.Packages"));
usesTableHeader = new ArrayList<>();
usesTableHeader.add(resources.getText("doclet.Type"));
usesTableHeader.add(resources.getText("doclet.Description"));
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties Thu Apr 06 17:01:05 2017 +0000
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties Thu Apr 06 18:00:34 2017 +0000
@@ -6,6 +6,7 @@
doclet.Element=Element
doclet.Package=Package
doclet.Module=Module
+doclet.Open_Module=Open Module
doclet.All_Packages=All Packages
doclet.All_Modules=All Modules
doclet.None=None
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclet.xml Thu Apr 06 17:01:05 2017 +0000
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclet.xml Thu Apr 06 18:00:34 2017 +0000
@@ -1,7 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<!--
- Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ Copyright (c) 2003, 2017, 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
@@ -33,8 +33,8 @@
<ModuleDescription/>
<ModuleTags/>
<Summary>
+ <PackagesSummary/>
<ModulesSummary/>
- <PackagesSummary/>
<ServicesSummary/>
</Summary>
</Content>
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties Thu Apr 06 17:01:05 2017 +0000
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties Thu Apr 06 18:00:34 2017 +0000
@@ -86,12 +86,13 @@
doclet.javafx_tag_misuse=Tags @propertyGetter, @propertySetter and @propertyDescription can only be used in JavaFX properties getters and setters.
doclet.Package_Summary=Package Summary
doclet.Requires_Summary=Requires
-doclet.Additional_Modules_Required_Summary=Additional Modules Required
-doclet.Additional_Exported_Packages_Summary=Additional Exported Packages
-doclet.Additional_Opened_Packages_Summary=Additional Opened Packages
-doclet.Exported_Packages_Summary=Exported Packages
-doclet.Opened_Packages_Summary=Opened Packages
-doclet.Concealed_Packages_Summary=Concealed Packages
+doclet.Indirect_Requires_Summary=Indirect Requires
+doclet.Indirect_Exports_Summary=Indirect Exports
+doclet.Indirect_Opens_Summary=Indirect Opens
+doclet.Exported_Packages_Summary=Exports
+doclet.Opened_Packages_Summary=Opens
+doclet.Concealed_Packages_Summary=Concealed
+doclet.From=From
doclet.Packages_Summary=Packages
doclet.Uses_Summary=Uses
doclet.Provides_Summary=Provides
@@ -160,7 +161,7 @@
doclet.Method_Detail=Method Detail
doclet.Constructor_Detail=Constructor Detail
doclet.Deprecated=Deprecated.
-doclet.DeprecatedForRemoval=Deprecated, for removal: This API element is subject to removal in a future version.
+doclet.DeprecatedForRemoval=Deprecated, for removal: This API element is subject to removal in a future version.
doclet.Hidden=Hidden
doclet.Groupname_already_used=In -group option, groupname already used: {0}
doclet.value_tag_invalid_reference={0} (referenced by @value tag) is an unknown reference.
@@ -171,7 +172,7 @@
doclet.Use_Table_Summary=Use table, listing {0}, and an explanation
doclet.Constants_Table_Summary={0} table, listing constant fields, and values
doclet.Member_Table_Summary={0} table, listing {1}, and an explanation
-doclet.Additional_Packages_Table_Summary={0} table, listing {1}, and {2}
+doclet.Indirect_Packages_Table_Summary={0} table, listing {1}, and {2}
doclet.fields=fields
doclet.Fields=Fields
doclet.properties=properties
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css Thu Apr 06 17:01:05 2017 +0000
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css Thu Apr 06 18:00:34 2017 +0000
@@ -42,15 +42,14 @@
text-decoration:none;
color:#353833;
}
-a[name]:before, a[name]:target {
+a[name]:before, a[name]:target, a[id]:before, a[id]:target {
content:"";
- display:block;
- height:120px;
- margin:-120px 0 0;
-}
-a[id]:before, a[id]:target {
+ display:inline-block;
+ position:relative;
padding-top:129px;
margin-top:-129px;
+}
+.searchTagResult:before, .searchTagResult:target {
color:red;
}
pre {
@@ -540,14 +539,14 @@
text-align:left;
padding:0px 0px 12px 10px;
}
-th.colFirst, th.colSecond, th.colLast, .useSummary th, .constantsSummary th, .packagesSummary th,
+th.colFirst, th.colSecond, th.colLast, th.colConstructorName, .useSummary th, .constantsSummary th, .packagesSummary th,
td.colFirst, td.colSecond, td.colLast, .useSummary td, .constantsSummary td {
vertical-align:top;
padding-right:0px;
padding-top:8px;
padding-bottom:3px;
}
-th.colFirst, th.colSecond, th.colLast, .constantsSummary th, .packagesSummary th {
+th.colFirst, th.colSecond, th.colLast, th.colConstructorName, .constantsSummary th, .packagesSummary th {
background:#dee3e9;
text-align:left;
padding:8px 3px 3px 7px;
@@ -556,7 +555,7 @@
white-space:nowrap;
font-size:13px;
}
-td.colSecond, th.colSecond, td.colLast, th.colLast {
+td.colSecond, th.colSecond, td.colLast, th.colConstructorName, th.colLast {
font-size:13px;
}
.constantsSummary th, .packagesSummary th {
@@ -573,8 +572,8 @@
.usesSummary td.colFirst, .usesSummary th.colFirst,
.providesSummary td.colFirst, .providesSummary th.colFirst,
.memberSummary td.colFirst, .memberSummary th.colFirst,
-.memberSummary td.colSecond, .memberSummary th.colSecond,
-.typeSummary td.colFirst{
+.memberSummary td.colSecond, .memberSummary th.colSecond, .memberSummary th.colConstructorName,
+.typeSummary td.colFirst {
vertical-align:top;
}
.packagesSummary th.colLast, .packagesSummary td.colLast {
@@ -584,6 +583,8 @@
td.colSecond a:link, td.colSecond a:active, td.colSecond a:visited, td.colSecond a:hover,
th.colFirst a:link, th.colFirst a:active, th.colFirst a:visited, th.colFirst a:hover,
th.colSecond a:link, th.colSecond a:active, th.colSecond a:visited, th.colSecond a:hover,
+th.colConstructorName a:link, th.colConstructorName a:active, th.colConstructorName a:visited,
+th.colConstructorName a:hover,
td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover,
.constantValuesContainer td a:link, .constantValuesContainer td a:active,
.constantValuesContainer td a:visited, .constantValuesContainer td a:hover {
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/JavaScriptScanner.java Thu Apr 06 17:01:05 2017 +0000
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/JavaScriptScanner.java Thu Apr 06 18:00:34 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -95,7 +95,7 @@
case "datasrc": case "for": case "href": case "longdesc": case "profile":
case "src": case "usemap":
List<? extends DocTree> value = tree.getValue();
- if (!value.isEmpty() && value.get(0).getKind() == Kind.TEXT) {
+ if (value != null && !value.isEmpty() && value.get(0).getKind() == Kind.TEXT) {
String v = value.get(0).toString().trim().toLowerCase(Locale.ENGLISH);
if (v.startsWith("javascript:")) {
f.accept(getCurrentPath());
--- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java Thu Apr 06 17:01:05 2017 +0000
+++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java Thu Apr 06 18:00:34 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2017, 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
@@ -1440,7 +1440,7 @@
: c.command) + " ")
.toArray(String[]::new))
.completionSuggestions(code, cursor, anchor);
- } else if (code.startsWith("/se")) {
+ } else if (code.startsWith("/se") || code.startsWith("se")) {
result = new FixedCompletionProvider(SET_SUBCOMMANDS)
.completionSuggestions(code.substring(pastSpace), cursor - pastSpace, anchor);
} else {
--- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties Thu Apr 06 17:01:05 2017 +0000
+++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties Thu Apr 06 18:00:34 2017 +0000
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2016, 2017, 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
@@ -500,11 +500,11 @@
Shift-<tab> v\n\t\t\
After a complete expression, hold down <shift> while pressing <tab>,\n\t\t\
then release and press "v", the expression will be converted to\n\t\t\
- a variable declaration whose type is based on the type of the expression.\n\t\t\
+ a variable declaration whose type is based on the type of the expression.\n\n\
Shift-<tab> i\n\t\t\
After an unresolvable identifier, hold down <shift> while pressing <tab>,\n\t\t\
then release and press "i", and jshell will propose possible imports\n\t\t\
- which will resolve the identifier based on the content of the specified classpath.\n\t\t\
+ which will resolve the identifier based on the content of the specified classpath.
help.context.summary = the evaluation context options for /env /reload and /reset
help.context =\
@@ -928,5 +928,5 @@
/set format silent display '' \n
jshell.fix.wrong.shortcut =\
-Invalid <fix> character. Use "i" for auto-import or "v" for variable creation. For more information see:\n\
+Unexpected character after Shift-Tab. Use "i" for auto-import or "v" for variable creation. For more information see:\n\
/help shortcuts
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/jdk/javadoc/doclet/testBadHtml/TestBadHtml.java Thu Apr 06 18:00:34 2017 +0000
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2017, 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 8176901
+ * @summary The doclet should cope with bad HTML form
+ * @library ../lib
+ * @modules jdk.javadoc/jdk.javadoc.internal.tool
+ * @build JavadocTester
+ * @run main TestBadHtml
+ */
+
+public class TestBadHtml extends JavadocTester {
+
+ public static void main(String... args) throws Exception {
+ TestBadHtml tester = new TestBadHtml();
+ tester.runTests();
+ }
+
+ @Test
+ void testNegative() {
+ javadoc("-d", "out1",
+ "-sourcepath", testSrc,
+ "pkg1");
+
+ checkExit(Exit.ERROR);
+
+ checkOutput(Output.STDERR, false, "NullPointerException");
+ checkOutput(Output.OUT, false, "NullPointerException");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/jdk/javadoc/doclet/testBadHtml/pkg1/A.java Thu Apr 06 18:00:34 2017 +0000
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2017, 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.
+ */
+
+package pkg1;
+
+/**
+ * The first sentence.
+ * <parameters the word action is crucial here object>
+ * <parameters the word cite is crucial here object>
+ * <parameters the word classid is crucial here object>
+ * <parameters the word codebase is crucial here object>
+ * <parameters the word data is crucial here object>
+ * <parameters the word datasrc is crucial here object>
+ * <parameters the word for is crucial here object>
+ * <parameters the word href is crucial here object>
+ * <parameters the word longdesc is crucial here object>
+ * <parameters the word profile is crucial here object>
+ * <parameters the word src is crucial here object>
+ * <parameters the word usemap is crucial here object>
+ */
+
+public class A {}
--- a/langtools/test/jdk/javadoc/doclet/testDeprecatedDocs/TestDeprecatedDocs.java Thu Apr 06 17:01:05 2017 +0000
+++ b/langtools/test/jdk/javadoc/doclet/testDeprecatedDocs/TestDeprecatedDocs.java Thu Apr 06 18:00:34 2017 +0000
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 4927552 8026567 8071982 8162674 8175200
+ * @bug 4927552 8026567 8071982 8162674 8175200 8175218
* @summary <DESC>
* @author jamieh
* @library ../lib
@@ -81,16 +81,16 @@
+ "extends java.lang.Object</pre>",
"<pre>@Deprecated(forRemoval=true)\n"
+ "public int field</pre>\n"
- + "<div class=\"block\"><span class=\"deprecatedLabel\">Deprecated, for removal: This API element is subject to removal in a future version. </span> </div>",
+ + "<div class=\"block\"><span class=\"deprecatedLabel\">Deprecated, for removal: This API element is subject to removal in a future version.</span> </div>",
"<pre>@Deprecated(forRemoval=true)\n"
+ "public DeprecatedClassByAnnotation​()</pre>\n"
- + "<div class=\"block\"><span class=\"deprecatedLabel\">Deprecated, for removal: This API element is subject to removal in a future version. </span> </div>",
+ + "<div class=\"block\"><span class=\"deprecatedLabel\">Deprecated, for removal: This API element is subject to removal in a future version.</span> </div>",
"<pre>@Deprecated\n"
+ "public void method​()</pre>\n"
+ "<div class=\"block\"><span class=\"deprecatedLabel\">Deprecated.</span> </div>");
checkOutput("pkg/TestAnnotationType.html", true,
- "<div class=\"block\"><span class=\"deprecatedLabel\">Deprecated, for removal: This API element is subject to removal in a future version. </span> \n"
+ "<div class=\"block\"><span class=\"deprecatedLabel\">Deprecated, for removal: This API element is subject to removal in a future version.</span> \n"
+ "<div class=\"block\"><span class=\"deprecationComment\">annotation_test1 passes.</span></div>\n"
+ "</div>\n"
+ "<br>\n"
@@ -100,16 +100,16 @@
"<pre>@Deprecated(forRemoval=true)\n"
+ "static final int field</pre>\n"
+ "<div class=\"block\"><span class=\"deprecatedLabel\">Deprecated, for removal: This "
- + "API element is subject to removal in a future version. </span> <span class=\"deprecationComment\">annotation_test4 passes.</span></div>",
+ + "API element is subject to removal in a future version.</span> <span class=\"deprecationComment\">annotation_test4 passes.</span></div>",
"<pre>@Deprecated(forRemoval=true)\n"
+ "int required</pre>\n"
- + "<div class=\"block\"><span class=\"deprecatedLabel\">Deprecated, for removal: This API element is subject to removal in a future version. </span> "
+ + "<div class=\"block\"><span class=\"deprecatedLabel\">Deprecated, for removal: This API element is subject to removal in a future version.</span> "
+ "<span class=\"deprecationComment\">annotation_test3 passes.</span></div>",
"<pre>java.lang.String optional</pre>\n"
+ "<div class=\"block\"><span class=\"deprecatedLabel\">Deprecated.</span> <span class=\"deprecationComment\">annotation_test2 passes.</span></div>");
checkOutput("pkg/TestClass.html", true,
- "<div class=\"block\"><span class=\"deprecatedLabel\">Deprecated, for removal: This API element is subject to removal in a future version. </span> \n"
+ "<div class=\"block\"><span class=\"deprecatedLabel\">Deprecated, for removal: This API element is subject to removal in a future version.</span> \n"
+ "<div class=\"block\"><span class=\"deprecationComment\">class_test1 passes.</span></div>\n"
+ "</div>\n"
+ "<br>\n"
@@ -118,11 +118,11 @@
+ "extends java.lang.Object</pre>",
"<pre>@Deprecated(forRemoval=true)\n"
+ "public TestClass​()</pre>\n"
- + "<div class=\"block\"><span class=\"deprecatedLabel\">Deprecated, for removal: This API element is subject to removal in a future version. </span> "
+ + "<div class=\"block\"><span class=\"deprecatedLabel\">Deprecated, for removal: This API element is subject to removal in a future version.</span> "
+ "<span class=\"deprecationComment\">class_test3 passes.</span></div>");
checkOutput("pkg/TestEnum.html", true,
- "<div class=\"block\"><span class=\"deprecatedLabel\">Deprecated, for removal: This API element is subject to removal in a future version. </span> \n"
+ "<div class=\"block\"><span class=\"deprecatedLabel\">Deprecated, for removal: This API element is subject to removal in a future version.</span> \n"
+ "<div class=\"block\"><span class=\"deprecationComment\">enum_test1 passes.</span></div>\n"
+ "</div>\n"
+ "<br>\n"
@@ -131,11 +131,11 @@
+ "extends java.lang.Enum<<a href=\"../pkg/TestEnum.html\" title=\"enum in pkg\">TestEnum</a>></pre>",
"<pre>@Deprecated(forRemoval=true)\n"
+ "public static final <a href=\"../pkg/TestEnum.html\" title=\"enum in pkg\">TestEnum</a> FOR_REMOVAL</pre>\n"
- + "<div class=\"block\"><span class=\"deprecatedLabel\">Deprecated, for removal: This API element is subject to removal in a future version. </span> "
+ + "<div class=\"block\"><span class=\"deprecatedLabel\">Deprecated, for removal: This API element is subject to removal in a future version.</span> "
+ "<span class=\"deprecationComment\">enum_test3 passes.</span></div>");
checkOutput("pkg/TestError.html", true,
- "<div class=\"block\"><span class=\"deprecatedLabel\">Deprecated, for removal: This API element is subject to removal in a future version. </span> \n"
+ "<div class=\"block\"><span class=\"deprecatedLabel\">Deprecated, for removal: This API element is subject to removal in a future version.</span> \n"
+ "<div class=\"block\"><span class=\"deprecationComment\">error_test1 passes.</span></div>\n"
+ "</div>\n"
+ "<br>\n"
@@ -144,7 +144,7 @@
+ "extends java.lang.Error</pre>");
checkOutput("pkg/TestException.html", true,
- "<div class=\"block\"><span class=\"deprecatedLabel\">Deprecated, for removal: This API element is subject to removal in a future version. </span> \n"
+ "<div class=\"block\"><span class=\"deprecatedLabel\">Deprecated, for removal: This API element is subject to removal in a future version.</span> \n"
+ "<div class=\"block\"><span class=\"deprecationComment\">exception_test1 passes.</span></div>\n"
+ "</div>\n"
+ "<br>\n"
@@ -153,7 +153,7 @@
+ "extends java.lang.Exception</pre>");
checkOutput("pkg/TestInterface.html", true,
- "<div class=\"block\"><span class=\"deprecatedLabel\">Deprecated, for removal: This API element is subject to removal in a future version. </span> \n"
+ "<div class=\"block\"><span class=\"deprecatedLabel\">Deprecated, for removal: This API element is subject to removal in a future version.</span> \n"
+ "<div class=\"block\"><span class=\"deprecationComment\">interface_test1 passes.</span></div>\n"
+ "</div>\n"
+ "<br>\n"
--- a/langtools/test/jdk/javadoc/doclet/testMemberSummary/TestMemberSummary.java Thu Apr 06 17:01:05 2017 +0000
+++ b/langtools/test/jdk/javadoc/doclet/testMemberSummary/TestMemberSummary.java Thu Apr 06 18:00:34 2017 +0000
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 4951228 6290760 8025633 8026567 8081854 8162363 8175200
+ * @bug 4951228 6290760 8025633 8026567 8081854 8162363 8175200 8177417
* @summary Test the case where the overriden method returns a different
* type than the method in the child class. Make sure the
* documentation is inherited but the return type isn't.
@@ -43,7 +43,7 @@
@Test
void test() {
- javadoc("-d", "out",
+ javadoc("-d", "out", "-private",
"-sourcepath", testSrc,
"pkg","pkg2");
checkExit(Exit.OK);
@@ -55,7 +55,15 @@
+ "returnTypeTest</a></span>​()</code>",
// Check return type in member detail.
"<pre>public <a href=\"../pkg/PublicChild.html\" title=\"class in pkg\">"
- + "PublicChild</a> returnTypeTest​()</pre>");
+ + "PublicChild</a> returnTypeTest​()</pre>",
+ "<th class=\"colConstructorName\" scope=\"row\"><code><span class=\"memberNameLink\">"
+ + "<a href=\"../pkg/PublicChild.html#PublicChild--\">PublicChild</a></span>​()</code></th>");
+
+ checkOutput("pkg/PrivateParent.html", true,
+ "<td class=\"colFirst\"><code>private </code></td>\n"
+ + "<th class=\"colConstructorName\" scope=\"row\"><code><span class=\"memberNameLink\">"
+ + "<a href=\"../pkg/PrivateParent.html#PrivateParent-int-\">PrivateParent</a></span>​(int i)</code>"
+ + "</th>");
// Legacy anchor dimensions (6290760)
checkOutput("pkg2/A.html", true,
--- a/langtools/test/jdk/javadoc/doclet/testMemberSummary/pkg/PrivateParent.java Thu Apr 06 17:01:05 2017 +0000
+++ b/langtools/test/jdk/javadoc/doclet/testMemberSummary/pkg/PrivateParent.java Thu Apr 06 18:00:34 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2017, 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
@@ -24,6 +24,12 @@
package pkg;
class PrivateParent {
+ /**
+ * Test private constructor.
+ * @param i a test parameter.
+ */
+ private PrivateParent(int i) {
+ }
/**
* Test to make sure the member summary inherits documentation
--- a/langtools/test/jdk/javadoc/doclet/testModules/TestModules.java Thu Apr 06 17:01:05 2017 +0000
+++ b/langtools/test/jdk/javadoc/doclet/testModules/TestModules.java Thu Apr 06 18:00:34 2017 +0000
@@ -24,7 +24,7 @@
/*
* @test
* @bug 8154119 8154262 8156077 8157987 8154261 8154817 8135291 8155995 8162363
- * 8168766 8168688 8162674 8160196 8175799 8174974 8176778
+ * 8168766 8168688 8162674 8160196 8175799 8174974 8176778 8177562 8175218
* @summary Test modules support in javadoc.
* @author bpatel
* @library ../lib
@@ -277,14 +277,14 @@
+ "<!-- -->\n"
+ "</a>\n"
+ "<div class=\"block\">This is a test description for the moduleA module. Search "
- + "phrase <a id=\"searchphrase\">search phrase</a>.</div>");
+ + "phrase <a id=\"searchphrase\" class=\"searchTagResult\">search phrase</a>.</div>");
checkOutput("moduleB-summary.html", found,
"<!-- ============ MODULE DESCRIPTION =========== -->\n"
+ "<a name=\"module.description\">\n"
+ "<!-- -->\n"
+ "</a>\n"
+ "<div class=\"block\">This is a test description for the moduleB module. Search "
- + "word <a id=\"search_word\">search_word</a> with no description.</div>");
+ + "word <a id=\"search_word\" class=\"searchTagResult\">search_word</a> with no description.</div>");
checkOutput("overview-summary.html", found,
"</script>\n"
+ "<div class=\"contentContainer\">\n"
@@ -311,7 +311,7 @@
+ "<li class=\"blockList\">\n"
+ "<ul class=\"blockList\">\n"
+ "<li class=\"blockList\">\n"
- + "<!-- ============ MODULES SUMMARY =========== -->");
+ + "<!-- ============ PACKAGES SUMMARY =========== -->");
checkOutput("moduleB-summary.html", found,
"<div class=\"contentContainer\">\n"
+ "<ul class=\"blockList\">\n"
@@ -325,7 +325,7 @@
checkOutput("moduleA-summary.html", found,
"<section role=\"region\">\n"
+ "<div class=\"deprecatedContent\"><span class=\"deprecatedLabel\">Deprecated, for removal:"
- + " This API element is subject to removal in a future version. </span>\n"
+ + " This API element is subject to removal in a future version.</span>\n"
+ "<div class=\"block\"><span class=\"deprecationComment\">This module is deprecated.</span></div>\n"
+ "</div>\n"
+ "<!-- ============ MODULE DESCRIPTION =========== -->\n"
@@ -333,7 +333,7 @@
+ "<!-- -->\n"
+ "</a>\n"
+ "<div class=\"block\">This is a test description for the moduleA module. Search "
- + "phrase <a id=\"searchphrase\">search phrase</a>.</div>");
+ + "phrase <a id=\"searchphrase\" class=\"searchTagResult\">search phrase</a>.</div>");
checkOutput("moduleB-summary.html", found,
"<section role=\"region\">\n"
+ "<!-- ============ MODULE DESCRIPTION =========== -->\n"
@@ -341,7 +341,7 @@
+ "<!-- -->\n"
+ "</a>\n"
+ "<div class=\"block\">This is a test description for the moduleB module. Search "
- + "word <a id=\"search_word\">search_word</a> with no description.</div>");
+ + "word <a id=\"search_word\" class=\"searchTagResult\">search_word</a> with no description.</div>");
checkOutput("overview-summary.html", found,
"</nav>\n"
+ "</header>\n"
@@ -372,7 +372,7 @@
+ "<li class=\"blockList\">\n"
+ "<ul class=\"blockList\">\n"
+ "<li class=\"blockList\">\n"
- + "<!-- ============ MODULES SUMMARY =========== -->");
+ + "<!-- ============ PACKAGES SUMMARY =========== -->");
checkOutput("moduleB-summary.html", found,
"<div class=\"contentContainer\">\n"
+ "<ul class=\"blockList\">\n"
@@ -595,7 +595,7 @@
+ "<th class=\"colFirst\" scope=\"row\"><a href=\"testpkg2mdlB/TestInterface2InModuleB.html\" title=\"interface in testpkg2mdlB\">TestInterface2InModuleB</a></th>\n"
+ "<td class=\"colLast\"> </td>\n"
+ "</tr>",
- "<caption><span>Opened Packages</span><span class=\"tabEnd\"> </span></caption>\n"
+ "<caption><span>Opens</span><span class=\"tabEnd\"> </span></caption>\n"
+ "<tr>\n"
+ "<th class=\"colFirst\" scope=\"col\">Package</th>\n"
+ "<th class=\"colLast\" scope=\"col\">Description</th>\n"
@@ -618,7 +618,7 @@
+ "<h1 title=\"Module\" class=\"title\">Module moduleT</h1>\n"
+ "</div>",
"<div class=\"block\">This is a test description for the moduleT module. "
- + "Search phrase <a id=\"searchphrase\">search phrase</a>. "
+ + "Search phrase <a id=\"searchphrase\" class=\"searchTagResult\">search phrase</a>. "
+ "Make sure there are no exported packages.</div>",
"<tbody>\n"
+ "<tr class=\"altColor\">\n"
@@ -730,17 +730,12 @@
checkOutput("moduleA-summary.html", true,
"<li><a href=\"#module.description\">Description</a> | <a href=\"#modules.summary\">"
+ "Modules</a> | <a href=\"#packages.summary\">Packages</a> | Services</li>",
- "<td class=\"colFirst\">transitive</td>\n"
- + "<th class=\"colSecond\" scope=\"row\"><a href=\"moduleB-summary.html\">moduleB</a></th>\n"
- + "<td class=\"colLast\">\n"
- + "<div class=\"block\">This is a test description for the moduleB module.</div>\n"
- + "</td>",
- "<table class=\"packagesSummary\" summary=\"Additional Exported Packages table, listing modules, and packages\">\n"
- + "<caption><span>Additional Exported Packages</span><span class=\"tabEnd\"> </span></caption>",
- "<table class=\"packagesSummary\" summary=\"Additional Opened Packages table, listing modules, and packages\">\n"
- + "<caption><span>Additional Opened Packages</span><span class=\"tabEnd\"> </span></caption>\n"
+ "<table class=\"packagesSummary\" summary=\"Indirect Exports table, listing modules, and packages\">\n"
+ + "<caption><span>Indirect Exports</span><span class=\"tabEnd\"> </span></caption>",
+ "<table class=\"packagesSummary\" summary=\"Indirect Opens table, listing modules, and packages\">\n"
+ + "<caption><span>Indirect Opens</span><span class=\"tabEnd\"> </span></caption>\n"
+ "<tr>\n"
- + "<th class=\"colFirst\" scope=\"col\">Module</th>\n"
+ + "<th class=\"colFirst\" scope=\"col\">From</th>\n"
+ "<th class=\"colLast\" scope=\"col\">Packages</th>\n"
+ "</tr>\n",
"<th class=\"colFirst\" scope=\"row\"><a href=\"moduleB-summary.html\">moduleB</a></th>\n"
@@ -751,15 +746,15 @@
checkOutput("moduletags-summary.html", true,
"<li><a href=\"#module.description\">Description</a> | <a href=\"#modules.summary\">Modules"
+ "</a> | <a href=\"#packages.summary\">Packages</a> | Services</li>",
- "<table class=\"requiresSummary\" summary=\"Additional Modules Required table, listing modules, and an explanation\">\n"
- + "<caption><span>Additional Modules Required</span><span class=\"tabEnd\"> </span></caption>",
+ "<table class=\"requiresSummary\" summary=\"Indirect Requires table, listing modules, and an explanation\">\n"
+ + "<caption><span>Indirect Requires</span><span class=\"tabEnd\"> </span></caption>",
"<td class=\"colFirst\">transitive</td>\n"
+ "<th class=\"colSecond\" scope=\"row\"><a href=\"moduleB-summary.html\">moduleB</a></th>\n"
+ "<td class=\"colLast\">\n"
+ "<div class=\"block\">This is a test description for the moduleB module.</div>\n"
+ "</td>",
- "<table class=\"packagesSummary\" summary=\"Additional Exported Packages table, listing modules, and packages\">\n"
- + "<caption><span>Additional Exported Packages</span><span class=\"tabEnd\"> </span></caption>",
+ "<table class=\"packagesSummary\" summary=\"Indirect Exports table, listing modules, and packages\">\n"
+ + "<caption><span>Indirect Exports</span><span class=\"tabEnd\"> </span></caption>",
"<td class=\"colFirst\">transitive static</td>\n"
+ "<th class=\"colSecond\" scope=\"row\"><a href=\"moduleA-summary.html\">moduleA</a></th>\n"
+ "<td class=\"colLast\">\n"
@@ -771,16 +766,16 @@
+ "<th class=\"colFirst\" scope=\"col\">Modifier</th>\n"
+ "<th class=\"colSecond\" scope=\"col\">Module</th>\n"
+ "<th class=\"colLast\" scope=\"col\">Description</th>",
- "<table class=\"requiresSummary\" summary=\"Additional Modules Required table, listing modules, and an explanation\">\n"
- + "<caption><span>Additional Modules Required</span><span class=\"tabEnd\"> </span></caption>\n"
+ "<table class=\"requiresSummary\" summary=\"Indirect Requires table, listing modules, and an explanation\">\n"
+ + "<caption><span>Indirect Requires</span><span class=\"tabEnd\"> </span></caption>\n"
+ "<tr>\n"
+ "<th class=\"colFirst\" scope=\"col\">Modifier</th>\n"
+ "<th class=\"colSecond\" scope=\"col\">Module</th>\n"
+ "<th class=\"colLast\" scope=\"col\">Description</th>",
- "<table class=\"packagesSummary\" summary=\"Additional Opened Packages table, listing modules, and packages\">\n"
- + "<caption><span>Additional Opened Packages</span><span class=\"tabEnd\"> </span></caption>\n"
+ "<table class=\"packagesSummary\" summary=\"Indirect Opens table, listing modules, and packages\">\n"
+ + "<caption><span>Indirect Opens</span><span class=\"tabEnd\"> </span></caption>\n"
+ "<tr>\n"
- + "<th class=\"colFirst\" scope=\"col\">Module</th>\n"
+ + "<th class=\"colFirst\" scope=\"col\">From</th>\n"
+ "<th class=\"colLast\" scope=\"col\">Packages</th>\n"
+ "</tr>\n",
"<th class=\"colFirst\" scope=\"row\"><a href=\"moduleB-summary.html\">moduleB</a></th>\n"
@@ -797,7 +792,7 @@
"<th class=\"colFirst\" scope=\"row\"><a href=\"testpkgmdlB/package-summary.html\">testpkgmdlB</a></th>\n"
+ "<td class=\"colLast\"> </td>",
"<table class=\"packagesSummary\" summary=\"Packages table, listing packages, and an explanation\">\n"
- + "<caption><span>Opened Packages</span><span class=\"tabEnd\"> </span></caption>\n"
+ + "<caption><span>Opens</span><span class=\"tabEnd\"> </span></caption>\n"
+ "<tr>\n"
+ "<th class=\"colFirst\" scope=\"col\">Package</th>\n"
+ "<th class=\"colLast\" scope=\"col\">Description</th>\n"
@@ -830,9 +825,9 @@
+ "<td class=\"colSecond\">All Modules</td>\n"
+ "<td class=\"colLast\"> </td>",
"<caption><span id=\"t0\" class=\"activeTableTab\"><span>All Packages</span><span class=\"tabEnd\"> </span></span>"
- + "<span id=\"t1\" class=\"tableTab\"><span><a href=\"javascript:showPkgs(1);\">Exported Packages</a></span>"
+ + "<span id=\"t1\" class=\"tableTab\"><span><a href=\"javascript:showPkgs(1);\">Exports</a></span>"
+ "<span class=\"tabEnd\"> </span></span><span id=\"t3\" class=\"tableTab\"><span><a href=\"javascript:showPkgs(4);\">"
- + "Concealed Packages</a></span><span class=\"tabEnd\"> </span></span></caption>",
+ + "Concealed</a></span><span class=\"tabEnd\"> </span></span></caption>",
"<th class=\"colFirst\" scope=\"row\"><a href=\"concealedpkgmdlA/package-summary.html\">concealedpkgmdlA</a></th>\n"
+ "<td class=\"colSecond\">None</td>\n"
+ "<td class=\"colLast\"> </td>");
@@ -854,10 +849,10 @@
+ "<td class=\"colLast\"> <br>(<span class=\"implementationLabel\">Implementation(s):</span> <a href=\"testpkgmdlB/TestClassInModuleB.html\" "
+ "title=\"class in testpkgmdlB\">TestClassInModuleB</a>)</td>",
"<caption><span id=\"t0\" class=\"activeTableTab\"><span>All Packages</span><span class=\"tabEnd\"> </span></span><span id=\"t1\" class=\"tableTab\"><span>"
- + "<a href=\"javascript:showPkgs(1);\">Exported Packages</a></span><span class=\"tabEnd\"> </span></span><span id=\"t2\" class=\"tableTab\"><span>"
- + "<a href=\"javascript:showPkgs(2);\">Opened Packages</a></span><span class=\"tabEnd\"> </span></span></caption>");
+ + "<a href=\"javascript:showPkgs(1);\">Exports</a></span><span class=\"tabEnd\"> </span></span><span id=\"t2\" class=\"tableTab\"><span>"
+ + "<a href=\"javascript:showPkgs(2);\">Opens</a></span><span class=\"tabEnd\"> </span></span></caption>");
checkOutput("moduleC-summary.html", found,
- "<caption><span>Exported Packages</span><span class=\"tabEnd\"> </span></caption>\n"
+ "<caption><span>Exports</span><span class=\"tabEnd\"> </span></caption>\n"
+ "<tr>\n"
+ "<th class=\"colFirst\" scope=\"col\">Package</th>\n"
+ "<th class=\"colSecond\" scope=\"col\">Module</th>\n"
@@ -872,7 +867,7 @@
void checkModuleDeprecation(boolean found) {
checkOutput("moduleA-summary.html", found,
"<div class=\"deprecatedContent\"><span class=\"deprecatedLabel\">Deprecated, for removal:"
- + " This API element is subject to removal in a future version. </span>\n"
+ + " This API element is subject to removal in a future version.</span>\n"
+ "<div class=\"block\"><span class=\"deprecationComment\">This module is deprecated.</span></div>\n"
+ "</div>");
checkOutput("deprecated-list.html", found,
--- a/langtools/test/jdk/javadoc/doclet/testSearch/TestSearch.java Thu Apr 06 17:01:05 2017 +0000
+++ b/langtools/test/jdk/javadoc/doclet/testSearch/TestSearch.java Thu Apr 06 18:00:34 2017 +0000
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8141492 8071982 8141636 8147890 8166175 8168965 8176794
+ * @bug 8141492 8071982 8141636 8147890 8166175 8168965 8176794 8175218
* @summary Test the search feature of javadoc.
* @author bpatel
* @library ../lib
@@ -321,9 +321,9 @@
+ "pkg2.<a href=\"pkg2/TestEnum.html\" title=\"enum in pkg2\">TestEnum</a></dt>");
checkOutput("index-all.html", true,
"<div class=\"block\"><span class=\"deprecationComment\">class_test1 passes. Search tag"
- + " <a id=\"SearchTagDeprecatedClass\">SearchTagDeprecatedClass</a></span></div>",
+ + " <a id=\"SearchTagDeprecatedClass\" class=\"searchTagResult\">SearchTagDeprecatedClass</a></span></div>",
"<div class=\"block\"><span class=\"deprecationComment\">error_test3 passes. Search tag for\n"
- + " method <a id=\"SearchTagDeprecatedMethod\">SearchTagDeprecatedMethod</a></span></div>");
+ + " method <a id=\"SearchTagDeprecatedMethod\" class=\"searchTagResult\">SearchTagDeprecatedMethod</a></span></div>");
}
void checkSplitIndex() {
--- a/langtools/test/jdk/javadoc/doclet/testStylesheet/TestStylesheet.java Thu Apr 06 17:01:05 2017 +0000
+++ b/langtools/test/jdk/javadoc/doclet/testStylesheet/TestStylesheet.java Thu Apr 06 18:00:34 2017 +0000
@@ -23,7 +23,8 @@
/*
* @test
- * @bug 4494033 7028815 7052425 8007338 8023608 8008164 8016549 8072461 8154261 8162363 8160196 8151743
+ * @bug 4494033 7028815 7052425 8007338 8023608 8008164 8016549 8072461 8154261 8162363 8160196 8151743 8177417
+ * 8175218
* @summary Run tests on doclet stylesheet.
* @author jamieh
* @library ../lib
@@ -140,8 +141,8 @@
+ ".usesSummary td.colFirst, .usesSummary th.colFirst,\n"
+ ".providesSummary td.colFirst, .providesSummary th.colFirst,\n"
+ ".memberSummary td.colFirst, .memberSummary th.colFirst,\n"
- + ".memberSummary td.colSecond, .memberSummary th.colSecond,\n"
- + ".typeSummary td.colFirst{\n"
+ + ".memberSummary td.colSecond, .memberSummary th.colSecond, .memberSummary th.colConstructorName,\n"
+ + ".typeSummary td.colFirst {\n"
+ " vertical-align:top;\n"
+ "}",
".overviewSummary td, .memberSummary td, .typeSummary td,\n"
@@ -162,6 +163,16 @@
"@import url('resources/fonts/dejavu.css');",
".navPadding {\n"
+ " padding-top: 107px;\n"
+ + "}",
+ "a[name]:before, a[name]:target, a[id]:before, a[id]:target {\n"
+ + " content:\"\";\n"
+ + " display:inline-block;\n"
+ + " position:relative;\n"
+ + " padding-top:129px;\n"
+ + " margin-top:-129px;\n"
+ + "}\n"
+ + ".searchTagResult:before, .searchTagResult:target {\n"
+ + " color:red;\n"
+ "}");
// Test whether a link to the stylesheet file is inserted properly
--- a/langtools/test/jdk/jshell/CommandCompletionTest.java Thu Apr 06 17:01:05 2017 +0000
+++ b/langtools/test/jdk/jshell/CommandCompletionTest.java Thu Apr 06 18:00:34 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, 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
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8144095 8164825 8169818 8153402 8165405 8177079
+ * @bug 8144095 8164825 8169818 8153402 8165405 8177079 8178013
* @summary Test Command Completion
* @modules jdk.compiler/com.sun.tools.javac.api
* jdk.compiler/com.sun.tools.javac.main
@@ -173,6 +173,8 @@
"/save ", "/set "),
a -> assertCompletion(a, "/help /set |", false,
"editor", "feedback", "format", "mode", "prompt", "start", "truncation"),
+ a -> assertCompletion(a, "/help set |", false,
+ "editor", "feedback", "format", "mode", "prompt", "start", "truncation"),
a -> assertCompletion(a, "/help /edit |", false),
a -> assertCompletion(a, "/help dr|", false,
"drop ")
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/jdk/jshell/HistoryUITest.java Thu Apr 06 18:00:34 2017 +0000
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2017, 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 8178077
+ * @summary Check the UI behavior of editing history.
+ * @modules
+ * jdk.compiler/com.sun.tools.javac.api
+ * jdk.compiler/com.sun.tools.javac.main
+ * jdk.jshell/jdk.jshell:open
+ * @library /tools/lib
+ * @build toolbox.ToolBox toolbox.JarTask toolbox.JavacTask
+ * @build Compiler UITesting
+ * @build HistoryUITest
+ * @run testng HistoryUITest
+ */
+
+import org.testng.annotations.Test;
+
+@Test
+public class HistoryUITest extends UITesting {
+
+ public void testPrevNextSnippet() throws Exception {
+ doRunTest((inputSink, out) -> {
+ inputSink.write("void test1() {\nSystem.err.println(1);\n}\n");
+ waitOutput(out, "\u0005");
+ inputSink.write("void test2() {\nSystem.err.println(2);\n}\n");
+ waitOutput(out, "\u0005");
+ inputSink.write(CTRL_UP);
+ waitOutput(out, "^void test2\\(\\) \\{");
+ inputSink.write(CTRL_UP);
+ waitOutput(out, "^" + clearOut("2() {") + "1\\(\\) \\{");
+ inputSink.write(CTRL_DOWN);
+ waitOutput(out, "^" + clearOut("1() {") + "2\\(\\) \\{");
+ inputSink.write(ENTER);
+ waitOutput(out, "^\n\u0006");
+ inputSink.write(UP);
+ waitOutput(out, "^}");
+ inputSink.write(UP);
+ waitOutput(out, "^" + clearOut("}") + "System.err.println\\(2\\);");
+ inputSink.write(UP);
+ waitOutput(out, "^" + clearOut("System.err.println(2);") + "void test2\\(\\) \\{");
+ inputSink.write(UP);
+ waitOutput(out, "^\u0007");
+ inputSink.write(DOWN);
+ waitOutput(out, "^" + clearOut("void test2() {") + "System.err.println\\(2\\);");
+ inputSink.write(DOWN);
+ waitOutput(out, "^" + clearOut("System.err.println(2);") + "}");
+ inputSink.write(DOWN);
+ waitOutput(out, "^" + clearOut("}"));
+ inputSink.write(DOWN);
+ waitOutput(out, "^\u0007");
+ });
+ }
+ //where:
+ private static final String CTRL_UP = "\033[1;5A";
+ private static final String CTRL_DOWN = "\033[1;5B";
+ private static final String UP = "\033[A";
+ private static final String DOWN = "\033[B";
+ private static final String ENTER = "\n";
+
+}
--- a/langtools/test/jdk/jshell/MergedTabShiftTabTest.java Thu Apr 06 17:01:05 2017 +0000
+++ b/langtools/test/jdk/jshell/MergedTabShiftTabTest.java Thu Apr 06 18:00:34 2017 +0000
@@ -31,37 +31,29 @@
* jdk.jshell/jdk.jshell:open
* @library /tools/lib
* @build toolbox.ToolBox toolbox.JarTask toolbox.JavacTask
- * @build Compiler
+ * @build Compiler UITesting
* @build MergedTabShiftTabTest
* @run testng MergedTabShiftTabTest
*/
import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintStream;
-import java.io.Writer;
import java.lang.reflect.Field;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.MessageFormat;
import java.util.Arrays;
-import java.util.HashMap;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
-import java.util.regex.Matcher;
import java.util.regex.Pattern;
import jdk.jshell.JShell;
-import jdk.jshell.tool.JavaShellToolBuilder;
import org.testng.annotations.Test;
@Test
-public class MergedTabShiftTabTest {
+public class MergedTabShiftTabTest extends UITesting {
public void testCommand() throws Exception {
doRunTest((inputSink, out) -> {
@@ -281,60 +273,6 @@
});
}
- private void doRunTest(Test test) throws Exception {
- PipeInputStream input = new PipeInputStream();
- StringBuilder out = new StringBuilder();
- PrintStream outS = new PrintStream(new OutputStream() {
- @Override public void write(int b) throws IOException {
- synchronized (out) {
- System.out.print((char) b);
- out.append((char) b);
- out.notifyAll();
- }
- }
- });
- Thread runner = new Thread(() -> {
- try {
- JavaShellToolBuilder.builder()
- .in(input, input)
- .out(outS)
- .err(outS)
- .promptCapture(true)
- .persistence(new HashMap<>())
- .locale(Locale.US)
- .run("--no-startup");
- } catch (Exception ex) {
- throw new IllegalStateException(ex);
- }
- });
-
- Writer inputSink = new OutputStreamWriter(input.createOutput()) {
- @Override
- public void write(String str) throws IOException {
- super.write(str);
- flush();
- }
- };
-
- runner.start();
-
- try {
- waitOutput(out, "\u0005");
- test.test(inputSink, out);
- } finally {
- inputSink.write("\003\003/exit");
-
- runner.join(1000);
- if (runner.isAlive()) {
- runner.stop();
- }
- }
- }
-
- interface Test {
- public void test(Writer inputSink, StringBuilder out) throws Exception;
- }
-
private Path prepareZip() {
String clazz1 =
"package jshelltest;\n" +
@@ -404,162 +342,4 @@
return MessageFormat.format(resources.getString(key), args);
}
- private static final long TIMEOUT;
-
- static {
- long factor;
-
- try {
- factor = (long) Double.parseDouble(System.getProperty("test.timeout.factor", "1"));
- } catch (NumberFormatException ex) {
- factor = 1;
- }
- TIMEOUT = 60_000 * factor;
- }
-
- private void waitOutput(StringBuilder out, String expected) {
- expected = expected.replaceAll("\n", System.getProperty("line.separator"));
- Pattern expectedPattern = Pattern.compile(expected, Pattern.DOTALL);
- synchronized (out) {
- long s = System.currentTimeMillis();
-
- while (true) {
- Matcher m = expectedPattern.matcher(out);
- if (m.find()) {
- out.delete(0, m.end() + 1);
- return ;
- }
- long e = System.currentTimeMillis();
- if ((e - s) > TIMEOUT) {
- throw new IllegalStateException("Timeout waiting for: " + quote(expected) + ", actual output so far: " + quote(out.toString()));
- }
- try {
- out.wait(TIMEOUT);
- } catch (InterruptedException ex) {
- ex.printStackTrace();
- }
- }
- }
- }
-
- private String quote(String original) {
- StringBuilder output = new StringBuilder();
-
- for (char c : original.toCharArray()) {
- if (c < 32) {
- output.append(String.format("\\u%04X", (int) c));
- } else {
- output.append(c);
- }
- }
-
- return output.toString();
- }
-
- private static class PipeInputStream extends InputStream {
-
- private static final int INITIAL_SIZE = 128;
- private int[] buffer = new int[INITIAL_SIZE];
- private int start;
- private int end;
- private boolean closed;
-
- @Override
- public synchronized int read() throws IOException {
- if (start == end && !closed) {
- inputNeeded();
- }
- while (start == end) {
- if (closed) {
- return -1;
- }
- try {
- wait();
- } catch (InterruptedException ex) {
- //ignore
- }
- }
- try {
- return buffer[start];
- } finally {
- start = (start + 1) % buffer.length;
- }
- }
-
- @Override
- public synchronized int read(byte[] b, int off, int len) throws IOException {
- if (b == null) {
- throw new NullPointerException();
- } else if (off < 0 || len < 0 || len > b.length - off) {
- throw new IndexOutOfBoundsException();
- } else if (len == 0) {
- return 0;
- }
-
- int c = read();
- if (c == -1) {
- return -1;
- }
- b[off] = (byte)c;
-
- int totalRead = 1;
- while (totalRead < len && start != end) {
- int r = read();
- if (r == (-1))
- break;
- b[off + totalRead++] = (byte) r;
- }
- return totalRead;
- }
-
- protected void inputNeeded() throws IOException {}
-
- private synchronized void write(int b) {
- if (closed) {
- throw new IllegalStateException("Already closed.");
- }
- int newEnd = (end + 1) % buffer.length;
- if (newEnd == start) {
- //overflow:
- int[] newBuffer = new int[buffer.length * 2];
- int rightPart = (end > start ? end : buffer.length) - start;
- int leftPart = end > start ? 0 : start - 1;
- System.arraycopy(buffer, start, newBuffer, 0, rightPart);
- System.arraycopy(buffer, 0, newBuffer, rightPart, leftPart);
- buffer = newBuffer;
- start = 0;
- end = rightPart + leftPart;
- newEnd = end + 1;
- }
- buffer[end] = b;
- end = newEnd;
- notifyAll();
- }
-
- @Override
- public synchronized void close() {
- closed = true;
- 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();
- }
- };
- }
-
- }
-
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/jdk/jshell/UITesting.java Thu Apr 06 18:00:34 2017 +0000
@@ -0,0 +1,272 @@
+/*
+ * Copyright (c) 2017, 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.
+ */
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintStream;
+import java.io.Writer;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import jdk.jshell.tool.JavaShellToolBuilder;
+
+public class UITesting {
+
+ protected void doRunTest(Test test) throws Exception {
+ PipeInputStream input = new PipeInputStream();
+ StringBuilder out = new StringBuilder();
+ PrintStream outS = new PrintStream(new OutputStream() {
+ @Override public void write(int b) throws IOException {
+ synchronized (out) {
+ System.out.print((char) b);
+ out.append((char) b);
+ out.notifyAll();
+ }
+ }
+ });
+ Thread runner = new Thread(() -> {
+ try {
+ JavaShellToolBuilder.builder()
+ .in(input, input)
+ .out(outS)
+ .err(outS)
+ .promptCapture(true)
+ .persistence(new HashMap<>())
+ .locale(Locale.US)
+ .run("--no-startup");
+ } catch (Exception ex) {
+ throw new IllegalStateException(ex);
+ }
+ });
+
+ Writer inputSink = new OutputStreamWriter(input.createOutput()) {
+ @Override
+ public void write(String str) throws IOException {
+ super.write(str);
+ flush();
+ }
+ };
+
+ runner.start();
+
+ try {
+ waitOutput(out, "\u0005");
+ test.test(inputSink, out);
+ } finally {
+ inputSink.write("\003\003/exit");
+
+ runner.join(1000);
+ if (runner.isAlive()) {
+ runner.stop();
+ }
+ }
+ }
+
+ protected interface Test {
+ public void test(Writer inputSink, StringBuilder out) throws Exception;
+ }
+
+ private static final long TIMEOUT;
+
+ static {
+ long factor;
+
+ try {
+ factor = (long) Double.parseDouble(System.getProperty("test.timeout.factor", "1"));
+ } catch (NumberFormatException ex) {
+ factor = 1;
+ }
+ TIMEOUT = 60_000 * factor;
+ }
+
+ protected void waitOutput(StringBuilder out, String expected) {
+ expected = expected.replaceAll("\n", System.getProperty("line.separator"));
+ Pattern expectedPattern = Pattern.compile(expected, Pattern.DOTALL);
+ synchronized (out) {
+ long s = System.currentTimeMillis();
+
+ while (true) {
+ Matcher m = expectedPattern.matcher(out);
+ if (m.find()) {
+ out.delete(0, m.end() + 1);
+ return ;
+ }
+ long e = System.currentTimeMillis();
+ if ((e - s) > TIMEOUT) {
+ throw new IllegalStateException("Timeout waiting for: " + quote(expected) + ", actual output so far: " + quote(out.toString()));
+ }
+ try {
+ out.wait(TIMEOUT);
+ } catch (InterruptedException ex) {
+ ex.printStackTrace();
+ }
+ }
+ }
+ }
+
+ private String quote(String original) {
+ StringBuilder output = new StringBuilder();
+
+ for (char c : original.toCharArray()) {
+ if (c < 32) {
+ output.append(String.format("\\u%04X", (int) c));
+ } else {
+ output.append(c);
+ }
+ }
+
+ return output.toString();
+ }
+
+ protected String clearOut(String what) {
+ return backspace(what.length()) + space(what.length()) + backspace(what.length());
+ }
+
+ protected String backspace(int n) {
+ return fill(n, '\010');
+ }
+
+ protected String space(int n) {
+ return fill(n, ' ');
+ }
+
+ private String fill(int n, char c) {
+ StringBuilder result = new StringBuilder(n);
+
+ while (n-- > 0)
+ result.append(c);
+
+ return result.toString();
+ }
+
+ private static class PipeInputStream extends InputStream {
+
+ private static final int INITIAL_SIZE = 128;
+ private int[] buffer = new int[INITIAL_SIZE];
+ private int start;
+ private int end;
+ private boolean closed;
+
+ @Override
+ public synchronized int read() throws IOException {
+ if (start == end && !closed) {
+ inputNeeded();
+ }
+ while (start == end) {
+ if (closed) {
+ return -1;
+ }
+ try {
+ wait();
+ } catch (InterruptedException ex) {
+ //ignore
+ }
+ }
+ try {
+ return buffer[start];
+ } finally {
+ start = (start + 1) % buffer.length;
+ }
+ }
+
+ @Override
+ public synchronized int read(byte[] b, int off, int len) throws IOException {
+ if (b == null) {
+ throw new NullPointerException();
+ } else if (off < 0 || len < 0 || len > b.length - off) {
+ throw new IndexOutOfBoundsException();
+ } else if (len == 0) {
+ return 0;
+ }
+
+ int c = read();
+ if (c == -1) {
+ return -1;
+ }
+ b[off] = (byte)c;
+
+ int totalRead = 1;
+ while (totalRead < len && start != end) {
+ int r = read();
+ if (r == (-1))
+ break;
+ b[off + totalRead++] = (byte) r;
+ }
+ return totalRead;
+ }
+
+ protected void inputNeeded() throws IOException {}
+
+ private synchronized void write(int b) {
+ if (closed) {
+ throw new IllegalStateException("Already closed.");
+ }
+ int newEnd = (end + 1) % buffer.length;
+ if (newEnd == start) {
+ //overflow:
+ int[] newBuffer = new int[buffer.length * 2];
+ int rightPart = (end > start ? end : buffer.length) - start;
+ int leftPart = end > start ? 0 : start - 1;
+ System.arraycopy(buffer, start, newBuffer, 0, rightPart);
+ System.arraycopy(buffer, 0, newBuffer, rightPart, leftPart);
+ buffer = newBuffer;
+ start = 0;
+ end = rightPart + leftPart;
+ newEnd = end + 1;
+ }
+ buffer[end] = b;
+ end = newEnd;
+ notifyAll();
+ }
+
+ @Override
+ public synchronized void close() {
+ closed = true;
+ 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();
+ }
+ };
+ }
+
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/lambda/speculative/T8177933.java Thu Apr 06 18:00:34 2017 +0000
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2017, 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 8177933
+ * @summary Stackoverflow during compilation, starting jdk-9+163
+ *
+ * @library /tools/javac/lib
+ * @modules jdk.compiler/com.sun.tools.javac.api
+ * jdk.compiler/com.sun.tools.javac.code
+ * jdk.compiler/com.sun.tools.javac.comp
+ * jdk.compiler/com.sun.tools.javac.main
+ * jdk.compiler/com.sun.tools.javac.tree
+ * jdk.compiler/com.sun.tools.javac.util
+ * @build combo.ComboTestHelper
+
+ * @run main/othervm -Xss512K T8177933
+ */
+
+import combo.ComboInstance;
+import combo.ComboParameter;
+import combo.ComboTask.Result;
+import combo.ComboTestHelper;
+
+import javax.lang.model.element.Element;
+
+public class T8177933 extends ComboInstance<T8177933> {
+
+ static final int MAX_DEPTH = 350;
+
+ static class CallExpr implements ComboParameter {
+ @Override
+ public String expand(String optParameter) {
+ Integer n = Integer.parseInt(optParameter);
+ if (n == MAX_DEPTH) {
+ return "m()";
+ } else {
+ return "m().#{CALL." + (n + 1) + "}";
+ }
+ }
+ }
+
+ static final String sourceTemplate =
+ "class Test {\n" +
+ " Test m() { return null; }\n" +
+ " void test() {\n" +
+ " #{CALL.0};\n" +
+ "} }\n";
+
+ public static void main(String[] args) {
+ new ComboTestHelper<T8177933>()
+ .withDimension("CALL", new CallExpr())
+ .run(T8177933::new);
+ }
+
+ @Override
+ protected void doWork() throws Throwable {
+ Result<Iterable<? extends Element>> result = newCompilationTask()
+ .withOption("-XDdev")
+ .withSourceFromTemplate(sourceTemplate)
+ .analyze();
+ if (!result.get().iterator().hasNext()) {
+ fail("Exception occurred when compiling combo. " + result.compilationInfo());
+ }
+ }
+}
--- a/langtools/test/tools/javac/modules/PoorChoiceForModuleNameTest.java Thu Apr 06 17:01:05 2017 +0000
+++ b/langtools/test/tools/javac/modules/PoorChoiceForModuleNameTest.java Thu Apr 06 18:00:34 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017 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
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8160181
+ * @bug 8160181 8176572
* @summary Add lint warning for digits in module names
* @library /tools/lib
* @modules
@@ -63,6 +63,22 @@
Path src_m3 = src.resolve("mango100");
tb.writeJavaFiles(src_m3, "@SuppressWarnings(\"module\") module mango100 { }");
+ // Check that there is no warning at use site.
+ Path src_m4 = src.resolve("mangouser");
+ tb.writeJavaFiles(src_m4, "module mangouser { requires mango19; }");
+
+ // Check that we warn about component names ending in digit also
+ Path src_m5 = src.resolve("mango1000.mangofruit.mangomodule");
+ tb.writeJavaFiles(src_m5, "module mango1000.mangofruit.mangomodule { }");
+
+ // Check that we warn about component names ending in digit also
+ Path src_m6 = src.resolve("mangofruit.mango1000.mangomodule");
+ tb.writeJavaFiles(src_m6, "module mangofruit.mango1000.mangomodule { }");
+
+ // Check that we warn about component names ending in digit also
+ Path src_m7 = src.resolve("mangomodule.mangofruit.mango1000");
+ tb.writeJavaFiles(src_m7, "module mangomodule.mangofruit.mango1000 { }");
+
Path classes = base.resolve("classes");
tb.createDirectories(classes);
@@ -78,9 +94,12 @@
.getOutput(Task.OutputKind.DIRECT);
if (!log.contains("module-info.java:1:8: compiler.warn.poor.choice.for.module.name: mango19") ||
+ !log.contains("module-info.java:1:8: compiler.warn.poor.choice.for.module.name: mango1000") ||
+ !log.contains("module-info.java:1:18: compiler.warn.poor.choice.for.module.name: mango1000") ||
+ !log.contains("module-info.java:1:30: compiler.warn.poor.choice.for.module.name: mango1000") ||
!log.contains("- compiler.err.warnings.and.werror") ||
!log.contains("1 error") ||
- !log.contains("1 warning"))
+ !log.contains("4 warning"))
throw new Exception("expected output not found: " + log);
}
}