From 292ee6e92c05245e945a274b4849f58e424fe9b1 Mon Sep 17 00:00:00 2001
From: Mark Miller <erights@gmail.com>
Date: Sat, 24 Sep 2011 11:11:24 -0700
Subject: [PATCH] Partial conversion of an older version of convert.js to
 Python.

---
 tools/converter/convert.py | 174 +++++++++++++++++++++++++++++++++++++
 1 file changed, 174 insertions(+)
 create mode 100644 tools/converter/convert.py

diff --git a/tools/converter/convert.py b/tools/converter/convert.py
new file mode 100644
index 0000000000..f4171b9fe5
--- /dev/null
+++ b/tools/converter/convert.py
@@ -0,0 +1,174 @@
+#!/usr/bin/env python
+
+# Copyright 2011 by Google, Inc.  All rights reserved.
+# This code is governed by the BSD license found in the LICENSE file.
+
+# Follows convert.js as closely as possible. So to minimize
+# divergence, see convert.js for doc-comments that are missing here.
+
+
+import logging
+import optparse
+import os
+from os import path
+import platform
+import re
+import subprocess
+import sys
+import tempfile
+import time
+
+# from TestCasePackagerConfig import *
+
+headerPattern = r"(?:(?:\/\/.*)?\s*\n)*"
+captureCommentPattern = r"\/\*\*?((?:\s|\S)*?)\*\/\s*\n"
+anyPattern = r"(?:\s|\S)*"
+blanksPattern = r"(?:\s|\n)*"
+
+# only until we've done our last conversion from current sputnik
+# format to canonical test262 format
+captureStrictPattern = r"\s*('use strict'|\"use strict\");"
+
+# Should match anything
+testEnvelopePattern = r"^(" + headerPattern +
+                      r")(?:" + captureCommentPattern +
+                      r")?(?:" + captureStrictPattern +
+                      r")?(" + anyPattern +
+                      r")$"
+
+registerPattern = r"^(" + anyPattern + r"?)(" +
+                  r"ES5Harness\.registerTest\s*\(\s*\{" + anyPattern +
+                  r"\}\s*\)" + r")" +
+                  r"\s*;?(?:\s|\n)*$"
+
+Matches a named function. Captures both the name and the body.
+captureFuncNameBodyPattern = r"^function\s+(\w*)\(\s*\)\s*\{" +
+                             r"(" + anyPattern + r")" +
+                             r";?" + blanksPattern +
+                             r"\}$"
+
+# captureExprBodyPattern = r"^return\s+" +
+#                          r"(" + anyPattern + r"?)" +
+#                          r";$"
+
+# capturePredicatePattern = r"^if\s+\((.*?)\)\s*\{" + blanksPattern +
+#                           r"return\s+true;?" + blanksPattern +
+#                           r"\}$"
+
+stars = r"\s*\n\s*\*\s?"
+
+atattrs = r"\s*\n\s*\*\s*@"
+
+
+def stripStars(text):
+    return re.sub(stars, '\n', text).strip()
+
+
+def parseTestEnvelope(src, name):
+    envelope = { 'testRecord': {} }
+    envelopeMatch = re.match(testEnvelopePattern, src)
+    if (envelopeMatch == None):
+        raise Exception('unrecognized: ' + name)
+    envelope['header'] = envelopeMatch.group(1).strip()
+    if (envelopeMatch.group(2)):
+        propTexts = re.split(atattrs, envelopeMatch.group(2))
+        envelope['commentary'] = stripStars(propTexts[0])
+        del propTexts[0]
+        for propText in propTexts:
+            # TODO: error check for mismatch
+            propName = re.match(r"^\w+", propText).group(0)
+            propVal = propText[len(propName):]
+
+            # Just till last one-time conversion
+            # strip optional initial colon or final semicolon.
+            # The initial colon is only stripped if it comes immediately
+            # after the identifier with no intervening whitespace.
+            propVal = re.sub(r"^:\s*", '', propVal, 1)
+            propVal = re.sub(r";\s*$", '', propVal, 1)
+            propVal = stripStars(propVal)
+            
+            if (propName in envelope['testRecord']):
+                raise Exception('duplicate: ' + propName)
+            envelope['testRecord'][propName] = propVal;
+    if (envelopeMatch.group(3)):
+        envelope['testRecord']['strict_only'] = '';
+    envelope['rest'] = envelopeMatch.group(4) # do not trim
+
+    # Just till last one time conversion
+    registerMatch = re.match(registerPattern, envelope['rest'])
+    if (registerMatch):
+        envelope['rest'] = registerMatch.group(1).strip()
+        envelope['registerExpr'] = registerMatch.group(2).strip()
+    else if ('ES5Harness.registerTest' in envelope['rest']):
+        raise Exception('Malformed harness? ' + name)
+    return envelope
+
+
+def functionSrcToProgramSrc(funcSrc):
+    cfnbMatch = re.match(captureFuncNameBodyPattern, funcSrc)
+    if (not cfnbMatch):
+        raise Exception('Could not recognize: "' + funcSrc + '"')
+    name = cfnbMatch.group(1).strip()
+    body = cfnbMatch.group(2).strip()
+
+    # Look for special cases
+
+    cebMatch = re.match(captureExprBodyPattern, body)
+    if (cebMatch):
+        return 'assertTruthy(' + cebMatch.group(1).strip() + ');'
+
+    cpMatch = re.match(capturePredicatePattern, body)
+    if (cpMatch):
+        return 'assertTruthy(' + cpMatch.group(1).strip() + ');'
+
+    # General case
+
+    return (funcSrc + '\n' +
+            'runTestCase(' + name + ');')
+
+
+def gatherOne(envelope, name):
+    # TODO(erights): implement by pattern match rather than evaluation
+    raise Exception('gatherOne not implemented yet')
+
+
+def transferProp(record, fromName, toName):
+    if    (((toName not in testRecord) or
+            (testRecord[toName] == '')) and
+           (fromName in testRecord)):
+        testRecord[toName] = testRecord[fromName]
+        del testRecord[fromName]
+
+
+# TODO: new midcap names
+# don't mask collisions -- give errors
+# if unrecognized names remain, give errors
+def normalizeProps(testRecord):
+    if    (('strict_only' not in testRecord) and 
+           ('strict' in testRecord) and
+           (testRecord['strict'] == 1)):
+        testRecord['strict_only'] = ''
+
+    if (testRecord['strict'] == 1):
+        del testRecord['strict']
+
+    if ('strict_mode_negative' in testRecord):
+        if ('strict_only' not in testRecord):
+            testRecord['strict_only'] = ''
+        transferProp(testRecord, 'strict_mode_negative', 'negative')
+
+     transferProp(testRecord, 'errortype', 'negative')
+     transferProp(testRecord, 'assertion', 'description')
+     transferProp(testRecord, 'assertion', 'commentary')
+
+
+def getGlobalScopeRecord(relPath):
+    # TODO(erights): implement
+    raise Exception('getGlobalScopeRecord not implemented yet')
+    
+    
+def parseTestRecord(inBase, relPath, name):
+    nextRelPath = relPath + [name]
+    nextPath = inBase + [name]
+    
+    
-- 
GitLab