diff options
author | New Tobin Paradigm <email@mattatobin.com> | 2020-01-26 17:13:16 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-01-26 17:13:16 -0500 |
commit | 22ed46f7cca6d388e7e9e2bf53851ab488cc62ab (patch) | |
tree | fb5b7a509abe61a05bf6f3f88371271be4e5ccaa /parser/html/java/htmlparser/translator-src | |
parent | a1cce3b2b00bbd9f4983013ddd8934a7bccb9e99 (diff) | |
parent | 3c70b297c7be12b7d7e120de04a38f40b600928b (diff) | |
download | UXP-22ed46f7cca6d388e7e9e2bf53851ab488cc62ab.tar UXP-22ed46f7cca6d388e7e9e2bf53851ab488cc62ab.tar.gz UXP-22ed46f7cca6d388e7e9e2bf53851ab488cc62ab.tar.lz UXP-22ed46f7cca6d388e7e9e2bf53851ab488cc62ab.tar.xz UXP-22ed46f7cca6d388e7e9e2bf53851ab488cc62ab.zip |
Merge pull request #1374 from g4jc/custom_elementsv1
Custom Elements v1
Diffstat (limited to 'parser/html/java/htmlparser/translator-src')
6 files changed, 116 insertions, 96 deletions
diff --git a/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/AnnotationHelperVisitor.java b/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/AnnotationHelperVisitor.java index 337394a89..432f08b90 100644 --- a/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/AnnotationHelperVisitor.java +++ b/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/AnnotationHelperVisitor.java @@ -72,6 +72,10 @@ public class AnnotationHelperVisitor<T> extends VoidVisitorAdapter<T> { return hasAnnotation("NoLength"); } + protected boolean unsigned() { + return hasAnnotation("Unsigned"); + } + protected boolean auto() { return hasAnnotation("Auto"); } @@ -88,6 +92,18 @@ public class AnnotationHelperVisitor<T> extends VoidVisitorAdapter<T> { return hasAnnotation("CharacterName"); } + protected boolean creator() { + return hasAnnotation("Creator"); + } + + protected boolean htmlCreator() { + return hasAnnotation("HtmlCreator"); + } + + protected boolean svgCreator() { + return hasAnnotation("SvgCreator"); + } + private boolean hasAnnotation(String anno) { if (currentAnnotations == null) { return false; diff --git a/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/CppTypes.java b/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/CppTypes.java index 80216da0e..963d1ac68 100644 --- a/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/CppTypes.java +++ b/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/CppTypes.java @@ -117,7 +117,8 @@ public class CppTypes { "nsHtml5String", "nsNameSpaceManager", "nsIContent", "nsTraceRefcnt", "jArray", "nsHtml5ArrayCopy", "nsAHtml5TreeBuilderState", "nsHtml5Atoms", "nsHtml5ByteReadable", "nsIUnicodeDecoder", - "nsHtml5Macros", "nsIContentHandle" }; + "nsHtml5Macros", "nsIContentHandle", "nsHtml5Portability", + "nsHtml5ContentCreatorFunction"}; private static final String[] OTHER_DECLATIONS = {}; @@ -192,6 +193,10 @@ public class CppTypes { return "int32_t"; } + public String unsignedIntType() { + return "uint32_t"; + } + public String stringType() { return "nsHtml5String"; } @@ -228,6 +233,18 @@ public class CppTypes { return "nsIContentHandle*"; } + public String htmlCreatorType() { + return "mozilla::dom::HTMLContentCreatorFunction"; + } + + public String svgCreatorType() { + return "mozilla::dom::SVGContentCreatorFunction"; + } + + public String creatorType() { + return "nsHtml5ContentCreatorFunction"; + } + public String xhtmlNamespaceLiteral() { return "kNameSpaceID_XHTML"; } diff --git a/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/CppVisitor.java b/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/CppVisitor.java index f4f00070a..a97a9eba1 100644 --- a/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/CppVisitor.java +++ b/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/CppVisitor.java @@ -331,13 +331,7 @@ public class CppVisitor extends AnnotationHelperVisitor<LocalSymbolTable> { } else if ("errorHandler".equals(n.getName())) { printer.print(cppTypes.errorHandler()); } else { - String prefixedName = javaClassName + "." + n.getName(); - String constant = symbolTable.cppDefinesByJavaNames.get(prefixedName); - if (constant != null) { - printer.print(constant); - } else { - printer.print(n.getName()); - } + printer.print(n.getName()); } } @@ -448,14 +442,6 @@ public class CppVisitor extends AnnotationHelperVisitor<LocalSymbolTable> { printer.print("#include \""); printer.print(className); printer.printLn(".h\""); - if ("AttributeName".equals(javaClassName) - || "ElementName".equals(javaClassName)) { - printer.print("#include \""); - printer.print(cppTypes.classPrefix()); - printer.print("Releasable"); - printer.print(javaClassName); - printer.printLn(".h\""); - } printer.printLn(); } @@ -494,7 +480,15 @@ public class CppVisitor extends AnnotationHelperVisitor<LocalSymbolTable> { name = cppTypes.stringType(); } } else if ("T".equals(name) || "Object".equals(name)) { - name = cppTypes.nodeType(); + if (htmlCreator()) { + name = cppTypes.htmlCreatorType(); + } else if (svgCreator()) { + name = cppTypes.svgCreatorType(); + } else if (creator()) { + name = cppTypes.creatorType(); + } else { + name = cppTypes.nodeType(); + } } else if ("TokenHandler".equals(name)) { name = cppTypes.classPrefix() + "TreeBuilder*"; } else if ("EncodingDeclarationHandler".equals(name)) { @@ -548,7 +542,11 @@ public class CppVisitor extends AnnotationHelperVisitor<LocalSymbolTable> { case Float: throw new IllegalStateException("Unsupported primitive."); case Int: - printer.print(cppTypes.intType()); + if (unsigned()) { + printer.print(cppTypes.unsignedIntType()); + } else { + printer.print(cppTypes.intType()); + } break; case Long: throw new IllegalStateException("Unsupported primitive."); @@ -740,10 +738,14 @@ public class CppVisitor extends AnnotationHelperVisitor<LocalSymbolTable> { printer.print(" "); printer.print(className); printer.print("::"); - if ("AttributeName".equals(n.getType().toString())) { - printer.print("ATTR_"); - } else if ("ElementName".equals(n.getType().toString())) { - printer.print("ELT_"); + String clazzName = n.getType().toString(); + String field = declarator.getId().toString(); + if (symbolTable.isAttributeOrElementName(clazzName, field)) { + if ("AttributeName".equals(clazzName)) { + printer.print("ATTR_"); + } else if ("ElementName".equals(clazzName)) { + printer.print("ELT_"); + } } declarator.getId().accept(this, arg); printer.print(" = "); @@ -1079,26 +1081,22 @@ public class CppVisitor extends AnnotationHelperVisitor<LocalSymbolTable> { if ("DocumentMode".equals(scope.toString())) { // printer.print(cppTypes.documentModeType()); // printer.print("."); + } else if ("creator".equals(scope.toString()) || "this.creator".equals(scope.toString())) { + scope.accept(this, arg); + printer.print("."); } else { scope.accept(this, arg); printer.print("->"); } } else { - String prefixedName = clazzName + "." + field; - String constant = symbolTable.cppDefinesByJavaNames.get(prefixedName); - if (constant != null) { - printer.print(constant); - return; - } else { - printer.print(cppTypes.classPrefix()); - printer.print(clazzName); - printer.print("::"); - if (symbolTable.isNotAnAttributeOrElementName(field)) { - if ("AttributeName".equals(clazzName)) { - printer.print("ATTR_"); - } else if ("ElementName".equals(clazzName)) { - printer.print("ELT_"); - } + printer.print(cppTypes.classPrefix()); + printer.print(clazzName); + printer.print("::"); + if (symbolTable.isAttributeOrElementName(clazzName, field)) { + if ("AttributeName".equals(clazzName)) { + printer.print("ATTR_"); + } else if ("ElementName".equals(clazzName)) { + printer.print("ELT_"); } } } @@ -1337,7 +1335,8 @@ public class CppVisitor extends AnnotationHelperVisitor<LocalSymbolTable> { if (clazzName == null) { scope.accept(this, arg); if ("length".equals(n.getName()) - || "charAt".equals(n.getName())) { + || "charAt".equals(n.getName()) + || "creator".equals(scope.toString())) { printer.print("."); } else { printer.print("->"); @@ -1383,19 +1382,12 @@ public class CppVisitor extends AnnotationHelperVisitor<LocalSymbolTable> { suppressPointer = true; printTypeArgs(n.getTypeArgs(), arg); - if ("createAttributeName".equals(currentMethod) - || "elementNameByBuffer".equals(currentMethod)) { - printer.print(cppTypes.classPrefix()); - printer.print("Releasable"); - printer.print(n.getType().getName()); - } else { - n.getType().accept(this, arg); - } + n.getType().accept(this, arg); suppressPointer = false; if ("AttributeName".equals(n.getType().getName())) { List<Expression> args = n.getArgs(); - while (args.size() > 3) { + while (args != null && args.size() > 3) { args.remove(3); } } diff --git a/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/HVisitor.java b/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/HVisitor.java index 25cf7aef1..902eb348a 100644 --- a/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/HVisitor.java +++ b/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/HVisitor.java @@ -37,7 +37,6 @@ package nu.validator.htmlparser.cpptranslate; -import java.util.LinkedList; import java.util.List; import japa.parser.ast.body.FieldDeclaration; @@ -45,12 +44,9 @@ import japa.parser.ast.body.MethodDeclaration; import japa.parser.ast.body.ModifierSet; import japa.parser.ast.body.Parameter; import japa.parser.ast.body.VariableDeclarator; -import japa.parser.ast.expr.IntegerLiteralExpr; -import japa.parser.ast.expr.MethodCallExpr; import japa.parser.ast.stmt.BlockStmt; import japa.parser.ast.type.PrimitiveType; import japa.parser.ast.type.ReferenceType; -import japa.parser.ast.type.Type; public class HVisitor extends CppVisitor { @@ -60,8 +56,6 @@ public class HVisitor extends CppVisitor { private Visibility previousVisibility = Visibility.NONE; - private List<String> defines = new LinkedList<String>(); - /** * @see nu.validator.htmlparser.cpptranslate.CppVisitor#printMethodNamespace() */ @@ -145,10 +139,10 @@ public class HVisitor extends CppVisitor { */ @Override protected void endClassDeclaration() { printModifiers(ModifierSet.PUBLIC | ModifierSet.STATIC); - printer.printLn("void initializeStatics();"); + printer.printLn("void initializeStatics();"); printModifiers(ModifierSet.PUBLIC | ModifierSet.STATIC); - printer.printLn("void releaseStatics();"); - + printer.printLn("void releaseStatics();"); + printer.unindent(); printer.unindent(); @@ -161,13 +155,6 @@ public class HVisitor extends CppVisitor { printer.printLn("};"); printer.printLn(); - - for (String define : defines) { - printer.printLn(define); - } - - printer.printLn(); - printer.printLn(); printer.printLn("#endif"); } @@ -226,18 +213,16 @@ public class HVisitor extends CppVisitor { throw new IllegalStateException( "More than one variable declared by one declarator."); } - String name = javaClassName + "." + declarator.getId().getName(); - String value = declarator.getInit().toString(); - if ("Integer.MAX_VALUE".equals(value)) { - value = cppTypes.maxInteger(); - } - String longName = definePrefix + declarator.getId().getName(); - if (symbolTable.cppDefinesByJavaNames.containsKey(name)) { - throw new IllegalStateException( - "Duplicate #define constant local name: " + name); - } - symbolTable.cppDefinesByJavaNames.put(name, longName); - defines.add("#define " + longName + " " + value); + printModifiers(modifiers); + printer.print("const "); + n.getType().accept(this, arg); + printer.print(" "); + declarator.getId().accept(this, arg); + printer.print(" = "); + declarator.getInit().accept(this, arg); + printer.printLn(";"); + printer.printLn(); + symbolTable.addPrimitiveConstant(javaClassName, declarator.getId().toString()); } else { if (n.getType() instanceof ReferenceType) { ReferenceType rt = (ReferenceType) n.getType(); diff --git a/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/Main.java b/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/Main.java index 53347bd42..307d7d8a6 100644 --- a/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/Main.java +++ b/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/Main.java @@ -37,28 +37,26 @@ package nu.validator.htmlparser.cpptranslate; -import japa.parser.JavaParser; -import japa.parser.ParseException; -import japa.parser.ast.CompilationUnit; - import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; +import japa.parser.JavaParser; +import japa.parser.ParseException; +import japa.parser.ast.CompilationUnit; + public class Main { static final String[] H_LIST = { + "AttributeName", + "ElementName", "Tokenizer", "TreeBuilder", "MetaScanner", - "AttributeName", - "ElementName", - "HtmlAttributes", "StackNode", "UTF16Buffer", "StateSnapshot", @@ -66,12 +64,11 @@ public class Main { }; private static final String[] CPP_LIST = { + "AttributeName", + "ElementName", "Tokenizer", "TreeBuilder", "MetaScanner", - "AttributeName", - "ElementName", - "HtmlAttributes", "StackNode", "UTF16Buffer", "StateSnapshot", diff --git a/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/SymbolTable.java b/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/SymbolTable.java index 970a2b64b..3619c923a 100644 --- a/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/SymbolTable.java +++ b/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/SymbolTable.java @@ -38,11 +38,13 @@ package nu.validator.htmlparser.cpptranslate; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; public class SymbolTable { - public final Map<String, String> cppDefinesByJavaNames = new HashMap<String, String>(); + private final Set<StringPair> primitiveConstants = new HashSet<StringPair>(); private final Map<StringPair, Type> fields = new HashMap<StringPair, Type>(); @@ -51,17 +53,24 @@ public class SymbolTable { /** * This is a sad hack to work around the fact the there's no real symbol * table yet. - * - * @param name + * + * @param field * @return */ - public boolean isNotAnAttributeOrElementName(String name) { - return !("ATTRIBUTE_HASHES".equals(name) - || "ATTRIBUTE_NAMES".equals(name) - || "ELEMENT_HASHES".equals(name) - || "ELEMENT_NAMES".equals(name) || "ALL_NO_NS".equals(name)); + public boolean isAttributeOrElementName(String klazz, String field) { + if (isPrimitiveConstant(klazz, field)) { + return false; + } + return !("ATTRIBUTE_HASHES".equals(field) + || "ATTRIBUTE_NAMES".equals(field) + || "ELEMENT_HASHES".equals(field) + || "ELEMENT_NAMES".equals(field) || "ALL_NO_NS".equals(field)); } - + + public void addPrimitiveConstant(String klazz, String field) { + primitiveConstants.add(new StringPair(klazz, field)); + } + public void putFieldType(String klazz, String field, Type type) { fields.put(new StringPair(klazz, field), type); } @@ -69,7 +78,11 @@ public class SymbolTable { public void putMethodReturnType(String klazz, String method, Type type) { methodReturns.put(new StringPair(klazz, method), type); } - + + public boolean isPrimitiveConstant(String klazz, String field) { + return primitiveConstants.contains(new StringPair(klazz, field)); + } + public Type getFieldType(String klazz, String field) { return fields.get(new StringPair(klazz, field)); } |