Skip to content

Commit 70f7bde

Browse files
committed
Added source importing and very basic syntax coloring (keywords, reserved variables, and comments).
1 parent 2f7b93e commit 70f7bde

5 files changed

Lines changed: 136 additions & 2 deletions

File tree

src/main/java/com/pica/sonarplugins/ruby/RubyPlugin.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.pica.sonarplugins.ruby;
22

33
import com.pica.sonarplugins.ruby.core.Ruby;
4+
import com.pica.sonarplugins.ruby.core.RubySourceCodeColorizer;
5+
import com.pica.sonarplugins.ruby.core.RubySourceImporter;
46
import org.sonar.api.Plugin;
57
import org.sonar.api.Properties;
68

@@ -26,7 +28,9 @@ public String getDescription() {
2628
public List getExtensions() {
2729
return Arrays.asList(
2830
Ruby.class,
29-
RubySensor.class
31+
RubySensor.class,
32+
RubySourceImporter.class,
33+
RubySourceCodeColorizer.class
3034
);
3135
}
3236

src/main/java/com/pica/sonarplugins/ruby/core/Ruby.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,17 @@ public class Ruby extends AbstractLanguage {
77
public static final String KEY = "ruby";
88
public static Ruby INSTANCE = new Ruby();
99

10+
static final String[] RUBY_KEYWORDS_ARRAY = new String[]{
11+
"alias", "and", "BEGIN", "begin", "break", "case", "class", "def", "defined?",
12+
"do", "else", "elsif", "END", "end", "ensure", "false", "for", "if", "in", "module",
13+
"next", "nil", "not", "or", "redo", "rescue", "retry", "return", "self", "super",
14+
"then", "true", "undef", "unless", "until", "when", "while", "yield"
15+
};
16+
17+
static final String[] RUBY_RESERVED_VARIABLES_ARRAY = new String[]{
18+
"__FILE__", "__LINE__"
19+
};
20+
1021
public Ruby() {
1122
super(KEY, "Ruby");
1223
}

src/main/java/com/pica/sonarplugins/ruby/core/RubyFile.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ public static RubyFile fromIOFile(File file, List<File> sourceDirs) {
112112

113113
/**
114114
* Creates a {@link RubyFile} from a file in the source directories.
115-
*
115+
*
116116
* @param unitTest whether it is a unit test file or a source file
117117
* @return the {@link RubyFile} created if exists, null otherwise
118118
*/
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.pica.sonarplugins.ruby.core;
2+
3+
import static com.pica.sonarplugins.ruby.core.Ruby.RUBY_KEYWORDS_ARRAY;
4+
import static com.pica.sonarplugins.ruby.core.Ruby.RUBY_RESERVED_VARIABLES_ARRAY;
5+
6+
import java.util.Arrays;
7+
import java.util.Collections;
8+
import java.util.HashSet;
9+
import java.util.List;
10+
import java.util.Set;
11+
12+
import org.sonar.api.web.CodeColorizerFormat;
13+
import org.sonar.colorizer.KeywordsTokenizer;
14+
import org.sonar.colorizer.RegexpTokenizer;
15+
import org.sonar.colorizer.StringTokenizer;
16+
import org.sonar.colorizer.Tokenizer;
17+
18+
public class RubySourceCodeColorizer extends CodeColorizerFormat {
19+
20+
private static final Set<String> RUBY_KEYWORDS = new HashSet<String>();
21+
private static final Set<String> RUBY_RESERVED_VARIABLES = new HashSet<String>();
22+
23+
static {
24+
Collections.addAll(RUBY_KEYWORDS, RUBY_KEYWORDS_ARRAY);
25+
Collections.addAll(RUBY_RESERVED_VARIABLES, RUBY_RESERVED_VARIABLES_ARRAY);
26+
}
27+
28+
public RubySourceCodeColorizer() {
29+
super(Ruby.KEY);
30+
}
31+
32+
@Override
33+
public List<Tokenizer> getTokenizers() {
34+
String tagAfter = "</span>";
35+
KeywordsTokenizer rubyKeyWordsTokenizer = new KeywordsTokenizer("<span class=\"k\">", tagAfter, RUBY_KEYWORDS);
36+
KeywordsTokenizer rubyVariablesTokenizer = new KeywordsTokenizer("<span class=\"c\">", tagAfter, RUBY_RESERVED_VARIABLES);
37+
RegexpTokenizer rubyCommentsTokenizer = new RegexpTokenizer("<span class=\"cd\">", tagAfter, "#.*");
38+
StringTokenizer stringTokenizer = new StringTokenizer("<span class=\"s\">", tagAfter);
39+
return Collections.unmodifiableList(Arrays.asList(rubyKeyWordsTokenizer, rubyVariablesTokenizer, rubyCommentsTokenizer, stringTokenizer));
40+
}
41+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package com.pica.sonarplugins.ruby.core;
2+
3+
import static com.pica.sonarplugins.ruby.core.Ruby.INSTANCE;
4+
5+
import java.io.File;
6+
import java.io.IOException;
7+
import java.nio.charset.Charset;
8+
import java.util.List;
9+
10+
import org.apache.commons.lang.builder.ToStringBuilder;
11+
import org.apache.commons.lang.builder.ToStringStyle;
12+
import org.slf4j.Logger;
13+
import org.slf4j.LoggerFactory;
14+
import org.sonar.api.batch.AbstractSourceImporter;
15+
import org.sonar.api.batch.Phase;
16+
import org.sonar.api.batch.SensorContext;
17+
import org.sonar.api.resources.Project;
18+
import org.sonar.api.resources.ProjectFileSystem;
19+
import org.sonar.api.utils.SonarException;
20+
21+
@Phase(name = Phase.Name.PRE)
22+
23+
public class RubySourceImporter extends AbstractSourceImporter {
24+
25+
private static final Logger LOG = LoggerFactory.getLogger(RubySourceImporter.class);
26+
private Project project;
27+
28+
public RubySourceImporter(Project project) {
29+
super(Ruby.INSTANCE);
30+
this.project = project;
31+
}
32+
33+
@Override
34+
public void analyse(Project project, SensorContext context) {
35+
try {
36+
LOG.info("Importing files from project " + project.getName());
37+
doAnalyse(project, context);
38+
} catch (IOException e) {
39+
throw new SonarException("Parsing source files ended abnormally", e);
40+
}
41+
}
42+
43+
@Override
44+
protected RubyFile createResource(File file, List<File> sourceDirs, boolean unitTest) {
45+
return file != null ? RubyFile.fromIOFile(file, sourceDirs, unitTest) : null;
46+
}
47+
48+
protected void doAnalyse(Project project, SensorContext context) throws IOException {
49+
// Importing source files
50+
ProjectFileSystem fileSystem = project.getFileSystem();
51+
Charset sourceCharset = fileSystem.getSourceCharset();
52+
53+
List<File> sourceDirs = fileSystem.getSourceDirs();
54+
List<File> sourceFiles = fileSystem.getSourceFiles(INSTANCE);
55+
parseDirs(context, sourceFiles, sourceDirs, false, sourceCharset);
56+
for (File directory : sourceDirs) {
57+
LOG.info(directory.getName());
58+
}
59+
60+
// Importing tests files
61+
List<File> testDirs = fileSystem.getTestDirs();
62+
List<File> testFiles = fileSystem.getTestFiles(INSTANCE);
63+
parseDirs(context, testFiles, testDirs, true, sourceCharset);
64+
// Display source dirs and tests directories if info level is enabled.
65+
for (File directory : testDirs) {
66+
LOG.info(directory.getName());
67+
}
68+
}
69+
70+
@Override
71+
public String toString() {
72+
ToStringBuilder builder = new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE);
73+
builder.append("getLanguage()", getLanguage());
74+
builder.append("getClass()", getClass());
75+
return builder.toString();
76+
}
77+
78+
}

0 commit comments

Comments
 (0)