Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(302)

Side by Side Diff: lib/html/scripts/systemhtml.py

Issue 11018012: Get rid of System class. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 #!/usr/bin/python 1 #!/usr/bin/python
2 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 2 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
3 # for details. All rights reserved. Use of this source code is governed by a 3 # for details. All rights reserved. Use of this source code is governed by a
4 # BSD-style license that can be found in the LICENSE file. 4 # BSD-style license that can be found in the LICENSE file.
5 5
6 """This module provides shared functionality for the system to generate 6 """This module provides shared functionality for the system to generate
7 Dart:html APIs from the IDL database.""" 7 Dart:html APIs from the IDL database."""
8 8
9 import emitter 9 import emitter
10 10
11 from systembase import * 11 from systembase import *
12 from systeminterface import *
13 12
14 _js_custom_members = set([ 13 _js_custom_members = set([
15 'CSSStyleDeclaration.setProperty', 14 'CSSStyleDeclaration.setProperty',
16 'Element.insertAdjacentElement', 15 'Element.insertAdjacentElement',
17 'Element.insertAdjacentHTML', 16 'Element.insertAdjacentHTML',
18 'Element.insertAdjacentText', 17 'Element.insertAdjacentText',
19 'Element.remove', 18 'Element.remove',
20 'ElementEvents.mouseWheel', 19 'ElementEvents.mouseWheel',
21 'IDBDatabase.transaction', 20 'IDBDatabase.transaction',
22 'IFrameElement.contentWindow', 21 'IFrameElement.contentWindow',
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after
374 event_names.add(manual_event_name) 373 event_names.add(manual_event_name)
375 374
376 return sorted(event_names, key=lambda name: _html_event_names[name]) 375 return sorted(event_names, key=lambda name: _html_event_names[name])
377 376
378 def DomToHtmlEvent(event_name): 377 def DomToHtmlEvent(event_name):
379 assert event_name in _html_event_names, \ 378 assert event_name in _html_event_names, \
380 'No known html event name for event: ' + event_name 379 'No known html event name for event: ' + event_name
381 return _html_event_names[event_name] 380 return _html_event_names[event_name]
382 381
383 # ------------------------------------------------------------------------------ 382 # ------------------------------------------------------------------------------
384 class HtmlSystemShared(object): 383 class HtmlSystemShared(object):
Anton Muhin 2012/10/01 13:30:35 this class becomes pretty thin and many of methods
podivilov 2012/10/01 14:49:18 I have another cl to fix this: http://codereview.c
385 384
386 def __init__(self, context): 385 def __init__(self, database):
387 self._event_classes = set() 386 self._event_classes = set()
388 self._seen_event_names = {} 387 self._database = database
389 self._database = context.database
390
391 # TODO(jacobr): this already exists
392 def _TraverseParents(self, interface, callback):
393 for parent in interface.parents:
394 parent_id = parent.type.id
395 if self._database.HasInterface(parent_id):
396 parent_interface = self._database.GetInterface(parent_id)
397 callback(parent_interface)
398 self._TraverseParents(parent_interface, callback)
399 388
400 # TODO(jacobr): this isn't quite right.... 389 # TODO(jacobr): this isn't quite right....
401 def GetParentsEventsClasses(self, interface): 390 def GetParentsEventsClasses(self, interface):
402 # Ugly hack as we don't specify that Document and DocumentFragment inherit 391 # Ugly hack as we don't specify that Document and DocumentFragment inherit
403 # from Element in our IDL. 392 # from Element in our IDL.
404 if interface.id == 'Document' or interface.id == 'DocumentFragment': 393 if interface.id == 'Document' or interface.id == 'DocumentFragment':
405 return ['ElementEvents'] 394 return ['ElementEvents']
406 395
407 interfaces_with_events = set() 396 interfaces_with_events = set()
408 def visit(parent): 397 for parent in self._database.Hierarchy(interface):
409 if parent.id in self._event_classes: 398 if parent != interface and parent.id in self._event_classes:
Anton Muhin 2012/10/01 13:30:35 when parent can equal to some of interface in hiea
podivilov 2012/10/01 14:49:18 database.Hierarchy() includes the interface itself
410 interfaces_with_events.add(parent) 399 interfaces_with_events.add(parent)
411 400
412 self._TraverseParents(interface, visit)
413 if len(interfaces_with_events) == 0: 401 if len(interfaces_with_events) == 0:
414 return ['Events'] 402 return ['Events']
415 else: 403 else:
416 names = [] 404 names = []
417 for interface in interfaces_with_events: 405 for interface in interfaces_with_events:
418 names.append(interface.id + 'Events') 406 names.append(interface.id + 'Events')
419 return names 407 return names
420 408
421 def GetParentEventsClass(self, interface): 409 def GetParentEventsClass(self, interface):
422 parent_event_classes = self.GetParentsEventsClasses(interface) 410 parent_event_classes = self.GetParentsEventsClasses(interface)
423 if len(parent_event_classes) != 1: 411 if len(parent_event_classes) != 1:
424 raise Exception('Only one parent event class allowed ' + interface.id) 412 raise Exception('Only one parent event class allowed ' + interface.id)
425 return parent_event_classes[0] 413 return parent_event_classes[0]
426 414
427 # This returns two values: the first is whether or not an "on" property should 415 # This returns two values: the first is whether or not an "on" property should
428 # be generated for the interface, and the second is the event attributes to 416 # be generated for the interface, and the second is the event attributes to
429 # generate if it should. 417 # generate if it should.
430 def GetEventAttributes(self, interface): 418 def GetEventAttributes(self, interface):
431 events = set([attr for attr in interface.attributes 419 events = set([attr for attr in interface.attributes
432 if attr.type.id == 'EventListener']) 420 if attr.type.id == 'EventListener'])
433 421
434 if events or interface.id in _html_explicit_event_classes: 422 if events or interface.id in _html_explicit_event_classes:
435 return True, events 423 return True, events
436 else: 424 else:
437 return False, None 425 return False, None
438 426
439 def IsPrivate(self, name): 427 def IsPrivate(self, name):
440 return name.startswith('_') 428 return name.startswith('_')
441 429
442
443 class HtmlInterfacesSystem(System):
444 def __init__(self, options, dart_library_generator, backend_factory):
445 super(HtmlInterfacesSystem, self).__init__(options)
446 self._dart_library_generator = dart_library_generator
447 self._backend_factory = backend_factory
448 self._shared = HtmlSystemShared(options)
449 self._elements_factory_emitter = None
450
451 def ProcessInterface(self, interface):
452 backend = self._backend_factory(interface)
453 HtmlDartInterfaceGenerator(self, interface, backend).Generate()
454
455 def _CreateEmitter(self, filename):
456 return self._dart_library_generator.CreateFileEmitter(filename)
457
458 # ------------------------------------------------------------------------------ 430 # ------------------------------------------------------------------------------
459 431
460 class HtmlDartInterfaceGenerator(BaseGenerator): 432 class HtmlDartInterfaceGenerator(BaseGenerator):
461 """Generates dart interface and implementation for the DOM IDL interface.""" 433 """Generates dart interface and implementation for the DOM IDL interface."""
462 434
463 def __init__(self, system, interface, backend): 435 def __init__(self, shared, options, library_emitter, interface, backend):
464 super(HtmlDartInterfaceGenerator, self).__init__( 436 super(HtmlDartInterfaceGenerator, self).__init__(None, None, interface)
465 system._database, system._type_registry, interface) 437 self._renamer = options.renamer
466 self._system = system 438 self._database = options.database
439 self._template_loader = options.templates
440 self._type_registry = options.type_registry
441 self._library_emitter = library_emitter
467 self._backend = backend 442 self._backend = backend
468 self._shared = system._shared 443 self._shared = shared
469 self._html_interface_name = system._renamer.RenameInterface(self._interface) 444 self._html_interface_name = options.renamer.RenameInterface(self._interface)
470 445
471 def GenerateCallback(self, info): 446 def GenerateCallback(self, info):
472 """Generates a typedef for the callback interface.""" 447 """Generates a typedef for the callback interface."""
473 code = self._system._CreateEmitter('%s.dart' % self._interface.id) 448 code = self._library_emitter.FileEmitter(self._interface.id)
474 code.Emit(self._system._templates.Load('callback.darttemplate')) 449 code.Emit(self._template_loader.Load('callback.darttemplate'))
475 code.Emit('typedef $TYPE $NAME($PARAMS);\n', 450 code.Emit('typedef $TYPE $NAME($PARAMS);\n',
476 NAME=self._interface.id, 451 NAME=self._interface.id,
477 TYPE=DartType(info.type_name), 452 TYPE=DartType(info.type_name),
478 PARAMS=info.ParametersImplementationDeclaration(DartType)) 453 PARAMS=info.ParametersImplementationDeclaration(DartType))
479 self._backend.GenerateCallback(info) 454 self._backend.GenerateCallback(info)
480 455
481 def StartInterface(self): 456 def StartInterface(self):
482 if (not self._interface.id in _merged_html_interfaces and 457 if (not self._interface.id in _merged_html_interfaces and
483 # Don't re-generate types that have been converted to native dart types. 458 # Don't re-generate types that have been converted to native dart types.
484 self._html_interface_name not in nativified_classes): 459 self._html_interface_name not in nativified_classes):
485 path = '%s.dart' % self._html_interface_name 460 self._interface_emitter = self._library_emitter.FileEmitter(
486 self._interface_emitter = self._system._CreateEmitter(path) 461 self._html_interface_name)
487 else: 462 else:
488 self._interface_emitter = emitter.Emitter() 463 self._interface_emitter = emitter.Emitter()
489 464
490 template_file = 'interface_%s.darttemplate' % self._html_interface_name 465 template_file = 'interface_%s.darttemplate' % self._html_interface_name
491 interface_template = (self._system._templates.TryLoad(template_file) or 466 interface_template = (self._template_loader.TryLoad(template_file) or
492 self._system._templates.Load('interface.darttemplate') ) 467 self._template_loader.Load('interface.darttemplate'))
493 468
494 typename = self._html_interface_name 469 typename = self._html_interface_name
495 470
496 implements = [] 471 implements = []
497 suppressed_implements = [] 472 suppressed_implements = []
498 473
499 for parent in self._interface.parents: 474 for parent in self._interface.parents:
500 # TODO(vsm): Remove source_filter. 475 # TODO(vsm): Remove source_filter.
501 if MatchSourceFilter(parent): 476 if MatchSourceFilter(parent):
502 # Parent is a DOM type. 477 # Parent is a DOM type.
(...skipping 17 matching lines...) Expand all
520 495
521 factory_provider = None 496 factory_provider = None
522 if typename in interface_factories: 497 if typename in interface_factories:
523 factory_provider = interface_factories[typename] 498 factory_provider = interface_factories[typename]
524 499
525 constructors = [] 500 constructors = []
526 constructor_info = AnalyzeConstructor(self._interface) 501 constructor_info = AnalyzeConstructor(self._interface)
527 if constructor_info: 502 if constructor_info:
528 constructors.append(constructor_info) 503 constructors.append(constructor_info)
529 factory_provider = '_' + typename + 'FactoryProvider' 504 factory_provider = '_' + typename + 'FactoryProvider'
530 factory_provider_emitter = self._system._CreateEmitter( 505 factory_provider_emitter = self._library_emitter.FileEmitter(
531 '_%sFactoryProvider.dart' % self._html_interface_name) 506 '_%sFactoryProvider' % self._html_interface_name)
532 self._backend.EmitFactoryProvider( 507 self._backend.EmitFactoryProvider(
533 constructor_info, factory_provider, factory_provider_emitter) 508 constructor_info, factory_provider, factory_provider_emitter)
534 509
535 infos = HtmlElementConstructorInfos(typename) 510 infos = HtmlElementConstructorInfos(typename)
536 if infos: 511 if infos:
537 if not self._system._elements_factory_emitter: 512 template = self._template_loader.Load(
538 file_emitter = self._system._CreateEmitter('_Elements.dart') 513 'factoryprovider_Elements.darttemplate')
539 template = self._system._templates.Load(
540 'factoryprovider_Elements.darttemplate')
541 self._system._elements_factory_emitter = file_emitter.Emit(template)
542 EmitHtmlElementFactoryConstructors( 514 EmitHtmlElementFactoryConstructors(
543 self._system._elements_factory_emitter, 515 self._library_emitter.FileEmitter('_Elements', template),
544 infos, 516 infos,
545 self._html_interface_name, 517 self._html_interface_name,
546 self._backend.ImplementationClassName()) 518 self._backend.ImplementationClassName())
547 519
548 for info in infos: 520 for info in infos:
549 constructors.append(info.ConstructorInfo(typename)) 521 constructors.append(info.ConstructorInfo(typename))
550 if factory_provider: 522 if factory_provider:
551 assert factory_provider == info.factory_provider_name 523 assert factory_provider == info.factory_provider_name
552 else: 524 else:
553 factory_provider = info.factory_provider_name 525 factory_provider = info.factory_provider_name
554 526
555 # TODO(vsm): Add appropriate package / namespace syntax. 527 # TODO(vsm): Add appropriate package / namespace syntax.
556 (self._type_comment_emitter, 528 (self._type_comment_emitter,
557 self._members_emitter, 529 self._members_emitter,
558 self._top_level_emitter) = self._interface_emitter.Emit( 530 self._top_level_emitter) = self._interface_emitter.Emit(
559 interface_template + '$!TOP_LEVEL', 531 interface_template + '$!TOP_LEVEL',
560 ID=typename, 532 ID=typename,
561 EXTENDS=implements_str) 533 EXTENDS=implements_str)
562 534
563 self._type_comment_emitter.Emit("/// @domName $DOMNAME", 535 self._type_comment_emitter.Emit("/// @domName $DOMNAME",
564 DOMNAME=self._interface.doc_js_name) 536 DOMNAME=self._interface.doc_js_name)
565 537
566 if self._backend.HasImplementation(): 538 if self._backend.HasImplementation():
567 if not self._interface.id in _merged_html_interfaces: 539 if not self._interface.id in _merged_html_interfaces:
568 name = self._html_interface_name 540 name = self._html_interface_name
569 if self._html_interface_name in nativified_classes: 541 if self._html_interface_name in nativified_classes:
570 name = nativified_classes[self._html_interface_name] 542 name = nativified_classes[self._html_interface_name]
571 filename = '%sImpl.dart' % name 543 basename = '%sImpl' % name
572 else: 544 else:
573 filename = '%sImpl_Merged.dart' % self._html_interface_name 545 basename = '%sImpl_Merged' % self._html_interface_name
574 self._implementation_emitter = self._system._CreateEmitter(filename) 546 self._implementation_emitter = self._library_emitter.FileEmitter(basename)
575 else: 547 else:
576 self._implementation_emitter = emitter.Emitter() 548 self._implementation_emitter = emitter.Emitter()
577 self._backend.SetImplementationEmitter(self._implementation_emitter) 549 self._backend.SetImplementationEmitter(self._implementation_emitter)
578 self._implementation_members_emitter = self._backend.StartInterface() 550 self._implementation_members_emitter = self._backend.StartInterface()
579 551
580 for constructor_info in constructors: 552 for constructor_info in constructors:
581 constructor_info.GenerateFactoryInvocation( 553 constructor_info.GenerateFactoryInvocation(
582 self._DartType, self._members_emitter, factory_provider) 554 self._DartType, self._members_emitter, factory_provider)
583 555
584 element_type = MaybeTypedArrayElementTypeInHierarchy( 556 element_type = MaybeTypedArrayElementTypeInHierarchy(
585 self._interface, self._system._database) 557 self._interface, self._database)
586 if element_type: 558 if element_type:
587 self._members_emitter.Emit( 559 self._members_emitter.Emit(
588 '\n' 560 '\n'
589 ' factory $CTOR(int length) =>\n' 561 ' factory $CTOR(int length) =>\n'
590 ' $FACTORY.create$(CTOR)(length);\n' 562 ' $FACTORY.create$(CTOR)(length);\n'
591 '\n' 563 '\n'
592 ' factory $CTOR.fromList(List<$TYPE> list) =>\n' 564 ' factory $CTOR.fromList(List<$TYPE> list) =>\n'
593 ' $FACTORY.create$(CTOR)_fromList(list);\n' 565 ' $FACTORY.create$(CTOR)_fromList(list);\n'
594 '\n' 566 '\n'
595 ' factory $CTOR.fromBuffer(ArrayBuffer buffer, [int byteOffset, int l ength]) => \n' 567 ' factory $CTOR.fromBuffer(ArrayBuffer buffer, [int byteOffset, int l ength]) => \n'
(...skipping 14 matching lines...) Expand all
610 self._backend = old_backend 582 self._backend = old_backend
611 583
612 def AddIndexer(self, element_type): 584 def AddIndexer(self, element_type):
613 self._backend.AddIndexer(element_type) 585 self._backend.AddIndexer(element_type)
614 586
615 def AmendIndexer(self, element_type): 587 def AmendIndexer(self, element_type):
616 self._backend.AmendIndexer(element_type) 588 self._backend.AmendIndexer(element_type)
617 589
618 def AddAttribute(self, attribute, is_secondary=False): 590 def AddAttribute(self, attribute, is_secondary=False):
619 dom_name = DartDomNameOfAttribute(attribute) 591 dom_name = DartDomNameOfAttribute(attribute)
620 html_name = self._system._renamer.RenameMember( 592 html_name = self._renamer.RenameMember(
621 self._interface.id, dom_name, 'get:') 593 self._interface.id, dom_name, 'get:')
622 if not html_name or self._shared.IsPrivate(html_name): 594 if not html_name or self._shared.IsPrivate(html_name):
623 return 595 return
624 596
625 597
626 html_setter_name = self._system._renamer.RenameMember( 598 html_setter_name = self._renamer.RenameMember(
627 self._interface.id, dom_name, 'set:') 599 self._interface.id, dom_name, 'set:')
628 read_only = IsReadOnly(attribute) or not html_setter_name 600 read_only = IsReadOnly(attribute) or not html_setter_name
629 601
630 # We don't yet handle inconsistent renames of the getter and setter yet. 602 # We don't yet handle inconsistent renames of the getter and setter yet.
631 assert(not html_setter_name or html_name == html_setter_name) 603 assert(not html_setter_name or html_name == html_setter_name)
632 604
633 if not is_secondary: 605 if not is_secondary:
634 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */', 606 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */',
635 DOMINTERFACE=attribute.doc_js_interface_name, 607 DOMINTERFACE=attribute.doc_js_interface_name,
636 DOMNAME=dom_name) 608 DOMNAME=dom_name)
(...skipping 11 matching lines...) Expand all
648 def AddSecondaryAttribute(self, interface, attribute): 620 def AddSecondaryAttribute(self, interface, attribute):
649 self._backend.SecondaryContext(interface) 621 self._backend.SecondaryContext(interface)
650 self.AddAttribute(attribute, True) 622 self.AddAttribute(attribute, True)
651 623
652 def AddOperation(self, info, skip_declaration=False): 624 def AddOperation(self, info, skip_declaration=False):
653 """ 625 """
654 Arguments: 626 Arguments:
655 operations - contains the overloads, one or more operations with the same 627 operations - contains the overloads, one or more operations with the same
656 name. 628 name.
657 """ 629 """
658 html_name = self._system._renamer.RenameMember(self._interface.id, info.name ) 630 html_name = self._renamer.RenameMember(self._interface.id, info.name)
659 if not html_name: 631 if not html_name:
660 if info.name == 'item': 632 if info.name == 'item':
661 # FIXME: item should be renamed to operator[], not removed. 633 # FIXME: item should be renamed to operator[], not removed.
662 self._backend.AddOperation(info, '_item') 634 self._backend.AddOperation(info, '_item')
663 return 635 return
664 636
665 if not self._shared.IsPrivate(html_name) and not skip_declaration: 637 if not self._shared.IsPrivate(html_name) and not skip_declaration:
666 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */', 638 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */',
667 DOMINTERFACE=info.overloads[0].doc_js_interface_name, 639 DOMINTERFACE=info.overloads[0].doc_js_interface_name,
668 DOMNAME=info.name) 640 DOMNAME=info.name)
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
713 685
714 self._EmitEventGetter(events_interface, events_class) 686 self._EmitEventGetter(events_interface, events_class)
715 687
716 events_members = self._interface_emitter.Emit( 688 events_members = self._interface_emitter.Emit(
717 '\nabstract class $INTERFACE implements $PARENTS {\n$!MEMBERS}\n', 689 '\nabstract class $INTERFACE implements $PARENTS {\n$!MEMBERS}\n',
718 INTERFACE=events_interface, 690 INTERFACE=events_interface,
719 PARENTS=', '.join( 691 PARENTS=', '.join(
720 self._shared.GetParentsEventsClasses(self._interface))) 692 self._shared.GetParentsEventsClasses(self._interface)))
721 693
722 template_file = 'impl_%s.darttemplate' % events_interface 694 template_file = 'impl_%s.darttemplate' % events_interface
723 template = (self._system._templates.TryLoad(template_file) or 695 template = (self._template_loader.TryLoad(template_file) or
724 '\n' 696 '\n'
725 'class $CLASSNAME extends $SUPER implements $INTERFACE {\n' 697 'class $CLASSNAME extends $SUPER implements $INTERFACE {\n'
726 ' $CLASSNAME(_ptr) : super(_ptr);\n' 698 ' $CLASSNAME(_ptr) : super(_ptr);\n'
727 '$!MEMBERS}\n') 699 '$!MEMBERS}\n')
728 700
729 # TODO(jacobr): specify the type of _ptr as EventTarget 701 # TODO(jacobr): specify the type of _ptr as EventTarget
730 implementation_events_members = self._implementation_emitter.Emit( 702 implementation_events_members = self._implementation_emitter.Emit(
731 template, 703 template,
732 CLASSNAME=events_class, 704 CLASSNAME=events_class,
733 INTERFACE=events_interface, 705 INTERFACE=events_interface,
(...skipping 579 matching lines...) Expand 10 before | Expand all | Expand 10 after
1313 1285
1314 return FindInParent( 1286 return FindInParent(
1315 self._database.GetInterface(parent_interface_name)) 1287 self._database.GetInterface(parent_interface_name))
1316 return (None, None) 1288 return (None, None)
1317 1289
1318 return FindInParent(self._interface) if attr else (None, None) 1290 return FindInParent(self._interface) if attr else (None, None)
1319 1291
1320 # ------------------------------------------------------------------------------ 1292 # ------------------------------------------------------------------------------
1321 1293
1322 class DartLibraryEmitter(): 1294 class DartLibraryEmitter():
1323 def __init__(self, emitters, template, dart_sources_dir): 1295 def __init__(self, multiemitter, template, dart_sources_dir):
1324 self._emitters = emitters 1296 self._multiemitter = multiemitter
1325 self._template = template 1297 self._template = template
1326 self._dart_sources_dir = dart_sources_dir 1298 self._dart_sources_dir = dart_sources_dir
1327 self._dart_sources_list = [] 1299 self._path_to_emitter = {}
1328 1300
1329 def CreateFileEmitter(self, filename): 1301 def FileEmitter(self, basename, template=None):
1330 path = os.path.join(self._dart_sources_dir, filename) 1302 path = os.path.join(self._dart_sources_dir, '%s.dart' % basename)
1331 self._dart_sources_list.append(path) 1303 emitter = self._path_to_emitter.get(path)
1332 return self._emitters.FileEmitter(path) 1304 if not emitter:
Anton Muhin 2012/10/01 13:30:35 emitter is None might be slightly more robust, or
podivilov 2012/10/01 14:49:18 Done.
1305 emitter = self._multiemitter.FileEmitter(path)
1306 if template:
Anton Muhin 2012/10/01 13:30:35 ditto for is None check
podivilov 2012/10/01 14:49:18 Done.
1307 emitter = emitter.Emit(template)
1308 self._path_to_emitter[path] = emitter
1309 return emitter
1333 1310
1334 def EmitLibrary(self, library_file_path, auxiliary_dir): 1311 def EmitLibrary(self, library_file_path, auxiliary_dir):
1335 def massage_path(path): 1312 def massage_path(path):
1336 # The most robust way to emit path separators is to use / always. 1313 # The most robust way to emit path separators is to use / always.
1337 return path.replace('\\', '/') 1314 return path.replace('\\', '/')
1338 1315
1339 library_emitter = self._emitters.FileEmitter(library_file_path) 1316 library_emitter = self._multiemitter.FileEmitter(library_file_path)
1340 library_file_dir = os.path.dirname(library_file_path) 1317 library_file_dir = os.path.dirname(library_file_path)
1341 auxiliary_dir = os.path.relpath(auxiliary_dir, library_file_dir) 1318 auxiliary_dir = os.path.relpath(auxiliary_dir, library_file_dir)
1342 imports_emitter = library_emitter.Emit( 1319 imports_emitter = library_emitter.Emit(
1343 self._template, AUXILIARY_DIR=massage_path(auxiliary_dir)) 1320 self._template, AUXILIARY_DIR=massage_path(auxiliary_dir))
1344 for path in sorted(self._dart_sources_list): 1321 for path in sorted(self._path_to_emitter.keys()):
1345 relpath = os.path.relpath(path, library_file_dir) 1322 relpath = os.path.relpath(path, library_file_dir)
1346 imports_emitter.Emit( 1323 imports_emitter.Emit(
1347 "#source('$PATH');\n", PATH=massage_path(relpath)) 1324 "#source('$PATH');\n", PATH=massage_path(relpath))
OLDNEW
« lib/html/scripts/dartdomgenerator.py ('K') | « lib/html/scripts/systembase.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698