| Index: tools/telemetry/catapult_base/refactor/annotated_symbol/reference.py
|
| diff --git a/tools/telemetry/catapult_base/refactor/annotated_symbol/reference.py b/tools/telemetry/catapult_base/refactor/annotated_symbol/reference.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b57c4f513206ed965e8c479c5b20c28451038187
|
| --- /dev/null
|
| +++ b/tools/telemetry/catapult_base/refactor/annotated_symbol/reference.py
|
| @@ -0,0 +1,75 @@
|
| +# Copyright 2015 The Chromium Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +import itertools
|
| +import symbol
|
| +import token
|
| +
|
| +from catapult_base.refactor.annotated_symbol import base_symbol
|
| +from catapult_base.refactor import snippet
|
| +
|
| +
|
| +__all__ = [
|
| + 'Reference',
|
| +]
|
| +
|
| +
|
| +class Reference(base_symbol.AnnotatedSymbol):
|
| + @classmethod
|
| + def Annotate(cls, nodes):
|
| + if not nodes:
|
| + return None
|
| + if nodes[0].type != symbol.atom:
|
| + return None
|
| + if not nodes[0].children or nodes[0].children[0].type != token.NAME:
|
| + return None
|
| +
|
| + for i in xrange(1, len(nodes)):
|
| + if not nodes:
|
| + break
|
| + if nodes[i].type != symbol.trailer:
|
| + break
|
| + if len(nodes[i].children) != 2:
|
| + break
|
| + if (nodes[i].children[0].type != token.DOT or
|
| + nodes[i].children[1].type != token.NAME):
|
| + break
|
| + else:
|
| + i = len(nodes)
|
| +
|
| + return [cls(nodes[:i])] + nodes[i:]
|
| +
|
| + def __init__(self, children):
|
| + super(Reference, self).__init__(-1, children)
|
| +
|
| + @property
|
| + def type_name(self):
|
| + return 'attribute_reference'
|
| +
|
| + @property
|
| + def value(self):
|
| + return ''.join(token_snippet.value
|
| + for child in self.children
|
| + for token_snippet in child.children)
|
| +
|
| + @value.setter
|
| + def value(self, value):
|
| + value_parts = value.split('.')
|
| +
|
| + # If we have too many children, cut the list down to size.
|
| + self._children = self._children[:len(value_parts)]
|
| +
|
| + # Update child nodes.
|
| + for child, value_part in itertools.izip_longest(
|
| + self._children, value_parts):
|
| + if child:
|
| + # Modify existing children. This helps preserve comments and spaces.
|
| + child.children[-1].value = value_part
|
| + else:
|
| + # Add children as needed.
|
| + token_snippets = [
|
| + snippet.TokenSnippet.Create(token.DOT, '.'),
|
| + snippet.TokenSnippet.Create(token.NAME, value_part),
|
| + ]
|
| + self._children.append(snippet.Symbol(symbol.trailer, token_snippets))
|
|
|