[apex] CPD: Prepared option to switch on case sensitive check

This commit is contained in:
Andreas Dangel
2017-07-07 10:38:21 +02:00
parent e669b28341
commit 0f36c9ae2b
3 changed files with 47 additions and 2 deletions

View File

@@ -4,8 +4,21 @@
package net.sourceforge.pmd.cpd;
import java.util.Properties;
public class ApexLanguage extends AbstractLanguage {
public ApexLanguage() {
this(new Properties());
}
public ApexLanguage(Properties properties) {
super("Apex", "apex", new ApexTokenizer(), ".cls");
setProperties(properties);
}
public final void setProperties(Properties properties) {
ApexTokenizer tokenizer = (ApexTokenizer) getTokenizer();
tokenizer.setProperties(properties);
}
}

View File

@@ -5,6 +5,7 @@
package net.sourceforge.pmd.cpd;
import java.util.Locale;
import java.util.Properties;
import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.Lexer;
@@ -16,6 +17,18 @@ import apex.jorje.parser.impl.ApexLexer;
public class ApexTokenizer implements Tokenizer {
/**
* If the properties is <code>false</code> (default), then the case of any token
* is ignored.
*/
public static final String CASE_SENSITIVE = "net.sourceforge.pmd.cpd.ApexTokenizer.caseSensitive";
private boolean caseSensitive;
public void setProperties(Properties properties) {
caseSensitive = Boolean.parseBoolean(properties.getProperty(CASE_SENSITIVE, "false"));
}
@Override
public void tokenize(SourceCode sourceCode, Tokens tokenEntries) {
StringBuilder code = sourceCode.getCodeBuffer();
@@ -33,8 +46,9 @@ public class ApexTokenizer implements Tokenizer {
while (token.getType() != Token.EOF) {
if (token.getChannel() != Lexer.HIDDEN) {
String tokenText = token.getText();
// note: old behavior of AbstractTokenizer was, to consider only lowercase
tokenText = tokenText.toLowerCase(Locale.ROOT);
if (!caseSensitive) {
tokenText = tokenText.toLowerCase(Locale.ROOT);
}
TokenEntry tokenEntry = new TokenEntry(tokenText, sourceCode.getFileName(), token.getLine());
tokenEntries.add(tokenEntry);
}

View File

@@ -11,6 +11,7 @@ import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import org.apache.commons.io.IOUtils;
import org.junit.Test;
@@ -30,6 +31,16 @@ public class ApexTokenizerTest {
assertEquals("someparam", findTokensByLine(8, tokens).get(0).toString());
}
@Test
public void testTokenizeCaseSensitive() throws IOException {
Tokens tokens = tokenize(load("Simple.cls"), true);
if (tokens.size() != 28) {
printTokens(tokens);
}
assertEquals(28, tokens.size());
assertEquals("someParam", findTokensByLine(8, tokens).get(0).toString());
}
/**
* Comments are ignored since using ApexLexer.
*/
@@ -56,7 +67,14 @@ public class ApexTokenizerTest {
}
private Tokens tokenize(String code) {
return tokenize(code, false);
}
private Tokens tokenize(String code, boolean caseSensitive) {
ApexTokenizer tokenizer = new ApexTokenizer();
Properties properties = new Properties();
properties.setProperty(ApexTokenizer.CASE_SENSITIVE, Boolean.toString(caseSensitive));
tokenizer.setProperties(properties);
Tokens tokens = new Tokens();
tokenizer.tokenize(new SourceCode(new StringCodeLoader(code)), tokens);
return tokens;