diff --git a/src/main/java/greed/Greed.java b/src/main/java/greed/Greed.java index cf4b3bd..94aedd1 100644 --- a/src/main/java/greed/Greed.java +++ b/src/main/java/greed/Greed.java @@ -21,9 +21,11 @@ import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import javax.swing.JPanel; @@ -157,7 +159,7 @@ public void generateCode(boolean regen) { private String renderedCodeRoot(GreedConfig config) { - return currentEngine.render(config.getCodeRoot(), currentModel); + return currentEngine.render(config.getCodeRoot(), currentModel).replace(" ", ""); } @SuppressWarnings("unchecked") @@ -337,7 +339,7 @@ else if (!templateSet.contains(depTemplate)) { } indivModel.put("GeneratedFileName", new java.io.File(filePath).getName()); - indivModel.put("GeneratedFilePath", FileSystem.getRawFile(filePath).getPath()); + indivModel.put("GeneratedFilePath", FileSystem.getRawFile(filePath).getPath().replace("\\", "/")); boolean exists = FileSystem.exists(filePath); TemplateConfig.OverwriteOptions overwrite = template.getOverwrite(); @@ -375,6 +377,15 @@ else if (!templateSet.contains(depTemplate)) { FileSystem.writeFile(filePath, output); } + if (filePath.endsWith("html")) { + try { + Runtime.getRuntime().exec("open " + FileSystem.getRawFile(filePath).getPath().replace("\\", "/")); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + if (template.getAfterFileGen() != null) { CommandConfig afterGen = template.getAfterFileGen(); String[] commands = new String[afterGen.getArguments().length + 1]; @@ -398,10 +409,26 @@ else if (!templateSet.contains(depTemplate)) { talkingWindow.showLine(""); } + clionSet(problem.getClassName()); + talkingWindow.showLine("All set, good luck!"); talkingWindow.showLine(""); } + //clion 工程设置 + private void clionSet(String fileName) { + GreedConfig config = Utils.getGreedConfig(); + InputStream cmakeTemplate = getClass().getResourceAsStream("/templates/clion/CMakeLists.tmpl"); + + Map model = new HashMap(); + + model.put("FileName", renderedCodeRoot(config) + "/" + fileName); + + String cmake = currentEngine.render(cmakeTemplate, model); + FileSystem.writeFile("CMakeLists.txt", cmake); + + } + private HashMap mergeModels(HashMap ... models) { HashMap merged = new HashMap(); for (HashMap model: models) diff --git a/src/main/java/greed/code/lang/CppLanguage.java b/src/main/java/greed/code/lang/CppLanguage.java index aaaa299..ed7f45a 100644 --- a/src/main/java/greed/code/lang/CppLanguage.java +++ b/src/main/java/greed/code/lang/CppLanguage.java @@ -27,6 +27,8 @@ public String renderPrimitive(Primitive primitive) { return "int"; case BOOL: return "bool"; + case CHAR: + return "char"; case LONG: // TODO: Bad practice, need decoupling return Utils.getGreedConfig().getLanguage().get(Language.getName(Language.CPP)).getLongIntTypeName(); diff --git a/src/main/java/greed/model/Convert.java b/src/main/java/greed/model/Convert.java index f085a40..56f9568 100644 --- a/src/main/java/greed/model/Convert.java +++ b/src/main/java/greed/model/Convert.java @@ -145,6 +145,7 @@ public static Type convertType(DataType dt) { if ("long".equals(typeName)) type = Primitive.LONG; if ("double".equals(typeName)) type = Primitive.DOUBLE; if ("bool".equals(typeName)) type = Primitive.BOOL; + if ("char".equals(typeName)) type = Primitive.CHAR; return new Type(type, dt.getDimension()); } } diff --git a/src/main/java/greed/model/Primitive.java b/src/main/java/greed/model/Primitive.java index 129983a..338fa09 100644 --- a/src/main/java/greed/model/Primitive.java +++ b/src/main/java/greed/model/Primitive.java @@ -4,5 +4,5 @@ * Greed is good! Cheers! */ public enum Primitive { - INT, LONG, STRING, BOOL, DOUBLE + INT, LONG, STRING, BOOL, DOUBLE, CHAR } diff --git a/src/main/java/greed/model/Type.java b/src/main/java/greed/model/Type.java index 0bdb4de..80e341f 100644 --- a/src/main/java/greed/model/Type.java +++ b/src/main/java/greed/model/Type.java @@ -20,6 +20,8 @@ public static Type primitiveType(Primitive primitive) { case STRING: return STRING_TYPE; case LONG: return LONG_TYPE; case DOUBLE: return DOUBLE_TYPE; + case CHAR: + return CHAR_TYPE; } throw new IllegalArgumentException("Unknown primitive : " + primitive); } @@ -30,6 +32,7 @@ public static Type primitiveType(Primitive primitive) { public static final Type LONG_TYPE = new Type(Primitive.LONG, 0); public static final Type DOUBLE_TYPE = new Type(Primitive.DOUBLE, 0); public static final Type BOOL_TYPE = new Type(Primitive.BOOL, 0); + public static final Type CHAR_TYPE = new Type(Primitive.CHAR, 0); public static final Type INT_ARRAY_TYPE = new Type(Primitive.INT, 1); public static final Type STRING_ARRAY_TYPE = new Type(Primitive.STRING, 1); diff --git a/src/main/java/greed/template/StringUtilRenderer.java b/src/main/java/greed/template/StringUtilRenderer.java index 8603568..88ff494 100644 --- a/src/main/java/greed/template/StringUtilRenderer.java +++ b/src/main/java/greed/template/StringUtilRenderer.java @@ -74,6 +74,8 @@ private String applyUnquote(String s) { int n = s.length(); if (n >= 2 && s.charAt(0) == '"' && s.charAt(n - 1) == '"') s = s.substring(1, n - 1); + else if (n >= 2 && s.charAt(0) == '\'' && s.charAt(n - 1) == '\'') + s = s.substring(1, n - 1); return s; } diff --git a/src/main/resources/templates/clion/CMakeLists.tmpl b/src/main/resources/templates/clion/CMakeLists.tmpl new file mode 100644 index 0000000..b4b8f27 --- /dev/null +++ b/src/main/resources/templates/clion/CMakeLists.tmpl @@ -0,0 +1,7 @@ +cmake_minimum_required(VERSION 3.3) +project(topcoder) + +set(CMAKE_CXX_FLAGS "\${CMAKE_CXX_FLAGS} -std=c++11") + +set(SOURCE_FILES "${FileName}") +add_executable(topcoder \${SOURCE_FILES}) \ No newline at end of file diff --git a/src/main/resources/templates/filetest/cpp.tmpl b/src/main/resources/templates/filetest/cpp.tmpl index 1daa127..6431314 100644 --- a/src/main/resources/templates/filetest/cpp.tmpl +++ b/src/main/resources/templates/filetest/cpp.tmpl @@ -1,4 +1,4 @@ -ifstream data("${Dependencies.testcase.GeneratedFileName}"); +ifstream data("${Dependencies.testcase.GeneratedFilePath}"); string next_line() { string s; diff --git a/src/main/resources/templates/source/cpp.tmpl b/src/main/resources/templates/source/cpp.tmpl index ea6b971..fcb0d45 100644 --- a/src/main/resources/templates/source/cpp.tmpl +++ b/src/main/resources/templates/source/cpp.tmpl @@ -1,19 +1,14 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - +#include using namespace std; +#define ll long long +#define FT(i,f,t) for(int i=f;i<=t;++i) +#define TF(i,t,f) for(int i=t;i>=f;--i) +#define REP(i,n) for(int i=0;i model = new HashMap(); + TemplateEngine engine; + + @BeforeClass + public static void initializeGreed() throws ConfigException { + // TODO : Why at all do we need this? + Utils.initialize(); + } + + @Before + public void setupTemplates() throws IOException { + this.cmakeTemplate = getClass().getResourceAsStream("/templates/clion/CMakeLists.tmpl"); + assertThat(this.cmakeTemplate, notNullValue()); + + engine = TemplateEngine.newLanguageEngine(Language.CPP); + } + + @Test + public void renderCppCode() { + model.put("GeneratedFilePath", "GeneratedFilePath"); + model.put("GeneratedFileName", ".GeneratedFileName"); + String cmake = engine.render(cmakeTemplate, model); + System.out.println(cmake); + } +}