summaryrefslogtreecommitdiffstats
path: root/tools/json_schema_compiler/schema_bundle_generator.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/json_schema_compiler/schema_bundle_generator.py')
-rw-r--r--tools/json_schema_compiler/schema_bundle_generator.py56
1 files changed, 51 insertions, 5 deletions
diff --git a/tools/json_schema_compiler/schema_bundle_generator.py b/tools/json_schema_compiler/schema_bundle_generator.py
index d391ea7..3272be1 100644
--- a/tools/json_schema_compiler/schema_bundle_generator.py
+++ b/tools/json_schema_compiler/schema_bundle_generator.py
@@ -4,6 +4,7 @@
import code
import cpp_util
+from model import Platforms
from schema_util import CapitalizeFirstLetter
from schema_util import JsFunctionNameToClassName
@@ -44,6 +45,20 @@ class SchemaBundleGenerator(object):
c.Append()
return c
+ def _GetPlatformIfdefs(self, model_object):
+ """Generates the "defined" conditional for an #if check if |model_object|
+ has platform restrictions. Returns None if there are no restrictions.
+ """
+ if model_object.platforms is None:
+ return None
+ ifdefs = []
+ for platform in model_object.platforms:
+ if platform == Platforms.CHROMEOS:
+ ifdefs.append('defined(OS_CHROMEOS)')
+ else:
+ raise ValueError("Unsupported platform ifdef: %s" % platform.name)
+ return ' and '.join(ifdefs)
+
def GenerateAPIHeader(self):
"""Generates the header for API registration / declaration"""
c = code.Code()
@@ -53,9 +68,19 @@ class SchemaBundleGenerator(object):
c.Append('#include "base/basictypes.h"')
for namespace in self._model.namespaces.values():
+ ifdefs = self._GetPlatformIfdefs(namespace)
+ if ifdefs is not None:
+ c.Append("#if %s" % ifdefs, indent_level=0)
+
namespace_name = namespace.unix_name.replace("experimental_", "")
- c.Append('#include "chrome/browser/extensions/api/%s/%s_api.h"' % (
- namespace_name, namespace_name))
+ implementation_header = namespace.compiler_options.get(
+ "implemented_in",
+ "chrome/browser/extensions/api/%s/%s_api.h" % (namespace_name,
+ namespace_name))
+ c.Append('#include "%s"' % implementation_header)
+
+ if ifdefs is not None:
+ c.Append("#endif // %s" % ifdefs, indent_level=0)
c.Append()
c.Append("class ExtensionFunctionRegistry;")
@@ -70,20 +95,41 @@ class SchemaBundleGenerator(object):
c.Append()
return self.GenerateHeader('generated_api', c)
+ def _GetNamespaceFunctions(self, namespace):
+ functions = list(namespace.functions.values())
+ if namespace.compiler_options.get("generate_type_functions", False):
+ for type_ in namespace.types.values():
+ functions += list(type_.functions.values())
+ return functions
+
def GenerateFunctionRegistry(self):
c = code.Code()
c.Sblock("class GeneratedFunctionRegistry {")
- c.Append("public:")
+ c.Append(" public:")
c.Sblock("static void RegisterAll(ExtensionFunctionRegistry* registry) {")
for namespace in self._model.namespaces.values():
+ namespace_ifdefs = self._GetPlatformIfdefs(namespace)
+ if namespace_ifdefs is not None:
+ c.Append("#if %s" % namespace_ifdefs, indent_level=0)
+
namespace_name = CapitalizeFirstLetter(namespace.name.replace(
"experimental.", ""))
- for function in namespace.functions.values():
+ for function in self._GetNamespaceFunctions(namespace):
if function.nocompile:
continue
+ function_ifdefs = self._GetPlatformIfdefs(function)
+ if function_ifdefs is not None:
+ c.Append("#if %s" % function_ifdefs, indent_level=0)
+
function_name = JsFunctionNameToClassName(namespace.name, function.name)
c.Append("registry->RegisterFunction<%sFunction>();" % (
function_name))
+
+ if function_ifdefs is not None:
+ c.Append("#endif // %s" % function_ifdefs, indent_level=0)
+
+ if namespace_ifdefs is not None:
+ c.Append("#endif // %s" % namespace_ifdefs, indent_level=0)
c.Eblock("}")
c.Eblock("};")
c.Append()
@@ -100,7 +146,7 @@ class SchemaBundleGenerator(object):
c.Concat(self._cpp_type_generator.GetRootNamespaceStart())
c.Append()
c.Sblock('class GeneratedSchemas {')
- c.Append('public:')
+ c.Append(' public:')
c.Append('// Puts all API schemas in |schemas|.')
c.Append('static void Get('
'std::map<std::string, base::StringPiece>* schemas);')