From 38044fb7f5271049bf709a81a1c3557d95b3eb6e Mon Sep 17 00:00:00 2001 From: Dale Anson Date: Wed, 9 Dec 2009 02:22:56 +0000 Subject: [PATCH] Added javascript as a supported language for CPD. git-svn-id: https://pmd.svn.sourceforge.net/svnroot/pmd/branches/pmd/4.2.x@7019 51baf565-9d33-0410-a72c-fc3788e3496d --- .../pmd/cpd/JavascriptTokenizerTest.java | 64 +++++++++++++++++++ .../pmd/cpd/JavascriptLanguage.java | 11 ++++ .../pmd/cpd/JavascriptTokenizer.java | 22 +++++++ .../sourceforge/pmd/cpd/LanguageFactory.java | 2 +- 4 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 pmd/regress/test/net/sourceforge/pmd/cpd/JavascriptTokenizerTest.java create mode 100644 pmd/src/net/sourceforge/pmd/cpd/JavascriptLanguage.java create mode 100644 pmd/src/net/sourceforge/pmd/cpd/JavascriptTokenizer.java diff --git a/pmd/regress/test/net/sourceforge/pmd/cpd/JavascriptTokenizerTest.java b/pmd/regress/test/net/sourceforge/pmd/cpd/JavascriptTokenizerTest.java new file mode 100644 index 0000000000..32e4ded411 --- /dev/null +++ b/pmd/regress/test/net/sourceforge/pmd/cpd/JavascriptTokenizerTest.java @@ -0,0 +1,64 @@ +/** +* BSD-style license; for more info see http://pmd.sourceforge.net/license.html +*/ +package test.net.sourceforge.pmd.cpd; + +import static org.junit.Assert.assertEquals; +import net.sourceforge.pmd.PMD; +import net.sourceforge.pmd.cpd.JavascriptTokenizer; +import net.sourceforge.pmd.cpd.SourceCode; +import net.sourceforge.pmd.cpd.Tokenizer; +import net.sourceforge.pmd.cpd.Tokens; + +import org.junit.Test; + +public class JavascriptTokenizerTest { + + @Test + public void test1() throws Throwable { + Tokenizer tokenizer = new JavascriptTokenizer(); + SourceCode sourceCode = new SourceCode( new SourceCode.StringCodeLoader( getCode1() ) ); + Tokens tokens = new Tokens(); + tokenizer.tokenize( sourceCode, tokens ); + assertEquals( 22, tokens.size() ); + } + + @Test + public void test2() throws Throwable { + Tokenizer t = new JavascriptTokenizer(); + SourceCode sourceCode = new SourceCode( new SourceCode.StringCodeLoader( getCode2() ) ); + Tokens tokens = new Tokens(); + t.tokenize( sourceCode, tokens ); + assertEquals( 22, tokens.size() ); + } + + // no semi-colons + private String getCode1() { + StringBuilder sb = new StringBuilder(); + sb.append( "function switchToRealPassword() {" ).append(PMD.EOL); + sb.append( " var real = $('realPass')" ).append(PMD.EOL); + sb.append( " var prompt = $('promptPass')" ).append(PMD.EOL); + sb.append( " real.style.display = 'inline'" ).append(PMD.EOL); + sb.append( " prompt.style.display = 'none'" ).append(PMD.EOL); + sb.append( " real.focus()" ).append(PMD.EOL); + sb.append( "}" ).append(PMD.EOL); + return sb.toString(); + } + + // same as getCode1, but lines are ended with semi-colons + private String getCode2() { + StringBuilder sb = new StringBuilder(); + sb.append( "function switchToRealPassword() {" ).append(PMD.EOL); + sb.append( " var real = $('realPass');" ).append(PMD.EOL); + sb.append( " var prompt = $('promptPass');" ).append(PMD.EOL); + sb.append( " real.style.display = 'inline';" ).append(PMD.EOL); + sb.append( " prompt.style.display = 'none';" ).append(PMD.EOL); + sb.append( " real.focus();" ).append(PMD.EOL); + sb.append( "}" ).append(PMD.EOL); + return sb.toString(); + } + + public static junit.framework.Test suite() { + return new junit.framework.JUnit4TestAdapter( JavascriptTokenizerTest.class ); + } +} \ No newline at end of file diff --git a/pmd/src/net/sourceforge/pmd/cpd/JavascriptLanguage.java b/pmd/src/net/sourceforge/pmd/cpd/JavascriptLanguage.java new file mode 100644 index 0000000000..17bda4d604 --- /dev/null +++ b/pmd/src/net/sourceforge/pmd/cpd/JavascriptLanguage.java @@ -0,0 +1,11 @@ +/** + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + * @author Zev Blut zb@ubit.com + */ +package net.sourceforge.pmd.cpd; + +public class JavascriptLanguage extends AbstractLanguage { + public JavascriptLanguage() { + super(new JavascriptTokenizer(), ".js"); + } +} diff --git a/pmd/src/net/sourceforge/pmd/cpd/JavascriptTokenizer.java b/pmd/src/net/sourceforge/pmd/cpd/JavascriptTokenizer.java new file mode 100644 index 0000000000..020f0a1043 --- /dev/null +++ b/pmd/src/net/sourceforge/pmd/cpd/JavascriptTokenizer.java @@ -0,0 +1,22 @@ +package net.sourceforge.pmd.cpd; + +import java.util.ArrayList; + +/** + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ +public class JavascriptTokenizer extends AbstractTokenizer { + public JavascriptTokenizer() { + // setting markers for "string" in javascript + this.stringToken = new ArrayList(); + this.stringToken.add( "\'" ); + this.stringToken.add( "\"" ); + + // setting markers for 'ignorable character' in javascript + this.ignorableCharacter = new ArrayList(); + this.ignorableCharacter.add( ";" ); + + // setting markers for 'ignorable string' in javascript + this.ignorableStmt = new ArrayList(); + } +} \ No newline at end of file diff --git a/pmd/src/net/sourceforge/pmd/cpd/LanguageFactory.java b/pmd/src/net/sourceforge/pmd/cpd/LanguageFactory.java index 732f30158c..1f7cae54b9 100644 --- a/pmd/src/net/sourceforge/pmd/cpd/LanguageFactory.java +++ b/pmd/src/net/sourceforge/pmd/cpd/LanguageFactory.java @@ -7,7 +7,7 @@ import java.util.Properties; public class LanguageFactory { - public static String[] supportedLanguages = new String[]{"java", "jsp", "cpp", "c", "php", "ruby","fortran" }; + public static String[] supportedLanguages = new String[]{"java", "jsp", "cpp", "c", "php", "ruby","fortran", "javascript" }; private static final String SUFFIX = "Language"; public static final String EXTENSION = "extension"; public static final String BY_EXTENSION = "by_extension";