diff --git a/pom.xml b/pom.xml
index c994894a5..c3eaa9eb7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
com.mysema.codegen
codegen
- 0.3.8-SNAPSHOT
+ 0.3.9
Codegen
Code generation and compilation for Java
diff --git a/src/main/java/com/mysema/codegen/ScalaWriter.java b/src/main/java/com/mysema/codegen/ScalaWriter.java
index f1be2519a..2ee24c667 100644
--- a/src/main/java/com/mysema/codegen/ScalaWriter.java
+++ b/src/main/java/com/mysema/codegen/ScalaWriter.java
@@ -21,6 +21,7 @@ import org.apache.commons.lang.StringEscapeUtils;
import com.mysema.codegen.model.Parameter;
import com.mysema.codegen.model.Type;
import com.mysema.codegen.model.Types;
+import com.mysema.codegen.support.ScalaSyntaxUtils;
/**
* @author tiwe
@@ -113,7 +114,7 @@ public class ScalaWriter extends AbstractCodeWriter{
}else{
append("(");
}
- append(method.getName()+"=");
+ append(escape(method.getName())+"=");
annotationConstant(value);
} catch (IllegalArgumentException e) {
throw new CodegenException(e);
@@ -269,9 +270,9 @@ public class ScalaWriter extends AbstractCodeWriter{
private ScalaWriter beginMethod(String modifiers, Type returnType, String methodName, Parameter... args) throws IOException{
if (returnType.equals(Types.VOID)){
- beginLine(modifiers + methodName).params(args).append(" {").nl();
+ beginLine(modifiers + escape(methodName)).params(args).append(" {").nl();
}else{
- beginLine(modifiers + methodName).params(args).append(": " + getGenericName(true, returnType)).append(" {").nl();
+ beginLine(modifiers + escape(methodName)).params(args).append(": " + getGenericName(true, returnType)).append(" {").nl();
}
return goIn();
@@ -304,17 +305,17 @@ public class ScalaWriter extends AbstractCodeWriter{
}
public ScalaWriter field(Type type, String name) throws IOException {
- line(VAR + name + ": " + getGenericName(true, type) + SEMICOLON);
+ line(VAR + escape(name) + ": " + getGenericName(true, type) + SEMICOLON);
return compact ? this : nl();
}
private ScalaWriter field(String modifier, Type type, String name) throws IOException{
- line(modifier + name + ": " + getGenericName(true, type) + SEMICOLON);
+ line(modifier + escape(name) + ": " + getGenericName(true, type) + SEMICOLON);
return compact ? this : nl();
}
private ScalaWriter field(String modifier, Type type, String name, String value) throws IOException{
- line(modifier + name + ": " + getGenericName(true, type) + ASSIGN + value + SEMICOLON);
+ line(modifier + escape(name) + ": " + getGenericName(true, type) + ASSIGN + value + SEMICOLON);
return compact ? this : nl();
}
@@ -451,7 +452,7 @@ public class ScalaWriter extends AbstractCodeWriter{
private ScalaWriter param(Parameter parameter) throws IOException{
- append(parameter.getName());
+ append(escape(parameter.getName()));
append(": ");
append(getGenericName(true, parameter.getType()));
return this;
@@ -539,4 +540,11 @@ public class ScalaWriter extends AbstractCodeWriter{
return rv;
}
+ private String escape(String token) {
+ if (ScalaSyntaxUtils.isReserved(token)) {
+ return "`" + token + "`";
+ } else {
+ return token;
+ }
+ }
}
diff --git a/src/main/java/com/mysema/codegen/support/ScalaSyntaxUtils.java b/src/main/java/com/mysema/codegen/support/ScalaSyntaxUtils.java
new file mode 100644
index 000000000..f28d84ad6
--- /dev/null
+++ b/src/main/java/com/mysema/codegen/support/ScalaSyntaxUtils.java
@@ -0,0 +1,66 @@
+package com.mysema.codegen.support;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+public final class ScalaSyntaxUtils {
+
+ private ScalaSyntaxUtils(){}
+
+ private static final Set reserved = new HashSet(Arrays.asList(
+ "abstract",
+ "do",
+ "finally",
+ "import",
+ "object",
+ "return",
+ "trait",
+ "var",
+ "_",
+ ":",
+ "case",
+ "else",
+ "for",
+ "lazy",
+ "override",
+ "sealed",
+ "try",
+ "while",
+ "=",
+ "=>",
+ "<-",
+ "catch",
+ "extends",
+ "forSome",
+ "match",
+ "package",
+ "super",
+ "true",
+ "with",
+ "<:",
+ "class",
+ "false",
+ "if",
+ "new",
+ "private",
+ "this",
+ "type",
+ "yield",
+ "<%",
+ ">:",
+ "def",
+ "final",
+ "implicit",
+ "null",
+ "protected",
+ "throw",
+ "val",
+ "#",
+ "@"
+ ));
+
+ public static boolean isReserved(String token) {
+ return reserved.contains(token);
+ }
+}
diff --git a/src/test/java/com/mysema/codegen/ScalaWriterTest.java b/src/test/java/com/mysema/codegen/ScalaWriterTest.java
index 9739516c7..10c65c629 100644
--- a/src/test/java/com/mysema/codegen/ScalaWriterTest.java
+++ b/src/test/java/com/mysema/codegen/ScalaWriterTest.java
@@ -347,4 +347,25 @@ public class ScalaWriterTest {
assertTrue(w.toString().contains("public JavaWriterTest(a: Int) {"));
}
+ @Test
+ public void ReservedWords() throws IOException {
+ writer.beginClass(testType);
+
+ writer.beginConstructor(new Parameter("type", Types.INT));
+ writer.end();
+
+ writer.publicField(testType, "class");
+
+ writer.beginPublicMethod(testType, "var");
+ writer.end();
+
+ writer.end();
+
+ System.out.println(w);
+
+ assertTrue(w.toString().contains("`type`: Int"));
+ assertTrue(w.toString().contains("`class`: JavaWriterTest"));
+ assertTrue(w.toString().contains("`var`(): JavaWriterTest"));
+ }
+
}