diff --git a/.project b/.project
new file mode 100644
index 00000000000..07dbabe5687
--- /dev/null
+++ b/.project
@@ -0,0 +1,17 @@
+
+
+ eclipse.jdt.core
+
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+
+ org.eclipse.m2e.core.maven2Nature
+
+
diff --git a/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/AbstractCommentParser.java b/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/AbstractCommentParser.java
index edc6aae9c61..bcba8987e98 100644
--- a/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/AbstractCommentParser.java
+++ b/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/AbstractCommentParser.java
@@ -86,7 +86,8 @@ public abstract class AbstractCommentParser implements JavadocTagConstants {
protected int firstTagPosition;
protected int index, lineEnd;
protected int tokenPreviousPosition, lastIdentifierEndPosition, starPosition;
- protected int textStart, memberStart;
+ protected int textStart;
+ protected int memberStart;
protected int tagSourceStart, tagSourceEnd;
protected int inlineTagStart;
protected int[] lineEnds;
@@ -451,8 +452,15 @@ protected boolean commentParse() {
// $FALL-THROUGH$ - fall through default case
default :
if (this.markdown && nextCharacter == '[') {
- if (parseMarkdownLinks())
+ if (this.textStart != -1) {
+ if (this.textStart < textEndPosition) {
+ pushText(this.textStart, textEndPosition);
+ }
+ }
+ if (parseMarkdownLinks(previousPosition)) {
+ this.textStart = this.index;
break;
+ }
}
if (isFormatterParser && nextCharacter == '<') {
// html tags are meaningful for formatter parser
@@ -496,7 +504,7 @@ protected boolean commentParse() {
}
refreshInlineTagPosition(textEndPosition);
setInlineTagStarted(false);
- } else if (this.lineStarted && this.textStart != -1 && this.textStart <= textEndPosition && (this.textStart < this.starPosition || this.starPosition == lastStarPosition)) {
+ } else if (this.lineStarted && this.textStart != -1 && this.textStart <= textEndPosition && (this.textStart < this.starPosition || this.starPosition == lastStarPosition || this.markdown)) {
pushText(this.textStart, textEndPosition);
}
updateDocComment();
@@ -2977,7 +2985,7 @@ private boolean containsNewLine(String str) {
/*
* Parse markdown links that are replacing @link and @linkplain
*/
- protected abstract boolean parseMarkdownLinks() throws InvalidInputException;
+ protected abstract boolean parseMarkdownLinks(int previousPosition) throws InvalidInputException;
/*
* Parse tag declaration
*/
diff --git a/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/JavadocParser.java b/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/JavadocParser.java
index 4914794b4f7..8c093bafdd9 100644
--- a/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/JavadocParser.java
+++ b/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/JavadocParser.java
@@ -571,7 +571,7 @@ protected void parseSimpleTag() {
}
}
@Override
- protected boolean parseMarkdownLinks() throws InvalidInputException {
+ protected boolean parseMarkdownLinks(int previousPosition) throws InvalidInputException {
boolean valid = false;
// The markdown links can come in single [] or pair of [] with no space between them
// We are here after we have seen [
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterMarkdownTest.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterMarkdownTest.java
new file mode 100644
index 00000000000..4f8257741ac
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterMarkdownTest.java
@@ -0,0 +1,3239 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2016 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jdt.core.tests.dom;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.text.NumberFormat;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.compiler.IProblem;
+import org.eclipse.jdt.core.dom.AST;
+import org.eclipse.jdt.core.dom.ASTMatcher;
+import org.eclipse.jdt.core.dom.ASTNode;
+import org.eclipse.jdt.core.dom.ASTParser;
+import org.eclipse.jdt.core.dom.ArrayType;
+import org.eclipse.jdt.core.dom.Block;
+import org.eclipse.jdt.core.dom.Comment;
+import org.eclipse.jdt.core.dom.CompilationUnit;
+import org.eclipse.jdt.core.dom.EnumConstantDeclaration;
+import org.eclipse.jdt.core.dom.EnumDeclaration;
+import org.eclipse.jdt.core.dom.FieldDeclaration;
+import org.eclipse.jdt.core.dom.IBinding;
+import org.eclipse.jdt.core.dom.IPackageBinding;
+import org.eclipse.jdt.core.dom.ITypeBinding;
+import org.eclipse.jdt.core.dom.IfStatement;
+import org.eclipse.jdt.core.dom.Javadoc;
+import org.eclipse.jdt.core.dom.MemberRef;
+import org.eclipse.jdt.core.dom.MethodDeclaration;
+import org.eclipse.jdt.core.dom.MethodRef;
+import org.eclipse.jdt.core.dom.MethodRefParameter;
+import org.eclipse.jdt.core.dom.Name;
+import org.eclipse.jdt.core.dom.PackageDeclaration;
+import org.eclipse.jdt.core.dom.QualifiedName;
+import org.eclipse.jdt.core.dom.ReturnStatement;
+import org.eclipse.jdt.core.dom.SimpleName;
+import org.eclipse.jdt.core.dom.SimpleType;
+import org.eclipse.jdt.core.dom.Statement;
+import org.eclipse.jdt.core.dom.TagElement;
+import org.eclipse.jdt.core.dom.TextElement;
+import org.eclipse.jdt.core.dom.Type;
+import org.eclipse.jdt.core.dom.TypeDeclaration;
+import org.eclipse.jdt.core.dom.TypeDeclarationStatement;
+import org.eclipse.jdt.core.dom.VariableDeclarationStatement;
+import org.eclipse.jdt.internal.compiler.parser.ScannerHelper;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * Class to test DOM/AST nodes built for markdown comments.
+ *
+ * Most of tests are 'automatic'. It means that to add a new tests, you only need to
+ * create one or several CUs and put them in org.eclipse.jdt.core.model.tests/workspace/Converter/src/markdown/testXXX
+ * folder and add the corresponding test in this class:
+ *
+ * public void testXXX() throws JavaModelException {
+ * verifyComments("testXXX");
+ * }
+ *
+ *
+ * Note that when a test fails, the easiest way to debug it is to open
+ * a runtime workbench, create a project 'Converter', delete the default 'src' source folder
+ * and replace it by a linked source to the 'src' folder of org.eclipse.jdt.core.model.tests/workspace/Converter/src
+ * in your workspace.
+ *
+ * Then open the CU on which the test fails in a ASTView and verify the offset/length
+ * of the offending node located at the positions displayed in the console when the test failed...
+ *
+ * Since 3.4, the failing test also provides the comparison between the source of the comment
+ * and the string get from the built DOM/AST nodes in the comment (see {@link ASTConverterJavadocFlattener})
+ * but this may be not enough to see precisely the origin of the problem.
+ */
+@SuppressWarnings({"rawtypes", "unchecked"})
+public class ASTConverterMarkdownTest extends ConverterTestSetup {
+
+ // Flag to know whether Converter directory should be copied from org.eclipse.jdt.core.tests.model project
+ static protected boolean COPY_DIR = true;
+
+ // Test counters
+ protected static int[] TEST_COUNTERS = { 0, 0, 0, 0 };
+ // Unicode tests
+ protected static boolean UNICODE = false;
+ // Unix tests
+ final boolean unix;
+ static final String UNIX_SUPPORT = System.getProperty("unix");
+ // Doc Comment support
+ static final String DOC_COMMENT_SUPPORT = System.getProperty("doc.support");
+ final String docCommentSupport;
+
+ // List of comments read from source of test
+ private static final int LINE_COMMENT = 100;
+ private static final int BLOCK_COMMENT =200;
+ private static final int DOC_COMMENT = 300;
+ List comments = new ArrayList();
+ private String chars;
+ // List of tags contained in each comment read from test source.
+ List allTags = new ArrayList();
+ // tags inhibiting inline tags
+ static final String TAG_CODE = "code";
+ static final String TAG_LITERAL = "literal";
+ // Current compilation unit
+ protected ICompilationUnit sourceUnit;
+ // Test package binding
+ protected boolean resolveBinding = true;
+ protected boolean packageBinding = true;
+ // AST Level
+ /** @deprecated using deprecated code */
+ protected int astLevel = AST.JLS23;
+ protected int savedLevel;
+ // Debug
+ protected String prefix = "";
+ protected boolean debug = false;
+ protected StringBuilder problems;
+ protected String compilerOption = JavaCore.IGNORE;
+ protected List failures;
+ protected boolean stopOnFailure = true;
+ Map savedOptions = null;
+
+ public ASTConverterMarkdownTest(String name, String support, String unix) {
+ super(name);
+ this.docCommentSupport = support;
+ this.unix = "true".equals(unix);
+ }
+ public ASTConverterMarkdownTest(String name) {
+ this(preHyphen(name), nameToSupport(name),
+ name.indexOf(" - Unix") != -1 ? "true" : "false");
+ }
+
+ private static String preHyphen(String name) {
+ int hyphenInd = name.indexOf(" - ");
+ String r = hyphenInd == -1 ? name : name.substring(0, hyphenInd);
+ return r;
+ }
+ private static String nameToSupport(String name) {
+ int ind1 = name.indexOf(" - Doc ");
+ int ind2 = name.lastIndexOf("abled");
+ if( ind1 == -1 || ind2 == -1 )
+ return name;
+ String s = name.substring(name.indexOf(" - Doc ") + 7, name.lastIndexOf("abled") + 5);
+ return s;
+ }
+
+
+ /* (non-Javadoc)
+ * @see junit.framework.TestCase#getName()
+ */
+ public String getName() {
+ String strUnix = this.unix ? " - Unix" : "";
+ return super.getName()+" - Doc "+this.docCommentSupport+strUnix;
+ }
+
+ public static Test suite() {
+ TestSuite suite = new Suite(ASTConverterMarkdownTest.class.getName());
+ if (DOC_COMMENT_SUPPORT == null) {
+ buildSuite(suite, JavaCore.ENABLED);
+ buildSuite(suite, JavaCore.DISABLED);
+ } else {
+ String support = DOC_COMMENT_SUPPORT==null ? JavaCore.DISABLED : (DOC_COMMENT_SUPPORT.equals(JavaCore.DISABLED)?JavaCore.DISABLED:JavaCore.ENABLED);
+ buildSuite(suite, support);
+ }
+ return suite;
+ }
+
+ public static void buildSuite(TestSuite suite, String support) {
+ Class c = ASTConverterMarkdownTest.class;
+ Method[] methods = c.getMethods();
+ for (int i = 0, max = methods.length; i < max; i++) {
+ if (methods[i].getName().startsWith("test")) { //$NON-NLS-1$
+ suite.addTest(new ASTConverterMarkdownTest(methods[i].getName(), support, UNIX_SUPPORT));
+ }
+ }
+ // when unix support not specified, also run using unix format
+ if (UNIX_SUPPORT == null && JavaCore.ENABLED.equals(support)) {
+ for (int i = 0, max = methods.length; i < max; i++) {
+ if (methods[i].getName().startsWith("test")) { //$NON-NLS-1$
+ suite.addTest(new ASTConverterMarkdownTest(methods[i].getName(), support, "true"));
+ }
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jdt.core.tests.model.AbstractJavaModelTests#copyDirectory(java.io.File, java.io.File)
+ */
+ @Override
+ protected void copyDirectory(File sourceDir, File targetDir) throws IOException {
+ if (COPY_DIR) {
+ super.copyDirectory(sourceDir, targetDir);
+ } else {
+ targetDir.mkdirs();
+ File sourceFile = new File(sourceDir, ".project");
+ File targetFile = new File(targetDir, ".project");
+ targetFile.createNewFile();
+ copy(sourceFile, targetFile);
+ sourceFile = new File(sourceDir, ".classpath");
+ targetFile = new File(targetDir, ".classpath");
+ targetFile.createNewFile();
+ copy(sourceFile, targetFile);
+ }
+ }
+ /* (non-Javadoc)
+ * @see junit.framework.TestCase#setUp()
+ */
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ TEST_COUNTERS[0]++;
+ setCompliancesLevel();
+ this.failures = new ArrayList();
+ this.problems = new StringBuilder();
+ this.workingCopies = null;
+ this.savedLevel = this.astLevel;
+ }
+ /* (non-Javadoc)
+ * @see junit.framework.TestCase#tearDown()
+ */
+ @Override
+ protected void tearDown() throws Exception {
+ int size = this.failures.size();
+ String title = size+" positions/bindings were incorrect in "+getName();
+ if (size == 0) {
+ TEST_COUNTERS[1]++;
+ } else if (this.problems.length() > 0) {
+ if (this.debug) {
+ System.out.println("Compilation warnings/errors occured:");
+ System.out.println(this.problems.toString());
+ }
+ TEST_COUNTERS[2]++;
+ } else {
+ TEST_COUNTERS[3]++;
+ System.out.println(title+":");
+ for (int i=0; i 0);
+ super.tearDown();
+
+ // Restore saved ast level
+ this.astLevel = this.savedLevel;
+ }
+
+ /* (non-Javadoc)
+ * @see junit.framework.TestCase#tearDown()
+ */
+ @Override
+ public void tearDownSuite() throws Exception {
+ // put default options on project
+ if (this.currentProject != null && this.savedOptions != null) {
+ this.currentProject.setOptions(this.savedOptions);
+ }
+ super.tearDownSuite();
+ if (TEST_COUNTERS[0] != TEST_COUNTERS[1]) {
+ NumberFormat intFormat = NumberFormat.getInstance();
+ intFormat.setMinimumIntegerDigits(3);
+ intFormat.setMaximumIntegerDigits(3);
+ System.out.println("=====================================");
+ System.out.println(intFormat.format(TEST_COUNTERS[0])+" tests have been executed:");
+ System.out.println(" - "+intFormat.format(TEST_COUNTERS[1])+" tests have been actually executed.");
+ System.out.println(" - "+intFormat.format(TEST_COUNTERS[2])+" tests were skipped due to compilation errors.");
+ System.out.println(" - "+intFormat.format(TEST_COUNTERS[3])+" tests failed.");
+ }
+ }
+ @Override
+ public ASTNode runConversion(ICompilationUnit unit, boolean resolveBindings) {
+ return runConversion(AST.JLS23, unit, resolveBindings);
+ }
+ @Override
+ public ASTNode runConversion(char[] source, String unitName, IJavaProject project) {
+ ASTParser parser = ASTParser.newParser(this.astLevel);
+ parser.setSource(source);
+ parser.setUnitName(unitName);
+ parser.setProject(project);
+ parser.setResolveBindings(this.resolveBinding);
+ return parser.createAST(null);
+ }
+
+ @Override
+ public ASTNode runConversion(char[] source, String unitName, IJavaProject project, Map options) {
+ if (project == null) {
+ ASTParser parser = ASTParser.newParser(this.astLevel);
+ parser.setSource(source);
+ parser.setUnitName(unitName);
+ parser.setCompilerOptions(options);
+ parser.setResolveBindings(this.resolveBinding);
+ return parser.createAST(null);
+ }
+ return runConversion(source, unitName, project);
+ }
+
+ private char getNextChar(char[] source, int idx) {
+ // get next char
+ char ch = source[idx];
+ int charLength = 1;
+ int pos = idx;
+ this.chars = null;
+ if (ch == '\\' && source[idx+1] == 'u') {
+ //-------------unicode traitement ------------
+ int c1, c2, c3, c4;
+ charLength++;
+ while (source[idx+charLength] == 'u') charLength++;
+ if (((c1 = ScannerHelper.getHexadecimalValue(source[idx+charLength++])) > 15 || c1 < 0)
+ || ((c2 = ScannerHelper.getHexadecimalValue(source[idx+charLength++])) > 15 || c2 < 0)
+ || ((c3 = ScannerHelper.getHexadecimalValue(source[idx+charLength++])) > 15 || c3 < 0)
+ || ((c4 = ScannerHelper.getHexadecimalValue(source[idx+charLength++])) > 15 || c4 < 0)) {
+ return ch;
+ }
+ ch = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4);
+ this.chars = new String(source, pos, charLength);
+ }
+ return ch;
+ }
+ /*
+ * Convert Javadoc source to match markdown.toString().
+ * Store converted comments and their corresponding tags respectively
+ * in comments and allTags fields
+ */
+ protected void setSourceComment(char[] source) throws ArrayIndexOutOfBoundsException {
+ this.comments = new ArrayList();
+ this.allTags = new ArrayList();
+ StringBuilder buffer = null;
+ int comment = 0;
+ boolean end = false, lineStarted = false;
+ String tag = null;
+ List tags = new ArrayList();
+ int length = source.length;
+ // https://bugs.eclipse.org/bugs/show_bug.cgi?id=206345
+ // when parsing tags such as @code and @literal,
+ // any tag should be discarded and considered as plain text until
+ // properly closed with closing brace
+ boolean considerTagAsPlainText = false;
+ int openingBraces = 0;
+ char previousChar=0, currentChar=0;
+ for (int i=0; i= 'a' && currentChar <= 'z') {
+ tag += currentChar;
+ } else {
+ if (tag.equalsIgnoreCase(TAG_LITERAL) || tag.equalsIgnoreCase(TAG_CODE)) considerTagAsPlainText = true;
+ tags.add(tag);
+ tag = null;
+ }
+ }
+ // Some characters are special in javadoc comments
+ switch (currentChar) {
+ case '@':
+ if (!lineStarted) {
+ tag = "";
+ lineStarted = true;
+ } else if (previousChar == '{') {
+ // https://bugs.eclipse.org/bugs/show_bug.cgi?id=206345
+ if (considerTagAsPlainText) {
+ openingBraces++;
+ } else {
+ tag = "";
+ lineStarted = true;
+ }
+ }
+ break;
+ case '\r':
+ case '\n':
+ lineStarted = false;
+ break;
+ case '*':
+ break;
+ case '}':
+ // https://bugs.eclipse.org/bugs/show_bug.cgi?id=206345
+ if (considerTagAsPlainText) {
+ if (openingBraces > 0) {
+ openingBraces--;
+ } else {
+ considerTagAsPlainText = false;
+ }
+ }
+ break;
+ default:
+ if (!Character.isWhitespace(currentChar)) {
+ lineStarted = true;
+ }
+ }
+ // $FALL-THROUGH$ - common treatment for block and javadoc comments
+ case BLOCK_COMMENT:
+ if (this.chars == null) buffer.append(currentChar);
+ else buffer.append(this.chars);
+ if (end && currentChar == '/') {
+ comment = 0;
+ lineStarted = false;
+ this.comments.add(buffer.toString());
+ this.allTags.add(tags);
+ tags = new ArrayList();
+ }
+ end = currentChar == '*';
+ break;
+ case LINE_COMMENT:
+ if (currentChar == '\r' || currentChar == '\n') {
+ /*
+ if (currentChar == '\r' && source[i+1] == '\n') {
+ buffer.append(source[++i]);
+ }
+ */
+ comment = 0;
+ this.comments.add(buffer.toString());
+ this.allTags.add(tags);
+ } else {
+ if (this.chars == null) buffer.append(currentChar);
+ else buffer.append(this.chars);
+ }
+ break;
+ default:
+ // do nothing
+ break;
+ }
+ }
+ }
+
+ /*
+ * Convert Javadoc source to match markdown.toString().
+ * Store converted comments and their corresponding tags respectively
+ * in comments and allTags fields
+ */
+ char[] getUnicodeSource(char[] source) {
+ int length = source.length;
+ int unicodeLength = length*6;
+ char[] unicodeSource = new char[unicodeLength];
+ int u=0;
+ for (int i=0; i 15 || c1 < 0)
+ || ((c2 = ScannerHelper.getHexadecimalValue(source[i+2])) > 15 || c2 < 0)
+ || ((c3 = ScannerHelper.getHexadecimalValue(source[i+3])) > 15 || c3 < 0)
+ || ((c4 = ScannerHelper.getHexadecimalValue(source[i+4])) > 15 || c4 < 0)) {
+ throw new RuntimeException("Invalid unicode in source at "+i);
+ }
+ for (int j=0; j<4; j++) unicodeSource[u++] = source[++i];
+ } else {
+ unicodeSource[u++] = '\\';
+ unicodeSource[u++] = 'u';
+ unicodeSource[u++] = '0';
+ unicodeSource[u++] = '0';
+ int val = source[i]/16;
+ unicodeSource[u++] = (char) (val<10 ? val+ 0x30 : val-10+0x61);
+ val = source[i]%16;
+ unicodeSource[u++] = (char) (val<10 ? val+ 0x30 : val-10+0x61);
+ }
+ }
+ // Return one well sized array
+ if (u != unicodeLength) {
+ char[] result = new char[u];
+ System.arraycopy(unicodeSource, 0, result, 0, u);
+ return result;
+ }
+ return unicodeSource;
+ }
+
+ /*
+ * Convert Javadoc source to match markdown.toString().
+ * Store converted comments and their corresponding tags respectively
+ * in comments and allTags fields
+ */
+ char[] getUnixSource(char[] source) {
+ int length = source.length;
+ int unixLength = length;
+ char[] unixSource = new char[unixLength];
+ int u=0;
+ for (int i=0; i actual:<"+actual+'>');
+ if (this.stopOnFailure) assertEquals(msg, expected, actual);
+ }
+
+ /*
+ * Verify positions of tags in source
+ */
+ private void verifyPositions(Javadoc docComment, char[] source) {
+ boolean stop = this.stopOnFailure;
+ this.stopOnFailure = false;
+ // Verify javadoc start and end position
+ int start = docComment.getStartPosition();
+ int end = start+docComment.getLength()-1;
+ assumeTrue(this.prefix+"Misplaced javadoc start at <"+start+">: "+docComment, source[start++] == '/' && source[start++] == '/' && source[start++] == '/');
+ // Get first meaningful character
+ int tagStart = start;
+ // Verify tags
+ Iterator tags = docComment.tags().listIterator();
+ while (tags.hasNext()) {
+ while (source[tagStart] == '/' || Character.isWhitespace(source[tagStart])) {
+ tagStart++; // purge non-stored characters
+ }
+ TagElement tagElement = (TagElement) tags.next();
+ int teStart = tagElement.getStartPosition();
+ assumeEquals(this.prefix+"Wrong start position <"+teStart+"> for tag element: "+tagElement, tagStart, teStart);
+ verifyPositions(tagElement, source);
+ tagStart += tagElement.getLength();
+ }
+ while (source[tagStart+1] == '/' || Character.isWhitespace(source[tagStart+1])) {
+ tagStart++; // purge non-stored characters
+ }
+ //assumeTrue(this.prefix+"Misplaced javadoc end at <"+tagStart+'>', source[tagStart-1] == '*' && source[tagStart] == '/');
+ assumeEquals(this.prefix+"Wrong javadoc length at <"+end+">: ", tagStart, end);
+ this.stopOnFailure = stop;
+ if (stop && this.failures.size() > 0) {
+ String expected = new String(source, docComment.getStartPosition(), docComment.getLength());
+ ASTConverterJavadocFlattener flattener = new ASTConverterJavadocFlattener(expected);
+ docComment.accept(flattener);
+ assertEquals("Unexpected errors while verifying javadoc comment positions!", expected, flattener.getResult());
+ }
+ }
+
+ /**
+ * Verify positions of fragments in source
+ * @deprecated using deprecated code
+ */
+ private void verifyPositions(TagElement tagElement, char[] source) {
+ String text = null;
+ // Verify tag name
+ String tagName = tagElement.getTagName();
+ int tagStart = tagElement.getStartPosition();
+ if (tagElement.isNested()) {
+ if (tagName.equals("@link") && source[tagStart] == '[') {
+ assumeEquals(this.prefix+"Wrong start position <"+tagStart+"> for "+tagElement, '[', source[tagStart++]);
+ } else {
+ assumeEquals(this.prefix+"Wrong start position <"+tagStart+"> for "+tagElement, '{', source[tagStart++]);
+ }
+ }
+ if (tagName != null) {
+ text= new String(source, tagStart, tagName.length());
+ assumeEquals(this.prefix+"Misplaced tag name at <"+tagStart+">: ", tagName, text);
+ tagStart += tagName.length();
+ }
+ // Verify each fragment
+ ASTNode previousFragment = null;
+ Iterator elements = tagElement.fragments().listIterator();
+ while (elements.hasNext()) {
+ ASTNode fragment = (ASTNode) elements.next();
+ if (fragment.getNodeType() == ASTNode.TEXT_ELEMENT) {
+ if (previousFragment == null && TagElement.TAG_PARAM.equals(tagName) && ((TextElement)fragment).getText().equals("<")) { // special case here for @param syntax
+ int start = tagStart;
+ // verify '<'
+ while (source[start] == ' ' || Character.isWhitespace(source[start])) {
+ start++; // purge white characters
+ }
+ text = new String(source, start, fragment.getLength());
+ assumeEquals(this.prefix+"Misplaced text element at <"+fragment.getStartPosition()+">: ", text, ((TextElement) fragment).getText());
+ start += fragment.getLength();
+ // verify simple name
+ assumeTrue(this.prefix+"Unexpected fragment end for "+tagElement, elements.hasNext());
+ fragment = (ASTNode) elements.next();
+ while (source[start] == ' ' || Character.isWhitespace(source[start])) {
+ start++; // purge white characters
+ }
+ assumeEquals(this.prefix+"Unexpected node type for tag element "+tagElement, ASTNode.SIMPLE_NAME, fragment.getNodeType());
+ Name name = (Name) fragment;
+ verifyNamePositions(start, name, source);
+ start += fragment.getLength();
+ // verify simple name
+ assumeTrue(this.prefix+"Unexpected fragment end for "+tagElement, elements.hasNext());
+ fragment = (ASTNode) elements.next();
+ while (source[start] == ' ' || Character.isWhitespace(source[start])) {
+ start++; // purge white characters
+ }
+ text = new String(source, start, fragment.getLength());
+ assumeEquals(this.prefix+"Misplaced text element at <"+fragment.getStartPosition()+">: ", text, ((TextElement) fragment).getText());
+ start += fragment.getLength();
+ // reset fragment as simple name to avoid issue with next text element
+ fragment = name;
+ tagStart += (start- tagStart) - name.getLength();
+ } else {
+ if (previousFragment == null) {
+ if (tagName != null && (source[tagStart+1] == '\r' || source[tagStart+1] == '\n')) {
+ while (source[tagStart+1] == '/' || Character.isWhitespace(source[tagStart+1])) {
+ tagStart++; // purge non-stored characters
+ }
+ }
+ } else {
+ if (previousFragment.getNodeType() == ASTNode.TEXT_ELEMENT) {
+ assumeTrue(this.prefix+"Wrong length at <"+previousFragment.getStartPosition()+"> for text element "+previousFragment, (source[tagStart] == '\r' /* && source[tagStart+1] == '\n' */ || source[tagStart] == '\n'));
+ while (source[tagStart] == '/' || Character.isWhitespace(source[tagStart])) {
+ tagStart++; // purge non-stored characters
+ }
+ } else if (TagElement.TAG_PARAM.equals(tagName) && previousFragment.getNodeType() == ASTNode.SIMPLE_NAME && ((TextElement)fragment).getText().equals(">")) {
+ while (source[tagStart+1] == ' ' || Character.isWhitespace(source[tagStart+1])) {
+ tagStart++; // purge white characters
+ }
+ } else {
+ int start = tagStart;
+ boolean newLine = false;
+ while (source[start+1] == '/' || Character.isWhitespace(source[start+1])) {
+ start++; // purge non-stored characters
+ if (source[tagStart] == '\r' || source[tagStart] == '\n') {
+ newLine = true;
+ }
+ }
+ if (newLine) tagStart = start;
+ }
+ }
+ tagStart = getLinkTagStartPosition(tagName, source, tagStart);
+ text = new String(source, tagStart, fragment.getLength());
+ assumeEquals(this.prefix+"Misplaced text element at <"+fragment.getStartPosition()+">: ", text, ((TextElement) fragment).getText());
+ }
+ } else {
+// if (fragment.getNodeType() == ASTNode.TAG_ELEMENT) {
+// TagElement tagEl = (TagElement) fragment;
+// if (tagEl.getTagName().equals("@link")) {
+// while (source[tagStart] == '[' || Character.isWhitespace(source[tagStart])) {
+// tagStart++; // purge non-stored characters
+// }
+// }
+// }
+ while (source[tagStart] == '/' || Character.isWhitespace(source[tagStart])) {
+ tagStart++; // purge non-stored characters
+ }
+ tagStart = getLinkTagStartPosition(tagName, source, tagStart);
+ if (fragment.getNodeType() == ASTNode.SIMPLE_NAME || fragment.getNodeType() == ASTNode.QUALIFIED_NAME) {
+ tagStart = getLinkTagStartPosition(tagName, source, tagStart);
+ verifyNamePositions(tagStart, (Name) fragment, source);
+ } else if (fragment.getNodeType() == ASTNode.TAG_ELEMENT) {
+ TagElement inlineTag = (TagElement) fragment;
+ assumeEquals(this.prefix+"Tag element <"+inlineTag+"> has wrong start position", tagStart, inlineTag.getStartPosition());
+ verifyPositions(inlineTag, source);
+ } else if (fragment.getNodeType() == ASTNode.MEMBER_REF) {
+ MemberRef memberRef = (MemberRef) fragment;
+ // Store start position
+ int start = tagStart;
+ // Verify qualifier position
+ Name qualifier = memberRef.getQualifier();
+ if (qualifier != null) {
+ verifyNamePositions(start, qualifier, source);
+ start += qualifier.getLength();
+ while (source[start] == '/' || Character.isWhitespace(source[start])) {
+ start++; // purge non-stored characters
+ }
+ }
+ // Verify member separator position
+ assumeEquals(this.prefix+"Misplaced # separator at <"+start+"> for member ref "+memberRef, '#', source[start]);
+ start++;
+ while (source[start] == '/' || Character.isWhitespace(source[start])) {
+ start++; // purge non-stored characters
+ }
+ // Verify member name position
+ Name name = memberRef.getName();
+ text = new String(source, start, name.getLength());
+ assumeEquals(this.prefix+"Misplaced member ref at <"+start+">: ", text, name.toString());
+ verifyNamePositions(start, name, source);
+ } else if (fragment.getNodeType() == ASTNode.METHOD_REF) {
+ MethodRef methodRef = (MethodRef) fragment;
+ // Store start position
+ int start = tagStart;
+ // Verify qualifier position
+ Name qualifier = methodRef.getQualifier();
+ if (qualifier != null) {
+ verifyNamePositions(start, qualifier, source);
+ start += qualifier.getLength();
+ while (source[start+1] == '/' || Character.isWhitespace(source[start+1])) {
+ start++; // purge non-stored characters
+ }
+ }
+ // Verify member separator position
+ assumeEquals(this.prefix+"Misplaced # separator at <"+start+"> for method ref: "+methodRef, '#', source[start]);
+ start++;
+ while (source[start+1] == '/' || Character.isWhitespace(source[start+1])) {
+ start++; // purge non-stored characters
+ }
+ // Verify member name position
+ Name name = methodRef.getName();
+ int nameLength = name.getLength();
+ text = new String(source, start, nameLength);
+ if (!text.equals(name.toString())) { // may have qualified constructor reference for inner classes
+ if (methodRef.getQualifier().isQualifiedName()) {
+ text = new String(source, start, methodRef.getQualifier().getLength());
+ assumeEquals(this.prefix+"Misplaced method ref name at <"+start+">: ", text, methodRef.getQualifier().toString());
+ while (source[start] != '.' || Character.isWhitespace(source[start])) {
+ start++; // purge non-stored characters
+ }
+ start++;
+ } else {
+ while (source[start] != '.' || Character.isWhitespace(source[start])) {
+ start++; // purge non-stored characters
+ }
+ start++;
+ text = new String(source, start, nameLength);
+ assumeEquals(this.prefix+"Misplaced method ref name at <"+start+">: ", text, name.toString());
+ }
+ }
+ verifyNamePositions(start, name, source);
+ start += nameLength;
+ // Verify arguments starting open parenthesis
+ while (source[start+1] == '/' || Character.isWhitespace(source[start+1])) {
+ start++; // purge non-stored characters
+ }
+// assumeEquals(prefix+"Misplaced ( at <"+start+"> for method ref: "+methodRef, '(', source[start]);
+ if (source[start] == '(') { // now method reference may have no parenthesis...
+ start++;
+ // Verify parameters
+ Iterator parameters = methodRef.parameters().listIterator();
+ while (parameters.hasNext()) {
+ MethodRefParameter param = (MethodRefParameter) parameters.next();
+ boolean lastParam = !parameters.hasNext();
+ // Verify parameter type positions
+ while (source[start+1] == '/' || Character.isWhitespace(source[start+1])) {
+ start++; // purge non-stored characters
+ }
+ Type type = param.getType();
+ if (type.isSimpleType()) {
+ verifyNamePositions(start, ((SimpleType)type).getName(), source);
+ } else if (type.isPrimitiveType()) {
+ text = new String(source, start, type.getLength());
+ assumeEquals(this.prefix+"Misplaced method ref parameter type at <"+start+"> for method ref: "+methodRef, text, type.toString());
+ } else if (type.isArrayType()) {
+ Type elementType = ((ArrayType) param.getType()).getElementType();
+ if (elementType.isSimpleType()) {
+ verifyNamePositions(start, ((SimpleType)elementType).getName(), source);
+ } else if (elementType.isPrimitiveType()) {
+ text = new String(source, start, elementType.getLength());
+ assumeEquals(this.prefix+"Misplaced method ref parameter type at <"+start+"> for method ref: "+methodRef, text, elementType.toString());
+ }
+ }
+ start += type.getLength();
+ // if last param then perhaps a varargs
+ while (Character.isWhitespace(source[start])) { // do NOT accept '*' in parameter declaration
+ start++; // purge non-stored characters
+ }
+ if (lastParam && this.astLevel != AST.JLS2 && param.isVarargs()) {
+ for (int p=0;p<3;p++) {
+ assumeTrue(this.prefix+"Missing ellipsis for vararg method ref parameter at <"+start+"> for method ref: "+methodRef, source[start++]=='.');
+ }
+ }
+ // Verify parameter name positions
+ while (Character.isWhitespace(source[start])) { // do NOT accept '*' in parameter declaration
+ start++; // purge non-stored characters
+ }
+ name = param.getName();
+ if (name != null) {
+ text = new String(source, start, name.getLength());
+ assumeEquals(this.prefix+"Misplaced method ref parameter name at <"+start+"> for method ref: "+methodRef, text, name.toString());
+ start += name.getLength();
+ }
+ // Verify end parameter declaration
+ while (source[start+1] == '/' || Character.isWhitespace(source[start+1])) {
+ start++;
+ }
+ assumeTrue(this.prefix+"Misplaced parameter end at <"+start+"> for method ref: "+methodRef, source[start] == ',' || source[start] == ')');
+ start++;
+ if (source[start] == ')') {
+ break;
+ }
+ }
+ }
+ }
+ }
+ tagStart += fragment.getLength();
+ previousFragment = fragment;
+ }
+ // https://bugs.eclipse.org/bugs/show_bug.cgi?id=206345
+ if (!(TAG_CODE.equalsIgnoreCase(tagName) || !TAG_LITERAL.equalsIgnoreCase(tagName)) && tagElement.isNested()) {
+ assumeEquals(this.prefix+"Wrong end character at <"+tagStart+"> for "+tagElement, '}', source[tagStart++]);
+ }
+ }
+ private int getLinkTagStartPosition(String tagName, char[] source, int tagStart) {
+ if (tagName != null && tagName.equals("@link")) {
+ while (source[tagStart] == '[' || source[tagStart] == ']') {
+ tagStart++; // purge non-stored characters
+ }
+ }
+ return tagStart;
+ }
+ /*
+ * Verify each name component positions.
+ */
+ private void verifyNamePositions(int nameStart, Name name, char[] source) {
+ if (name.isQualifiedName()) {
+ QualifiedName qualified = (QualifiedName) name;
+ int start = qualified.getName().getStartPosition();
+ String str = new String(source, start, qualified.getName().getLength());
+ assumeEquals(this.prefix+"Misplaced or wrong name for qualified name: "+name, str, qualified.getName().toString());
+ verifyNamePositions(nameStart, ((QualifiedName) name).getQualifier(), source);
+ }
+ String str = new String(source, nameStart, name.getLength());
+ if (str.indexOf('\n') < 0) { // cannot compare if text contains new line
+ assumeEquals(this.prefix+"Misplaced name for qualified name: ", str, name.toString());
+ } else if (this.debug) {
+ System.out.println(this.prefix+"Name contains new line for qualified name: "+name);
+ }
+ }
+
+ /*
+ * Verify that bindings of Javadoc comment structure are resolved or not.
+ * For expected unresolved binding, verify that following text starts with 'Unknown'
+ */
+ private void verifyBindings(Javadoc docComment) {
+ boolean stop = this.stopOnFailure;
+// stopOnFailure = false;
+ // Verify tags
+ Iterator tags = docComment.tags().listIterator();
+ while (tags.hasNext()) {
+ verifyBindings((TagElement) tags.next());
+ }
+ this.stopOnFailure = stop;
+ assertTrue(!stop || this.failures.size()==0);
+ }
+
+ /*
+ * Verify that bindings of Javadoc tag structure are resolved or not.
+ * For expected unresolved binding, verify that following text starts with 'Unknown'
+ */
+ private void verifyBindings(TagElement tagElement) {
+ // Verify each fragment
+ Iterator elements = tagElement.fragments().listIterator();
+ IBinding previousBinding = null;
+ ASTNode previousFragment = null;
+ boolean resolvedBinding = false;
+ while (elements.hasNext()) {
+ ASTNode fragment = (ASTNode) elements.next();
+ if (fragment.getNodeType() == ASTNode.TEXT_ELEMENT) {
+ TextElement text = (TextElement) fragment;
+ if (resolvedBinding) {
+ if (previousBinding == null) {
+ assumeTrue(this.prefix+"Reference '"+previousFragment+"' should be bound!", text.getText().trim().indexOf("Unknown")>=0);
+ } else {
+ assumeTrue(this.prefix+"Unknown reference '"+previousFragment+"' should NOT be bound!", text.getText().trim().indexOf("Unknown")<0);
+ }
+ }
+ previousBinding = null;
+ resolvedBinding = false;
+ } else if (fragment.getNodeType() == ASTNode.TAG_ELEMENT) {
+ verifyBindings((TagElement) fragment);
+ previousBinding = null;
+ resolvedBinding = false;
+ } else {
+ resolvedBinding = true;
+ if (fragment.getNodeType() == ASTNode.SIMPLE_NAME) {
+ previousBinding = ((Name)fragment).resolveBinding();
+ } else if (fragment.getNodeType() == ASTNode.QUALIFIED_NAME) {
+ QualifiedName name = (QualifiedName) fragment;
+ previousBinding = name.resolveBinding();
+ verifyNameBindings(name);
+ } else if (fragment.getNodeType() == ASTNode.MEMBER_REF) {
+ MemberRef memberRef = (MemberRef) fragment;
+ previousBinding = memberRef.resolveBinding();
+ if (previousBinding != null) {
+ SimpleName name = memberRef.getName();
+ assumeNotNull(this.prefix+""+name+" binding was not foundfound in "+fragment, name.resolveBinding());
+ verifyNameBindings(memberRef.getQualifier());
+ }
+ } else if (fragment.getNodeType() == ASTNode.METHOD_REF) {
+ MethodRef methodRef = (MethodRef) fragment;
+ previousBinding = methodRef.resolveBinding();
+ if (previousBinding != null) {
+ SimpleName methodName = methodRef.getName();
+ IBinding methNameBinding = methodName.resolveBinding();
+ Name methodQualifier = methodRef.getQualifier();
+ // TODO (frederic) Replace the two following lines by commented block when bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=62650 will be fixed
+ assumeNotNull(this.prefix+""+methodName+" binding was not found in "+fragment, methNameBinding);
+ verifyNameBindings(methodQualifier);
+ /*
+ if (methodQualifier == null) {
+ if (methNameBinding == null) {
+ char firstChar = methodName.getIdentifier().charAt(0);
+ if (Character.isUpperCase(firstChar)) {
+ // assume that selector starting with uppercase is for constructor => signal that binding is null
+ System.out.println(prefix+"Binding for selector of '"+methodRef+"' is null.");
+ }
+ } else {
+ if (methNameBinding.getName().equals(methodName.getIdentifier())) { // binding is not null only for constructor
+ assumeNotNull(prefix+""+methodName+" binding was not found!",methNameBinding);
+ } else {
+ assumeNull(prefix+""+methodName+" binding should be null!", methNameBinding);
+ }
+ }
+ } else {
+ SimpleName methodSimpleType = null;
+ if (methodQualifier.isQualifiedName()) {
+ methodSimpleType = ((QualifiedName)methodQualifier).getName();
+ } else {
+ methodSimpleType = (SimpleName) methodQualifier;
+ }
+ if (methodSimpleType.getIdentifier().equals(methodName.getIdentifier())) { // binding is not null only for constructor
+ assumeNotNull(prefix+""+methodName+" binding was not found!",methNameBinding);
+ } else {
+ assumeNull(prefix+""+methodName+" binding should be null!", methNameBinding);
+ }
+ verifyNameBindings(methodRef.getQualifier());
+ }
+ */
+ Iterator parameters = methodRef.parameters().listIterator();
+ while (parameters.hasNext()) {
+ MethodRefParameter param = (MethodRefParameter) parameters.next();
+ Type type = param.getType();
+ assumeNotNull(this.prefix+""+type+" binding was not found in "+fragment, type.resolveBinding());
+ if (type.isSimpleType()) {
+ verifyNameBindings(((SimpleType)type).getName());
+ } else if (type.isArrayType()) {
+ Type elementType = ((ArrayType) param.getType()).getElementType();
+ assumeNotNull(this.prefix+""+elementType+" binding was not found in "+fragment, elementType.resolveBinding());
+ if (elementType.isSimpleType()) {
+ verifyNameBindings(((SimpleType)elementType).getName());
+ }
+ }
+ // Do not verify parameter name as no binding is expected for them
+ }
+ }
+ }
+ }
+ previousFragment = fragment;
+ }
+ assumeTrue(this.prefix+"Reference '"+(previousFragment==null?tagElement:previousFragment)+"' should be bound!", (!resolvedBinding || previousBinding != null));
+ }
+
+ /*
+ * Verify each name component binding.
+ */
+ private void verifyNameBindings(Name name) {
+ if (name != null) {
+ IBinding binding = name.resolveBinding();
+ if (name.toString().indexOf("Unknown") > 0) {
+ assumeNull(this.prefix+name+" binding should be null!", binding);
+ } else {
+ assumeNotNull(this.prefix+name+" binding was not found!", binding);
+ }
+ SimpleName simpleName = null;
+ int index = 0;
+ while (name.isQualifiedName()) {
+ simpleName = ((QualifiedName) name).getName();
+ binding = simpleName.resolveBinding();
+ if (simpleName.getIdentifier().equalsIgnoreCase("Unknown")) {
+ assumeNull(this.prefix+simpleName+" binding should be null!", binding);
+ } else {
+ assumeNotNull(this.prefix+simpleName+" binding was not found!", binding);
+ }
+ if (index > 0 && this.packageBinding) {
+ assumeEquals(this.prefix+"Wrong binding type!", IBinding.PACKAGE, binding.getKind());
+ }
+ index++;
+ name = ((QualifiedName) name).getQualifier();
+ binding = name.resolveBinding();
+ if (name.toString().indexOf("Unknown") > 0) {
+ assumeNull(this.prefix+name+" binding should be null!", binding);
+ } else {
+ assumeNotNull(this.prefix+name+" binding was not found!", binding);
+ }
+ if (this.packageBinding) {
+ assumeEquals(this.prefix+"Wrong binding type!", IBinding.PACKAGE, binding.getKind());
+ }
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see junit.framework.TestCase#setUp()
+ */
+ protected void verifyComments(String test) throws JavaModelException {
+ ICompilationUnit[] units = getCompilationUnits("Converter_23" , "src", "markdown."+test); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ for (int i=0; i0);
+ for (int i=0; i 0) {
+ this.problems.append(" - "+this.prefix+length+" problems:"); //$NON-NLS-1$
+ for (int i = 0; i < problemsList.length; i++) {
+ this.problems.append(" + ");
+ this.problems.append(problemsList[i]);
+ this.problems.append("\n");
+ }
+ }
+ }
+ unitComments = compilUnit.getCommentList();
+ assumeNotNull(this.prefix+"Unexpected problems", unitComments);
+
+ // Basic comments verification
+ int size = unitComments.size();
+ //assumeEquals(this.prefix+"Wrong number of comments!", this.comments.size(), size);
+
+ // Verify comments positions and bindings
+ for (int i=0; i=0) {
+ Comment comment = (Comment) compilUnit.getCommentList().get(indexes[0]);
+ commentStart = comment.getStartPosition();
+ }
+ int startPosition = compilUnit.getExtendedStartPosition(method);
+ assumeEquals("Method "+node+" does not start at the right position", commentStart, startPosition);
+ int methodEnd = startPosition + compilUnit.getExtendedLength(method) - 1;
+ int commentEnd = method.getStartPosition() + method.getLength() - 1;
+ if (indexes[1]>=0) {
+ Comment comment = (Comment) compilUnit.getCommentList().get(indexes[1]);
+ commentEnd = comment.getStartPosition() + comment.getLength() - 1;
+ }
+ assumeEquals("Method "+node+" does not have the correct length", commentEnd, methodEnd);
+ // Verify second method existence
+ node = getASTNode((CompilationUnit) result, 0, 1);
+ assumeNotNull("We should get a non-null ast node", node);
+ assumeTrue("Not a method declaration", node.getNodeType() == ASTNode.METHOD_DECLARATION); //$NON-NLS-1$
+ method = (MethodDeclaration) node;
+ // Verify second method extended positions
+ commentStart = method.getStartPosition();
+ if (indexes[2]>=0) {
+ Comment comment = (Comment) compilUnit.getCommentList().get(indexes[2]);
+ commentStart = comment.getStartPosition();
+ }
+ startPosition = compilUnit.getExtendedStartPosition(method);
+ assumeEquals("Method "+node+" does not start at the right position", commentStart, startPosition);
+ methodEnd = startPosition + compilUnit.getExtendedLength(method) - 1;
+ commentEnd = method.getStartPosition() + method.getLength() - 1;
+ if (indexes[3]>=0) {
+ Comment comment = (Comment) compilUnit.getCommentList().get(indexes[3]);
+ commentEnd = comment.getStartPosition() + comment.getLength() - 1;
+ }
+ assumeEquals("Method "+node+" does not have the correct length", commentEnd, methodEnd);
+ }
+ }
+
+ /*
+ * End DefaultCommentMapper verifications
+ */
+
+ /**
+ * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=48489"
+ */
+ public void testBug48489() throws JavaModelException {
+ verifyComments("testBug48489");
+ }
+
+ /**
+ * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=50898"
+ */
+ public void testBug50898() throws JavaModelException {
+ ICompilationUnit unit = getCompilationUnit("Converter_23" , "src", "markdown.testBug50898", "Test.java"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ this.packageBinding = false;
+ verifyComments(unit);
+ }
+
+ /**
+ * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=51226"
+ */
+ public void testBug51226() throws JavaModelException {
+ ICompilationUnit[] units = getCompilationUnits("Converter_23" , "src", "markdown.testBug51226"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ for (int i=0; if);
+ String failure = this.failures.get(f);
+ String expected = "Reference '"+unbound[i]+"' should be bound!";
+ if (expected.equals(failure.substring(failure.indexOf(' ')+1))) {
+ this.failures.remove(f);
+ } else {
+ f++; // skip offending failure
+ i--; // stay on expected string
+ }
+ }
+ }
+ this.stopOnFailure = true;
+ }
+ public void testBug54424() throws JavaModelException {
+ this.stopOnFailure = false;
+ String [] unbound = { "tho",
+ "A#getList(int,long,boolean)",
+ "#getList(Object,java.util.AbstractList)",
+ };
+ verifyComments("testBug54424");
+ if (this.docCommentSupport.equals(JavaCore.ENABLED)) {
+ int size = unbound.length;
+ for (int i=0, f=0; if);
+ String failure = this.failures.get(f);
+ String expected = "Reference '"+unbound[i]+"' should be bound!";
+ if (expected.equals(failure.substring(failure.indexOf(' ')+1))) {
+ this.failures.remove(f);
+ } else {
+ f++; // skip offending failure
+ i--; // stay on expected string
+ }
+ }
+ }
+ this.stopOnFailure = true;
+ }
+
+ /**
+ * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=63044"
+ */
+ public void testBug63044() throws JavaModelException {
+ verifyComments("testBug63044");
+ }
+
+ /**
+ * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=51660"
+ */
+ public void testBug51660() throws JavaModelException {
+ this.stopOnFailure = false;
+ ICompilationUnit unit = getCompilationUnit("Converter_23" , "src", "markdown.testBug51660", "Test.java"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ CompilationUnit compilUnit = verifyComments(unit);
+ if (this.docCommentSupport.equals(JavaCore.ENABLED)) {
+ String[] tagNames = {
+ "@ejb",
+ "@ejb",
+ "@ejb",
+ "@ejb",
+ "@ejb",
+ "@ejb",
+ "@ejb(bean",
+ "@ejb)bean",
+ "@ejb",
+ "@ejb+bean",
+ "@ejb,bean",
+ "@ejb-bean",
+ "@ejb.bean",
+ "@ejb/bean",
+ "@ejb",
+ "@ejb;bean",
+ "@ejb",
+ "@ejb=bean",
+ "@ejb",
+ "@ejb?bean",
+ "@ejb@bean",
+ "@ejb[bean",
+ "@ejb\\bean",
+ "@ejb]bean",
+ "@ejb^bean",
+ "@ejb`bean",
+ "@ejb{bean",
+ "@ejb|bean",
+ "@ejb",
+ "@ejb~bean",
+ "@unknown"
+ };
+ String[] tagTexts = {
+ "!bean test non-java id character '!' (val=33) in tag name",
+ "\"bean test non-java id character '\"' (val=34) in tag name",
+ "#bean test non-java id character '#' (val=35) in tag name",
+ "%bean test non-java id character '%' (val=37) in tag name",
+ "&bean test non-java id character '&' (val=38) in tag name",
+ "'bean test non-java id character ''' (val=39) in tag name",
+ " test non-java id character '(' (val=40) in tag name",
+ " test non-java id character ')' (val=41) in tag name",
+ "*bean test non-java id character '*' (val=42) in tag name",
+ " test non-java id character '+' (val=43) in tag name",
+ " test non-java id character ',' (val=44) in tag name",
+ " test non-java id character '-' (val=45) in tag name",
+ " test non-java id character '.' (val=46) in tag name",
+ " test non-java id character '/' (val=47) in tag name",
+ ":bean test non-java id character ':' (val=58) in tag name",
+ " test non-java id character ';' (val=59) in tag name",
+ "bean test non-java id character '>' (val=62) in tag name",
+ " test non-java id character '?' (val=63) in tag name",
+ " test non-java id character '@' (val=64) in tag name",
+ " test non-java id character '[' (val=91) in tag name",
+ " test non-java id character '\\' (val=92) in tag name",
+ " test non-java id character ']' (val=93) in tag name",
+ " test non-java id character '^' (val=94) in tag name",
+ " test non-java id character '`' (val=96) in tag name",
+ " test non-java id character '{' (val=123) in tag name",
+ " test non-java id character '|' (val=124) in tag name",
+ "}bean test non-java id character '}' (val=125) in tag name",
+ " test non-java id character '~' (val=126) in tag name",
+ " test java id"
+ };
+ Comment comment = (Comment) compilUnit.getCommentList().get(0);
+ assumeTrue(this.prefix+"Comment should be a javadoc comment ", comment.isDocComment());
+ Javadoc docComment = (Javadoc) comment;
+ int size = docComment.tags().size();
+ for (int i=0; i Class type parameter\n" +
+ " * @see Object\n" +
+ " */\n" +
+ "public class Test {\n" +
+ " /**\n" +
+ " * @param t\n" +
+ " * @param Method type parameter\n" +
+ " */\n" +
+ " void foo(T t) {}\n" +
+ "}\n");
+ verifyWorkingCopiesComments();
+ }
+ public void testBug79809b() throws JavaModelException {
+ this.workingCopies = new ICompilationUnit[1];
+ this.astLevel = getJLS3();
+ this.workingCopies[0] = getWorkingCopy("/Converter/src/markdown/b79809/Test.java",
+ "package markdown.b79809;\n" +
+ "\n" +
+ "/**\n" +
+ " * New tags for 5.0\n" +
+ " * - literal: {@literal ac}\n" +
+ " * - code: {@code abc}\n" +
+ " * - value: {@value System#out}\n" +
+ " */\n" +
+ "public class Test {\n" +
+ "\n" +
+ "}\n");
+ verifyWorkingCopiesComments();
+ }
+
+ /**
+ * Bug 79904: [1.5][dom][javadoc] TagElement range not complete for type parameter tags
+ * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=79904"
+ */
+ public void testBug79904() throws JavaModelException {
+ this.workingCopies = new ICompilationUnit[1];
+ this.astLevel = getJLS3();
+ this.workingCopies[0] = getWorkingCopy("/Converter/src/markdown/b79904/Test.java",
+ "package markdown.b79904;\n" +
+ "/**\n" +
+ " * @param \n" +
+ " * @see Object\n" +
+ " */\n" +
+ "public class Test {\n" +
+ " /**\n" +
+ " * @param t\n" +
+ " * @param \n" +
+ " */\n" +
+ " void foo(T t) {}\n" +
+ "}\n");
+ verifyWorkingCopiesComments();
+ }
+
+ /**
+ * Bug 80221: [1.5][dom][javadoc] Need better support for type parameter Javadoc tags
+ * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=80221"
+ */
+ public void testBug80221() throws JavaModelException {
+ this.workingCopies = new ICompilationUnit[1];
+ this.astLevel = getJLS3();
+ this.workingCopies[0] = getWorkingCopy("/Converter/src/markdown/b80221/Test.java",
+ "package markdown.b80221;\n" +
+ "public class Test {\n" +
+ " /**\n" +
+ " * @see Object Unknown: ref is not resolved due to compile error...\n" +
+ " */\n" +
+ " public foo() {\n" +
+ " return 1;\n" +
+ " }\n" +
+ "}\n"
+ );
+ verifyWorkingCopiesComments();
+ }
+
+ /**
+ * Bug 80257: [1.5][javadoc][dom] Type references in javadocs should have generic binding, not raw
+ * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=80257"
+ */
+ public void testBug80257() throws JavaModelException {
+ this.workingCopies = new ICompilationUnit[1];
+ this.astLevel = getJLS3();
+ this.workingCopies[0] = getWorkingCopy("/Converter_23/src/markdown/b80257/Test.java",
+ "package markdown.b80257;\n" +
+ "import java.util.*;\n" +
+ "public class Test {\n" +
+ " /**\n" +
+ " * @see ArrayList\n" +
+ " * @return {@link java.util.List}\n" +
+ " */\n" +
+ " List getList() {\n" +
+ " return new ArrayList();\n" +
+ " }\n" +
+ "}\n"
+ );
+ CompilationUnit compilUnit = verifyComments(this.workingCopies[0]);
+ if (this.docCommentSupport.equals(JavaCore.ENABLED)) {
+ // Do not need to verify following statement as we know it's ok as verifyComments did not fail
+ Javadoc docComment = (Javadoc) compilUnit.getCommentList().get(0); // get javadoc comment
+ TagElement firstTag = (TagElement) docComment.tags().get(0); // get first tag
+ TagElement secondTag = (TagElement) docComment.tags().get(1); // get second tag
+ TagElement inlineTag = (TagElement) secondTag.fragments().get(1); // get inline tag
+ // Get tag simple name reference in first tag
+ assertEquals("Invalid number of fragments for tag element: "+firstTag, 1, firstTag.fragments().size());
+ ASTNode node = (ASTNode) firstTag.fragments().get(0);
+ assertEquals("Invalid kind of name reference for tag element: "+firstTag, ASTNode.SIMPLE_NAME, node.getNodeType());
+ SimpleName seeRef = (SimpleName) node;
+ // Verify binding for simple name
+ IBinding binding = seeRef.resolveBinding();
+ assertTrue("Wrong kind of binding", binding instanceof ITypeBinding);
+ ITypeBinding typeBinding = (ITypeBinding)binding;
+ // https://bugs.eclipse.org/bugs/show_bug.cgi?id=209936
+ // only have RawTypeBinding in Javadocs
+ assertFalse(seeRef.toString()+" should NOT have a generic type binding", typeBinding.isGenericType());
+ assertFalse(seeRef.toString()+" should NOT have a parameterized type binding", typeBinding.isParameterizedType());
+ assertTrue(seeRef.toString()+" should have a raw type binding", typeBinding.isRawType());
+ // Get inline tag simple name reference in second tag
+ assertEquals("Invalid number of fragments for inline tag element: "+inlineTag, 1, inlineTag.fragments().size());
+ node = (ASTNode) inlineTag.fragments().get(0);
+ assertEquals("Invalid kind of name reference for tag element: "+inlineTag, ASTNode.QUALIFIED_NAME, node.getNodeType());
+ QualifiedName linkRef = (QualifiedName) node;
+ // Verify binding for qualified name
+ binding = linkRef.resolveBinding();
+ assertTrue("Wrong kind of binding", binding instanceof ITypeBinding);
+ typeBinding = (ITypeBinding)binding;
+ // https://bugs.eclipse.org/bugs/show_bug.cgi?id=209936
+ // only have RawTypeBinding in Javadocs
+ assertFalse(linkRef.toString()+" should NOT have a generic type binding", typeBinding.isGenericType());
+ assertFalse(linkRef.toString()+" should NOT have a parameterized type binding", typeBinding.isParameterizedType());
+ assertTrue(linkRef.toString()+" should have a raw type binding", typeBinding.isRawType());
+ }
+ }
+
+ /**
+ * Bug 84049: [javadoc][dom] Extended ranges wrong for method name without return type
+ * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=84049"
+ */
+ public void testBug84049() throws JavaModelException {
+ this.workingCopies = new ICompilationUnit[1];
+ this.astLevel = getJLS3();
+ this.workingCopies[0] = getWorkingCopy("/Converter_23/src/markdown/b84049/Test.java",
+ "package markdown.b84049;\n" +
+ "public class Test {\n" +
+ " /**\n" +
+ " * @see Object\n" +
+ " */\n" +
+ " foo() {\n" +
+ " }\n" +
+ "}\n"
+ );
+ CompilationUnit compilUnit = (CompilationUnit) runConversion(this.workingCopies[0], true);
+ if (this.docCommentSupport.equals(JavaCore.ENABLED)) {
+ ASTNode node = getASTNode(compilUnit, 0, 0);
+ assertEquals("Invalid type for node: "+node, ASTNode.METHOD_DECLARATION, node.getNodeType());
+ MethodDeclaration methodDeclaration = (MethodDeclaration) node;
+ Javadoc methodJavadoc = methodDeclaration.getJavadoc();
+ assertNotNull("MethodDeclaration have a javadoc comment", methodJavadoc);
+ int javadocStart = methodJavadoc.getStartPosition();
+ assertEquals("Method declaration should include javadoc comment", methodDeclaration.getStartPosition(), javadocStart);
+ SimpleName methodName = methodDeclaration.getName();
+ int nameStart = methodName.getStartPosition();
+ assertTrue("Method simple name should not include javadoc comment", nameStart > javadocStart+methodJavadoc.getLength());
+ int extendedStart = compilUnit.getExtendedStartPosition(methodName);
+ assertEquals("Method simple name start position should not be extended!", nameStart, extendedStart);
+ int extendedLength = compilUnit.getExtendedLength(methodName);
+ assertEquals("Method simple name length should not be extended!", methodName.getLength(), extendedLength);
+ }
+ }
+
+ /**
+ * Bug 87845: [1.5][javadoc][dom] Type references in javadocs should have generic binding, not raw
+ * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=87845"
+ */
+ public void testBug87845() throws JavaModelException {
+ this.workingCopies = new ICompilationUnit[1];
+ this.astLevel = getJLS3();
+ this.workingCopies[0] = getWorkingCopy("/Converter_23/src/markdown/b87845/Test.java",
+ "package markdown.b87845;\n" +
+ "public class Test {\n" +
+ " public void foo(int a, int b) {} \n" +
+ " public void foo(int a, int... args) {}\n" +
+ " public void foo(String... args) {}\n" +
+ " public void foo(Exception str, boolean... args) {}\n" +
+ " /**\n" +
+ " * @see Test#foo(int, int)\n" +
+ " * @see Test#foo(int, int[])\n" +
+ " * @see Test#foo(int, int...)\n" +
+ " * @see Test#foo(String[])\n" +
+ " * @see Test#foo(String...)\n" +
+ " * @see Test#foo(Exception, boolean[])\n" +
+ " * @see Test#foo(Exception, boolean...)\n" +
+ " */\n" +
+ " public void valid() {}\n" +
+ " /**\n" +
+ " * @see Test#foo(int)\n" +
+ " * @see Test#foo(int, int, int)\n" +
+ " * @see Test#foo()\n" +
+ " * @see Test#foo(String)\n" +
+ " * @see Test#foo(String, String)\n" +
+ " * @see Test#foo(Exception)\n" +
+ " * @see Test#foo(Exception, boolean)\n" +
+ " * @see Test#foo(Exception, boolean, boolean)\n" +
+ " */\n" +
+ " public void invalid() {}\n" +
+ "}\n"
+ );
+ CompilationUnit compilUnit = verifyComments(this.workingCopies[0]);
+ if (this.docCommentSupport.equals(JavaCore.ENABLED)) {
+ // Do not need to verify following statement as we know it's ok as verifyComments did not fail
+ Javadoc docComment = (Javadoc) compilUnit.getCommentList().get(0); // get first javadoc comment
+ // Verify last parameter for all methods reference in javadoc comment
+ List tags = docComment.tags();
+ int size = tags.size();
+ for (int i=0; i comment.getStartPosition()+comment.getLength());
+ }
+ }
+ public void testBug93880_14a() throws JavaModelException {
+ this.workingCopies = new ICompilationUnit[1];
+ this.astLevel = getJLS3();
+ this.workingCopies[0] = getWorkingCopy("/Converter_23/src/markdown/b93880/Test.java",
+ "/**\n" +
+ " * Javadoc\n" +
+ " */\n" +
+ "package markdown.b93880;\n" +
+ "public class Test {\n" +
+ "}\n"
+ );
+ CompilationUnit compilUnit = verifyComments(this.workingCopies[0]);
+ if (this.docCommentSupport.equals(JavaCore.ENABLED)) {
+ // Get package declaration declaration and javadoc
+ PackageDeclaration packDecl = compilUnit.getPackage();
+ Javadoc docComment = (Javadoc) compilUnit.getCommentList().get(0); // Do not need to verify following statement as we know it's ok as verifyComments did not fail
+
+ // Verify package declaration declaration source start
+ assertEquals("Source range of PackageDeclaration should include Javadoc child", docComment.getStartPosition(), packDecl.getStartPosition());
+ }
+ }
+ public void testBug93880_14b() throws JavaModelException {
+ this.workingCopies = new ICompilationUnit[1];
+ this.astLevel = getJLS3();
+ this.workingCopies[0] = getWorkingCopy("/Converter_23/src/markdown/b93880/package-info.java",
+ "/**\n" +
+ " * Javadoc for all package\n" +
+ " */\n" +
+ "package markdown.b93880;"
+ );
+ CompilationUnit compilUnit = verifyComments(this.workingCopies[0]);
+ if (this.docCommentSupport.equals(JavaCore.ENABLED)) {
+ // Get package declaration declaration and javadoc
+ PackageDeclaration packDecl = compilUnit.getPackage();
+ Javadoc docComment = (Javadoc) compilUnit.getCommentList().get(0); // Do not need to verify following statement as we know it's ok as verifyComments did not fail
+
+ // Verify package declaration declaration source start
+ assertEquals("Source range of PackageDeclaration should include Javadoc child", docComment.getStartPosition(), packDecl.getStartPosition());
+ }
+ }
+ public void testBug93880_14c() throws JavaModelException {
+ this.workingCopies = new ICompilationUnit[1];
+ this.astLevel = getJLS3();
+ this.workingCopies[0] = getWorkingCopy("/Converter_23/src/markdown/b93880/package-info.java",
+ "/**\n" +
+ " * Javadoc for all package\n" +
+ " */\n" +
+ "private package markdown.b93880;"
+ );
+ CompilationUnit compilUnit = verifyComments(this.workingCopies[0]);
+ if (this.docCommentSupport.equals(JavaCore.ENABLED)) {
+ // Get package declaration declaration and javadoc
+ PackageDeclaration packDecl = compilUnit.getPackage();
+ Javadoc docComment = (Javadoc) compilUnit.getCommentList().get(0); // Do not need to verify following statement as we know it's ok as verifyComments did not fail
+
+ // Verify package declaration declaration source start
+ assertEquals("Source range of PackageDeclaration should include Javadoc child", docComment.getStartPosition(), packDecl.getStartPosition());
+ }
+ }
+ public void testBug93880_14d() throws JavaModelException {
+ this.workingCopies = new ICompilationUnit[1];
+ this.astLevel = getJLS3();
+ this.workingCopies[0] = getWorkingCopy("/Converter_23/src/markdown/b93880/package-info.java",
+ "/**\n" +
+ " * Javadoc for all package\n" +
+ " */\n" +
+ "@Deprecated\n" +
+ "package markdown.b93880;"
+ );
+ CompilationUnit compilUnit = verifyComments(this.workingCopies[0]);
+ if (this.docCommentSupport.equals(JavaCore.ENABLED)) {
+ // Get package declaration declaration and javadoc
+ PackageDeclaration packDecl = compilUnit.getPackage();
+ assertNotNull("Compilation unit should have a package declaration", packDecl);
+ Javadoc docComment = (Javadoc) compilUnit.getCommentList().get(0); // Do not need to verify following statement as we know it's ok as verifyComments did not fail
+
+ // Verify package declaration declaration source start
+ assertEquals("Source range of PackageDeclaration should include Javadoc child", docComment.getStartPosition(), packDecl.getStartPosition());
+ }
+ }
+ public void testBug93880_14e() throws JavaModelException {
+ this.workingCopies = new ICompilationUnit[1];
+ this.astLevel = getJLS3();
+ this.workingCopies[0] = getWorkingCopy("/Converter_23/src/markdown/b93880/package-info.java",
+ "/* (non-javadoc)\n" +
+ " * No comment\n" +
+ " */\n" +
+ "package markdown.b93880;"
+ );
+ CompilationUnit compilUnit = verifyComments(this.workingCopies[0]);
+ if (this.docCommentSupport.equals(JavaCore.ENABLED)) {
+ // Get package declaration declaration and javadoc
+ PackageDeclaration packDecl = compilUnit.getPackage();
+ List unitComments = compilUnit.getCommentList();
+ assertEquals("Wrong number of comments", 1, unitComments.size());
+ Comment comment = (Comment) unitComments.get(0);
+
+ // Verify package declaration declaration source start
+ assertTrue("Source range of PackageDeclaration should NOT not include Javadoc child", packDecl.getStartPosition() > comment.getStartPosition()+comment.getLength());
+ }
+ }
+
+ /**
+ * Bug 94150: [javadoc][dom] Extended ranges wrong for method name without return type
+ * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=94150"
+ */
+ public void testBug94150() throws JavaModelException {
+ this.workingCopies = new ICompilationUnit[1];
+ this.astLevel = getJLS3();
+ this.workingCopies[0] = getWorkingCopy("/Converter_23/src/markdown/b94150/Category.java",
+ "package markdown.b94150;\n" +
+ "public enum Category {\n" +
+ " ///\n" +
+ " /// history style\n" +
+ " /// @see Object\n" +
+ " /// \n" +
+ " HISTORY,\n" +
+ "\n" +
+ " ///\n" +
+ " /// war style\n" +
+ " /// \n" +
+ " WAR;\n" +
+ "}\n"
+ );
+ CompilationUnit compilUnit = verifyComments(this.workingCopies[0]);
+ if (this.docCommentSupport.equals(JavaCore.ENABLED)) {
+ // Get enum declaration
+ ASTNode node = getASTNode(compilUnit, 0);
+ assertEquals("Expected enum declaration.", ASTNode.ENUM_DECLARATION, node.getNodeType());
+ EnumDeclaration enumDeclaration = (EnumDeclaration) node;
+
+ // Verify each enum constant javadoc
+ List constants = enumDeclaration.enumConstants();
+ int size = constants.size();
+ assertEquals("Wrong number of constants", 2, size);
+ for (int i=0; i commentEnd);
+ Statement statement = ifStatement.getThenStatement();
+ assertEquals("Expected block for node: "+statement, ASTNode.BLOCK, statement.getNodeType());
+ Block block = (Block) statement;
+ assertTrue("Invalid start position for Block: "+block, block.getStartPosition() > commentEnd);
+ List statements = block.statements();
+ assertEquals("Invalid number of statements for block: "+block, 1, statements.size());
+ statement = (Statement) statements.get(0);
+ assertEquals("Expected variable declaration statement for node: "+statement, ASTNode.VARIABLE_DECLARATION_STATEMENT, statement.getNodeType());
+ VariableDeclarationStatement varDecl = (VariableDeclarationStatement) statement;
+ assertTrue("Invalid start position for : VariableDeclarationStatement"+varDecl, varDecl.getStartPosition() > commentEnd);
+ }
+ }
+ public void testBug100041b() throws JavaModelException {
+ this.workingCopies = new ICompilationUnit[1];
+ this.workingCopies[0] = getWorkingCopy("/Converter_23/src/markdown/b100041/X.java",
+ "package markdown.b100041;\n" +
+ "class X {\n" +
+ " static Object object;\n" +
+ " static void foo() {\n" +
+ " /**\n" +
+ " * javadoc comment.\n" +
+ " */\n" +
+ " if (object instanceof String)\n" +
+ " return;\n" +
+ " }\n" +
+ "}"
+ );
+ CompilationUnit compilUnit = verifyComments(this.workingCopies[0]);
+ if (this.docCommentSupport.equals(JavaCore.ENABLED)) {
+ // Get comment
+ List unitComments = compilUnit.getCommentList();
+ assertEquals("Wrong number of comments", 1, unitComments.size());
+ Comment comment = (Comment) unitComments.get(0);
+ int commentStart = comment.getStartPosition();
+ int commentEnd = commentStart+comment.getLength();
+
+ // Get local variable declaration
+ ASTNode node = getASTNode(compilUnit, 0, 1, 0);
+ assertEquals("Expected if statement for node: "+node, ASTNode.IF_STATEMENT, node.getNodeType());
+ IfStatement ifStatement = (IfStatement) node;
+ assertTrue("Invalid start position for IfStatement: "+ifStatement, ifStatement.getStartPosition() > commentEnd);
+ Statement statement = ifStatement.getThenStatement();
+ assertEquals("Expected block for node: "+statement, ASTNode.RETURN_STATEMENT, statement.getNodeType());
+ ReturnStatement returnStatement = (ReturnStatement) statement;
+ assertTrue("Invalid start position for Block: "+returnStatement, returnStatement.getStartPosition() > commentEnd);
+ }
+ }
+ public void testBug100041c() throws JavaModelException {
+ this.workingCopies = new ICompilationUnit[1];
+ this.workingCopies[0] = getWorkingCopy("/Converter_23/src/markdown/b100041/Z.java",
+ "package markdown.b100041;\n" +
+ "public class Z {\n" +
+ " /** C1 */\n" +
+ " class Z1 {}\n" +
+ " /** C2 */\n" +
+ " Z1 z1;\n" +
+ " /** C3 */\n" +
+ " public static void foo(Object object) {\n" +
+ " /** C4 */\n" +
+ " class ZZ {\n" +
+ " /** C5 */\n" +
+ " ZZ zz;\n" +
+ " /** C6 */\n" +
+ " public void bar() {}\n" +
+ " }\n" +
+ " }\n" +
+ "}\n"
+ );
+ CompilationUnit compilUnit = verifyComments(this.workingCopies[0]);
+ if (this.docCommentSupport.equals(JavaCore.ENABLED)) {
+ // Get comments
+ List unitComments = compilUnit.getCommentList();
+ int size = unitComments.size();
+ assertEquals("Wrong number of comments", 6, size);
+ Javadoc[] javadocs = new Javadoc[size];
+ Iterator iterator = unitComments.iterator();
+ for (int i=0; iIWorkspace.
+ ///
+ /// things
+ /// #foo(java.util.
+ /// Vector)
+ ///
+ public void foo(java.util.Vector list) {}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/test109/Test.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/test109/Test.java
new file mode 100644
index 00000000000..9bdf1fe7f66
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/test109/Test.java
@@ -0,0 +1,7 @@
+public class SAMPLE_UTF8 {
+ ///
+ /// @param nDataCount\uff1a\uff10
+ ///
+ public static void main(String[] args) {
+ }
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug228648/A.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug228648/A.java
new file mode 100644
index 00000000000..53eab06a581
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug228648/A.java
@@ -0,0 +1,12 @@
+package javadoc.testBug228648;
+import javadoc.testBug228648.B.Inner;
+///
+/// #foo(Inner)}
+/// #foo2(B)}
+///
+public class A {
+ public void foo(Inner inner) {
+ }
+ public void foo2(B b) {
+ }
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug228648/B.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug228648/B.java
new file mode 100644
index 00000000000..bb9fc995b17
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug228648/B.java
@@ -0,0 +1,5 @@
+package javadoc.testBug228648;
+public class B {
+ class Inner {
+ }
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug336821/Try.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug336821/Try.java
new file mode 100644
index 00000000000..d5cba97149b
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug336821/Try.java
@@ -0,0 +1,16 @@
+package javadoc.testBug336821;
+///
+/// constructor
+/// #Try
+/// String)
+/// #foo
+///
+public class Try {
+ public Try(int i, String message) {
+ System.out.println(message + i);
+ }
+
+ public void foo(int i, String message) {
+ System.out.println(message + i);
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug347100/X.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug347100/X.java
new file mode 100644
index 00000000000..34f32f7c8ea
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug347100/X.java
@@ -0,0 +1,12 @@
+package javadoc.testBug347100;
+///
+/// javadoc},
+/// World"},
+/// documentation}
+///
+/// javadoc
+/// World"
+/// documentation
+///
+public class X {
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug48489/TestA.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug48489/TestA.java
new file mode 100644
index 00000000000..3c7195a825c
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug48489/TestA.java
@@ -0,0 +1,11 @@
+package javadoc.testBug48489;
+import java.util.*;
+public class TestA {
+ ///
+ /// comment
+ ///
+ public static void main(String[] args) {
+ /* method main */
+ System.out.println("Hello" + " world"); // comment
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug48489/TestB.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug48489/TestB.java
new file mode 100644
index 00000000000..26e50d676ed
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug48489/TestB.java
@@ -0,0 +1,8 @@
+package javadoc.testBug48489;
+import java.util.*;
+public class TestB {
+ ///
+ /// Javadoc
+ ///
+ public static final /* */ String s = "NULL", s2="";// line comment
+}
\ No newline at end of file
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug48489/TestC.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug48489/TestC.java
new file mode 100644
index 00000000000..78f77bb13b3
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug48489/TestC.java
@@ -0,0 +1,11 @@
+package javadoc.testBug48489;
+import java.util.*;
+public class TestC {
+ ///
+ /// Javadoc
+ ///
+ static {
+ /* */
+ System.out.println("Hello" + " world"); // line comment
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug48489/TestD.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug48489/TestD.java
new file mode 100644
index 00000000000..02405f6cb2a
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug48489/TestD.java
@@ -0,0 +1,10 @@
+package javadoc.testBug48489;
+import java.util.*;
+public class TestD {
+ ///
+ /// Javadoc
+ ///
+ public static void main(String[] args) {
+ System.out./* */println("Hello" + " world");
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug48489/TestE.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug48489/TestE.java
new file mode 100644
index 00000000000..e7d040f0d78
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug48489/TestE.java
@@ -0,0 +1,10 @@
+package javadoc.testBug48489;
+import java.util.*;
+public class TestE {
+ ///
+ /// Javadoc
+ ///
+ public static void main(String[] args) {
+ System.out.println("Hello" + /* */ " world");
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug50898/G.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug50898/G.java
new file mode 100644
index 00000000000..76ec2ae1295
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug50898/G.java
@@ -0,0 +1,4 @@
+package javadoc.testBug50898;
+public class G {
+ private static class Inner {}
+}
\ No newline at end of file
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug50898/Test.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug50898/Test.java
new file mode 100644
index 00000000000..2e1d7c1ea9f
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug50898/Test.java
@@ -0,0 +1,8 @@
+package javadoc.testBug50898;
+public class Test {
+ ///
+ /// @see G.Inner
+ ///
+ public void foo() {
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51226/X1.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51226/X1.java
new file mode 100644
index 00000000000..dfe83b0054b
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51226/X1.java
@@ -0,0 +1,6 @@
+package javadoc.testBug51226;
+/*\u002A
+ * Test
+ */
+public class X1 {
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51226/X2.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51226/X2.java
new file mode 100644
index 00000000000..40a06e3880b
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51226/X2.java
@@ -0,0 +1,6 @@
+package javadoc.testBug51226;
+/\u002A*
+ * Test
+ */
+public class X2 {
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51226/X3.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51226/X3.java
new file mode 100644
index 00000000000..7d080e12f02
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51226/X3.java
@@ -0,0 +1,6 @@
+package javadoc.testBug51226;
+\u002F**
+ * Test
+ */
+public class X3 {
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51226/X4.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51226/X4.java
new file mode 100644
index 00000000000..62f1d49f369
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51226/X4.java
@@ -0,0 +1,6 @@
+package javadoc.testBug51226;
+/\u002A\u002A
+ \u002A Test
+ \u002A/
+public class X4 {
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51226/X5.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51226/X5.java
new file mode 100644
index 00000000000..b57e319cd13
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51226/X5.java
@@ -0,0 +1,6 @@
+package javadoc.testBug51226;
+\u002F**
+ * Test
+ *\u002F
+public class X5 {
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51226/X6.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51226/X6.java
new file mode 100644
index 00000000000..84c21ec312f
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51226/X6.java
@@ -0,0 +1,6 @@
+package javadoc.testBug51226;
+\u002F\u002A\u002A
+ \u002A Test
+ \u002A\u002F
+public class X6 {
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51363/Test.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51363/Test.java
new file mode 100644
index 00000000000..94bd7f547bd
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51363/Test.java
@@ -0,0 +1,4 @@
+package javadoc.testBug51363;
+\u002F\u002FUnicode comment\u000D\u000Apublic class Test {
+ \u002F\u002FUnicode comment\u000Dvoid foo() {}
+}
\ No newline at end of file
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51476/X1.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51476/X1.java
new file mode 100644
index 00000000000..9242f59a4bb
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51476/X1.java
@@ -0,0 +1,7 @@
+package javadoc.testBug51476;
+///
+/// @see "Test class X"
+/// @see Valid URL
+///
+public class X1 {
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51476/X2.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51476/X2.java
new file mode 100644
index 00000000000..ce979dca65d
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51476/X2.java
@@ -0,0 +1,6 @@
+package javadoc.testBug51476;
+///
+/// @see "Test class X"
+///
+public class X2 {
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51476/X3.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51476/X3.java
new file mode 100644
index 00000000000..a48e8bb784f
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51476/X3.java
@@ -0,0 +1,6 @@
+package javadoc.testBug51476;
+///
+/// @see Valid URL
+///
+public class X3 {
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51478/X1.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51478/X1.java
new file mode 100644
index 00000000000..a5eecc31192
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51478/X1.java
@@ -0,0 +1,7 @@
+package javadoc.testBug51478;
+///
+/// {@inheritDoc}
+/// @deprecated
+///
+public class X1 {
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51478/X2.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51478/X2.java
new file mode 100644
index 00000000000..b712fea6269
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51478/X2.java
@@ -0,0 +1,6 @@
+package javadoc.testBug51478;
+///
+/// {@inheritDoc}
+///
+public class X2 {
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51478/X3.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51478/X3.java
new file mode 100644
index 00000000000..e87951274c2
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51478/X3.java
@@ -0,0 +1,6 @@
+package javadoc.testBug51478;
+///
+/// @deprecated
+///
+public class X3 {
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51508/X.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51508/X.java
new file mode 100644
index 00000000000..e7379f7a153
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51508/X.java
@@ -0,0 +1,7 @@
+package javadoc.testBug51508;
+///
+/// @see java
+/// @see java.util
+///
+public class X {
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51600/Test.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51600/Test.java
new file mode 100644
index 00000000000..2596326957b
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51600/Test.java
@@ -0,0 +1,17 @@
+package javadoc.testBug51600;
+public class Test {
+ ///
+ /// @param str
+ /// @param
+ /// @param str
+ /// @see
+ /// @see
+ /// @see #
+ /// @see "Invalid
+ /// @return String
+ /// @return
+ /// @return String
+ ///
+ String foo(String str) { return ""; }
+
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51617/Test.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51617/Test.java
new file mode 100644
index 00000000000..5c82f6ffecf
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51617/Test.java
@@ -0,0 +1,10 @@
+package javadoc.testBug51617;
+public class Test {
+ ///
+ /// Set in separated folder as we have an unbound reference...
+ /// @exception e
+ /// @param name The name to set
+ ///
+ public void setName1(String name) {
+ }
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51650/X.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51650/X.java
new file mode 100644
index 00000000000..4265865e01b
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51650/X.java
@@ -0,0 +1,9 @@
+package javadoc.testBug51650;
+public class X {
+ ///
+ /// @see Exception
+ /// {@link Exception}
+ ///
+ public void foo() {
+ }
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51660/Test.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51660/Test.java
new file mode 100644
index 00000000000..b80bf02910d
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51660/Test.java
@@ -0,0 +1,37 @@
+package javadoc.testBug51660;
+///
+/// @ejb!bean test non-java id character '!' (val=33) in tag name
+/// @ejb"bean test non-java id character '"' (val=34) in tag name
+/// @ejb#bean test non-java id character '#' (val=35) in tag name
+/// @ejb%bean test non-java id character '%' (val=37) in tag name
+/// @ejb&bean test non-java id character '&' (val=38) in tag name
+/// @ejb'bean test non-java id character ''' (val=39) in tag name
+/// @ejb(bean test non-java id character '(' (val=40) in tag name
+/// @ejb)bean test non-java id character ')' (val=41) in tag name
+/// @ejb*bean test non-java id character '*' (val=42) in tag name
+/// @ejb+bean test non-java id character '+' (val=43) in tag name
+/// @ejb,bean test non-java id character ',' (val=44) in tag name
+/// @ejb-bean test non-java id character '-' (val=45) in tag name
+/// @ejb.bean test non-java id character '.' (val=46) in tag name
+/// @ejb/bean test non-java id character '/' (val=47) in tag name
+/// @ejb:bean test non-java id character ':' (val=58) in tag name
+/// @ejb;bean test non-java id character ';' (val=59) in tag name
+/// @ejbbean test non-java id character '>' (val=62) in tag name
+/// @ejb?bean test non-java id character '?' (val=63) in tag name
+/// @ejb@bean test non-java id character '@' (val=64) in tag name
+/// @ejb[bean test non-java id character '[' (val=91) in tag name
+/// @ejb\bean test non-java id character '\' (val=92) in tag name
+/// @ejb]bean test non-java id character ']' (val=93) in tag name
+/// @ejb^bean test non-java id character '^' (val=94) in tag name
+/// @ejb`bean test non-java id character '`' (val=96) in tag name
+/// @ejb{bean test non-java id character '{' (val=123) in tag name
+/// @ejb|bean test non-java id character '|' (val=124) in tag name
+/// @ejb}bean test non-java id character '}' (val=125) in tag name
+/// @ejb~bean test non-java id character '~' (val=126) in tag name
+/// @unknown test java id
+///
+public class Test {
+
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51770/X.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51770/X.java
new file mode 100644
index 00000000000..66250f874ae
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51770/X.java
@@ -0,0 +1,6 @@
+package javadoc.testBug51770;
+///
+/// @see java.util.Vector
+///
+public class X {
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51911/TestInvalid.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51911/TestInvalid.java
new file mode 100644
index 00000000000..1ba8eb8171b
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51911/TestInvalid.java
@@ -0,0 +1,8 @@
+package javadoc.testBug51911;
+///
+/// @see #foo
+///
+public class TestInvalid {
+ public void foo(int i, float f) {}
+ public void foo(String str) {}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51911/TestValid1.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51911/TestValid1.java
new file mode 100644
index 00000000000..81dfad349d5
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51911/TestValid1.java
@@ -0,0 +1,8 @@
+package javadoc.testBug51911;
+///
+/// @see #foo
+///
+public class TestValid1 {
+ public int foo;
+ public void foo(String str) {}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51911/TestValid2.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51911/TestValid2.java
new file mode 100644
index 00000000000..b2f5bfc0c72
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51911/TestValid2.java
@@ -0,0 +1,7 @@
+package javadoc.testBug51911;
+///
+/// @see #foo
+///
+public class TestValid2 {
+ public void foo(String str) {}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51911/TestValid3.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51911/TestValid3.java
new file mode 100644
index 00000000000..53d1f6fbcc9
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug51911/TestValid3.java
@@ -0,0 +1,9 @@
+package javadoc.testBug51911;
+///
+/// @see #foo
+///
+public class TestValid3 {
+ public int foo;
+ public void foo() {}
+ public void foo(String str) {}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug52908/X.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug52908/X.java
new file mode 100644
index 00000000000..bbd012ef2c6
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug52908/X.java
@@ -0,0 +1,47 @@
+package javadoc.testBug52908;
+public class X {
+ ///
+ /// Text element starting with a
+ /// { caused troubles in its position
+ /// if the bug is not fixed
+ /// @see Object
+ ////
+ Object x1;
+ ///
+ /// Text element ending with a }
+ /// caused troubles in its position
+ /// if the bug is not fixed
+ /// @see Object
+ ////
+ Object x2;
+ ///
+ /// Text element starting with a
+ /// } caused troubles in its position
+ /// if the bug is not fixed
+ /// @see Object
+ ////
+ Object x3;
+ ///
+ /// Text element ending with a {
+ /// caused troubles in its position
+ /// if the bug is not fixed
+ /// @see Object
+ ////
+ Object x4;
+ ///
+ /// Text element starting with
+ /// { and ending with }
+ /// caused troubles in its position
+ /// if the bug is not fixed
+ /// @see Object
+ ////
+ Object x6;
+ ///
+ /// Text element starting with
+ /// } and ending with {
+ /// caused troubles in its position
+ /// if the bug is not fixed
+ /// @see Object
+ ////
+ Object x7;
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug52908/Y.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug52908/Y.java
new file mode 100644
index 00000000000..f0703e357c4
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug52908/Y.java
@@ -0,0 +1,14 @@
+package javadoc.testBug52908;
+public class Y {
+ ///
+ /// while (true)
+ /// {
+ /// int token = scanner.getNextToken();
+ /// if (token == ITerminalSymbols.TokenNameEOF) break;
+ /// System.out.println(token + " : " + new String(scanner.getCurrentTokenSource()));
+ /// }
+ ///
+ ///
+ ////
+ void foo() {}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug52908a/Test.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug52908a/Test.java
new file mode 100644
index 00000000000..31669ac479e
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug52908a/Test.java
@@ -0,0 +1,15 @@
+package javadoc.testBug52908a;
+import java.util.List;
+
+///
+/// AST node for a parameter within a method reference ([Object]).
+/// These nodes only occur within doc comments ([List]).
+///
+/// MethodRefParameter:
+/// Type [ Identifier ]
+///
+///
+/// @see List
+/// @since 3.0
+////
+public class Test {}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug52908unicode/X.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug52908unicode/X.java
new file mode 100644
index 00000000000..f378b163f50
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug52908unicode/X.java
@@ -0,0 +1,47 @@
+package javadoc.testBug52908unicode;
+public class X {
+ ///
+ /// Text element starting with a
+ /// \u007b caused troubles in its position
+ /// if the bug is not fixed
+ /// @see Object
+ ////
+ Object x1;
+ ///
+ /// Text element ending with a \u007d
+ /// caused troubles in its position
+ /// if the bug is not fixed
+ /// @see Object
+ ////
+ Object x2;
+ ///
+ /// Text element starting with a
+ /// \u007d caused troubles in its position
+ /// if the bug is not fixed
+ /// @see Object
+ ////
+ Object x3;
+ ///
+ /// Text element ending with a \u007b
+ /// caused troubles in its position
+ /// if the bug is not fixed
+ /// @see Object
+ ////
+ Object x4;
+ ///
+ /// Text element starting with
+ /// \u007b and ending with \u007d
+ /// caused troubles in its position
+ /// if the bug is not fixed
+ /// @see Object
+ ////
+ Object x6;
+ ///
+ /// Text element starting with
+ /// \u007d and ending with \u007b
+ /// caused troubles in its position
+ /// if the bug is not fixed
+ /// @see Object
+ ////
+ Object x7;
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug52908unicode/Y.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug52908unicode/Y.java
new file mode 100644
index 00000000000..acbfb9eaf91
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug52908unicode/Y.java
@@ -0,0 +1,14 @@
+package javadoc.testBug52908unicode;
+public class Y {
+ ///
+ /// while (true)
+ /// \u007b
+ /// int token = scanner.getNextToken();
+ /// if (token == ITerminalSymbols.TokenNameEOF) break;
+ /// System.out.println(token + " : " + new String(scanner.getCurrentTokenSource()));
+ /// \u007d
+ ///
+ ///
+ ////
+ void foo() {}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug53075/X.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug53075/X.java
new file mode 100644
index 00000000000..ef68946a793
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug53075/X.java
@@ -0,0 +1,9 @@
+package javadoc.testBug53075;
+class X {
+///
+/// @link aggregates
+/// [... some more ...]
+/// @linkplain plain aggregates
+////
+void foo() {}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug53276/TestA.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug53276/TestA.java
new file mode 100644
index 00000000000..8eac6c060ce
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug53276/TestA.java
@@ -0,0 +1,15 @@
+package javadoc.testBug53276;
+public interface TestA {
+ ///
+ /// Return the string specifying the pattern of this ignore. The string
+ /// may include the wildcard characters '*' and '?'. If you wish to
+ /// include either of these characters verbatim (i.e. you do not wish
+ /// them to expand to wildcards), you must escape them with a backslash '\'.
+ ///
+ /// If you are using string literals in Java to represent the patterns, don't
+ /// forget escape characters are represented by "\\".
+ ///
+ /// @return the pattern represented by this ignore info
+ ////
+ public String getPattern();
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug53276/TestB.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug53276/TestB.java
new file mode 100644
index 00000000000..2b6d0e71755
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug53276/TestB.java
@@ -0,0 +1,23 @@
+package javadoc.testBug53276;
+
+///
+/// Handles a "Removed" response from the CVS server.
+///
+/// Suppose as a result of performing a command the CVS server responds
+/// as follows:
+///
+/// [...]
+/// Removed ??? \n
+/// [...]
+///
+/// Then
+///
+///
+
+///
+/// It removes the file from both the entries of the parent-folder
+/// and from the local filesystem.
+///
+public class TestB {
+}
+
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug53276/TestC.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug53276/TestC.java
new file mode 100644
index 00000000000..b7e6c7487f4
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug53276/TestC.java
@@ -0,0 +1,12 @@
+package javadoc.testBug53276;
+public class TestC {
+
+ ///
+ /// Returns the progress monitor. It there is no progress monitor the monitor\
+ /// is set to the NullProgressMonitor
.
+ ///
+ /// @return the progress monitor
+ ///
+ public Object foo() { return null; }
+}
+
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug53757/Test.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug53757/Test.java
new file mode 100644
index 00000000000..fc3bf3afed1
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug53757/Test.java
@@ -0,0 +1,55 @@
+package javadoc.testBug53757;
+public class Test {
+ ///
+ /// Test all grammar keywords
+ /// @abstract = 60,
+ /// @assert = 71,
+ /// @boolean = 31,
+ /// @break = 72,
+ /// @byte = 32,
+ /// @case = 83,
+ /// @catch = 86,
+ /// @char = 33,
+ /// @class = 81,
+ /// @continue = 73,
+ /// @default = 84,
+ /// @do = 74,
+ /// @double = 34,
+ /// @else = 87,
+ /// @extends = 91,
+ /// @false = 44,
+ /// @final = 61,
+ /// @finally = 88,
+ /// @float = 35,
+ /// @for = 75,
+ /// @if = 76,
+ /// @implements = 103,
+ /// @import = 82,
+ /// @instanceof = 13,
+ /// @int = 36,
+ /// @interface = 89,
+ /// @long = 37,
+ /// @native = 62,
+ /// @new = 41,
+ /// @null = 45,
+ /// @package = 85,
+ /// @private = 63,
+ /// @protected = 64,
+ /// @public = 65,
+ /// @short = 38,
+ /// @static = 57,
+ /// @strictfp = 66,
+ /// @super = 42,
+ /// @switch = 78,
+ /// @synchronized = 55,
+ /// @this = 43,
+ /// @throw = 79,
+ /// @transient = 67,
+ /// @true = 46,
+ /// @try = 80,
+ /// @void = 39,
+ /// @volatile = 68,
+ /// @while = 70,
+ ///
+ void foo() {}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug54424/Test.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug54424/Test.java
new file mode 100644
index 00000000000..8ae30977f4e
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug54424/Test.java
@@ -0,0 +1,25 @@
+package javadoc.testBug54424;
+import java.io.IOException;
+import java.util.ArrayList;
+
+public class Test {
+ ///
+ /// @param
+ /// @param tho {@link getList(int, long)}
+ /// @version throwaway
+ /// @param from 1st param of {@link A#getList(int, long, boolean) me}
+ /// @see #getList(Object, java.util.AbstractList)
+ /// @param from 2nd
+ /// @see #getList(int from, tho long)
+ /// @see #getList(int from, long tho)
+ /// @param
+ /// @return the list
+ /// @see #getList(..)
+ /// @param to
+ /// @throws .IOException
+ /// @deprecated
+ /// @throws IOException.
+ /// @todo it
+ ///
+ public ArrayList getList(int from, long to) throws IOException {return null;}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug54776/Test.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug54776/Test.java
new file mode 100644
index 00000000000..dc3aee168b5
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug54776/Test.java
@@ -0,0 +1,9 @@
+package javadoc.testBug54776;
+public class Test {
+
+ private int field= /*]*/foo()/*[*/;
+
+ public int foo() {
+ return 1;
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug55221/a/Test.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug55221/a/Test.java
new file mode 100644
index 00000000000..ef3fe10d8a7
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug55221/a/Test.java
@@ -0,0 +1,18 @@
+package javadoc.testBug55221.a;
+public class Test {
+ public int bar() {
+ int x=0;
+ if (true) {
+ x=1;
+ } else {
+ x=2;
+ }
+ return x;
+ }
+ ///
+ /// This comment should not be attached to previous method body!
+ /// @return int
+ ///
+
+ public int foo() { return 1; }
+}
\ No newline at end of file
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug55221/b/Test.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug55221/b/Test.java
new file mode 100644
index 00000000000..e5ad2828ead
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug55221/b/Test.java
@@ -0,0 +1,17 @@
+package javadoc.testBug55221.b;
+public class Test {
+ public int bar() {
+ int x=0;
+ if (true) {
+ x=1;
+ } else {
+ x=2;
+ }
+ return x;
+ } ///
+ /// This comment should not be attached to previous method body!
+ /// @return int
+ ///
+
+ public int foo() { return 1; }
+}
\ No newline at end of file
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug55221/c/Test.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug55221/c/Test.java
new file mode 100644
index 00000000000..ff3e37b7298
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug55221/c/Test.java
@@ -0,0 +1,16 @@
+package javadoc.testBug55221.c;
+public class Test {
+ public int bar() {
+ int x=0;
+ if (true) {
+ x=1;
+ } else {
+ x=2;
+ }
+ return x;
+ } /*
+ * This comment should not be attached to previous method body!
+ * @return int
+ */
+ public int foo() { return 1; }
+}
\ No newline at end of file
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug55221/d/Test.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug55221/d/Test.java
new file mode 100644
index 00000000000..4b0c63817f7
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug55221/d/Test.java
@@ -0,0 +1,7 @@
+package javadoc.testBug55221.d;
+public class Test {
+ ///
+ /// Javadoc comment
+ ///// Line comment
+ boolean foo() { return false; }
+}
\ No newline at end of file
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug55223/TestA.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug55223/TestA.java
new file mode 100644
index 00000000000..0b1c78b1868
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug55223/TestA.java
@@ -0,0 +1,6 @@
+package javadoc.testBug55223;
+public class TestA {
+ private void foo() {
+ foo();/* a */ foo(); /* b */ foo();
+ }
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug55223/TestB.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug55223/TestB.java
new file mode 100644
index 00000000000..ee7f9829c6a
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug55223/TestB.java
@@ -0,0 +1,10 @@
+package javadoc.testBug55223;
+public class TestB {
+ ///
+ /// Returns all of the filter elements of this shortcut as a List of String Pairs.
+ ///
+ /// @return all of the filter elements of this shortcut, or null
if not
+ /// specified
+ ///
+ public /* */ Object getFilters() { return null; }
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug63044/Test.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug63044/Test.java
new file mode 100644
index 00000000000..723d8862ebd
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug63044/Test.java
@@ -0,0 +1,11 @@
+package javadoc.testBug63044;
+///
+/// @see #Test()
+/// @see Test#Test()
+/// @see javadoc.testBug63044.Test#Test()
+///
+public class Test{
+ Test( ){
+ new Test();
+ };
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug65174/Test.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug65174/Test.java
new file mode 100644
index 00000000000..ab39abc637f
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug65174/Test.java
@@ -0,0 +1,39 @@
+package javadoc.testBug65174;
+public class Test {
+ ///
+ /// Comment with no error: {@link
+ /// Object valid} because it's not on first line
+ ////
+ void foo_ok() {}
+ /// Comment previously with error: {@link
+ /// Object valid} because tag is on comment very first line
+ ////
+ void foo_ko() {}
+ ///
+ /// Comment with no error: {@link
+ /// Object valid} because it's not on first line
+ ////
+ void fooA_ok() {}
+ /// Comment previously with error: {@link
+ /// Object valid} because tag is on comment very first line
+ ////
+ void fooA_ko() {}
+ ///
+ /// Comment with no error: {@link java.lang.
+ /// Object valid} because it's not on first line
+ ////
+ void fooB_ok() {}
+ /// Comment previously with error: {@link java.lang.
+ /// Object valid} because tag is on comment very first line
+ ////
+ void fooB_ko() {}
+ ///
+ /// Comment with no error: {@link Object
+ /// valid} because it's not on first line
+ ////
+ void fooC_ok() {}
+ /// Comment previously with error: {@link Object
+ /// valid} because tag is on comment very first line
+ ////
+ void fooC_ko() {}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug65253/Test.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug65253/Test.java
new file mode 100644
index 00000000000..4581a56187c
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug65253/Test.java
@@ -0,0 +1,15 @@
+package javadoc.testBug65253;
+///
+/// Comment
+/// @@@@see Unknown Should not complain on ref
+///
+public class Test {
+ ///
+ /// Comment
+ /// @@@param xxx Should not complain on param
+ /// @@return int Should not be '@return' tag element
+ ///
+ int foo() { // should warn on missing tag for return type
+ return 0;
+ }
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug65253/TestD.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug65253/TestD.java
new file mode 100644
index 00000000000..e950eb1efc9
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug65253/TestD.java
@@ -0,0 +1,21 @@
+package javadoc.testBug65253;
+public class TestD {
+ /// Comment previously with no error: {@link Object valid} comment on one line
+ void foo1() {}
+ /// Comment previously with no error: {@link Object valid}
+ void foo2() {}
+ /// Comment previously with no error: {@link Object valid}
+ void foo3() {}
+ /// {@link Object valid} comment on one line
+ void foo4() {}
+ ///{@link Object valid} comment on one line
+ void foo5() {}
+ /// {@link Object valid}
+ void foo6() {}
+ ///{@link Object valid}
+ void foo7() {}
+ /// {@link Object valid}
+ void foo8() {}
+ ///{@link Object valid}
+ void foo9() {}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug65288/Test.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug65288/Test.java
new file mode 100644
index 00000000000..d7d1ac06de1
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug65288/Test.java
@@ -0,0 +1,7 @@
+package javadoc.testBug65288;
+///
+/// @see
+/// @see
+public class Test {
+
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68017/TestInvalid.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68017/TestInvalid.java
new file mode 100644
index 00000000000..ba3bd02e436
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68017/TestInvalid.java
@@ -0,0 +1,13 @@
+package javadoc.testBug68017;
+public class TestInvalid {
+ ///@return
+ public int foo1() {return 0; }
+ ///@return
+ public int foo2() {return 0; }
+ ///@return
+ public int foo3() {return 0; }
+ ///
+ /// @return
+ ///
+ public int foo4() {return 0; }
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68017/TestValid.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68017/TestValid.java
new file mode 100644
index 00000000000..f68e185fd9e
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68017/TestValid.java
@@ -0,0 +1,9 @@
+package javadoc.testBug68017;
+public class TestValid {
+ ///@return integer
+ public int foo1() {return 0; }
+ ///
+ /// @return #
+ ///
+ public int foo2() {return 0; }
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68017/TestWarn1.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68017/TestWarn1.java
new file mode 100644
index 00000000000..64b55f5b55f
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68017/TestWarn1.java
@@ -0,0 +1,8 @@
+package javadoc.testBug68017;
+public class TestWarn1 {
+ ///
+ // @return
+ public int foo1() {return 0; }
+ ///@return**
+ public int foo2() {return 0; }
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68017/TestWarn2.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68017/TestWarn2.java
new file mode 100644
index 00000000000..19dab1fe6bc
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68017/TestWarn2.java
@@ -0,0 +1,7 @@
+package javadoc.testBug68017;
+public class TestWarn2 {
+ ///
+ /// @return#
+ ///
+ public int foo() {return 0; }
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68025/TestA.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68025/TestA.java
new file mode 100644
index 00000000000..074e897bc47
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68025/TestA.java
@@ -0,0 +1,12 @@
+
+package javadoc.testBug68025;
+public class TestA {
+
+ ///
+ /// @see IJavaElement#getElementName#bug
+ /// or closer to the reality (COPY is a constant):
+ /// @see org.eclipse.ui.actions.ActionFactory#COPY#getId
+ ////
+ void foo() {
+ }
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68025/TestB.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68025/TestB.java
new file mode 100644
index 00000000000..021bc9594a0
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68025/TestB.java
@@ -0,0 +1,17 @@
+package javadoc.testBug68025;
+public class TestB {
+ public int field;
+ public void foo() {}
+ ///
+ /// @see #field#invalid
+ /// @see #foo#invalid
+ ///
+ public void foo1() {}
+ ///@see Y#field# invalid
+ public void foo2() {}
+ ///@see Y#foo# invalid
+ public void foo3() {}
+ ///@see Y#foo()#
+ ///valid*/
+ public void foo4() {}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68726/TestBug68726conform1.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68726/TestBug68726conform1.java
new file mode 100644
index 00000000000..1eb3559d2b5
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68726/TestBug68726conform1.java
@@ -0,0 +1,9 @@
+package javadoc.testBug68726;
+public class TestBug68726conform1 {
+ ///
+ /// @see Object Eclipse
+ ///
+ void foo1() {}
+ ///@see Object Eclipse
+ void foo2() {}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68726/TestBug68726conform2.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68726/TestBug68726conform2.java
new file mode 100644
index 00000000000..3fcff633f2c
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68726/TestBug68726conform2.java
@@ -0,0 +1,20 @@
+package javadoc.testBug68726;
+///
+ /// @see IBM Home Page
+ /// @see
+ /// IBM Home Page
+ /// @see
+ /// IBM Home Page
+ ///
+ /// @see
+ ///
+ /// IBM
+ ///
+ /// Home Page
+ ///
+ ///
+ ///
+ /// @see Object
+ ///
+public class TestBug68726conform2 {
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68726/TestBug68726negative1.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68726/TestBug68726negative1.java
new file mode 100644
index 00000000000..5ee058ae4fa
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68726/TestBug68726negative1.java
@@ -0,0 +1,21 @@
+package javadoc.testBug68726;
+public class TestBug68726negative1 {
+ ///
+ /// Invalid URL link references
+ ///
+ /// @see
+ /// @see
+ /// @see invalid
+ /// @see invalid<
+ /// @see invalid
+ /// @see invalidinvalid no text allowed after the href
+ ///
+ public void s_foo() {
+ }
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68726/TestBug68726negative2.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68726/TestBug68726negative2.java
new file mode 100644
index 00000000000..e013c8f47d7
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug68726/TestBug68726negative2.java
@@ -0,0 +1,20 @@
+package javadoc.testBug68726;
+///
+ /// @see IBM Home Page
+ /// @see
+ /// IBM Home Page
+ /// @see
+ /// IBM Home Page<
+ /// /a>
+ /// @see
+ ///
+ /// IBM
+ ///
+ /// Home Page
+ ///
+ ///
+ ///
+ /// @see Unknown Unknown reference
+ ///
+public class TestBug68726negative2 {
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69272/TestClassInvalid.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69272/TestClassInvalid.java
new file mode 100644
index 00000000000..6fbe7aae66e
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69272/TestClassInvalid.java
@@ -0,0 +1,10 @@
+package javadoc.testBug69272;
+public class TestClassInvalid {
+ ///@see Object*
+ public void foo1() {}
+ ///@see Object***
+ public void foo2() {}
+ ///@see Object***
+ ///
+ public void foo3() {}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69272/TestClassValid.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69272/TestClassValid.java
new file mode 100644
index 00000000000..5718e6d1e20
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69272/TestClassValid.java
@@ -0,0 +1,14 @@
+package javadoc.testBug69272;
+public class TestClassValid {
+ /**@see Object*/
+ public void foo1() {}
+ /**@see Object
+ */
+ public void foo2() {}
+ /**@see Object */
+ public void foo3() {}
+ /**@see Object****/
+ public void foo4() {}
+ /**@see Object ****/
+ public void foo5() {}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69272/TestFieldInvalid.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69272/TestFieldInvalid.java
new file mode 100644
index 00000000000..34c96bd31ed
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69272/TestFieldInvalid.java
@@ -0,0 +1,11 @@
+package javadoc.testBug69272;
+public class TestFieldInvalid {
+ int field;
+ /**@see #field* */
+ public void foo1() {}
+ /**@see #field*** ***/
+ public void foo2() {}
+ /**@see #field***
+ */
+ public void foo3() {}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69272/TestFieldValid.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69272/TestFieldValid.java
new file mode 100644
index 00000000000..4cb069443ab
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69272/TestFieldValid.java
@@ -0,0 +1,15 @@
+package javadoc.testBug69272;
+public class TestFieldValid {
+ int field;
+ /**@see #field*/
+ public void foo1() {}
+ /**@see #field
+ */
+ public void foo2() {}
+ /**@see #field */
+ public void foo3() {}
+ /**@see #field****/
+ public void foo4() {}
+ /**@see #field ********/
+ public void foo5() {}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69272/TestMethInvalid.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69272/TestMethInvalid.java
new file mode 100644
index 00000000000..d3c2e566ff4
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69272/TestMethInvalid.java
@@ -0,0 +1,10 @@
+package javadoc.testBug69272;
+public class TestMethInvalid {
+ /**@see Object#wait()* */
+ public void foo1() {}
+ /**@see Object#wait()*** ***/
+ public void foo2() {}
+ /**@see Object#wait()***
+ */
+ public void foo3() {}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69272/TestMethValid.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69272/TestMethValid.java
new file mode 100644
index 00000000000..bff08700c37
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69272/TestMethValid.java
@@ -0,0 +1,14 @@
+package javadoc.testBug69272;
+public class TestMethValid {
+ /**@see Object#wait()*/
+ public void foo1() {}
+ /**@see Object#wait()
+ */
+ public void foo2() {}
+ /**@see Object#wait() */
+ public void foo3() {}
+ /**@see Object#wait()****/
+ public void foo4() {}
+ /**@see Object#wait() ****/
+ public void foo5() {}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69275/TestA.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69275/TestA.java
new file mode 100644
index 00000000000..c55a0a2546a
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69275/TestA.java
@@ -0,0 +1,14 @@
+package javadoc.testBug69275;
+public class TestA {
+ /**@see text*/
+ void foo1() {}
+ /**@see text
+ */
+ void foo2() {}
+ /**@see text */
+ void foo3() {}
+ /**@see text**/
+ void foo4() {}
+ /**@see text *****/
+ void foo5() {}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69275/TestB.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69275/TestB.java
new file mode 100644
index 00000000000..7abe307959f
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69275/TestB.java
@@ -0,0 +1,10 @@
+package javadoc.testBug69275;
+public class TestA {
+ /**@see text* */
+ void foo1() {}
+ /**@see text *** **/
+ void foo2() {}
+ /**@see text***
+ */
+ void foo3() {}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69302/TestInvalid.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69302/TestInvalid.java
new file mode 100644
index 00000000000..7a6dbcabcc4
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69302/TestInvalid.java
@@ -0,0 +1,7 @@
+package javadoc.testBug69302;
+public class TestInvalid {
+ /**@see Unknown Unknown reference text*/
+ void foo1() {}
+ /**@see Unknown Unknown reference "Valid string reference"*/
+ void foo2() {}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69302/TestValid1.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69302/TestValid1.java
new file mode 100644
index 00000000000..402bcff550a
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69302/TestValid1.java
@@ -0,0 +1,12 @@
+package javadoc.testBug69302;
+public class TestValid1 {
+ /**
+ * @see Object Eclipse
+ */
+ void foo1() {}
+ /**
+ * @see Object "Valid string reference"
+ */
+ void foo2() {}
+
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69302/TestValid2.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69302/TestValid2.java
new file mode 100644
index 00000000000..31c92c478ae
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug69302/TestValid2.java
@@ -0,0 +1,11 @@
+package javadoc.testBug69302;
+public class TestValid2 {
+ /**
+ * @see Unknown Unknown
+ */
+ void foo1() {}
+ /**
+ * @see Unknown "Valid Unknown reference"
+ */
+ void foo2() {}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug70892/TestInvalid1.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug70892/TestInvalid1.java
new file mode 100644
index 00000000000..2610fd04eec
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug70892/TestInvalid1.java
@@ -0,0 +1,12 @@
+package javadoc.testBug70892;
+/**
+ * {@value "invalid"}
+ * {@value invalid} invalid
+ * {@value #field}
+ * {@value #foo}
+ * {@value #foo()}
+ */
+public class TestInvalid1 {
+ int field;
+ void foo() {}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug70892/TestInvalid2.java b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug70892/TestInvalid2.java
new file mode 100644
index 00000000000..345f6a27922
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_23/src/markdown/testBug70892/TestInvalid2.java
@@ -0,0 +1,12 @@
+package javadoc.testBug70892;
+/**
+ * {@value "invalid}
+ * {@value invalid just add the element
+ TagElement inlineTag = this.ast.newTagElement();
+ fragments.add(inlineTag);
+ previousTag = inlineTag;
+ } else {
+ // If last fragment is a tag, then use it as previous tag
+ ASTNode lastFragment = (ASTNode) fragments.get(size-1);
+ if (lastFragment.getNodeType() == ASTNode.TAG_ELEMENT) {
+ previousTag = (TagElement) lastFragment;
+ }
+ }
+ if (tEnd != -1) {
+ TextElement text = this.ast.newTextElement();
+ text.setText(new String( this.source, tStart, tEnd-tStart));
+ text.setSourceRange(tStart, tEnd-tStart);
+ previousTag.fragments().add(0, text);
+ }
+ this.tagValue = NO_TAG_VALUE;
+ this.inlineTagStarted = false;
+ this.inlineTagStart = -1;
+ this.scanner.eofPosition = eofBkup;
+ break loop;
+ }
+ break;
+ case '\r':
+ case '\n':
+ return false;
+ default:
+ break;
+ }
+ currentChar = readChar();
+ }
+ return valid;
}
@Override