aboutsummaryrefslogtreecommitdiffstats
path: root/javaparser-symbol-solver-testing/src/test/test_sourcecode/javaparser_src/proper_source/com/github/javaparser/ast/comments/CommentsParser.java
diff options
context:
space:
mode:
Diffstat (limited to 'javaparser-symbol-solver-testing/src/test/test_sourcecode/javaparser_src/proper_source/com/github/javaparser/ast/comments/CommentsParser.java')
-rw-r--r--javaparser-symbol-solver-testing/src/test/test_sourcecode/javaparser_src/proper_source/com/github/javaparser/ast/comments/CommentsParser.java171
1 files changed, 171 insertions, 0 deletions
diff --git a/javaparser-symbol-solver-testing/src/test/test_sourcecode/javaparser_src/proper_source/com/github/javaparser/ast/comments/CommentsParser.java b/javaparser-symbol-solver-testing/src/test/test_sourcecode/javaparser_src/proper_source/com/github/javaparser/ast/comments/CommentsParser.java
new file mode 100644
index 000000000..3d3a59d45
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/test_sourcecode/javaparser_src/proper_source/com/github/javaparser/ast/comments/CommentsParser.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright (C) 2007-2010 JĂșlio Vilmar Gesser.
+ * Copyright (C) 2011, 2013-2015 The JavaParser Team.
+ *
+ * This file is part of JavaParser.
+ *
+ * JavaParser can be used either under the terms of
+ * a) the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * b) the terms of the Apache License
+ *
+ * You should have received a copy of both licenses in LICENCE.LGPL and
+ * LICENCE.APACHE. Please refer to those files for details.
+ *
+ * JavaParser 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 Lesser General Public License for more details.
+ */
+
+package com.github.javaparser.ast.comments;
+
+import java.io.*;
+import java.nio.charset.Charset;
+import java.util.*;
+
+/**
+ * This parser cares exclusively about comments.
+ */
+public class CommentsParser {
+
+ private enum State {
+ CODE,
+ IN_LINE_COMMENT,
+ IN_BLOCK_COMMENT,
+ IN_STRING,
+ IN_CHAR;
+ }
+
+ private static final int COLUMNS_PER_TAB = 4;
+
+ public CommentsCollection parse(final String source) throws IOException, UnsupportedEncodingException {
+ InputStream in = new ByteArrayInputStream(source.getBytes(Charset.defaultCharset()));
+ return parse(in, Charset.defaultCharset().name());
+ }
+
+ public CommentsCollection parse(final InputStream in, final String charsetName) throws IOException, UnsupportedEncodingException {
+ boolean lastWasASlashR = false;
+ BufferedReader br = new BufferedReader(new InputStreamReader(in, charsetName));
+ CommentsCollection comments = new CommentsCollection();
+ int r;
+
+ Deque prevTwoChars = new LinkedList<Character>(Arrays.asList('z','z'));
+
+ State state = State.CODE;
+ LineComment currentLineComment = null;
+ BlockComment currentBlockComment = null;
+ StringBuffer currentContent = null;
+
+ int currLine = 1;
+ int currCol = 1;
+
+ while ((r=br.read()) != -1){
+ char c = (char)r;
+ if (c=='\r'){
+ lastWasASlashR = true;
+ } else if (c=='\n'&&lastWasASlashR){
+ lastWasASlashR=false;
+ continue;
+ } else {
+ lastWasASlashR=false;
+ }
+ switch (state) {
+ case CODE:
+ if (prevTwoChars.peekLast().equals('/') && c == '/') {
+ currentLineComment = new LineComment();
+ currentLineComment.setBeginLine(currLine);
+ currentLineComment.setBeginColumn(currCol - 1);
+ state = State.IN_LINE_COMMENT;
+ currentContent = new StringBuffer();
+ } else if (prevTwoChars.peekLast().equals('/') && c == '*') {
+ currentBlockComment = new BlockComment();
+ currentBlockComment.setBeginLine(currLine);
+ currentBlockComment.setBeginColumn(currCol - 1);
+ state = State.IN_BLOCK_COMMENT;
+ currentContent = new StringBuffer();
+ } else if (c == '"') {
+ state = State.IN_STRING;
+ } else if (c == '\'') {
+ state = State.IN_CHAR;
+ } else {
+ // nothing to do
+ }
+ break;
+ case IN_LINE_COMMENT:
+ if (c=='\n' || c=='\r'){
+ currentLineComment.setContent(currentContent.toString());
+ currentLineComment.setEndLine(currLine);
+ currentLineComment.setEndColumn(currCol);
+ comments.addComment(currentLineComment);
+ state = State.CODE;
+ } else {
+ currentContent.append(c);
+ }
+ break;
+ case IN_BLOCK_COMMENT:
+ if (prevTwoChars.peekLast().equals('*') && c=='/' && !prevTwoChars.peekFirst().equals('/')){
+
+ // delete last character
+ String content = currentContent.deleteCharAt(currentContent.toString().length()-1).toString();
+
+ if (content.startsWith("*")){
+ JavadocComment javadocComment = new JavadocComment();
+ javadocComment.setContent(content.substring(1));
+ javadocComment.setBeginLine(currentBlockComment.getBeginLine());
+ javadocComment.setBeginColumn(currentBlockComment.getBeginColumn());
+ javadocComment.setEndLine(currLine);
+ javadocComment.setEndColumn(currCol+1);
+ comments.addComment(javadocComment);
+ } else {
+ currentBlockComment.setContent(content);
+ currentBlockComment.setEndLine(currLine);
+ currentBlockComment.setEndColumn(currCol+1);
+ comments.addComment(currentBlockComment);
+ }
+ state = State.CODE;
+ } else {
+ currentContent.append(c=='\r'?'\n':c);
+ }
+ break;
+ case IN_STRING:
+ if (!prevTwoChars.peekLast().equals('\\') && c == '"') {
+ state = State.CODE;
+ }
+ break;
+ case IN_CHAR:
+ if (!prevTwoChars.peekLast().equals('\\') && c == '\'') {
+ state = State.CODE;
+ }
+ break;
+ default:
+ throw new RuntimeException("Unexpected");
+ }
+ switch (c){
+ case '\n':
+ case '\r':
+ currLine+=1;
+ currCol = 1;
+ break;
+ case '\t':
+ currCol+=COLUMNS_PER_TAB;
+ break;
+ default:
+ currCol+=1;
+ }
+ prevTwoChars.remove();
+ prevTwoChars.add(c);
+ }
+
+ if (state==State.IN_LINE_COMMENT){
+ currentLineComment.setContent(currentContent.toString());
+ currentLineComment.setEndLine(currLine);
+ currentLineComment.setEndColumn(currCol);
+ comments.addComment(currentLineComment);
+ }
+
+ return comments;
+ }
+
+}