diff --git a/Makefile b/Makefile index 273d6a2c55..6ed5a95e77 100644 --- a/Makefile +++ b/Makefile @@ -3,8 +3,9 @@ JSDOC = jsdoc PHANTOMJS = phantomjs PLOVR_JAR = bin/plovr-b254c26318c5.jar SPEC = $(shell find test/spec -name \*.js) -SRC = $(shell find exports externs src/ol -name \*.js) +SRC = $(shell find externs src/ol -name \*.js) INTERNAL_SRC = build/src/internal/src/requireall.js build/src/internal/src/types.js +EXTERNAL_SRC = build/src/external/externs/types.js build/src/external/src/exports.js EXAMPLES = $(shell find examples -maxdepth 1 -name \*.html) comma := , empty := @@ -22,7 +23,7 @@ build: build/ol.css build/ol.js build/ol.css: build/ol.js touch $@ -build/ol.js: $(PLOVR_JAR) $(SRC) base.json build/ol.json build/src/external/externs/types.js +build/ol.js: $(PLOVR_JAR) $(SRC) $(EXTERNAL_SRC) base.json build/ol.json java -jar $(PLOVR_JAR) build build/ol.json >$@ @echo $@ "uncompressed:" $$(wc -c <$@) bytes @echo $@ " compressed:" $$(gzip -9 -c <$@ | wc -c) bytes @@ -37,6 +38,10 @@ build/src/external/externs/types.js: bin/generate-types src/ol/types.txt mkdir -p $(dir $@) bin/generate-types --externs src/ol/types.txt >$@ +build/src/external/src/exports.js: bin/generate-exports src/ol/exports.txt + mkdir -p $(dir $@) + bin/generate-exports src/ol/exports.txt >$@ + build/src/internal/src/requireall.js: bin/generate-requireall $(SRC) mkdir -p $(dir $@) bin/generate-requireall --require=goog.dom src/ol >$@ @@ -70,8 +75,8 @@ serve-precommit: $(PLOVR_JAR) $(INTERNAL_SRC) .PHONY: lint lint: build/lint-src-timestamp build/lint-spec-timestamp -build/lint-src-timestamp: $(SRC) $(INTERNAL_SRC) - gjslint --strict --limited_doc_files=$(subst $(space),$(comma),$(shell find externs -name \*.js)) $(SRC) $(INTERNAL_SRC) $(filter-out $(shell find examples -name \*.combined.js),$(shell find examples -name \*.js)) && touch $@ +build/lint-src-timestamp: $(SRC) $(INTERNAL_SRC) $(EXTERNAL_SRC) + gjslint --strict --limited_doc_files=$(subst $(space),$(comma),$(shell find externs build/src/external/externs -name \*.js)) $(SRC) $(INTERNAL_SRC) $(EXTERNAL_SRC) $(filter-out $(shell find examples -name \*.combined.js),$(shell find examples -name \*.js)) && touch $@ build/lint-spec-timestamp: $(SPEC) gjslint $(SPEC) && touch $@ diff --git a/bin/generate-exports b/bin/generate-exports new file mode 100755 index 0000000000..d2e58a2456 --- /dev/null +++ b/bin/generate-exports @@ -0,0 +1,92 @@ +#!/usr/bin/env python + +from collections import defaultdict +from optparse import OptionParser +import re +import sys + + +class Type(object): + + def __init__(self, name, members=None): + self.name = name + self.namespace = '.'.join(self.name.split('.')[:-1]) or None + self.members = members or {} + + def extern(self): + lines = [] + lines.append('/**\n') + lines.append(' * @interface\n') + lines.append(' */\n') + lines.append('%s = function() {};\n' % (self.name,)) + for key in sorted(self.members.keys()): + lines.append('\n') + lines.append('\n') + lines.append('/**\n') + lines.append(' * @type {%s}\n' % (self.members[key],)) + lines.append(' */\n') + lines.append('%s.prototype.%s;\n' % (self.name, key)) + return ''.join(lines) + + def provide(self): + return 'goog.provide(\'%sType\');\n' % (self.name,) + + def typedef(self): + lines = [] + lines.append('/**\n') + for i, key in enumerate(sorted(self.members.keys())): + prefix = ' * @typedef {{' if i == 0 else ' * ' + suffix = '}}' if i == len(self.members) - 1 else ',' + type = self.members[key] + if '|' in type: + type = '(%s)' % (type,) + lines.append('%s%s: %s%s\n' % (prefix, key, type, suffix)) + lines.append(' */\n') + lines.append('%s;\n' % (self.name,)) + return ''.join(lines) + + +def main(argv): + + option_parser = OptionParser() + options, args = option_parser.parse_args(argv[1:]) + + requires = set() + symbols = set() + properties = defaultdict(set) + for arg in args: + for line in open(arg): + line = line.strip() + if not line: + continue + m = re.match('@exportSymbol\s*(?P\S+)\Z', line) + if m: + requires.add(m.group('symbol')) + symbols.add(m.group('symbol')) + continue + m = re.match('@exportProperty\s*(?P\S+)\Z', line) + if m: + components = m.group('property').split('.') + if components[-2] == 'prototype': + requires.add('.'.join(components[:-2])) + else: + requires.add('.'.join(components[:-1])) + properties['.'.join(components[:-1])].add(components[-1]) + continue + raise RuntimeError(line) + + if requires: + for require in sorted(requires): + sys.stdout.write('goog.require(\'%s\');\n' % (require,)) + sys.stdout.write('\n\n') + for i, obj in enumerate(sorted(symbols | set(properties.keys()))): + if i: + sys.stdout.write('\n') + if obj in symbols: + sys.stdout.write('goog.exportSymbol(\n \'%s\',\n %s);\n' % (obj, obj)) + for prop in properties[obj]: + sys.stdout.write('goog.exportProperty(\n %s,\n \'%s\',\n %s.%s);\n' % (obj, prop, obj, prop)) + + +if __name__ == '__main__': + sys.exit(main(sys.argv)) diff --git a/build/ol.json b/build/ol.json index 36c7de3596..d01dc14bfe 100644 --- a/build/ol.json +++ b/build/ol.json @@ -22,17 +22,7 @@ "inherits": "../base.json", "inputs": [ - "exports/ol/collection.js", - "exports/ol/coordinate.js", - "exports/ol/extent.js", - "exports/ol/layer/tilelayer.js", - "exports/ol/map.js", - "exports/ol/object.js", - "exports/ol/overlay/overlay.js", - "exports/ol/projection.js", - "exports/ol/source/mapquest.js", - "exports/ol/source/openstreetmap.js", - "exports/ol/source/stamen.js" + "build/src/external/src/exports.js" ], "output-wrapper": "(function(){%output%})();", diff --git a/exports/ol/collection.js b/exports/ol/collection.js deleted file mode 100644 index f0a728fc8b..0000000000 --- a/exports/ol/collection.js +++ /dev/null @@ -1,23 +0,0 @@ -goog.require('ol.Collection'); - -goog.exportSymbol('ol.Collection', ol.Collection); -goog.exportProperty(ol.Collection.prototype, - 'clear', ol.Collection.prototype.clear); -goog.exportProperty(ol.Collection.prototype, - 'forEach', ol.Collection.prototype.forEach); -goog.exportProperty(ol.Collection.prototype, - 'getArray', ol.Collection.prototype.getArray); -goog.exportProperty(ol.Collection.prototype, - 'getAt', ol.Collection.prototype.getAt); -goog.exportProperty(ol.Collection.prototype, - 'getLength', ol.Collection.prototype.getLength); -goog.exportProperty(ol.Collection.prototype, - 'insertAt', ol.Collection.prototype.insertAt); -goog.exportProperty(ol.Collection.prototype, - 'pop', ol.Collection.prototype.pop); -goog.exportProperty(ol.Collection.prototype, - 'push', ol.Collection.prototype.push); -goog.exportProperty(ol.Collection.prototype, - 'removeAt', ol.Collection.prototype.removeAt); -goog.exportProperty(ol.Collection.prototype, - 'setAt', ol.Collection.prototype.setAt); diff --git a/exports/ol/coordinate.js b/exports/ol/coordinate.js deleted file mode 100644 index 7b30587e78..0000000000 --- a/exports/ol/coordinate.js +++ /dev/null @@ -1,3 +0,0 @@ -goog.require('ol.Coordinate'); - -goog.exportSymbol('ol.Coordinate', ol.Coordinate); diff --git a/exports/ol/extent.js b/exports/ol/extent.js deleted file mode 100644 index fe264241bc..0000000000 --- a/exports/ol/extent.js +++ /dev/null @@ -1,3 +0,0 @@ -goog.require('ol.Extent'); - -goog.exportSymbol('ol.Extent', ol.Extent); diff --git a/exports/ol/layer/tilelayer.js b/exports/ol/layer/tilelayer.js deleted file mode 100644 index 03ff0d9027..0000000000 --- a/exports/ol/layer/tilelayer.js +++ /dev/null @@ -1,3 +0,0 @@ -goog.require('ol.layer.TileLayer'); - -goog.exportSymbol('ol.layer.TileLayer', ol.layer.TileLayer); diff --git a/exports/ol/map.js b/exports/ol/map.js deleted file mode 100644 index 87284b96ad..0000000000 --- a/exports/ol/map.js +++ /dev/null @@ -1,3 +0,0 @@ -goog.require('ol.Map'); - -goog.exportSymbol('ol.Map', ol.Map); diff --git a/exports/ol/object.js b/exports/ol/object.js deleted file mode 100644 index 4b9fdd7c42..0000000000 --- a/exports/ol/object.js +++ /dev/null @@ -1,21 +0,0 @@ -goog.require('ol.Object'); - -goog.exportSymbol('ol.Object', ol.Object); -goog.exportProperty(ol.Object.prototype, - 'bindTo', ol.Object.prototype.bindTo); -goog.exportProperty(ol.Object.prototype, - 'changed', ol.Object.prototype.changed); -goog.exportProperty(ol.Object.prototype, - 'get', ol.Object.prototype.get); -goog.exportProperty(ol.Object.prototype, - 'notify', ol.Object.prototype.notify); -goog.exportProperty(ol.Object.prototype, - 'set', ol.Object.prototype.set); -goog.exportProperty(ol.Object.prototype, - 'setOptions', ol.Object.prototype.setOptions); -goog.exportProperty(ol.Object.prototype, - 'setValues', ol.Object.prototype.setValues); -goog.exportProperty(ol.Object.prototype, - 'unbind', ol.Object.prototype.unbind); -goog.exportProperty(ol.Object.prototype, - 'unbindAll', ol.Object.prototype.unbindAll); diff --git a/exports/ol/overlay/overlay.js b/exports/ol/overlay/overlay.js deleted file mode 100644 index 7827ab64b7..0000000000 --- a/exports/ol/overlay/overlay.js +++ /dev/null @@ -1,3 +0,0 @@ -goog.require('ol.overlay.Overlay'); - -goog.exportSymbol('ol.overlay.Overlay', ol.overlay.Overlay); diff --git a/exports/ol/projection.js b/exports/ol/projection.js deleted file mode 100644 index 4a40d2e184..0000000000 --- a/exports/ol/projection.js +++ /dev/null @@ -1,19 +0,0 @@ -goog.require('ol.Projection'); - -goog.exportSymbol('ol.Projection', ol.Projection); -goog.exportProperty(ol.Projection, - 'getFromCode', ol.Projection.getFromCode); -goog.exportProperty(ol.Projection, - 'getTransform', ol.Projection.getTransform); -goog.exportProperty(ol.Projection, - 'getTransformFromCodes', ol.Projection.getTransformFromCodes); -goog.exportProperty(ol.Projection, - 'transform', ol.Projection.transform); -goog.exportProperty(ol.Projection, - 'transformWithCodes', ol.Projection.transformWithCodes); -goog.exportProperty(ol.Projection.prototype, - 'getCode', ol.Projection.prototype.getCode); -goog.exportProperty(ol.Projection.prototype, - 'getExtent', ol.Projection.prototype.getExtent); -goog.exportProperty(ol.Projection.prototype, - 'getUnits', ol.Projection.prototype.getUnits); diff --git a/exports/ol/source/bingmaps.js b/exports/ol/source/bingmaps.js deleted file mode 100644 index 2ae79e68f7..0000000000 --- a/exports/ol/source/bingmaps.js +++ /dev/null @@ -1,3 +0,0 @@ -goog.require('ol.source.BingMaps'); - -goog.exportSymbol('ol.source.BingMaps', ol.source.BingMaps); diff --git a/exports/ol/source/mapquest.js b/exports/ol/source/mapquest.js deleted file mode 100644 index c1ae03cabc..0000000000 --- a/exports/ol/source/mapquest.js +++ /dev/null @@ -1,5 +0,0 @@ -goog.require('ol.source.MapQuestOSM'); -goog.require('ol.source.MapQuestOpenAerial'); - -goog.exportSymbol('ol.source.MapQuestOSM', ol.source.MapQuestOSM); -goog.exportSymbol('ol.source.MapQuestOpenAerial', ol.source.MapQuestOpenAerial); diff --git a/exports/ol/source/openstreetmap.js b/exports/ol/source/openstreetmap.js deleted file mode 100644 index efb5b6d43a..0000000000 --- a/exports/ol/source/openstreetmap.js +++ /dev/null @@ -1,3 +0,0 @@ -goog.require('ol.source.OpenStreetMap'); - -goog.exportSymbol('ol.source.OpenStreetMap', ol.source.OpenStreetMap); diff --git a/exports/ol/source/stamen.js b/exports/ol/source/stamen.js deleted file mode 100644 index 139103c1a8..0000000000 --- a/exports/ol/source/stamen.js +++ /dev/null @@ -1,3 +0,0 @@ -goog.require('ol.source.Stamen'); - -goog.exportSymbol('ol.source.Stamen', ol.source.Stamen); diff --git a/exports/ol/source/tilejson.js b/exports/ol/source/tilejson.js deleted file mode 100644 index f02e84fbad..0000000000 --- a/exports/ol/source/tilejson.js +++ /dev/null @@ -1,3 +0,0 @@ -goog.require('ol.source.TileJSON'); - -goog.exportSymbol('ol.source.TileJSON', ol.source.TileJSON); diff --git a/src/ol/exports.txt b/src/ol/exports.txt new file mode 100644 index 0000000000..46aaf766e3 --- /dev/null +++ b/src/ol/exports.txt @@ -0,0 +1,53 @@ +@exportSymbol ol.Collection +@exportProperty ol.Collection.prototype.clear +@exportProperty ol.Collection.prototype.forEach +@exportProperty ol.Collection.prototype.getArray +@exportProperty ol.Collection.prototype.getAt +@exportProperty ol.Collection.prototype.getLength +@exportProperty ol.Collection.prototype.insertAt +@exportProperty ol.Collection.prototype.pop +@exportProperty ol.Collection.prototype.push +@exportProperty ol.Collection.prototype.removeAt +@exportProperty ol.Collection.prototype.setAt + +@exportSymbol ol.Coordinate + +@exportSymbol ol.Extent + +@exportSymbol ol.Map + +@exportSymbol ol.Object +@exportProperty ol.Object.prototype.bindTo +@exportProperty ol.Object.prototype.changed +@exportProperty ol.Object.prototype.get +@exportProperty ol.Object.prototype.notify +@exportProperty ol.Object.prototype.set +@exportProperty ol.Object.prototype.setOptions +@exportProperty ol.Object.prototype.setValues +@exportProperty ol.Object.prototype.unbind +@exportProperty ol.Object.prototype.unbindAll + +@exportSymbol ol.Projection +@exportProperty ol.Projection.getFromCode +@exportProperty ol.Projection.getTransform +@exportProperty ol.Projection.getTransformFromCodes +@exportProperty ol.Projection.transform +@exportProperty ol.Projection.prototype.getCode +@exportProperty ol.Projection.prototype.getExtent +@exportProperty ol.Projection.prototype.getUnits + +@exportSymbol ol.layer.TileLayer + +@exportSymbol ol.overlay.Overlay + +@exportSymbol ol.source.BingMaps + +@exportSymbol ol.source.MapQuestOSM + +@exportSymbol ol.source.MapQuestOpenAerial + +@exportSymbol ol.source.OpenStreetMap + +@exportSymbol ol.source.Stamen + +@exportSymbol ol.source.TileJSON