This commit is contained in:
Lana Steuck 2012-06-25 21:39:16 -07:00
commit c4cbd8f70c
27 changed files with 1011 additions and 730 deletions

View File

@ -60,7 +60,7 @@ import com.sun.tools.javac.comp.Env;
import com.sun.tools.javac.comp.MemberEnter; import com.sun.tools.javac.comp.MemberEnter;
import com.sun.tools.javac.comp.Resolve; import com.sun.tools.javac.comp.Resolve;
import com.sun.tools.javac.model.JavacElements; import com.sun.tools.javac.model.JavacElements;
import com.sun.tools.javac.parser.EndPosTable; import com.sun.tools.javac.tree.EndPosTable;
import com.sun.tools.javac.processing.JavacProcessingEnvironment; import com.sun.tools.javac.processing.JavacProcessingEnvironment;
import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.tree.JCTree;
import com.sun.tools.javac.tree.JCTree.*; import com.sun.tools.javac.tree.JCTree.*;
@ -240,10 +240,11 @@ public class JavacTrees extends Trees {
public String getDocComment(TreePath path) { public String getDocComment(TreePath path) {
CompilationUnitTree t = path.getCompilationUnit(); CompilationUnitTree t = path.getCompilationUnit();
if (t instanceof JCTree.JCCompilationUnit) { Tree leaf = path.getLeaf();
if (t instanceof JCTree.JCCompilationUnit && leaf instanceof JCTree) {
JCCompilationUnit cu = (JCCompilationUnit) t; JCCompilationUnit cu = (JCCompilationUnit) t;
if (cu.docComments != null) { if (cu.docComments != null) {
return cu.docComments.get(path.getLeaf()); return cu.docComments.getCommentText((JCTree) leaf);
} }
} }
return null; return null;

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -312,7 +312,7 @@ public class Enter extends JCTree.Visitor {
tree.packge); tree.packge);
if (addEnv || (tree0.packageAnnotations.isEmpty() && if (addEnv || (tree0.packageAnnotations.isEmpty() &&
tree.docComments != null && tree.docComments != null &&
tree.docComments.get(tree) != null)) { tree.docComments.hasComment(tree))) {
typeEnvs.put(tree.packge, topEnv); typeEnvs.put(tree.packge, topEnv);
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -40,7 +40,7 @@ import com.sun.tools.javac.tree.JCTree.*;
import com.sun.tools.javac.code.Type.*; import com.sun.tools.javac.code.Type.*;
import com.sun.tools.javac.jvm.Target; import com.sun.tools.javac.jvm.Target;
import com.sun.tools.javac.parser.EndPosTable; import com.sun.tools.javac.tree.EndPosTable;
import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Flags.*;
import static com.sun.tools.javac.code.Flags.BLOCK; import static com.sun.tools.javac.code.Flags.BLOCK;

View File

@ -36,6 +36,7 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Calendar; import java.util.Calendar;
import java.util.Collections; import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@ -284,7 +285,7 @@ public class ZipFileIndex {
try { try {
checkIndex(); checkIndex();
if (allDirs == Collections.EMPTY_SET) { if (allDirs == Collections.EMPTY_SET) {
allDirs = new HashSet<RelativeDirectory>(directories.keySet()); allDirs = new java.util.LinkedHashSet<RelativeDirectory>(directories.keySet());
} }
return allDirs; return allDirs;
@ -572,7 +573,7 @@ public class ZipFileIndex {
// Add each of the files // Add each of the files
if (entryCount > 0) { if (entryCount > 0) {
directories = new HashMap<RelativeDirectory, DirectoryEntry>(); directories = new LinkedHashMap<RelativeDirectory, DirectoryEntry>();
ArrayList<Entry> entryList = new ArrayList<Entry>(); ArrayList<Entry> entryList = new ArrayList<Entry>();
int pos = 2; int pos = 2;
for (int i = 0; i < entryCount; i++) { for (int i = 0; i < entryCount; i++) {
@ -867,7 +868,7 @@ public class ZipFileIndex {
if (zipFile.lastModified() != fileStamp) { if (zipFile.lastModified() != fileStamp) {
ret = false; ret = false;
} else { } else {
directories = new HashMap<RelativeDirectory, DirectoryEntry>(); directories = new LinkedHashMap<RelativeDirectory, DirectoryEntry>();
int numDirs = raf.readInt(); int numDirs = raf.readInt();
for (int nDirs = 0; nDirs < numDirs; nDirs++) { for (int nDirs = 0; nDirs < numDirs; nDirs++) {
int dirNameBytesLen = raf.readInt(); int dirNameBytesLen = raf.readInt();

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -31,7 +31,7 @@ import com.sun.tools.javac.tree.*;
import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.*;
import com.sun.tools.javac.util.List; import com.sun.tools.javac.util.List;
import com.sun.tools.javac.tree.JCTree.*; import com.sun.tools.javac.tree.JCTree.*;
import com.sun.tools.javac.parser.EndPosTable; import com.sun.tools.javac.tree.EndPosTable;
/** This class contains the CharacterRangeTable for some method /** This class contains the CharacterRangeTable for some method
* and the hashtable for mapping trees or lists of trees to their * and the hashtable for mapping trees or lists of trees to their

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -37,7 +37,7 @@ import com.sun.tools.javac.code.Symbol.*;
import com.sun.tools.javac.code.Type.*; import com.sun.tools.javac.code.Type.*;
import com.sun.tools.javac.jvm.Code.*; import com.sun.tools.javac.jvm.Code.*;
import com.sun.tools.javac.jvm.Items.*; import com.sun.tools.javac.jvm.Items.*;
import com.sun.tools.javac.parser.EndPosTable; import com.sun.tools.javac.tree.EndPosTable;
import com.sun.tools.javac.tree.JCTree.*; import com.sun.tools.javac.tree.JCTree.*;
import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Flags.*;

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -28,11 +28,14 @@ package com.sun.tools.javac.model;
import java.lang.annotation.Annotation; import java.lang.annotation.Annotation;
import java.lang.annotation.Inherited; import java.lang.annotation.Inherited;
import java.util.Map; import java.util.Map;
import javax.lang.model.SourceVersion; import javax.lang.model.SourceVersion;
import javax.lang.model.element.*; import javax.lang.model.element.*;
import javax.lang.model.type.DeclaredType; import javax.lang.model.type.DeclaredType;
import javax.lang.model.util.Elements; import javax.lang.model.util.Elements;
import javax.tools.JavaFileObject; import javax.tools.JavaFileObject;
import static javax.lang.model.util.ElementFilter.methodsIn;
import com.sun.tools.javac.code.*; import com.sun.tools.javac.code.*;
import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.code.Symbol.*;
import com.sun.tools.javac.code.TypeTags; import com.sun.tools.javac.code.TypeTags;
@ -47,9 +50,7 @@ import com.sun.tools.javac.tree.TreeInfo;
import com.sun.tools.javac.tree.TreeScanner; import com.sun.tools.javac.tree.TreeScanner;
import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.*;
import com.sun.tools.javac.util.Name; import com.sun.tools.javac.util.Name;
import static com.sun.tools.javac.tree.JCTree.Tag.*; import static com.sun.tools.javac.tree.JCTree.Tag.*;
import static javax.lang.model.util.ElementFilter.methodsIn;
/** /**
* Utility methods for operating on program elements. * Utility methods for operating on program elements.
@ -361,7 +362,7 @@ public class JavacElements implements Elements {
JCCompilationUnit toplevel = treeTop.snd; JCCompilationUnit toplevel = treeTop.snd;
if (toplevel.docComments == null) if (toplevel.docComments == null)
return null; return null;
return toplevel.docComments.get(tree); return toplevel.docComments.getCommentText(tree);
} }
public PackageElement getPackageOf(Element e) { public PackageElement getPackageOf(Element e) {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -571,7 +571,7 @@ public class JavaTokenizer {
reader.scanCommentChar(); reader.scanCommentChar();
} while (reader.ch != CR && reader.ch != LF && reader.bp < reader.buflen); } while (reader.ch != CR && reader.ch != LF && reader.bp < reader.buflen);
if (reader.bp < reader.buflen) { if (reader.bp < reader.buflen) {
comments = addDocReader(comments, processComment(pos, reader.bp, CommentStyle.LINE)); comments = addComment(comments, processComment(pos, reader.bp, CommentStyle.LINE));
} }
break; break;
} else if (reader.ch == '*') { } else if (reader.ch == '*') {
@ -597,7 +597,7 @@ public class JavaTokenizer {
} }
if (reader.ch == '/') { if (reader.ch == '/') {
reader.scanChar(); reader.scanChar();
comments = addDocReader(comments, processComment(pos, reader.bp, style)); comments = addComment(comments, processComment(pos, reader.bp, style));
break; break;
} else { } else {
lexError(pos, "unclosed.comment"); lexError(pos, "unclosed.comment");
@ -693,10 +693,10 @@ public class JavaTokenizer {
} }
} }
//where //where
List<Comment> addDocReader(List<Comment> docReaders, Comment docReader) { List<Comment> addComment(List<Comment> comments, Comment comment) {
return docReaders == null ? return comments == null ?
List.of(docReader) : List.of(comment) :
docReaders.prepend(docReader); comments.prepend(comment);
} }
/** Return the position where a lexical error occurred; /** Return the position where a lexical error occurred;
@ -780,6 +780,10 @@ public class JavaTokenizer {
return null; return null;
} }
public int getSourcePos(int pos) {
return -1;
}
public CommentStyle getStyle() { public CommentStyle getStyle() {
return cs; return cs;
} }

View File

@ -117,7 +117,7 @@ public class JavacParser implements Parser {
this.allowMethodReferences = source.allowMethodReferences() && this.allowMethodReferences = source.allowMethodReferences() &&
fac.options.isSet("allowMethodReferences"); fac.options.isSet("allowMethodReferences");
this.keepDocComments = keepDocComments; this.keepDocComments = keepDocComments;
docComments = keepDocComments ? new HashMap<JCTree,String>() : null; docComments = newDocCommentTable(keepDocComments);
this.keepLineMap = keepLineMap; this.keepLineMap = keepLineMap;
this.errorTree = F.Erroneous(); this.errorTree = F.Erroneous();
endPosTable = newEndPosTable(keepEndPositions); endPosTable = newEndPosTable(keepEndPositions);
@ -128,6 +128,11 @@ public class JavacParser implements Parser {
? new SimpleEndPosTable() ? new SimpleEndPosTable()
: new EmptyEndPosTable(); : new EmptyEndPosTable();
} }
protected DocCommentTable newDocCommentTable(boolean keepDocComments) {
return keepDocComments ? new SimpleDocCommentTable() : null;
}
/** Switch: Should generics be recognized? /** Switch: Should generics be recognized?
*/ */
boolean allowGenerics; boolean allowGenerics;
@ -417,21 +422,21 @@ public class JavacParser implements Parser {
/* ---------- doc comments --------- */ /* ---------- doc comments --------- */
/** A hashtable to store all documentation comments /** A table to store all documentation comments
* indexed by the tree nodes they refer to. * indexed by the tree nodes they refer to.
* defined only if option flag keepDocComment is set. * defined only if option flag keepDocComment is set.
*/ */
private final Map<JCTree, String> docComments; private final DocCommentTable docComments;
/** Make an entry into docComments hashtable, /** Make an entry into docComments hashtable,
* provided flag keepDocComments is set and given doc comment is non-null. * provided flag keepDocComments is set and given doc comment is non-null.
* @param tree The tree to be used as index in the hashtable * @param tree The tree to be used as index in the hashtable
* @param dc The doc comment to associate with the tree, or null. * @param dc The doc comment to associate with the tree, or null.
*/ */
void attach(JCTree tree, String dc) { void attach(JCTree tree, Comment dc) {
if (keepDocComments && dc != null) { if (keepDocComments && dc != null) {
// System.out.println("doc comment = ");System.out.println(dc);//DEBUG // System.out.println("doc comment = ");System.out.println(dc);//DEBUG
docComments.put(tree, dc); docComments.putComment(tree, dc);
} }
} }
@ -1858,7 +1863,7 @@ public class JavacParser implements Parser {
return List.of(parseStatement()); return List.of(parseStatement());
case MONKEYS_AT: case MONKEYS_AT:
case FINAL: { case FINAL: {
String dc = token.comment(CommentStyle.JAVADOC); Comment dc = token.comment(CommentStyle.JAVADOC);
JCModifiers mods = modifiersOpt(); JCModifiers mods = modifiersOpt();
if (token.kind == INTERFACE || if (token.kind == INTERFACE ||
token.kind == CLASS || token.kind == CLASS ||
@ -1875,13 +1880,13 @@ public class JavacParser implements Parser {
} }
} }
case ABSTRACT: case STRICTFP: { case ABSTRACT: case STRICTFP: {
String dc = token.comment(CommentStyle.JAVADOC); Comment dc = token.comment(CommentStyle.JAVADOC);
JCModifiers mods = modifiersOpt(); JCModifiers mods = modifiersOpt();
return List.of(classOrInterfaceOrEnumDeclaration(mods, dc)); return List.of(classOrInterfaceOrEnumDeclaration(mods, dc));
} }
case INTERFACE: case INTERFACE:
case CLASS: case CLASS:
String dc = token.comment(CommentStyle.JAVADOC); Comment dc = token.comment(CommentStyle.JAVADOC);
return List.of(classOrInterfaceOrEnumDeclaration(modifiersOpt(), dc)); return List.of(classOrInterfaceOrEnumDeclaration(modifiersOpt(), dc));
case ENUM: case ENUM:
case ASSERT: case ASSERT:
@ -2418,7 +2423,7 @@ public class JavacParser implements Parser {
JCExpression type, JCExpression type,
Name name, Name name,
boolean reqInit, boolean reqInit,
String dc, Comment dc,
T vdefs) T vdefs)
{ {
vdefs.append(variableDeclaratorRest(pos, mods, type, name, reqInit, dc)); vdefs.append(variableDeclaratorRest(pos, mods, type, name, reqInit, dc));
@ -2434,7 +2439,7 @@ public class JavacParser implements Parser {
/** VariableDeclarator = Ident VariableDeclaratorRest /** VariableDeclarator = Ident VariableDeclaratorRest
* ConstantDeclarator = Ident ConstantDeclaratorRest * ConstantDeclarator = Ident ConstantDeclaratorRest
*/ */
JCVariableDecl variableDeclarator(JCModifiers mods, JCExpression type, boolean reqInit, String dc) { JCVariableDecl variableDeclarator(JCModifiers mods, JCExpression type, boolean reqInit, Comment dc) {
return variableDeclaratorRest(token.pos, mods, type, ident(), reqInit, dc); return variableDeclaratorRest(token.pos, mods, type, ident(), reqInit, dc);
} }
@ -2445,7 +2450,7 @@ public class JavacParser implements Parser {
* @param dc The documentation comment for the variable declarations, or null. * @param dc The documentation comment for the variable declarations, or null.
*/ */
JCVariableDecl variableDeclaratorRest(int pos, JCModifiers mods, JCExpression type, Name name, JCVariableDecl variableDeclaratorRest(int pos, JCModifiers mods, JCExpression type, Name name,
boolean reqInit, String dc) { boolean reqInit, Comment dc) {
type = bracketsOpt(type); type = bracketsOpt(type);
JCExpression init = null; JCExpression init = null;
if (token.kind == EQ) { if (token.kind == EQ) {
@ -2539,7 +2544,7 @@ public class JavacParser implements Parser {
seenImport = true; seenImport = true;
defs.append(importDeclaration()); defs.append(importDeclaration());
} else { } else {
String docComment = token.comment(CommentStyle.JAVADOC); Comment docComment = token.comment(CommentStyle.JAVADOC);
if (firstTypeDecl && !seenImport && !seenPackage) { if (firstTypeDecl && !seenImport && !seenPackage) {
docComment = firstToken.comment(CommentStyle.JAVADOC); docComment = firstToken.comment(CommentStyle.JAVADOC);
consumedToplevelDoc = true; consumedToplevelDoc = true;
@ -2597,7 +2602,7 @@ public class JavacParser implements Parser {
/** TypeDeclaration = ClassOrInterfaceOrEnumDeclaration /** TypeDeclaration = ClassOrInterfaceOrEnumDeclaration
* | ";" * | ";"
*/ */
JCTree typeDeclaration(JCModifiers mods, String docComment) { JCTree typeDeclaration(JCModifiers mods, Comment docComment) {
int pos = token.pos; int pos = token.pos;
if (mods == null && token.kind == SEMI) { if (mods == null && token.kind == SEMI) {
nextToken(); nextToken();
@ -2612,7 +2617,7 @@ public class JavacParser implements Parser {
* @param mods Any modifiers starting the class or interface declaration * @param mods Any modifiers starting the class or interface declaration
* @param dc The documentation comment for the class, or null. * @param dc The documentation comment for the class, or null.
*/ */
JCStatement classOrInterfaceOrEnumDeclaration(JCModifiers mods, String dc) { JCStatement classOrInterfaceOrEnumDeclaration(JCModifiers mods, Comment dc) {
if (token.kind == CLASS) { if (token.kind == CLASS) {
return classDeclaration(mods, dc); return classDeclaration(mods, dc);
} else if (token.kind == INTERFACE) { } else if (token.kind == INTERFACE) {
@ -2656,7 +2661,7 @@ public class JavacParser implements Parser {
* @param mods The modifiers starting the class declaration * @param mods The modifiers starting the class declaration
* @param dc The documentation comment for the class, or null. * @param dc The documentation comment for the class, or null.
*/ */
protected JCClassDecl classDeclaration(JCModifiers mods, String dc) { protected JCClassDecl classDeclaration(JCModifiers mods, Comment dc) {
int pos = token.pos; int pos = token.pos;
accept(CLASS); accept(CLASS);
Name name = ident(); Name name = ident();
@ -2685,7 +2690,7 @@ public class JavacParser implements Parser {
* @param mods The modifiers starting the interface declaration * @param mods The modifiers starting the interface declaration
* @param dc The documentation comment for the interface, or null. * @param dc The documentation comment for the interface, or null.
*/ */
protected JCClassDecl interfaceDeclaration(JCModifiers mods, String dc) { protected JCClassDecl interfaceDeclaration(JCModifiers mods, Comment dc) {
int pos = token.pos; int pos = token.pos;
accept(INTERFACE); accept(INTERFACE);
Name name = ident(); Name name = ident();
@ -2708,7 +2713,7 @@ public class JavacParser implements Parser {
* @param mods The modifiers starting the enum declaration * @param mods The modifiers starting the enum declaration
* @param dc The documentation comment for the enum, or null. * @param dc The documentation comment for the enum, or null.
*/ */
protected JCClassDecl enumDeclaration(JCModifiers mods, String dc) { protected JCClassDecl enumDeclaration(JCModifiers mods, Comment dc) {
int pos = token.pos; int pos = token.pos;
accept(ENUM); accept(ENUM);
Name name = ident(); Name name = ident();
@ -2767,7 +2772,7 @@ public class JavacParser implements Parser {
/** EnumeratorDeclaration = AnnotationsOpt [TypeArguments] IDENTIFIER [ Arguments ] [ "{" ClassBody "}" ] /** EnumeratorDeclaration = AnnotationsOpt [TypeArguments] IDENTIFIER [ Arguments ] [ "{" ClassBody "}" ]
*/ */
JCTree enumeratorDeclaration(Name enumName) { JCTree enumeratorDeclaration(Name enumName) {
String dc = token.comment(CommentStyle.JAVADOC); Comment dc = token.comment(CommentStyle.JAVADOC);
int flags = Flags.PUBLIC|Flags.STATIC|Flags.FINAL|Flags.ENUM; int flags = Flags.PUBLIC|Flags.STATIC|Flags.FINAL|Flags.ENUM;
if (token.deprecatedFlag()) { if (token.deprecatedFlag()) {
flags |= Flags.DEPRECATED; flags |= Flags.DEPRECATED;
@ -2856,7 +2861,7 @@ public class JavacParser implements Parser {
nextToken(); nextToken();
return List.<JCTree>nil(); return List.<JCTree>nil();
} else { } else {
String dc = token.comment(CommentStyle.JAVADOC); Comment dc = token.comment(CommentStyle.JAVADOC);
int pos = token.pos; int pos = token.pos;
JCModifiers mods = modifiersOpt(); JCModifiers mods = modifiersOpt();
if (token.kind == CLASS || if (token.kind == CLASS ||
@ -2936,7 +2941,7 @@ public class JavacParser implements Parser {
Name name, Name name,
List<JCTypeParameter> typarams, List<JCTypeParameter> typarams,
boolean isInterface, boolean isVoid, boolean isInterface, boolean isVoid,
String dc) { Comment dc) {
List<JCVariableDecl> params = formalParameters(); List<JCVariableDecl> params = formalParameters();
if (!isVoid) type = bracketsOpt(type); if (!isVoid) type = bracketsOpt(type);
List<JCExpression> thrown = List.nil(); List<JCExpression> thrown = List.nil();

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -62,19 +62,54 @@ public class JavadocTokenizer extends JavaTokenizer {
@Override @Override
protected Comment processComment(int pos, int endPos, CommentStyle style) { protected Comment processComment(int pos, int endPos, CommentStyle style) {
char[] buf = reader.getRawCharacters(pos, endPos); char[] buf = reader.getRawCharacters(pos, endPos);
return new JavadocComment(new ColReader(fac, buf, buf.length), style); return new JavadocComment(new DocReader(fac, buf, buf.length, pos), style);
} }
/** /**
* This is a specialized version of UnicodeReader that keeps track of the * This is a specialized version of UnicodeReader that keeps track of the
* column position within a given character stream (used for Javadoc processing). * column position within a given character stream (used for Javadoc processing),
* and which builds a table for mapping positions in the comment string to
* positions in the source file.
*/ */
static class ColReader extends UnicodeReader { static class DocReader extends UnicodeReader {
int col; int col;
int startPos;
ColReader(ScannerFactory fac, char[] input, int inputLength) { /**
* A buffer for building a table for mapping positions in {@link #sbuf}
* to positions in the source buffer.
*
* The array is organized as a series of pairs of integers: the first
* number in each pair specifies a position in the comment text,
* the second number in each pair specifies the corresponding position
* in the source buffer. The pairs are sorted in ascending order.
*
* Since the mapping function is generally continuous, with successive
* positions in the string corresponding to successive positions in the
* source buffer, the table only needs to record discontinuities in
* the mapping. The values of intermediate positions can be inferred.
*
* Discontinuities may occur in a number of places: when a newline
* is followed by whitespace and asterisks (which are ignored),
* when a tab is expanded into spaces, and when unicode escapes
* are used in the source buffer.
*
* Thus, to find the source position of any position, p, in the comment
* string, find the index, i, of the pair whose string offset
* ({@code pbuf[i] }) is closest to but not greater than p. Then,
* {@code sourcePos(p) = pbuf[i+1] + (p - pbuf[i]) }.
*/
int[] pbuf = new int[128];
/**
* The index of the next empty slot in the pbuf buffer.
*/
int pp = 0;
DocReader(ScannerFactory fac, char[] input, int inputLength, int startPos) {
super(fac, input, inputLength); super(fac, input, inputLength);
this.startPos = startPos;
} }
@Override @Override
@ -147,19 +182,43 @@ public class JavadocTokenizer extends JavaTokenizer {
break; break;
} }
} }
@Override
public void putChar(char ch, boolean scan) {
// At this point, bp is the position of the current character in buf,
// and sp is the position in sbuf where this character will be put.
// Record a new entry in pbuf if pbuf is empty or if sp and its
// corresponding source position are not equidistant from the
// corresponding values in the latest entry in the pbuf array.
// (i.e. there is a discontinuity in the map function.)
if ((pp == 0)
|| (sp - pbuf[pp - 2] != (startPos + bp) - pbuf[pp - 1])) {
if (pp + 1 >= pbuf.length) {
int[] new_pbuf = new int[pbuf.length * 2];
System.arraycopy(pbuf, 0, new_pbuf, 0, pbuf.length);
pbuf = new_pbuf;
}
pbuf[pp] = sp;
pbuf[pp + 1] = startPos + bp;
pp += 2;
}
super.putChar(ch, scan);
}
} }
protected class JavadocComment extends JavaTokenizer.BasicComment<ColReader> { protected class JavadocComment extends JavaTokenizer.BasicComment<DocReader> {
/** /**
* Translated and stripped contents of doc comment * Translated and stripped contents of doc comment
*/ */
private String docComment = null; private String docComment = null;
private int[] docPosns = null;
JavadocComment(ColReader comment_reader, CommentStyle cs) { JavadocComment(DocReader reader, CommentStyle cs) {
super(comment_reader, cs); super(reader, cs);
} }
@Override
public String getText() { public String getText() {
if (!scanned && cs == CommentStyle.JAVADOC) { if (!scanned && cs == CommentStyle.JAVADOC) {
scanDocComment(); scanDocComment();
@ -167,6 +226,33 @@ public class JavadocTokenizer extends JavaTokenizer {
return docComment; return docComment;
} }
@Override
public int getSourcePos(int pos) {
// Binary search to find the entry for which the string index is
// less than pos. Since docPosns is a list of pairs of integers
// we must make sure the index is always even.
// If we find an exact match for pos, the other item in the pair
// gives the source pos; otherwise, compute the source position
// relative to the best match found in the array.
if (pos < 0 || pos >= docComment.length())
throw new StringIndexOutOfBoundsException();
if (docPosns == null)
return -1;
int start = 0;
int end = docPosns.length;
while (start < end - 2) {
// find an even index midway between start and end
int index = ((start + end) / 4) * 2;
if (docPosns[index] < pos)
start = index;
else if (docPosns[index] == pos)
return docPosns[index + 1];
else
end = index;
}
return docPosns[start + 1] + (pos - docPosns[start]);
}
@Override @Override
@SuppressWarnings("fallthrough") @SuppressWarnings("fallthrough")
protected void scanDocComment() { protected void scanDocComment() {
@ -209,7 +295,8 @@ public class JavadocTokenizer extends JavaTokenizer {
// whitespace, then it consumes any stars, then it // whitespace, then it consumes any stars, then it
// puts the rest of the line into our buffer. // puts the rest of the line into our buffer.
while (comment_reader.bp < comment_reader.buflen) { while (comment_reader.bp < comment_reader.buflen) {
int begin_bp = comment_reader.bp;
char begin_ch = comment_reader.ch;
// The wsLoop consumes whitespace from the beginning // The wsLoop consumes whitespace from the beginning
// of each line. // of each line.
wsLoop: wsLoop:
@ -263,10 +350,10 @@ public class JavadocTokenizer extends JavaTokenizer {
break outerLoop; break outerLoop;
} }
} else if (! firstLine) { } else if (! firstLine) {
//The current line does not begin with a '*' so we will indent it. // The current line does not begin with a '*' so we will
for (int i = 1; i < comment_reader.col; i++) { // treat it as comment
comment_reader.putChar(' ', false); comment_reader.bp = begin_bp;
} comment_reader.ch = begin_ch;
} }
// The textLoop processes the rest of the characters // The textLoop processes the rest of the characters
// on the line, adding them to our buffer. // on the line, adding them to our buffer.
@ -334,11 +421,14 @@ public class JavadocTokenizer extends JavaTokenizer {
// Store the text of the doc comment // Store the text of the doc comment
docComment = comment_reader.chars(); docComment = comment_reader.chars();
docPosns = new int[comment_reader.pp];
System.arraycopy(comment_reader.pbuf, 0, docPosns, 0, docPosns.length);
} else { } else {
docComment = ""; docComment = "";
} }
} finally { } finally {
scanned = true; scanned = true;
comment_reader = null;
if (docComment != null && if (docComment != null &&
docComment.matches("(?sm).*^\\s*@deprecated( |$).*")) { docComment.matches("(?sm).*^\\s*@deprecated( |$).*")) {
deprecatedFlag = true; deprecatedFlag = true;

View File

@ -0,0 +1,67 @@
/*
* Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.tools.javac.parser;
import java.util.HashMap;
import java.util.Map;
import com.sun.tools.javac.parser.Tokens.Comment;
import com.sun.tools.javac.tree.DocCommentTable;
import com.sun.tools.javac.tree.JCTree;
/**
*
* <p><b>This is NOT part of any supported API.
* If you write code that depends on this, you do so at your own risk.
* This code and its internal interfaces are subject to change or
* deletion without notice.</b>
*/
public class SimpleDocCommentTable implements DocCommentTable {
Map<JCTree, Comment> table;
SimpleDocCommentTable() {
table = new HashMap<JCTree, Comment>();
}
public boolean hasComment(JCTree tree) {
return table.containsKey(tree);
}
public Comment getComment(JCTree tree) {
return table.get(tree);
}
public String getCommentText(JCTree tree) {
Comment c = getComment(tree);
return (c == null) ? null : c.getText();
}
public void putComment(JCTree tree, Comment c) {
table.put(tree, c);
}
}

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -294,6 +294,7 @@ public class Tokens {
} }
String getText(); String getText();
int getSourcePos(int index);
CommentStyle getStyle(); CommentStyle getStyle();
boolean isDeprecated(); boolean isDeprecated();
} }
@ -371,11 +372,11 @@ public class Tokens {
* Preserve classic semantics - if multiple javadocs are found on the token * Preserve classic semantics - if multiple javadocs are found on the token
* the last one is returned * the last one is returned
*/ */
public String comment(Comment.CommentStyle style) { public Comment comment(Comment.CommentStyle style) {
List<Comment> readers = getReaders(Comment.CommentStyle.JAVADOC); List<Comment> comments = getComments(Comment.CommentStyle.JAVADOC);
return readers.isEmpty() ? return comments.isEmpty() ?
null : null :
readers.head.getText(); comments.head;
} }
/** /**
@ -383,22 +384,22 @@ public class Tokens {
* javadoc comment attached to this token contains the '@deprecated' string * javadoc comment attached to this token contains the '@deprecated' string
*/ */
public boolean deprecatedFlag() { public boolean deprecatedFlag() {
for (Comment r : getReaders(Comment.CommentStyle.JAVADOC)) { for (Comment c : getComments(Comment.CommentStyle.JAVADOC)) {
if (r.isDeprecated()) { if (c.isDeprecated()) {
return true; return true;
} }
} }
return false; return false;
} }
private List<Comment> getReaders(Comment.CommentStyle style) { private List<Comment> getComments(Comment.CommentStyle style) {
if (comments == null) { if (comments == null) {
return List.nil(); return List.nil();
} else { } else {
ListBuffer<Comment> buf = ListBuffer.lb(); ListBuffer<Comment> buf = ListBuffer.lb();
for (Comment r : comments) { for (Comment c : comments) {
if (r.getStyle() == style) { if (c.getStyle() == style) {
buf.add(r); buf.add(c);
} }
} }
return buf.toList(); return buf.toList();

View File

@ -0,0 +1,57 @@
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.tools.javac.tree;
import com.sun.tools.javac.parser.Tokens.Comment;
/**
* A table giving the doc comment, if any, for any tree node.
*
* <p><b>This is NOT part of any supported API.
* If you write code that depends on this, you do so at your own
* risk. This code and its internal interfaces are subject to change
* or deletion without notice.</b>
*/
public interface DocCommentTable {
/**
* Check if a tree node has a corresponding doc comment.
*/
public boolean hasComment(JCTree tree);
/**
* Get the Comment token containing the doc comment, if any, for a tree node.
*/
public Comment getComment(JCTree tree);
/**
* Get the plain text of the doc comment, if any, for a tree node.
*/
public String getCommentText(JCTree tree);
/**
* Set the Comment to be associated with a tree node.
*/
public void putComment(JCTree tree, Comment c);
}

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -22,9 +22,8 @@
* or visit www.oracle.com if you need additional information or have any * or visit www.oracle.com if you need additional information or have any
* questions. * questions.
*/ */
package com.sun.tools.javac.parser;
import com.sun.tools.javac.tree.JCTree; package com.sun.tools.javac.tree;
/** /**
* Specifies the methods to access a mappings of syntax trees to end positions. * Specifies the methods to access a mappings of syntax trees to end positions.

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -25,25 +25,23 @@
package com.sun.tools.javac.tree; package com.sun.tools.javac.tree;
import java.util.*;
import java.io.IOException; import java.io.IOException;
import java.io.StringWriter; import java.io.StringWriter;
import java.util.*;
import javax.lang.model.element.Modifier; import javax.lang.model.element.Modifier;
import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeKind;
import javax.tools.JavaFileObject; import javax.tools.JavaFileObject;
import com.sun.tools.javac.util.*;
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
import com.sun.tools.javac.util.List;
import com.sun.tools.javac.code.*;
import com.sun.tools.javac.code.Scope.*;
import com.sun.tools.javac.code.Symbol.*;
import com.sun.tools.javac.parser.EndPosTable;
import com.sun.source.tree.*; import com.sun.source.tree.*;
import com.sun.source.tree.LambdaExpressionTree.BodyKind; import com.sun.source.tree.LambdaExpressionTree.BodyKind;
import com.sun.source.tree.MemberReferenceTree.ReferenceMode; import com.sun.source.tree.MemberReferenceTree.ReferenceMode;
import com.sun.tools.javac.code.*;
import com.sun.tools.javac.code.Scope.*;
import com.sun.tools.javac.code.Symbol.*;
import com.sun.tools.javac.util.*;
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
import com.sun.tools.javac.util.List;
import static com.sun.tools.javac.code.BoundKind.*; import static com.sun.tools.javac.code.BoundKind.*;
import static com.sun.tools.javac.tree.JCTree.Tag.*; import static com.sun.tools.javac.tree.JCTree.Tag.*;
@ -491,7 +489,7 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
public ImportScope namedImportScope; public ImportScope namedImportScope;
public StarImportScope starImportScope; public StarImportScope starImportScope;
public Position.LineMap lineMap = null; public Position.LineMap lineMap = null;
public Map<JCTree, String> docComments = null; public DocCommentTable docComments = null;
public EndPosTable endPositions = null; public EndPosTable endPositions = null;
protected JCCompilationUnit(List<JCAnnotation> packageAnnotations, protected JCCompilationUnit(List<JCAnnotation> packageAnnotations,
JCExpression pid, JCExpression pid,

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -29,14 +29,12 @@ import java.io.*;
import java.util.*; import java.util.*;
import com.sun.source.tree.MemberReferenceTree.ReferenceMode; import com.sun.source.tree.MemberReferenceTree.ReferenceMode;
import com.sun.tools.javac.code.*;
import com.sun.tools.javac.code.Symbol.*;
import com.sun.tools.javac.parser.Tokens.Comment;
import com.sun.tools.javac.tree.JCTree.*;
import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.*;
import com.sun.tools.javac.util.List; import com.sun.tools.javac.util.List;
import com.sun.tools.javac.code.*;
import com.sun.tools.javac.code.Symbol.*;
import com.sun.tools.javac.tree.JCTree.*;
import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Flags.*;
import static com.sun.tools.javac.code.Flags.ANNOTATION; import static com.sun.tools.javac.code.Flags.ANNOTATION;
import static com.sun.tools.javac.tree.JCTree.Tag.*; import static com.sun.tools.javac.tree.JCTree.Tag.*;
@ -78,10 +76,10 @@ public class Pretty extends JCTree.Visitor {
*/ */
Name enclClassName; Name enclClassName;
/** A hashtable mapping trees to their documentation comments /** A table mapping trees to their documentation comments
* (can be null) * (can be null)
*/ */
Map<JCTree, String> docComments = null; DocCommentTable docComments = null;
/** Align code to be indented to left margin. /** Align code to be indented to left margin.
*/ */
@ -233,7 +231,7 @@ public class Pretty extends JCTree.Visitor {
*/ */
public void printDocComment(JCTree tree) throws IOException { public void printDocComment(JCTree tree) throws IOException {
if (docComments != null) { if (docComments != null) {
String dc = docComments.get(tree); String dc = docComments.getCommentText(tree);
if (dc != null) { if (dc != null) {
print("/**"); println(); print("/**"); println();
int pos = 0; int pos = 0;
@ -480,7 +478,7 @@ public class Pretty extends JCTree.Visitor {
public void visitVarDef(JCVariableDecl tree) { public void visitVarDef(JCVariableDecl tree) {
try { try {
if (docComments != null && docComments.get(tree) != null) { if (docComments != null && docComments.hasComment(tree)) {
println(); align(); println(); align();
} }
printDocComment(tree); printDocComment(tree);

View File

@ -25,15 +25,14 @@
package com.sun.tools.javac.tree; package com.sun.tools.javac.tree;
import com.sun.source.tree.Tree; import com.sun.source.tree.Tree;
import com.sun.tools.javac.code.*;
import com.sun.tools.javac.comp.AttrContext; import com.sun.tools.javac.comp.AttrContext;
import com.sun.tools.javac.comp.Env; import com.sun.tools.javac.comp.Env;
import com.sun.tools.javac.tree.JCTree.*;
import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.*;
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
import com.sun.tools.javac.code.*;
import com.sun.tools.javac.parser.EndPosTable;
import com.sun.tools.javac.tree.JCTree.*;
import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Flags.*;
import static com.sun.tools.javac.tree.JCTree.Tag.*; import static com.sun.tools.javac.tree.JCTree.Tag.*;
import static com.sun.tools.javac.tree.JCTree.Tag.BLOCK; import static com.sun.tools.javac.tree.JCTree.Tag.BLOCK;
@ -282,6 +281,13 @@ public class TreeInfo {
return (lit.typetag == TypeTags.BOT); return (lit.typetag == TypeTags.BOT);
} }
public static String getCommentText(Env<?> env, JCTree tree) {
DocCommentTable docComments = (tree.hasTag(JCTree.Tag.TOPLEVEL))
? ((JCCompilationUnit) tree).docComments
: env.toplevel.docComments;
return (docComments == null) ? null : docComments.getCommentText(tree);
}
/** The position of the first statement in a block, or the position of /** The position of the first statement in a block, or the position of
* the block itself if it is empty. * the block itself if it is empty.
*/ */

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -32,7 +32,7 @@ import java.util.Map;
import javax.tools.JavaFileObject; import javax.tools.JavaFileObject;
import com.sun.tools.javac.file.JavacFileManager; import com.sun.tools.javac.file.JavacFileManager;
import com.sun.tools.javac.parser.EndPosTable; import com.sun.tools.javac.tree.EndPosTable;
import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.tree.JCTree;
import static com.sun.tools.javac.util.LayoutCharacters.*; import static com.sun.tools.javac.util.LayoutCharacters.*;

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -35,7 +35,7 @@ import javax.tools.JavaFileObject;
import com.sun.tools.javac.api.DiagnosticFormatter; import com.sun.tools.javac.api.DiagnosticFormatter;
import com.sun.tools.javac.code.Lint.LintCategory; import com.sun.tools.javac.code.Lint.LintCategory;
import com.sun.tools.javac.parser.EndPosTable; import com.sun.tools.javac.tree.EndPosTable;
import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.tree.JCTree;
import static com.sun.tools.javac.util.JCDiagnostic.DiagnosticType.*; import static com.sun.tools.javac.util.JCDiagnostic.DiagnosticType.*;

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -37,7 +37,7 @@ import javax.tools.JavaFileObject;
import com.sun.tools.javac.api.DiagnosticFormatter; import com.sun.tools.javac.api.DiagnosticFormatter;
import com.sun.tools.javac.main.Main; import com.sun.tools.javac.main.Main;
import com.sun.tools.javac.main.Option; import com.sun.tools.javac.main.Option;
import com.sun.tools.javac.parser.EndPosTable; import com.sun.tools.javac.tree.EndPosTable;
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticType; import com.sun.tools.javac.util.JCDiagnostic.DiagnosticType;

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -25,14 +25,17 @@
package com.sun.tools.javadoc; package com.sun.tools.javadoc;
import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; import javax.tools.JavaFileObject;
import com.sun.tools.javac.util.List;
import com.sun.tools.javac.code.Kinds; import com.sun.tools.javac.code.Kinds;
import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.code.Symbol.*;
import com.sun.tools.javac.comp.Enter; import com.sun.tools.javac.comp.Enter;
import com.sun.tools.javac.tree.JCTree.*; import com.sun.tools.javac.tree.JCTree.*;
import javax.tools.JavaFileObject; import com.sun.tools.javac.tree.TreeInfo;
import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
import com.sun.tools.javac.util.List;
/** /**
* Javadoc's own enter phase does a few things above and beyond that * Javadoc's own enter phase does a few things above and beyond that
@ -77,7 +80,7 @@ public class JavadocEnter extends Enter {
public void visitTopLevel(JCCompilationUnit tree) { public void visitTopLevel(JCCompilationUnit tree) {
super.visitTopLevel(tree); super.visitTopLevel(tree);
if (tree.sourcefile.isNameCompatible("package-info", JavaFileObject.Kind.SOURCE)) { if (tree.sourcefile.isNameCompatible("package-info", JavaFileObject.Kind.SOURCE)) {
String comment = tree.docComments.get(tree); String comment = TreeInfo.getCommentText(env, tree);
docenv.makePackageDoc(tree.packge, comment, tree); docenv.makePackageDoc(tree.packge, comment, tree);
} }
} }
@ -87,7 +90,7 @@ public class JavadocEnter extends Enter {
super.visitClassDef(tree); super.visitClassDef(tree);
if (tree.sym == null) return; if (tree.sym == null) return;
if (tree.sym.kind == Kinds.TYP || tree.sym.kind == Kinds.ERR) { if (tree.sym.kind == Kinds.TYP || tree.sym.kind == Kinds.ERR) {
String comment = env.toplevel.docComments.get(tree); String comment = TreeInfo.getCommentText(env, tree);
ClassSymbol c = tree.sym; ClassSymbol c = tree.sym;
docenv.makeClassDoc(c, comment, tree, env.toplevel.lineMap); docenv.makeClassDoc(c, comment, tree, env.toplevel.lineMap);
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -25,13 +25,14 @@
package com.sun.tools.javadoc; package com.sun.tools.javadoc;
import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.util.Position;
import com.sun.tools.javac.code.Flags; import com.sun.tools.javac.code.Flags;
import com.sun.tools.javac.code.Kinds; import com.sun.tools.javac.code.Kinds;
import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.code.Symbol.*;
import com.sun.tools.javac.comp.MemberEnter; import com.sun.tools.javac.comp.MemberEnter;
import com.sun.tools.javac.tree.JCTree.*; import com.sun.tools.javac.tree.JCTree.*;
import com.sun.tools.javac.tree.TreeInfo;
import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.util.Position;
/** /**
* Javadoc's own memberEnter phase does a few things above and beyond that * Javadoc's own memberEnter phase does a few things above and beyond that
@ -61,11 +62,12 @@ public class JavadocMemberEnter extends MemberEnter {
docenv = DocEnv.instance(context); docenv = DocEnv.instance(context);
} }
@Override
public void visitMethodDef(JCMethodDecl tree) { public void visitMethodDef(JCMethodDecl tree) {
super.visitMethodDef(tree); super.visitMethodDef(tree);
MethodSymbol meth = tree.sym; MethodSymbol meth = tree.sym;
if (meth == null || meth.kind != Kinds.MTH) return; if (meth == null || meth.kind != Kinds.MTH) return;
String docComment = env.toplevel.docComments.get(tree); String docComment = TreeInfo.getCommentText(env, tree);
Position.LineMap lineMap = env.toplevel.lineMap; Position.LineMap lineMap = env.toplevel.lineMap;
if (meth.isConstructor()) if (meth.isConstructor())
docenv.makeConstructorDoc(meth, docComment, tree, lineMap); docenv.makeConstructorDoc(meth, docComment, tree, lineMap);
@ -75,12 +77,13 @@ public class JavadocMemberEnter extends MemberEnter {
docenv.makeMethodDoc(meth, docComment, tree, lineMap); docenv.makeMethodDoc(meth, docComment, tree, lineMap);
} }
@Override
public void visitVarDef(JCVariableDecl tree) { public void visitVarDef(JCVariableDecl tree) {
super.visitVarDef(tree); super.visitVarDef(tree);
if (tree.sym != null && if (tree.sym != null &&
tree.sym.kind == Kinds.VAR && tree.sym.kind == Kinds.VAR &&
!isParameter(tree.sym)) { !isParameter(tree.sym)) {
String docComment = env.toplevel.docComments.get(tree); String docComment = TreeInfo.getCommentText(env, tree);
Position.LineMap lineMap = env.toplevel.lineMap; Position.LineMap lineMap = env.toplevel.lineMap;
docenv.makeFieldDoc(tree.sym, docComment, tree, lineMap); docenv.makeFieldDoc(tree.sym, docComment, tree, lineMap);
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -33,9 +33,9 @@ import java.net.URI;
import javax.tools.JavaFileObject; import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject; import javax.tools.SimpleJavaFileObject;
import com.sun.tools.javac.file.JavacFileManager; import com.sun.tools.javac.file.JavacFileManager;
import com.sun.tools.javac.parser.EndPosTable;
import com.sun.tools.javac.parser.Parser; import com.sun.tools.javac.parser.Parser;
import com.sun.tools.javac.parser.ParserFactory; import com.sun.tools.javac.parser.ParserFactory;
import com.sun.tools.javac.tree.EndPosTable;
import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.tree.JCTree;
import com.sun.tools.javac.tree.TreeScanner; import com.sun.tools.javac.tree.TreeScanner;
import com.sun.tools.javac.util.Context; import com.sun.tools.javac.util.Context;

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -68,7 +68,7 @@ import com.sun.source.util.TaskListener;
import com.sun.tools.javac.api.JavacTool; import com.sun.tools.javac.api.JavacTool;
import com.sun.tools.javac.code.Symbol; import com.sun.tools.javac.code.Symbol;
import com.sun.tools.javac.code.Type; import com.sun.tools.javac.code.Type;
import com.sun.tools.javac.parser.EndPosTable; import com.sun.tools.javac.tree.EndPosTable;
import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.tree.JCTree;
import com.sun.tools.javac.tree.JCTree.JCCompilationUnit; import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
import com.sun.tools.javac.tree.JCTree.JCImport; import com.sun.tools.javac.tree.JCTree.JCImport;

View File

@ -23,7 +23,7 @@
/* /*
* @test * @test
* @bug 7073631 7159445 * @bug 7073631 7159445 7156633
* @summary tests error and diagnostics positions * @summary tests error and diagnostics positions
* @author Jan Lahoda * @author Jan Lahoda
*/ */
@ -49,11 +49,17 @@ import com.sun.source.util.Trees;
import com.sun.tools.javac.api.JavacTaskImpl; import com.sun.tools.javac.api.JavacTaskImpl;
import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.tree.JCTree;
import java.io.IOException; import java.io.IOException;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;
import java.net.URI; import java.net.URI;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.regex.Pattern;
import javax.tools.Diagnostic; import javax.tools.Diagnostic;
import javax.tools.DiagnosticCollector; import javax.tools.DiagnosticCollector;
import javax.tools.DiagnosticListener; import javax.tools.DiagnosticListener;
@ -63,13 +69,15 @@ import javax.tools.SimpleJavaFileObject;
import javax.tools.ToolProvider; import javax.tools.ToolProvider;
public class JavacParserTest extends TestCase { public class JavacParserTest extends TestCase {
final JavaCompiler tool; static final JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
public JavacParserTest(String testName) {
tool = ToolProvider.getSystemJavaCompiler(); private JavacParserTest(){}
System.out.println("java.home=" + System.getProperty("java.home"));
public static void main(String... args) throws Exception {
new JavacParserTest().run(args);
} }
static class MyFileObject extends SimpleJavaFileObject { class MyFileObject extends SimpleJavaFileObject {
private String text; private String text;
@ -86,11 +94,11 @@ public class JavacParserTest extends TestCase {
/* /*
* converts Windows to Unix style LFs for comparing strings * converts Windows to Unix style LFs for comparing strings
*/ */
private String normalize(String in) { String normalize(String in) {
return in.replace(System.getProperty("line.separator"), "\n"); return in.replace(System.getProperty("line.separator"), "\n");
} }
public CompilationUnitTree getCompilationUnitTree(String code) throws IOException { CompilationUnitTree getCompilationUnitTree(String code) throws IOException {
JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null, null, JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null, null,
null, Arrays.asList(new MyFileObject(code))); null, Arrays.asList(new MyFileObject(code)));
@ -98,7 +106,7 @@ public class JavacParserTest extends TestCase {
return cut; return cut;
} }
public List<String> getErroneousTreeValues(ErroneousTree node) { List<String> getErroneousTreeValues(ErroneousTree node) {
List<String> values = new ArrayList<>(); List<String> values = new ArrayList<>();
if (node.getErrorTrees() != null) { if (node.getErrorTrees() != null) {
@ -112,7 +120,8 @@ public class JavacParserTest extends TestCase {
return values; return values;
} }
public void testPositionForSuperConstructorCalls() throws IOException { @Test
void testPositionForSuperConstructorCalls() throws IOException {
assert tool != null; assert tool != null;
String code = "package test; public class Test {public Test() {super();}}"; String code = "package test; public class Test {public Test() {super();}}";
@ -149,12 +158,12 @@ public class JavacParserTest extends TestCase {
methodStartPos, pos.getStartPosition(cut, mit.getMethodSelect())); methodStartPos, pos.getStartPosition(cut, mit.getMethodSelect()));
assertEquals("testPositionForSuperConstructorCalls", assertEquals("testPositionForSuperConstructorCalls",
methodEndPos, pos.getEndPosition(cut, mit.getMethodSelect())); methodEndPos, pos.getEndPosition(cut, mit.getMethodSelect()));
} }
public void testPositionForEnumModifiers() throws IOException { @Test
void testPositionForEnumModifiers() throws IOException {
String code = "package test; public enum Test {A;}"; final String theString = "public";
String code = "package test; " + theString + " enum Test {A;}";
JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null, null, JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null, null,
null, Arrays.asList(new MyFileObject(code))); null, Arrays.asList(new MyFileObject(code)));
@ -163,19 +172,21 @@ public class JavacParserTest extends TestCase {
ClassTree clazz = (ClassTree) cut.getTypeDecls().get(0); ClassTree clazz = (ClassTree) cut.getTypeDecls().get(0);
ModifiersTree mt = clazz.getModifiers(); ModifiersTree mt = clazz.getModifiers();
int spos = code.indexOf(theString);
int epos = spos + theString.length();
assertEquals("testPositionForEnumModifiers", assertEquals("testPositionForEnumModifiers",
38 - 24, pos.getStartPosition(cut, mt)); spos, pos.getStartPosition(cut, mt));
assertEquals("testPositionForEnumModifiers", assertEquals("testPositionForEnumModifiers",
44 - 24, pos.getEndPosition(cut, mt)); epos, pos.getEndPosition(cut, mt));
} }
public void testNewClassWithEnclosing() throws IOException { @Test
void testNewClassWithEnclosing() throws IOException {
final String theString = "Test.this.new d()";
String code = "package test; class Test { " + String code = "package test; class Test { " +
"class d {} private void method() { " + "class d {} private void method() { " +
"Object o = Test.this.new d(); } }"; "Object o = " + theString + "; } }";
JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null, null, JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null, null,
null, Arrays.asList(new MyFileObject(code))); null, Arrays.asList(new MyFileObject(code)));
@ -186,13 +197,16 @@ public class JavacParserTest extends TestCase {
ExpressionTree est = ExpressionTree est =
((VariableTree) ((MethodTree) clazz.getMembers().get(1)).getBody().getStatements().get(0)).getInitializer(); ((VariableTree) ((MethodTree) clazz.getMembers().get(1)).getBody().getStatements().get(0)).getInitializer();
final int spos = code.indexOf(theString);
final int epos = spos + theString.length();
assertEquals("testNewClassWithEnclosing", assertEquals("testNewClassWithEnclosing",
97 - 24, pos.getStartPosition(cut, est)); spos, pos.getStartPosition(cut, est));
assertEquals("testNewClassWithEnclosing", assertEquals("testNewClassWithEnclosing",
114 - 24, pos.getEndPosition(cut, est)); epos, pos.getEndPosition(cut, est));
} }
public void testPreferredPositionForBinaryOp() throws IOException { @Test
void testPreferredPositionForBinaryOp() throws IOException {
String code = "package test; public class Test {" String code = "package test; public class Test {"
+ "private void test() {" + "private void test() {"
@ -211,87 +225,8 @@ public class JavacParserTest extends TestCase {
condStartPos, condJC.pos); condStartPos, condJC.pos);
} }
public void testPositionBrokenSource126732a() throws IOException { @Test
String[] commands = new String[]{ void testErrorRecoveryForEnhancedForLoop142381() throws IOException {
"return Runnable()",
"do { } while (true)",
"throw UnsupportedOperationException()",
"assert true",
"1 + 1",};
for (String command : commands) {
String code = "package test;\n"
+ "public class Test {\n"
+ " public static void test() {\n"
+ " " + command + " {\n"
+ " new Runnable() {\n"
+ " };\n"
+ " }\n"
+ "}";
JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null,
null, null, Arrays.asList(new MyFileObject(code)));
CompilationUnitTree cut = ct.parse().iterator().next();
ClassTree clazz = (ClassTree) cut.getTypeDecls().get(0);
MethodTree method = (MethodTree) clazz.getMembers().get(0);
List<? extends StatementTree> statements =
method.getBody().getStatements();
StatementTree ret = statements.get(0);
StatementTree block = statements.get(1);
Trees t = Trees.instance(ct);
int len = code.indexOf(command + " {") + (command + " ").length();
assertEquals(command, len,
t.getSourcePositions().getEndPosition(cut, ret));
assertEquals(command, len,
t.getSourcePositions().getStartPosition(cut, block));
}
}
public void testPositionBrokenSource126732b() throws IOException {
String[] commands = new String[]{
"break",
"break A",
"continue ",
"continue A",};
for (String command : commands) {
String code = "package test;\n"
+ "public class Test {\n"
+ " public static void test() {\n"
+ " while (true) {\n"
+ " " + command + " {\n"
+ " new Runnable() {\n"
+ " };\n"
+ " }\n"
+ " }\n"
+ "}";
JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null,
null, null, Arrays.asList(new MyFileObject(code)));
CompilationUnitTree cut = ct.parse().iterator().next();
ClassTree clazz = (ClassTree) cut.getTypeDecls().get(0);
MethodTree method = (MethodTree) clazz.getMembers().get(0);
List<? extends StatementTree> statements =
((BlockTree) ((WhileLoopTree) method.getBody().getStatements().get(0)).getStatement()).getStatements();
StatementTree ret = statements.get(0);
StatementTree block = statements.get(1);
Trees t = Trees.instance(ct);
int len = code.indexOf(command + " {") + (command + " ").length();
assertEquals(command, len,
t.getSourcePositions().getEndPosition(cut, ret));
assertEquals(command, len,
t.getSourcePositions().getStartPosition(cut, block));
}
}
public void testErrorRecoveryForEnhancedForLoop142381() throws IOException {
String code = "package test; class Test { " + String code = "package test; class Test { " +
"private void method() { " + "private void method() { " +
@ -318,7 +253,8 @@ public class JavacParserTest extends TestCase {
assertFalse("testErrorRecoveryForEnhancedForLoop142381", errors.isEmpty()); assertFalse("testErrorRecoveryForEnhancedForLoop142381", errors.isEmpty());
} }
public void testPositionAnnotationNoPackage187551() throws IOException { @Test
void testPositionAnnotationNoPackage187551() throws IOException {
String code = "\n@interface Test {}"; String code = "\n@interface Test {}";
@ -333,15 +269,24 @@ public class JavacParserTest extends TestCase {
1, t.getSourcePositions().getStartPosition(cut, clazz)); 1, t.getSourcePositions().getStartPosition(cut, clazz));
} }
public void testPositionsSane() throws IOException { @Test
void testPositionsSane1() throws IOException {
performPositionsSanityTest("package test; class Test { " + performPositionsSanityTest("package test; class Test { " +
"private void method() { " + "private void method() { " +
"java.util.List<? extends java.util.List<? extends String>> l; " + "java.util.List<? extends java.util.List<? extends String>> l; " +
"} }"); "} }");
}
@Test
void testPositionsSane2() throws IOException {
performPositionsSanityTest("package test; class Test { " + performPositionsSanityTest("package test; class Test { " +
"private void method() { " + "private void method() { " +
"java.util.List<? super java.util.List<? super String>> l; " + "java.util.List<? super java.util.List<? super String>> l; " +
"} }"); "} }");
}
@Test
void testPositionsSane3() throws IOException {
performPositionsSanityTest("package test; class Test { " + performPositionsSanityTest("package test; class Test { " +
"private void method() { " + "private void method() { " +
"java.util.List<? super java.util.List<?>> l; } }"); "java.util.List<? super java.util.List<?>> l; } }");
@ -409,7 +354,8 @@ public class JavacParserTest extends TestCase {
}.scan(cut, null); }.scan(cut, null);
} }
public void testCorrectWilcardPositions() throws IOException { @Test
void testCorrectWilcardPositions1() throws IOException {
performWildcardPositionsTest("package test; import java.util.List; " + performWildcardPositionsTest("package test; import java.util.List; " +
"class Test { private void method() { List<? extends List<? extends String>> l; } }", "class Test { private void method() { List<? extends List<? extends String>> l; } }",
@ -421,9 +367,12 @@ public class JavacParserTest extends TestCase {
"List", "List",
"? extends String", "? extends String",
"String")); "String"));
performWildcardPositionsTest("package test; import java.util.List; " + }
"class Test { private void method() { List<? super List<? super String>> l; } }",
@Test
void testCorrectWilcardPositions2() throws IOException {
performWildcardPositionsTest("package test; import java.util.List; "
+ "class Test { private void method() { List<? super List<? super String>> l; } }",
Arrays.asList("List<? super List<? super String>> l;", Arrays.asList("List<? super List<? super String>> l;",
"List<? super List<? super String>>", "List<? super List<? super String>>",
"List", "List",
@ -432,6 +381,10 @@ public class JavacParserTest extends TestCase {
"List", "List",
"? super String", "? super String",
"String")); "String"));
}
@Test
void testCorrectWilcardPositions3() throws IOException {
performWildcardPositionsTest("package test; import java.util.List; " + performWildcardPositionsTest("package test; import java.util.List; " +
"class Test { private void method() { List<? super List<?>> l; } }", "class Test { private void method() { List<? super List<?>> l; } }",
@ -442,6 +395,10 @@ public class JavacParserTest extends TestCase {
"List<?>", "List<?>",
"List", "List",
"?")); "?"));
}
@Test
void testCorrectWilcardPositions4() throws IOException {
performWildcardPositionsTest("package test; import java.util.List; " + performWildcardPositionsTest("package test; import java.util.List; " +
"class Test { private void method() { " + "class Test { private void method() { " +
"List<? extends List<? extends List<? extends String>>> l; } }", "List<? extends List<? extends List<? extends String>>> l; } }",
@ -457,6 +414,10 @@ public class JavacParserTest extends TestCase {
"List", "List",
"? extends String", "? extends String",
"String")); "String"));
}
@Test
void testCorrectWilcardPositions5() throws IOException {
performWildcardPositionsTest("package test; import java.util.List; " + performWildcardPositionsTest("package test; import java.util.List; " +
"class Test { private void method() { " + "class Test { private void method() { " +
"List<? extends List<? extends List<? extends String >>> l; } }", "List<? extends List<? extends List<? extends String >>> l; } }",
@ -473,7 +434,7 @@ public class JavacParserTest extends TestCase {
"String")); "String"));
} }
public void performWildcardPositionsTest(final String code, void performWildcardPositionsTest(final String code,
List<String> golden) throws IOException { List<String> golden) throws IOException {
final List<Diagnostic<? extends JavaFileObject>> errors = final List<Diagnostic<? extends JavaFileObject>> errors =
@ -513,7 +474,8 @@ public class JavacParserTest extends TestCase {
content.toString()); content.toString());
} }
public void testStartPositionForMethodWithoutModifiers() throws IOException { @Test
void testStartPositionForMethodWithoutModifiers() throws IOException {
String code = "package t; class Test { <T> void t() {} }"; String code = "package t; class Test { <T> void t() {} }";
@ -530,23 +492,8 @@ public class JavacParserTest extends TestCase {
"<T> void t() {}", code.substring(start, end)); "<T> void t() {}", code.substring(start, end));
} }
public void testStartPositionEnumConstantInit() throws IOException { @Test
void testVariableInIfThen1() throws IOException {
String code = "package t; enum Test { AAA; }";
JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null, null,
null, Arrays.asList(new MyFileObject(code)));
CompilationUnitTree cut = ct.parse().iterator().next();
ClassTree clazz = (ClassTree) cut.getTypeDecls().get(0);
VariableTree enumAAA = (VariableTree) clazz.getMembers().get(0);
Trees t = Trees.instance(ct);
int start = (int) t.getSourcePositions().getStartPosition(cut,
enumAAA.getInitializer());
assertEquals("testStartPositionEnumConstantInit", -1, start);
}
public void testVariableInIfThen1() throws IOException {
String code = "package t; class Test { " + String code = "package t; class Test { " +
"private static void t(String name) { " + "private static void t(String name) { " +
@ -571,7 +518,8 @@ public class JavacParserTest extends TestCase {
codes); codes);
} }
public void testVariableInIfThen2() throws IOException { @Test
void testVariableInIfThen2() throws IOException {
String code = "package t; class Test { " + String code = "package t; class Test { " +
"private static void t(String name) { " + "private static void t(String name) { " +
@ -593,7 +541,8 @@ public class JavacParserTest extends TestCase {
Arrays.<String>asList("compiler.err.class.not.allowed"), codes); Arrays.<String>asList("compiler.err.class.not.allowed"), codes);
} }
public void testVariableInIfThen3() throws IOException { @Test
void testVariableInIfThen3() throws IOException {
String code = "package t; class Test { "+ String code = "package t; class Test { "+
"private static void t() { " + "private static void t() { " +
@ -615,7 +564,8 @@ public class JavacParserTest extends TestCase {
Arrays.<String>asList("compiler.err.class.not.allowed"), codes); Arrays.<String>asList("compiler.err.class.not.allowed"), codes);
} }
public void testVariableInIfThen4() throws IOException { @Test
void testVariableInIfThen4() throws IOException {
String code = "package t; class Test { "+ String code = "package t; class Test { "+
"private static void t(String name) { " + "private static void t(String name) { " +
@ -637,7 +587,8 @@ public class JavacParserTest extends TestCase {
Arrays.<String>asList("compiler.err.class.not.allowed"), codes); Arrays.<String>asList("compiler.err.class.not.allowed"), codes);
} }
public void testVariableInIfThen5() throws IOException { @Test
void testVariableInIfThen5() throws IOException {
String code = "package t; class Test { "+ String code = "package t; class Test { "+
"private static void t() { " + "private static void t() { " +
@ -661,7 +612,8 @@ public class JavacParserTest extends TestCase {
} }
// see javac bug #6882235, NB bug #98234: // see javac bug #6882235, NB bug #98234:
public void testMissingExponent() throws IOException { @Test
void testMissingExponent() throws IOException {
String code = "\nclass Test { { System.err.println(0e); } }"; String code = "\nclass Test { { System.err.println(0e); } }";
@ -671,7 +623,8 @@ public class JavacParserTest extends TestCase {
assertNotNull(ct.parse().iterator().next()); assertNotNull(ct.parse().iterator().next());
} }
public void testTryResourcePos() throws IOException { @Test
void testTryResourcePos() throws IOException {
final String code = "package t; class Test { " + final String code = "package t; class Test { " +
"{ try (java.io.InputStream in = null) { } } }"; "{ try (java.io.InputStream in = null) { } } }";
@ -683,7 +636,6 @@ public class JavacParserTest extends TestCase {
public Void visitVariable(VariableTree node, Void p) { public Void visitVariable(VariableTree node, Void p) {
if ("in".contentEquals(node.getName())) { if ("in".contentEquals(node.getName())) {
JCTree.JCVariableDecl var = (JCTree.JCVariableDecl) node; JCTree.JCVariableDecl var = (JCTree.JCVariableDecl) node;
System.out.println(node.getName() + "," + var.pos);
assertEquals("testTryResourcePos", "in = null) { } } }", assertEquals("testTryResourcePos", "in = null) { } } }",
code.substring(var.pos)); code.substring(var.pos));
} }
@ -692,7 +644,8 @@ public class JavacParserTest extends TestCase {
}.scan(cut, null); }.scan(cut, null);
} }
public void testVarPos() throws IOException { @Test
void testVarPos() throws IOException {
final String code = "package t; class Test { " + final String code = "package t; class Test { " +
"{ java.io.InputStream in = null; } }"; "{ java.io.InputStream in = null; } }";
@ -714,7 +667,8 @@ public class JavacParserTest extends TestCase {
} }
// expected erroneous tree: int x = y;(ERROR); // expected erroneous tree: int x = y;(ERROR);
public void testOperatorMissingError() throws IOException { @Test
void testOperatorMissingError() throws IOException {
String code = "package test; public class ErrorTest { " String code = "package test; public class ErrorTest { "
+ "void method() { int x = y z } }"; + "void method() { int x = y z } }";
@ -724,10 +678,8 @@ public class JavacParserTest extends TestCase {
new ArrayList<>(Arrays.asList("[z]")); new ArrayList<>(Arrays.asList("[z]"));
new TreeScanner<Void, Void>() { new TreeScanner<Void, Void>() {
@Override @Override
public Void visitErroneous(ErroneousTree node, Void p) { public Void visitErroneous(ErroneousTree node, Void p) {
values.add(getErroneousTreeValues(node).toString()); values.add(getErroneousTreeValues(node).toString());
return null; return null;
@ -741,7 +693,8 @@ public class JavacParserTest extends TestCase {
} }
// expected erroneous tree: String s = (ERROR); // expected erroneous tree: String s = (ERROR);
public void testMissingParenthesisError() throws IOException { @Test
void testMissingParenthesisError() throws IOException {
String code = "package test; public class ErrorTest { " String code = "package test; public class ErrorTest { "
+ "void f() {String s = new String; } }"; + "void f() {String s = new String; } }";
@ -751,10 +704,8 @@ public class JavacParserTest extends TestCase {
new ArrayList<>(Arrays.asList("[new String()]")); new ArrayList<>(Arrays.asList("[new String()]"));
new TreeScanner<Void, Void>() { new TreeScanner<Void, Void>() {
@Override @Override
public Void visitErroneous(ErroneousTree node, Void p) { public Void visitErroneous(ErroneousTree node, Void p) {
values.add(getErroneousTreeValues(node).toString()); values.add(getErroneousTreeValues(node).toString());
return null; return null;
} }
@ -767,7 +718,8 @@ public class JavacParserTest extends TestCase {
} }
// expected erroneous tree: package test; (ERROR)(ERROR) // expected erroneous tree: package test; (ERROR)(ERROR)
public void testMissingClassError() throws IOException { @Test
void testMissingClassError() throws IOException {
String code = "package Test; clas ErrorTest { " String code = "package Test; clas ErrorTest { "
+ "void f() {String s = new String(); } }"; + "void f() {String s = new String(); } }";
@ -777,10 +729,8 @@ public class JavacParserTest extends TestCase {
new ArrayList<>(Arrays.asList("[, clas]", "[]")); new ArrayList<>(Arrays.asList("[, clas]", "[]"));
new TreeScanner<Void, Void>() { new TreeScanner<Void, Void>() {
@Override @Override
public Void visitErroneous(ErroneousTree node, Void p) { public Void visitErroneous(ErroneousTree node, Void p) {
values.add(getErroneousTreeValues(node).toString()); values.add(getErroneousTreeValues(node).toString());
return null; return null;
} }
@ -793,7 +743,8 @@ public class JavacParserTest extends TestCase {
} }
// expected erroneous tree: void m1(int i) {(ERROR);{(ERROR);} // expected erroneous tree: void m1(int i) {(ERROR);{(ERROR);}
public void testSwitchError() throws IOException { @Test
void testSwitchError() throws IOException {
String code = "package test; public class ErrorTest { " String code = "package test; public class ErrorTest { "
+ "int numDays; void m1(int i) { switchh {i} { case 1: " + "int numDays; void m1(int i) { switchh {i} { case 1: "
@ -804,10 +755,8 @@ public class JavacParserTest extends TestCase {
new ArrayList<>(Arrays.asList("[switchh]", "[i]")); new ArrayList<>(Arrays.asList("[switchh]", "[i]"));
new TreeScanner<Void, Void>() { new TreeScanner<Void, Void>() {
@Override @Override
public Void visitErroneous(ErroneousTree node, Void p) { public Void visitErroneous(ErroneousTree node, Void p) {
values.add(getErroneousTreeValues(node).toString()); values.add(getErroneousTreeValues(node).toString());
return null; return null;
} }
@ -820,20 +769,20 @@ public class JavacParserTest extends TestCase {
} }
// expected erroneous tree: class ErrorTest {(ERROR) // expected erroneous tree: class ErrorTest {(ERROR)
public void testMethodError() throws IOException { @Test
void testMethodError() throws IOException {
String code = "package Test; class ErrorTest { " String code = "package Test; class ErrorTest { "
+ "static final void f) {String s = new String(); } }"; + "static final void f) {String s = new String(); } }";
CompilationUnitTree cut = getCompilationUnitTree(code); CompilationUnitTree cut = cut = getCompilationUnitTree(code);
final List<String> values = new ArrayList<>(); final List<String> values = new ArrayList<>();
final List<String> expectedValues = final List<String> expectedValues =
new ArrayList<>(Arrays.asList("[\nstatic final void f();]")); new ArrayList<>(Arrays.asList("[\nstatic final void f();]"));
new TreeScanner<Void, Void>() { new TreeScanner<Void, Void>() {
@Override @Override
public Void visitErroneous(ErroneousTree node, Void p) { public Void visitErroneous(ErroneousTree node, Void p) {
values.add(normalize(getErroneousTreeValues(node).toString())); values.add(normalize(getErroneousTreeValues(node).toString()));
return null; return null;
} }
@ -845,43 +794,135 @@ public class JavacParserTest extends TestCase {
+ expectedValues, values, expectedValues); + expectedValues, values, expectedValues);
} }
void testsNotWorking() throws IOException { /*
* The following tests do not work just yet with nb-javac nor javac,
* they need further investigation, see CR: 7167356
*/
// Fails with nb-javac, needs further investigation void testPositionBrokenSource126732a() throws IOException {
testPositionBrokenSource126732a(); String[] commands = new String[]{
testPositionBrokenSource126732b(); "return Runnable()",
"do { } while (true)",
"throw UnsupportedOperationException()",
"assert true",
"1 + 1",};
// Fails, these tests yet to be addressed for (String command : commands) {
testPositionForEnumModifiers();
testStartPositionEnumConstantInit(); String code = "package test;\n"
+ "public class Test {\n"
+ " public static void test() {\n"
+ " " + command + " {\n"
+ " new Runnable() {\n"
+ " };\n"
+ " }\n"
+ "}";
JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null,
null, null, Arrays.asList(new MyFileObject(code)));
CompilationUnitTree cut = ct.parse().iterator().next();
ClassTree clazz = (ClassTree) cut.getTypeDecls().get(0);
MethodTree method = (MethodTree) clazz.getMembers().get(0);
List<? extends StatementTree> statements =
method.getBody().getStatements();
StatementTree ret = statements.get(0);
StatementTree block = statements.get(1);
Trees t = Trees.instance(ct);
int len = code.indexOf(command + " {") + (command + " ").length();
assertEquals(command, len,
t.getSourcePositions().getEndPosition(cut, ret));
assertEquals(command, len,
t.getSourcePositions().getStartPosition(cut, block));
} }
void testPositions() throws IOException {
testPositionsSane();
testCorrectWilcardPositions();
testPositionAnnotationNoPackage187551();
testPositionForSuperConstructorCalls();
testPreferredPositionForBinaryOp();
testStartPositionForMethodWithoutModifiers();
testVarPos();
testVariableInIfThen1();
testVariableInIfThen2();
testVariableInIfThen3();
testVariableInIfThen4();
testVariableInIfThen5();
testMissingExponent();
testTryResourcePos();
testOperatorMissingError();
testMissingParenthesisError();
testMissingClassError();
testSwitchError();
testMethodError();
testErrorRecoveryForEnhancedForLoop142381();
} }
public static void main(String... args) throws IOException { void testPositionBrokenSource126732b() throws IOException {
JavacParserTest jpt = new JavacParserTest("JavacParserTest"); String[] commands = new String[]{
jpt.testPositions(); "break",
System.out.println("PASS"); "break A",
"continue ",
"continue A",};
for (String command : commands) {
String code = "package test;\n"
+ "public class Test {\n"
+ " public static void test() {\n"
+ " while (true) {\n"
+ " " + command + " {\n"
+ " new Runnable() {\n"
+ " };\n"
+ " }\n"
+ " }\n"
+ "}";
JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null,
null, null, Arrays.asList(new MyFileObject(code)));
CompilationUnitTree cut = ct.parse().iterator().next();
ClassTree clazz = (ClassTree) cut.getTypeDecls().get(0);
MethodTree method = (MethodTree) clazz.getMembers().get(0);
List<? extends StatementTree> statements =
((BlockTree) ((WhileLoopTree) method.getBody().getStatements().get(0)).getStatement()).getStatements();
StatementTree ret = statements.get(0);
StatementTree block = statements.get(1);
Trees t = Trees.instance(ct);
int len = code.indexOf(command + " {") + (command + " ").length();
assertEquals(command, len,
t.getSourcePositions().getEndPosition(cut, ret));
assertEquals(command, len,
t.getSourcePositions().getStartPosition(cut, block));
}
}
void testStartPositionEnumConstantInit() throws IOException {
String code = "package t; enum Test { AAA; }";
JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null, null,
null, Arrays.asList(new MyFileObject(code)));
CompilationUnitTree cut = ct.parse().iterator().next();
ClassTree clazz = (ClassTree) cut.getTypeDecls().get(0);
VariableTree enumAAA = (VariableTree) clazz.getMembers().get(0);
Trees t = Trees.instance(ct);
int start = (int) t.getSourcePositions().getStartPosition(cut,
enumAAA.getInitializer());
assertEquals("testStartPositionEnumConstantInit", -1, start);
}
void run(String[] args) throws Exception {
int passed = 0, failed = 0;
final Pattern p = (args != null && args.length > 0)
? Pattern.compile(args[0])
: null;
for (Method m : this.getClass().getDeclaredMethods()) {
boolean selected = (p == null)
? m.isAnnotationPresent(Test.class)
: p.matcher(m.getName()).matches();
if (selected) {
try {
m.invoke(this, (Object[]) null);
System.out.println(m.getName() + ": OK");
passed++;
} catch (Throwable ex) {
System.out.printf("Test %s failed: %s %n", m, ex.getCause());
failed++;
}
}
}
System.out.printf("Passed: %d, Failed %d%n", passed, failed);
if (failed > 0) {
throw new RuntimeException("Tests failed: " + failed);
}
if (passed == 0 && failed == 0) {
throw new AssertionError("No test(s) selected: passed = " +
passed + ", failed = " + failed + " ??????????");
}
} }
} }
@ -906,8 +947,6 @@ abstract class TestCase {
} }
void assertEquals(String message, Object o1, Object o2) { void assertEquals(String message, Object o1, Object o2) {
System.out.println(o1);
System.out.println(o2);
if (o1 != null && o2 != null && !o1.equals(o2)) { if (o1 != null && o2 != null && !o1.equals(o2)) {
fail(message); fail(message);
} }
@ -929,4 +968,11 @@ abstract class TestCase {
void fail(String message) { void fail(String message) {
throw new RuntimeException(message); throw new RuntimeException(message);
} }
/**
* Indicates that the annotated method is a test method.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Test {}
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -29,6 +29,7 @@
import com.sun.source.tree.*; import com.sun.source.tree.*;
import com.sun.source.util.*; import com.sun.source.util.*;
import com.sun.tools.javac.tree.DocCommentTable;
import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.tree.JCTree;
import java.net.URI; import java.net.URI;
@ -137,16 +138,16 @@ public class DocCommentToplevelTest {
new TreeScanner<ClassTree,Void>() { new TreeScanner<ClassTree,Void>() {
Map<JCTree, String> docComments; DocCommentTable docComments;
@Override @Override
public ClassTree visitCompilationUnit(CompilationUnitTree node, Void unused) { public ClassTree visitCompilationUnit(CompilationUnitTree node, Void unused) {
docComments = ((JCTree.JCCompilationUnit)node).docComments; docComments = ((JCTree.JCCompilationUnit)node).docComments;
boolean expectedComment = tdk == ToplevelDocKind.HAS_DOC && boolean expectedComment = tdk == ToplevelDocKind.HAS_DOC &&
(pk != PackageKind.NO_PKG || ik != ImportKind.ZERO); (pk != PackageKind.NO_PKG || ik != ImportKind.ZERO);
boolean foundComment = docComments.get(node) != null; boolean foundComment = docComments.hasComment((JCTree) node);
if (expectedComment != foundComment) { if (expectedComment != foundComment) {
error("Unexpected comment " + docComments.get(node) + " on toplevel"); error("Unexpected comment " + docComments.getComment((JCTree) node) + " on toplevel");
} }
return super.visitCompilationUnit(node, null); return super.visitCompilationUnit(node, null);
} }
@ -156,9 +157,9 @@ public class DocCommentToplevelTest {
boolean expectedComment = tdk == ToplevelDocKind.HAS_DOC && boolean expectedComment = tdk == ToplevelDocKind.HAS_DOC &&
pk == PackageKind.NO_PKG && ik == ImportKind.ZERO && pk == PackageKind.NO_PKG && ik == ImportKind.ZERO &&
node.getSimpleName().toString().equals("First"); node.getSimpleName().toString().equals("First");
boolean foundComment = docComments.get(node) != null; boolean foundComment = docComments.hasComment((JCTree) node);
if (expectedComment != foundComment) { if (expectedComment != foundComment) {
error("Unexpected comment " + docComments.get(node) + " on class " + node.getSimpleName()); error("Unexpected comment " + docComments.getComment((JCTree) node) + " on class " + node.getSimpleName());
} }
return super.visitClass(node, unused); return super.visitClass(node, unused);
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -73,7 +73,7 @@ import com.sun.source.tree.CompilationUnitTree;
import com.sun.source.util.JavacTask; import com.sun.source.util.JavacTask;
import com.sun.tools.javac.api.JavacTool; import com.sun.tools.javac.api.JavacTool;
import com.sun.tools.javac.code.Flags; import com.sun.tools.javac.code.Flags;
import com.sun.tools.javac.parser.EndPosTable; import com.sun.tools.javac.tree.EndPosTable;
import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.tree.JCTree;
import com.sun.tools.javac.tree.JCTree.JCCompilationUnit; import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
import com.sun.tools.javac.tree.JCTree.JCNewClass; import com.sun.tools.javac.tree.JCTree.JCNewClass;