From 19cf1b95b5140d95005ecb4f3ec1efed03628d29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Tue, 10 May 2011 08:20:28 +0000 Subject: [PATCH] added escaping of Scala reserved words --- pom.xml | 2 +- .../java/com/mysema/codegen/ScalaWriter.java | 22 +++++-- .../codegen/support/ScalaSyntaxUtils.java | 66 +++++++++++++++++++ .../com/mysema/codegen/ScalaWriterTest.java | 21 ++++++ 4 files changed, 103 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/mysema/codegen/support/ScalaSyntaxUtils.java 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")); + } + }