This commit is contained in:
Jennifer Godinez 2011-05-03 22:17:58 -07:00
commit a5846fb547
88 changed files with 2155 additions and 415 deletions
langtools
src/share/classes/com/sun
test

@ -1,5 +1,5 @@
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 2011, 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
@ -38,6 +38,7 @@ import javax.lang.model.type.TypeMirror;
import javax.tools.Diagnostic;
import javax.tools.JavaCompiler.CompilationTask;
import com.sun.source.tree.CatchTree;
import com.sun.source.tree.ClassTree;
import com.sun.source.tree.CompilationUnitTree;
import com.sun.source.tree.MethodTree;
@ -207,4 +208,11 @@ public abstract class Trees {
public abstract void printMessage(Diagnostic.Kind kind, CharSequence msg,
com.sun.source.tree.Tree t,
com.sun.source.tree.CompilationUnitTree root);
/**
* Gets the lub of an exception parameter declared in a catch clause.
* @param tree the tree for the catch clause
* @return The lub of the exception parameter
*/
public abstract TypeMirror getLub(CatchTree tree);
}

@ -149,11 +149,20 @@ public class ClassUseWriter extends SubWriterHolderWriter {
ClassUseMapper mapper = new ClassUseMapper(configuration.root, classtree);
ClassDoc[] classes = configuration.root.classes();
for (int i = 0; i < classes.length; i++) {
ClassUseWriter.generate(configuration, mapper, classes[i]);
// If -nodeprecated option is set and the containing package is marked
// as deprecated, do not generate the class-use page. We will still generate
// the class-use page if the class is marked as deprecated but the containing
// package is not since it could still be linked from that package-use page.
if (!(configuration.nodeprecated &&
Util.isDeprecated(classes[i].containingPackage())))
ClassUseWriter.generate(configuration, mapper, classes[i]);
}
PackageDoc[] pkgs = configuration.packages;
for (int i = 0; i < pkgs.length; i++) {
PackageUseWriter.generate(configuration, mapper, pkgs[i]);
// If -nodeprecated option is set and the package is marked
// as deprecated, do not generate the package-use page.
if (!(configuration.nodeprecated && Util.isDeprecated(pkgs[i])))
PackageUseWriter.generate(configuration, mapper, pkgs[i]);
}
}

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998, 2009, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2011, 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
@ -31,6 +31,7 @@ import com.sun.tools.doclets.internal.toolkit.util.*;
import com.sun.javadoc.*;
import java.util.*;
import java.io.*;
import java.net.*;
/**
* Configure the output based on the command line options.
@ -48,6 +49,7 @@ import java.io.*;
* @author Robert Field.
* @author Atul Dambalkar.
* @author Jamie Ho
* @author Bhavesh Patel (Modified)
*/
public class ConfigurationImpl extends Configuration {
@ -109,6 +111,11 @@ public class ConfigurationImpl extends Configuration {
*/
public String stylesheetfile = "";
/**
* Argument for command line option "-Xdocrootparent".
*/
public String docrootparent = "";
/**
* True if command line option "-nohelp" is used. Default value is false.
*/
@ -239,6 +246,8 @@ public class ConfigurationImpl extends Configuration {
stylesheetfile = os[1];
} else if (opt.equals("-charset")) {
charset = os[1];
} else if (opt.equals("-xdocrootparent")) {
docrootparent = os[1];
} else if (opt.equals("-nohelp")) {
nohelp = true;
} else if (opt.equals("-splitindex")) {
@ -322,7 +331,8 @@ public class ConfigurationImpl extends Configuration {
option.equals("-helpfile") ||
option.equals("-stylesheetfile") ||
option.equals("-charset") ||
option.equals("-overview")) {
option.equals("-overview") ||
option.equals("-xdocrootparent")) {
return 2;
} else {
return 0;
@ -372,6 +382,13 @@ public class ConfigurationImpl extends Configuration {
return false;
}
nohelp = true;
} else if (opt.equals("-xdocrootparent")) {
try {
new URL(os[1]);
} catch (MalformedURLException e) {
reporter.printError(getText("doclet.MalformedURL", os[1]));
return false;
}
} else if (opt.equals("-overview")) {
if (nooverview == true) {
reporter.printError(getText("doclet.Option_conflict",

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2011, 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
@ -42,15 +42,15 @@ import com.sun.tools.doclets.formats.html.markup.*;
public class DeprecatedListWriter extends SubWriterHolderWriter {
private static final String[] ANCHORS = new String[] {
"interface", "class", "enum", "exception", "error", "annotation_type",
"field", "method", "constructor", "enum_constant",
"package", "interface", "class", "enum", "exception", "error",
"annotation_type", "field", "method", "constructor", "enum_constant",
"annotation_type_member"
};
private static final String[] HEADING_KEYS = new String[] {
"doclet.Deprecated_Interfaces", "doclet.Deprecated_Classes",
"doclet.Deprecated_Enums", "doclet.Deprecated_Exceptions",
"doclet.Deprecated_Errors",
"doclet.Deprecated_Packages", "doclet.Deprecated_Interfaces",
"doclet.Deprecated_Classes", "doclet.Deprecated_Enums",
"doclet.Deprecated_Exceptions", "doclet.Deprecated_Errors",
"doclet.Deprecated_Annotation_Types",
"doclet.Deprecated_Fields",
"doclet.Deprecated_Methods", "doclet.Deprecated_Constructors",
@ -59,9 +59,9 @@ public class DeprecatedListWriter extends SubWriterHolderWriter {
};
private static final String[] SUMMARY_KEYS = new String[] {
"doclet.deprecated_interfaces", "doclet.deprecated_classes",
"doclet.deprecated_enums", "doclet.deprecated_exceptions",
"doclet.deprecated_errors",
"doclet.deprecated_packages", "doclet.deprecated_interfaces",
"doclet.deprecated_classes", "doclet.deprecated_enums",
"doclet.deprecated_exceptions", "doclet.deprecated_errors",
"doclet.deprecated_annotation_types",
"doclet.deprecated_fields",
"doclet.deprecated_methods", "doclet.deprecated_constructors",
@ -70,7 +70,7 @@ public class DeprecatedListWriter extends SubWriterHolderWriter {
};
private static final String[] HEADER_KEYS = new String[] {
"doclet.Interface", "doclet.Class",
"doclet.Package", "doclet.Interface", "doclet.Class",
"doclet.Enum", "doclet.Exceptions",
"doclet.Errors",
"doclet.AnnotationType",
@ -116,7 +116,7 @@ public class DeprecatedListWriter extends SubWriterHolderWriter {
DeprecatedListWriter depr =
new DeprecatedListWriter(configuration, filename);
depr.generateDeprecatedListFile(
new DeprecatedAPIListBuilder(configuration.root));
new DeprecatedAPIListBuilder(configuration));
depr.close();
} catch (IOException exc) {
configuration.standardmessage.error(
@ -149,8 +149,14 @@ public class DeprecatedListWriter extends SubWriterHolderWriter {
memberTableHeader[0] = configuration.getText("doclet.0_and_1",
configuration.getText(HEADER_KEYS[i]),
configuration.getText("doclet.Description"));
writers[i].addDeprecatedAPI(deprapi.getList(i),
HEADING_KEYS[i], memberTableSummary, memberTableHeader, div);
// DeprecatedAPIListBuilder.PACKAGE == 0, so if i == 0, it is
// a PackageDoc.
if (i == DeprecatedAPIListBuilder.PACKAGE)
addPackageDeprecatedAPI(deprapi.getList(i),
HEADING_KEYS[i], memberTableSummary, memberTableHeader, div);
else
writers[i - 1].addDeprecatedAPI(deprapi.getList(i),
HEADING_KEYS[i], memberTableSummary, memberTableHeader, div);
}
}
body.addContent(div);

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2011, 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
@ -198,23 +198,27 @@ public class HtmlDoclet extends AbstractDoclet {
PackageIndexFrameWriter.generate(configuration);
}
PackageDoc prev = null, next;
for(int i = 0; i < packages.length; i++) {
PackageFrameWriter.generate(configuration, packages[i]);
next = (i + 1 < packages.length && packages[i+1].name().length() > 0) ?
packages[i+1] : null;
//If the next package is unnamed package, skip 2 ahead if possible
next = (i + 2 < packages.length && next == null) ?
packages[i+2]: next;
AbstractBuilder packageSummaryBuilder = configuration.
getBuilderFactory().getPackageSummaryBuilder(
packages[i], prev, next);
packageSummaryBuilder.build();
if (configuration.createtree) {
PackageTreeWriter.generate(configuration,
packages[i], prev, next,
configuration.nodeprecated);
for (int i = 0; i < packages.length; i++) {
// if -nodeprecated option is set and the package is marked as
// deprecated, do not generate the package-summary.html, package-frame.html
// and package-tree.html pages for that package.
if (!(configuration.nodeprecated && Util.isDeprecated(packages[i]))) {
PackageFrameWriter.generate(configuration, packages[i]);
next = (i + 1 < packages.length &&
packages[i + 1].name().length() > 0) ? packages[i + 1] : null;
//If the next package is unnamed package, skip 2 ahead if possible
next = (i + 2 < packages.length && next == null) ? packages[i + 2] : next;
AbstractBuilder packageSummaryBuilder =
configuration.getBuilderFactory().getPackageSummaryBuilder(
packages[i], prev, next);
packageSummaryBuilder.build();
if (configuration.createtree) {
PackageTreeWriter.generate(configuration,
packages[i], prev, next,
configuration.nodeprecated);
}
prev = packages[i];
}
prev = packages[i];
}
}

@ -159,22 +159,42 @@ public class HtmlDocletWriter extends HtmlDocWriter {
StringBuilder buf = new StringBuilder();
int previndex = 0;
while (true) {
// Search for lowercase version of {@docRoot}
index = lowerHtml.indexOf("{@docroot}", previndex);
// If next {@docRoot} tag not found, append rest of htmlstr and exit loop
if (index < 0) {
buf.append(htmlstr.substring(previndex));
break;
}
// If next {@docroot} tag found, append htmlstr up to start of tag
buf.append(htmlstr.substring(previndex, index));
previndex = index + 10; // length for {@docroot} string
// Insert relative path where {@docRoot} was located
buf.append(relativepathNoSlash);
// Append slash if next character is not a slash
if (relativepathNoSlash.length() > 0 && previndex < htmlstr.length()
&& htmlstr.charAt(previndex) != '/') {
buf.append(DirectoryManager.URL_FILE_SEPARATOR);
if (configuration.docrootparent.length() > 0) {
// Search for lowercase version of {@docRoot}/..
index = lowerHtml.indexOf("{@docroot}/..", previndex);
// If next {@docRoot}/.. pattern not found, append rest of htmlstr and exit loop
if (index < 0) {
buf.append(htmlstr.substring(previndex));
break;
}
// If next {@docroot}/.. pattern found, append htmlstr up to start of tag
buf.append(htmlstr.substring(previndex, index));
previndex = index + 13; // length for {@docroot}/.. string
// Insert docrootparent absolute path where {@docRoot}/.. was located
buf.append(configuration.docrootparent);
// Append slash if next character is not a slash
if (previndex < htmlstr.length() && htmlstr.charAt(previndex) != '/') {
buf.append(DirectoryManager.URL_FILE_SEPARATOR);
}
} else {
// Search for lowercase version of {@docRoot}
index = lowerHtml.indexOf("{@docroot}", previndex);
// If next {@docRoot} tag not found, append rest of htmlstr and exit loop
if (index < 0) {
buf.append(htmlstr.substring(previndex));
break;
}
// If next {@docroot} tag found, append htmlstr up to start of tag
buf.append(htmlstr.substring(previndex, index));
previndex = index + 10; // length for {@docroot} string
// Insert relative path where {@docRoot} was located
buf.append(relativepathNoSlash);
// Append slash if next character is not a slash
if (relativepathNoSlash.length() > 0 && previndex < htmlstr.length() &&
htmlstr.charAt(previndex) != '/') {
buf.append(DirectoryManager.URL_FILE_SEPARATOR);
}
}
}
return buf.toString();
@ -1394,6 +1414,44 @@ public class HtmlDocletWriter extends HtmlDocWriter {
return new StringContent(packageName);
}
/**
* Add package deprecation information to the documentation tree
*
* @param deprPkgs list of deprecated packages
* @param headingKey the caption for the deprecated package table
* @param tableSummary the summary for the deprecated package table
* @param tableHeader table headers for the deprecated package table
* @param contentTree the content tree to which the deprecated package table will be added
*/
protected void addPackageDeprecatedAPI(List<Doc> deprPkgs, String headingKey,
String tableSummary, String[] tableHeader, Content contentTree) {
if (deprPkgs.size() > 0) {
Content table = HtmlTree.TABLE(0, 3, 0, tableSummary,
getTableCaption(configuration().getText(headingKey)));
table.addContent(getSummaryTableHeader(tableHeader, "col"));
Content tbody = new HtmlTree(HtmlTag.TBODY);
for (int i = 0; i < deprPkgs.size(); i++) {
PackageDoc pkg = (PackageDoc) deprPkgs.get(i);
HtmlTree td = HtmlTree.TD(HtmlStyle.colOne,
getPackageLink(pkg, getPackageName(pkg)));
if (pkg.tags("deprecated").length > 0) {
addInlineDeprecatedComment(pkg, pkg.tags("deprecated")[0], td);
}
HtmlTree tr = HtmlTree.TR(td);
if (i % 2 == 0) {
tr.addStyle(HtmlStyle.altColor);
} else {
tr.addStyle(HtmlStyle.rowColor);
}
tbody.addContent(tr);
}
table.addContent(tbody);
Content li = HtmlTree.LI(HtmlStyle.blockList, table);
Content ul = HtmlTree.UL(HtmlStyle.blockList, li);
contentTree.addContent(ul);
}
}
/**
* Prine table header information about color, column span and the font.
*
@ -2120,7 +2178,7 @@ public class HtmlDocletWriter extends HtmlDocWriter {
}
}
text = (isplaintext) ?
refMemName : getCode() + refMemName + getCodeEnd();
refMemName : getCode() + Util.escapeHtmlChars(refMemName) + getCodeEnd();
result.append(getDocLink(LinkInfoImpl.CONTEXT_SEE_TAG, containing,
refMem, (label.length() == 0)? text: label, false));
@ -2280,6 +2338,7 @@ public class HtmlDocletWriter extends HtmlDocWriter {
public String commentTagsToString(Tag holderTag, Doc doc, Tag[] tags,
boolean isFirstSentence) {
StringBuilder result = new StringBuilder();
boolean textTagChange = false;
// Array of all possible inline tags for this javadoc run
configuration.tagletManager.checkTags(doc, tags, true);
for (int i = 0; i < tags.length; i++) {
@ -2295,13 +2354,26 @@ public class HtmlDocletWriter extends HtmlDocWriter {
result.append(output == null ? "" : output.toString());
if (originalLength == 0 && isFirstSentence && tagelem.name().equals("@inheritDoc") && result.length() > 0) {
break;
} else if (configuration.docrootparent.length() > 0 &&
tagelem.name().equals("@docRoot") &&
((tags[i + 1]).text()).startsWith("/..")) {
//If Xdocrootparent switch ON, set the flag to remove the /.. occurance after
//{@docRoot} tag in the very next Text tag.
textTagChange = true;
continue;
} else {
continue;
continue;
}
} else {
String text = tagelem.text();
//If Xdocrootparent switch ON, remove the /.. occurance after {@docRoot} tag.
if (textTagChange) {
text = text.replaceFirst("/..", "");
textTagChange = false;
}
//This is just a regular text tag. The text may contain html links (<a>)
//or inline tag {@docRoot}, which will be handled as special cases.
String text = redirectRelativeLinks(tagelem.holder(), tagelem.text());
text = redirectRelativeLinks(tagelem.holder(), text);
// Replace @docRoot only if not represented by an instance of DocRootTaglet,
// that is, only if it was not present in a source file doc comment.

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2011, 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
@ -93,7 +93,7 @@ public class PackageFrameWriter extends HtmlDocletWriter {
packgen = new PackageFrameWriter(configuration, packageDoc);
String pkgName = Util.getPackageName(packageDoc);
Content body = packgen.getBody(false, packgen.getWindowTitle(pkgName));
Content pkgNameContent = new StringContent(pkgName);
Content pkgNameContent = new RawHtml(pkgName);
Content heading = HtmlTree.HEADING(HtmlConstants.TITLE_HEADING, HtmlStyle.bar,
packgen.getTargetPackageLink(packageDoc, "classFrame", pkgNameContent));
body.addContent(heading);

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2011, 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
@ -80,7 +80,10 @@ public class PackageIndexFrameWriter extends AbstractPackageIndexWriter {
HtmlTree ul = new HtmlTree(HtmlTag.UL);
ul.addAttr(HtmlAttr.TITLE, packagesLabel.toString());
for(int i = 0; i < packages.length; i++) {
if (packages[i] != null) {
// Do not list the package if -nodeprecated option is set and the
// package is marked as deprecated.
if (packages[i] != null &&
(!(configuration.nodeprecated && Util.isDeprecated(packages[i])))) {
ul.addContent(getPackage(packages[i]));
}
}

@ -137,6 +137,8 @@ public class PackageIndexWriter extends AbstractPackageIndexWriter {
protected void addPackagesList(PackageDoc[] packages, Content tbody) {
for (int i = 0; i < packages.length; i++) {
if (packages[i] != null && packages[i].name().length() > 0) {
if (configuration.nodeprecated && Util.isDeprecated(packages[i]))
continue;
Content packageLinkContent = getPackageLink(packages[i],
getPackageName(packages[i]));
Content tdPackage = HtmlTree.TD(HtmlStyle.colFirst, packageLinkContent);

@ -242,11 +242,16 @@ public class PackageUseWriter extends SubWriterHolderWriter {
*/
protected void addPackageUse(PackageDoc pkg, Content contentTree) throws IOException {
Content tdFirst = HtmlTree.TD(HtmlStyle.colFirst,
getHyperLink("", pkg.name(), new StringContent(Util.getPackageName(pkg))));
getHyperLink("", Util.getPackageName(pkg),
new RawHtml(Util.getPackageName(pkg))));
contentTree.addContent(tdFirst);
HtmlTree tdLast = new HtmlTree(HtmlTag.TD);
tdLast.addStyle(HtmlStyle.colLast);
addSummaryComment(pkg, tdLast);
if (pkg != null && pkg.name().length() != 0) {
addSummaryComment(pkg, tdLast);
} else {
tdLast.addContent(getSpace());
}
contentTree.addContent(tdLast);
}

@ -114,11 +114,12 @@ public class PackageWriterImpl extends HtmlDocletWriter
Content packageHead = new RawHtml(heading);
tHeading.addContent(packageHead);
div.addContent(tHeading);
addDeprecationInfo(div);
if (packageDoc.inlineTags().length > 0 && ! configuration.nocomment) {
HtmlTree subTitleDiv = new HtmlTree(HtmlTag.DIV);
subTitleDiv.addStyle(HtmlStyle.subTitle);
addSummaryComment(packageDoc, subTitleDiv);
div.addContent(subTitleDiv);
HtmlTree docSummaryDiv = new HtmlTree(HtmlTag.DIV);
docSummaryDiv.addStyle(HtmlStyle.docSummary);
addSummaryComment(packageDoc, docSummaryDiv);
div.addContent(docSummaryDiv);
Content space = getSpace();
Content descLink = getHyperLink("", "package_description",
descriptionLabel, "", "");
@ -138,6 +139,28 @@ public class PackageWriterImpl extends HtmlDocletWriter
return div;
}
/**
* Add the package deprecation information to the documentation tree.
*
* @param div the content tree to which the deprecation information will be added
*/
public void addDeprecationInfo(Content div) {
Tag[] deprs = packageDoc.tags("deprecated");
if (Util.isDeprecated(packageDoc)) {
HtmlTree deprDiv = new HtmlTree(HtmlTag.DIV);
deprDiv.addStyle(HtmlStyle.deprecatedContent);
Content deprPhrase = HtmlTree.SPAN(HtmlStyle.strong, deprecatedPhrase);
deprDiv.addContent(deprPhrase);
if (deprs.length > 0) {
Tag[] commentTags = deprs[0].inlineTags();
if (commentTags.length > 0) {
addInlineDeprecatedComment(packageDoc, deprs[0], deprDiv);
}
}
div.addContent(deprDiv);
}
}
/**
* {@inheritDoc}
*/

@ -82,12 +82,20 @@ public class SourceToHTMLConverter {
}
PackageDoc[] pds = rd.specifiedPackages();
for (int i = 0; i < pds.length; i++) {
convertPackage(configuration, pds[i], outputdir);
// If -nodeprecated option is set and the package is marked as deprecated,
// do not convert the package files to HTML.
if (!(configuration.nodeprecated && Util.isDeprecated(pds[i])))
convertPackage(configuration, pds[i], outputdir);
}
ClassDoc[] cds = rd.specifiedClasses();
for (int i = 0; i < cds.length; i++) {
convertClass(configuration, cds[i],
getPackageOutputDir(outputdir, cds[i].containingPackage()));
// If -nodeprecated option is set and the class is marked as deprecated
// or the containing package is deprecated, do not convert the
// package files to HTML.
if (!(configuration.nodeprecated &&
(Util.isDeprecated(cds[i]) || Util.isDeprecated(cds[i].containingPackage()))))
convertClass(configuration, cds[i],
getPackageOutputDir(outputdir, cds[i].containingPackage()));
}
}
@ -106,7 +114,12 @@ public class SourceToHTMLConverter {
String classOutputdir = getPackageOutputDir(outputdir, pd);
ClassDoc[] cds = pd.allClasses();
for (int i = 0; i < cds.length; i++) {
convertClass(configuration, cds[i], classOutputdir);
// If -nodeprecated option is set and the class is marked as deprecated,
// do not convert the package files to HTML. We do not check for
// containing package deprecation since it is already check in
// the calling method above.
if (!(configuration.nodeprecated && Util.isDeprecated(cds[i])))
convertClass(configuration, cds[i], classOutputdir);
}
}

@ -1,5 +1,5 @@
/*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2011, 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
@ -59,7 +59,10 @@ public class TagletWriterImpl extends TagletWriter {
* {@inheritDoc}
*/
public TagletOutput getDocRootOutput() {
return new TagletOutputImpl(htmlWriter.relativepathNoSlash);
if (htmlWriter.configuration.docrootparent.length() > 0)
return new TagletOutputImpl(htmlWriter.configuration.docrootparent);
else
return new TagletOutputImpl(htmlWriter.relativepathNoSlash);
}
/**

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2011, 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
@ -132,7 +132,11 @@ public class TreeWriter extends AbstractTreeWriter {
HtmlTree ul = new HtmlTree(HtmlTag.UL);
ul.addStyle(HtmlStyle.horizontal);
for (int i = 0; i < packages.length; i++) {
if (packages[i].name().length() == 0) {
// If the package name length is 0 or if -nodeprecated option
// is set and the package is marked as deprecated, do not include
// the page in the list of package hierarchies.
if (packages[i].name().length() == 0 ||
(configuration.nodeprecated && Util.isDeprecated(packages[i]))) {
continue;
}
String link = pathString(packages[i], "package-tree.html");

@ -1,5 +1,5 @@
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2010, 2011, 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
@ -46,6 +46,7 @@ public enum HtmlStyle {
contentContainer,
description,
details,
docSummary,
header,
horizontal,
footer,
@ -67,6 +68,7 @@ public enum HtmlStyle {
subNavList,
subTitle,
summary,
deprecatedContent,
tabEnd,
title,
topNav;

@ -68,6 +68,7 @@ doclet.see.class_or_package_not_accessible=Tag {0}: reference not accessible: {1
doclet.see.malformed_tag=Tag {0}: Malformed: {1}
doclet.Inherited_API_Summary=Inherited API Summary
doclet.Deprecated_API=Deprecated API
doclet.Deprecated_Packages=Deprecated Packages
doclet.Deprecated_Classes=Deprecated Classes
doclet.Deprecated_Enums=Deprecated Enums
doclet.Deprecated_Interfaces=Deprecated Interfaces
@ -79,6 +80,7 @@ doclet.Deprecated_Constructors=Deprecated Constructors
doclet.Deprecated_Methods=Deprecated Methods
doclet.Deprecated_Enum_Constants=Deprecated Enum Constants
doclet.Deprecated_Annotation_Type_Members=Deprecated Annotation Type Elements
doclet.deprecated_packages=deprecated packages
doclet.deprecated_classes=deprecated classes
doclet.deprecated_enums=deprecated enums
doclet.deprecated_interfaces=deprecated interfaces
@ -245,6 +247,7 @@ doclet.usage=Provided by Standard doclet:\n\
-tag <name>:<locations>:<header> Specify single argument custom tags\n\
-taglet The fully qualified name of Taglet to register\n\
-tagletpath The path to Taglets\n\
-Xdocrootparent <url> Replaces all appearances of @docRoot followed by /.. in doc comments with <url>\n\
-charset <charset> Charset for cross-platform viewing of generated documentation.\n\
-helpfile <file> Include file that help link links to\n\
-linksource Generate source in HTML\n\

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2011, 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
@ -419,7 +419,7 @@ public abstract class Configuration {
docencoding = encoding;
}
classDocCatalog = new ClassDocCatalog(root.specifiedClasses());
classDocCatalog = new ClassDocCatalog(root.specifiedClasses(), this);
initTagletManager(customTagStrs);
}
@ -677,15 +677,18 @@ public abstract class Configuration {
}
/**
* Return true if the doc element is getting documented, depending upon
* -nodeprecated option and @deprecated tag used. Return true if
* -nodeprecated is not used or @deprecated tag is not used.
* Return true if the ClassDoc element is getting documented, depending upon
* -nodeprecated option and the deprecation information. Return true if
* -nodeprecated is not used. Return false if -nodeprecated is used and if
* either ClassDoc element is deprecated or the containing package is deprecated.
*
* @param cd the ClassDoc for which the page generation is checked
*/
public boolean isGeneratedDoc(Doc doc) {
public boolean isGeneratedDoc(ClassDoc cd) {
if (!nodeprecated) {
return true;
}
return (doc.tags("deprecated")).length == 0;
return !(Util.isDeprecated(cd) || Util.isDeprecated(cd.containingPackage()));
}
/**

@ -2,17 +2,10 @@
/*
Overall document style
*/
* {
margin:0;
padding:0;
}
body {
font-family:Helvetica, Arial, sans-serif;
color:#000000;
}
p {
margin:20px 0;
}
pre {
font-size:1.0em;
}
@ -30,35 +23,18 @@ h4 {
}
ul {
margin:10px 0 10px 20px;
}
li {
list-style:disc;
}
dl dt {
font-size:0.95em;
font-weight:bold;
margin:10px 0 0 0;
}
dl dd {
margin:10px 0 10px 20px;
}
dl dd ul {
margin-left:0;
}
dl dd ul li {
list-style:none;
margin:10px 0 10px 0;
list-style-type:disc;
}
caption {
background: #CCCCFF;
color:#000000;
text-align: left;
font-size: 150%;
font-weight: bold;
border-left: 2px ridge;
border-right: 2px ridge;
border-top: 2px ridge;
padding-left: 5px;
text-align:left;
font-size:150%;
font-weight:bold;
border-left:2px ridge;
border-right:2px ridge;
border-top:2px ridge;
padding-left:5px;
width:auto;
}
/*
@ -70,11 +46,11 @@ Document title and Copyright styles
color:#000000;
}
.legalCopy {
margin:7px;
margin:7px 0;
}
.bar {
font-size:1em;
margin:10px 0 0 10px;
margin:10px 0 0 2px;
}
.bar a {
font-weight:normal;
@ -84,24 +60,21 @@ Navigation bar styles
*/
.topNav {
border-top:2px solid #C0C0C0;
margin:7px;
padding:7px 0;
height:2.8em;
width:99%;
width:100%;
min-width:600px;
}
.bottomNav {
border-top:2px solid #C0C0C0;
margin:7px;
padding:7px 0;
height:2.8em;
width:99%;
width:100%;
}
.subNav {
border-bottom:2px solid #C0C0C0;
float:left;
width:99%;
margin:7px;
width:100%;
min-width:600px;
}
.subNav div {
@ -120,7 +93,7 @@ Navigation bar styles
/* Navigation bar list styles */
.topNav ul.navList, .bottomNav ul.navList {
background-color:#EEEEFF;
padding:7px 5px;
padding:4px 4px;
margin:0;
float:left;
width:80%;
@ -128,7 +101,7 @@ Navigation bar styles
ul.navList li{
list-style:none;
float:left;
padding:3px 4px;
padding:0 4px;
color:#000000;
font-size:0.98em;
}
@ -142,14 +115,16 @@ ul.navList li.navBarCell1Rev {
.subNav ul.navList {
float:left;
margin:0;
padding:0;
font-size:0.8em;
width:350px;
}
ul.subNavList {
float:left;
margin:0;
font-size:0.8em;
width:350px;
margin:0;
padding:0;
}
ul.subNavList li{
list-style:none;
@ -161,16 +136,16 @@ Page header and footer styles
*/
.header, .footer {
clear:both;
margin:0 7px;
padding:10px 0;
}
.indexHeader {
font-size:0.9em;
margin:10px 0 7px 10px;
margin:10px 0 0 2px;
}
.header ul {
padding-left:20px;
}
/* Header and footer title styles */
/* Header and footer title styles */
.header h1.title {
font-size:1.4em;
text-align:center;
@ -181,7 +156,16 @@ Page header and footer styles
margin:0;
}
.subTitle {
padding-top:10px;
}
/*
Content styles
*/
.deprecatedContent {
margin:0;
padding:10px 0;
}
.docSummary {
padding-top:10px;
}
/*
@ -190,11 +174,11 @@ Page layout container styles
.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer,
.constantValuesContainer {
clear:both;
padding:10px 10px;
position:relative;
padding-bottom:20px;
}
.indexContainer {
padding:0 0 10px 10px;
padding:0 0 0 2px;
font-size:0.9em;
}
/*
@ -221,7 +205,8 @@ Heading styles
.indexContainer h2 {
font-weight:normal;
font-size:1.0em;
padding:10px 0 0 0;
padding:5px 0 0 0;
margin:10px 0 0 0;
}
.contentContainer h2 {
margin:10px 0;
@ -263,7 +248,7 @@ div.summary ul.blockList ul.blockList li.blockList h3 {
background:#CCCCFF;
border:0;
border:2px ridge;
padding-left:5px;
margin:0;
}
div.summary ul.blockList ul.blockList ul.blockList li.blockList h3 {
background:#EEEEFF;
@ -274,23 +259,22 @@ div.details ul.blockList ul.blockList ul.blockList li.blockList h4,
div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 {
font-size:1.15em;
font-weight:bold;
padding:0 0 10px 0;
padding:0 0 5px 0;
margin:0;
}
/*
Table styles
*/
.contentContainer table {
border-collapse: collapse ;
border-collapse:collapse ;
width:100%;
}
.contentContainer table td, .contentContainer table th {
border:2px ridge;
padding:3px;
}
/* Constant values page table styles */
.constantValuesContainer table {
border-collapse: collapse ;
margin:0 0 10px 0;
border-collapse:collapse;
}
.constantValuesContainer table caption{
font-size:0.95em;
@ -303,12 +287,9 @@ Table styles
}
/* Class-use/Package-use page table styles */
.classUseContainer table {
border-collapse: collapse ;
border-collapse:collapse ;
width:100%;
margin:0 0 15px 0;
}
.classUseContainer ul li ul li table {
margin-bottom:30px;
margin:0 0 10px 0;
}
.classUseContainer ul li ul li table caption{
font-size:0.95em;
@ -365,6 +346,7 @@ ul.horizontal li {
/* Container specific list styles */
.indexContainer ul {
margin:0;
padding:0;
}
.indexContainer ul li {
list-style:none;
@ -376,6 +358,7 @@ ul.horizontal li {
list-style:none;
border:0;
border-bottom:2px ridge;
height:1%;
}
.serializedFormContainer ul.blockList li.blockList ul.blockList li.blockList ul.blockList li.blockList ul.blockList li.blockListLast {
list-style:none;
@ -395,6 +378,7 @@ ul.blockList ul.blockList ul.blockList li.blockList {
div.details ul.blockList ul.blockList ul.blockList li.blockList {
border:0;
border-bottom:2px ridge;
height:1%;
}
/* Definition list styles */
ul.blockList li.blockList dl{
@ -413,9 +397,17 @@ dl.nameValue dt, dl.nameValue dd{
ul.blockList li.blockList pre{
margin:0 0 15px 0;
}
.description dl dt {
font-size:0.95em;
font-weight:bold;
margin:5px 0 0 0;
}
.description dl dd {
margin:10px 0 10px 20px;
}
/* List content styles */
ul.blockList li.blockList ul.blockList li.blockList pre{
margin:10px 0 15px 0;
margin:10px 0 10px 0;
}
ul.blockList li.blockList ul.blockList li.blockList ul.blockList li.blockList pre,
ul.blockList li.blockList ul.blockList li.blockList ul.blockListLast li.blockList pre{

@ -1,5 +1,5 @@
/*
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2011, 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
@ -44,13 +44,6 @@ public class DeprecatedTaglet extends BaseTaglet{
name = "deprecated";
}
/**
* {@inheritDoc}
*/
public boolean inPackage() {
return false;
}
/**
* {@inheritDoc}
*/

@ -1,5 +1,5 @@
/*
* Copyright (c) 2001, 2008, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2001, 2011, 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
@ -25,8 +25,9 @@
package com.sun.tools.doclets.internal.toolkit.util;
import com.sun.javadoc.*;
import java.util.*;
import com.sun.javadoc.*;
import com.sun.tools.doclets.internal.toolkit.Configuration;
/**
* This class acts as an artificial PackageDoc for classes specified
@ -88,13 +89,16 @@ import java.util.*;
*/
private Map<String,Set<ClassDoc>> interfaces;
private Configuration configuration;
/**
* Construct a new ClassDocCatalog.
*
* @param classdocs the array of ClassDocs to catalog
*/
public ClassDocCatalog (ClassDoc[] classdocs) {
public ClassDocCatalog (ClassDoc[] classdocs, Configuration config) {
init();
this.configuration = config;
for (int i = 0; i < classdocs.length; i++) {
addClassDoc(classdocs[i]);
}
@ -151,9 +155,10 @@ import java.util.*;
private void addClass(ClassDoc classdoc, Map<String,Set<ClassDoc>> map) {
PackageDoc pkg = classdoc.containingPackage();
if (pkg.isIncluded()) {
//No need to catalog this class since it's package is
//included on the command line
if (pkg.isIncluded() || (configuration.nodeprecated && Util.isDeprecated(pkg))) {
//No need to catalog this class if it's package is
//included on the command line or if -nodeprecated option is set
// and the containing package is marked as deprecated.
return;
}
String key = Util.getPackageName(pkg);

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998, 2008, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2011, 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
@ -122,8 +122,12 @@ public class ClassTree {
*/
private void buildTree(ClassDoc[] classes, Configuration configuration) {
for (int i = 0; i < classes.length; i++) {
// In the tree page (e.g overview-tree.html) do not include
// information of classes which are deprecated or are a part of a
// deprecated package.
if (configuration.nodeprecated &&
classes[i].tags("deprecated").length > 0) {
(Util.isDeprecated(classes[i]) ||
Util.isDeprecated(classes[i].containingPackage()))) {
continue;
}
if (classes[i].isEnum()) {

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998, 2008, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2011, 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
@ -27,27 +27,29 @@ package com.sun.tools.doclets.internal.toolkit.util;
import com.sun.javadoc.*;
import java.util.*;
import com.sun.tools.doclets.internal.toolkit.Configuration;
/**
* Build list of all the deprecated classes, constructors, fields and methods.
* Build list of all the deprecated packages, classes, constructors, fields and methods.
*
* @author Atul M Dambalkar
*/
public class DeprecatedAPIListBuilder {
public static final int NUM_TYPES = 11;
public static final int NUM_TYPES = 12;
public static final int INTERFACE = 0;
public static final int CLASS = 1;
public static final int ENUM = 2;
public static final int EXCEPTION = 3;
public static final int ERROR = 4;
public static final int ANNOTATION_TYPE = 5;
public static final int FIELD = 6;
public static final int METHOD = 7;
public static final int CONSTRUCTOR = 8;
public static final int ENUM_CONSTANT = 9;
public static final int ANNOTATION_TYPE_MEMBER = 10;
public static final int PACKAGE = 0;
public static final int INTERFACE = 1;
public static final int CLASS = 2;
public static final int ENUM = 3;
public static final int EXCEPTION = 4;
public static final int ERROR = 5;
public static final int ANNOTATION_TYPE = 6;
public static final int FIELD = 7;
public static final int METHOD = 8;
public static final int CONSTRUCTOR = 9;
public static final int ENUM_CONSTANT = 10;
public static final int ANNOTATION_TYPE_MEMBER = 11;
/**
* List of deprecated type Lists.
@ -58,25 +60,33 @@ public class DeprecatedAPIListBuilder {
/**
* Constructor.
*
* @param root Root of the tree.
* @param configuration the current configuration of the doclet
*/
public DeprecatedAPIListBuilder(RootDoc root) {
public DeprecatedAPIListBuilder(Configuration configuration) {
deprecatedLists = new ArrayList<List<Doc>>();
for (int i = 0; i < NUM_TYPES; i++) {
deprecatedLists.add(i, new ArrayList<Doc>());
}
buildDeprecatedAPIInfo(root);
buildDeprecatedAPIInfo(configuration);
}
/**
* Build the sorted list of all the deprecated APIs in this run.
* Build separate lists for deprecated classes, constructors, methods and
* fields.
* Build separate lists for deprecated packages, classes, constructors,
* methods and fields.
*
* @param root Root of the tree.
* @param configuration the current configuration of the doclet.
*/
private void buildDeprecatedAPIInfo(RootDoc root) {
ClassDoc[] classes = root.classes();
private void buildDeprecatedAPIInfo(Configuration configuration) {
PackageDoc[] packages = configuration.packages;
PackageDoc pkg;
for (int c = 0; c < packages.length; c++) {
pkg = packages[c];
if (Util.isDeprecated(pkg)) {
getList(PACKAGE).add(pkg);
}
}
ClassDoc[] classes = configuration.root.classes();
for (int i = 0; i < classes.length; i++) {
ClassDoc cd = classes[i];
if (Util.isDeprecated(cd)) {
@ -90,7 +100,7 @@ public class DeprecatedAPIListBuilder {
getList(ENUM).add(cd);
} else if (cd.isError()) {
getList(ERROR).add(cd);
}else if (cd.isAnnotationType()) {
} else if (cd.isAnnotationType()) {
getList(ANNOTATION_TYPE).add(cd);
}
}
@ -102,7 +112,7 @@ public class DeprecatedAPIListBuilder {
}
if (cd.isAnnotationType()) {
composeDeprecatedList(getList(ANNOTATION_TYPE_MEMBER),
((AnnotationTypeDoc) cd).elements());
((AnnotationTypeDoc) cd).elements());
}
}
sortDeprecatedLists();

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998, 2008, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2011, 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
@ -207,7 +207,17 @@ public class IndexBuilder {
* Should this doc element be added to the index map?
*/
protected boolean shouldAddToIndexMap(Doc element) {
return !(noDeprecated && element.tags("deprecated").length > 0);
if (element instanceof PackageDoc)
// Do not add to index map if -nodeprecated option is set and the
// package is marked as deprecated.
return !(noDeprecated && Util.isDeprecated(element));
else
// Do not add to index map if -nodeprecated option is set and if the
// Doc is marked as deprecated or the containing package is marked as
// deprecated.
return !(noDeprecated &&
(Util.isDeprecated(element) ||
Util.isDeprecated(((ProgramElementDoc)element).containingPackage())));
}
/**

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998, 2003, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2011, 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
@ -76,13 +76,16 @@ public class PackageListWriter extends PrintWriter {
protected void generatePackageListFile(RootDoc root) {
PackageDoc[] packages = configuration.packages;
String[] names = new String[packages.length];
ArrayList<String> names = new ArrayList<String>();
for (int i = 0; i < packages.length; i++) {
names[i] = packages[i].name();
// if the -nodeprecated option is set and the package is marked as
// deprecated, do not include it in the packages list.
if (!(configuration.nodeprecated && Util.isDeprecated(packages[i])))
names.add(packages[i].name());
}
Arrays.sort(names);
for (int i = 0; i < packages.length; i++) {
println(names[i]);
Collections.sort(names);
for (int i = 0; i < names.size(); i++) {
println(names.get(i));
}
}
}

@ -861,11 +861,15 @@ public class Util {
* @param doc the Doc to check.
* @return true if the given Doc is deprecated.
*/
public static boolean isDeprecated(ProgramElementDoc doc) {
public static boolean isDeprecated(Doc doc) {
if (doc.tags("deprecated").length > 0) {
return true;
}
AnnotationDesc[] annotationDescList = doc.annotations();
AnnotationDesc[] annotationDescList;
if (doc instanceof PackageDoc)
annotationDescList = ((PackageDoc)doc).annotations();
else
annotationDescList = ((ProgramElementDoc)doc).annotations();
for (int i = 0; i < annotationDescList.length; i++) {
if (annotationDescList[i].annotationType().qualifiedName().equals(
java.lang.Deprecated.class.getName())){

@ -1,5 +1,5 @@
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 2011, 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
@ -34,11 +34,13 @@ import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.DeclaredType;
import javax.lang.model.type.TypeKind;
import javax.lang.model.type.TypeMirror;
import javax.tools.Diagnostic;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import com.sun.source.tree.CatchTree;
import com.sun.source.tree.CompilationUnitTree;
import com.sun.source.tree.Scope;
import com.sun.source.tree.Tree;
@ -49,7 +51,7 @@ import com.sun.tools.javac.code.Flags;
import com.sun.tools.javac.code.Symbol.ClassSymbol;
import com.sun.tools.javac.code.Symbol.TypeSymbol;
import com.sun.tools.javac.code.Symbol;
import com.sun.tools.javac.code.Type;
import com.sun.tools.javac.code.Type.UnionClassType;
import com.sun.tools.javac.comp.Attr;
import com.sun.tools.javac.comp.AttrContext;
import com.sun.tools.javac.comp.Enter;
@ -430,4 +432,16 @@ public class JavacTrees extends Trees {
log.useSource(oldSource);
}
}
@Override
public TypeMirror getLub(CatchTree tree) {
JCCatch ct = (JCCatch) tree;
JCVariableDecl v = ct.param;
if (v.type != null && v.type.getKind() == TypeKind.UNION) {
UnionClassType ut = (UnionClassType) v.type;
return ut.getLub();
} else {
return v.type;
}
}
}

@ -649,7 +649,7 @@ public class Scope {
public Iterator<Symbol> iterator() {
return new CompoundScopeIterator(subScopes) {
Iterator<Symbol> nextIterator(Scope s) {
return s.getElements().iterator();
return s.getElements(sf).iterator();
}
};
}

@ -186,6 +186,9 @@ public enum Source {
public boolean allowSimplifiedVarargs() {
return compareTo(JDK1_7) >= 0;
}
public boolean allowObjectToPrimitiveCast() {
return compareTo(JDK1_7) >= 0;
}
public static SourceVersion toSourceVersion(Source source) {
switch(source) {
case JDK1_2:

@ -25,6 +25,8 @@
package com.sun.tools.javac.code;
import java.util.Collections;
import com.sun.tools.javac.util.*;
import com.sun.tools.javac.code.Symbol.*;
@ -741,6 +743,38 @@ public class Type implements PrimitiveType {
}
}
// a clone of a ClassType that knows about the alternatives of a union type.
public static class UnionClassType extends ClassType implements UnionType {
final List<? extends Type> alternatives_field;
public UnionClassType(ClassType ct, List<? extends Type> alternatives) {
super(ct.outer_field, ct.typarams_field, ct.tsym);
allparams_field = ct.allparams_field;
supertype_field = ct.supertype_field;
interfaces_field = ct.interfaces_field;
all_interfaces_field = ct.interfaces_field;
alternatives_field = alternatives;
}
public Type getLub() {
return tsym.type;
}
public java.util.List<? extends TypeMirror> getAlternatives() {
return Collections.unmodifiableList(alternatives_field);
}
@Override
public TypeKind getKind() {
return TypeKind.UNION;
}
@Override
public <R, P> R accept(TypeVisitor<R, P> v, P p) {
return v.visitUnion(this, p);
}
}
public static class ArrayType extends Type
implements javax.lang.model.type.ArrayType {

@ -74,8 +74,9 @@ public class Types {
final JavacMessages messages;
final Names names;
final boolean allowBoxing;
final boolean allowCovariantReturns;
final boolean allowObjectToPrimitiveCast;
final ClassReader reader;
final Source source;
final Check chk;
List<Warner> warnStack = List.nil();
final Name capturedName;
@ -92,9 +93,11 @@ public class Types {
context.put(typesKey, this);
syms = Symtab.instance(context);
names = Names.instance(context);
allowBoxing = Source.instance(context).allowBoxing();
Source source = Source.instance(context);
allowBoxing = source.allowBoxing();
allowCovariantReturns = source.allowCovariantReturns();
allowObjectToPrimitiveCast = source.allowObjectToPrimitiveCast();
reader = ClassReader.instance(context);
source = Source.instance(context);
chk = Check.instance(context);
capturedName = names.fromString("<captured wildcard>");
messages = JavacMessages.instance(context);
@ -409,6 +412,7 @@ public class Types {
return
s.tag == BOT || s.tag == CLASS ||
s.tag == ARRAY || s.tag == TYPEVAR;
case WILDCARD: //we shouldn't be here - avoids crash (see 7034495)
case NONE:
return false;
default:
@ -949,8 +953,9 @@ public class Types {
return true;
if (t.isPrimitive() != s.isPrimitive())
return allowBoxing && (isConvertible(t, s, warn) || isConvertible(s, t, warn));
return allowBoxing && (
isConvertible(t, s, warn)
|| (allowObjectToPrimitiveCast && isConvertible(s, t, warn)));
if (warn != warnStack.head) {
try {
warnStack = warnStack.prepend(warn);
@ -2309,7 +2314,7 @@ public class Types {
if (elemtype == t.elemtype)
return t;
else
return new ArrayType(elemtype, t.tsym);
return new ArrayType(upperBound(elemtype), t.tsym);
}
@Override
@ -3070,7 +3075,7 @@ public class Types {
if (hasSameArgs(r1, r2))
return covariantReturnType(r1.getReturnType(), r2res, warner);
if (!source.allowCovariantReturns())
if (!allowCovariantReturns)
return false;
if (isSubtypeUnchecked(r1.getReturnType(), r2res, warner))
return true;
@ -3087,7 +3092,7 @@ public class Types {
public boolean covariantReturnType(Type t, Type s, Warner warner) {
return
isSameType(t, s) ||
source.allowCovariantReturns() &&
allowCovariantReturns &&
!t.isPrimitive() &&
!s.isPrimitive() &&
isAssignable(t, s, warner);
@ -3293,7 +3298,7 @@ public class Types {
}
if (giveWarning && !isReifiable(reverse ? from : to))
warn.warn(LintCategory.UNCHECKED);
if (!source.allowCovariantReturns())
if (!allowCovariantReturns)
// reject if there is a common method signature with
// incompatible return types.
chk.checkCompatibleAbstracts(warn.pos(), from, to);
@ -3320,7 +3325,7 @@ public class Types {
Type t2 = to;
if (disjointTypes(t1.getTypeArguments(), t2.getTypeArguments()))
return false;
if (!source.allowCovariantReturns())
if (!allowCovariantReturns)
// reject if there is a common method signature with
// incompatible return types.
chk.checkCompatibleAbstracts(warn.pos(), from, to);

@ -168,11 +168,11 @@ public class Annotate {
}
JCIdent left = (JCIdent)assign.lhs;
Symbol method = rs.resolveQualifiedMethod(left.pos(),
env,
a.type,
left.name,
List.<Type>nil(),
null);
env,
a.type,
left.name,
List.<Type>nil(),
null);
left.sym = method;
left.type = method.type;
if (method.owner != a.type.tsym)
@ -190,6 +190,15 @@ public class Annotate {
Attribute enterAttributeValue(Type expected,
JCExpression tree,
Env<AttrContext> env) {
//first, try completing the attribution value sym - if a completion
//error is thrown, we should recover gracefully, and display an
//ordinary resolution diagnostic.
try {
expected.tsym.complete();
} catch(CompletionFailure e) {
log.error(tree.pos(), "cant.resolve", Kinds.kindName(e.sym), e.sym);
return new Attribute.Error(expected);
}
if (expected.isPrimitive() || types.isSameType(expected, syms.stringType)) {
Type result = attr.attribExpr(tree, env, expected);
if (result.isErroneous())

@ -2910,6 +2910,7 @@ public class Attr extends JCTree.Visitor {
public void visitTypeUnion(JCTypeUnion tree) {
ListBuffer<Type> multicatchTypes = ListBuffer.lb();
ListBuffer<Type> all_multicatchTypes = null; // lazy, only if needed
for (JCExpression typeTree : tree.alternatives) {
Type ctype = attribType(typeTree, env);
ctype = chk.checkType(typeTree.pos(),
@ -2931,9 +2932,23 @@ public class Attr extends JCTree.Visitor {
}
}
multicatchTypes.append(ctype);
if (all_multicatchTypes != null)
all_multicatchTypes.append(ctype);
} else {
if (all_multicatchTypes == null) {
all_multicatchTypes = ListBuffer.lb();
all_multicatchTypes.appendList(multicatchTypes);
}
all_multicatchTypes.append(ctype);
}
}
tree.type = result = check(tree, types.lub(multicatchTypes.toList()), TYP, pkind, pt);
Type t = check(tree, types.lub(multicatchTypes.toList()), TYP, pkind, pt);
if (t.tag == CLASS) {
List<Type> alternatives =
((all_multicatchTypes == null) ? multicatchTypes : all_multicatchTypes).toList();
t = new UnionClassType((ClassType) t, alternatives);
}
tree.type = result = t;
}
public void visitTypeParameter(JCTypeParameter tree) {

@ -681,6 +681,12 @@ public class Check {
"cant.apply.diamond.1",
t, diags.fragment("diamond.non.generic", t));
return types.createErrorType(t);
} else if (tree.typeargs != null &&
tree.typeargs.nonEmpty()) {
log.error(tree.clazz.pos(),
"cant.apply.diamond.1",
t, diags.fragment("diamond.and.explicit.params", t));
return types.createErrorType(t);
} else {
return t;
}

@ -1153,8 +1153,7 @@ public class Flow extends TreeScanner {
if (chk.subset(exc, caughtInTry)) {
log.error(pos, "except.already.caught", exc);
} else if (!chk.isUnchecked(pos, exc) &&
exc.tsym != syms.throwableType.tsym &&
exc.tsym != syms.exceptionType.tsym &&
!isExceptionOrThrowable(exc) &&
!chk.intersects(exc, thrownInTry)) {
log.error(pos, "except.never.thrown.in.try", exc);
} else if (allowImprovedCatchAnalysis) {
@ -1163,7 +1162,8 @@ public class Flow extends TreeScanner {
// unchecked exception, the result list would not be empty, as the augmented
// thrown set includes { RuntimeException, Error }; if 'exc' was a checked
// exception, that would have been covered in the branch above
if (chk.diff(catchableThrownTypes, caughtInTry).isEmpty()) {
if (chk.diff(catchableThrownTypes, caughtInTry).isEmpty() &&
!isExceptionOrThrowable(exc)) {
String key = catchableThrownTypes.length() == 1 ?
"unreachable.catch" :
"unreachable.catch.1";
@ -1171,6 +1171,12 @@ public class Flow extends TreeScanner {
}
}
}
//where
private boolean isExceptionOrThrowable(Type exc) {
return exc.tsym == syms.throwableType.tsym ||
exc.tsym == syms.exceptionType.tsym;
}
public void visitConditional(JCConditional tree) {
scanCond(tree.cond);

@ -1609,18 +1609,31 @@ public class ClassReader implements Completer {
// type.tsym.flatName() should == proxy.enumFlatName
TypeSymbol enumTypeSym = proxy.enumType.tsym;
VarSymbol enumerator = null;
for (Scope.Entry e = enumTypeSym.members().lookup(proxy.enumerator);
e.scope != null;
e = e.next()) {
if (e.sym.kind == VAR) {
enumerator = (VarSymbol)e.sym;
break;
CompletionFailure failure = null;
try {
for (Scope.Entry e = enumTypeSym.members().lookup(proxy.enumerator);
e.scope != null;
e = e.next()) {
if (e.sym.kind == VAR) {
enumerator = (VarSymbol)e.sym;
break;
}
}
}
catch (CompletionFailure ex) {
failure = ex;
}
if (enumerator == null) {
log.error("unknown.enum.constant",
currentClassFile, enumTypeSym, proxy.enumerator);
result = new Attribute.Error(enumTypeSym.type);
if (failure != null) {
log.warning("unknown.enum.constant.reason",
currentClassFile, enumTypeSym, proxy.enumerator,
failure.getDiagnostic());
} else {
log.warning("unknown.enum.constant",
currentClassFile, enumTypeSym, proxy.enumerator);
}
result = new Attribute.Enum(enumTypeSym.type,
new VarSymbol(0, proxy.enumerator, syms.botType, enumTypeSym));
} else {
result = new Attribute.Enum(enumTypeSym.type, enumerator);
}

@ -479,7 +479,12 @@ public class Code {
state.pop(1);// index
Type a = state.stack[state.stacksize-1];
state.pop(1);
state.push(types.erasure(types.elemtype(a))); }
//sometimes 'null type' is treated as a one-dimensional array type
//see Gen.visitLiteral - we should handle this case accordingly
Type stackType = a.tag == BOT ?
syms.objectType :
types.erasure(types.elemtype(a));
state.push(stackType); }
break;
case goto_:
markDead();

@ -72,11 +72,11 @@ public class JavacTypes implements javax.lang.model.util.Types {
}
public Element asElement(TypeMirror t) {
Type type = cast(Type.class, t);
switch (type.tag) {
case TypeTags.CLASS:
case TypeTags.ERROR:
case TypeTags.TYPEVAR:
switch (t.getKind()) {
case DECLARED:
case ERROR:
case TYPEVAR:
Type type = cast(Type.class, t);
return type.asElement();
default:
return null;

@ -762,9 +762,6 @@ compiler.err.unclosed.comment=\
compiler.err.unclosed.str.lit=\
unclosed string literal
compiler.err.unknown.enum.constant=\
in class file {0}: unknown enum constant {1}.{2}
# 0: name
compiler.err.unsupported.encoding=\
unsupported encoding: {0}
@ -1307,6 +1304,15 @@ compiler.warn.annotation.method.not.found=\
compiler.warn.annotation.method.not.found.reason=\
Cannot find annotation method ''{1}()'' in type ''{0}'': {2}
# 0: symbol, 1: name
compiler.warn.unknown.enum.constant=\
unknown enum constant {1}.{2}
# 0: symbol, 1: name, 2: message segment
compiler.warn.unknown.enum.constant.reason=\
unknown enum constant {1}.{2}\n\
reason: {3}
# 0: type, 1: type
compiler.warn.raw.class.use=\
found raw type: {0}\n\
@ -1618,6 +1624,9 @@ compiler.misc.diamond=\
compiler.misc.diamond.non.generic=\
cannot use ''<>'' with non-generic class {0}
compiler.misc.diamond.and.explicit.params=\
cannot use ''<>'' with explicit type parameters for constructor
# 0: type, 1: list of type
compiler.misc.explicit.param.do.not.conform.to.bounds=\
explicit type argument {0} does not conform to declared bound(s) {1}

@ -266,6 +266,8 @@ com.sun.security.sasl.util = tiger legacy
com.sun.swing.internal.plaf.basic.resources = tiger legacy
com.sun.swing.internal.plaf.metal.resources = tiger legacy
com.sun.swing.internal.plaf.synth.resources = tiger legacy
com.sun.tracing = tiger legacy
com.sun.tracing.dtrace = tiger legacy
java.applet = tiger legacy
java.awt = tiger legacy
java.awt.color = tiger legacy

@ -0,0 +1,101 @@
/*
* Copyright (c) 2011, 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 6553182
* @summary This test verifies the -Xdocrootparent option.
* @author Bhavesh Patel
* @library ../lib/
* @build JavadocTester TestDocRootLink
* @run main TestDocRootLink
*/
public class TestDocRootLink extends JavadocTester {
private static final String BUG_ID = "6553182";
private static final String[][] TEST1 = {
{BUG_ID + FS + "pkg1" + FS + "C1.html",
"<a href=\"../../technotes/guides/index.html\">"
},
{BUG_ID + FS + "pkg1" + FS + "package-summary.html",
"<a href=\"../../technotes/guides/index.html\">"
}
};
private static final String[][] NEGATED_TEST1 = {
{BUG_ID + FS + "pkg1" + FS + "C1.html",
"<a href=\"http://download.oracle.com/javase/7/docs/technotes/guides/index.html\">"
},
{BUG_ID + FS + "pkg1" + FS + "package-summary.html",
"<a href=\"http://download.oracle.com/javase/7/docs/technotes/guides/index.html\">"
}
};
private static final String[][] TEST2 = {
{BUG_ID + FS + "pkg2" + FS + "C2.html",
"<a href=\"http://download.oracle.com/javase/7/docs/technotes/guides/index.html\">"
},
{BUG_ID + FS + "pkg2" + FS + "package-summary.html",
"<a href=\"http://download.oracle.com/javase/7/docs/technotes/guides/index.html\">"
}
};
private static final String[][] NEGATED_TEST2 = {
{BUG_ID + FS + "pkg2" + FS + "C2.html",
"<a href=\"../../technotes/guides/index.html\">"
},
{BUG_ID + FS + "pkg2" + FS + "package-summary.html",
"<a href=\"../../technotes/guides/index.html\">"
}
};
private static final String[] ARGS1 =
new String[]{
"-d", BUG_ID, "-sourcepath", SRC_DIR, "pkg1"
};
private static final String[] ARGS2 =
new String[]{
"-d", BUG_ID, "-Xdocrootparent", "http://download.oracle.com/javase/7/docs", "-sourcepath", SRC_DIR, "pkg2"
};
/**
* The entry point of the test.
* @param args the array of command line arguments.
*/
public static void main(String[] args) {
TestDocRootLink tester = new TestDocRootLink();
run(tester, ARGS1, TEST1, NEGATED_TEST1);
run(tester, ARGS2, TEST2, NEGATED_TEST2);
tester.printSummary();
}
/**
* {@inheritDoc}
*/
public String getBugId() {
return BUG_ID;
}
/**
* {@inheritDoc}
*/
public String getBugName() {
return getClass().getName();
}
}

@ -0,0 +1,31 @@
/*
* Copyright (c) 2011, 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;
/**
* Class 1. This is a test.
* Refer <a href="{@docRoot}/../technotes/guides/index.html">Here</a>. Lets see if this works
* or not.
*/
public class C1 {}

@ -0,0 +1,18 @@
<html>
<head>
<title>javax.management package</title>
</head>
<body bgcolor="white">
This is a test.
<p id="spec">
@see <a href="{@docRoot}/../technotes/guides/index.html">
Test document 1</a>
in particular the
<a href="{@docRoot}/../technotes/guides/index.html">
Test document 2.</a>
@since 1.5
</body>
</html>

@ -0,0 +1,31 @@
/*
* Copyright (c) 2011, 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 pkg2;
/**
* Class 1. This is a test.
* Refer <a href="{@docRoot}/../technotes/guides/index.html">Here</a>. Lets see if this works
* or not.
*/
public class C2 {}

@ -0,0 +1,18 @@
<html>
<head>
<title>javax.management package</title>
</head>
<body bgcolor="white">
This is a test.
<p id="spec">
@see <a href="{@docRoot}/../technotes/guides/index.html">
Test document 1</a>
in particular the
<a href="{@docRoot}/../technotes/guides/index.html">
Test document 2.</a>
@since 1.5
</body>
</html>

@ -1,5 +1,5 @@
/*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2011, 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,20 +23,19 @@
/*
* @test
* @bug 4934778 4777599
* @bug 4934778 4777599 6553182
* @summary Make sure that the -help option works properly. Make sure
* the help link appears in the documentation.
* @author jamieh
* @library ../lib/
* @build JavadocTester
* @build TestHelpOption
* @build JavadocTester TestHelpOption
* @run main TestHelpOption
*/
public class TestHelpOption extends JavadocTester {
//Test information.
private static final String BUG_ID = "4934778-4777599";
private static final String BUG_ID = "4934778-4777599-6553182";
//Javadoc arguments.
private static final String[] ARGS = new String[] {
@ -79,6 +78,7 @@ public class TestHelpOption extends JavadocTester {
{STANDARD_OUTPUT, "-tag "},
{STANDARD_OUTPUT, "-taglet "},
{STANDARD_OUTPUT, "-tagletpath "},
{STANDARD_OUTPUT, "-Xdocrootparent "},
{STANDARD_OUTPUT, "-charset "},
{STANDARD_OUTPUT, "-helpfile "},
{STANDARD_OUTPUT, "-linksource "},

@ -0,0 +1,78 @@
/*
* Copyright (c) 2011, 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 6758050
* @summary Test HTML output for nested generic types.
* @author bpatel
* @library ../lib/
* @build JavadocTester TestNestedGenerics
* @run main TestNestedGenerics
*/
public class TestNestedGenerics extends JavadocTester {
//Test information.
private static final String BUG_ID = "6758050";
//Javadoc arguments.
private static final String[] ARGS = new String[]{
"-d", BUG_ID, "-source", "1.5", "-sourcepath", SRC_DIR,
"pkg"
};
//Input for string search tests.
private static final String[][] TEST = {
{BUG_ID + FS + "pkg" + FS + "NestedGenerics.html",
"<div class=\"block\">Contains <a " +
"href=\"../pkg/NestedGenerics.html#foo(java.util.Map)\"><code>foo" +
"(java.util.Map&lt;A, java.util.Map&lt;A, A&gt;&gt;)</code></a></div>"
}
};
private static final String[][] NEGATED_TEST = NO_TEST;
/**
* The entry point of the test.
* @param args the array of command line arguments.
*/
public static void main(String[] args) {
TestNestedGenerics tester = new TestNestedGenerics();
run(tester, ARGS, TEST, NEGATED_TEST);
tester.printSummary();
}
/**
* {@inheritDoc}
*/
public String getBugId() {
return BUG_ID;
}
/**
* {@inheritDoc}
*/
public String getBugName() {
return getClass().getName();
}
}

@ -0,0 +1,31 @@
/*
* Copyright (c) 2011, 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 pkg;
import java.util.Map;
/** Contains {@link #foo} */
public class NestedGenerics {
public static <A> void foo(Map<A, Map<A, A>> map) {}
}

@ -0,0 +1,55 @@
/*
* Copyright (c) 2011, 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.
*/
/**
* Another test class.
*
* @author Bhavesh Patel
*/
public class C2 {
public static enum ModalExclusionType {
/**
* Test comment.
*/
NO_EXCLUDE,
/**
* Another comment.
*/
APPLICATION_EXCLUDE
};
/**
* A string constant.
*/
public static final String CONSTANT1 = "C2";
/**
* A sample method.
*
* @param param some parameter.
*/
public void method(String param) {
}
}

@ -0,0 +1,34 @@
/*
* Copyright (c) 2011, 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.util.*;
/**
* Test Deprecated class
* @deprecated This class is Deprecated.
*/
public class FooDepr {
public void method(Vector<Object> o){}
}

@ -0,0 +1,103 @@
/*
* Copyright (c) 2011, 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 6492694
* @summary Test package deprecation.
* @author bpatel
* @library ../lib/
* @build JavadocTester TestPackageDeprecation
* @run main TestPackageDeprecation
*/
public class TestPackageDeprecation extends JavadocTester {
//Test information.
private static final String BUG_ID = "6492694";
//Javadoc arguments.
private static final String[] ARGS1 = new String[]{
"-d", BUG_ID + "-1", "-source", "1.5", "-sourcepath", SRC_DIR, "-use", "pkg", "pkg1",
SRC_DIR + FS + "C2.java", SRC_DIR + FS + "FooDepr.java"
};
private static final String[] ARGS2 = new String[]{
"-d", BUG_ID + "-2", "-source", "1.5", "-sourcepath", SRC_DIR, "-use", "-nodeprecated",
"pkg", "pkg1", SRC_DIR + FS + "C2.java", SRC_DIR + FS + "FooDepr.java"
};
//Input for string search tests.
private static final String[][] TEST1 = {
{BUG_ID + "-1" + FS + "pkg1" + FS + "package-summary.html",
"<div class=\"deprecatedContent\"><span class=\"strong\">Deprecated.</span>" + NL +
"<div class=\"block\"><i>This package is Deprecated.</i></div>"
},
{BUG_ID + "-1" + FS + "deprecated-list.html",
"<li><a href=\"#package\">Deprecated Packages</a></li>"
}
};
private static final String[][] TEST2 = NO_TEST;
private static final String[][] NEGATED_TEST1 = NO_TEST;
private static final String[][] NEGATED_TEST2 = {
{BUG_ID + "-2" + FS + "overview-summary.html", "pkg1"},
{BUG_ID + "-2" + FS + "allclasses-frame.html", "FooDepr"}
};
/**
* The entry point of the test.
* @param args the array of command line arguments.
*/
public static void main(String[] args) {
TestPackageDeprecation tester = new TestPackageDeprecation();
run(tester, ARGS1, TEST1, NEGATED_TEST1);
run(tester, ARGS2, TEST2, NEGATED_TEST2);
if ((new java.io.File(BUG_ID + "-2" + FS + "pkg1" + FS +
"package-summary.html")).exists()) {
throw new Error("Test Fails: packages summary should not be" +
"generated for deprecated package.");
} else {
System.out.println("Test passes: package-summary.html not found.");
}
if ((new java.io.File(BUG_ID + "-2" + FS + "FooDepr.html")).exists()) {
throw new Error("Test Fails: FooDepr should not be" +
"generated as it is deprecated.");
} else {
System.out.println("Test passes: FooDepr.html not found.");
}
tester.printSummary();
}
/**
* {@inheritDoc}
*/
public String getBugId() {
return BUG_ID;
}
/**
* {@inheritDoc}
*/
public String getBugName() {
return getClass().getName();
}
}

@ -0,0 +1,35 @@
/*
* Copyright (c) 2011, 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 pkg;
public class A {
/** Test constant. */
public static final String DEMO= "y";
public static final String THIS_IS_OK= "(x)";
public String DEMO_STRING = "<Hello World>";
public A() {
}
}

@ -0,0 +1,31 @@
/*
* Copyright (c) 2011, 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;
public class ClassUseTest1 <T extends Foo & Foo2> {
public <T extends Foo & Foo2> T method(T t) {
return null;
}
}

@ -0,0 +1,36 @@
/*
* Copyright (c) 2011, 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;
import java.util.*;
/**
* Test Deprecated class
* @deprecated This class is Deprecated.
*/
public class Foo {
public void method(Vector<Object> o){}
}

@ -0,0 +1,26 @@
/*
* Copyright (c) 2011, 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;
public interface Foo2 {}

@ -0,0 +1,28 @@
/*
* Copyright (c) 2011, 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 pkg1 used.
* @deprecated This package is Deprecated.
*/
package pkg1;

@ -1,5 +1,5 @@
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 2011, 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,19 +23,18 @@
/*
* @test
* @bug 4494033
* @bug 4494033 7028815
* @summary Run tests on doclet stylesheet.
* @author jamieh
* @library ../lib/
* @build JavadocTester
* @build TestStylesheet
* @build JavadocTester TestStylesheet
* @run main TestStylesheet
*/
public class TestStylesheet extends JavadocTester {
//Test information.
private static final String BUG_ID = "4494033";
private static final String BUG_ID = "4494033-7028815";
//Javadoc arguments.
private static final String[] ARGS = new String[] {
@ -56,15 +55,18 @@ public class TestStylesheet extends JavadocTester {
"body {" + NL + " font-family:Helvetica, Arial, sans-serif;" + NL +
" color:#000000;" + NL + "}"},
{BUG_ID + FS + "stylesheet.css",
"dl dd ul li {" + NL + " list-style:none;" + NL +
" margin:10px 0 10px 0;" + NL + "}"},
"ul {" + NL + " margin:10px 0 10px 20px;" + NL +
" list-style-type:disc;" + NL + "}"},
// Test whether a link to the stylesheet file is inserted properly
// in the class documentation.
{BUG_ID + FS + "pkg" + FS + "A.html",
"<link rel=\"stylesheet\" type=\"text/css\" " +
"href=\"../stylesheet.css\" title=\"Style\">"}
};
private static final String[][] NEGATED_TEST = NO_TEST;
private static final String[][] NEGATED_TEST = {
{BUG_ID + FS + "stylesheet.css",
"* {" + NL + " margin:0;" + NL + " padding:0;" + NL + "}"}
};
/**
* The entry point of the test.

@ -37,8 +37,7 @@ public class TestSubTitle extends JavadocTester {
private static final String BUG_ID = "7010342";
private static final String[][] TEST = {
{BUG_ID + FS + "pkg" + FS + "package-summary.html",
"<div class=\"subTitle\">" + NL + "<div class=\"block\">This is the " +
"description of package pkg.</div>" + NL + "</div>"
"<div class=\"block\">This is the description of package pkg.</div>"
},
{BUG_ID + FS + "pkg" + FS + "C.html",
"<div class=\"subTitle\">pkg</div>"

@ -1,9 +1,9 @@
/*
* @test /nodynamiccopyright/
* @bug 6558548
* @bug 6558548 7039937
* @summary The compiler needs to be aligned with clarified specification of throws
* @compile/fail/ref=T6558548_latest.out -XDrawDiagnostics T6558548.java
* @compile/fail/ref=T6558548_6.out -source 6 -XDrawDiagnostics T6558548.java
* @compile/fail/ref=T6558548_6.out -source 6 -Xlint:-options -XDrawDiagnostics T6558548.java
*/
class T6558548 {
@ -12,7 +12,7 @@ class T6558548 {
void checked() throws InterruptedException {}
void runtime() throws IllegalArgumentException {}
void m1() {
void m1a() {
try {
throw new java.io.FileNotFoundException();
}
@ -20,7 +20,7 @@ class T6558548 {
catch(java.io.IOException exc) { } // 6: ok; latest: unreachable
}
void m1a() {
void m1b() {
try {
throw new java.io.IOException();
}
@ -28,11 +28,20 @@ class T6558548 {
catch(java.io.IOException exc) { } //ok
}
void m2() {
void m1c() {
try {
nothing();
throw new java.io.FileNotFoundException();
}
catch(Exception exc) { } // ok
catch(java.io.FileNotFoundException exc) { }
catch(Exception ex) { } //ok (Exception/Throwable always allowed)
}
void m1d() {
try {
throw new java.io.FileNotFoundException();
}
catch(java.io.FileNotFoundException exc) { }
catch(Throwable ex) { } //ok (Exception/Throwable always allowed)
}
void m3() {
@ -131,7 +140,7 @@ class T6558548 {
runtime();
}
catch(RuntimeException exc) { }
catch(Exception exc) { } //6: ok; latest: unreachable
catch(Exception exc) { } //6: ok; latest: ok (Exception/Throwable always allowed)
}
void m17() {
@ -139,7 +148,7 @@ class T6558548 {
nothing();
}
catch(RuntimeException exc) { }
catch(Exception exc) { } //6: ok; latest: unreachable
catch(Exception exc) { } //6: ok; latest: ok (Exception/Throwable always allowed)
}
void m18() {
@ -148,7 +157,7 @@ class T6558548 {
}
catch(RuntimeException exc) { }
catch(InterruptedException exc) { }
catch(Exception exc) { } //6: ok; latest: unreachable
catch(Exception exc) { } //6: ok; latest: ok (Exception/Throwable always allowed)
}
void m19() {
@ -157,7 +166,7 @@ class T6558548 {
}
catch(RuntimeException exc) { }
catch(InterruptedException exc) { } //never thrown in try
catch(Exception exc) { } //6: ok; latest: unreachable
catch(Exception exc) { } //6: ok; latest: ok (Exception/Throwable always allowed)
}
void m20() {
@ -166,7 +175,7 @@ class T6558548 {
}
catch(RuntimeException exc) { }
catch(InterruptedException exc) { } //never thrown in try
catch(Exception exc) { } //6: ok; latest: unreachable
catch(Exception exc) { } //6: ok; latest: ok (Exception/Throwable always allowed)
}
void m21() {
@ -182,7 +191,7 @@ class T6558548 {
runtime();
}
catch(RuntimeException exc) { }
catch(Exception exc) { } // 6: ok; latest: unreachable
catch(Exception exc) { } // 6: ok; latest: ok (Exception/Throwable always allowed)
}
void m23() {
@ -190,7 +199,7 @@ class T6558548 {
nothing();
}
catch(RuntimeException exc) { }
catch(Exception exc) { } // 6: ok; latest: unreachable
catch(Exception exc) { } // 6: ok; latest: ok (Exception/Throwable always allowed)
}
void m24() {
@ -208,7 +217,7 @@ class T6558548 {
}
catch(RuntimeException exc) { }
catch(Error exc) { }
catch(Throwable exc) { } //6: ok; latest: unreachable
catch(Throwable exc) { } //6: ok; latest: ok (Exception/Throwable always allowed)
}
void m26() {
@ -217,7 +226,7 @@ class T6558548 {
}
catch(RuntimeException exc) { }
catch(Error exc) { }
catch(Throwable exc) { } //6: ok; latest: unreachable
catch(Throwable exc) { } //6: ok; latest: ok (Exception/Throwable always allowed)
}
void m27() {
@ -227,7 +236,7 @@ class T6558548 {
catch(RuntimeException exc) { }
catch(Error exc) { }
catch(InterruptedException exc) { }
catch(Throwable exc) { } //6: ok; latest: unreachable
catch(Throwable exc) { } //6: ok; latest: ok (Exception/Throwable always allowed)
}
void m28() {
@ -237,7 +246,7 @@ class T6558548 {
catch(RuntimeException exc) { }
catch(Error exc) { }
catch(InterruptedException exc) { } //never thrown in try
catch(Throwable exc) { } //6: ok; latest: unreachable
catch(Throwable exc) { } //6: ok; latest: ok (Exception/Throwable always allowed)
}
void m29() {
@ -247,7 +256,7 @@ class T6558548 {
catch(RuntimeException exc) { }
catch(Error exc) { }
catch(InterruptedException exc) { } //never thrown in try
catch(Throwable exc) { } //6: ok; latest: unreachable
catch(Throwable exc) { } //6: ok; latest: ok (Exception/Throwable always allowed)
}
void m30() {
@ -265,7 +274,7 @@ class T6558548 {
}
catch(RuntimeException exc) { }
catch(Error exc) { }
catch(Throwable exc) { } //6: ok; latest: unreachable
catch(Throwable exc) { } //6: ok; latest: ok (Exception/Throwable always allowed)
}
void m32() {
@ -274,7 +283,7 @@ class T6558548 {
}
catch(RuntimeException exc) { }
catch(Error exc) { }
catch(Throwable exc) { } //6: ok; latest: unreachable
catch(Throwable exc) { } //6: ok; latest: ok (Exception/Throwable always allowed)
}
void m33() {

@ -1,9 +1,7 @@
- compiler.warn.source.no.bootclasspath: 1.6
T6558548.java:159:9: compiler.err.except.never.thrown.in.try: java.lang.InterruptedException
T6558548.java:168:9: compiler.err.except.never.thrown.in.try: java.lang.InterruptedException
T6558548.java:239:9: compiler.err.except.never.thrown.in.try: java.lang.InterruptedException
T6558548.java:249:9: compiler.err.except.never.thrown.in.try: java.lang.InterruptedException
T6558548.java:291:9: compiler.err.except.never.thrown.in.try: java.lang.InterruptedException
T6558548.java:298:9: compiler.err.except.never.thrown.in.try: java.lang.InterruptedException
T6558548.java:177:9: compiler.err.except.never.thrown.in.try: java.lang.InterruptedException
T6558548.java:248:9: compiler.err.except.never.thrown.in.try: java.lang.InterruptedException
T6558548.java:258:9: compiler.err.except.never.thrown.in.try: java.lang.InterruptedException
T6558548.java:300:9: compiler.err.except.never.thrown.in.try: java.lang.InterruptedException
T6558548.java:307:9: compiler.err.except.never.thrown.in.try: java.lang.InterruptedException
6 errors
1 warning

@ -1,23 +1,9 @@
T6558548.java:20:9: compiler.warn.unreachable.catch: java.io.FileNotFoundException
T6558548.java:134:9: compiler.warn.unreachable.catch: java.lang.RuntimeException
T6558548.java:142:9: compiler.warn.unreachable.catch: java.lang.RuntimeException
T6558548.java:151:9: compiler.warn.unreachable.catch.1: java.lang.InterruptedException,java.lang.RuntimeException
T6558548.java:159:9: compiler.err.except.never.thrown.in.try: java.lang.InterruptedException
T6558548.java:160:9: compiler.warn.unreachable.catch: java.lang.RuntimeException
T6558548.java:168:9: compiler.err.except.never.thrown.in.try: java.lang.InterruptedException
T6558548.java:169:9: compiler.warn.unreachable.catch: java.lang.RuntimeException
T6558548.java:185:9: compiler.warn.unreachable.catch: java.lang.RuntimeException
T6558548.java:193:9: compiler.warn.unreachable.catch: java.lang.RuntimeException
T6558548.java:211:9: compiler.warn.unreachable.catch.1: java.lang.RuntimeException,java.lang.Error
T6558548.java:220:9: compiler.warn.unreachable.catch.1: java.lang.RuntimeException,java.lang.Error
T6558548.java:230:9: compiler.warn.unreachable.catch.1: java.lang.InterruptedException,java.lang.RuntimeException,java.lang.Error
T6558548.java:239:9: compiler.err.except.never.thrown.in.try: java.lang.InterruptedException
T6558548.java:240:9: compiler.warn.unreachable.catch.1: java.lang.RuntimeException,java.lang.Error
T6558548.java:249:9: compiler.err.except.never.thrown.in.try: java.lang.InterruptedException
T6558548.java:250:9: compiler.warn.unreachable.catch.1: java.lang.RuntimeException,java.lang.Error
T6558548.java:268:9: compiler.warn.unreachable.catch.1: java.lang.RuntimeException,java.lang.Error
T6558548.java:277:9: compiler.warn.unreachable.catch.1: java.lang.RuntimeException,java.lang.Error
T6558548.java:291:9: compiler.err.except.never.thrown.in.try: java.lang.InterruptedException
T6558548.java:298:9: compiler.err.except.never.thrown.in.try: java.lang.InterruptedException
T6558548.java:177:9: compiler.err.except.never.thrown.in.try: java.lang.InterruptedException
T6558548.java:248:9: compiler.err.except.never.thrown.in.try: java.lang.InterruptedException
T6558548.java:258:9: compiler.err.except.never.thrown.in.try: java.lang.InterruptedException
T6558548.java:300:9: compiler.err.except.never.thrown.in.try: java.lang.InterruptedException
T6558548.java:307:9: compiler.err.except.never.thrown.in.try: java.lang.InterruptedException
6 errors
15 warnings
1 warning

@ -0,0 +1,72 @@
/*
* Copyright (c) 2011, 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 7040104
* @summary javac NPE on Object a[]; Object o = (a=null)[0];
*/
public class T7040104 {
public static void main(String[] args) {
T7040104 t = new T7040104();
t.test1();
t.test2();
t.test3();
if (t.npeCount != 3) {
throw new AssertionError();
}
}
int npeCount = 0;
void test1() {
Object a[];
try {
Object o = (a = null)[0];
}
catch (NullPointerException npe) {
npeCount++;
}
}
void test2() {
Object a[][];
try {
Object o = (a = null)[0][0];
}
catch (NullPointerException npe) {
npeCount++;
}
}
void test3() {
Object a[][][];
try {
Object o = (a = null)[0][0][0];
}
catch (NullPointerException npe) {
npeCount++;
}
}
}

@ -0,0 +1,191 @@
/*
* Copyright (c) 2011, 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 6550655
* @summary javac crashes when compiling against an annotated class
*/
import java.io.File;
import java.net.URI;
import java.util.Arrays;
import javax.tools.Diagnostic;
import javax.tools.DiagnosticListener;
import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.ToolProvider;
public class T6550655 {
JavaCompiler javacTool;
File testDir;
TestKind testKind;
EnumActionKind actionKind;
String testSource = "enum E { NORTH, SOUTH, WEST, EAST; }\n" +
"@I(val = E.NORTH)class A {}\n" +
"@interface I { E val(); }";
T6550655(JavaCompiler javacTool, File testDir, TestKind testKind, EnumActionKind actionKind) {
this.javacTool = javacTool;
this.testDir = testDir;
this.testKind = testKind;
this.actionKind = actionKind;
}
void test() {
testDir.mkdirs();
compile(null, new JavaSource("Test.java", testSource));
actionKind.doAction(this);
compile(new DiagnosticChecker(), testKind.source);
}
void compile(DiagnosticChecker dc, JavaSource... sources) {
try {
CompilationTask ct = javacTool.getTask(null, null, dc,
Arrays.asList("-d", testDir.getAbsolutePath(), "-cp", testDir.getAbsolutePath()),
null, Arrays.asList(sources));
ct.call();
}
catch (Exception e) {
error("Internal compilation error");
}
}
void replaceEnum(String newSource) {
compile(null, new JavaSource("Replace.java", newSource));
};
void removeEnum() {
File enumClass = new File(testDir, "E.class");
if (!enumClass.exists()) {
error("Expected file E.class does not exists in folder " + testDir);
}
enumClass.delete();
};
void error(String msg) {
System.err.println(msg);
nerrors++;
}
class DiagnosticChecker implements DiagnosticListener<JavaFileObject> {
String[][] expectedKeys = new String[][] {
// DIRECT, INDIRECT
{/*REPLACE1*/ "compiler.err.cant.resolve.location" , "compiler.warn.unknown.enum.constant" },
{/*REPLACE2*/ "compiler.err.cant.resolve.location.args", "compiler.warn.annotation.method.not.found" },
{/*REMOVE*/ "compiler.err.cant.resolve" , "compiler.warn.unknown.enum.constant.reason" } };
String keyToIgnore = "compiler.err.attribute.value.must.be.constant";
public void report(Diagnostic<? extends JavaFileObject> diagnostic) {
String expectedCode = expectedKeys[actionKind.ordinal()][testKind.ordinal()];
if (!diagnostic.getCode().equals(keyToIgnore) &&
!diagnostic.getCode().equals(expectedCode)) {
error("Unexpected diagnostic" +
"\nfound " + diagnostic.getCode() +
"\nexpected " + expectedCode +
"\ntestKind " + testKind +
"\nactionKind " + actionKind);
}
}
}
//global declarations
enum EnumActionKind {
REPLACE1("enum E { SOUTH, WEST, EAST; }") {
@Override
void doAction(T6550655 test) {
test.replaceEnum(optionalSource);
}
},
REPLACE2("@interface I { E valNew() default E.EAST; }") {
@Override
void doAction(T6550655 test) {
test.replaceEnum(optionalSource);
}
},
REMOVE(null) {
@Override
void doAction(T6550655 test) { test.removeEnum(); }
};
String optionalSource;
private EnumActionKind(String optionalSource) {
this.optionalSource = optionalSource;
}
abstract void doAction(T6550655 test);
}
enum TestKind {
DIRECT("@I(val = E.NORTH)class C1 {}"),
INDIRECT("class C2 { A a; }");
JavaSource source;
private TestKind(final String code) {
this.source = new JavaSource("Test.java", code);
}
}
public static void main(String[] args) throws Exception {
String SCRATCH_DIR = System.getProperty("user.dir");
JavaCompiler javacTool = ToolProvider.getSystemJavaCompiler();
int n = 0;
for (TestKind testKind : TestKind.values()) {
for (EnumActionKind actionKind : EnumActionKind.values()) {
File testDir = new File(SCRATCH_DIR, "test"+n);
new T6550655(javacTool, testDir, testKind, actionKind).test();
n++;
}
}
if (nerrors > 0) {
throw new AssertionError("Some errors have been detected");
}
}
static class JavaSource extends SimpleJavaFileObject {
String source;
public JavaSource(String filename, String source) {
super(URI.create("myfo:/" + filename), JavaFileObject.Kind.SOURCE);
this.source = source;
}
@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
return source;
}
}
static int nerrors = 0;
}

@ -41,7 +41,6 @@ compiler.err.type.var.more.than.once # UNUSED
compiler.err.type.var.more.than.once.in.result # UNUSED
compiler.err.undetermined.type
compiler.err.unexpected.type
compiler.err.unknown.enum.constant # in bad class file
compiler.err.unsupported.cross.fp.lit # Scanner: host system dependent
compiler.err.wrong.target.for.polymorphic.signature.definition # Transitional 292
compiler.misc.assignment.from.super-bound
@ -112,3 +111,5 @@ compiler.warn.proc.type.already.exists # JavacFiler: just menti
compiler.warn.unchecked.assign # DEAD, replaced by compiler.misc.unchecked.assign
compiler.warn.unchecked.cast.to.type # DEAD, replaced by compiler.misc.unchecked.cast.to.type
compiler.warn.unexpected.archive.file # Paths: zip file with unknown extn
compiler.warn.unknown.enum.constant # in bad class file
compiler.warn.unknown.enum.constant.reason # in bad class file

@ -21,24 +21,14 @@
* questions.
*/
/*
* @test
* @bug 7030150
* @summary Type inference for generic instance creation failed for formal type parameter
* check that redundant type-arguments on non-generic constructor are accepted
* @compile Pos01.java
*/
class Pos01 {
// key: compiler.misc.diamond.and.explicit.params
// key: compiler.err.cant.apply.diamond.1
class DiamondAndAnonClass {
static class Foo<X> {
Foo(X t) {}
<Z> Foo() {}
}
void m() {
Foo<String> foo = new <Integer> Foo<>();
}
Foo<Integer> fi1 = new Foo<>(1);
Foo<Integer> fi2 = new Foo<Integer>(1);
Foo<Integer> fi3 = new <String> Foo<>(1);
Foo<Integer> fi4 = new <String> Foo<Integer>(1);
Foo<Integer> fi5 = new <String, String> Foo<>(1);
Foo<Integer> fi6 = new <String, String> Foo<Integer>(1);
}

@ -23,14 +23,21 @@
// key: compiler.warn.unreachable.catch.1
import java.io.*;
class UnreachableCatch1 {
void test() {
try {
throw new IllegalArgumentException();
if (true) {
throw new FileNotFoundException();
}
else {
throw new EOFException();
}
}
catch(Error err) { }
catch(RuntimeException rex) { }
catch(Throwable t) { } //unreachable
catch(FileNotFoundException fnf) { }
catch(EOFException eof) { }
catch(IOException ex) { } //unreachable
}
}

@ -1,6 +1,7 @@
/*
* @test /nodynamiccopyright/
* @bug 7034511
* @ignore backing out 7034511, see 7040883
* @bug 7034511 7040883
* @summary Loophole in typesafety
* @compile/fail/ref=T7034511a.out -XDrawDiagnostics T7034511a.java
*/

@ -1,6 +1,7 @@
/*
* @test /nodynamiccopyright/
* @bug 7034511
* @ignore backing out 7034511, see 7040883
* @bug 7034511 7040883
* @summary Loophole in typesafety
* @compile/fail/ref=T7034511b.out -XDrawDiagnostics T7034511b.java
*/

@ -23,7 +23,7 @@
/*
* @test
* @bug 7030150
* @bug 7030150 7039931
* @summary Type inference for generic instance creation failed for formal type parameter
*/
@ -125,6 +125,14 @@ public class GenericConstructorAndDiamondTest {
default: return false;
}
}
boolean matches(TypeArgumentKind other) {
switch (other) {
case STRING: return this != INTEGER;
case INTEGER: return this != STRING;
default: return true;
}
}
}
enum ArgumentKind {
@ -149,9 +157,11 @@ public class GenericConstructorAndDiamondTest {
for (TypeArgumentKind declArgKind : TypeArgumentKind.values()) {
for (TypeArgArity arity : TypeArgArity.values()) {
for (TypeArgumentKind useArgKind : TypeArgumentKind.values()) {
for (ArgumentKind argKind : ArgumentKind.values()) {
new GenericConstructorAndDiamondTest(boundKind, constructorKind,
declArgKind, arity, useArgKind, argKind).run(comp, fm);
for (TypeArgumentKind diamondArgKind : TypeArgumentKind.values()) {
for (ArgumentKind argKind : ArgumentKind.values()) {
new GenericConstructorAndDiamondTest(boundKind, constructorKind,
declArgKind, arity, useArgKind, diamondArgKind, argKind).run(comp, fm);
}
}
}
}
@ -165,18 +175,21 @@ public class GenericConstructorAndDiamondTest {
TypeArgumentKind declTypeArgumentKind;
TypeArgArity useTypeArgArity;
TypeArgumentKind useTypeArgumentKind;
TypeArgumentKind diamondTypeArgumentKind;
ArgumentKind argumentKind;
JavaSource source;
DiagnosticChecker diagChecker;
GenericConstructorAndDiamondTest(BoundKind boundKind, ConstructorKind constructorKind,
TypeArgumentKind declTypeArgumentKind, TypeArgArity useTypeArgArity,
TypeArgumentKind useTypeArgumentKind, ArgumentKind argumentKind) {
TypeArgumentKind useTypeArgumentKind, TypeArgumentKind diamondTypeArgumentKind,
ArgumentKind argumentKind) {
this.boundKind = boundKind;
this.constructorKind = constructorKind;
this.declTypeArgumentKind = declTypeArgumentKind;
this.useTypeArgArity = useTypeArgArity;
this.useTypeArgumentKind = useTypeArgumentKind;
this.diamondTypeArgumentKind = diamondTypeArgumentKind;
this.argumentKind = argumentKind;
this.source = new JavaSource();
this.diagChecker = new DiagnosticChecker();
@ -189,7 +202,7 @@ public class GenericConstructorAndDiamondTest {
"}\n" +
"class Test {\n" +
"void test() {\n" +
"Foo#TA1 f = new #TA2 Foo<>(#A);\n" +
"Foo#TA1 f = new #TA2 Foo<#TA3>(#A);\n" +
"}\n" +
"}\n";
@ -201,6 +214,7 @@ public class GenericConstructorAndDiamondTest {
replace("#CK", constructorKind.constrStr)
.replace("#TA1", declTypeArgumentKind.getArgs(TypeArgArity.ONE))
.replace("#TA2", useTypeArgumentKind.getArgs(useTypeArgArity))
.replace("#TA3", diamondTypeArgumentKind.typeargStr)
.replace("#A", argumentKind.argStr);
}
@ -227,9 +241,15 @@ public class GenericConstructorAndDiamondTest {
boolean badMethodTypeArg = constructorKind != ConstructorKind.NON_GENERIC &&
!useTypeArgumentKind.matches(argumentKind);
boolean badGenericType = !boundKind.matches(declTypeArgumentKind);
boolean badExplicitParams = (useTypeArgumentKind != TypeArgumentKind.NONE &&
diamondTypeArgumentKind == TypeArgumentKind.NONE) ||
!boundKind.matches(diamondTypeArgumentKind);
boolean shouldFail = badActual || badArity || badMethodTypeArg || badGenericType;
boolean badGenericType = !boundKind.matches(declTypeArgumentKind) ||
!diamondTypeArgumentKind.matches(declTypeArgumentKind);
boolean shouldFail = badActual || badArity ||
badMethodTypeArg || badExplicitParams || badGenericType;
if (shouldFail != diagChecker.errorFound) {
throw new Error("invalid diagnostics for source:\n" +

@ -1,17 +0,0 @@
/*
* @test /nodynamiccopyright/
* @bug 7030150
* @summary Type inference for generic instance creation failed for formal type parameter
* check that explicit type-argument that causes resolution failure is rejected
* @compile/fail/ref=Neg01.out -XDrawDiagnostics Neg01.java
*/
class Neg01 {
static class Foo<X> {
<T> Foo(T t) {}
}
Foo<Integer> fi1 = new <String> Foo<>(1);
Foo<Integer> fi2 = new <String> Foo<Integer>(1);
}

@ -1,3 +0,0 @@
Neg01.java:15:24: compiler.err.cant.apply.diamond.1: (compiler.misc.diamond: Neg01.Foo), (compiler.misc.infer.no.conforming.assignment.exists: X, int, java.lang.String)
Neg01.java:16:24: compiler.err.cant.apply.symbol.1: kindname.constructor, Foo, T, int, kindname.class, Neg01.Foo<X>, (compiler.misc.no.conforming.assignment.exists: int, java.lang.String)
2 errors

@ -1,17 +0,0 @@
/*
* @test /nodynamiccopyright/
* @bug 7030150
* @summary Type inference for generic instance creation failed for formal type parameter
* check that compiler rejects bad number of explicit type-arguments
* @compile/fail/ref=Neg02.out -XDrawDiagnostics Neg02.java
*/
class Neg02 {
static class Foo<X> {
<T> Foo(T t) {}
}
Foo<Integer> fi1 = new <String, Integer> Foo<>("");
Foo<Integer> fi2 = new <String, Integer> Foo<Integer>("");
}

@ -1,3 +0,0 @@
Neg02.java:15:24: compiler.err.cant.apply.diamond.1: (compiler.misc.diamond: Neg02.Foo), (compiler.misc.arg.length.mismatch)
Neg02.java:16:24: compiler.err.cant.apply.symbol.1: kindname.constructor, Foo, T, java.lang.String, kindname.class, Neg02.Foo<X>, (compiler.misc.arg.length.mismatch)
2 errors

@ -1,17 +0,0 @@
/*
* @test /nodynamiccopyright/
* @bug 7030150
* @summary Type inference for generic instance creation failed for formal type parameter
* check that explicit type-argument that does not conform to bound is rejected
* @compile/fail/ref=Neg03.out -XDrawDiagnostics Neg03.java
*/
class Neg03 {
static class Foo<X> {
<T extends Integer> Foo(T t) {}
}
Foo<Integer> fi1 = new <String> Foo<>(1);
Foo<Integer> fi2 = new <String> Foo<Integer>(1);
}

@ -1,3 +0,0 @@
Neg03.java:15:24: compiler.err.cant.apply.diamond.1: (compiler.misc.diamond: Neg03.Foo), (compiler.misc.explicit.param.do.not.conform.to.bounds: java.lang.String, java.lang.Integer)
Neg03.java:16:24: compiler.err.cant.apply.symbol.1: kindname.constructor, Foo, T, int, kindname.class, Neg03.Foo<X>, (compiler.misc.explicit.param.do.not.conform.to.bounds: java.lang.String, java.lang.Integer)
2 errors

@ -23,18 +23,16 @@
/*
* @test
* @bug 7030150
* @summary Type inference for generic instance creation failed for formal type parameter
* check that diamond in return context works w/o problems
* @compile Pos02.java
* @bug 7040883 7034511
* @summary Compilation error: "length in Array is defined in an inaccessible class or interface"
* @compile T7040883.java
*/
class Pos02<X> {
public class T7040883 {
Pos02(X x) {}
<Z> Z[] getListeners(Class<Z> z) { return null; }
Pos02<X> test(X x) {
return new Pos02<>(x);
void test(String s) {
int i = getListeners(s.getClass()).length;
}
}

@ -0,0 +1,42 @@
/*
* Copyright (c) 2008, 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 7034495
* @summary Javac asserts on usage of wildcards in bounds
* @compile/fail/ref=T7034495.out -XDrawDiagnostics T7034495.java
*/
class T7034495 {
interface A<T> {
T foo();
}
interface B<T> {
T foo();
}
interface C<T extends A<?> & B<?>> { }
}

@ -0,0 +1,2 @@
T7034495.java:40:17: compiler.err.types.incompatible.diff.ret: T7034495.B<?>, T7034495.A<?>, foo()
1 error

@ -0,0 +1,50 @@
/*
* @test /nodynamiccopyright/
* @bug 7039822
* @summary Verify typing of lub of exception parameter w.r.t getClass
* @author Joseph D. Darcy
* @compile/fail/ref=Neg07.out -XDrawDiagnostics Neg07.java
*/
public class Neg07 {
private static void test(int i) {
try {
thrower(i);
} catch (SonException | DaughterException e) {
Class<? extends HasFoo> clazz2 = e.getClass(); // Rejected!
HasFoo m = e;
e.foo();
}
}
private static interface HasFoo {
void foo();
}
static void thrower(int i) throws SonException, DaughterException {
if (i == 0)
throw new SonException();
else
throw new DaughterException();
}
private static class ParentException extends RuntimeException {}
private static class SonException
extends ParentException
implements HasFoo {
public void foo() {
System.out.println("SonException.foo");
}
}
private static class DaughterException
extends ParentException
implements HasFoo {
public void foo() {
System.out.println("DaughterException.foo");
}
}
}

@ -0,0 +1,2 @@
Neg07.java:14:56: compiler.err.prob.found.req: (compiler.misc.incompatible.types), java.lang.Class<compiler.misc.type.captureof: 1, ? extends Neg07.ParentException>, java.lang.Class<? extends Neg07.HasFoo>
1 error

@ -0,0 +1,103 @@
/*
* Copyright (c) 2011, 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 7039822
* @summary Verify lub of an exception parameter can be an intersection type
* @author Joseph D. Darcy
*/
public class Pos10 {
public static void main(String... args) {
test(0);
test(1);
if (record != 0b11)
throw new RuntimeException("Unexpected exception execution: " +
record);
if (closeRecord != 0b11)
throw new RuntimeException("Unexpected close execution: " +
closeRecord);
}
private static int record = 0;
private static int closeRecord = 0;
private static void test(int i) {
try {
thrower(i);
} catch (SonException | DaughterException e) {
Class<? extends ParentException> clazz = e.getClass();
HasFoo m = e;
e.foo();
try (AutoCloseable ac = e) {
e.toString();
} catch(Exception except) {
throw new RuntimeException(except);
}
}
}
private static interface HasFoo {
void foo();
}
private static void thrower(int i) throws SonException, DaughterException {
if (i == 0)
throw new SonException();
else
throw new DaughterException();
}
private static class ParentException extends RuntimeException {}
private static class SonException
extends ParentException
implements HasFoo, AutoCloseable {
public void foo() {
record |= 0b01;
}
@Override
public void close() {
closeRecord |= 0b01;
}
}
private static class DaughterException
extends ParentException
implements HasFoo, AutoCloseable {
public void foo() {
record |= 0b10;
}
@Override
public void close() {
closeRecord |= 0b10;
}
}
}

@ -1,5 +1,5 @@
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2010, 2011, 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
@ -43,6 +43,6 @@ class Test {
else
throw new B2();
}
catch(B1 | B2 ex) { }
catch(@UnionTypeInfo({"Test.B1", "Test.B2"}) B1 | B2 ex) { }
}
}

@ -1,5 +1,5 @@
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2010, 2011 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
@ -30,7 +30,7 @@
* @compile -processor ModelChecker Model01.java
*/
import com.sun.source.tree.VariableTree;
import com.sun.source.tree.CatchTree;
import com.sun.source.util.TreePathScanner;
import com.sun.source.util.Trees;
import com.sun.source.util.TreePath;
@ -41,6 +41,12 @@ import javax.annotation.processing.SupportedAnnotationTypes;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.type.TypeKind;
import javax.lang.model.type.UnionType;
import javax.lang.model.type.UnknownTypeException;
import javax.lang.model.util.SimpleTypeVisitor6;
import javax.lang.model.util.SimpleTypeVisitor7;
@SupportedAnnotationTypes("Check")
public class ModelChecker extends JavacTestingAbstractProcessor {
@ -69,22 +75,61 @@ public class ModelChecker extends JavacTestingAbstractProcessor {
}
@Override
public Void visitVariable(VariableTree node, Void p) {
Element ex = trees.getElement(getCurrentPath());
public Void visitCatch(CatchTree node, Void p) {
TreePath param = new TreePath(getCurrentPath(), node.getParameter());
Element ex = trees.getElement(param);
validateUnionTypeInfo(ex);
if (ex.getSimpleName().contentEquals("ex")) {
assertTrue(ex.getKind() == ElementKind.EXCEPTION_PARAMETER, "Expected EXCEPTION_PARAMETER - found " + ex.getKind());
for (Element e : types.asElement(ex.asType()).getEnclosedElements()) {
for (Element e : types.asElement(trees.getLub(node)).getEnclosedElements()) {
Member m = e.getAnnotation(Member.class);
if (m != null) {
assertTrue(e.getKind() == m.value(), "Expected " + m.value() + " - found " + e.getKind());
}
}
assertTrue(assertionCount == 3, "Expected 3 assertions - found " + assertionCount);
assertTrue(assertionCount == 9, "Expected 9 assertions - found " + assertionCount);
}
return super.visitVariable(node, p);
return super.visitCatch(node, p);
}
}
private void validateUnionTypeInfo(Element ex) {
UnionTypeInfo ut = ex.getAnnotation(UnionTypeInfo.class);
assertTrue(ut != null, "UnionType annotation must be present");
TypeMirror expectedUnionType = ex.asType();
assertTrue(expectedUnionType.getKind() == TypeKind.UNION, "UNION kind expected");
try {
new SimpleTypeVisitor6<Void, Void>(){}.visit(expectedUnionType);
throw new RuntimeException("Expected UnknownTypeException not thrown.");
} catch (UnknownTypeException ute) {
; // Expected
}
UnionType unionType = new SimpleTypeVisitor7<UnionType, Void>(){
@Override
protected UnionType defaultAction(TypeMirror e, Void p) {return null;}
@Override
public UnionType visitUnion(UnionType t, Void p) {return t;}
}.visit(expectedUnionType);
assertTrue(unionType != null, "Must get a non-null union type.");
assertTrue(ut.value().length == unionType.getAlternatives().size(), "Cardinalities do not match");
String[] typeNames = ut.value();
for(int i = 0; i < typeNames.length; i++) {
TypeMirror typeFromAnnotation = nameToType(typeNames[i]);
assertTrue(types.isSameType(typeFromAnnotation, unionType.getAlternatives().get(i)),
"Types were not equal.");
}
}
private TypeMirror nameToType(String name) {
return elements.getTypeElement(name).asType();
}
private static void assertTrue(boolean cond, String msg) {
assertionCount++;
if (!cond)

@ -0,0 +1,29 @@
/*
* Copyright (c) 2011, 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.
*/
/**
* Used by ModelChecker to validate the modeling information of a union type.
*/
@interface UnionTypeInfo {
String[] value();
}

@ -44,6 +44,7 @@ import javax.lang.model.util.Types;
import com.sun.tools.javac.code.Symbol.ClassSymbol;
import com.sun.tools.javac.code.Symtab;
import com.sun.tools.javac.file.JavacFileManager;
import com.sun.tools.javac.main.JavaCompiler;
import com.sun.tools.javac.model.JavacTypes;
import com.sun.tools.javac.util.Context;
@ -62,6 +63,7 @@ public class TestSymtabItems {
JavacFileManager.preRegister(c);
Symtab syms = Symtab.instance(c);
JavacTypes types = JavacTypes.instance(c);
JavaCompiler.instance(c); // will init ClassReader.sourceCompleter
// print("noSymbol", syms.noSymbol);
// print("errSymbol", syms.errSymbol);

@ -0,0 +1,208 @@
/*
* Copyright (c) 2011, 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 7029150
* @summary Test support for union types
* @library ../../../lib
*/
import java.net.URI;
import java.util.*;
import javax.annotation.processing.*;
import javax.lang.model.element.*;
import javax.lang.model.type.*;
import javax.lang.model.util.*;
import javax.tools.*;
import com.sun.source.tree.*;
import com.sun.source.util.*;
public class TestUnionType extends JavacTestingAbstractProcessor {
enum TestKind {
SingleType("E1", "E1",
"VariableTree: E1 e",
"VariableTree: elem EXCEPTION_PARAMETER e",
"VariableTree: elem.type DECLARED",
"VariableTree: elem.type.elem CLASS E1",
"VariableTree: type DECLARED",
"VariableTree: type.elem CLASS E1",
"VariableTree: type.elem.type DECLARED"),
ValidTypes("E1, E2", "E1 | E2",
"VariableTree: E1 | E2 e",
"VariableTree: elem EXCEPTION_PARAMETER e",
"VariableTree: elem.type UNION Test.E1,Test.E2",
"VariableTree: elem.type.elem null",
"VariableTree: type UNION Test.E1,Test.E2",
"VariableTree: type.elem null"),
InvalidTypes("E1, E2", "E1 | EMissing",
"VariableTree: E1 | EMissing e",
"VariableTree: elem EXCEPTION_PARAMETER e",
"VariableTree: elem.type UNION Test.E1,EMissing",
"VariableTree: elem.type.elem null",
"VariableTree: type UNION Test.E1,EMissing",
"VariableTree: type.elem null"),
Uncaught("E1", "E1 | E2",
"VariableTree: E1 | E2 e",
"VariableTree: elem EXCEPTION_PARAMETER e",
"VariableTree: elem.type UNION Test.E1,Test.E2",
"VariableTree: elem.type.elem null",
"VariableTree: type UNION Test.E1,Test.E2",
"VariableTree: type.elem null");
TestKind(String throwsTypes, String catchTypes, String... gold) {
this.throwsTypes = throwsTypes;
this.catchTypes = catchTypes;
this.gold = Arrays.asList(gold);
}
final String throwsTypes;
final String catchTypes;
final List<String> gold;
}
static class TestFileObject extends SimpleJavaFileObject {
public static final String template =
"class Test {\n"
+ " class E1 extends Exception { }\n"
+ " class E2 extends Exception { }\n"
+ " void doSomething() throws #T { }\n"
+ " void test() {\n"
+ " try {\n"
+ " doSomething();\n"
+ " } catch (#C e) {\n"
+ " }\n"
+ " }\n"
+ "}\n";
public TestFileObject(TestKind tk) {
super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE);
this.tk = tk;
}
@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
return template
.replace("#T", tk.throwsTypes)
.replace("#C", tk.catchTypes);
}
final TestKind tk;
}
public static void main(String... args) throws Exception {
JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
List<String> options = Arrays.asList("-proc:only");
for (TestKind tk: TestKind.values()) {
System.err.println("Test: " + tk);
TestUnionType p = new TestUnionType();
JavaFileObject fo = new TestFileObject(tk);
JavaCompiler.CompilationTask task = comp.getTask(null, null, null, options, null, Arrays.asList(fo));
task.setProcessors(Arrays.asList(p));
boolean ok = task.call();
System.err.println("compilation " + (ok ? "passed" : "failed"));
if (!ok)
throw new Exception("compilation failed unexpectedly");
if (!p.log.equals(tk.gold)) {
System.err.println("Expected output:");
for (String g: tk.gold)
System.err.println(g);
throw new Exception("unexpected output from test");
}
System.err.println();
}
}
Trees trees;
List<String> log;
@Override
public void init(ProcessingEnvironment env) {
super.init(env);
trees = Trees.instance(env);
log = new ArrayList<String>();
}
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
if (!roundEnv.processingOver()) {
for (Element e: roundEnv.getRootElements()) {
scan(trees.getPath(e));
}
}
return true;
}
void scan(TreePath path) {
new Scanner().scan(path, null);
}
class Scanner extends TreePathScanner<Void,Void> {
@Override
public Void visitVariable(VariableTree tree, Void ignore) {
TreePath p = getCurrentPath();
Element e = trees.getElement(p);
if (e.getKind() == ElementKind.EXCEPTION_PARAMETER) {
log("VariableTree: " + tree);
log("VariableTree: elem " + print(e));
log("VariableTree: elem.type " + print(e.asType()));
log("VariableTree: elem.type.elem " + print(types.asElement(e.asType())));
TypeMirror tm = trees.getTypeMirror(p);
log("VariableTree: type " + print(tm));
log("VariableTree: type.elem " + print(types.asElement(tm)));
if (types.asElement(tm) != null)
log("VariableTree: type.elem.type " + print(types.asElement(tm).asType()));
}
return super.visitVariable(tree, null);
}
String print(TypeMirror tm) {
return (tm == null) ? null : new TypePrinter().visit(tm);
}
String print(Element e) {
return (e == null) ? null : (e.getKind() + " " + e.getSimpleName());
}
void log(String msg) {
System.err.println(msg);
log.add(msg);
}
}
class TypePrinter extends SimpleTypeVisitor7<String, Void> {
@Override
protected String defaultAction(TypeMirror tm, Void ignore) {
return String.valueOf(tm.getKind());
}
@Override
public String visitUnion(UnionType t, Void ignore) {
return (t.getKind() + " " + t.getAlternatives());
}
}
}

@ -23,7 +23,7 @@
/*
* @test
* @bug 7017664
* @bug 7017664 7036906
* @summary Basher for CompoundScopes
*/
@ -127,8 +127,17 @@ public class CompoundScopeTest {
}
}
log("testing scope: " + root);
checkElems(root);
checkShadowed(root);
checkElems(root, null);
checkElems(root, new OddFilter());
checkShadowed(root, null);
checkShadowed(root, new OddFilter());
}
}
class OddFilter implements Filter<Symbol> {
public boolean accepts(Symbol s) {
Name numPart = s.name.subName(1, s.name.length());
return Integer.parseInt(numPart.toString()) % 2 != 0;
}
}
@ -165,15 +174,20 @@ public class CompoundScopeTest {
* Check that CompoundScope.getElements() correctly visits all symbols
* in all subscopes (in the correct order)
*/
void checkElems(CompoundScope cs) {
List<Symbol> allSymbols = elems;
void checkElems(CompoundScope cs, Filter<Symbol> sf) {
int count = 0;
for (Symbol s : cs.getElements()) {
ListBuffer<Symbol> found = ListBuffer.lb();
List<Symbol> allSymbols = sf == null ?
elems :
filter(elems, sf);
int expectedCount = allSymbols.length();
for (Symbol s : sf == null ? cs.getElements() : cs.getElements(sf)) {
checkSameSymbols(s, allSymbols.head);
allSymbols = allSymbols.tail;
found.append(s);
count++;
}
if (count != elems.size()) {
if (count != expectedCount) {
error("CompoundScope.getElements() did not returned enough symbols");
}
}
@ -182,22 +196,35 @@ public class CompoundScopeTest {
* Check that CompoundScope.getElements() correctly visits all symbols
* with a given name in all subscopes (in the correct order)
*/
void checkShadowed(CompoundScope cs) {
void checkShadowed(CompoundScope cs, Filter<Symbol> sf) {
for (Map.Entry<Name, List<Symbol>> shadowedEntry : shadowedMap.entrySet()) {
int count = 0;
List<Symbol> shadowed = shadowedEntry.getValue();
List<Symbol> shadowed = sf == null ?
shadowedEntry.getValue() :
filter(shadowedEntry.getValue(), sf);
int expectedCount = shadowed.length();
Name name = shadowedEntry.getKey();
for (Symbol s : cs.getElementsByName(name)) {
for (Symbol s : sf == null ? cs.getElementsByName(name) : cs.getElementsByName(name, sf)) {
checkSameSymbols(s, shadowed.head);
shadowed = shadowed.tail;
count++;
}
if (count != shadowedEntry.getValue().size()) {
if (count != expectedCount) {
error("CompoundScope.lookup() did not returned enough symbols for name " + name);
}
}
}
List<Symbol> filter(List<Symbol> elems, Filter<Symbol> sf) {
ListBuffer<Symbol> res = ListBuffer.lb();
for (Symbol s : elems) {
if (sf.accepts(s)) {
res.append(s);
}
}
return res.toList();
}
void checkSameSymbols(Symbol found, Symbol req) {
if (found != req) {
error("Symbol mismatch - found : " + found + ":" + found.hashCode() + "\n" +

@ -0,0 +1,38 @@
/*
* Copyright (c) 2011, 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 7038363
* @summary cast from object to primitive should be for source >= 1.7
* @compile/fail/ref=CastObjectToPrimitiveTest.out -XDrawDiagnostics -Xlint:-options -source 5 CastObjectToPrimitiveTest.java
* @compile/fail/ref=CastObjectToPrimitiveTest.out -XDrawDiagnostics -Xlint:-options -source 6 CastObjectToPrimitiveTest.java
* @compile CastObjectToPrimitiveTest.java
*/
class CastObjectToPrimitiveTest {
void m() {
Object o = 42;
int i = (int) o;
}
}

@ -0,0 +1,2 @@
CastObjectToPrimitiveTest.java:36:23: compiler.err.prob.found.req: (compiler.misc.inconvertible.types), java.lang.Object, int
1 error