|
From: <caw...@us...> - 2007-06-21 17:21:23
|
Revision: 2661
http://svn.sourceforge.net/rubyeclipse/?rev=2661&view=rev
Author: cawilliams
Date: 2007-06-21 10:21:19 -0700 (Thu, 21 Jun 2007)
Log Message:
-----------
allow folding of comments that immediately preced the definition of a type or method
Modified Paths:
--------------
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/core/util/RDocUtil.java
trunk/org.rubypeople.rdt.ui/src/org/rubypeople/rdt/internal/ui/text/folding/DefaultRubyFoldingStructureProvider.java
Modified: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/core/util/RDocUtil.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/core/util/RDocUtil.java 2007-06-21 16:45:35 UTC (rev 2660)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/core/util/RDocUtil.java 2007-06-21 17:21:19 UTC (rev 2661)
@@ -7,6 +7,8 @@
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.Region;
import org.jruby.Ruby;
import org.jruby.ast.CommentNode;
import org.jruby.exceptions.RaiseException;
@@ -178,4 +180,41 @@
}
return fgRdocScriptPath;
}
+
+ public static IRegion getDocumentationRegion(IRubyElement element) {
+ IMember member = (IMember) element;
+ String src = "";
+ int elementOffset = -1;
+ try {
+ src = member.getRubyScript().getSource();
+ elementOffset = member.getSourceRange().getOffset();
+ } catch (RubyModelException e) {
+ return null;
+ }
+ RubyParser parser = new RubyParser();
+ parser.parse(src); // parse so we can grab the comment nodes
+ Collection<CommentNode> comments = parser.getComments();
+ if (member.isType(IRubyElement.TYPE) || member.isType(IRubyElement.METHOD)) {
+ return getPrecedingCommentRegion(comments, elementOffset, src);
+ }
+ return null;
+ }
+
+ private static IRegion getPrecedingCommentRegion(Collection<CommentNode> comments, int elementStart, String src) {
+ for (CommentNode comment : comments) {
+ ISourcePosition pos = comment.getPosition();
+ if (pos.getEndOffset() > elementStart) continue;
+ String between = src.substring(pos.getEndOffset(), elementStart);
+ if (between.trim().length() > 0)
+ continue; // if there's anything but whitespace between (\n\r\t ), move to next comment
+ IRegion preceding = getPrecedingCommentRegion(comments, pos.getStartOffset(), src);
+ if (preceding == null) {
+ preceding = new Region(pos.getStartOffset(), pos.getEndOffset() - pos.getStartOffset());
+ } else {
+ preceding = new Region(preceding.getOffset(), pos.getEndOffset() - preceding.getOffset());
+ }
+ return preceding;
+ }
+ return null;
+ }
}
Modified: trunk/org.rubypeople.rdt.ui/src/org/rubypeople/rdt/internal/ui/text/folding/DefaultRubyFoldingStructureProvider.java
===================================================================
--- trunk/org.rubypeople.rdt.ui/src/org/rubypeople/rdt/internal/ui/text/folding/DefaultRubyFoldingStructureProvider.java 2007-06-21 16:45:35 UTC (rev 2660)
+++ trunk/org.rubypeople.rdt.ui/src/org/rubypeople/rdt/internal/ui/text/folding/DefaultRubyFoldingStructureProvider.java 2007-06-21 17:21:19 UTC (rev 2661)
@@ -44,6 +44,7 @@
import org.rubypeople.rdt.core.IType;
import org.rubypeople.rdt.core.RubyCore;
import org.rubypeople.rdt.core.RubyModelException;
+import org.rubypeople.rdt.core.util.RDocUtil;
import org.rubypeople.rdt.internal.ui.RubyPlugin;
import org.rubypeople.rdt.internal.ui.rubyeditor.RubyAbstractEditor;
import org.rubypeople.rdt.internal.ui.rubyeditor.RubyEditor;
@@ -246,7 +247,10 @@
List regions = new ArrayList();
int shift = range.getOffset();
int start = shift;
-
+
+ IRegion region = RDocUtil.getDocumentationRegion(element);
+ if (region != null)
+ regions.add(region);
regions.add(new Region(start, range.getOffset() + range.getLength() - start));
if (regions.size() > 0) {
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|