From 89bbf14179171ceac8d0b244ce1e78fd07948b5f Mon Sep 17 00:00:00 2001 From: RblSb Date: Sun, 10 Mar 2019 08:02:13 +0300 Subject: [PATCH 1/2] Fix CompilerDefines fields --- Sources/kha/internal/CompilerDefinesBuilder.hx | 1 + 1 file changed, 1 insertion(+) diff --git a/Sources/kha/internal/CompilerDefinesBuilder.hx b/Sources/kha/internal/CompilerDefinesBuilder.hx index eb8b1a878..a55363903 100644 --- a/Sources/kha/internal/CompilerDefinesBuilder.hx +++ b/Sources/kha/internal/CompilerDefinesBuilder.hx @@ -22,6 +22,7 @@ class CompilerDefinesBuilder { for (k in defines.keys()) { var key = $v{k}; + if (key == "true" || key == "static" || key.indexOf("-") != -1) continue; addField(fields, key, $v{Std.string(defines.get(key))}); } From 9442df7b047060fcd955f737d28fbefc9baa99ac Mon Sep 17 00:00:00 2001 From: RblSb Date: Wed, 28 Aug 2019 17:04:34 +0300 Subject: [PATCH 2/2] Check for invalid defines --- .../kha/internal/CompilerDefinesBuilder.hx | 43 ++++++++++++++++--- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/Sources/kha/internal/CompilerDefinesBuilder.hx b/Sources/kha/internal/CompilerDefinesBuilder.hx index a55363903..cd6cde3d6 100644 --- a/Sources/kha/internal/CompilerDefinesBuilder.hx +++ b/Sources/kha/internal/CompilerDefinesBuilder.hx @@ -15,20 +15,49 @@ class CompilerDefinesBuilder { * * @return Array of class fields. */ - public static macro function build() : Array { - var fields = Context.getBuildFields(); - - var defines = Context.getDefines(); + public static macro function build(): Array { + final fields = Context.getBuildFields(); + final defines = Context.getDefines(); + final added:Map = []; for (k in defines.keys()) { - var key = $v{k}; - if (key == "true" || key == "static" || key.indexOf("-") != -1) continue; + final key = prepareFieldName($v{k}); + if (added[key]) continue; + added[key] = true; addField(fields, key, $v{Std.string(defines.get(key))}); } return fields; } + /** + * Fix wrong field names like keywords. + * + * @param name Field name. + * @return New field name. + */ + static function prepareFieldName(name: String): String { + if (isKeyword(name)) return '_$name'; + name = ~/[^A-z0-9_]/.replace(name, "_"); + if (~/^[0-9]/.match(name)) return '_$name'; + return name; + } + + static final keywords = [ + "function", "class", "static", "var", "if", "else", "while", "do", "for", + "break", "return", "continue", "extends", "implements", "import", + "switch", "case", "default", "public", "private", "try", "untyped", + "catch", "new", "this", "throw", "extern", "enum", "in", "interface", + "cast", "override", "dynamic", "typedef", "package", + "inline", "using", "null", "true", "false", "abstract", "macro", "final", + "operator", "overload" + ]; + + /** Checks for keywords (see `is_valid_identifier` from Haxe) */ + static function isKeyword(name: String): Bool { + return keywords.indexOf(name) != -1; + } + /** * Constructs the structure for defining a class field with public * static visibility, and pushes it to the class fields array. @@ -37,7 +66,7 @@ class CompilerDefinesBuilder { * @param name Field name. * @param value Field value. */ - static function addField(fields : Array, name : String, value : String) : Void { + static function addField(fields: Array, name: String, value: String): Void { fields.push({ name: name, access: [ APublic, AStatic ],