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

Side by Side Diff: third_party/WebKit/Source/devtools/scripts/dependency_preprocessor.py

Issue 2588843002: DevTools: speed up closure dependency checking (Closed)
Patch Set: fix Created 3 years, 11 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
OLDNEW
(Empty)
1 # Copyright 2016 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
4
5 import codecs
6 import multiprocessing
7 from os import path
8 import re
9 import shutil
10
11 try:
12 import simplejson as json
13 except ImportError:
14 import json
15
16 special_case_namespaces_path = path.join(path.dirname(path.abspath(__file__)), ' special_case_namespaces.json')
17
18
19 class DependencyPreprocessor(object):
20
21 def __init__(self, descriptors, temp_frontend_path, devtools_frontend_path):
22 self.descriptors = descriptors
23 self.temp_frontend_path = temp_frontend_path
24 self.module_descriptors = descriptors.modules
25 self.modules = set(self.descriptors.sorted_modules())
26 shutil.copytree(devtools_frontend_path, self.temp_frontend_path)
27 with open(special_case_namespaces_path) as json_file:
28 self._special_case_namespaces = json.load(json_file)
29
30 def enforce_dependencies(self):
31 arg_list = []
32 for module in self.modules:
33 dependencies = set(self.descriptors.sorted_dependencies_closure(modu le))
34 excluded_modules = self.modules - {module} - dependencies - self._tr ansitive_implicit_dependencies(module)
35 excluded_namespaces = [self._map_module_to_namespace(m) for m in exc luded_modules]
36 file_paths = [path.join(self.temp_frontend_path, module, file_name)
37 for file_name in self.descriptors.module_compiled_file s(module)]
38 arg = {
39 'excluded_namespaces': excluded_namespaces,
40 'file_paths': file_paths,
41 }
42 arg_list.append(arg)
43 parallelize(poison_module, arg_list)
44
45 def _transitive_implicit_dependencies(self, module):
46 """Finds implicit dependencies for workers (which include single files f rom other modules)"""
47 explicit_dependencies = self.descriptors.sorted_dependencies_closure(mod ule)
48 implicit_dependencies = set()
49 for explicit_dependency in explicit_dependencies:
50 implicit_dependencies |= self._implicit_dependencies_for_module(expl icit_dependency)
51 return implicit_dependencies
52
53 def _implicit_dependencies_for_module(self, module):
54 implicit_dependencies = set()
55 for module_file in self.descriptors.module_compiled_files(module):
56 if "../" in module_file:
57 components = module_file.split('/')
58 implicit_dependencies.add(components[1])
59 return implicit_dependencies
60
61 def _map_module_to_namespace(self, module):
62 return self._special_case_namespaces.get(module, self._to_camel_case(mod ule))
63
64 def _to_camel_case(self, snake_string):
65 components = snake_string.split('_')
66 return ''.join(x.title() for x in components)
67
68
69 def poison_module(target):
70 excluded_namespaces = target['excluded_namespaces']
71 file_paths = target['file_paths']
72 for file_path in file_paths:
73 with codecs.open(file_path, 'r', 'utf-8') as file:
74 file_contents = file.read()
75 for namespace in excluded_namespaces:
76 file_contents = poison_contents_for_namespace(file_contents, namespa ce)
77 with codecs.open(file_path, 'w', 'utf-8') as file:
78 file.write(file_contents)
79
80
81 def poison_contents_for_namespace(file_contents, namespace):
82 regex = r'([^.]\b)' + namespace + r'(\b[^:])'
dgozman 2017/01/10 21:47:35 Let's have a comment that this should actually be
chenwilliam 2017/01/10 23:08:56 Done. Changed to single run (~1 sec faster)
83 replace = r'\1$$UndeclaredDependency_%s$$\2' % namespace
84 return re.sub(regex, replace, file_contents)
85
86
87 def parallelize(fn, arg_list):
88 number_of_processes = min(multiprocessing.cpu_count(), 8)
89 pool = multiprocessing.Pool(number_of_processes)
90 pool.map(fn, arg_list)
91 pool.close()
92 pool.join()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698