mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-29 20:05:35 +02:00
Bug 515024: Fold adjacent single line doc comment
When the doxygen tool is on, adjacent single line doc comments were not being folded together. Change-Id: I88542047cba6c6d400a0b74a2637679cd122a920
This commit is contained in:
parent
c1d086cba3
commit
f5aa2f3d65
2 changed files with 85 additions and 9 deletions
|
@ -19,9 +19,7 @@ import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import junit.framework.Test;
|
import org.eclipse.core.resources.IFile;
|
||||||
import junit.framework.TestSuite;
|
|
||||||
|
|
||||||
import org.eclipse.core.runtime.Path;
|
import org.eclipse.core.runtime.Path;
|
||||||
import org.eclipse.jface.preference.IPreferenceStore;
|
import org.eclipse.jface.preference.IPreferenceStore;
|
||||||
import org.eclipse.jface.text.BadLocationException;
|
import org.eclipse.jface.text.BadLocationException;
|
||||||
|
@ -32,6 +30,7 @@ import org.eclipse.jface.text.source.Annotation;
|
||||||
import org.eclipse.jface.text.source.SourceViewer;
|
import org.eclipse.jface.text.source.SourceViewer;
|
||||||
import org.eclipse.jface.text.source.projection.IProjectionPosition;
|
import org.eclipse.jface.text.source.projection.IProjectionPosition;
|
||||||
import org.eclipse.jface.text.source.projection.ProjectionAnnotationModel;
|
import org.eclipse.jface.text.source.projection.ProjectionAnnotationModel;
|
||||||
|
import org.eclipse.ui.PartInitException;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.model.ICProject;
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
import org.eclipse.cdt.core.testplugin.CProjectHelper;
|
import org.eclipse.cdt.core.testplugin.CProjectHelper;
|
||||||
|
@ -41,10 +40,16 @@ import org.eclipse.cdt.ui.PreferenceConstants;
|
||||||
import org.eclipse.cdt.ui.testplugin.EditorTestHelper;
|
import org.eclipse.cdt.ui.testplugin.EditorTestHelper;
|
||||||
import org.eclipse.cdt.ui.testplugin.ResourceTestHelper;
|
import org.eclipse.cdt.ui.testplugin.ResourceTestHelper;
|
||||||
import org.eclipse.cdt.ui.tests.BaseUITestCase;
|
import org.eclipse.cdt.ui.tests.BaseUITestCase;
|
||||||
|
import org.eclipse.cdt.ui.text.doctools.IDocCommentOwner;
|
||||||
|
|
||||||
import org.eclipse.cdt.internal.ui.editor.CEditor;
|
import org.eclipse.cdt.internal.ui.editor.CEditor;
|
||||||
|
import org.eclipse.cdt.internal.ui.text.doctools.DocCommentOwnerManager;
|
||||||
|
import org.eclipse.cdt.internal.ui.text.doctools.NullDocCommentOwner;
|
||||||
import org.eclipse.cdt.internal.ui.text.folding.DefaultCFoldingStructureProvider.CProjectionAnnotation;
|
import org.eclipse.cdt.internal.ui.text.folding.DefaultCFoldingStructureProvider.CProjectionAnnotation;
|
||||||
|
|
||||||
|
import junit.framework.Test;
|
||||||
|
import junit.framework.TestSuite;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Code folding tests.
|
* Code folding tests.
|
||||||
*/
|
*/
|
||||||
|
@ -75,6 +80,7 @@ public class FoldingTest extends BaseUITestCase {
|
||||||
private CEditor fEditor;
|
private CEditor fEditor;
|
||||||
|
|
||||||
private SourceViewer fSourceViewer;
|
private SourceViewer fSourceViewer;
|
||||||
|
private IFile fFileUnderTest;
|
||||||
|
|
||||||
public static Test suite() {
|
public static Test suite() {
|
||||||
return new TestSuite(FoldingTest.class);
|
return new TestSuite(FoldingTest.class);
|
||||||
|
@ -91,7 +97,7 @@ public class FoldingTest extends BaseUITestCase {
|
||||||
fCProject= EditorTestHelper.createCProject(PROJECT, LINKED_FOLDER);
|
fCProject= EditorTestHelper.createCProject(PROJECT, LINKED_FOLDER);
|
||||||
|
|
||||||
StringBuilder[] contents = getContentsForTest(1);
|
StringBuilder[] contents = getContentsForTest(1);
|
||||||
assert contents.length == 1;
|
assertEquals("test requires exactly one test block", 1, contents.length);
|
||||||
String code = contents[0].toString();
|
String code = contents[0].toString();
|
||||||
String filename;
|
String filename;
|
||||||
if (code.trim().isEmpty()) {
|
if (code.trim().isEmpty()) {
|
||||||
|
@ -107,15 +113,24 @@ public class FoldingTest extends BaseUITestCase {
|
||||||
store.setValue(PreferenceConstants.EDITOR_FOLDING_PREPROCESSOR_BRANCHES_ENABLED, true);
|
store.setValue(PreferenceConstants.EDITOR_FOLDING_PREPROCESSOR_BRANCHES_ENABLED, true);
|
||||||
store.setValue(PreferenceConstants.EDITOR_FOLDING_INACTIVE_CODE, false);
|
store.setValue(PreferenceConstants.EDITOR_FOLDING_INACTIVE_CODE, false);
|
||||||
store.setValue(PreferenceConstants.EDITOR_FOLDING_HEADERS, false);
|
store.setValue(PreferenceConstants.EDITOR_FOLDING_HEADERS, false);
|
||||||
|
fFileUnderTest = ResourceTestHelper.findFile(filename);
|
||||||
|
|
||||||
fEditor= (CEditor) EditorTestHelper.openInEditor(ResourceTestHelper.findFile(filename), true);
|
openEditor();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void openEditor() throws PartInitException {
|
||||||
|
fEditor= (CEditor) EditorTestHelper.openInEditor(fFileUnderTest, true);
|
||||||
fSourceViewer= EditorTestHelper.getSourceViewer(fEditor);
|
fSourceViewer= EditorTestHelper.getSourceViewer(fEditor);
|
||||||
assertTrue(EditorTestHelper.joinReconciler(fSourceViewer, 0, 10000, 300));
|
assertTrue(EditorTestHelper.joinReconciler(fSourceViewer, 0, 10000, 300));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void closeEditor() {
|
||||||
|
EditorTestHelper.closeEditor(fEditor);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void tearDown () throws Exception {
|
protected void tearDown () throws Exception {
|
||||||
EditorTestHelper.closeEditor(fEditor);
|
closeEditor();
|
||||||
|
|
||||||
if (fCProject != null)
|
if (fCProject != null)
|
||||||
CProjectHelper.delete(fCProject);
|
CProjectHelper.delete(fCProject);
|
||||||
|
@ -127,9 +142,34 @@ public class FoldingTest extends BaseUITestCase {
|
||||||
store.setToDefault(PreferenceConstants.EDITOR_FOLDING_INACTIVE_CODE);
|
store.setToDefault(PreferenceConstants.EDITOR_FOLDING_INACTIVE_CODE);
|
||||||
store.setToDefault(PreferenceConstants.EDITOR_FOLDING_HEADERS);
|
store.setToDefault(PreferenceConstants.EDITOR_FOLDING_HEADERS);
|
||||||
|
|
||||||
|
// Set doctool to none.
|
||||||
|
DocCommentOwnerManager.getInstance().setWorkspaceCommentOwner(NullDocCommentOwner.INSTANCE);
|
||||||
|
|
||||||
super.tearDown();
|
super.tearDown();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setDoctoolToDoxygen() throws PartInitException {
|
||||||
|
// When the workspace comment owner changes, all open editors are
|
||||||
|
// re-opened asynchronously, within the test that async is a problem
|
||||||
|
// because we lose the handle and have no real condition to wait on.
|
||||||
|
// Instead close and reopen editor within this method.
|
||||||
|
closeEditor();
|
||||||
|
|
||||||
|
// Set doctool to doxygen.
|
||||||
|
IDocCommentOwner[] registeredOwners = DocCommentOwnerManager.getInstance().getRegisteredOwners();
|
||||||
|
IDocCommentOwner doxygenOwner = null;
|
||||||
|
for (IDocCommentOwner owner : registeredOwners) {
|
||||||
|
if (owner.getID().contains("doxygen")) {
|
||||||
|
assertNull("More than one owner looks like doxygen", doxygenOwner);
|
||||||
|
doxygenOwner = owner;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DocCommentOwnerManager.getInstance().setWorkspaceCommentOwner(doxygenOwner);
|
||||||
|
|
||||||
|
// see comment above closeEditor call above.
|
||||||
|
openEditor();
|
||||||
|
}
|
||||||
|
|
||||||
protected void assertEqualPositions(Position[] expected, Position[] actual) throws BadLocationException {
|
protected void assertEqualPositions(Position[] expected, Position[] actual) throws BadLocationException {
|
||||||
assertEquals(expected.length, actual.length);
|
assertEquals(expected.length, actual.length);
|
||||||
IDocument document= fSourceViewer.getDocument();
|
IDocument document= fSourceViewer.getDocument();
|
||||||
|
@ -371,4 +411,40 @@ public class FoldingTest extends BaseUITestCase {
|
||||||
public void testIdenticalStatements_507138() throws BadLocationException {
|
public void testIdenticalStatements_507138() throws BadLocationException {
|
||||||
assertNoKeyCollisions();
|
assertNoKeyCollisions();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///*
|
||||||
|
// * Header comment
|
||||||
|
// */
|
||||||
|
//
|
||||||
|
//// non-doc multiline
|
||||||
|
//// line 2
|
||||||
|
//void func1() {}
|
||||||
|
//
|
||||||
|
///// doc multiline
|
||||||
|
///// line 2
|
||||||
|
//void func2() {}
|
||||||
|
//
|
||||||
|
////
|
||||||
|
//// non-doc multiline (with blank first line)
|
||||||
|
//// line 3
|
||||||
|
//void func3() {}
|
||||||
|
//
|
||||||
|
/////
|
||||||
|
///// doc multiline (with blank first line)
|
||||||
|
///// line 3
|
||||||
|
//void func4() {}
|
||||||
|
public void testCollapseAdjacentSingleLineDocComments() throws Exception {
|
||||||
|
setDoctoolToDoxygen();
|
||||||
|
|
||||||
|
Position[] actual= getFoldingPositions();
|
||||||
|
Position[] expected= new Position[] {
|
||||||
|
createPosition(0, 2, 1),
|
||||||
|
createPosition(4, 5),
|
||||||
|
createPosition(8, 9),
|
||||||
|
createPosition(12, 14, 13),
|
||||||
|
createPosition(17, 19, 18),
|
||||||
|
};
|
||||||
|
assertEquals(toString(expected), toString(actual));
|
||||||
|
assertEqualPositions(expected, actual);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1530,7 +1530,7 @@ public class DefaultCFoldingStructureProvider implements ICFoldingStructureProvi
|
||||||
singleLine= true;
|
singleLine= true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
singleLine= ICPartitions.C_SINGLE_LINE_COMMENT.equals(partition.getType());
|
singleLine= ICPartitions.C_SINGLE_LINE_COMMENT.equals(partition.getType()) || ICPartitions.C_SINGLE_LINE_DOC_COMMENT.equals(partition.getType());
|
||||||
}
|
}
|
||||||
if (singleLine) {
|
if (singleLine) {
|
||||||
// if comment starts at column 0 and spans only one line
|
// if comment starts at column 0 and spans only one line
|
||||||
|
|
Loading…
Add table
Reference in a new issue