Auto merge of #12451 - jdm:generate-dom-apis, r=Ms2ger

Generate a list of supported DOM APIs from parsed WebIDLs.

Supplement the existing list of supported CSS properties with an equivalent list of DOM APIs.

---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: -->
- [X] `./mach build -d` does not report any errors
- [X] `./mach test-tidy` does not report any errors
- [X] These changes do not require tests because automatic generated documentation

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/12451)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2016-07-15 15:13:22 -07:00 committed by GitHub
commit 73ad0b928d
9 changed files with 113 additions and 12 deletions

View file

@ -8,6 +8,7 @@ from collections import defaultdict
from itertools import groupby
import operator
import os
import re
import string
import textwrap
@ -6437,3 +6438,36 @@ impl %(base)s {
# Done.
return curr
@staticmethod
def SupportedDomApis(config):
descriptors = config.getDescriptors(isExposedConditionally=False)
base_path = os.path.join('dom', 'bindings', 'codegen')
with open(os.path.join(base_path, 'apis.html.template')) as f:
base_template = f.read()
with open(os.path.join(base_path, 'api.html.template')) as f:
api_template = f.read()
with open(os.path.join(base_path, 'property.html.template')) as f:
property_template = f.read()
with open(os.path.join(base_path, 'interface.html.template')) as f:
interface_template = f.read()
apis = []
interfaces = []
for descriptor in descriptors:
props = []
for m in descriptor.interface.members:
if PropertyDefiner.getStringAttr(m, 'Pref') or \
PropertyDefiner.getStringAttr(m, 'Func') or \
(m.isMethod() and m.isIdentifierLess()):
continue
display = m.identifier.name + ('()' if m.isMethod() else '')
props += [property_template.replace('${name}', display)]
name = descriptor.interface.identifier.name
apis += [(api_template.replace('${interface}', name)
.replace('${properties}', '\n'.join(props)))]
interfaces += [interface_template.replace('${interface}', name)]
return CGGeneric((base_template.replace('${apis}', '\n'.join(apis))
.replace('${interfaces}', '\n'.join(interfaces))))

View file

@ -87,6 +87,8 @@ class Configuration:
getter = lambda x: x.interface.isJSImplemented()
elif key == 'isGlobal':
getter = lambda x: x.isGlobal()
elif key == 'isExposedConditionally':
getter = lambda x: x.interface.isExposedConditionally()
else:
getter = lambda x: getattr(x, key)
curr = filter(lambda x: getter(x) == val, curr)

View file

@ -32,6 +32,8 @@ def main():
o = OptionParser(usage=usageString)
o.add_option("--cachedir", dest='cachedir', default=None,
help="Directory in which to cache lex/parse tables.")
o.add_option("--only-html", dest='only_html', action="store_true",
help="Only generate HTML from WebIDL inputs")
(options, args) = o.parse_args()
if len(args) < 2:
@ -51,24 +53,30 @@ def main():
parser.parse(''.join(lines), fullPath)
parserResults = parser.finish()
# Write the parser results out to a pickle.
resultsPath = os.path.join(outputdir, 'ParserResults.pkl')
with open(resultsPath, 'wb') as resultsFile:
cPickle.dump(parserResults, resultsFile, -1)
if not options.only_html:
# Write the parser results out to a pickle.
resultsPath = os.path.join(outputdir, 'ParserResults.pkl')
with open(resultsPath, 'wb') as resultsFile:
cPickle.dump(parserResults, resultsFile, -1)
# Load the configuration.
config = Configuration(configFile, parserResults)
to_generate = [
('PrototypeList', 'PrototypeList.rs'),
('RegisterBindings', 'RegisterBindings.rs'),
('InterfaceObjectMap', 'InterfaceObjectMap.rs'),
('InterfaceTypes', 'InterfaceTypes.rs'),
('InheritTypes', 'InheritTypes.rs'),
('Bindings', os.path.join('Bindings', 'mod.rs')),
('UnionTypes', 'UnionTypes.rs'),
('SupportedDomApis', 'apis.html'),
]
if not options.only_html:
to_generate = [
('PrototypeList', 'PrototypeList.rs'),
('RegisterBindings', 'RegisterBindings.rs'),
('InterfaceObjectMap', 'InterfaceObjectMap.rs'),
('InterfaceTypes', 'InterfaceTypes.rs'),
('InheritTypes', 'InheritTypes.rs'),
('Bindings', os.path.join('Bindings', 'mod.rs')),
('UnionTypes', 'UnionTypes.rs'),
]
for name, filename in to_generate:
generate_file(config, name, os.path.join(outputdir, filename))

View file

@ -0,0 +1,6 @@
<table id="${interface}">
<tr>
<th>${interface}</th>
</tr>
${properties}
</table>

View file

@ -0,0 +1,35 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="rustdoc">
<meta name="description" content="API documentation for the Rust `servo` crate.">
<meta name="keywords" content="rust, rustlang, rust-lang, servo">
<title>Supported DOM APIs - servo - Rust</title>
<link rel="stylesheet" type="text/css" href="../rustdoc.css">
<link rel="stylesheet" type="text/css" href="../main.css">
</head>
<body class="rustdoc">
<!--[if lte IE 8]>
<div class="warning">
This old browser is unsupported and will most likely display funky
things.
</div>
<![endif]-->
<nav class='sidebar'>
<div class='block crate'>
<h3>Interfaces</h3>
<ul>
${interfaces}
</ul>
</div>
</nav>
<section id='main' class="content mod">
<h1 class='fqn'><span class='in-band'>DOM APIs currently supported in <a class='mod' href=''>Servo</a></span></h1>
<div id='properties' class='docblock'>
${apis}
</div>
</section>
</body>
</html>

View file

@ -0,0 +1 @@
<li><a href="#${interface}">${interface}</a></li>

View file

@ -0,0 +1,3 @@
<tr>
<td>${name}</td>
</tr>

View file

@ -18,7 +18,7 @@ bindinggen_dependencies := $(addprefix $(BINDINGS_SRC)/,BindingGen.py Bindings.c
globalgen_dependencies := $(addprefix $(BINDINGS_SRC)/,GlobalGen.py Bindings.conf Configuration.py CodegenRust.py parser/WebIDL.py) $(CACHE_DIR)/.done $(OUT_DIR)/Bindings/.done
.PHONY: all
.PHONY: all dom_docs
all: $(AUTOGEN_SRC)
$(OUT_DIR)/Bindings/.done:
@ -38,6 +38,16 @@ $(OUT_DIR)/ParserResults.pkl: $(globalgen_dependencies) $(WEBIDLS)
. \
$(WEBIDLS)
dom_docs: $(CACHE_DIR)/.done
$(PYTHON) \
$(BINDINGS_SRC)/GlobalGen.py \
--cachedir=$(CACHE_DIR) \
--only-html \
$(BINDINGS_SRC)/Bindings.conf \
$(OUT_DIR) \
. \
$(WEBIDLS)
$(AUTOGEN_SRC): $(OUT_DIR)/Bindings/%Binding.rs: $(bindinggen_dependencies) \
$(addprefix $(WEBIDLS_SRC)/,%.webidl)
$(PYTHON) \

View file

@ -16,5 +16,7 @@ cp etc/doc.servo.org/* target/doc/
python components/style/properties/build.py servo html
OUT_DIR="`pwd`/target/doc" make -f makefile.cargo -C components/script dom_docs
ghp-import -n target/doc
git push -qf "https://${TOKEN}@github.com/servo/doc.servo.org.git" gh-pages