Refactored the comment manager class to having a file contents class. This
class has the file name, lines and comments.
This commit is contained in:
parent
dcf0d774fa
commit
7af9e82fc1
|
|
@ -24,6 +24,7 @@ import com.puppycrawl.tools.checkstyle.api.DetailAST;
|
|||
import com.puppycrawl.tools.checkstyle.api.LocalizedMessage;
|
||||
import com.puppycrawl.tools.checkstyle.api.LocalizedMessages;
|
||||
import com.puppycrawl.tools.checkstyle.api.Utils;
|
||||
import com.puppycrawl.tools.checkstyle.api.FileContents;
|
||||
import org.apache.regexp.RESyntaxException;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
|
|
@ -414,10 +415,9 @@ public class Checker
|
|||
try {
|
||||
fireFileStarted(stripped);
|
||||
final String[] lines = Utils.getLines(aFileName);
|
||||
final CommentManager cmgr = new CommentManager(lines);
|
||||
DetailAST rootAST = parse(lines, aFileName, cmgr);
|
||||
// ParseTreeInfoPanel.show(rootAST);
|
||||
mWalker.walk(rootAST, lines, aFileName);
|
||||
final FileContents contents = new FileContents(aFileName, lines);
|
||||
final DetailAST rootAST = parse(contents);
|
||||
mWalker.walk(rootAST, contents);
|
||||
}
|
||||
catch (FileNotFoundException fnfe) {
|
||||
mMessages.add(new LocalizedMessage(0, Defn.CHECKSTYLE_BUNDLE,
|
||||
|
|
@ -453,30 +453,27 @@ public class Checker
|
|||
|
||||
/**
|
||||
*
|
||||
* @param aLines the individual lines of the java file
|
||||
* @param aFileName the filename of the file (used for error messages?)
|
||||
* @param aCmgr the comment manager is informed of comments during parsing
|
||||
* @param aContents contains the contents of the file
|
||||
* @return the root of the AST
|
||||
* @throws TokenStreamException if lexing failed
|
||||
* @throws RecognitionException if parsing failed
|
||||
*/
|
||||
public static DetailAST parse(
|
||||
final String[] aLines, String aFileName, final CommentManager aCmgr)
|
||||
throws TokenStreamException, RecognitionException
|
||||
public static DetailAST parse(FileContents aContents)
|
||||
throws TokenStreamException, RecognitionException
|
||||
{
|
||||
DetailAST rootAST;
|
||||
try {
|
||||
// try the 1.4 grammar first, this will succeed for
|
||||
// all code that compiles without any warnings in JDK 1.4,
|
||||
// that should cover most cases
|
||||
final Reader sar = new StringArrayReader(aLines);
|
||||
final Reader sar = new StringArrayReader(aContents.getLines());
|
||||
final Java14Lexer jl = new Java14Lexer(sar);
|
||||
jl.setFilename(aFileName);
|
||||
jl.setCommentManager(aCmgr);
|
||||
jl.setFilename(aContents.getFilename());
|
||||
jl.setFileContents(aContents);
|
||||
|
||||
final Java14Recognizer jr =
|
||||
new NEWSilentJava14Recognizer(jl);
|
||||
jr.setFilename(aFileName);
|
||||
jr.setFilename(aContents.getFilename());
|
||||
jr.setASTNodeClass(DetailAST.class.getName());
|
||||
jr.compilationUnit();
|
||||
rootAST = (DetailAST) jr.getAST();
|
||||
|
|
@ -488,13 +485,13 @@ public class Checker
|
|||
// and not as a keyword
|
||||
|
||||
// Arghh - the pain - duplicate code!
|
||||
final Reader sar = new StringArrayReader(aLines);
|
||||
final Reader sar = new StringArrayReader(aContents.getLines());
|
||||
final JavaLexer jl = new JavaLexer(sar);
|
||||
jl.setFilename(aFileName);
|
||||
jl.setCommentManager(aCmgr);
|
||||
jl.setFilename(aContents.getFilename());
|
||||
jl.setFileContents(aContents);
|
||||
|
||||
final JavaRecognizer jr = new JavaRecognizer(jl);
|
||||
jr.setFilename(aFileName);
|
||||
jr.setFilename(aContents.getFilename());
|
||||
jr.setASTNodeClass(DetailAST.class.getName());
|
||||
jr.compilationUnit();
|
||||
rootAST = (DetailAST) jr.getAST();
|
||||
|
|
|
|||
|
|
@ -61,27 +61,27 @@ public final class Scope implements Comparable, Serializable
|
|||
private static final String SCOPENAME_ANONINNER = "anoninner";
|
||||
|
||||
/** nothing scope */
|
||||
static final Scope NOTHING =
|
||||
public static final Scope NOTHING =
|
||||
new Scope(SCOPECODE_NOTHING, SCOPENAME_NOTHING);
|
||||
|
||||
/** public scope */
|
||||
static final Scope PUBLIC =
|
||||
public static final Scope PUBLIC =
|
||||
new Scope(SCOPECODE_PUBLIC, SCOPENAME_PUBLIC);
|
||||
|
||||
/** protected scope */
|
||||
static final Scope PROTECTED =
|
||||
public static final Scope PROTECTED =
|
||||
new Scope(SCOPECODE_PROTECTED, SCOPENAME_PROTECTED);
|
||||
|
||||
/** package scope */
|
||||
static final Scope PACKAGE =
|
||||
public static final Scope PACKAGE =
|
||||
new Scope(SCOPECODE_PACKAGE, SCOPENAME_PACKAGE);
|
||||
|
||||
/** private scope */
|
||||
static final Scope PRIVATE =
|
||||
public static final Scope PRIVATE =
|
||||
new Scope(SCOPECODE_PRIVATE, SCOPENAME_PRIVATE);
|
||||
|
||||
/** anon inner scope */
|
||||
static final Scope ANONINNER =
|
||||
public static final Scope ANONINNER =
|
||||
new Scope(SCOPECODE_ANONINNER, SCOPENAME_ANONINNER);
|
||||
|
||||
/** map from scope names to the respective Scope */
|
||||
|
|
@ -112,7 +112,7 @@ public final class Scope implements Comparable, Serializable
|
|||
/**
|
||||
* @return the name of this scope.
|
||||
*/
|
||||
String getName()
|
||||
public String getName()
|
||||
{
|
||||
return mName;
|
||||
}
|
||||
|
|
@ -133,7 +133,7 @@ public final class Scope implements Comparable, Serializable
|
|||
* @param aScope a <code>Scope</code> value
|
||||
* @return if <code>this</code> is a subscope of <code>aScope</code>.
|
||||
*/
|
||||
boolean isIn(Scope aScope)
|
||||
public boolean isIn(Scope aScope)
|
||||
{
|
||||
return (compareTo(aScope) <= 0);
|
||||
}
|
||||
|
|
@ -156,8 +156,9 @@ public final class Scope implements Comparable, Serializable
|
|||
* @param aScopeName scope name, such as "nothing", "public", etc.
|
||||
* @return the <code>Scope</code> associated with <code>aScopeName</code>
|
||||
*/
|
||||
static Scope getInstance(String aScopeName)
|
||||
public static Scope getInstance(String aScopeName)
|
||||
{
|
||||
// TODO: change scope....
|
||||
// canonicalize argument
|
||||
final String scopeName = aScopeName.trim().toLowerCase();
|
||||
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@ import com.puppycrawl.tools.checkstyle.api.Check;
|
|||
import com.puppycrawl.tools.checkstyle.api.DetailAST;
|
||||
import com.puppycrawl.tools.checkstyle.api.LocalizedMessages;
|
||||
import com.puppycrawl.tools.checkstyle.api.TokenTypes;
|
||||
import com.puppycrawl.tools.checkstyle.api.FileContents;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
|
@ -115,13 +116,12 @@ class TreeWalker
|
|||
/**
|
||||
* Initiates the walk of an AST.
|
||||
* @param aAST the root AST
|
||||
* @param aLines the lines of the file the AST was generated from
|
||||
* @param aFilename the file name of the file the AST was generated from
|
||||
* @param aContents the contents of the file the AST was generated from
|
||||
*/
|
||||
void walk(DetailAST aAST, String[] aLines, String aFilename)
|
||||
void walk(DetailAST aAST, FileContents aContents)
|
||||
{
|
||||
mMessages.reset();
|
||||
notifyBegin(aLines, aFilename);
|
||||
notifyBegin(aContents);
|
||||
aAST.setParent(null);
|
||||
process(aAST);
|
||||
notifyEnd();
|
||||
|
|
@ -129,10 +129,9 @@ class TreeWalker
|
|||
|
||||
/**
|
||||
* Notify interested checks that about to begin walking a tree.
|
||||
* @param aLines the lines of the file the AST was generated from
|
||||
* @param aFilename the file name of the file the AST was generated from
|
||||
* @param aContents the contents of the file the AST was generated from
|
||||
*/
|
||||
private void notifyBegin(String[] aLines, String aFilename)
|
||||
private void notifyBegin(FileContents aContents)
|
||||
{
|
||||
// TODO: do not track Context properly for token
|
||||
final Iterator it = mAllChecks.iterator();
|
||||
|
|
@ -140,8 +139,7 @@ class TreeWalker
|
|||
final Check check = (Check) it.next();
|
||||
final HashMap treeContext = new HashMap();
|
||||
check.setTreeContext(treeContext);
|
||||
check.setFilename(aFilename);
|
||||
check.setLines(aLines);
|
||||
check.setFileContents(aContents);
|
||||
check.beginTree();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,10 +31,8 @@ public abstract class Check
|
|||
/** resuable constant for message formating */
|
||||
private static final Object[] EMPTY_OBJECT_ARRAY = new Object[0];
|
||||
|
||||
/** name to store lines under */
|
||||
private static final String LINES_ATTRIBUTE = "lines";
|
||||
/** name to store filename under */
|
||||
private static final String FILENAME_ATTRIBUTE = "filename";
|
||||
/** name to store file contents under */
|
||||
private static final String FILE_CONTENTS_ATTRIBUTE = "fILEcONTENTS";
|
||||
|
||||
/** the global context for the check */
|
||||
private Map mGlobalContext;
|
||||
|
|
@ -171,31 +169,31 @@ public abstract class Check
|
|||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the lines associated with the tree.
|
||||
* @param aLines the file contents
|
||||
*/
|
||||
public final void setLines(String[] aLines)
|
||||
{
|
||||
getTreeContext().put(LINES_ATTRIBUTE, aLines);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the lines associated with the tree.
|
||||
* @return the file contents
|
||||
*/
|
||||
public final String[] getLines()
|
||||
{
|
||||
return (String[]) getTreeContext().get(LINES_ATTRIBUTE);
|
||||
return getFileContents().getLines();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the name of the file associated with the tree.
|
||||
* @param aFilename the file name
|
||||
* Set the file contents associated with the tree.
|
||||
* @param aContents the manager
|
||||
*/
|
||||
public final void setFilename(String aFilename)
|
||||
public final void setFileContents(FileContents aContents)
|
||||
{
|
||||
getTreeContext().put(FILENAME_ATTRIBUTE, aFilename);
|
||||
getTreeContext().put(FILE_CONTENTS_ATTRIBUTE, aContents);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the file contents associated with the tree.
|
||||
* @return the file contents
|
||||
*/
|
||||
public final FileContents getFileContents()
|
||||
{
|
||||
return (FileContents) getTreeContext().get(FILE_CONTENTS_ATTRIBUTE);
|
||||
}
|
||||
|
||||
/** @return the tab width to report errors with */
|
||||
|
|
@ -213,15 +211,6 @@ public abstract class Check
|
|||
mTabWidth = aTabWidth;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the filename associated with the tree.
|
||||
* @return the file name
|
||||
*/
|
||||
public final String getFilename()
|
||||
{
|
||||
return (String) getTreeContext().get(FILENAME_ATTRIBUTE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Log an error message.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -0,0 +1,96 @@
|
|||
package com.puppycrawl.tools.checkstyle.api;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.HashMap;
|
||||
|
||||
public class FileContents
|
||||
{
|
||||
/** the file name */
|
||||
private final String mFilename;
|
||||
|
||||
/** the lines */
|
||||
private final String[] mLines;
|
||||
|
||||
/** map of the Javadoc comments indexed on the last line of the comment.
|
||||
* The hack is it assumes that there is only one Javadoc comment per line.
|
||||
*/
|
||||
private final Map mJavadocComments = new HashMap();
|
||||
|
||||
/** map of the C++ comments indexed on the last line of the comment. */
|
||||
private final Map mCPlusPlusComments = new HashMap();
|
||||
|
||||
public FileContents(String aFilename, String[] aLines)
|
||||
{
|
||||
mFilename = aFilename;
|
||||
mLines = aLines;
|
||||
}
|
||||
|
||||
/**
|
||||
* Report the location of a C-style comment.
|
||||
* @param aStartLineNo the starting line number
|
||||
* @param aStartColNo the starting column number
|
||||
**/
|
||||
public void reportCPPComment(int aStartLineNo, int aStartColNo)
|
||||
{
|
||||
final String cmt = mLines[aStartLineNo - 1].substring(aStartColNo);
|
||||
mCPlusPlusComments.put(new Integer(aStartLineNo - 1), cmt);
|
||||
}
|
||||
|
||||
/**
|
||||
* Report the location of a C-style comment.
|
||||
* @param aStartLineNo the starting line number
|
||||
* @param aStartColNo the starting column number
|
||||
* @param aEndLineNo the ending line number
|
||||
* @param aEndColNo the ending column number
|
||||
**/
|
||||
public void reportCComment(int aStartLineNo, int aStartColNo,
|
||||
int aEndLineNo, int aEndColNo)
|
||||
{
|
||||
final String[] cc = extractCComment(aStartLineNo, aStartColNo,
|
||||
aEndLineNo, aEndColNo);
|
||||
|
||||
// Remember if possible Javadoc comment
|
||||
if (mLines[aStartLineNo - 1].indexOf("/**", aStartColNo) != -1) {
|
||||
mJavadocComments.put(new Integer(aEndLineNo - 1), cc);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the specified C comment as a String array.
|
||||
* @return C comment as a array
|
||||
* @param aStartLineNo the starting line number
|
||||
* @param aStartColNo the starting column number
|
||||
* @param aEndLineNo the ending line number
|
||||
* @param aEndColNo the ending column number
|
||||
**/
|
||||
private String[] extractCComment(int aStartLineNo, int aStartColNo,
|
||||
int aEndLineNo, int aEndColNo)
|
||||
{
|
||||
String[] retVal;
|
||||
if (aStartLineNo == aEndLineNo) {
|
||||
retVal = new String[1];
|
||||
retVal[0] = mLines[aStartLineNo - 1].substring(aStartColNo,
|
||||
aEndColNo + 1);
|
||||
}
|
||||
else {
|
||||
retVal = new String[aEndLineNo - aStartLineNo + 1];
|
||||
retVal[0] = mLines[aStartLineNo - 1].substring(aStartColNo);
|
||||
for (int i = aStartLineNo; i < aEndLineNo; i++) {
|
||||
retVal[i - aStartLineNo + 1] = mLines[i];
|
||||
}
|
||||
retVal[retVal.length - 1] =
|
||||
mLines[aEndLineNo - 1].substring(0, aEndColNo + 1);
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
|
||||
public String[] getLines()
|
||||
{
|
||||
return mLines;
|
||||
}
|
||||
|
||||
public String getFilename()
|
||||
{
|
||||
return mFilename;
|
||||
}
|
||||
}
|
||||
|
|
@ -19,11 +19,12 @@
|
|||
|
||||
package com.puppycrawl.tools.checkstyle.gui;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Component;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import antlr.ANTLRException;
|
||||
import com.puppycrawl.tools.checkstyle.Checker;
|
||||
import com.puppycrawl.tools.checkstyle.api.DetailAST;
|
||||
import com.puppycrawl.tools.checkstyle.api.FileContents;
|
||||
import com.puppycrawl.tools.checkstyle.api.Utils;
|
||||
|
||||
import javax.swing.AbstractAction;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JFileChooser;
|
||||
|
|
@ -32,12 +33,11 @@ import javax.swing.JPanel;
|
|||
import javax.swing.JScrollPane;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.filechooser.FileFilter;
|
||||
|
||||
import antlr.ANTLRException;
|
||||
import com.puppycrawl.tools.checkstyle.Checker;
|
||||
import com.puppycrawl.tools.checkstyle.CommentManager;
|
||||
import com.puppycrawl.tools.checkstyle.api.DetailAST;
|
||||
import com.puppycrawl.tools.checkstyle.api.Utils;
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Component;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* Displays information about a parse tree.
|
||||
|
|
@ -110,8 +110,8 @@ public class ParseTreeInfoPanel extends JPanel
|
|||
throws IOException, ANTLRException
|
||||
{
|
||||
final String[] lines = Utils.getLines(aFileName);
|
||||
final CommentManager cmgr = new CommentManager(lines);
|
||||
return Checker.parse(lines, aFileName, cmgr);
|
||||
final FileContents contents = new FileContents(aFileName, lines);
|
||||
return Checker.parse(contents);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ header {
|
|||
package com.puppycrawl.tools.checkstyle;
|
||||
|
||||
import com.puppycrawl.tools.checkstyle.api.DetailAST;
|
||||
import com.puppycrawl.tools.checkstyle.api.FileContents;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ header {
|
|||
package com.puppycrawl.tools.checkstyle;
|
||||
|
||||
import com.puppycrawl.tools.checkstyle.api.DetailAST;
|
||||
import com.puppycrawl.tools.checkstyle.api.FileContents;
|
||||
}
|
||||
|
||||
/** Java 1.3 Recognizer
|
||||
|
|
@ -952,13 +953,13 @@ options {
|
|||
setColumn( getColumn() + 1 );
|
||||
}
|
||||
|
||||
private CommentManager mCommentManager = null;
|
||||
private FileContents mFileContents = null;
|
||||
|
||||
// TODO: Check visibility of this method one parsing is done in central
|
||||
// utility method
|
||||
public void setCommentManager(CommentManager aCommentManager)
|
||||
{
|
||||
mCommentManager = aCommentManager;
|
||||
public void setFileContents(FileContents aContents)
|
||||
{
|
||||
mFileContents = aContents;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1030,7 +1031,7 @@ WS : ( ' '
|
|||
|
||||
// Single-line comments
|
||||
SL_COMMENT
|
||||
: "//" { mCommentManager.reportCPPComment(getLine(), getColumn() - 3); }
|
||||
: "//" { mFileContents.reportCPPComment(getLine(), getColumn() - 3); }
|
||||
(~('\n'|'\r'))* ('\n'|'\r'('\n')?)
|
||||
{$setType(Token.SKIP); newline();}
|
||||
;
|
||||
|
|
@ -1061,7 +1062,7 @@ ML_COMMENT
|
|||
)*
|
||||
"*/"
|
||||
{
|
||||
mCommentManager.reportCComment(startLine, startCol,
|
||||
mFileContents.reportCComment(startLine, startCol,
|
||||
getLine(), getColumn() - 2);
|
||||
$setType(Token.SKIP);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue