/*
* xtc - The eXTensible Compiler
* Copyright (C) 2004-2006 Robert Grimm
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*/
package xtc.tree;
import java.util.ArrayList;
import java.util.List;
import xtc.util.Utilities;
/**
* A source code comment.
*
* @author Robert Grimm
* @version $Revision: 1.11 $
*/
public class Comment extends Annotation {
/** The kind of comment. */
public static enum Kind {
/** A single line. */ SINGLE_LINE,
/** Multiple lines. */ MULTIPLE_LINES,
/** Documentation. */ DOCUMENTATION
}
/** The kind. */
public Kind kind;
/** The actual text, one line per list entry. */
public List<String> text;
/**
* Create a new comment.
*
* @param kind The kind.
* @param text The text.
*/
public Comment(Kind kind, List<String> text) {
this(kind, text, null);
}
/**
* Create a new comment.
*
* @param kind The kind.
* @param text The text.
* @param node The node.
*/
public Comment(Kind kind, List<String> text, Node node) {
super(node);
this.kind = kind;
this.text = text;
}
public int hashCode() {
return text.hashCode();
}
public boolean equals(Object o) {
if (this == o) return true;
if (! (o instanceof Comment)) return false;
Comment other = (Comment)o;
if (kind != other.kind) return false;
if (! text.equals(other.text)) return false;
if (null == node) return (null == other.node);
return node.equals(other.node);
}
/**
* Create a new code documentation comment. If the specified text
* is <code>null</code>, it is passed through.
*
* @param s The text of the comment, including start and end markers.
* @return The comment.
*/
public static Comment documentation(String s) {
// Make sure we have something to work with.
if (null == s) {
return null;
} else if (4 > s.length()) {
throw new IllegalArgumentException("Invalid documentation comment");
}
// Split the text.
s = s.substring(3, s.length() - 2);
String[] ss = Utilities.COMMENT_NEWLINE.split(s);
// Trim the first and last line.
if (0 < ss.length) {
ss[0] = ss[0].trim();
if (1 != ss.length) {
ss[ss.length - 1] = ss[ss.length - 1].trim();
}
}
// Find empty lines at beginning and end.
int start = ss.length;
int end = ss.length - 1;
for (int i=0; i<ss.length; i++) {
if (! "".equals(ss[i])) {
start = i;
break;
}
}
for (int i=ss.length-1; i>=0; i--) {
if (! "".equals(ss[i])) {
end = i;
break;
}
}
// Create a new list without any leading or trailing empty lines.
List<String> l = new ArrayList<String>(end - start + 1);
for (int i=start; i<=end; i++) {
l.add(ss[i]);
}
// Done.
return new Comment(Kind.DOCUMENTATION, l);
}
}